// 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.MapView;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.tools.CheckParameterUtil;
public class SelectionTableModel extends AbstractTableModel implements SelectionChangedListener, MapView.LayerChangeListener{
/** this selection table model only displays selected primitives in this layer */
private OsmDataLayer layer;
private ArrayList<OsmPrimitive> cache;
/**
* constructor
*
* @param layer the data layer. Must not be null.
* @exception IllegalArgumentException thrown if layer is null
*/
public SelectionTableModel(OsmDataLayer layer) throws IllegalArgumentException {
CheckParameterUtil.ensureParameterNotNull(layer, "layer");
this.layer = layer;
cache = new ArrayList<OsmPrimitive>();
populateSelectedPrimitives(layer);
}
public void register() {
DataSet.selListeners.add(this);
MapView.addLayerChangeListener(this);
}
public void unregister() {
DataSet.selListeners.remove(this);
MapView.removeLayerChangeListener(this);
}
public int getColumnCount() {
return 1;
}
public int getRowCount() {
if (Main.map.mapView.getEditLayer() != layer)
return 0;
return cache.size();
}
public Object getValueAt(int rowIndex, int columnIndex) {
return cache.get(rowIndex);
}
public void activeLayerChange(Layer oldLayer, Layer newLayer) {
if (oldLayer == layer) {
cache.clear();
}
if (newLayer == layer) {
cache.addAll(((OsmDataLayer)newLayer).data.getSelected());
}
fireTableDataChanged();
}
public void layerAdded(Layer newLayer) {
// do nothing
}
public void layerRemoved(Layer oldLayer) {
if (oldLayer == layer) {
unregister();
}
this.cache.clear();
fireTableDataChanged();
}
public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
if (layer == Main.map.mapView.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.getSelected());
}
/**
* 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
*/
public OsmPrimitive getPrimitive(int row) {
return cache.get(row);
}
}