source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java

Last change on this file was 15803, checked in by Don-vip, 4 years ago

fix #18646 - avoid doubled selection in relation editor when switching active layer

  • Property svn:eol-style set to native
File size: 4.6 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs.relation;
3import java.util.ArrayList;
4import java.util.Collection;
5import java.util.List;
6
7import javax.swing.table.AbstractTableModel;
8
9import org.openstreetmap.josm.data.osm.DataSelectionListener;
10import org.openstreetmap.josm.data.osm.OsmPrimitive;
11import org.openstreetmap.josm.data.osm.event.SelectionEventManager;
12import org.openstreetmap.josm.gui.MainApplication;
13import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
14import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
15import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
16import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
17import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
18import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
19import org.openstreetmap.josm.gui.layer.OsmDataLayer;
20import org.openstreetmap.josm.tools.CheckParameterUtil;
21
22/**
23 * This table shows the primitives that are currently selected in the main OSM view.
24 * @since 1790
25 */
26public class SelectionTableModel extends AbstractTableModel implements DataSelectionListener, ActiveLayerChangeListener, LayerChangeListener {
27
28 /** this selection table model only displays selected primitives in this layer */
29 private final transient OsmDataLayer layer;
30 private final transient List<OsmPrimitive> cache;
31
32 /**
33 * Creates a new {@link SelectionTableModel} for a given layer
34 *
35 * @param layer the data layer. Must not be null.
36 * @throws IllegalArgumentException if layer is null
37 */
38 public SelectionTableModel(OsmDataLayer layer) {
39 CheckParameterUtil.ensureParameterNotNull(layer, "layer");
40 this.layer = layer;
41 cache = new ArrayList<>();
42 populateSelectedPrimitives(layer);
43 }
44
45 /**
46 * Registers listeners (selection change and layer change).
47 */
48 public void register() {
49 SelectionEventManager.getInstance().addSelectionListener(this);
50 MainApplication.getLayerManager().addActiveLayerChangeListener(this);
51 }
52
53 /**
54 * Unregisters listeners (selection change and layer change).
55 */
56 public void unregister() {
57 SelectionEventManager.getInstance().removeSelectionListener(this);
58 MainApplication.getLayerManager().removeActiveLayerChangeListener(this);
59 }
60
61 @Override
62 public int getColumnCount() {
63 return 1;
64 }
65
66 @Override
67 public int getRowCount() {
68 if (MainApplication.getLayerManager().getEditLayer() != layer)
69 return 0;
70 return cache.size();
71 }
72
73 @Override
74 public Object getValueAt(int rowIndex, int columnIndex) {
75 return cache.get(rowIndex);
76 }
77
78 @Override
79 public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
80 if (e.getPreviousActiveLayer() == layer) {
81 cache.clear();
82 }
83 fireTableDataChanged();
84 }
85
86 @Override
87 public void layerAdded(LayerAddEvent e) {
88 // do nothing
89 }
90
91 @Override
92 public void layerRemoving(LayerRemoveEvent e) {
93 if (e.getRemovedLayer() == layer) {
94 unregister();
95 }
96 this.cache.clear();
97 fireTableDataChanged();
98 }
99
100 @Override
101 public void layerOrderChanged(LayerOrderChangeEvent e) {
102 // do nothing
103 }
104
105 @Override
106 public void selectionChanged(SelectionChangeEvent event) {
107 selectionChanged(event.getSelection());
108 }
109
110 private void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
111 if (layer == MainApplication.getLayerManager().getActiveDataLayer()) {
112 cache.clear();
113 cache.addAll(newSelection);
114 } else {
115 cache.clear();
116 }
117 fireTableDataChanged();
118 }
119
120 /**
121 * Returns the selected primitives.
122 * @return the selected primitives
123 */
124 public List<OsmPrimitive> getSelection() {
125 return cache;
126 }
127
128 /**
129 * populates the model with the primitives currently selected in
130 * <code>layer</code>
131 *
132 * @param layer the data layer
133 */
134 protected void populateSelectedPrimitives(OsmDataLayer layer) {
135 selectionChanged(layer.data.getAllSelected());
136 }
137
138 /**
139 * Replies the primitive at row <code>row</code> in this model
140 *
141 * @param row the row
142 * @return the primitive at row <code>row</code> in this model
143 * @throws ArrayIndexOutOfBoundsException if index is invalid
144 */
145 public OsmPrimitive getPrimitive(int row) {
146 return cache.get(row);
147 }
148
149}
Note: See TracBrowser for help on using the repository browser.