/*
* 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.jsapi.client.split;
import org.geomajas.annotation.Api;
import org.geomajas.geometry.Geometry;
import org.geomajas.plugin.editing.client.GeometryArrayFunction;
import org.geomajas.plugin.editing.client.service.GeometryEditService;
import org.geomajas.plugin.editing.client.service.GeometryEditServiceImpl;
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.GeometrySplitStopEvent;
import org.geomajas.plugin.editing.jsapi.client.GeometryArrayCallback;
import org.geomajas.plugin.editing.jsapi.client.GeometryArrayCallback.GeometryArrayHolder;
import org.geomajas.plugin.editing.jsapi.client.service.JsGeometryEditService;
import org.geomajas.plugin.editing.jsapi.client.split.event.GeometrySplitStartHandler;
import org.geomajas.plugin.editing.jsapi.client.split.event.GeometrySplitStopHandler;
import org.geomajas.plugin.jsapi.client.event.JsHandlerRegistration;
import org.timepedia.exporter.client.Export;
import org.timepedia.exporter.client.ExportPackage;
import org.timepedia.exporter.client.Exportable;
import org.timepedia.exporter.client.NoExport;
import com.google.gwt.event.shared.HandlerRegistration;
/**
* Service for geometry splitting. It uses a {@link JsGeometryEditService} to let the user draw a splitting line. Only
* by calling the <code>stop</code> method, the splitting is executed.
*
* @author Pieter De Graef
* @since 1.0.0
*/
@Export("GeometrySplitService")
@ExportPackage("org.geomajas.plugin.editing.split")
@Api(allMethods = true)
public class JsGeometrySplitService implements Exportable {
private GeometrySplitService delegate;
private JsGeometryEditService editService;
/**
* Default constructor.
*/
public JsGeometrySplitService() {
this.delegate = new GeometrySplitService(new GeometryEditServiceImpl());
editService = new JsGeometryEditService(delegate.getGeometryEditService());
}
/**
* Constructor with a {@link GeometryEditService}, that if stopped, stops this service as well.
*
* @param service
* the {@link GeometryEditService} that needs to be used
*/
@NoExport
public JsGeometrySplitService(GeometryEditService editService) {
this.editService = new JsGeometryEditService(editService);
this.delegate = new GeometrySplitService(editService);
}
//
// public void setGeometryEditService(JsGeometryEditService editService) {
// this.editService = editService;
// this.delegate = new GeometrySplitService(editService.getDelegate());
// }
// ------------------------------------------------------------------------
// Public methods for adding handlers:
// ------------------------------------------------------------------------
/**
* Get the delegating {@link GeometryEditService}.
*
* @return delegate delegate
*/
@NoExport
public GeometrySplitService getDelegate() {
return delegate;
}
/**
* Register a {@link GeometrySplitStartHandler} to listen to events that signal the splitting process has started.
*
* @param handler
* The {@link GeometrySplitStartHandler} to add as listener.
* @return The registration of the handler.
*/
public JsHandlerRegistration addGeometrySplitStartHandler(final GeometrySplitStartHandler handler) {
org.geomajas.plugin.editing.client.split.event.GeometrySplitStartHandler h;
h = new org.geomajas.plugin.editing.client.split.event.GeometrySplitStartHandler() {
public void onGeometrySplitStart(GeometrySplitStartEvent event) {
Geometry geometry = event.getGeometry();
org.geomajas.plugin.editing.jsapi.client.split.event.GeometrySplitStartEvent e;
e = new org.geomajas.plugin.editing.jsapi.client.split.event.GeometrySplitStartEvent(geometry);
handler.onGeometrySplitStart(e);
}
};
HandlerRegistration registration = delegate.addGeometrySplitStartHandler(h);
return new JsHandlerRegistration(new HandlerRegistration[] { registration });
}
/**
* Register a {@link GeometrySplitStopHandler} to listen to events that signal the splitting process has ended
* (either through stop or cancel).
*
* @param handler
* The {@link GeometrySplitStopHandler} to add as listener.
* @return The registration of the handler.
*/
public JsHandlerRegistration addGeometrySplitStopHandler(final GeometrySplitStopHandler handler) {
org.geomajas.plugin.editing.client.split.event.GeometrySplitStopHandler h;
h = new org.geomajas.plugin.editing.client.split.event.GeometrySplitStopHandler() {
public void onGeometrySplitStop(GeometrySplitStopEvent event) {
Geometry geometry = event.getGeometry();
org.geomajas.plugin.editing.jsapi.client.split.event.GeometrySplitStopEvent e;
e = new org.geomajas.plugin.editing.jsapi.client.split.event.GeometrySplitStopEvent(geometry);
handler.onGeometrySplitStop(e);
}
};
HandlerRegistration registration = delegate.addGeometrySplitStopHandler(h);
return new JsHandlerRegistration(new HandlerRegistration[] { registration });
}
// ------------------------------------------------------------------------
// Public methods for splitting work-flow:
// ------------------------------------------------------------------------
/**
* Start splitting the given geometry.
*
* @param geometry
* to be split
*/
public void start(Geometry geometry) {
delegate.start(geometry);
}
/**
* Stop splitting the geometry.
*
* @param callback
* the {@link GeometryArrayCallback} to be executed after the splitting has stopped
*/
public void stop(final GeometryArrayCallback callback) {
if (callback == null) {
delegate.stop(null);
} else {
delegate.stop(new GeometryArrayFunction() {
public void execute(Geometry[] geometries) {
callback.execute(new GeometryArrayHolder(geometries));
}
});
}
}
// ------------------------------------------------------------------------
// Getters:
// ------------------------------------------------------------------------
/**
* Get the geometry that needs to be split.
*
* @return geometry that needs to be split
*/
public Geometry getGeometry() {
return delegate.getGeometry();
}
/**
* Get the geometry that represents the split line.
*
* @return geometry that represents the split line.
*/
public Geometry getSplitLine() {
return delegate.getSplitLine();
}
/**
* Get the {@link JsGeometryEditService} that is used to edit the split line.
*
* @return the {@link JsGeometryEditService} that is used to edit the split line
*/
public JsGeometryEditService getGeometryEditService() {
return editService;
}
}