/*
* 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.split;
import org.geomajas.gwt.client.controller.GraphicsController;
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.map.feature.Feature;
import org.geomajas.gwt.client.util.GeometryConverter;
import org.geomajas.gwt.client.widget.MapWidget;
import org.geomajas.plugin.editing.client.split.GeometrySplitService;
import org.geomajas.plugin.editing.client.split.event.GeometrySplitStartEvent;
import org.geomajas.plugin.editing.client.split.event.GeometrySplitStartHandler;
import org.geomajas.plugin.editing.client.split.event.GeometrySplitStopEvent;
import org.geomajas.plugin.editing.client.split.event.GeometrySplitStopHandler;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.Label;
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 SplitCountryButton extends ToolStripButton implements FeatureSelectionHandler, GeometrySplitStartHandler,
GeometrySplitStopHandler {
private final MapWidget mapWidget;
private final GeometrySplitService service;
private GraphicsController previousController;
private Label label;
public SplitCountryButton(final GeometrySplitService service, final MapWidget mapWidget) {
this.service = service;
this.mapWidget = mapWidget;
setHoverWidth(300);
setTitle("Start splitting process");
setTooltip("Select a country on the map. Then draw a splitting line.");
setIconSize(24);
setHeight(32);
addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
previousController = mapWidget.getController();
mapWidget.setController(new SelectForSplitController(mapWidget));
}
});
mapWidget.getMapModel().addFeatureSelectionHandler(this);
service.addGeometrySplitStartHandler(this);
service.addGeometrySplitStopHandler(this);
}
// ------------------------------------------------------------------------
// FeatureSelectionHandler:
// ------------------------------------------------------------------------
public void onFeatureSelected(FeatureSelectedEvent event) {
Feature feature = event.getFeature();
mapWidget.setController(previousController);
previousController = null;
service.start(GeometryConverter.toDto(feature.getGeometry()));
// Now let the user know:
if (label != null) {
label.destroy();
label = null;
}
label = new Label("<p><b>You have selected " + feature.getLabel() + "!</b></p><p>Now continue by drawing a "
+ "splitting line on the map. This is done by clicking points on the map, ending with a double " +
"click.</p><p>Finally choose an option in the toolbar (finish, cancel, undo, ...).</p>");
label.setParentElement(mapWidget);
label.setShowEdges(true);
label.setBackgroundColor("#ffffd0");
label.setPadding(5);
label.setWidth(350);
label.setTop(25);
label.setLeft(-220); // start off screen
label.setValign(VerticalAlignment.CENTER);
label.setAlign(Alignment.CENTER);
label.setAnimateTime(1000); // milliseconds
label.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
label.destroy();
}
});
label.animateMove(75, 25);
}
public void onFeatureDeselected(FeatureDeselectedEvent event) {
}
public void onGeometrySplitStart(GeometrySplitStartEvent event) {
setDisabled(true);
}
public void onGeometrySplitStop(GeometrySplitStopEvent event) {
if (label != null) {
label.destroy();
label = null;
}
setDisabled(false);
}
}