package org.openjump.core.ui.plugin.datastore; import com.vividsolutions.jump.coordsys.CoordinateSystemRegistry; import com.vividsolutions.jump.I18N; import com.vividsolutions.jump.task.TaskMonitor; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.model.Layerable; import com.vividsolutions.jump.workbench.plugin.EnableCheck; import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory; import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck; import com.vividsolutions.jump.workbench.plugin.PlugInContext; import com.vividsolutions.jump.workbench.plugin.ThreadedBasePlugIn; import com.vividsolutions.jump.workbench.ui.MenuNames; import com.vividsolutions.jump.workbench.ui.plugin.datastore.DataStoreQueryDataSource; import com.vividsolutions.jump.workbench.ui.plugin.FeatureInstaller; import com.vividsolutions.jump.workbench.ui.plugin.OpenProjectPlugIn; import com.vividsolutions.jump.workbench.WorkbenchContext; import javax.swing.ImageIcon; import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; import org.openjump.core.ui.images.IconLoader; /** * <code>RefreshDatastoreQueryPlugIn</code> runs the query associated * to this layer and replace the dataset. * * @author <a href="mailto:michael.michaud@free.fr">Micha�l Michaud</a> */ public class RefreshDataStoreQueryPlugIn extends ThreadedBasePlugIn { public static final ImageIcon ICON = IconLoader.icon("arrow_refresh_sql.png"); @Override public void initialize(PlugInContext context) throws Exception { WorkbenchContext workbenchContext = context.getWorkbenchContext(); EnableCheck enableCheck = createEnableCheck(workbenchContext); FeatureInstaller installer = new FeatureInstaller(workbenchContext); JPopupMenu popupMenu = workbenchContext.getWorkbench().getFrame() .getLayerNamePopupMenu(); installer.addPopupMenuItem(popupMenu, this, new String[]{MenuNames.DATASTORE}, getName(), false, ICON, enableCheck); } @Override public String getName() { return I18N.get("org.openjump.core.ui.plugin.datastore.RefreshDataStoreQueryPlugIn.Refresh-datastore-query"); } @Override public boolean execute(PlugInContext context) throws Exception { return true; } public void run(TaskMonitor monitor, final PlugInContext context) throws Exception { Layer[] selectedLayers = context.getSelectedLayers(); for (final Layer layer : selectedLayers) { OpenProjectPlugIn.load(layer, CoordinateSystemRegistry.instance(context.getWorkbenchContext().getBlackboard()), monitor); // setFeatureCollectionModified(false) must be set after fireFeaturesChanged // As in Layer.setFeatureCollection method, fireFeaturesChanged is // called in an invokeLater thread, setFeatureCollectionModified // must also be called in an invokeLater clause. SwingUtilities.invokeLater(new Runnable() { public void run() {layer.setFeatureCollectionModified(false);} }); } } /** * Creates an EnableCheck object to enable the plugin if a project is active * and if only layers connected to a DataStoreQueryDataSource are selected. * @param workbenchContext * @return an enable check */ public EnableCheck createEnableCheck(WorkbenchContext workbenchContext) { final WorkbenchContext wc = workbenchContext; EnableCheckFactory enableCheckFactory = new EnableCheckFactory(workbenchContext); MultiEnableCheck enableCheck = new MultiEnableCheck(); enableCheck.add(enableCheckFactory.createWindowWithLayerManagerMustBeActiveCheck()); enableCheck.add(enableCheckFactory.createAtLeastNLayerablesMustBeSelectedCheck(1, Layerable.class)); enableCheck.add(new EnableCheck(){ public String check(javax.swing.JComponent component) { Layer[] selectedLayers = wc.getLayerNamePanel().getSelectedLayers(); for (Layer layer : selectedLayers) { if (layer.getDataSourceQuery() == null || !(layer.getDataSourceQuery().getDataSource() instanceof DataStoreQueryDataSource)) { return I18N.get("org.openjump.core.ui.plugin.datastore.RefreshDataStoreQueryPlugIn.Only-datastore-query-layers-must-be-selected"); } } return null; } }); return enableCheck; } }