001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.gui.dialogs.relation;
003 import java.util.ArrayList;
004 import java.util.Collection;
005 import java.util.List;
006
007 import javax.swing.table.AbstractTableModel;
008
009 import org.openstreetmap.josm.Main;
010 import org.openstreetmap.josm.data.SelectionChangedListener;
011 import org.openstreetmap.josm.data.osm.DataSet;
012 import org.openstreetmap.josm.data.osm.OsmPrimitive;
013 import org.openstreetmap.josm.gui.MapView;
014 import org.openstreetmap.josm.gui.layer.Layer;
015 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
016 import org.openstreetmap.josm.tools.CheckParameterUtil;
017
018 public class SelectionTableModel extends AbstractTableModel implements SelectionChangedListener, MapView.LayerChangeListener{
019
020 /** this selection table model only displays selected primitives in this layer */
021 private OsmDataLayer layer;
022 private ArrayList<OsmPrimitive> cache;
023
024 /**
025 * constructor
026 *
027 * @param layer the data layer. Must not be null.
028 * @exception IllegalArgumentException thrown if layer is null
029 */
030 public SelectionTableModel(OsmDataLayer layer) throws IllegalArgumentException {
031 CheckParameterUtil.ensureParameterNotNull(layer, "layer");
032 this.layer = layer;
033 cache = new ArrayList<OsmPrimitive>();
034 populateSelectedPrimitives(layer);
035 }
036
037 public void register() {
038 DataSet.addSelectionListener(this);
039 MapView.addLayerChangeListener(this);
040 }
041
042 public void unregister() {
043 DataSet.removeSelectionListener(this);
044 MapView.removeLayerChangeListener(this);
045 }
046
047 public int getColumnCount() {
048 return 1;
049 }
050
051 public int getRowCount() {
052 if (Main.map.mapView.getEditLayer() != layer)
053 return 0;
054 return cache.size();
055 }
056
057 public Object getValueAt(int rowIndex, int columnIndex) {
058 return cache.get(rowIndex);
059 }
060
061 public void activeLayerChange(Layer oldLayer, Layer newLayer) {
062 if (oldLayer == layer) {
063 cache.clear();
064 }
065 if (newLayer == layer) {
066 cache.addAll(((OsmDataLayer)newLayer).data.getAllSelected());
067 }
068 fireTableDataChanged();
069 }
070
071 public void layerAdded(Layer newLayer) {
072 // do nothing
073 }
074
075 public void layerRemoved(Layer oldLayer) {
076 if (oldLayer == layer) {
077 unregister();
078 }
079 this.cache.clear();
080 fireTableDataChanged();
081 }
082
083 public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
084 if (layer == Main.map.mapView.getEditLayer()) {
085 cache.clear();
086 cache.addAll(newSelection);
087 } else {
088 cache.clear();
089 }
090 fireTableDataChanged();
091 }
092
093 public List<OsmPrimitive> getSelection() {
094 return cache;
095 }
096
097 /**
098 * populates the model with the primitives currently selected in
099 * <code>layer</code>
100 *
101 * @param layer the data layer
102 */
103 protected void populateSelectedPrimitives(OsmDataLayer layer) {
104 selectionChanged(layer.data.getAllSelected());
105 }
106
107 /**
108 * Replies the primitive at row <code>row</code> in this model
109 *
110 * @param row the row
111 * @return the primitive at row <code>row</code> in this model
112 */
113 public OsmPrimitive getPrimitive(int row) {
114 return cache.get(row);
115 }
116 }