package com.revolsys.swing.map.list; import java.beans.IndexedPropertyChangeEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.AbstractListModel; import com.revolsys.swing.field.BaseComboBoxModel; import com.revolsys.swing.map.layer.Layer; import com.revolsys.swing.map.layer.LayerGroup; import com.revolsys.swing.map.layer.NullLayer; import com.revolsys.util.Property; import com.revolsys.util.Reorderable; public class LayerGroupListModel extends AbstractListModel<Layer> implements BaseComboBoxModel<Layer>, Reorderable, PropertyChangeListener { private static final long serialVersionUID = 1L; private final boolean allowNull; private final LayerGroup group; private Layer selectedItem; public LayerGroupListModel(final LayerGroup group) { this(group, false); } public LayerGroupListModel(final LayerGroup group, final boolean allowNull) { this.group = group; Property.addListener(group, this); this.allowNull = allowNull; } @Override public Layer getElementAt(int index) { if (this.allowNull) { if (index == 0) { return NullLayer.INSTANCE; } index--; } return this.group.getLayer(index); } @Override public Object getSelectedItem() { return this.selectedItem; } @Override public int getSize() { int size = this.group.getLayerCount(); if (this.allowNull) { size++; } return size; } @Override public void propertyChange(final PropertyChangeEvent event) { if (event.getSource() == this.group) { final String propertyName = event.getPropertyName(); if (propertyName.equals("layers")) { final Object oldValue = event.getOldValue(); final Object newValue = event.getNewValue(); if (event instanceof IndexedPropertyChangeEvent) { final IndexedPropertyChangeEvent indexedEvent = (IndexedPropertyChangeEvent)event; final int index = indexedEvent.getIndex(); if (oldValue == null) { if (newValue != null) { fireIntervalAdded(this.group, index, index); } } if (newValue == null) { fireIntervalRemoved(this.group, index, index); } else { fireContentsChanged(this.group, index, index); } } } } } @Override public void reorder(final int fromIndex, int toIndex) { if (fromIndex < toIndex) { toIndex--; } final Layer layer = getElementAt(fromIndex); this.group.removeLayer(fromIndex); this.group.addLayer(toIndex, layer); } @Override public void setSelectedItem(final Object selectedItem) { if (selectedItem instanceof Layer) { final Layer layer = (Layer)selectedItem; if (this.selectedItem != layer) { this.selectedItem = layer; final int index = this.group.indexOf(layer); fireContentsChanged(layer, index, index); } } } }