package com.vividsolutions.jump.workbench.ui.plugin.datastore; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import javax.swing.JInternalFrame; import javax.swing.event.InternalFrameAdapter; import javax.swing.event.InternalFrameEvent; 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.GUIUtil; import com.vividsolutions.jump.workbench.ui.LayerNameRenderer; import com.vividsolutions.jump.workbench.ui.renderer.LayerRenderer; import com.vividsolutions.jump.workbench.ui.renderer.RenderingManager; public class InstallDatastoreLayerRendererHintsPlugIn extends AbstractPlugIn { public void initialize(PlugInContext context) throws Exception { for (Iterator i = Arrays.asList( context.getWorkbenchFrame().getDesktopPane().getAllFrames()) .iterator(); i.hasNext();) { JInternalFrame internalFrame = (JInternalFrame) i.next(); installDatastoreLayerRendererHintsIfNecessary(internalFrame); } GUIUtil.addInternalFrameListener(context.getWorkbenchFrame() .getDesktopPane(), new InternalFrameAdapter() { public void internalFrameActivated(InternalFrameEvent e) { installDatastoreLayerRendererHintsIfNecessary(e .getInternalFrame()); } }); } private Collection installedLayerManagers = new HashSet(); private static final String INSTALLED_KEY = InstallDatastoreLayerRendererHintsPlugIn.class .getName() + " - INSTALLED"; private void installDatastoreLayerRendererHintsIfNecessary( JInternalFrame internalFrame) { if (!(internalFrame instanceof LayerManagerProxy)) { return; } installDatastoreLayerRendererHintsIfNecessary(((LayerManagerProxy) internalFrame) .getLayerManager()); } private void installDatastoreLayerRendererHintsIfNecessary( LayerManager layerManager) { if (installedLayerManagers.contains(layerManager)) { return; } layerManager.addLayerListener(new LayerListener() { public void featuresChanged(FeatureEvent e) { } public void layerChanged(LayerEvent e) { if (!(e.getLayerable() instanceof Layer)) { return; } if (((Layer) e.getLayerable()).getDataSourceQuery() == null) { return; } if (!(((Layer) e.getLayerable()).getDataSourceQuery() .getDataSource() instanceof DataStoreDataSource)) { return; } if (((Layer) e.getLayerable()).getBlackboard().get( INSTALLED_KEY, false)) { return; } // CachedDynamicFeatureCollection#size is not up to // date (it is cached), so force image caching to always // be used, as its use depends on #size. // [Jon Aquino 2005-03-16] ((Layer) e.getLayerable()).getBlackboard().put( LayerRenderer.ALWAYS_USE_IMAGE_CACHING_KEY, true); ((Layer) e.getLayerable()).getBlackboard().put( RenderingManager.USE_MULTI_RENDERING_THREAD_QUEUE_KEY, true); ((Layer) e.getLayerable()).getBlackboard().put( LayerNameRenderer.USE_CLOCK_ANIMATION_KEY, true); ((Layer) e.getLayerable()).getBlackboard().put(INSTALLED_KEY, true); // Get here *after* the first paint, so repaint. // [Jon Aquino 2005-03-16] ((Layer) e.getLayerable()).fireAppearanceChanged(); } public void categoryChanged(CategoryEvent e) { } }); installedLayerManagers.add(layerManager); } }