package com.vividsolutions.jump.workbench.ui;
import com.vividsolutions.jump.workbench.WorkbenchContext;
import com.vividsolutions.jump.workbench.model.*;
import com.vividsolutions.jump.workbench.ui.plugin.AddNewLayerPlugIn;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.util.Iterator;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
/**
* Stays in sync with the LayerManager.
*/
public class LayerComboBox extends JComboBox {
//For the layer name, use " " rather than "" so that the renderer is sized normally.
//See comments in #updateModel. [Jon Aquino]
private static final Layer DUMMY_LAYER = new Layer(" ",
new Color(0, 0, 0, 0),
AddNewLayerPlugIn.createBlankFeatureCollection(), new LayerManager());
private LayerManager layerManager = new LayerManager();
public Object getSelectedItem() {
return (super.getSelectedItem() != DUMMY_LAYER)
? super.getSelectedItem() : null;
}
private LayerListener listener = new LayerListener() {
public void featuresChanged(FeatureEvent e) {
}
public void layerChanged(LayerEvent e) {
updateModel();
}
public void categoryChanged(CategoryEvent e) {
}
};
public LayerComboBox() {
super(new DefaultComboBoxModel());
setRenderer(new LayerNameRenderer());
}
private DefaultComboBoxModel getMyModel() {
return (DefaultComboBoxModel) getModel();
}
private void updateModel() {
Layer selectedLayer = getSelectedLayer();
getMyModel().removeAllElements();
for (Iterator i = layerManager.iterator(); i.hasNext();) {
Layer layer = (Layer) i.next();
getMyModel().addElement(layer);
}
if (getMyModel().getSize() == 0) {
//Don't leave the combobox empty -- an empty combobox is rendered a few
//pixels larger than a non-empty one. If it is in a packed frame's GridBagLayout,
//the GridBagLayout will collapse all components to minimum size
//(see Java bug 4247013). [Jon Aquino]
getMyModel().addElement(DUMMY_LAYER);
}
if (-1 != getMyModel().getIndexOf(selectedLayer)) {
getMyModel().setSelectedItem(selectedLayer);
}
}
public Layer getSelectedLayer() {
return (Layer) getSelectedItem();
}
public void setLayerManager(LayerManager layerManager) {
this.layerManager.removeLayerListener(listener);
this.layerManager = layerManager;
this.layerManager.addLayerListener(listener);
updateModel();
}
public LayerManager getLayerManager() {
return layerManager;
}
public void setSelectedLayer(Layer candidateLayer) {
setSelectedItem(candidateLayer);
}
}