Changeset 1822 in josm for trunk/src/org/openstreetmap
- Timestamp:
- 2009-07-21T20:42:50+02:00 (16 years ago)
- Location:
- trunk/src/org/openstreetmap/josm/gui/dialogs/relation
- Files:
-
- 3 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
r1819 r1822 39 39 import javax.swing.JTextField; 40 40 import javax.swing.KeyStroke; 41 import javax.swing.ListSelectionModel;42 41 import javax.swing.SwingUtilities; 43 42 import javax.swing.event.DocumentEvent; … … 73 72 import org.xml.sax.SAXException; 74 73 75 76 74 /** 77 75 * This dialog is for editing relations. 78 * 79 * In the basic form, it provides two tables, one with the relation tags 80 * and one with the relation members. (Relation tags can be edited through 81 * the normal properties dialog as well, if you manage to get a relation 82 * selected!) 83 * 76 * 77 * In the basic form, it provides two tables, one with the relation tags and one with the relation 78 * members. (Relation tags can be edited through the normal properties dialog as well, if you manage 79 * to get a relation selected!) 80 * 84 81 * @author Frederik Ramm <frederik@remote.org> 85 * 82 * 86 83 */ 87 84 public class GenericRelationEditor extends RelationEditor { 88 85 89 86 static private final Logger logger = Logger.getLogger(GenericRelationEditor.class.getName()); 90 static private final Dimension DEFAULT_EDITOR_DIMENSION = new Dimension(700,500); 87 static private final Dimension DEFAULT_EDITOR_DIMENSION = new Dimension(700, 500); 91 88 92 89 /** the tag table and its model */ … … 107 104 108 105 /** 109 * Creates a new relation editor for the given relation. The relation 110 * will be saved if the userselects "ok" in the editor.111 * 106 * Creates a new relation editor for the given relation. The relation will be saved if the user 107 * selects "ok" in the editor. 108 * 112 109 * If no relation is given, will create an editor for a new relation. 113 * 110 * 114 111 * @param layer the {@see OsmDataLayer} the new or edited relation belongs to 115 112 * @param relation relation to edit, or null to create a new one. 116 113 * @param selectedMembers a collection of members which shall be selected initially 117 114 */ 118 public GenericRelationEditor(OsmDataLayer layer, Relation relation, Collection<RelationMember> selectedMembers ) 119 { 115 public GenericRelationEditor(OsmDataLayer layer, Relation relation, Collection<RelationMember> selectedMembers) { 120 116 super(layer, relation, selectedMembers); 121 117 … … 149 145 JPanel pnl = new JPanel(); 150 146 pnl.setLayout(new BorderLayout()); 151 pnl.add(pane,BorderLayout.CENTER); 147 pnl.add(pane, BorderLayout.CENTER); 152 148 pnl.setBorder(BorderFactory.createRaisedBevelBorder()); 153 149 … … 159 155 } 160 156 161 getContentPane().add(tabbedPane,BorderLayout.CENTER); 157 getContentPane().add(tabbedPane, BorderLayout.CENTER); 162 158 getContentPane().add(buildOkCancelButtonPanel(), BorderLayout.SOUTH); 163 159 … … 165 161 try { 166 162 setAlwaysOnTop(true); 167 } catch(SecurityException e) { 168 logger.warning(tr("Caught security exception for setAlwaysOnTop(). Ignoring. Exception was: {0}", e.toString())); 169 } 170 } 171 172 /** 173 * builds the panel with the OK and the Cancel button 174 * 175 * @return the panel with the OK and the Cancel button 163 } catch (SecurityException e) { 164 logger.warning(tr("Caught security exception for setAlwaysOnTop(). Ignoring. Exception was: {0}", e 165 .toString())); 166 } 167 } 168 169 /** 170 * builds the panel with the OK and the Cancel button 171 * 172 * @return the panel with the OK and the Cancel button 176 173 */ 177 174 protected JPanel buildOkCancelButtonPanel() { … … 187 184 /** 188 185 * build the panel with the buttons on the left 189 * 186 * 190 187 * @return 191 188 */ … … 197 194 gc.gridx = 0; 198 195 gc.gridy = 0; 199 gc.gridheight =1;196 gc.gridheight = 1; 200 197 gc.gridwidth = 1; 201 gc.insets = new Insets(0, 5,0,5);198 gc.insets = new Insets(0, 5, 0, 5); 202 199 gc.fill = GridBagConstraints.HORIZONTAL; 203 200 gc.anchor = GridBagConstraints.CENTER; … … 220 217 gc.weighty = 1.0; 221 218 gc.fill = GridBagConstraints.BOTH; 222 pnl.add(new JPanel(),gc); 219 pnl.add(new JPanel(), gc); 223 220 return pnl; 224 221 } … … 226 223 /** 227 224 * builds the panel with the tag editor 228 * 225 * 229 226 * @return the panel with the tag editor 230 227 */ … … 237 234 tagTable = new TagTable(tagEditorModel); 238 235 acCache.initFromJOSMDataset(); 239 TagCellEditor editor = ((TagCellEditor)tagTable.getColumnModel().getColumn(0).getCellEditor()); 236 TagCellEditor editor = ((TagCellEditor) tagTable.getColumnModel().getColumn(0).getCellEditor()); 240 237 editor.setAutoCompletionCache(acCache); 241 238 editor.setAutoCompletionList(acList); 242 editor = ((TagCellEditor)tagTable.getColumnModel().getColumn(1).getCellEditor()); 239 editor = ((TagCellEditor) tagTable.getColumnModel().getColumn(1).getCellEditor()); 243 240 editor.setAutoCompletionCache(acCache); 244 241 editor.setAutoCompletionList(acList); … … 250 247 // getPreferredViewportSize() in JTable, but did not work. 251 248 // 252 scrollPane.addComponentListener( 253 new ComponentAdapter() { 254 @Override public void componentResized(ComponentEvent e) { 255 super.componentResized(e); 256 Dimension d = scrollPane.getViewport().getExtentSize(); 257 tagTable.adjustColumnWidth(d.width); 258 } 259 } 260 ); 249 scrollPane.addComponentListener(new ComponentAdapter() { 250 @Override 251 public void componentResized(ComponentEvent e) { 252 super.componentResized(e); 253 Dimension d = scrollPane.getViewport().getExtentSize(); 254 tagTable.adjustColumnWidth(d.width); 255 } 256 }); 261 257 262 258 GridBagConstraints gc = new GridBagConstraints(); 263 259 gc.gridx = 0; 264 260 gc.gridy = 0; 265 gc.gridheight =1;261 gc.gridheight = 1; 266 262 gc.gridwidth = 3; 267 263 gc.fill = GridBagConstraints.HORIZONTAL; … … 273 269 gc.gridx = 0; 274 270 gc.gridy = 1; 275 gc.gridheight =1;271 gc.gridheight = 1; 276 272 gc.gridwidth = 1; 277 273 gc.fill = GridBagConstraints.VERTICAL; … … 293 289 /** 294 290 * builds the panel for the relation member editor 295 * 291 * 296 292 * @return the panel for the relation member editor 297 293 */ … … 310 306 // getPreferredViewportSize() in JTable, but did not work. 311 307 // 312 scrollPane.addComponentListener( 313 new ComponentAdapter() { 314 @Override public void componentResized(ComponentEvent e) { 315 super.componentResized(e); 316 Dimension d = scrollPane.getViewport().getExtentSize(); 317 memberTable.adjustColumnWidth(d.width); 318 } 319 } 320 ); 308 scrollPane.addComponentListener(new ComponentAdapter() { 309 @Override 310 public void componentResized(ComponentEvent e) { 311 super.componentResized(e); 312 Dimension d = scrollPane.getViewport().getExtentSize(); 313 memberTable.adjustColumnWidth(d.width); 314 } 315 }); 321 316 322 317 GridBagConstraints gc = new GridBagConstraints(); 323 318 gc.gridx = 0; 324 319 gc.gridy = 0; 325 gc.gridheight =1;320 gc.gridheight = 1; 326 321 gc.gridwidth = 3; 327 322 gc.fill = GridBagConstraints.HORIZONTAL; … … 333 328 gc.gridx = 0; 334 329 gc.gridy = 1; 335 gc.gridheight =1;330 gc.gridheight = 1; 336 331 gc.gridwidth = 1; 337 332 gc.fill = GridBagConstraints.VERTICAL; … … 354 349 gc.gridx = 0; 355 350 gc.gridy = 0; 356 gc.gridheight =1;351 gc.gridheight = 1; 357 352 gc.gridwidth = 3; 358 353 gc.fill = GridBagConstraints.HORIZONTAL; … … 364 359 gc.gridx = 0; 365 360 gc.gridy = 1; 366 gc.gridheight =1;361 gc.gridheight = 1; 367 362 gc.gridwidth = 1; 368 363 gc.fill = GridBagConstraints.VERTICAL; … … 379 374 pnl2.add(buildSelectionTablePanel(), gc); 380 375 381 final JSplitPane splitPane = new 376 final JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); 382 377 splitPane.setLeftComponent(pnl); 383 378 splitPane.setRightComponent(pnl2); 384 379 splitPane.setOneTouchExpandable(false); 385 addWindowListener( 386 new WindowAdapter() { 387 @Override 388 public void windowOpened(WindowEvent e) { 389 // has to be called when the window is visible, otherwise 390 // no effect 391 splitPane.setDividerLocation(0.6); 392 } 393 } 394 ); 380 addWindowListener(new WindowAdapter() { 381 @Override 382 public void windowOpened(WindowEvent e) { 383 // has to be called when the window is visible, otherwise 384 // no effect 385 splitPane.setDividerLocation(0.6); 386 } 387 }); 395 388 396 389 JPanel pnl3 = new JPanel(); … … 403 396 /** 404 397 * builds the panel with the table displaying the currently selected primitives 405 * 398 * 406 399 * @return 407 400 */ … … 409 402 JPanel pnl = new JPanel(); 410 403 pnl.setLayout(new BorderLayout()); 411 JTable tbl = new JTable(selectionTableModel,new SelectionTableColumnModel(memberTableModel)); 404 JTable tbl = new JTable(selectionTableModel, new SelectionTableColumnModel(memberTableModel)); 412 405 tbl.setEnabled(false); 413 406 JScrollPane pane = new JScrollPane(tbl); … … 417 410 418 411 /** 419 * builds the {@see JSplitPane} which divides the editor in an upper and a lower 420 * half 421 * 412 * builds the {@see JSplitPane} which divides the editor in an upper and a lower half 413 * 422 414 * @return the split panel 423 415 */ … … 427 419 pane.setBottomComponent(buildMemberEditorPanel()); 428 420 pane.setOneTouchExpandable(true); 429 addWindowListener( 430 new WindowAdapter() { 431 @Override 432 public void windowOpened(WindowEvent e) { 433 // has to be called when the window is visible, otherwise 434 // no effect 435 pane.setDividerLocation(0.3); 436 } 437 } 438 ); 421 addWindowListener(new WindowAdapter() { 422 @Override 423 public void windowOpened(WindowEvent e) { 424 // has to be called when the window is visible, otherwise 425 // no effect 426 pane.setDividerLocation(0.3); 427 } 428 }); 439 429 return pane; 440 430 } … … 442 432 /** 443 433 * build the panel with the buttons on the left 444 * 434 * 445 435 * @return 446 436 */ … … 452 442 gc.gridx = 0; 453 443 gc.gridy = 0; 454 gc.gridheight =1;444 gc.gridheight = 1; 455 445 gc.gridwidth = 1; 456 gc.insets = new Insets(0, 5,0,5);446 gc.insets = new Insets(0, 5, 0, 5); 457 447 gc.fill = GridBagConstraints.HORIZONTAL; 458 448 gc.anchor = GridBagConstraints.CENTER; … … 473 463 RemoveAction removeSelectedAction = new RemoveAction(); 474 464 memberTable.getSelectionModel().addListSelectionListener(removeSelectedAction); 475 pnl.add(new JButton(removeSelectedAction),gc); 465 pnl.add(new JButton(removeSelectedAction), gc); 466 467 // ------ 468 gc.gridy = 3; 469 SortAction sortAction = new SortAction(); 470 pnl.add(new JButton(sortAction), gc); 476 471 477 472 // ------ 478 473 // just grab the remaining space 479 gc.gridy = 3;474 gc.gridy = 4; 480 475 gc.weighty = 1.0; 481 476 gc.fill = GridBagConstraints.BOTH; 482 pnl.add(new JPanel(),gc); 477 pnl.add(new JPanel(), gc); 483 478 return pnl; 484 479 } … … 486 481 /** 487 482 * build the panel with the buttons for adding or removing the current selection 488 * 483 * 489 484 * @return 490 485 */ … … 496 491 gc.gridx = 0; 497 492 gc.gridy = 0; 498 gc.gridheight =1;493 gc.gridheight = 1; 499 494 gc.gridwidth = 1; 500 gc.insets = new Insets(0, 5,0,5);495 gc.insets = new Insets(0, 5, 0, 5); 501 496 gc.fill = GridBagConstraints.HORIZONTAL; 502 497 gc.anchor = GridBagConstraints.CENTER; … … 538 533 gc.weighty = 1.0; 539 534 gc.fill = GridBagConstraints.BOTH; 540 pnl.add(new JPanel(),gc); 535 pnl.add(new JPanel(), gc); 541 536 542 537 return pnl; … … 552 547 buttonPanel.add(new JLabel(tr("Role:"))); 553 548 tfRole = new JTextField(10); 554 tfRole.addFocusListener( 555 new FocusAdapter() { 556 @Override 557 public void focusGained(FocusEvent e) { 558 tfRole.selectAll(); 559 } 560 } 561 ); 549 tfRole.addFocusListener(new FocusAdapter() { 550 @Override 551 public void focusGained(FocusEvent e) { 552 tfRole.selectAll(); 553 } 554 }); 562 555 buttonPanel.add(tfRole); 563 556 SetRoleAction setRoleAction = new SetRoleAction(); … … 566 559 tfRole.getDocument().addDocumentListener(setRoleAction); 567 560 568 //--- copy relation action 561 // --- copy relation action 569 562 buttonPanel.add(new SideButton(new DuplicateRelationAction())); 570 563 … … 580 573 */ 581 574 protected void applyChanges() { 582 if (getRelation()== null) { 575 if (getRelation() == null) { 583 576 // If the user wanted to create a new relation, but hasn't added any members or 584 577 // tags, don't add an empty relation 585 if(memberTableModel.getRowCount() == 0 && tagEditorModel.getKeys().isEmpty()) 578 if (memberTableModel.getRowCount() == 0 && tagEditorModel.getKeys().isEmpty()) 586 579 return; 587 580 Relation newRelation = new Relation(); … … 590 583 Main.main.undoRedo.add(new AddCommand(newRelation)); 591 584 DataSet.fireSelectionChanged(getLayer().data.getSelected()); 592 } else if (! 585 } else if (!memberTableModel.hasSameMembersAs(getRelation()) || tagEditorModel.isDirty()) { 593 586 Relation editedRelation = new Relation(getRelation()); 594 587 tagEditorModel.applyToPrimitive(editedRelation); … … 597 590 Conflict<Relation> conflict = new Conflict<Relation>(getRelation(), editedRelation); 598 591 getLayer().getConflicts().add(conflict); 599 JOptionPane op = new JOptionPane( 600 tr("<html>The relation has changed outside of the editor.<br>" 601 + "Your edit can't be applied directly, a conflict has been created instead.</html>" 602 ), 603 JOptionPane.WARNING_MESSAGE 604 ); 592 JOptionPane op = new JOptionPane(tr("<html>The relation has changed outside of the editor.<br>" 593 + "Your edit can't be applied directly, a conflict has been created instead.</html>"), 594 JOptionPane.WARNING_MESSAGE); 605 595 JDialog dialog = op.createDialog(this, tr("Conflict created")); 606 596 dialog.setAlwaysOnTop(true); … … 626 616 /** 627 617 * Asynchronously download the members of the currently edited relation 628 * 618 * 629 619 */ 630 620 private void downloadRelationMembers() { … … 650 640 class AddSelectedAtStartAction extends AbstractAction implements TableModelListener { 651 641 public AddSelectedAtStartAction() { 652 putValue(SHORT_DESCRIPTION, tr("Add all primitives selected in the current dataset before the first member")); 642 putValue(SHORT_DESCRIPTION, 643 tr("Add all primitives selected in the current dataset before the first member")); 653 644 putValue(SMALL_ICON, ImageProvider.get("dialogs/conflict", "copystartright")); 654 //putValue(NAME, tr("Add Selected")); 645 // putValue(NAME, tr("Add Selected")); 655 646 refreshEnabled(); 656 647 } 657 648 658 649 protected void refreshEnabled() { 659 setEnabled(selectionTableModel.getRowCount() > 650 setEnabled(selectionTableModel.getRowCount() > 0); 660 651 } 661 652 … … 671 662 class AddSelectedAtEndAction extends AbstractAction implements TableModelListener { 672 663 public AddSelectedAtEndAction() { 673 putValue(SHORT_DESCRIPTION, 664 putValue(SHORT_DESCRIPTION, tr("Add all primitives selected in the current dataset after the last member")); 674 665 putValue(SMALL_ICON, ImageProvider.get("dialogs/conflict", "copyendright")); 675 //putValue(NAME, tr("Add Selected")); 666 // putValue(NAME, tr("Add Selected")); 676 667 refreshEnabled(); 677 668 } 678 669 679 670 protected void refreshEnabled() { 680 setEnabled(selectionTableModel.getRowCount() > 671 setEnabled(selectionTableModel.getRowCount() > 0); 681 672 } 682 673 … … 692 683 class AddSelectedBeforeSelection extends AbstractAction implements TableModelListener, ListSelectionListener { 693 684 public AddSelectedBeforeSelection() { 694 putValue(SHORT_DESCRIPTION, tr("Add all primitives selected in the current dataset before the first selected member")); 685 putValue(SHORT_DESCRIPTION, 686 tr("Add all primitives selected in the current dataset before the first selected member")); 695 687 putValue(SMALL_ICON, ImageProvider.get("dialogs/conflict", "copybeforecurrentright")); 696 //putValue(NAME, tr("Add Selected")); 688 // putValue(NAME, tr("Add Selected")); 697 689 refreshEnabled(); 698 690 } 699 691 700 692 protected void refreshEnabled() { 701 setEnabled(selectionTableModel.getRowCount() > 693 setEnabled(selectionTableModel.getRowCount() > 0 702 694 && memberTableModel.getSelectionModel().getMinSelectionIndex() >= 0); 703 695 } 704 696 705 697 public void actionPerformed(ActionEvent e) { 706 memberTableModel.addMembersBeforeIdx(selectionTableModel.getSelection(), memberTableModel.getSelectionModel().getMinSelectionIndex()); 698 memberTableModel.addMembersBeforeIdx(selectionTableModel.getSelection(), memberTableModel 699 .getSelectionModel().getMinSelectionIndex()); 707 700 } 708 701 … … 718 711 class AddSelectedAfterSelection extends AbstractAction implements TableModelListener, ListSelectionListener { 719 712 public AddSelectedAfterSelection() { 720 putValue(SHORT_DESCRIPTION, tr("Add all primitives selected in the current dataset after the last selected member")); 713 putValue(SHORT_DESCRIPTION, 714 tr("Add all primitives selected in the current dataset after the last selected member")); 721 715 putValue(SMALL_ICON, ImageProvider.get("dialogs/conflict", "copyaftercurrentright")); 722 //putValue(NAME, tr("Add Selected")); 716 // putValue(NAME, tr("Add Selected")); 723 717 refreshEnabled(); 724 718 } 725 719 726 720 protected void refreshEnabled() { 727 setEnabled(selectionTableModel.getRowCount() > 721 setEnabled(selectionTableModel.getRowCount() > 0 728 722 && memberTableModel.getSelectionModel().getMinSelectionIndex() >= 0); 729 723 } 730 724 731 725 public void actionPerformed(ActionEvent e) { 732 memberTableModel.addMembersAfterIdx(selectionTableModel.getSelection(), memberTableModel.getSelectionModel().getMaxSelectionIndex()); 726 memberTableModel.addMembersAfterIdx(selectionTableModel.getSelection(), memberTableModel 727 .getSelectionModel().getMaxSelectionIndex()); 733 728 } 734 729 … … 744 739 class RemoveSelectedAction extends AbstractAction implements TableModelListener { 745 740 public RemoveSelectedAction() { 746 putValue(SHORT_DESCRIPTION, 741 putValue(SHORT_DESCRIPTION, tr("Remove all currently selected objects from relation")); 747 742 putValue(SMALL_ICON, ImageProvider.get("dialogs", "removeselected")); 748 743 // putValue(NAME, tr("Remove Selected")); 749 Shortcut.registerShortcut("relationeditor:removeselected", 750 tr("Relation Editor: Remove Selected"), 751 KeyEvent.VK_S, 752 Shortcut.GROUP_MNEMONIC); 744 Shortcut.registerShortcut("relationeditor:removeselected", tr("Relation Editor: Remove Selected"), 745 KeyEvent.VK_S, Shortcut.GROUP_MNEMONIC); 753 746 754 747 DataSet ds = getLayer().data; … … 761 754 762 755 public void tableChanged(TableModelEvent e) { 763 setEnabled(selectionTableModel.getRowCount() >0); 756 setEnabled(selectionTableModel.getRowCount() > 0); 757 } 758 } 759 760 class SortAction extends AbstractAction { 761 public SortAction() { 762 putValue(SHORT_DESCRIPTION, tr("Sort the relation members")); 763 putValue(SMALL_ICON, ImageProvider.get("dialogs", "sort")); 764 // putValue(NAME, tr("Sort")); 765 Shortcut.registerShortcut("relationeditor:sort", tr("Relation Editor: Sort"), KeyEvent.VK_T, 766 Shortcut.GROUP_MNEMONIC); 767 setEnabled(false); 768 } 769 770 public void actionPerformed(ActionEvent e) { 771 memberTableModel.sort(); 764 772 } 765 773 } … … 767 775 class MoveUpAction extends AbstractAction implements ListSelectionListener { 768 776 public MoveUpAction() { 769 putValue(SHORT_DESCRIPTION, 777 putValue(SHORT_DESCRIPTION, tr("Move the currently selected members up")); 770 778 putValue(SMALL_ICON, ImageProvider.get("dialogs", "moveup")); 771 //putValue(NAME, tr("Move Up")); 772 Shortcut.registerShortcut("relationeditor:moveup", 773 tr("Relation Editor: Move Up"), 774 KeyEvent.VK_N, 779 // putValue(NAME, tr("Move Up")); 780 Shortcut.registerShortcut("relationeditor:moveup", tr("Relation Editor: Move Up"), KeyEvent.VK_N, 775 781 Shortcut.GROUP_MNEMONIC); 776 782 setEnabled(false); … … 788 794 class MoveDownAction extends AbstractAction implements ListSelectionListener { 789 795 public MoveDownAction() { 790 putValue(SHORT_DESCRIPTION, 796 putValue(SHORT_DESCRIPTION, tr("Move the currently selected members down")); 791 797 putValue(SMALL_ICON, ImageProvider.get("dialogs", "movedown")); 792 //putValue(NAME, tr("Move Down")); 793 Shortcut.registerShortcut("relationeditor:moveup", 794 tr("Relation Editor: Move Down"), 795 KeyEvent.VK_J, 798 // putValue(NAME, tr("Move Down")); 799 Shortcut.registerShortcut("relationeditor:moveup", tr("Relation Editor: Move Down"), KeyEvent.VK_J, 796 800 Shortcut.GROUP_MNEMONIC); 797 801 setEnabled(false); … … 809 813 class RemoveAction extends AbstractAction implements ListSelectionListener { 810 814 public RemoveAction() { 811 putValue(SHORT_DESCRIPTION, 815 putValue(SHORT_DESCRIPTION, tr("Remove the member in the current table row from this relation")); 812 816 putValue(SMALL_ICON, ImageProvider.get("dialogs", "remove")); 813 //putValue(NAME, tr("Remove")); 814 Shortcut.registerShortcut("relationeditor:remove", 815 tr("Relation Editor: Remove"), 816 KeyEvent.VK_J, 817 // putValue(NAME, tr("Remove")); 818 Shortcut.registerShortcut("relationeditor:remove", tr("Relation Editor: Remove"), KeyEvent.VK_J, 817 819 Shortcut.GROUP_MNEMONIC); 818 820 setEnabled(false); … … 830 832 class OKAction extends AbstractAction { 831 833 public OKAction() { 832 putValue(SHORT_DESCRIPTION, 834 putValue(SHORT_DESCRIPTION, tr("Apply the updates and close the dialog")); 833 835 putValue(SMALL_ICON, ImageProvider.get("ok")); 834 836 putValue(NAME, tr("Apply")); … … 844 846 class CancelAction extends AbstractAction { 845 847 public CancelAction() { 846 putValue(SHORT_DESCRIPTION, 848 putValue(SHORT_DESCRIPTION, tr("Cancel the updates and close the dialog")); 847 849 putValue(SMALL_ICON, ImageProvider.get("cancel")); 848 850 putValue(NAME, tr("Cancel")); … … 861 863 class AddTagAction extends AbstractAction { 862 864 public AddTagAction() { 863 putValue(SHORT_DESCRIPTION, 864 putValue(SMALL_ICON, ImageProvider.get("dialogs","add")); 865 //putValue(NAME, tr("Cancel")); 865 putValue(SHORT_DESCRIPTION, tr("Add an empty tag")); 866 putValue(SMALL_ICON, ImageProvider.get("dialogs", "add")); 867 // putValue(NAME, tr("Cancel")); 866 868 setEnabled(true); 867 869 } 870 868 871 public void actionPerformed(ActionEvent e) { 869 872 tagEditorModel.appendNewTag(); … … 871 874 } 872 875 873 class DeleteTagAction extends AbstractAction implements ListSelectionListener{ 876 class DeleteTagAction extends AbstractAction implements ListSelectionListener { 874 877 public DeleteTagAction() { 875 putValue(SHORT_DESCRIPTION, 876 putValue(SMALL_ICON, ImageProvider.get("dialogs","delete")); 877 //putValue(NAME, tr("Cancel")); 878 putValue(SHORT_DESCRIPTION, tr("Delete the currently selected tags")); 879 putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete")); 880 // putValue(NAME, tr("Cancel")); 878 881 refreshEnabled(); 879 882 } … … 917 920 // should not happen 918 921 // 919 throw new IllegalStateException("unexpected selected clolumn: getSelectedColumn() is " + tagTable.getSelectedColumn()); 922 throw new IllegalStateException("unexpected selected clolumn: getSelectedColumn() is " 923 + tagTable.getSelectedColumn()); 920 924 } else if (tagTable.getSelectedColumnCount() == 2) { 921 925 deleteTags(); … … 927 931 928 932 protected void refreshEnabled() { 929 setEnabled(tagTable.getSelectedRowCount() >0 || tagTable.getSelectedColumnCount() > 0);933 setEnabled(tagTable.getSelectedRowCount() > 0 || tagTable.getSelectedColumnCount() > 0); 930 934 } 931 935 … … 937 941 class DownlaodAction extends AbstractAction { 938 942 public DownlaodAction() { 939 putValue(SHORT_DESCRIPTION, 940 putValue(SMALL_ICON, ImageProvider.get("dialogs","downloadincomplete")); 943 putValue(SHORT_DESCRIPTION, tr("Download all incomplete ways and nodes in relation")); 944 putValue(SMALL_ICON, ImageProvider.get("dialogs", "downloadincomplete")); 941 945 putValue(NAME, tr("Download Members")); 942 Shortcut.registerShortcut("relationeditor:downloadincomplete", 943 tr("Relation Editor: Download Members"), 944 KeyEvent.VK_K, 945 Shortcut.GROUP_MNEMONIC); 946 Shortcut.registerShortcut("relationeditor:downloadincomplete", tr("Relation Editor: Download Members"), 947 KeyEvent.VK_K, Shortcut.GROUP_MNEMONIC); 946 948 setEnabled(true); 947 949 } 950 948 951 public void actionPerformed(ActionEvent e) { 949 952 downloadRelationMembers(); … … 951 954 } 952 955 953 class SetRoleAction extends AbstractAction implements ListSelectionListener, DocumentListener{ 956 class SetRoleAction extends AbstractAction implements ListSelectionListener, DocumentListener { 954 957 public SetRoleAction() { 955 putValue(SHORT_DESCRIPTION, 958 putValue(SHORT_DESCRIPTION, tr("Sets a role for the selected members")); 956 959 // FIXME: find better icon 957 960 putValue(SMALL_ICON, ImageProvider.get("ok")); … … 987 990 /** 988 991 * Creates a new relation with a copy of the current editor state 989 * 992 * 990 993 */ 991 994 class DuplicateRelationAction extends AbstractAction { 992 995 public DuplicateRelationAction() { 993 putValue(SHORT_DESCRIPTION, 996 putValue(SHORT_DESCRIPTION, tr("Create a copy of this relation and open it in another editor window")); 994 997 // FIXME provide an icon 995 998 putValue(SMALL_ICON, ImageProvider.get("duplicate")); … … 997 1000 setEnabled(true); 998 1001 } 1002 999 1003 public void actionPerformed(ActionEvent e) { 1000 1004 Relation copy = new Relation(); … … 1010 1014 /** 1011 1015 * Action for editing the currently selected relation 1012 * 1013 * 1016 * 1017 * 1014 1018 */ 1015 1019 class EditAction extends AbstractAction implements ListSelectionListener { … … 1022 1026 1023 1027 protected void refreshEnabled() { 1024 setEnabled(memberTable.getSelectedRowCount() == 1 && memberTableModel.isEditableRelation(memberTable.getSelectedRow())); 1025 } 1026 1027 public void run() { 1028 setEnabled(memberTable.getSelectedRowCount() == 1 1029 && memberTableModel.isEditableRelation(memberTable.getSelectedRow())); 1030 } 1031 1032 public void run() { 1028 1033 int idx = memberTable.getSelectedRow(); 1029 if (idx < 0) return; 1034 if (idx < 0) 1035 return; 1030 1036 OsmPrimitive primitive = memberTableModel.getReferredPrimitive(idx); 1031 if (! (primitive instanceof Relation)) return; 1032 Relation r= (Relation)primitive; 1033 if (r.incomplete) return; 1037 if (!(primitive instanceof Relation)) 1038 return; 1039 Relation r = (Relation) primitive; 1040 if (r.incomplete) 1041 return; 1034 1042 RelationEditor editor = RelationEditor.getEditor(getLayer(), r, null); 1035 1043 editor.setVisible(true); … … 1060 1068 ArrayList<OsmPrimitive> sel; 1061 1069 int cnt = memberTable.getSelectedRowCount(); 1062 if (cnt <=0) return; 1070 if (cnt <= 0) 1071 return; 1063 1072 sel = new ArrayList<OsmPrimitive>(cnt); 1064 1073 for (int i : memberTable.getSelectedRows()) { … … 1071 1080 /** 1072 1081 * The asynchronous task for downloading relation members. 1073 * 1074 * 1082 * 1083 * 1075 1084 */ 1076 1085 class DownloadTask extends PleaseWaitRunnable { … … 1080 1089 1081 1090 public DownloadTask(Dialog parent) { 1082 super(tr("Download relation members"), new PleaseWaitProgressMonitor(parent), false /* don't ignore exception */); 1083 } 1091 super(tr("Download relation members"), new PleaseWaitProgressMonitor(parent), false /* 1092 * don't 1093 * ignore 1094 * exception 1095 */); 1096 } 1097 1084 1098 @Override 1085 1099 protected void cancel() { … … 1093 1107 msg = lastException.toString(); 1094 1108 } 1095 JOptionPane.showMessageDialog( 1096 null, 1097 msg, 1098 tr("Error"), 1099 JOptionPane.ERROR_MESSAGE 1100 ); 1109 JOptionPane.showMessageDialog(null, msg, tr("Error"), JOptionPane.ERROR_MESSAGE); 1101 1110 } 1102 1111 1103 1112 @Override 1104 1113 protected void finish() { 1105 if (cancelled) return; 1114 if (cancelled) 1115 return; 1106 1116 memberTableModel.updateMemberReferences(getLayer().data); 1107 1117 if (lastException != null) { … … 1110 1120 1111 1121 if (conflictsCount > 0) { 1112 JOptionPane op = new JOptionPane( 1113 tr("There were {0} conflicts during import.", 1114 conflictsCount), 1115 JOptionPane.WARNING_MESSAGE 1116 ); 1122 JOptionPane op = new JOptionPane(tr("There were {0} conflicts during import.", conflictsCount), 1123 JOptionPane.WARNING_MESSAGE); 1117 1124 JDialog dialog = op.createDialog(GenericRelationEditor.this, tr("Conflicts in data")); 1118 1125 dialog.setAlwaysOnTop(true); … … 1127 1134 try { 1128 1135 progressMonitor.indeterminateSubTask(""); 1129 OsmServerObjectReader reader = new OsmServerObjectReader(getRelation().id, OsmPrimitiveType.RELATION, true); 1130 DataSet dataSet = reader.parseOsm(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)); 1136 OsmServerObjectReader reader = new OsmServerObjectReader(getRelation().id, OsmPrimitiveType.RELATION, 1137 true); 1138 DataSet dataSet = reader.parseOsm(progressMonitor 1139 .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)); 1131 1140 if (dataSet != null) { 1132 1141 final MergeVisitor visitor = new MergeVisitor(getLayer().data, dataSet); … … 1137 1146 getLayer().data.dataSources.add(src); 1138 1147 } 1139 // FIXME: this is necessary because there are 1148 // FIXME: this is necessary because there are dialogs listening 1140 1149 // for DataChangeEvents which manipulate Swing components on this 1141 1150 // thread. 1142 1151 // 1143 SwingUtilities.invokeLater( 1144 new Runnable() { 1145 public void run() { 1146 getLayer().fireDataChange(); 1147 } 1148 } 1149 ); 1152 SwingUtilities.invokeLater(new Runnable() { 1153 public void run() { 1154 getLayer().fireDataChange(); 1155 } 1156 }); 1150 1157 if (!visitor.getConflicts().isEmpty()) { 1151 1158 getLayer().getConflicts().add(visitor.getConflicts()); … … 1153 1160 } 1154 1161 } 1155 } catch(Exception e) { 1162 } catch (Exception e) { 1156 1163 if (cancelled) { 1157 System.out.println(tr("Warning: ignoring exception because task is cancelled. Exception: {0}", e.toString())); 1164 System.out.println(tr("Warning: ignoring exception because task is cancelled. Exception: {0}", e 1165 .toString())); 1158 1166 return; 1159 1167 } -
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableCellRenderer.java
r1814 r1822 6 6 import java.util.ArrayList; 7 7 import java.util.Collections; 8 import java.util.HashMap;9 8 10 import javax.swing.ImageIcon;11 9 import javax.swing.JLabel; 12 10 import javax.swing.JTable; … … 14 12 15 13 import org.openstreetmap.josm.data.osm.OsmPrimitive; 16 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;17 import org.openstreetmap.josm.gui.PrimitiveNameFormatter;18 import org.openstreetmap.josm.tools.ImageProvider;19 14 20 15 /** … … 22 17 * 23 18 */ 24 public class MemberTableCellRenderer extends JLabel implements TableCellRenderer { 25 static private final PrimitiveNameFormatter NAME_FORMATTER = new PrimitiveNameFormatter(); 19 public abstract class MemberTableCellRenderer extends JLabel implements TableCellRenderer { 20 public final static Color BGCOLOR_SELECTED = new Color(143, 170, 255); 21 public final static Color BGCOLOR_EMPTY_ROW = new Color(234, 234, 234); 26 22 27 public final static Color BGCOLOR_SELECTED = new Color(143,170,255); 28 public final static Color BGCOLOR_EMPTY_ROW = new Color(234,234,234); 29 30 public final static Color BGCOLOR_NOT_IN_OPPOSITE = new Color(255,197,197); 31 public final static Color BGCOLOR_DOUBLE_ENTRY = new Color(255,234,213); 32 33 34 private HashMap<OsmPrimitiveType, ImageIcon> icons; 35 36 /** 37 * Load the image icon for an OSM primitive of type node 38 * 39 * @return the icon; null, if not found 40 */ 41 protected void loadIcons() { 42 icons = new HashMap<OsmPrimitiveType, ImageIcon>(); 43 icons.put(OsmPrimitiveType.NODE,ImageProvider.get("data", "node")); 44 icons.put(OsmPrimitiveType.WAY, ImageProvider.get("data", "way")); 45 icons.put(OsmPrimitiveType.RELATION, ImageProvider.get("data", "relation")); 46 } 23 public final static Color BGCOLOR_NOT_IN_OPPOSITE = new Color(255, 197, 197); 24 public final static Color BGCOLOR_DOUBLE_ENTRY = new Color(255, 234, 213); 47 25 48 26 /** … … 52 30 setIcon(null); 53 31 setOpaque(true); 54 loadIcons();55 32 } 56 33 … … 58 35 StringBuilder sb = new StringBuilder(); 59 36 sb.append("<html>"); 60 sb.append("<strong>id</strong>=") 61 .append(primitive.id) 62 .append("<br>"); 37 sb.append("<strong>id</strong>=").append(primitive.id).append("<br>"); 63 38 ArrayList<String> keyList = new ArrayList<String>(primitive.keySet()); 64 39 Collections.sort(keyList); … … 68 43 } 69 44 String key = keyList.get(i); 70 sb.append("<strong>") 71 .append(key) 72 .append("</strong>") 73 .append("="); 45 sb.append("<strong>").append(key).append("</strong>").append("="); 74 46 String value = primitive.get(key); 75 while(value.length() != 0) { 76 sb.append(value.substring(0,Math.min(50, value.length()))); 47 while (value.length() != 0) { 48 sb.append(value.substring(0, Math.min(50, value.length()))); 77 49 if (value.length() > 50) { 78 50 sb.append("<br>"); … … 98 70 } 99 71 100 protected void renderBackground( 72 protected void renderBackground(MemberTableModel model, OsmPrimitive primitive, boolean isSelected) { 101 73 Color bgc = Color.WHITE; 102 74 if (isSelected) { … … 113 85 } 114 86 115 protected void renderPrimitive(OsmPrimitive primitive) { 116 setIcon(icons.get(OsmPrimitiveType.from(primitive))); 117 setText(NAME_FORMATTER.getName(primitive)); 118 setToolTipText(buildToolTipText(primitive)); 119 } 120 121 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 122 int row, int column) { 123 124 reset(); 125 126 renderForeground(isSelected); 127 switch(column) { 128 case 0: 129 String role = (String)value; 130 renderBackground(getModel(table), null, isSelected); 131 setText(role); 132 break; 133 case 1: 134 OsmPrimitive primitive = (OsmPrimitive)value; 135 renderBackground(getModel(table), primitive, isSelected); 136 renderPrimitive(primitive); 137 break; 138 case 2: 139 setText(""); 140 renderBackground(getModel(table), null, isSelected); 141 break; 142 default: 143 // should not happen 144 } 145 return this; 146 } 87 abstract public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 88 boolean hasFocus, int row, int column); 147 89 148 90 /** 149 91 * replies the model 150 * @param table 92 * @param table the table 151 93 * @return the table model 152 94 */ 153 95 protected MemberTableModel getModel(JTable table) { 154 return (MemberTableModel)table.getModel(); 96 return (MemberTableModel) table.getModel(); 155 97 } 156 98 } -
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableColumnModel.java
r1814 r1822 7 7 import javax.swing.table.TableColumn; 8 8 9 import org.openstreetmap.josm.gui.OsmPrimitivRenderer; 10 11 public class MemberTableColumnModel extends DefaultTableColumnModel{ 9 public class MemberTableColumnModel extends DefaultTableColumnModel { 12 10 13 11 public MemberTableColumnModel() { 14 12 TableColumn col = null; 15 MemberTableCellRenderer renderer = new MemberTableCellRenderer();16 13 17 14 // column 0 - the member role … … 19 16 col.setHeaderValue(tr("Role")); 20 17 col.setResizable(true); 21 col.setCellRenderer( renderer);18 col.setCellRenderer(new MemberTableRoleCellRenderer()); 22 19 23 20 addColumn(col); … … 27 24 col.setHeaderValue(tr("Refers to")); 28 25 col.setResizable(true); 29 col.setCellRenderer(new OsmPrimitivRenderer()); 30 col.setCellRenderer( renderer);26 // col.setCellRenderer(new OsmPrimitivRenderer()); 27 col.setCellRenderer(new MemberTableMemberCellRenderer()); 31 28 addColumn(col); 32 29 … … 35 32 col.setHeaderValue(tr("Linked")); 36 33 col.setResizable(true); 37 col.setCellRenderer( renderer);34 col.setCellRenderer(new MemberTableLinkedCellRenderer()); 38 35 addColumn(col); 39 36 } -
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
r1806 r1822 7 7 import java.util.Collections; 8 8 import java.util.Iterator; 9 import java.util.LinkedList; 9 10 import java.util.List; 11 import java.util.Vector; 10 12 import java.util.concurrent.CopyOnWriteArrayList; 11 13 … … 15 17 16 18 import org.openstreetmap.josm.data.osm.DataSet; 19 import org.openstreetmap.josm.data.osm.Node; 17 20 import org.openstreetmap.josm.data.osm.OsmPrimitive; 18 21 import org.openstreetmap.josm.data.osm.Relation; 19 22 import org.openstreetmap.josm.data.osm.RelationMember; 20 21 public class MemberTableModel extends AbstractTableModel{ 22 23 private Relation relation; 23 import org.openstreetmap.josm.data.osm.Way; 24 25 public class MemberTableModel extends AbstractTableModel { 26 24 27 private ArrayList<RelationMember> members; 25 private ArrayList<String> memberLinkingInfo;26 28 private DefaultListSelectionModel listSelectionModel; 27 29 private CopyOnWriteArrayList<IMemberModelListener> listeners; … … 30 32 * constructor 31 33 */ 32 public MemberTableModel(){ 34 public MemberTableModel() { 33 35 members = new ArrayList<RelationMember>(); 34 memberLinkingInfo = new ArrayList<String>();35 36 listeners = new CopyOnWriteArrayList<IMemberModelListener>(); 36 37 } 37 38 38 39 public void addMemberModelListener(IMemberModelListener listener) { 39 synchronized(listeners) { 40 if (listener != null && ! 40 synchronized (listeners) { 41 if (listener != null && !listeners.contains(listener)) { 41 42 listeners.add(listener); 42 43 } … … 45 46 46 47 public void removeMemberModelListener(IMemberModelListener listener) { 47 synchronized(listeners) { 48 synchronized (listeners) { 48 49 if (listener != null && listeners.contains(listener)) { 49 50 listeners.remove(listener); … … 53 54 54 55 protected void fireMakeMemberVisible(int index) { 55 synchronized(listeners) { 56 for (IMemberModelListener listener: listeners) { 56 synchronized (listeners) { 57 for (IMemberModelListener listener : listeners) { 57 58 listener.makeMemberVisible(index); 58 59 } … … 65 66 members.addAll(relation.members); 66 67 } 67 this.relation = relation;68 68 fireTableDataChanged(); 69 69 } … … 78 78 79 79 public Object getValueAt(int rowIndex, int columnIndex) { 80 switch(columnIndex) { 81 case 0: return members.get(rowIndex).role; 82 case 1: return members.get(rowIndex).member; 83 case 2: return ""; 80 switch (columnIndex) { 81 case 0: 82 return members.get(rowIndex).role; 83 case 1: 84 return members.get(rowIndex).member; 85 case 2: 86 return linked(rowIndex); 84 87 } 85 88 // should not happen … … 98 101 } 99 102 100 101 103 public OsmPrimitive getReferredPrimitive(int idx) { 102 104 return members.get(idx).member; … … 104 106 105 107 public void moveUp(int[] selectedRows) { 106 if (! 108 if (!canMoveUp(selectedRows)) 107 109 return; 108 110 109 111 for (int row : selectedRows) { 110 112 RelationMember member1 = members.get(row); 111 RelationMember member2 = members.get(row -1);113 RelationMember member2 = members.get(row - 1); 112 114 members.set(row, member2); 113 members.set(row -1, member1);115 members.set(row - 1, member1); 114 116 } 115 117 fireTableDataChanged(); … … 120 122 listSelectionModel.addSelectionInterval(row, row); 121 123 } 122 fireMakeMemberVisible(selectedRows[0] -1); 124 fireMakeMemberVisible(selectedRows[0] - 1); 123 125 } 124 126 125 127 public void moveDown(int[] selectedRows) { 126 if (! 127 return; 128 129 for (int i =selectedRows.length-1; i >=0; i--) {128 if (!canMoveDown(selectedRows)) 129 return; 130 131 for (int i = selectedRows.length - 1; i >= 0; i--) { 130 132 int row = selectedRows[i]; 131 133 RelationMember member1 = members.get(row); 132 RelationMember member2 = members.get(row +1);134 RelationMember member2 = members.get(row + 1); 133 135 members.set(row, member2); 134 members.set(row +1, member1);136 members.set(row + 1, member1); 135 137 } 136 138 fireTableDataChanged(); … … 145 147 146 148 public void remove(int[] selectedRows) { 147 if (! 149 if (!canRemove(selectedRows)) 148 150 return; 149 151 int offset = 0; … … 156 158 } 157 159 158 public boolean canMoveUp(int [] rows) { 159 if (rows == null || rows.length == 0) return false; 160 public boolean canMoveUp(int[] rows) { 161 if (rows == null || rows.length == 0) 162 return false; 160 163 Arrays.sort(rows); 161 164 return rows[0] > 0 && members.size() > 0; 162 165 } 163 166 164 public boolean canMoveDown(int [] rows) { 165 if (rows == null || rows.length == 0) return false; 167 public boolean canMoveDown(int[] rows) { 168 if (rows == null || rows.length == 0) 169 return false; 166 170 Arrays.sort(rows); 167 return members.size() >0 && rows[rows.length-1] < members.size() - 1; 168 } 169 170 public boolean canRemove(int [] rows) { 171 if (rows == null || rows.length == 0) return false; 171 return members.size() > 0 && rows[rows.length - 1] < members.size() - 1; 172 } 173 174 public boolean canRemove(int[] rows) { 175 if (rows == null || rows.length == 0) 176 return false; 172 177 return true; 173 178 } … … 195 200 196 201 public void removeMembersReferringTo(List<? extends OsmPrimitive> primitives) { 197 if (primitives == null) return; 202 if (primitives == null) 203 return; 198 204 Iterator<RelationMember> it = members.iterator(); 199 while(it.hasNext()) { 205 while (it.hasNext()) { 200 206 RelationMember member = it.next(); 201 207 if (primitives.contains(member.member)) { … … 212 218 213 219 public boolean hasSameMembersAs(Relation relation) { 214 if (relation == null) return false; 215 if (relation.members.size() != members.size()) return false; 216 for (int i=0; i<relation.members.size();i++) { 217 if (! relation.members.get(i).equals(members.get(i))) 220 if (relation == null) 221 return false; 222 if (relation.members.size() != members.size()) 223 return false; 224 for (int i = 0; i < relation.members.size(); i++) { 225 if (!relation.members.get(i).equals(members.get(i))) 218 226 return false; 219 227 } … … 222 230 223 231 public boolean hasIncompleteMembers() { 224 for (RelationMember member: members) { 232 for (RelationMember member : members) { 225 233 if (member.member.incomplete) 226 234 return true; … … 231 239 protected List<Integer> getSelectedIndices() { 232 240 ArrayList<Integer> selectedIndices = new ArrayList<Integer>(); 233 for (int i =0; i< members.size();i++) {241 for (int i = 0; i < members.size(); i++) { 234 242 if (getSelectionModel().isSelectedIndex(i)) { 235 243 selectedIndices.add(i); … … 240 248 241 249 public void addMembersAtBeginning(List<? extends OsmPrimitive> primitives) { 242 if (primitives == null) return; 243 for (OsmPrimitive primitive: primitives) { 244 RelationMember member = new RelationMember(null,primitive); 245 members.add(0,member); 250 if (primitives == null) 251 return; 252 for (OsmPrimitive primitive : primitives) { 253 RelationMember member = new RelationMember(null, primitive); 254 members.add(0, member); 246 255 } 247 256 fireTableDataChanged(); 248 257 getSelectionModel().clearSelection(); 249 for (int i =0; i<primitives.size();i++) {250 getSelectionModel().addSelectionInterval(i,i); 258 for (int i = 0; i < primitives.size(); i++) { 259 getSelectionModel().addSelectionInterval(i, i); 251 260 } 252 261 fireMakeMemberVisible(0); … … 254 263 255 264 public void addMembersAtEnd(List<? extends OsmPrimitive> primitives) { 256 if (primitives == null) return; 257 258 for (OsmPrimitive primitive: primitives) { 259 RelationMember member = new RelationMember(null,primitive); 265 if (primitives == null) 266 return; 267 268 for (OsmPrimitive primitive : primitives) { 269 RelationMember member = new RelationMember(null, primitive); 260 270 members.add(member); 261 271 } 262 272 fireTableDataChanged(); 263 273 getSelectionModel().clearSelection(); 264 for (int i =0; i<primitives.size();i++) {265 getSelectionModel().addSelectionInterval(members.size() -1-i,members.size()-1-i);266 } 267 fireMakeMemberVisible(members.size() -1); 274 for (int i = 0; i < primitives.size(); i++) { 275 getSelectionModel().addSelectionInterval(members.size() - 1 - i, members.size() - 1 - i); 276 } 277 fireMakeMemberVisible(members.size() - 1); 268 278 } 269 279 270 280 public void addMembersBeforeIdx(List<? extends OsmPrimitive> primitives, int idx) { 271 if (primitives == null) return; 272 273 for (OsmPrimitive primitive: primitives) { 274 RelationMember member = new RelationMember(null,primitive); 275 members.add(idx,member); 281 if (primitives == null) 282 return; 283 284 for (OsmPrimitive primitive : primitives) { 285 RelationMember member = new RelationMember(null, primitive); 286 members.add(idx, member); 276 287 } 277 288 fireTableDataChanged(); 278 289 getSelectionModel().clearSelection(); 279 for (int i =0; i<primitives.size();i++) {280 getSelectionModel().addSelectionInterval(idx +i,idx+i);290 for (int i = 0; i < primitives.size(); i++) { 291 getSelectionModel().addSelectionInterval(idx + i, idx + i); 281 292 } 282 293 fireMakeMemberVisible(idx); … … 284 295 285 296 public void addMembersAfterIdx(List<? extends OsmPrimitive> primitives, int idx) { 286 if (primitives == null) return; 287 int j =1; 288 for (OsmPrimitive primitive: primitives) { 289 RelationMember member = new RelationMember(null,primitive); 290 members.add(idx+j,member); 297 if (primitives == null) 298 return; 299 int j = 1; 300 for (OsmPrimitive primitive : primitives) { 301 RelationMember member = new RelationMember(null, primitive); 302 members.add(idx + j, member); 291 303 j++; 292 304 } 293 305 fireTableDataChanged(); 294 306 getSelectionModel().clearSelection(); 295 for (int i =0; i<primitives.size();i++) {296 getSelectionModel().addSelectionInterval(idx +1 + i,idx+1 +i);297 } 298 fireMakeMemberVisible(idx +1);307 for (int i = 0; i < primitives.size(); i++) { 308 getSelectionModel().addSelectionInterval(idx + 1 + i, idx + 1 + i); 309 } 310 fireMakeMemberVisible(idx + 1); 299 311 } 300 312 … … 306 318 */ 307 319 public int getNumMembersWithPrimitive(OsmPrimitive primitive) { 308 int count 320 int count = 0; 309 321 for (RelationMember member : members) { 310 322 if (member.member.equals(primitive)) { … … 321 333 * @param role the new role 322 334 */ 323 public void updateRole(int [] idx, String role) { 324 if (idx == null || idx.length == 0) return; 325 for (int row: idx) { 335 public void updateRole(int[] idx, String role) { 336 if (idx == null || idx.length == 0) 337 return; 338 for (int row : idx) { 326 339 members.get(row).role = role; 327 340 } 328 341 fireTableDataChanged(); 329 for (int row: idx) { 342 for (int row : idx) { 330 343 getSelectionModel().addSelectionInterval(row, row); 331 344 } … … 333 346 334 347 /** 335 * Replies a collection withthe currently selected relation members348 * Get the currently selected relation members 336 349 * 337 350 * @return a collection with the currently selected relation members … … 339 352 public Collection<RelationMember> getSelectedMembers() { 340 353 ArrayList<RelationMember> selectedMembers = new ArrayList<RelationMember>(); 341 for (int i: getSelectedIndices()) { 354 for (int i : getSelectedIndices()) { 342 355 selectedMembers.add(members.get(i)); 343 356 } … … 345 358 } 346 359 347 348 360 /** 349 * Select es the members in the collection selectedMembers361 * Selects the members in the collection selectedMembers 350 362 * 351 363 * @param selectedMembers the collection of selected members … … 358 370 // 359 371 ArrayList<Integer> selectedIndices = new ArrayList<Integer>(); 360 for (RelationMember member: selectedMembers) { 372 for (RelationMember member : selectedMembers) { 361 373 int idx = members.indexOf(member); 362 374 if (idx >= 0 && !selectedIndices.contains(idx)) { … … 381 393 382 394 public boolean isEditableRelation(int row) { 383 if (row < 0 || row >= members.size()) return false; 395 if (row < 0 || row >= members.size()) 396 return false; 384 397 RelationMember member = members.get(row); 385 if (!(member.member instanceof Relation)) return false; 386 Relation r = (Relation)member.member; 387 return ! r.incomplete; 398 if (!(member.member instanceof Relation)) 399 return false; 400 Relation r = (Relation) member.member; 401 return !r.incomplete; 402 } 403 404 void sort() { 405 RelationNodeMap map = new RelationNodeMap(members); 406 Vector<LinkedList<Integer>> segments; 407 LinkedList<Integer> segment; 408 Node startSearchNode; 409 Node endSearchNode; 410 boolean something_done; 411 412 /* 413 * sort any 2 or more connected elements together may be slow with many unconnected members 414 * TODO: cleanup again, too much code in 1 method 415 */ 416 417 if (map.isEmpty()) 418 // empty relation or incomplete members 419 return; 420 segments = new Vector<LinkedList<Integer>>(); 421 // add first member of relation, not strictly necessary 422 if (map.remove(0, members.get(0))) { 423 segment = new LinkedList<Integer>(); 424 segment.add(Integer.valueOf(0)); 425 segments.add(segment); 426 } 427 while (!map.isEmpty()) { 428 segment = segments.lastElement(); 429 430 do { 431 something_done = false; 432 startSearchNode = null; 433 endSearchNode = null; 434 if (segment.size() == 1) { 435 RelationMember m = members.get(segment.getFirst()); 436 if (m.member instanceof Way) { 437 Way w = (Way) m.member; 438 endSearchNode = w.lastNode(); 439 startSearchNode = w.firstNode(); 440 } else if (m.member instanceof Node) { 441 Node n = (Node) m.member; 442 endSearchNode = n; 443 } 444 } else { 445 // add unused node of first element and unused node of last element 446 // start with the first element 447 RelationMember element = members.get(segment.getFirst()); 448 RelationMember other_element = members.get(segment.get(1)); 449 450 if (element.member instanceof Way) { 451 Way w = (Way) element.member; 452 if (other_element.member instanceof Way) { 453 Way x = (Way) other_element.member; 454 if ((w.firstNode() == x.firstNode()) || (w.firstNode() == x.lastNode())) { 455 startSearchNode = w.lastNode(); 456 } else { 457 startSearchNode = w.firstNode(); 458 } 459 } else if (other_element.member instanceof Node) { 460 Node m = (Node) other_element.member; 461 if (w.firstNode() == m) { 462 startSearchNode = w.lastNode(); 463 } else { 464 startSearchNode = w.firstNode(); 465 } 466 } 467 } else if (element.member instanceof Node) { 468 Node n = (Node) element.member; 469 startSearchNode = n; 470 } 471 472 // now the same for the last element 473 element = members.get(segment.getLast()); 474 other_element = members.get(segment.get(segment.size() - 2)); 475 476 if (element.member instanceof Way) { 477 Way w = (Way) element.member; 478 if (other_element.member instanceof Way) { 479 Way x = (Way) other_element.member; 480 if ((w.firstNode() == x.firstNode()) || (w.firstNode() == x.lastNode())) { 481 endSearchNode = w.lastNode(); 482 } else { 483 endSearchNode = w.firstNode(); 484 } 485 } else if (other_element.member instanceof Node) { 486 Node m = (Node) other_element.member; 487 if (w.firstNode() == m) { 488 endSearchNode = w.lastNode(); 489 } else { 490 endSearchNode = w.firstNode(); 491 } 492 } 493 } else if (element.member instanceof Node) { 494 Node n = (Node) element.member; 495 endSearchNode = n; 496 } 497 } 498 499 // let's see if we can find connected elements for endSearchNode and startSearchNode 500 if (startSearchNode != null) { 501 Integer m2 = map.find(startSearchNode, segment.getFirst()); 502 if (m2 != null) { 503 segment.add(0, m2); 504 map.remove(m2, members.get(m2)); 505 something_done = true; 506 } 507 } 508 if (endSearchNode != null) { 509 Integer m2 = map.find(endSearchNode, segment.getLast()); 510 if (m2 != null) { 511 segment.add(segment.size(), m2); 512 map.remove(m2, members.get(m2)); 513 something_done = true; 514 } 515 } 516 } while (something_done); 517 518 Integer next = map.pop(); 519 if (next == null) { 520 break; 521 } 522 523 segment = new LinkedList<Integer>(); 524 segment.add(next); 525 segments.add(segment); 526 } 527 // append map.remaining() to segments list (as a single segment) 528 segment = new LinkedList<Integer>(); 529 segment.addAll(map.getRemaining()); 530 segments.add(segment); 531 532 // now we need to actually re-order the relation members 533 ArrayList<RelationMember> newmembers = new ArrayList<RelationMember>(); 534 for (LinkedList<Integer> segment2 : segments) { 535 for (Integer p : segment2) { 536 newmembers.add(members.get(p)); 537 } 538 } 539 members.clear(); 540 members.addAll(newmembers); 541 542 fireTableDataChanged(); 543 } 544 545 // simple version of code that was removed from GenericReleationEditor 546 // no recursion and no forward/backward support 547 // TODO: add back the number of linked elements 548 private WayConnectionType linked(int i) { 549 // this method is aimed at finding out whether the 550 // relation member is "linked" with the next, i.e. whether 551 // (if both are ways) these ways are connected. It should 552 // really produce a much more beautiful output (with a linkage 553 // symbol somehow placed between the two member lines!), 554 // so... FIXME ;-) 555 556 WayConnectionType link = WayConnectionType.none; 557 RelationMember m1 = members.get(i); 558 RelationMember m2 = members.get((i + 1) % members.size()); 559 Way way1 = null; 560 Way way2 = null; 561 562 if (m1.member instanceof Way) { 563 way1 = (Way) m1.member; 564 } 565 if (m2.member instanceof Way) { 566 way2 = (Way) m2.member; 567 } 568 if ((way1 != null) && (way2 != null)) { 569 Node way1first = way1.firstNode(); 570 Node way1last = way1.lastNode(); 571 Node way2first = way2.firstNode(); 572 Node way2last = way2.lastNode(); 573 if (way1first != null && way2first != null && (way1first == way2first)) { 574 link = WayConnectionType.tail_to_tail; 575 } else if (way1first != null && way2last != null && (way1first == way2last)) { 576 link = WayConnectionType.tail_to_head; 577 } else if (way1last != null && way2first != null && (way1last == way2first)) { 578 link = WayConnectionType.head_to_tail; 579 } else if (way1last != null && way2last != null && (way1last == way2last)) { 580 link = WayConnectionType.head_to_head; 581 } 582 } 583 584 return link; 388 585 } 389 586 } -
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationNodeMap.java
r1785 r1822 1 1 package org.openstreetmap.josm.gui.dialogs.relation; 2 2 3 import java.util.ArrayList; 4 3 5 import org.openstreetmap.josm.data.osm.Node; 4 import org.openstreetmap.josm.data.osm.Relation;5 6 import org.openstreetmap.josm.data.osm.RelationMember; 6 7 import org.openstreetmap.josm.data.osm.Way; 7 8 8 9 /** 9 * A mapping from Node positions to elements in a Relation 10 * (currently Nodes and Ways only) 10 * A mapping from Node positions to elements in a Relation (currently Nodes and Ways only) 11 11 * 12 12 * @author Christiaan Welvaart <cjw@time4t.net> 13 * 13 * 14 14 */ 15 15 public class RelationNodeMap { 16 private java.util.HashMap<Node, java.util.TreeSet<Integer>> 17 private java.util.HashMap<Node, Integer> 18 private java.util.Vector<Integer> 19 private Relation relation;16 private java.util.HashMap<Node, java.util.TreeSet<Integer>> points; 17 private java.util.HashMap<Node, Integer> nodes; 18 private java.util.Vector<Integer> remaining; 19 private ArrayList<RelationMember> members; 20 20 21 RelationNodeMap(Relation relation) 22 { 23 int i; 21 RelationNodeMap(ArrayList<RelationMember> members) { 22 int i; 24 23 25 this. relation = relation;24 this.members = members; 26 25 points = new java.util.HashMap<Node, java.util.TreeSet<Integer>>(); 27 26 nodes = new java.util.HashMap<Node, Integer>(); 28 27 remaining = new java.util.Vector<Integer>(); 29 28 30 for (i = 0; i < relation.members.size(); ++i) 31 { 32 RelationMember m = relation.members.get(i); 29 for (i = 0; i < members.size(); ++i) { 30 RelationMember m = members.get(i); 33 31 if (m.member.incomplete) 34 {35 32 // throw an exception? 36 33 return; 37 }38 34 add(i, m); 39 35 } 40 36 } 41 37 42 Integer find(Node node, int current) 43 { 38 Integer find(Node node, int current) { 44 39 Integer result = null; 45 40 46 41 try { 47 42 result = nodes.get(node); 48 if (result == null) 49 { 43 if (result == null) { 50 44 result = points.get(node).first(); 51 if (relation.members.get(current).member == relation.members.get(result).member) 52 { 45 if (members.get(current).member == members.get(result).member) { 53 46 result = points.get(node).last(); 54 47 } 55 48 } 56 } catch(NullPointerException f) {} 57 catch(java.util.NoSuchElementException e) {} 58 59 return result; 60 } 61 62 void add(int n, RelationMember m) 63 { 64 try 65 { 66 Way w = (Way)m.member; 67 if (!points.containsKey(w.firstNode())) 68 { 69 points.put(w.firstNode(), new java.util.TreeSet<Integer>()); 70 } 71 points.get(w.firstNode()).add(Integer.valueOf(n)); 72 73 if (!points.containsKey(w.lastNode())) 74 { 75 points.put(w.lastNode(), new java.util.TreeSet<Integer>()); 76 } 77 points.get(w.lastNode()).add(Integer.valueOf(n)); 78 } 79 catch(ClassCastException e1) 80 { 81 try 82 { 83 Node node = (Node)m.member; 84 nodes.put(node, Integer.valueOf(n)); 85 } 86 catch(ClassCastException e2) 87 { 88 remaining.add(Integer.valueOf(n)); 89 } 90 } 91 } 92 93 boolean remove(int n, RelationMember a) 94 { 95 boolean result; 96 97 try 98 { 99 result = points.get(((Way)a.member).firstNode()).remove(n); 100 result &= points.get(((Way)a.member).lastNode()).remove(n); 101 } 102 catch(ClassCastException e1) 103 { 104 result = (nodes.remove(a.member) != null); 49 } catch (NullPointerException f) { 50 } catch (java.util.NoSuchElementException e) { 105 51 } 106 52 … … 108 54 } 109 55 110 void move(int from, int to) 111 { 112 if (from != to) 113 { 114 RelationMember b = relation.members.get(from); 115 RelationMember a = relation.members.get(to); 56 void add(int n, RelationMember m) { 57 if (m.member instanceof Way) { 58 Way w = (Way) m.member; 59 if (!points.containsKey(w.firstNode())) { 60 points.put(w.firstNode(), new java.util.TreeSet<Integer>()); 61 } 62 points.get(w.firstNode()).add(Integer.valueOf(n)); 63 64 if (!points.containsKey(w.lastNode())) { 65 points.put(w.lastNode(), new java.util.TreeSet<Integer>()); 66 } 67 points.get(w.lastNode()).add(Integer.valueOf(n)); 68 } else if (m.member instanceof Node) { 69 Node node = (Node) m.member; 70 nodes.put(node, Integer.valueOf(n)); 71 } else { 72 remaining.add(Integer.valueOf(n)); 73 } 74 } 75 76 boolean remove(int n, RelationMember a) { 77 boolean result; 78 if (a.member instanceof Way) { 79 result = points.get(((Way) a.member).firstNode()).remove(n); 80 result &= points.get(((Way) a.member).lastNode()).remove(n); 81 } else { 82 result = (nodes.remove(a.member) != null); 83 } 84 return result; 85 } 86 87 void move(int from, int to) { 88 if (from != to) { 89 RelationMember b = members.get(from); 90 RelationMember a = members.get(to); 116 91 117 92 remove(to, b); … … 121 96 122 97 // no node-mapped entries left 123 boolean isEmpty() 124 { 98 boolean isEmpty() { 125 99 return points.isEmpty() && nodes.isEmpty(); 126 100 } 127 101 128 java.util.Vector<Integer> getRemaining() 129 { 102 java.util.Vector<Integer> getRemaining() { 130 103 return remaining; 131 104 } 132 105 133 Integer pop() 134 {106 Integer pop() { 107 Node node = null; 135 108 Integer result = null; 136 109 137 if (!nodes.isEmpty()) 138 { 139 result = nodes.values().iterator().next(); 140 nodes.remove(result); 141 } 142 else if (!points.isEmpty()) 143 { 144 for (java.util.TreeSet<Integer> set : points.values()) 145 { 146 if (!set.isEmpty()) 147 { 110 if (!nodes.isEmpty()) { 111 node = nodes.keySet().iterator().next(); 112 result = nodes.get(node); 113 nodes.remove(node); 114 } else if (!points.isEmpty()) { 115 for (java.util.TreeSet<Integer> set : points.values()) { 116 if (!set.isEmpty()) { 148 117 result = set.first(); 118 Way w = (Way) members.get(result).member; 119 points.get(w.firstNode()).remove(result); 120 points.get(w.lastNode()).remove(result); 149 121 break; 150 122 } … … 154 126 return result; 155 127 } 156 157 128 }
Note:
See TracChangeset
for help on using the changeset viewer.