source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java@ 3020

Last change on this file since 3020 was 3020, checked in by bastiK, 15 years ago

fixed #4573 - Relation count does not update on adding or deletion

  • Property svn:eol-style set to native
File size: 26.9 KB
Line 
1package org.openstreetmap.josm.gui.dialogs;
2
3import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BorderLayout;
7import java.awt.Point;
8import java.awt.event.ActionEvent;
9import java.awt.event.KeyEvent;
10import java.awt.event.MouseAdapter;
11import java.awt.event.MouseEvent;
12import java.util.ArrayList;
13import java.util.Collection;
14import java.util.Collections;
15import java.util.Comparator;
16import java.util.HashSet;
17import java.util.List;
18import java.util.Set;
19
20import javax.swing.AbstractAction;
21import javax.swing.AbstractListModel;
22import javax.swing.DefaultListSelectionModel;
23import javax.swing.JList;
24import javax.swing.JPanel;
25import javax.swing.JPopupMenu;
26import javax.swing.JScrollPane;
27import javax.swing.KeyStroke;
28import javax.swing.ListSelectionModel;
29import javax.swing.SwingUtilities;
30import javax.swing.event.ListSelectionEvent;
31import javax.swing.event.ListSelectionListener;
32
33import org.openstreetmap.josm.Main;
34import org.openstreetmap.josm.data.osm.NameFormatter;
35import org.openstreetmap.josm.data.osm.OsmPrimitive;
36import org.openstreetmap.josm.data.osm.Relation;
37import org.openstreetmap.josm.data.osm.RelationMember;
38import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
39import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
40import org.openstreetmap.josm.data.osm.event.DataSetListener;
41import org.openstreetmap.josm.data.osm.event.DatasetEventManager;
42import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
43import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
44import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
45import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
46import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
47import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
48import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode;
49import org.openstreetmap.josm.gui.DefaultNameFormatter;
50import org.openstreetmap.josm.gui.MapView;
51import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
52import org.openstreetmap.josm.gui.SideButton;
53import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
54import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationTask;
55import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
56import org.openstreetmap.josm.gui.layer.Layer;
57import org.openstreetmap.josm.gui.layer.OsmDataLayer;
58import org.openstreetmap.josm.tools.ImageProvider;
59import org.openstreetmap.josm.tools.Shortcut;
60
61/**
62 * A dialog showing all known relations, with buttons to add, edit, and
63 * delete them.
64 *
65 * We don't have such dialogs for nodes, segments, and ways, because those
66 * objects are visible on the map and can be selected there. Relations are not.
67 */
68public class RelationListDialog extends ToggleDialog implements DataSetListener {
69 //private static final Logger logger = Logger.getLogger(RelationListDialog.class.getName());
70
71 /** The display list. */
72 private JList displaylist;
73 /** the list model used */
74 private RelationListModel model;
75
76 /** the edit action */
77 private EditAction editAction;
78 /** the delete action */
79 private DeleteAction deleteAction;
80 private NewAction newAction;
81 /** the popup menu */
82 private RelationDialogPopupMenu popupMenu;
83
84 /**
85 * constructor
86 */
87 public RelationListDialog() {
88 super(tr("Relations"), "relationlist", tr("Open a list of all relations."),
89 Shortcut.registerShortcut("subwindow:relations", tr("Toggle: {0}", tr("Relations")), KeyEvent.VK_R, Shortcut.GROUP_LAYER), 150);
90
91 // create the list of relations
92 //
93 DefaultListSelectionModel selectionModel = new DefaultListSelectionModel();
94 model = new RelationListModel(selectionModel);
95 displaylist = new JList(model);
96 displaylist.setSelectionModel(selectionModel);
97 displaylist.setCellRenderer(new OsmPrimitivRenderer() {
98 /**
99 * Don't show the default tooltip in the relation list.
100 */
101 @Override
102 protected String getComponentToolTipText(OsmPrimitive value) {
103 return null;
104 }
105 });
106 displaylist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
107 displaylist.addMouseListener(new MouseEventHandler());
108 add(new JScrollPane(displaylist), BorderLayout.CENTER);
109
110 // create the panel with buttons
111 //
112 JPanel tp = getButtonPanel(5);
113 // the new action
114 //
115 newAction = new NewAction();
116 tp.add(new SideButton(newAction, false));
117
118 // the edit action
119 //
120 editAction = new EditAction();
121 displaylist.addListSelectionListener(editAction);
122 tp.add(new SideButton(editAction, false));
123
124 // the duplicate action
125 //
126 DuplicateAction duplicateAction = new DuplicateAction();
127 displaylist.addListSelectionListener(duplicateAction);
128 tp.add(new SideButton(duplicateAction, false));
129
130 // the delete action
131 //
132 deleteAction = new DeleteAction();
133 displaylist.addListSelectionListener(deleteAction);
134 tp.add(new SideButton(deleteAction, false));
135
136 // the select action
137 //
138 SelectAction selectAction = new SelectAction();
139 displaylist.addListSelectionListener(selectAction);
140 tp.add(new SideButton(selectAction, false));
141
142 add(tp, BorderLayout.SOUTH);
143
144 // activate DEL in the list of relations
145 displaylist.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0), "deleteRelation");
146 displaylist.getActionMap().put("deleteRelation", deleteAction);
147
148 popupMenu = new RelationDialogPopupMenu();
149 }
150
151 @Override public void showNotify() {
152 MapView.addLayerChangeListener(newAction);
153 newAction.updateEnabledState();
154 DatasetEventManager.getInstance().addDatasetListener(this, FireMode.IN_EDT);
155 dataChanged(null);
156 }
157
158 @Override public void hideNotify() {
159 MapView.removeLayerChangeListener(newAction);
160 DatasetEventManager.getInstance().removeDatasetListener(this);
161 }
162
163 /**
164 * Initializes the relation list dialog from a layer. If <code>layer</code> is null
165 * or if it isn't an {@see OsmDataLayer} the dialog is reset to an empty dialog.
166 * Otherwise it is initialized with the list of non-deleted and visible relations
167 * in the layer's dataset.
168 *
169 * @param layer the layer. May be null.
170 */
171 protected void initFromLayer(Layer layer) {
172 if (layer == null || ! (layer instanceof OsmDataLayer)) {
173 model.setRelations(null);
174 return;
175 }
176 OsmDataLayer l = (OsmDataLayer)layer;
177 model.setRelations(l.data.getRelations());
178 model.updateTitle();
179 }
180
181 /**
182 * Adds a selection listener to the relation list.
183 *
184 * @param listener the listener to add
185 */
186 public void addListSelectionListener(ListSelectionListener listener) {
187 displaylist.addListSelectionListener(listener);
188 }
189
190 /**
191 * Removes a selection listener from the relation list.
192 *
193 * @param listener the listener to remove
194 */
195 public void removeListSelectionListener(ListSelectionListener listener) {
196 displaylist.removeListSelectionListener(listener);
197 }
198
199 /**
200 * @return The selected relation in the list
201 */
202 private Relation getSelected() {
203 if(model.getSize() == 1) {
204 displaylist.setSelectedIndex(0);
205 }
206 return (Relation) displaylist.getSelectedValue();
207 }
208
209 /**
210 * Selects the relation <code>relation</code> in the list of relations.
211 *
212 * @param relation the relation
213 */
214 public void selectRelation(Relation relation) {
215 if (relation == null) {
216 model.setSelectedRelations(null);
217 } else {
218 model.setSelectedRelations(Collections.singletonList(relation));
219 Integer i = model.getRelationIndex(relation);
220 if (i != null) { // Not all relations have to be in the list (for example when the relation list is hidden, it's not updated with new relations)
221 displaylist.scrollRectToVisible(displaylist.getCellBounds(i, i));
222 }
223 }
224 }
225
226 class MouseEventHandler extends MouseAdapter {
227 protected void setCurrentRelationAsSelection() {
228 Main.main.getCurrentDataSet().setSelected((Relation)displaylist.getSelectedValue());
229 }
230
231 protected void editCurrentRelation() {
232 new EditAction().launchEditor(getSelected());
233 }
234
235 @Override public void mouseClicked(MouseEvent e) {
236 if (e.getClickCount() == 2 && SwingUtilities.isLeftMouseButton(e)) {
237 if (e.isControlDown()) {
238 editCurrentRelation();
239 } else {
240 setCurrentRelationAsSelection();
241 }
242 }
243 }
244 private void openPopup(MouseEvent e) {
245 Point p = e.getPoint();
246 int index = displaylist.locationToIndex(p);
247 if (index < 0) return;
248 if (!displaylist.getCellBounds(index, index).contains(e.getPoint()))
249 return;
250 if (! displaylist.isSelectedIndex(index)) {
251 displaylist.setSelectedIndex(index);
252 }
253 popupMenu.show(displaylist, p.x, p.y-3);
254 }
255 @Override public void mousePressed(MouseEvent e) {
256 if (e.isPopupTrigger()) {
257 openPopup(e);
258 }
259 }
260 @Override public void mouseReleased(MouseEvent e) {
261 if (e.isPopupTrigger()) {
262 openPopup(e);
263 }
264 }
265 }
266
267 /**
268 * The edit action
269 *
270 */
271 class EditAction extends AbstractAction implements ListSelectionListener{
272 public EditAction() {
273 putValue(SHORT_DESCRIPTION,tr( "Open an editor for the selected relation"));
274 //putValue(NAME, tr("Edit"));
275 putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
276 setEnabled(false);
277 }
278 protected Collection<RelationMember> getMembersForCurrentSelection(Relation r) {
279 Collection<RelationMember> members = new HashSet<RelationMember>();
280 Collection<OsmPrimitive> selection = Main.map.mapView.getEditLayer().data.getSelected();
281 for (RelationMember member: r.getMembers()) {
282 if (selection.contains(member.getMember())) {
283 members.add(member);
284 }
285 }
286 return members;
287 }
288
289 public void launchEditor(Relation toEdit) {
290 if (toEdit == null)
291 return;
292 RelationEditor.getEditor(Main.map.mapView.getEditLayer(),toEdit, getMembersForCurrentSelection(toEdit)).setVisible(true);
293 }
294
295 public void actionPerformed(ActionEvent e) {
296 if (!isEnabled())
297 return;
298 launchEditor(getSelected());
299 }
300
301 public void valueChanged(ListSelectionEvent e) {
302 setEnabled(displaylist.getSelectedIndices() != null && displaylist.getSelectedIndices().length == 1);
303 }
304 }
305
306 /**
307 * The delete action
308 *
309 */
310 class DeleteAction extends AbstractAction implements ListSelectionListener {
311 class AbortException extends Exception {}
312
313 public DeleteAction() {
314 putValue(SHORT_DESCRIPTION,tr("Delete the selected relation"));
315 //putValue(NAME, tr("Delete"));
316 putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
317 setEnabled(false);
318 }
319
320 protected void deleteRelation(Relation toDelete) {
321 if (toDelete == null)
322 return;
323 org.openstreetmap.josm.actions.mapmode.DeleteAction.deleteRelation(
324 Main.main.getEditLayer(),
325 toDelete
326 );
327 }
328
329 public void actionPerformed(ActionEvent e) {
330 if (!isEnabled()) return;
331 int [] idx = displaylist.getSelectedIndices();
332 ArrayList<Relation> toDelete = new ArrayList<Relation>(idx.length);
333 for (int i: idx) {
334 toDelete.add(model.getRelation(i));
335 }
336 for (Relation r: toDelete) {
337 deleteRelation(r);
338 }
339 }
340
341 public void valueChanged(ListSelectionEvent e) {
342 setEnabled(displaylist.getSelectedIndices() != null && displaylist.getSelectedIndices().length > 0);
343 }
344 }
345
346 /**
347 * The action for creating a new relation
348 *
349 */
350 static class NewAction extends AbstractAction implements LayerChangeListener{
351 public NewAction() {
352 putValue(SHORT_DESCRIPTION,tr("Create a new relation"));
353 //putValue(NAME, tr("New"));
354 putValue(SMALL_ICON, ImageProvider.get("dialogs", "addrelation"));
355 updateEnabledState();
356 }
357
358 public void run() {
359 RelationEditor.getEditor(Main.main.getEditLayer(),null, null).setVisible(true);
360 }
361
362 public void actionPerformed(ActionEvent e) {
363 run();
364 }
365
366 protected void updateEnabledState() {
367 setEnabled(Main.main != null && Main.main.getEditLayer() != null);
368 }
369
370 public void activeLayerChange(Layer oldLayer, Layer newLayer) {
371 updateEnabledState();
372 }
373
374 public void layerAdded(Layer newLayer) {
375 updateEnabledState();
376 }
377
378 public void layerRemoved(Layer oldLayer) {
379 updateEnabledState();
380 }
381 }
382
383 /**
384 * Creates a new relation with a copy of the current editor state
385 *
386 */
387 class DuplicateAction extends AbstractAction implements ListSelectionListener {
388 public DuplicateAction() {
389 putValue(SHORT_DESCRIPTION, tr("Create a copy of this relation and open it in another editor window"));
390 putValue(SMALL_ICON, ImageProvider.get("duplicate"));
391 //putValue(NAME, tr("Duplicate"));
392 updateEnabledState();
393 }
394
395 public void launchEditorForDuplicate(Relation original) {
396 Relation copy = new Relation(original, true);
397 copy.setModified(true);
398 RelationEditor editor = RelationEditor.getEditor(
399 Main.main.getEditLayer(),
400 copy,
401 null /* no selected members */
402 );
403 editor.setVisible(true);
404 }
405
406 public void actionPerformed(ActionEvent e) {
407 if (!isEnabled())
408 return;
409 launchEditorForDuplicate(getSelected());
410 }
411
412 protected void updateEnabledState() {
413 setEnabled(displaylist.getSelectedIndices() != null && displaylist.getSelectedIndices().length == 1);
414 }
415
416 public void valueChanged(ListSelectionEvent e) {
417 updateEnabledState();
418 }
419 }
420
421 /**
422 * Sets the current selection to the list of relations selected in this dialog
423 *
424 */
425 class SelectAction extends AbstractAction implements ListSelectionListener{
426 public SelectAction() {
427 putValue(SHORT_DESCRIPTION,tr("Set the current selection to the list of selected relations"));
428 putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
429 setEnabled(false);
430 }
431
432 public void actionPerformed(ActionEvent e) {
433 if (!isEnabled()) return;
434 int [] idx = displaylist.getSelectedIndices();
435 if (idx == null || idx.length == 0) return;
436 ArrayList<OsmPrimitive> selection = new ArrayList<OsmPrimitive>(idx.length);
437 for (int i: idx) {
438 selection.add(model.getRelation(i));
439 }
440 Main.map.mapView.getEditLayer().data.setSelected(selection);
441 }
442
443 public void valueChanged(ListSelectionEvent e) {
444 setEnabled(displaylist.getSelectedIndices() != null && displaylist.getSelectedIndices().length > 0);
445 }
446 }
447
448 /**
449 * Sets the current selection to the list of relations selected in this dialog
450 *
451 */
452 class SelectMembersAction extends AbstractAction implements ListSelectionListener{
453 public SelectMembersAction() {
454 putValue(SHORT_DESCRIPTION,tr("Select the members of all selected relations"));
455 putValue(SMALL_ICON, ImageProvider.get("selectall"));
456 putValue(NAME, tr("Select members"));
457 updateEnabledState();
458 }
459
460 public void actionPerformed(ActionEvent e) {
461 if (!isEnabled()) return;
462 List<Relation> relations = model.getSelectedRelations();
463 HashSet<OsmPrimitive> members = new HashSet<OsmPrimitive>();
464 for(Relation r: relations) {
465 members.addAll(r.getMemberPrimitives());
466 }
467 Main.map.mapView.getEditLayer().data.setSelected(members);
468 }
469
470 protected void updateEnabledState() {
471 setEnabled(displaylist.getSelectedIndices() != null && displaylist.getSelectedIndices().length > 0);
472 }
473
474 public void valueChanged(ListSelectionEvent e) {
475 updateEnabledState();
476 }
477 }
478
479 /**
480 * The action for downloading members of all selected relations
481 *
482 */
483 class DownloadMembersAction extends AbstractAction implements ListSelectionListener{
484
485 public DownloadMembersAction() {
486 putValue(SHORT_DESCRIPTION,tr("Download all members of the selected relations"));
487 putValue(NAME, tr("Download members"));
488 putValue(SMALL_ICON, ImageProvider.get("dialogs", "downloadincomplete"));
489 putValue("help", ht("/Dialog/RelationList#DownloadMembers"));
490 updateEnabledState();
491 }
492
493 protected void updateEnabledState() {
494 setEnabled(! model.getSelectedNonNewRelations().isEmpty());
495 }
496
497 public void valueChanged(ListSelectionEvent e) {
498 updateEnabledState();
499 }
500
501 public void actionPerformed(ActionEvent e) {
502 List<Relation> relations = model.getSelectedNonNewRelations();
503 if (relations.isEmpty())
504 return;
505 Main.worker.submit(new DownloadRelationTask(
506 model.getSelectedNonNewRelations(),
507 Main.map.mapView.getEditLayer())
508 );
509 }
510 }
511
512 /**
513 * The list model for the list of relations displayed in the relation list
514 * dialog.
515 *
516 */
517 private class RelationListModel extends AbstractListModel {
518 private final ArrayList<Relation> relations = new ArrayList<Relation>();
519 private DefaultListSelectionModel selectionModel;
520
521 public RelationListModel(DefaultListSelectionModel selectionModel) {
522 this.selectionModel = selectionModel;
523 }
524
525 public Relation getRelation(int idx) {
526 return relations.get(idx);
527 }
528
529 public void sort() {
530 Collections.sort(
531 relations,
532 new Comparator<Relation>() {
533 NameFormatter formatter = DefaultNameFormatter.getInstance();
534
535 public int compare(Relation r1, Relation r2) {
536 return r1.getDisplayName(formatter).compareTo(r2.getDisplayName(formatter));
537 }
538 }
539 );
540 }
541
542 private boolean isValid(Relation r) {
543 return !r.isDeleted() && r.isVisible() && !r.isIncomplete();
544 }
545
546 public void setRelations(Collection<Relation> relations) {
547 List<Relation> sel = getSelectedRelations();
548 this.relations.clear();
549 if (relations == null) {
550 selectionModel.clearSelection();
551 fireContentsChanged(this,0,getSize());
552 return;
553
554 }
555 for (Relation r: relations) {
556 if (isValid(r)) {
557 this.relations.add(r);
558 }
559 }
560 sort();
561 fireIntervalAdded(this, 0, getSize());
562 setSelectedRelations(sel);
563 }
564
565 /**
566 * Add all relations in <code>addedPrimitives</code> to the model for the
567 * relation list dialog
568 *
569 * @param addedPrimitives the collection of added primitives. May include nodes,
570 * ways, and relations.
571 */
572 public void addRelations(Collection<? extends OsmPrimitive> addedPrimitives) {
573 boolean added = false;
574 for (OsmPrimitive p: addedPrimitives) {
575 if (! (p instanceof Relation)) {
576 continue;
577 }
578
579 Relation r = (Relation)p;
580 if (relations.contains(r)) {
581 continue;
582 }
583 if (isValid(r)) {
584 relations.add(r);
585 added = true;
586 }
587 }
588 if (added) {
589 List<Relation> sel = getSelectedRelations();
590 sort();
591 fireIntervalAdded(this, 0, getSize());
592 setSelectedRelations(sel);
593 }
594 }
595
596 /**
597 * Removes all relations in <code>removedPrimitives</code> from the model
598 *
599 * @param removedPrimitives the removed primitives. May include nodes, ways,
600 * and relations
601 */
602 public void removeRelations(Collection<? extends OsmPrimitive> removedPrimitives) {
603 if (removedPrimitives == null) return;
604 // extract the removed relations
605 //
606 Set<Relation> removedRelations = new HashSet<Relation>();
607 for (OsmPrimitive p: removedPrimitives) {
608 if (! (p instanceof Relation)) {
609 continue;
610 }
611 removedRelations.add((Relation)p);
612 }
613 if (removedRelations.isEmpty())
614 return;
615 int size = relations.size();
616 relations.removeAll(removedRelations);
617 if (size != relations.size()) {
618 List<Relation> sel = getSelectedRelations();
619 sort();
620 fireContentsChanged(this, 0, getSize());
621 setSelectedRelations(sel);
622 }
623 }
624
625 public Object getElementAt(int index) {
626 return relations.get(index);
627 }
628
629 public int getSize() {
630 return relations.size();
631 }
632
633 /**
634 * Replies the list of selected, non-new relations. Empty list,
635 * if there are no selected, non-new relations.
636 *
637 * @return the list of selected, non-new relations.
638 */
639 public List<Relation> getSelectedNonNewRelations() {
640 ArrayList<Relation> ret = new ArrayList<Relation>();
641 for (int i=0; i<getSize();i++) {
642 if (!selectionModel.isSelectedIndex(i)) {
643 continue;
644 }
645 if (relations.get(i).isNew()) {
646 continue;
647 }
648 ret.add(relations.get(i));
649 }
650 return ret;
651 }
652
653 /**
654 * Replies the list of selected relations. Empty list,
655 * if there are no selected relations.
656 *
657 * @return the list of selected, non-new relations.
658 */
659 public List<Relation> getSelectedRelations() {
660 ArrayList<Relation> ret = new ArrayList<Relation>();
661 for (int i=0; i<getSize();i++) {
662 if (!selectionModel.isSelectedIndex(i)) {
663 continue;
664 }
665 ret.add(relations.get(i));
666 }
667 return ret;
668 }
669
670 /**
671 * Sets the selected relations.
672 *
673 * @return sel the list of selected relations
674 */
675 public void setSelectedRelations(List<Relation> sel) {
676 selectionModel.clearSelection();
677 if (sel == null || sel.isEmpty())
678 return;
679 for (Relation r: sel) {
680 int i = relations.indexOf(r);
681 if (i<0) {
682 continue;
683 }
684 selectionModel.addSelectionInterval(i,i);
685 }
686 }
687
688 /**
689 * Returns the index of the relation
690 *
691 * @return index of relation (null if it cannot be found)
692 */
693 public Integer getRelationIndex(Relation rel) {
694 int i = relations.indexOf(rel);
695 if (i<0)
696 return null;
697 return i;
698 }
699
700 public void updateTitle() {
701 if (getSize() > 0) {
702 RelationListDialog.this.setTitle(tr("Relations: {0}", getSize()));
703 } else {
704 RelationListDialog.this.setTitle(tr("Relations"));
705 }
706 }
707 }
708
709 class RelationDialogPopupMenu extends JPopupMenu {
710 protected void build() {
711 // -- download members action
712 //
713 DownloadMembersAction downloadMembersAction = new DownloadMembersAction();
714 displaylist.addListSelectionListener(downloadMembersAction);
715 add(downloadMembersAction);
716
717 // -- select members action
718 //
719 SelectMembersAction selectMembersAction = new SelectMembersAction();
720 displaylist.addListSelectionListener(selectMembersAction);
721 add(selectMembersAction);
722 }
723
724 public RelationDialogPopupMenu() {
725 build();
726 }
727 }
728
729 /* ---------------------------------------------------------------------------------- */
730 /* DataSetListener */
731 /* ---------------------------------------------------------------------------------- */
732
733 public void nodeMoved(NodeMovedEvent event) {/* irrelevant in this context */}
734
735 public void wayNodesChanged(WayNodesChangedEvent event) {/* irrelevant in this context */}
736
737 public void primtivesAdded(final PrimitivesAddedEvent event) {
738 model.addRelations(event.getPrimitives());
739 model.updateTitle();
740 }
741
742 public void primtivesRemoved(final PrimitivesRemovedEvent event) {
743 model.removeRelations(event.getPrimitives());
744 model.updateTitle();
745 }
746
747 public void relationMembersChanged(final RelationMembersChangedEvent event) {
748 List<Relation> sel = model.getSelectedRelations();
749 model.sort();
750 model.setSelectedRelations(sel);
751 displaylist.repaint();
752 }
753
754 public void tagsChanged(TagsChangedEvent event) {
755 OsmPrimitive prim = event.getPrimitive();
756 if (prim == null || ! (prim instanceof Relation))
757 return;
758 // trigger a sort of the relation list because the display name may
759 // have changed
760 //
761 List<Relation> sel = model.getSelectedRelations();
762 model.sort();
763 model.setSelectedRelations(sel);
764 displaylist.repaint();
765 }
766
767 public void dataChanged(DataChangedEvent event) {
768 initFromLayer(Main.main.getEditLayer());
769 }
770
771 public void otherDatasetChange(AbstractDatasetChangedEvent event) {/* ignore */}
772}
Note: See TracBrowser for help on using the repository browser.