/*
* 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.gwt.client.map.feature;
import org.geomajas.gwt.client.map.MapModel;
import org.geomajas.gwt.client.map.event.EditingEvent;
import org.geomajas.gwt.client.map.event.EditingEvent.EditingEventType;
import org.geomajas.gwt.client.map.event.EditingHandler;
import org.geomajas.gwt.client.map.layer.Layer;
import org.geomajas.gwt.client.map.layer.VectorLayer;
import org.geomajas.gwt.client.spatial.geometry.GeometryFactory;
import org.geomajas.layer.LayerType;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.event.shared.HandlerRegistration;
/**
* ???
*
* TODO: redesign!
*
* @author Pieter De Graef
*/
public class FeatureEditor {
private MapModel mapModel;
private GeometryFactory factory;
private FeatureTransaction featureTransaction;
private HandlerManager handlerManager;
public FeatureEditor(MapModel mapModel) {
this.mapModel = mapModel;
factory = new GeometryFactory(mapModel.getSrid(), mapModel.getPrecision());
handlerManager = new HandlerManager(this);
}
public final HandlerRegistration addEditingHandler(final EditingHandler handler) {
return handlerManager.addHandler(EditingHandler.TYPE, handler);
}
public FeatureTransaction startEditing(Feature[] oldFeatures, Feature[] targetFeatures) {
Feature[] newFeatures = targetFeatures;
if (featureTransaction == null) {
if (oldFeatures == null || oldFeatures.length == 0) { // NEW FEATURE
Layer<?> layer = mapModel.getSelectedLayer();
if (layer == null || !(layer instanceof VectorLayer)) {
return null;
}
VectorLayer vectorLayer = (VectorLayer) layer;
Feature feature = vectorLayer.getFeatureStore().newFeature();
if (vectorLayer.getLayerInfo().getLayerType() == LayerType.POINT) {
feature.setGeometry(factory.createPoint(null));
} else if (vectorLayer.getLayerInfo().getLayerType() == LayerType.MULTIPOINT) {
feature.setGeometry(factory.createMultiPoint(null));
} else if (vectorLayer.getLayerInfo().getLayerType() == LayerType.LINESTRING) {
feature.setGeometry(factory.createLineString(null));
} else if (vectorLayer.getLayerInfo().getLayerType() == LayerType.MULTILINESTRING) {
feature.setGeometry(factory.createMultiLineString(null));
} else if (vectorLayer.getLayerInfo().getLayerType() == LayerType.POLYGON) {
feature.setGeometry(factory.createPolygon(null, null));
} else if (vectorLayer.getLayerInfo().getLayerType() == LayerType.MULTIPOLYGON) {
feature.setGeometry(factory.createMultiPolygon(null));
}
newFeatures = new Feature[] { feature };
featureTransaction = new FeatureTransaction(vectorLayer, null, newFeatures);
} else if (newFeatures == null || newFeatures.length == 0) {
// DELETE EXISTING
featureTransaction = new FeatureTransaction(oldFeatures[0].getLayer(), oldFeatures, null);
} else {
// EDIT EXISTING
featureTransaction = new FeatureTransaction(oldFeatures[0].getLayer(), oldFeatures, newFeatures);
}
handlerManager.fireEvent(new EditingEvent(EditingEventType.START_EDITING));
return featureTransaction;
}
return featureTransaction;
}
public void stopEditing() {
handlerManager.fireEvent(new EditingEvent(EditingEventType.STOP_EDITING));
featureTransaction = null;
}
public FeatureTransaction getFeatureTransaction() {
return featureTransaction;
}
}