/*****************************************************
* created: 07.12.2004
* last modified:
*
* description:
* Merges two selected polygons if they intersect each other in more than one point.
* The first feature in the selection gets the new geometry while the second feature is deleted.
*****************************************************/
package org.openjump.core.ui.plugin.tools;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import org.openjump.core.apitools.FeatureCollectionTools;
import org.openjump.core.apitools.LayerTools;
import org.openjump.core.geomutils.algorithm.PolygonMerge;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jump.I18N;
import com.vividsolutions.jump.feature.Feature;
import com.vividsolutions.jump.workbench.WorkbenchContext;
import com.vividsolutions.jump.workbench.model.Layer;
import com.vividsolutions.jump.workbench.plugin.AbstractPlugIn;
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.ui.EditTransaction;
import com.vividsolutions.jump.workbench.ui.MenuNames;
import com.vividsolutions.jump.workbench.ui.plugin.FeatureInstaller;
/**
* @author sstein
*
**/
public class MergeTwoSelectedPolygonsPlugIn extends AbstractPlugIn{
private String sMergeTwoPolys = I18N.get("org.openjump.core.ui.plugin.tools.MergeTwoSelectedPolygonsPlugIn.Merge-Two-Polygons");
//private String sMergeTwoPolys = "MergeTwoPolygons";
public void initialize(PlugInContext context) throws Exception {
FeatureInstaller featureInstaller = new FeatureInstaller(context.getWorkbenchContext());
featureInstaller.addMainMenuItem(
this, //exe
new String[] {MenuNames.TOOLS, MenuNames.TOOLS_EDIT_GEOMETRY}, //menu path
this.getName(), //name methode .getName recieved by AbstractPlugIn
false, //checkbox
null, //icon
createEnableCheck(context.getWorkbenchContext())); //enable check
}
public String getName() {
return sMergeTwoPolys;
}
public static MultiEnableCheck createEnableCheck(WorkbenchContext workbenchContext) {
EnableCheckFactory checkFactory = new EnableCheckFactory(workbenchContext);
return new MultiEnableCheck()
.add(checkFactory.createWindowWithLayerNamePanelMustBeActiveCheck())
.add(checkFactory.createSelectedLayersMustBeEditableCheck())
.add(checkFactory.createAtLeastNItemsMustBeSelectedCheck(2));
}
public boolean execute(PlugInContext context) throws Exception{
Collection features = context.getWorkbenchContext().getLayerViewPanel().getSelectionManager().getFeaturesWithSelectedItems();
if (features.size() == 2){
Iterator iter = features.iterator();
Feature f1 = (Feature)iter.next();
Feature f2 = (Feature)iter.next();
PolygonMerge merge = new PolygonMerge(f1.getGeometry(), f2.getGeometry());
if(merge.isMergeSuccesfull()==1){
//-- merge using an edit transaction to enable undo
ArrayList fToEdit = new ArrayList();
fToEdit.add(f1);
Map layer2FeatList = LayerTools.getLayer2FeatureMap(fToEdit, context);
Layer[] layersWithFeatures = (Layer[])layer2FeatList.keySet().toArray(new Layer[0]);
EditTransaction edtr = new EditTransaction(fToEdit,"setgeom",layersWithFeatures[0],true,false,context.getLayerViewPanel());
Geometry g = merge.getOutPolygon();
//f1.setGeometry(g);
edtr.setGeometry(f1,g);
edtr.commit();
edtr.clearEnvelopeCaches();
//-- delete other feature
ArrayList fToDelete = new ArrayList();
fToDelete.add(f2);
FeatureCollectionTools.deleteFeatures(fToDelete,context);
}
}
else{
context.getWorkbenchFrame().warnUser("more than 2 objects selected");
}
//context.getWorkbenchContext().getLayerViewPanel().getSelectionManager().clear();
return true;
}
}