Ticket #3663: relation_download_members.patch
File relation_download_members.patch, 15.9 KB (added by , 15 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.ListSelectionModel; 24 30 import javax.swing.SwingUtilities; … … 35 41 import org.openstreetmap.josm.gui.OsmPrimitivRenderer; 36 42 import org.openstreetmap.josm.gui.SideButton; 37 43 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor; 44 import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor; 38 45 import org.openstreetmap.josm.gui.layer.DataChangeListener; 39 46 import org.openstreetmap.josm.gui.layer.Layer; 40 47 import org.openstreetmap.josm.gui.layer.OsmDataLayer; … … 167 174 model.setRelations(null); 168 175 return; 169 176 } 170 Relation selected = getSelected();177 Relation[] selected = getAllSelected(); 171 178 172 179 model.setRelations(getDisplayedRelationsInSortOrder(Main.main.getCurrentDataSet())); 173 180 if(model.getSize() > 0) { … … 175 182 } else { 176 183 setTitle(tr("Relations")); 177 184 } 178 selectRelation (selected);185 selectRelations(selected); 179 186 } 180 187 181 188 public void activeLayerChange(Layer a, Layer b) { … … 237 244 } 238 245 239 246 /** 247 * @return All selected relations in the list, possibly empty List 248 */ 249 private Relation[] getAllSelected() { 250 return (Relation[]) Arrays.asList(displaylist.getSelectedValues()).toArray(new Relation[0]); 251 } 252 253 /** 240 254 * Selects the relation <code>relation</code> in the list of relations. 241 255 * 242 256 * @param relation the relation 243 257 */ 244 258 public void selectRelation(Relation relation) { 245 if (relation == null){ 246 displaylist.clearSelection(); 247 return; 259 selectRelations(new Relation[] {relation}); 260 } 261 262 /** 263 * Selects the relations <code>relations</code> in the list of relations. 264 * 265 * @param relations the relations (may be empty) 266 */ 267 public void selectRelations(Relation[] relations) { 268 List<Integer> sel = new ArrayList<Integer>(); 269 for (Relation r : relations) { 270 if (r == null) continue; 271 int idx = model.getIndexOfRelation(r); 272 if (idx != -1) { 273 sel.add(idx); 274 } 248 275 } 249 int idx = model.getIndexOfRelation(relation); 250 if (idx == -1) { 276 if (sel.isEmpty()) { 251 277 displaylist.clearSelection(); 278 return; 252 279 } else { 253 displaylist.setSelectedIndex(idx); 254 displaylist.scrollRectToVisible(displaylist.getCellBounds(idx,idx)); 280 int fst = Collections.min(sel); 281 displaylist.scrollRectToVisible(displaylist.getCellBounds(fst, fst)); 282 } 283 284 int[] aSel = new int[sel.size()]; //FIXME: how to cast Integer[] -> int[] ? 285 for (int i=0; i<sel.size(); ++i) { 286 aSel[i] = sel.get(i); 255 287 } 288 289 displaylist.setSelectedIndices(aSel); 256 290 } 257 291 258 292 class DoubleClickAdapter extends MouseAdapter { … … 273 307 } 274 308 } 275 309 } 310 private void openPopup(MouseEvent e) { 311 Point p = e.getPoint(); 312 int index = displaylist.locationToIndex(p); 313 if (index < 0) return; 314 if (!displaylist.getCellBounds(index, index).contains(e.getPoint())) 315 return; 316 Object obj = model.getElementAt(index); 317 if (! displaylist.isSelectedIndex(index)) { 318 displaylist.setSelectedIndex(index); 319 } 320 JPopupMenu menu = new JPopupMenu(); 321 JMenuItem down = new JMenuItem(tr("Download members"), ImageProvider.get("dialogs", "downloadincomplete")); 322 323 final Object[] os = displaylist.getSelectedValues(); 324 final List<Relation> rs = new ArrayList<Relation>(); 325 for (Object o : os) { 326 Relation r = (Relation) o; 327 if (r != null && !r.isNew()) { 328 rs.add(r); 329 } 330 } 331 down.setEnabled(!rs.isEmpty()); 332 down.addActionListener(new ActionListener () { 333 public void actionPerformed(ActionEvent e) { 334 Main.worker.submit(new GenericRelationEditor.DownloadTask( 335 (Relation[]) rs.toArray(new Relation[0]), 336 Main.map.mapView.getEditLayer(), null)); 337 } 338 }); 339 JMenuItem select = new JMenuItem(tr("Select members"), ImageProvider.get("selectall")); 340 select.addActionListener(new ActionListener () { 341 public void actionPerformed(ActionEvent e) { 342 Object[] rs = displaylist.getSelectedValues(); 343 HashSet<OsmPrimitive> ms = new HashSet<OsmPrimitive>(); 344 for (Object r : rs) { 345 for (RelationMember m : ((Relation) r).getMembers()) { 346 ms.add(m.getMember()); 347 } 348 } 349 final OsmDataLayer l = Main.map.mapView.getEditLayer(); 350 l.data.setSelected(ms); 351 DataSet.fireSelectionChanged(l.data.getSelected()); 352 } 353 }); 354 menu.add(down); 355 menu.add(select); 356 357 menu.show(RelationListDialog.this, p.x, p.y-3); 358 } 359 @Override public void mousePressed(MouseEvent e) { 360 if (e.isPopupTrigger()) { 361 openPopup(e); 362 } 363 } 364 @Override public void mouseReleased(MouseEvent e) { 365 if (e.isPopupTrigger()) { 366 openPopup(e); 367 } 368 } 276 369 } 277 370 278 371 /** 279 372 * The edit action 280 373 * 281 374 */ -
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;
1195 1195 public void actionPerformed(ActionEvent e) { 1196 1196 if (!isEnabled()) 1197 1197 return; 1198 Main.worker.submit(new DownloadTask( GenericRelationEditor.this));1198 Main.worker.submit(new DownloadTask(new Relation[] {getRelation()}, getLayer(), memberTableModel, GenericRelationEditor.this)); 1199 1199 } 1200 1200 1201 1201 protected void updateEnabledState() { … … 1361 1361 * The asynchronous task for downloading relation members. 1362 1362 * 1363 1363 */ 1364 class DownloadTask extends PleaseWaitRunnable {1364 public static class DownloadTask extends PleaseWaitRunnable { 1365 1365 private boolean cancelled; 1366 1366 private int conflictsCount; 1367 1367 private Exception lastException; 1368 private Relation[] relations; 1369 private OsmDataLayer curLayer; 1370 private MemberTableModel memberTableModel; 1368 1371 1369 public DownloadTask( Dialog parent) {1372 public DownloadTask(Relation[] relations, OsmDataLayer curLayer, MemberTableModel memberTableModel, Dialog parent) { 1370 1373 super(tr("Download relation members"), new PleaseWaitProgressMonitor(parent), false /* 1371 1374 * don't 1372 1375 * ignore 1373 1376 * exception 1374 1377 */); 1378 this.relations = relations; 1379 this.curLayer = curLayer; 1380 this.memberTableModel = memberTableModel; 1381 } 1382 public DownloadTask(Relation[] relations, OsmDataLayer curLayer, MemberTableModel memberTableModel) { 1383 super(tr("Download relation members"), new PleaseWaitProgressMonitor(), false /* 1384 * don't 1385 * ignore 1386 * exception 1387 */); 1388 this.relations = relations; 1389 this.curLayer = curLayer; 1390 this.memberTableModel = memberTableModel; 1375 1391 } 1376 1392 1377 1393 @Override … … 1382 1398 1383 1399 @Override 1384 1400 protected void finish() { 1401 Main.map.repaint(); 1385 1402 if (cancelled) 1386 1403 return; 1387 memberTableModel.updateMemberReferences(getLayer().data); 1404 if (memberTableModel != null) { 1405 memberTableModel.fireTableDataChanged(); 1406 } 1388 1407 if (lastException != null) { 1389 1408 ExceptionDialogUtil.explainException(lastException); 1390 1409 } … … 1402 1421 @Override 1403 1422 protected void realRun() throws SAXException, IOException, OsmTransferException { 1404 1423 try { 1405 progressMonitor.indeterminateSubTask(""); 1406 OsmServerObjectReader reader = new OsmServerObjectReader(getRelation().getId(), OsmPrimitiveType.RELATION, 1407 true); 1408 DataSet dataSet = reader.parseOsm(progressMonitor 1409 .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)); 1410 if (dataSet != null) { 1411 final MergeVisitor visitor = new MergeVisitor(getLayer().data, dataSet); 1412 visitor.merge(); 1413 1414 // copy the merged layer's data source info 1415 for (DataSource src : dataSet.dataSources) { 1416 getLayer().data.dataSources.add(src); 1424 boolean changed = false; 1425 for (Relation relation : relations) { 1426 progressMonitor.indeterminateSubTask(""); 1427 OsmServerObjectReader reader = new OsmServerObjectReader(relation.getId(), OsmPrimitiveType.RELATION, 1428 true); 1429 DataSet dataSet = reader.parseOsm(progressMonitor 1430 .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)); 1431 if (dataSet != null) { 1432 changed = true; 1433 final MergeVisitor visitor = new MergeVisitor(curLayer.data, dataSet); 1434 visitor.merge(); 1435 1436 // copy the merged layer's data source info 1437 for (DataSource src : dataSet.dataSources) { 1438 curLayer.data.dataSources.add(src); 1439 } 1440 if (!visitor.getConflicts().isEmpty()) { 1441 curLayer.getConflicts().add(visitor.getConflicts()); 1442 conflictsCount = visitor.getConflicts().size(); 1443 } 1417 1444 } 1418 // FIXME: this is necessary because there are dialogs listening 1419 // for DataChangeEvents which manipulate Swing components on this 1420 // thread. 1421 // 1445 } 1446 // FIXME: this is necessary because there are dialogs listening 1447 // for DataChangeEvents which manipulate Swing components on this 1448 // thread. 1449 // 1450 if (changed) { 1422 1451 SwingUtilities.invokeLater(new Runnable() { 1423 1452 public void run() { 1424 getLayer().fireDataChange();1453 curLayer.fireDataChange(); 1425 1454 } 1426 1455 }); 1427 if (!visitor.getConflicts().isEmpty()) {1428 getLayer().getConflicts().add(visitor.getConflicts());1429 conflictsCount = visitor.getConflicts().size();1430 }1431 1456 } 1432 1457 } catch (Exception e) { 1433 1458 if (cancelled) {