Changeset 2563 in josm for trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
- Timestamp:
- 03.12.2009 19:02:25 (2 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
r2512 r2563 5 5 6 6 import java.awt.BorderLayout; 7 import java.awt.Dialog;8 7 import java.awt.Dimension; 9 8 import java.awt.FlowLayout; 10 9 import java.awt.GridBagConstraints; 11 10 import java.awt.GridBagLayout; 12 import java.awt.Insets;13 11 import java.awt.event.ActionEvent; 14 12 import java.awt.event.FocusAdapter; … … 19 17 import java.awt.event.WindowAdapter; 20 18 import java.awt.event.WindowEvent; 21 import java.io.IOException; 19 import java.beans.PropertyChangeEvent; 20 import java.beans.PropertyChangeListener; 22 21 import java.util.ArrayList; 23 22 import java.util.Collection; … … 30 29 import javax.swing.AbstractAction; 31 30 import javax.swing.BorderFactory; 32 import javax.swing.JButton;33 31 import javax.swing.JComponent; 34 32 import javax.swing.JLabel; … … 38 36 import javax.swing.JSplitPane; 39 37 import javax.swing.JTabbedPane; 40 import javax.swing.JT able;38 import javax.swing.JToolBar; 41 39 import javax.swing.KeyStroke; 42 import javax.swing.SwingUtilities;43 40 import javax.swing.event.ChangeEvent; 44 41 import javax.swing.event.ChangeListener; … … 57 54 import org.openstreetmap.josm.data.osm.DataSet; 58 55 import org.openstreetmap.josm.data.osm.OsmPrimitive; 59 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;60 56 import org.openstreetmap.josm.data.osm.Relation; 61 57 import org.openstreetmap.josm.data.osm.RelationMember; 62 58 import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil; 63 59 import org.openstreetmap.josm.gui.DefaultNameFormatter; 64 import org.openstreetmap.josm.gui.ExceptionDialogUtil;65 60 import org.openstreetmap.josm.gui.HelpAwareOptionPane; 66 import org.openstreetmap.josm.gui.PleaseWaitRunnable;67 61 import org.openstreetmap.josm.gui.SideButton; 68 62 import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec; … … 70 64 import org.openstreetmap.josm.gui.help.HelpUtil; 71 65 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 72 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;73 import org.openstreetmap.josm.gui.progress.ProgressMonitor;74 66 import org.openstreetmap.josm.gui.tagging.AutoCompletingTextField; 75 67 import org.openstreetmap.josm.gui.tagging.TagEditorPanel; 76 68 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache; 77 69 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 78 import org.openstreetmap.josm.io.OsmServerBackreferenceReader;79 import org.openstreetmap.josm.io.OsmServerObjectReader;80 import org.openstreetmap.josm.io.OsmTransferException;81 70 import org.openstreetmap.josm.tools.ImageProvider; 82 71 import org.openstreetmap.josm.tools.Shortcut; 83 import org.xml.sax.SAXException;84 72 85 73 /** … … 125 113 // 126 114 memberTableModel = new MemberTableModel(getLayer()); 115 DataSet.selListeners.add(memberTableModel); 116 getLayer().data.addDataSetListener(memberTableModel); 117 getLayer().listenerDataChanged.add(memberTableModel); 127 118 selectionTableModel = new SelectionTableModel(getLayer()); 119 DataSet.selListeners.add(selectionTableModel); 128 120 referrerModel = new ReferringRelationsBrowserModel(relation); 129 121 … … 173 165 ); 174 166 167 getContentPane().add(buildToolBar(), BorderLayout.NORTH); 175 168 getContentPane().add(tabbedPane, BorderLayout.CENTER); 176 169 getContentPane().add(buildOkCancelButtonPanel(), BorderLayout.SOUTH); … … 189 182 memberTableModel.setSelectedMembers(selectedMembers); 190 183 HelpUtil.setHelpContext(getRootPane(),ht("/Dialog/RelationEditor")); 184 } 185 186 /** 187 * Creates the toolbar 188 * 189 * @return the toolbar 190 */ 191 protected JToolBar buildToolBar() { 192 JToolBar tb = new JToolBar(); 193 tb.setFloatable(false); 194 tb.add(new ApplyAction()); 195 tb.add(new DuplicateRelationAction()); 196 DeleteCurrentRelationAction deleteAction = new DeleteCurrentRelationAction(); 197 addPropertyChangeListener(deleteAction); 198 tb.add(deleteAction); 199 return tb; 191 200 } 192 201 … … 280 289 pnl.add(scrollPane, gc); 281 290 291 // --- role editing 292 JPanel p3 = new JPanel(new FlowLayout(FlowLayout.LEFT)); 293 p3.add(new JLabel(tr("Apply Role:"))); 294 tfRole = new AutoCompletingTextField(10); 295 tfRole.setToolTipText(tr("Enter a role and apply it to the selected relation members")); 296 tfRole.addFocusListener(new FocusAdapter() { 297 @Override 298 public void focusGained(FocusEvent e) { 299 tfRole.selectAll(); 300 } 301 }); 302 tfRole.setAutoCompletionList(new AutoCompletionList()); 303 tfRole.addFocusListener( 304 new FocusAdapter() { 305 @Override 306 public void focusGained(FocusEvent e) { 307 AutoCompletionList list = tfRole.getAutoCompletionList(); 308 AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithMemberRoles(list); 309 } 310 } 311 ); 312 p3.add(tfRole); 313 SetRoleAction setRoleAction = new SetRoleAction(); 314 memberTableModel.getSelectionModel().addListSelectionListener(setRoleAction); 315 tfRole.getDocument().addDocumentListener(setRoleAction); 316 tfRole.addActionListener(setRoleAction); 317 memberTableModel.getSelectionModel().addListSelectionListener( 318 new ListSelectionListener() { 319 public void valueChanged(ListSelectionEvent e) { 320 tfRole.setEnabled(memberTable.getSelectedRowCount() > 0); 321 } 322 } 323 ); 324 tfRole.setEnabled(memberTable.getSelectedRowCount() > 0); 325 326 gc.gridx = 1; 327 gc.gridy = 2; 328 gc.fill = GridBagConstraints.BOTH; 329 gc.anchor = GridBagConstraints.CENTER; 330 gc.weightx = 1.0; 331 gc.weighty = 0.0; 332 pnl.add(p3, gc); 333 282 334 JPanel pnl2 = new JPanel(); 283 335 pnl2.setLayout(new GridBagLayout()); … … 326 378 pnl3.setLayout(new BorderLayout()); 327 379 pnl3.add(splitPane, BorderLayout.CENTER); 328 pnl3.add(buildButtonPanel(), BorderLayout.SOUTH);329 380 return pnl3; 330 381 } … … 338 389 JPanel pnl = new JPanel(); 339 390 pnl.setLayout(new BorderLayout()); 340 JTable tbl = new JTable(selectionTableModel, new SelectionTableColumnModel(memberTableModel));341 tbl.set Enabled(false);391 SelectionTable tbl = new SelectionTable(selectionTableModel, new SelectionTableColumnModel(memberTableModel)); 392 tbl.setMemberTableModel(memberTableModel); 342 393 JScrollPane pane = new JScrollPane(tbl); 343 394 pnl.add(pane, BorderLayout.CENTER); … … 371 422 * @return 372 423 */ 373 protected JPanel buildLeftButtonPanel() { 374 JPanel pnl = new JPanel(); 375 pnl.setLayout(new GridBagLayout()); 376 377 GridBagConstraints gc = new GridBagConstraints(); 378 gc.gridx = 0; 379 gc.gridy = 0; 380 gc.gridheight = 1; 381 gc.gridwidth = 1; 382 gc.insets = new Insets(0, 5, 0, 5); 383 gc.fill = GridBagConstraints.HORIZONTAL; 384 gc.anchor = GridBagConstraints.CENTER; 385 gc.weightx = 0.0; 386 gc.weighty = 0.0; 387 388 // ----- 389 gc.gridy = 0; 424 protected JToolBar buildLeftButtonPanel() { 425 JToolBar tb = new JToolBar(); 426 tb.setOrientation(JToolBar.VERTICAL); 427 tb.setFloatable(false); 428 429 // -- move up action 390 430 MoveUpAction moveUpAction = new MoveUpAction(); 391 431 memberTableModel.getSelectionModel().addListSelectionListener(moveUpAction); 392 pnl.add(new JButton(moveUpAction), gc); 393 394 // ----- 395 gc.gridy = 1; 432 tb.add(moveUpAction); 433 434 // -- move down action 396 435 MoveDownAction moveDownAction = new MoveDownAction(); 397 436 memberTableModel.getSelectionModel().addListSelectionListener(moveDownAction); 398 pnl.add(new JButton(moveDownAction), gc); 437 tb.add(moveDownAction); 438 439 tb.addSeparator(); 399 440 400 441 // -- edit action 401 gc.gridy = 2;402 442 EditAction editAction = new EditAction(); 403 443 memberTableModel.getSelectionModel().addListSelectionListener(editAction); 404 pnl.add(new JButton(editAction),gc); 405 406 // ------ 407 gc.gridy = 3; 444 tb.add(editAction); 445 446 // -- delete action 408 447 RemoveAction removeSelectedAction = new RemoveAction(); 409 448 memberTable.getSelectionModel().addListSelectionListener(removeSelectedAction); 410 pnl.add(new JButton(removeSelectedAction), gc); 411 412 // ------ 413 gc.gridy = 4; 414 SelectPrimitivesForSelectedMembersAction selectAction = new SelectPrimitivesForSelectedMembersAction(); 415 memberTable.getSelectionModel().addListSelectionListener(selectAction); 416 pnl.add(new JButton(selectAction), gc); 417 418 // ------ 419 gc.gridy = 5; 449 tb.add(removeSelectedAction); 450 451 tb.addSeparator(); 452 // -- sort action 420 453 SortAction sortAction = new SortAction(); 421 pnl.add(new JButton(sortAction), gc); 422 423 // ------ 424 // just grab the remaining space 425 gc.gridy = 6; 426 gc.weighty = 1.0; 427 gc.fill = GridBagConstraints.BOTH; 428 pnl.add(new JPanel(), gc); 429 return pnl; 454 tb.add(sortAction); 455 456 tb.addSeparator(); 457 458 // -- download action 459 DownloadIncompleteMembersAction downloadIncompleteMembersAction = new DownloadIncompleteMembersAction(); 460 memberTable.getModel().addTableModelListener(downloadIncompleteMembersAction); 461 tb.add(downloadIncompleteMembersAction); 462 463 // -- download selected action 464 DownloadSelectedIncompleteMembersAction downloadSelectedIncompleteMembersAction = new DownloadSelectedIncompleteMembersAction(); 465 memberTable.getModel().addTableModelListener(downloadSelectedIncompleteMembersAction); 466 memberTable.getSelectionModel().addListSelectionListener(downloadSelectedIncompleteMembersAction); 467 tb.add(downloadSelectedIncompleteMembersAction); 468 469 return tb; 430 470 } 431 471 … … 435 475 * @return 436 476 */ 437 protected JPanel buildSelectionControlButtonPanel() { 438 JPanel pnl = new JPanel(); 439 pnl.setLayout(new GridBagLayout()); 440 441 GridBagConstraints gc = new GridBagConstraints(); 442 gc.gridx = 0; 443 gc.gridy = 0; 444 gc.gridheight = 1; 445 gc.gridwidth = 1; 446 gc.insets = new Insets(0, 5, 0, 5); 447 gc.fill = GridBagConstraints.HORIZONTAL; 448 gc.anchor = GridBagConstraints.CENTER; 449 gc.weightx = 0.0; 450 gc.weighty = 0.0; 477 protected JToolBar buildSelectionControlButtonPanel() { 478 JToolBar tb = new JToolBar(JToolBar.VERTICAL); 479 tb.setFloatable(false); 480 481 482 // -- add at end action 451 483 AddSelectedAtEndAction addSelectedAtEndAction = new AddSelectedAtEndAction(); 452 484 selectionTableModel.addTableModelListener(addSelectedAtEndAction); 453 pnl.add(new JButton(addSelectedAtEndAction), gc); 454 455 // ----- 456 gc.gridy = 1; 485 tb.add(addSelectedAtEndAction); 486 487 // -- select members action 457 488 SelectedMembersForSelectionAction selectMembersForSelectionAction = new SelectedMembersForSelectionAction(); 458 489 selectionTableModel.addTableModelListener(selectMembersForSelectionAction); 459 490 memberTableModel.addTableModelListener(selectMembersForSelectionAction); 460 pnl.add(new JButton(selectMembersForSelectionAction), gc); 461 462 // ----- 463 gc.gridy = 2; 491 tb.add(selectMembersForSelectionAction); 492 493 tb.addSeparator(); 494 495 // -- remove selected action 464 496 RemoveSelectedAction removeSelectedAction = new RemoveSelectedAction(); 465 497 selectionTableModel.addTableModelListener(removeSelectedAction); 466 pnl.add(new JButton(removeSelectedAction), gc); 467 468 // ------ 469 // just grab the remaining space 470 gc.gridy = 3; 471 gc.weighty = 1.0; 472 gc.fill = GridBagConstraints.BOTH; 473 pnl.add(new JPanel(), gc); 474 475 // ----- 476 gc.gridy = 4; 477 gc.weighty = 0.0; 498 tb.add(removeSelectedAction); 499 500 // -- select action 501 SelectPrimitivesForSelectedMembersAction selectAction = new SelectPrimitivesForSelectedMembersAction(); 502 memberTable.getSelectionModel().addListSelectionListener(selectAction); 503 tb.add(selectAction); 504 505 tb.addSeparator(); 506 507 // -- add at start action 478 508 AddSelectedAtStartAction addSelectionAction = new AddSelectedAtStartAction(); 479 509 selectionTableModel.addTableModelListener(addSelectionAction); 480 pnl.add(new JButton(addSelectionAction), gc); 481 482 // ----- 483 gc.gridy = 5; 510 tb.add(addSelectionAction); 511 512 // -- add before selected action 484 513 AddSelectedBeforeSelection addSelectedBeforeSelectionAction = new AddSelectedBeforeSelection(); 485 514 selectionTableModel.addTableModelListener(addSelectedBeforeSelectionAction); 486 515 memberTableModel.getSelectionModel().addListSelectionListener(addSelectedBeforeSelectionAction); 487 pnl.add(new JButton(addSelectedBeforeSelectionAction), gc); 488 489 // ----- 490 gc.gridy = 6; 516 tb.add(addSelectedBeforeSelectionAction); 517 518 // -- add after selected action 491 519 AddSelectedAfterSelection addSelectedAfterSelectionAction = new AddSelectedAfterSelection(); 492 520 selectionTableModel.addTableModelListener(addSelectedAfterSelectionAction); 493 521 memberTableModel.getSelectionModel().addListSelectionListener(addSelectedAfterSelectionAction); 494 pnl.add(new JButton(addSelectedAfterSelectionAction), gc); 495 496 return pnl; 497 } 498 499 /** 500 * Creates the buttons for the basic editing layout 501 * @return {@see JPanel} with basic buttons 502 */ 503 protected JPanel buildButtonPanel() { 504 JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 505 506 // --- download members 507 buttonPanel.add(new SideButton(new DownlaodAction())); 508 509 // --- role editing 510 buttonPanel.add(new JLabel(tr("Role:"))); 511 tfRole = new AutoCompletingTextField(10); 512 tfRole.addFocusListener(new FocusAdapter() { 513 @Override 514 public void focusGained(FocusEvent e) { 515 tfRole.selectAll(); 516 } 517 }); 518 tfRole.setAutoCompletionList(new AutoCompletionList()); 519 tfRole.addFocusListener( 520 new FocusAdapter() { 521 @Override 522 public void focusGained(FocusEvent e) { 523 AutoCompletionList list = tfRole.getAutoCompletionList(); 524 AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithMemberRoles(list); 525 } 526 } 527 ); 528 529 buttonPanel.add(tfRole); 530 SetRoleAction setRoleAction = new SetRoleAction(); 531 memberTableModel.getSelectionModel().addListSelectionListener(setRoleAction); 532 buttonPanel.add(new SideButton(setRoleAction)); 533 tfRole.getDocument().addDocumentListener(setRoleAction); 534 tfRole.addActionListener(setRoleAction); 535 536 // --- copy relation action 537 buttonPanel.add(new SideButton(new DuplicateRelationAction())); 538 539 // --- apply relation action 540 buttonPanel.add(new SideButton(new ApplyAction())); 541 542 // --- delete relation action 543 buttonPanel.add(new SideButton(new DeleteCurrentRelationAction())); 544 return buttonPanel; 522 tb.add(addSelectedAfterSelectionAction); 523 524 return tb; 545 525 } 546 526 … … 548 528 protected Dimension findMaxDialogSize() { 549 529 // FIXME: Make it remember dialog size 550 return new Dimension(700, 500); 551 } 552 553 @Override 554 public void dispose() { 555 selectionTableModel.unregister(); 556 DataSet.selListeners.remove(memberTableModel); 557 super.dispose(); 530 return new Dimension(700, 650); 558 531 } 559 532 … … 561 534 public void setVisible(boolean visible) { 562 535 if (visible) { 563 tagEditorPanel.initAutoCompletion( Main.main.getEditLayer());536 tagEditorPanel.initAutoCompletion(getLayer()); 564 537 } 565 538 super.setVisible(visible); 566 539 if (!visible) { 540 // make sure all registered listeners are unregistered 541 // 542 selectionTableModel.unregister(); 543 DataSet.selListeners.remove(memberTableModel); 544 DataSet.selListeners.remove(selectionTableModel); 545 getLayer().data.removeDataSetListener(memberTableModel); 546 getLayer().listenerDataChanged.remove(memberTableModel); 567 547 dispose(); 568 548 } … … 888 868 } 889 869 890 class SortAction extends AbstractAction {870 class SortAction extends AbstractAction implements ListSelectionListener { 891 871 public SortAction() { 892 872 putValue(SHORT_DESCRIPTION, tr("Sort the relation members")); 893 873 putValue(SMALL_ICON, ImageProvider.get("dialogs", "sort")); 894 //putValue(NAME, tr("Sort"));874 putValue(NAME, tr("Sort")); 895 875 Shortcut.registerShortcut("relationeditor:sort", tr("Relation Editor: Sort"), KeyEvent.VK_T, 896 876 Shortcut.GROUP_MNEMONIC); 897 //setEnabled(false);877 updateEnabledState(); 898 878 } 899 879 900 880 public void actionPerformed(ActionEvent e) { 901 881 memberTableModel.sort(); 882 } 883 884 protected void updateEnabledState() { 885 setEnabled(memberTable.getSelectedRowCount() > 0); 886 } 887 888 public void valueChanged(ListSelectionEvent e) { 889 updateEnabledState(); 902 890 } 903 891 } … … 960 948 } 961 949 962 class DeleteCurrentRelationAction extends AbstractAction {950 class DeleteCurrentRelationAction extends AbstractAction implements PropertyChangeListener{ 963 951 public DeleteCurrentRelationAction() { 964 952 putValue(SHORT_DESCRIPTION, tr("Delete the currently edited relation")); … … 983 971 984 972 protected void updateEnabledState() { 985 setEnabled(getRelation() != null); 973 setEnabled(getRelationSnapshot() != null); 974 } 975 976 public void propertyChange(PropertyChangeEvent evt) { 977 if (evt.getPropertyName().equals(RELATION_SNAPSHOT_PROP)) { 978 updateEnabledState(); 979 } 986 980 } 987 981 } … … 1187 1181 } 1188 1182 1189 class Downl aodAction extends AbstractAction{1190 public Downl aodAction() {1191 putValue(SHORT_DESCRIPTION, tr("Download all incomplete ways and nodes in relation"));1192 putValue(SMALL_ICON, ImageProvider.get("dialogs ", "downloadincomplete"));1183 class DownloadIncompleteMembersAction extends AbstractAction implements TableModelListener { 1184 public DownloadIncompleteMembersAction() { 1185 putValue(SHORT_DESCRIPTION, tr("Download all incomplete members")); 1186 putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "downloadincomplete")); 1193 1187 putValue(NAME, tr("Download Members")); 1194 1188 Shortcut.registerShortcut("relationeditor:downloadincomplete", tr("Relation Editor: Download Members"), … … 1200 1194 if (!isEnabled()) 1201 1195 return; 1202 Main.worker.submit(new DownloadTask( 1203 Collections.singletonList(getRelation()), 1196 Main.worker.submit(new DownloadRelationMemberTask( 1197 getRelation(), 1198 memberTableModel.getIncompleteMemberPrimitives(), 1204 1199 getLayer(), 1205 1200 memberTableModel, … … 1209 1204 1210 1205 protected void updateEnabledState() { 1211 setEnabled(getRelation() != null && !getRelation().isNew()); 1206 setEnabled( 1207 getRelation() != null 1208 && !getRelation().isNew() 1209 && memberTableModel.hasIncompleteMembers() 1210 ); 1211 } 1212 1213 public void tableChanged(TableModelEvent e) { 1214 updateEnabledState(); 1215 } 1216 } 1217 1218 class DownloadSelectedIncompleteMembersAction extends AbstractAction implements ListSelectionListener, TableModelListener{ 1219 public DownloadSelectedIncompleteMembersAction() { 1220 putValue(SHORT_DESCRIPTION, tr("Download selected incomplete members")); 1221 putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "downloadincompleteselected")); 1222 putValue(NAME, tr("Download Members")); 1223 Shortcut.registerShortcut("relationeditor:downloadincomplete", tr("Relation Editor: Download Members"), 1224 KeyEvent.VK_K, Shortcut.GROUP_MNEMONIC); 1225 updateEnabledState(); 1226 } 1227 1228 public void actionPerformed(ActionEvent e) { 1229 if (!isEnabled()) 1230 return; 1231 Main.worker.submit(new DownloadRelationMemberTask( 1232 getRelation(), 1233 memberTableModel.getSelectedIncompleteMemberPrimitives(), 1234 getLayer(), 1235 memberTableModel, 1236 GenericRelationEditor.this) 1237 ); 1238 } 1239 1240 protected void updateEnabledState() { 1241 setEnabled( 1242 getRelation() != null 1243 && !getRelation().isNew() 1244 && memberTableModel.hasIncompleteSelectedMembers() 1245 ); 1246 } 1247 1248 public void valueChanged(ListSelectionEvent e) { 1249 updateEnabledState(); 1250 } 1251 1252 public void tableChanged(TableModelEvent e) { 1253 updateEnabledState(); 1212 1254 } 1213 1255 } … … 1366 1408 } 1367 1409 } 1368 1369 /**1370 * The asynchronous task for downloading relation members.1371 *1372 */1373 public static class DownloadTask extends PleaseWaitRunnable {1374 private boolean cancelled;1375 private Exception lastException;1376 private List<Relation> relations;1377 private OsmDataLayer curLayer;1378 private MemberTableModel memberTableModel;1379 private OsmServerObjectReader objectReader;1380 private OsmServerBackreferenceReader parentReader;1381 1382 public DownloadTask(List<Relation> relations, OsmDataLayer curLayer, MemberTableModel memberTableModel, Dialog parent) {1383 super(tr("Download relation members"), new PleaseWaitProgressMonitor(parent), false /* don't ignore exception */);1384 this.relations = relations;1385 this.curLayer = curLayer;1386 this.memberTableModel = memberTableModel;1387 }1388 1389 public DownloadTask(List<Relation> relations, OsmDataLayer curLayer, MemberTableModel memberTableModel) {1390 super(tr("Download relation members"), new PleaseWaitProgressMonitor(), false /* don't ignore exception */);1391 this.relations = relations;1392 this.curLayer = curLayer;1393 this.memberTableModel = memberTableModel;1394 }1395 1396 @Override1397 protected void cancel() {1398 cancelled = true;1399 synchronized(this) {1400 if (objectReader != null) {1401 objectReader.cancel();1402 } else if (parentReader != null) {1403 parentReader.cancel();1404 }1405 }1406 }1407 1408 @Override1409 protected void finish() {1410 Main.map.repaint();1411 if (cancelled)1412 return;1413 if (memberTableModel != null) {1414 memberTableModel.fireTableDataChanged();1415 }1416 if (lastException != null) {1417 ExceptionDialogUtil.explainException(lastException);1418 }1419 }1420 1421 @Override1422 protected void realRun() throws SAXException, IOException, OsmTransferException {1423 try {1424 for (Relation relation : relations) {1425 // download the relation1426 //1427 progressMonitor.indeterminateSubTask(tr("Downloading relation ''{0}''", relation.getDisplayName(DefaultNameFormatter.getInstance())));1428 synchronized(this) {1429 if (cancelled) return;1430 objectReader = new OsmServerObjectReader(relation.getId(), OsmPrimitiveType.RELATION, true /* full download */);1431 }1432 final DataSet dataSet = objectReader.parseOsm(progressMonitor1433 .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));1434 if (dataSet == null)1435 return;1436 synchronized (this) {1437 if (cancelled) return;1438 objectReader = null;1439 }1440 1441 // download referring objects of the downloaded member objects1442 //1443 // asked for in #3999, but uncommented for the time being. Could be used1444 // later, perhaps if user explicity requests so (for instance by checking1445 // a checkbox)1446 // for (OsmPrimitive p: relation.getMemberPrimitives()) {1447 // synchronized(this) {1448 // if (cancelled) return;1449 // parentReader = new OsmServerBackreferenceReader(p);1450 // }1451 // DataSet parents = parentReader.parseOsm(progressMonitor.createSubTaskMonitor(1, false));1452 // synchronized(this) {1453 // if (cancelled) return;1454 // parentReader = null;1455 // }1456 // DataSetMerger merger = new DataSetMerger(dataSet, parents);1457 // merger.merge();1458 // }1459 // if (cancelled) return;1460 1461 // has to run on the EDT because mergeFrom may trigger events1462 // which update the UI1463 //1464 SwingUtilities.invokeAndWait(1465 new Runnable() {1466 public void run() {1467 curLayer.mergeFrom(dataSet);1468 curLayer.fireDataChange();1469 curLayer.onPostDownloadFromServer();1470 }1471 }1472 );1473 }1474 } catch (Exception e) {1475 if (cancelled) {1476 System.out.println(tr("Warning: ignoring exception because task is cancelled. Exception: {0}", e1477 .toString()));1478 return;1479 }1480 lastException = e;1481 }1482 }1483 }1484 1410 }
Note: See TracChangeset
for help on using the changeset viewer.
