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    }