001: package org.openjump.core.ccordsys.srid;
002:
003: import java.awt.event.ContainerAdapter;
004: import java.awt.event.ContainerEvent;
005: import java.util.ArrayList;
006: import java.util.Arrays;
007: import java.util.Collection;
008: import java.util.Iterator;
009:
010: import javax.swing.JInternalFrame;
011:
012: import com.vividsolutions.jump.feature.Feature;
013: import com.vividsolutions.jump.util.Block;
014: import com.vividsolutions.jump.workbench.model.CategoryEvent;
015: import com.vividsolutions.jump.workbench.model.FeatureEvent;
016: import com.vividsolutions.jump.workbench.model.Layer;
017: import com.vividsolutions.jump.workbench.model.LayerEvent;
018: import com.vividsolutions.jump.workbench.model.LayerListener;
019: import com.vividsolutions.jump.workbench.model.LayerManager;
020: import com.vividsolutions.jump.workbench.model.LayerManagerProxy;
021: import com.vividsolutions.jump.workbench.plugin.AbstractPlugIn;
022: import com.vividsolutions.jump.workbench.plugin.PlugInContext;
023: import com.vividsolutions.jump.workbench.ui.WorkbenchFrame;
024:
025: /**
026: * Adds the SRIDStyle to every layer that JUMP encounters.
027: */
028: public class EnsureAllLayersHaveSRIDStylePlugIn extends AbstractPlugIn {
029: public void initialize(PlugInContext context) throws Exception {
030: initializeCurrentAndFutureInternalFrames(context
031: .getWorkbenchFrame(), new Block() {
032: private Collection initializedFrames = new ArrayList();
033:
034: public Object yield(Object internalFrame) {
035: if (!initializedFrames.contains(internalFrame)) {
036: initialize((JInternalFrame) internalFrame);
037: initializedFrames.add(internalFrame);
038: }
039: return null;
040: }
041: });
042: }
043:
044: private void initialize(JInternalFrame internalFrame) {
045: if (!(internalFrame instanceof LayerManagerProxy)) {
046: return;
047: }
048: initialize(((LayerManagerProxy) internalFrame)
049: .getLayerManager());
050: }
051:
052: private void initialize(LayerManager layerManager) {
053: for (Iterator i = layerManager.iterator(); i.hasNext();) {
054: Layer layer = (Layer) i.next();
055: ensureHasSRIDStyle(layer);
056: }
057: layerManager.addLayerListener(new LayerListener() {
058: public void featuresChanged(FeatureEvent e) {
059: }
060:
061: public void layerChanged(LayerEvent e) {
062: if (e.getLayerable() instanceof Layer) {
063: ensureHasSRIDStyle((Layer) e.getLayerable());
064: }
065: }
066:
067: public void categoryChanged(CategoryEvent e) {
068: }
069: });
070: }
071:
072: private void ensureHasSRIDStyle(Layer layer) {
073: if (layer.getStyle(SRIDStyle.class) != null) {
074: return;
075: }
076: SRIDStyle sridStyle = new SRIDStyle();
077: if (layer.getFeatureCollectionWrapper().size() > 0) {
078: sridStyle.setSRID(((Feature) layer
079: .getFeatureCollectionWrapper().iterator().next())
080: .getGeometry().getSRID());
081: }
082: layer.addStyle(sridStyle);
083: }
084:
085: private void initializeCurrentAndFutureInternalFrames(
086: WorkbenchFrame workbenchFrame, final Block block) {
087: workbenchFrame.getDesktopPane().addContainerListener(
088: new ContainerAdapter() {
089: public void componentAdded(ContainerEvent e) {
090: if (!(e.getChild() instanceof JInternalFrame)) {
091: return;
092: }
093: block.yield((JInternalFrame) e.getChild());
094: }
095: });
096: for (Iterator i = Arrays.asList(
097: workbenchFrame.getInternalFrames()).iterator(); i
098: .hasNext();) {
099: JInternalFrame internalFrame = (JInternalFrame) i.next();
100: block.yield(internalFrame);
101: }
102: }
103: }
|