/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.plugin.editing.gwt.example.client.merge;
import org.geomajas.geometry.Geometry;
import org.geomajas.gwt.client.gfx.paintable.GfxGeometry;
import org.geomajas.gwt.client.gfx.style.ShapeStyle;
import org.geomajas.gwt.client.map.event.FeatureDeselectedEvent;
import org.geomajas.gwt.client.map.event.FeatureSelectedEvent;
import org.geomajas.gwt.client.map.event.FeatureSelectionHandler;
import org.geomajas.gwt.client.util.GeometryConverter;
import org.geomajas.gwt.client.widget.MapWidget;
import org.geomajas.plugin.editing.client.GeometryFunction;
import org.geomajas.plugin.editing.client.merge.GeometryMergeException;
import org.geomajas.plugin.editing.client.merge.GeometryMergeService;
import org.geomajas.plugin.editing.client.merge.event.GeometryMergeAddedEvent;
import org.geomajas.plugin.editing.client.merge.event.GeometryMergeAddedHandler;
import org.geomajas.plugin.editing.client.merge.event.GeometryMergeRemovedEvent;
import org.geomajas.plugin.editing.client.merge.event.GeometryMergeRemovedHandler;
import org.geomajas.plugin.editing.client.merge.event.GeometryMergeStartEvent;
import org.geomajas.plugin.editing.client.merge.event.GeometryMergeStartHandler;
import org.geomajas.plugin.editing.client.merge.event.GeometryMergeStopEvent;
import org.geomajas.plugin.editing.client.merge.event.GeometryMergeStopHandler;
import com.google.gwt.user.client.Window;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.toolbar.ToolStripButton;
/**
* Toolbar button for adding inner rings to a polygon.
*
* @author Pieter De Graef
*/
public class ExecuteMergeButton extends ToolStripButton implements GeometryMergeStartHandler,
GeometryMergeStopHandler, GeometryMergeAddedHandler, GeometryMergeRemovedHandler {
private final MapWidget mapWidget;
private GfxGeometry gfx;
private int count;
public ExecuteMergeButton(final MapWidget mapWidget, final GeometryMergeService service) {
this.mapWidget = mapWidget;
setDisabled(true);
setTitle("Merge selection");
setTooltip("Merge the selected countries!");
setIcon("[ISOMORPHIC]/geomajas/osgeo/merge.png");
addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
try {
service.stop(new GeometryFunction() {
public void execute(Geometry geometry) {
mapWidget.getMapModel().clearSelectedFeatures();
gfx = new GfxGeometry("merged", GeometryConverter.toGwt(geometry), new ShapeStyle(
"#CC0000", .9f, "#660000", 1.0f, 3));
mapWidget.registerWorldPaintable(gfx);
}
});
} catch (GeometryMergeException e) {
Window.alert(e.getMessage());
}
}
});
service.addGeometryMergeStartHandler(this);
service.addGeometryMergeStopHandler(this);
service.addGeometryMergeAddedHandler(this);
service.addGeometryMergeRemovedHandler(this);
mapWidget.getMapModel().addFeatureSelectionHandler(new FeatureSelectionHandler() {
public void onFeatureSelected(FeatureSelectedEvent event) {
}
public void onFeatureDeselected(FeatureDeselectedEvent event) {
}
});
}
// ------------------------------------------------------------------------
// Handler implementation:
// ------------------------------------------------------------------------
public void onGeometryMergingStop(GeometryMergeStopEvent event) {
setDisabled(true);
}
public void onGeometryMergingStart(GeometryMergeStartEvent event) {
count = 0;
mapWidget.unregisterWorldPaintable(gfx);
gfx = null;
}
public void onGeometryMergingRemoved(GeometryMergeRemovedEvent event) {
count--;
if (count < 2) {
setDisabled(true);
}
}
public void onGeometryMergingAdded(GeometryMergeAddedEvent event) {
count++;
if (count >= 2) {
setDisabled(false);
}
}
}