/*
* 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.gwt.client;
import org.geomajas.annotation.Api;
import org.geomajas.configuration.SnappingRuleInfo;
import org.geomajas.gwt.client.map.layer.Layer;
import org.geomajas.gwt.client.map.layer.VectorLayer;
import org.geomajas.gwt.client.widget.MapWidget;
import org.geomajas.plugin.editing.gwt.client.GeometryEditor;
import org.geomajas.plugin.editing.gwt.client.GeometryEditorImpl;
import org.geomajas.plugin.editing.gwt.client.snap.SnapRuleUtil;
import org.geomajas.plugin.editing.jsapi.client.merge.JsGeometryMergeService;
import org.geomajas.plugin.editing.jsapi.client.service.JsGeometryEditService;
import org.geomajas.plugin.editing.jsapi.client.split.JsGeometrySplitService;
import org.geomajas.plugin.editing.jsapi.gwt.client.gfx.JsGeometryRenderer;
import org.geomajas.plugin.editing.jsapi.gwt.client.gfx.JsSnapService;
import org.geomajas.plugin.editing.jsapi.gwt.client.gfx.JsStyleService;
import org.geomajas.plugin.jsapi.client.map.Map;
import org.geomajas.plugin.jsapi.gwt.client.exporter.map.MapImpl;
import org.timepedia.exporter.client.Export;
import org.timepedia.exporter.client.ExportPackage;
import org.timepedia.exporter.client.Exportable;
import org.timepedia.exporter.client.NoExport;
/**
* Central geometry editor for the JavaScript API on top of the GWT face.
*
* @author Pieter De Graef
* @author Jan Venstermans
* @since 1.0.0
*/
@Export("GeometryEditor")
@ExportPackage("org.geomajas.plugin.editing")
@Api(allMethods = true)
public class JsGeometryEditor implements Exportable {
private MapWidget mapWidget;
private MapImpl map;
private GeometryEditorImpl delegate;
private JsGeometryEditService editingService;
private JsGeometrySplitService splitService;
private JsGeometryMergeService mergeService;
private JsStyleService styleService;
private JsGeometryRenderer renderer;
private JsSnapService snapService;
/**
* Needed for Gwt exporter.
*/
public JsGeometryEditor() {
}
/**
* Set the map.
*
* @param map map
*/
public void setMap(Map map) {
this.map = (MapImpl) map;
mapWidget = this.map.getMapWidget();
delegate = new GeometryEditorImpl(mapWidget);
editingService = new JsGeometryEditService(delegate.getEditService());
splitService = new JsGeometrySplitService(delegate.getEditService());
mergeService = new JsGeometryMergeService();
renderer = new JsGeometryRenderer(delegate.getRenderer());
styleService = new JsStyleService(delegate.getStyleService());
snapService = new JsSnapService(this);
}
/**
* Add the list of snapping rules as they are configured for a specific layer within the XML configuration.
*
* @param layerId The vector layer to use the configuration from.
*/
public void addLayerSnappingRules(String layerId) {
Layer<?> layer = mapWidget.getMapModel().getLayer(layerId);
if (layer != null && layer instanceof VectorLayer) {
VectorLayer vLayer = (VectorLayer) layer;
for (SnappingRuleInfo snappingRuleInfo : vLayer.getLayerInfo().getSnappingRules()) {
SnapRuleUtil.addRule(delegate.getSnappingService(), mapWidget, snappingRuleInfo);
}
}
}
/**
* Get the map.
*
* @return the map
*/
public MapImpl getMap() {
return map;
}
/**
* Get wrapper for the geometry renderer.
*
* @return the renderer
*/
public JsGeometryRenderer getRenderer() {
return renderer;
}
/**
* Get wrapper for the edit service.
*
* @return the renderer
*/
public JsGeometryEditService getService() {
return editingService;
}
/**
* Get wrapper for the splitting service.
*
* @return the renderer
*/
public JsGeometrySplitService getSplitService() {
return splitService;
}
/**
* Get wrapper for the merging service.
*
* @return the renderer
*/
public JsGeometryMergeService getMergeService() {
return mergeService;
}
/**
* Get wrapper for the style service.
*
* @return the renderer
*/
public JsStyleService getStyleService() {
return styleService;
}
/**
* Get wrapper for the snapping service.
*
* @return the renderer
*/
public JsSnapService getSnapService() {
return snapService;
}
/**
* Should we zoom to the geometry when editing starts ?
*
* @return true when zooming, false otherwise
*/
public boolean isZoomOnStart() {
return delegate.isZoomOnStart();
}
/**
* @see #isZoomOnStart()
* @param zoomOnStart
*/
public void setZoomOnStart(boolean zoomOnStart) {
delegate.setZoomOnStart(zoomOnStart);
}
/**
* Should snapping be enabled while dragging ?
*
* @return true when enabled, false otherwise
*/
public boolean isSnapOnDrag() {
return delegate.isSnapOnDrag();
}
/**
* @see #isSnapOnDrag()
* @param snapOnDrag
*/
public void setSnapOnDrag(boolean snapOnDrag) {
delegate.setSnapOnDrag(snapOnDrag);
}
/**
* Should snapping be enabled while inserting ?
*
* @return true when enabled, false otherwise
*/
public boolean isSnapOnInsert() {
return delegate.isSnapOnInsert();
}
/**
* @see #isSnapOnInsert()
* @param snapOnInsert
*/
public void setSnapOnInsert(boolean snapOnInsert) {
delegate.setSnapOnInsert(snapOnInsert);
}
/**
* Is editing busy ?
*
* @return true when busy, false otherwise
*/
public boolean isBusyEditing() {
return delegate.isBusyEditing();
}
/**
* Return the delegate editor.
*
* @return the delegate
*/
@NoExport
public GeometryEditor getDelegate() {
return delegate;
}
}