// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.dialogs.relation; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.swing.table.AbstractTableModel; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.SelectionChangedListener; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent; import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener; import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent; import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent; import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent; import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener; import org.openstreetmap.josm.gui.layer.OsmDataLayer; import org.openstreetmap.josm.tools.CheckParameterUtil; public class SelectionTableModel extends AbstractTableModel implements SelectionChangedListener, ActiveLayerChangeListener, LayerChangeListener { /** this selection table model only displays selected primitives in this layer */ private final transient OsmDataLayer layer; private final transient List<OsmPrimitive> cache; /** * constructor * * @param layer the data layer. Must not be null. * @throws IllegalArgumentException if layer is null */ public SelectionTableModel(OsmDataLayer layer) { CheckParameterUtil.ensureParameterNotNull(layer, "layer"); this.layer = layer; cache = new ArrayList<>(); populateSelectedPrimitives(layer); } /** * Registers listeners (selection change and layer change). */ public void register() { DataSet.addSelectionListener(this); Main.getLayerManager().addActiveLayerChangeListener(this); } /** * Unregisters listeners (selection change and layer change). */ public void unregister() { DataSet.removeSelectionListener(this); Main.getLayerManager().removeActiveLayerChangeListener(this); } @Override public int getColumnCount() { return 1; } @Override public int getRowCount() { if (Main.getLayerManager().getEditLayer() != layer) return 0; return cache.size(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { return cache.get(rowIndex); } @Override public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) { if (e.getPreviousActiveLayer() == layer) { cache.clear(); } if (e.getSource().getActiveLayer() == layer) { cache.addAll(layer.data.getAllSelected()); } fireTableDataChanged(); } @Override public void layerAdded(LayerAddEvent e) { // do nothing } @Override public void layerRemoving(LayerRemoveEvent e) { if (e.getRemovedLayer() == layer) { unregister(); } this.cache.clear(); fireTableDataChanged(); } @Override public void layerOrderChanged(LayerOrderChangeEvent e) { // do nothing } @Override public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) { if (layer == Main.getLayerManager().getEditLayer()) { cache.clear(); cache.addAll(newSelection); } else { cache.clear(); } fireTableDataChanged(); } public List<OsmPrimitive> getSelection() { return cache; } /** * populates the model with the primitives currently selected in * <code>layer</code> * * @param layer the data layer */ protected void populateSelectedPrimitives(OsmDataLayer layer) { selectionChanged(layer.data.getAllSelected()); } /** * Replies the primitive at row <code>row</code> in this model * * @param row the row * @return the primitive at row <code>row</code> in this model * @throws ArrayIndexOutOfBoundsException if index is invalid */ public OsmPrimitive getPrimitive(int row) { return cache.get(row); } }