package org.openjump.core.ccordsys.srid;
import java.awt.event.ContainerAdapter;
import java.awt.event.ContainerEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import javax.swing.JInternalFrame;
import com.vividsolutions.jump.feature.Feature;
import com.vividsolutions.jump.util.Block;
import com.vividsolutions.jump.workbench.model.CategoryEvent;
import com.vividsolutions.jump.workbench.model.FeatureEvent;
import com.vividsolutions.jump.workbench.model.Layer;
import com.vividsolutions.jump.workbench.model.LayerEvent;
import com.vividsolutions.jump.workbench.model.LayerListener;
import com.vividsolutions.jump.workbench.model.LayerManager;
import com.vividsolutions.jump.workbench.model.LayerManagerProxy;
import com.vividsolutions.jump.workbench.plugin.AbstractPlugIn;
import com.vividsolutions.jump.workbench.plugin.PlugInContext;
import com.vividsolutions.jump.workbench.ui.WorkbenchFrame;
/**
* Adds the SRIDStyle to every layer that JUMP encounters.
*/
public class EnsureAllLayersHaveSRIDStylePlugIn extends AbstractPlugIn {
public void initialize(PlugInContext context) throws Exception {
initializeCurrentAndFutureInternalFrames(context.getWorkbenchFrame(),
new Block() {
private Collection initializedFrames = new ArrayList();
public Object yield(Object internalFrame) {
if (!initializedFrames.contains(internalFrame)) {
initialize((JInternalFrame) internalFrame);
initializedFrames.add(internalFrame);
}
return null;
}
});
}
private void initialize(JInternalFrame internalFrame) {
if (!(internalFrame instanceof LayerManagerProxy)) {
return;
}
initialize(((LayerManagerProxy) internalFrame).getLayerManager());
}
private void initialize(LayerManager layerManager) {
for (Iterator i = layerManager.iterator(); i.hasNext();) {
Layer layer = (Layer) i.next();
ensureHasSRIDStyle(layer);
}
layerManager.addLayerListener(new LayerListener() {
public void featuresChanged(FeatureEvent e) {
}
public void layerChanged(LayerEvent e) {
if (e.getLayerable() instanceof Layer) {
ensureHasSRIDStyle((Layer) e.getLayerable());
}
}
public void categoryChanged(CategoryEvent e) {
}
});
}
private void ensureHasSRIDStyle(Layer layer) {
if (layer.getStyle(SRIDStyle.class) != null) {
return;
}
SRIDStyle sridStyle = new SRIDStyle();
if (layer.getFeatureCollectionWrapper().size() > 0) {
sridStyle.setSRID(((Feature) layer.getFeatureCollectionWrapper()
.iterator().next()).getGeometry().getSRID());
}
layer.addStyle(sridStyle);
}
private void initializeCurrentAndFutureInternalFrames(
WorkbenchFrame workbenchFrame, final Block block) {
workbenchFrame.getDesktopPane().addContainerListener(
new ContainerAdapter() {
public void componentAdded(ContainerEvent e) {
if (!(e.getChild() instanceof JInternalFrame)) {
return;
}
block.yield((JInternalFrame) e.getChild());
}
});
for (Iterator i = Arrays.asList(workbenchFrame.getInternalFrames())
.iterator(); i.hasNext();) {
JInternalFrame internalFrame = (JInternalFrame) i.next();
block.yield(internalFrame);
}
}
}