Ticket #3663: relation_download_members-2315.patch
| File relation_download_members-2315.patch, 15.9 KB (added by , 17 years ago) |
|---|
-
src/org/openstreetmap/josm/actions/UpdateDataAction.java
18 18 public UpdateDataAction() { 19 19 super(tr("Update data"), 20 20 "updatedata", 21 tr("Updates the objects in the currentdata layer from the server."),21 tr("Updates the objects in the active data layer from the server."), 22 22 Shortcut.registerShortcut("file:updatedata", 23 23 tr("Update data"), 24 24 KeyEvent.VK_U, -
src/org/openstreetmap/josm/actions/UploadAction.java
116 116 } 117 117 118 118 public UploadAction() { 119 super(tr("Upload data"), "upload", tr("Upload all changes in the currentdata layer to the OSM server"),119 super(tr("Upload data"), "upload", tr("Upload all changes in the active data layer to the OSM server"), 120 120 Shortcut.registerShortcut("file:upload", tr("File: {0}", tr("Upload data")), KeyEvent.VK_U, Shortcut.GROUPS_ALT1+Shortcut.GROUP_HOTKEY), true); 121 121 } 122 122 -
src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java
270 270 */ 271 271 if (numPanels == 1 && panels.get(N-1).getComponents().length == 0) 272 272 { 273 parent.setDividerSize(0); 273 274 this.setVisible(false); 274 275 } else { 275 276 if (this.getWidth() != 0) { // only if josm started with hidden panel 276 277 this.setPreferredSize(new Dimension(this.getWidth(), 0)); 277 278 } 278 279 this.setVisible(true); 280 parent.setDividerSize(5); 279 281 parent.resetToPreferredSizes(); 280 282 } 281 283 } -
src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
4 4 5 5 import java.awt.BorderLayout; 6 6 import java.awt.GridLayout; 7 import java.awt.Point; 7 8 import java.awt.event.ActionEvent; 9 import java.awt.event.ActionListener; 8 10 import java.awt.event.KeyEvent; 9 11 import java.awt.event.MouseAdapter; 10 12 import java.awt.event.MouseEvent; 11 13 import java.util.ArrayList; 14 import java.util.Arrays; 12 15 import java.util.Collection; 13 16 import java.util.Collections; 14 17 import java.util.Comparator; 15 18 import java.util.HashSet; 19 import java.util.List; 16 20 import java.util.logging.Logger; 17 21 18 22 import javax.swing.AbstractAction; 19 23 import javax.swing.AbstractListModel; 20 24 import javax.swing.JList; 25 import javax.swing.JMenuItem; 21 26 import javax.swing.JPanel; 27 import javax.swing.JPopupMenu; 22 28 import javax.swing.JScrollPane; 23 29 import javax.swing.KeyStroke; 24 30 import javax.swing.ListSelectionModel; … … 36 42 import org.openstreetmap.josm.gui.OsmPrimitivRenderer; 37 43 import org.openstreetmap.josm.gui.SideButton; 38 44 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor; 45 import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor; 39 46 import org.openstreetmap.josm.gui.layer.DataChangeListener; 40 47 import org.openstreetmap.josm.gui.layer.Layer; 41 48 import org.openstreetmap.josm.gui.layer.OsmDataLayer; … … 169 176 model.setRelations(null); 170 177 return; 171 178 } 172 Relation selected = getSelected();179 Relation[] selected = getAllSelected(); 173 180 174 181 model.setRelations(getDisplayedRelationsInSortOrder(Main.main.getCurrentDataSet())); 175 182 if(model.getSize() > 0) { … … 177 184 } else { 178 185 setTitle(tr("Relations")); 179 186 } 180 selectRelation (selected);187 selectRelations(selected); 181 188 } 182 189 183 190 public void activeLayerChange(Layer a, Layer b) { … … 239 246 } 240 247 241 248 /** 249 * @return All selected relations in the list, possibly empty List 250 */ 251 private Relation[] getAllSelected() { 252 return (Relation[]) Arrays.asList(displaylist.getSelectedValues()).toArray(new Relation[0]); 253 } 254 255 /** 242 256 * Selects the relation <code>relation</code> in the list of relations. 243 257 * 244 258 * @param relation the relation 245 259 */ 246 260 public void selectRelation(Relation relation) { 247 if (relation == null){ 248 displaylist.clearSelection(); 249 return; 261 selectRelations(new Relation[] {relation}); 262 } 263 264 /** 265 * Selects the relations <code>relations</code> in the list of relations. 266 * 267 * @param relations the relations (may be empty) 268 */ 269 public void selectRelations(Relation[] relations) { 270 List<Integer> sel = new ArrayList<Integer>(); 271 for (Relation r : relations) { 272 if (r == null) continue; 273 int idx = model.getIndexOfRelation(r); 274 if (idx != -1) { 275 sel.add(idx); 276 } 250 277 } 251 int idx = model.getIndexOfRelation(relation); 252 if (idx == -1) { 278 if (sel.isEmpty()) { 253 279 displaylist.clearSelection(); 280 return; 254 281 } else { 255 displaylist.setSelectedIndex(idx); 256 displaylist.scrollRectToVisible(displaylist.getCellBounds(idx,idx)); 282 int fst = Collections.min(sel); 283 displaylist.scrollRectToVisible(displaylist.getCellBounds(fst, fst)); 284 } 285 286 int[] aSel = new int[sel.size()]; //FIXME: how to cast Integer[] -> int[] ? 287 for (int i=0; i<sel.size(); ++i) { 288 aSel[i] = sel.get(i); 257 289 } 290 291 displaylist.setSelectedIndices(aSel); 258 292 } 259 293 260 294 class DoubleClickAdapter extends MouseAdapter { … … 275 309 } 276 310 } 277 311 } 312 private void openPopup(MouseEvent e) { 313 Point p = e.getPoint(); 314 int index = displaylist.locationToIndex(p); 315 if (index < 0) return; 316 if (!displaylist.getCellBounds(index, index).contains(e.getPoint())) 317 return; 318 Object obj = model.getElementAt(index); 319 if (! displaylist.isSelectedIndex(index)) { 320 displaylist.setSelectedIndex(index); 321 } 322 JPopupMenu menu = new JPopupMenu(); 323 JMenuItem down = new JMenuItem(tr("Download members"), ImageProvider.get("dialogs", "downloadincomplete")); 324 325 final Object[] os = displaylist.getSelectedValues(); 326 final List<Relation> rs = new ArrayList<Relation>(); 327 for (Object o : os) { 328 Relation r = (Relation) o; 329 if (r != null && !r.isNew()) { 330 rs.add(r); 331 } 332 } 333 down.setEnabled(!rs.isEmpty()); 334 down.addActionListener(new ActionListener () { 335 public void actionPerformed(ActionEvent e) { 336 Main.worker.submit(new GenericRelationEditor.DownloadTask( 337 (Relation[]) rs.toArray(new Relation[0]), 338 Main.map.mapView.getEditLayer(), null)); 339 } 340 }); 341 JMenuItem select = new JMenuItem(tr("Select members"), ImageProvider.get("selectall")); 342 select.addActionListener(new ActionListener () { 343 public void actionPerformed(ActionEvent e) { 344 Object[] rs = displaylist.getSelectedValues(); 345 HashSet<OsmPrimitive> ms = new HashSet<OsmPrimitive>(); 346 for (Object r : rs) { 347 for (RelationMember m : ((Relation) r).getMembers()) { 348 ms.add(m.getMember()); 349 } 350 } 351 final OsmDataLayer l = Main.map.mapView.getEditLayer(); 352 l.data.setSelected(ms); 353 DataSet.fireSelectionChanged(l.data.getSelected()); 354 } 355 }); 356 menu.add(down); 357 menu.add(select); 358 359 menu.show(RelationListDialog.this, p.x, p.y-3); 360 } 361 @Override public void mousePressed(MouseEvent e) { 362 if (e.isPopupTrigger()) { 363 openPopup(e); 364 } 365 } 366 @Override public void mouseReleased(MouseEvent e) { 367 if (e.isPopupTrigger()) { 368 openPopup(e); 369 } 370 } 278 371 } 279 372 280 /**373 /** 281 374 * The edit action 282 375 * 283 376 */ -
src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
196 196 listSelectionModel.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 197 197 } 198 198 return listSelectionModel; 199 } 200 201 public void updateMemberReferences(DataSet ds) { 202 for (int i=0; i< members.size();i++) { 203 RelationMember member = members.get(i); 204 if (member.getMember().isNew()) { 205 continue; 206 } 207 OsmPrimitive primitive = ds.getPrimitiveById(member.getMember().getId(), OsmPrimitiveType.from(member.getMember())); 208 if (primitive != null) { 209 RelationMember newMember = new RelationMember(member.getRole(), primitive); 210 members.remove(i); 211 members.add(i, newMember); 212 } 213 } 214 fireTableDataChanged(); 215 } 216 199 } 217 200 218 201 public void removeMembersReferringTo(List<? extends OsmPrimitive> primitives) { 219 202 if (primitives == null) -
src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
return;
1202 1202 public void actionPerformed(ActionEvent e) { 1203 1203 if (!isEnabled()) 1204 1204 return; 1205 Main.worker.submit(new DownloadTask( GenericRelationEditor.this));1205 Main.worker.submit(new DownloadTask(new Relation[] {getRelation()}, getLayer(), memberTableModel, GenericRelationEditor.this)); 1206 1206 } 1207 1207 1208 1208 protected void updateEnabledState() { … … 1368 1368 * The asynchronous task for downloading relation members. 1369 1369 * 1370 1370 */ 1371 class DownloadTask extends PleaseWaitRunnable {1371 public static class DownloadTask extends PleaseWaitRunnable { 1372 1372 private boolean cancelled; 1373 1373 private int conflictsCount; 1374 1374 private Exception lastException; 1375 private Relation[] relations; 1376 private OsmDataLayer curLayer; 1377 private MemberTableModel memberTableModel; 1375 1378 1376 public DownloadTask( Dialog parent) {1379 public DownloadTask(Relation[] relations, OsmDataLayer curLayer, MemberTableModel memberTableModel, Dialog parent) { 1377 1380 super(tr("Download relation members"), new PleaseWaitProgressMonitor(parent), false /* 1378 1381 * don't 1379 1382 * ignore 1380 1383 * exception 1381 1384 */); 1385 this.relations = relations; 1386 this.curLayer = curLayer; 1387 this.memberTableModel = memberTableModel; 1388 } 1389 public DownloadTask(Relation[] relations, OsmDataLayer curLayer, MemberTableModel memberTableModel) { 1390 super(tr("Download relation members"), new PleaseWaitProgressMonitor(), false /* 1391 * don't 1392 * ignore 1393 * exception 1394 */); 1395 this.relations = relations; 1396 this.curLayer = curLayer; 1397 this.memberTableModel = memberTableModel; 1382 1398 } 1383 1399 1384 1400 @Override … … 1389 1405 1390 1406 @Override 1391 1407 protected void finish() { 1408 Main.map.repaint(); 1392 1409 if (cancelled) 1393 1410 return; 1394 memberTableModel.updateMemberReferences(getLayer().data); 1411 if (memberTableModel != null) { 1412 memberTableModel.fireTableDataChanged(); 1413 } 1395 1414 if (lastException != null) { 1396 1415 ExceptionDialogUtil.explainException(lastException); 1397 1416 } … … 1409 1428 @Override 1410 1429 protected void realRun() throws SAXException, IOException, OsmTransferException { 1411 1430 try { 1412 progressMonitor.indeterminateSubTask(""); 1413 OsmServerObjectReader reader = new OsmServerObjectReader(getRelation().getId(), OsmPrimitiveType.RELATION, 1414 true); 1415 DataSet dataSet = reader.parseOsm(progressMonitor 1416 .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)); 1417 if (dataSet != null) { 1418 final MergeVisitor visitor = new MergeVisitor(getLayer().data, dataSet); 1419 visitor.merge(); 1420 1421 // copy the merged layer's data source info 1422 for (DataSource src : dataSet.dataSources) { 1423 getLayer().data.dataSources.add(src); 1431 boolean changed = false; 1432 for (Relation relation : relations) { 1433 progressMonitor.indeterminateSubTask(""); 1434 OsmServerObjectReader reader = new OsmServerObjectReader(relation.getId(), OsmPrimitiveType.RELATION, 1435 true); 1436 DataSet dataSet = reader.parseOsm(progressMonitor 1437 .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)); 1438 if (dataSet != null) { 1439 changed = true; 1440 final MergeVisitor visitor = new MergeVisitor(curLayer.data, dataSet); 1441 visitor.merge(); 1442 1443 // copy the merged layer's data source info 1444 for (DataSource src : dataSet.dataSources) { 1445 curLayer.data.dataSources.add(src); 1446 } 1447 if (!visitor.getConflicts().isEmpty()) { 1448 curLayer.getConflicts().add(visitor.getConflicts()); 1449 conflictsCount = visitor.getConflicts().size(); 1450 } 1424 1451 } 1425 // FIXME: this is necessary because there are dialogs listening 1426 // for DataChangeEvents which manipulate Swing components on this 1427 // thread. 1428 // 1452 } 1453 // FIXME: this is necessary because there are dialogs listening 1454 // for DataChangeEvents which manipulate Swing components on this 1455 // thread. 1456 // 1457 if (changed) { 1429 1458 SwingUtilities.invokeLater(new Runnable() { 1430 1459 public void run() { 1431 getLayer().fireDataChange();1460 curLayer.fireDataChange(); 1432 1461 } 1433 1462 }); 1434 if (!visitor.getConflicts().isEmpty()) {1435 getLayer().getConflicts().add(visitor.getConflicts());1436 conflictsCount = visitor.getConflicts().size();1437 }1438 1463 } 1439 1464 } catch (Exception e) { 1440 1465 if (cancelled) {
