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 }