/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package de.cismet.cismap.commons.gui.attributetable.creator; import com.vividsolutions.jts.geom.Geometry; import org.apache.log4j.Logger; import org.openide.util.NbBundle; import java.awt.Cursor; import java.awt.EventQueue; import java.util.ArrayList; import java.util.List; import java.util.Map; import de.cismet.cismap.commons.features.DefaultFeatureServiceFeature; import de.cismet.cismap.commons.features.FeatureServiceFeature; import de.cismet.cismap.commons.gui.MappingComponent; import de.cismet.cismap.commons.gui.attributetable.FeatureCreatedEvent; import de.cismet.cismap.commons.gui.attributetable.FeatureCreatedListener; import de.cismet.cismap.commons.gui.piccolo.eventlistener.CreateGeometryListenerInterface; import de.cismet.cismap.commons.gui.piccolo.eventlistener.CreateNewGeometryListener; import de.cismet.math.geometry.StaticGeometryFunctions; import static de.cismet.cismap.commons.gui.attributetable.FeatureCreator.SIMPLE_GEOMETRY_LISTENER_KEY; /** * DOCUMENT ME! * * @author therter * @version $Revision$, $Date$ */ public class PrimitiveGeometryCreator extends AbstractFeatureCreator { //~ Static fields/initializers --------------------------------------------- private static final Logger LOG = Logger.getLogger(PrimitiveGeometryCreator.class); //~ Instance fields -------------------------------------------------------- protected List<FeatureCreatedListener> listener = new ArrayList<FeatureCreatedListener>(); private final String mode; private boolean multi; //~ Constructors ----------------------------------------------------------- /** * Creates a new PrimitiveGeometryCreator object. * * @param mode DOCUMENT ME! */ public PrimitiveGeometryCreator(final String mode) { this(mode, null); } /** * Creates a new PrimitiveGeometryCreator object. * * @param mode DOCUMENT ME! * @param properties DOCUMENT ME! */ public PrimitiveGeometryCreator(final String mode, final Map<String, Object> properties) { this(mode, properties, false); } /** * Creates a new PrimitiveGeometryCreator object. * * @param mode DOCUMENT ME! * @param multi DOCUMENT ME! */ public PrimitiveGeometryCreator(final String mode, final boolean multi) { this(mode, null, multi); } /** * Creates a new PrimitiveGeometryCreator object. * * @param mode DOCUMENT ME! * @param properties DOCUMENT ME! * @param multi DOCUMENT ME! */ public PrimitiveGeometryCreator(final String mode, final Map<String, Object> properties, final boolean multi) { this.mode = mode; this.properties = properties; this.multi = multi; } //~ Methods ---------------------------------------------------------------- @Override public void createFeature(final MappingComponent mc, final FeatureServiceFeature feature) { EventQueue.invokeLater(new Runnable() { @Override public void run() { final String oldInteractionMode = mc.getInteractionMode(); final CreateNewGeometryListener listener = new CreaterGeometryListener( mc, new GeometryFinishedListener() { @Override public void geometryFinished(final Geometry g) { Geometry geom; if (multi) { geom = StaticGeometryFunctions.toMultiGeometry(g); } else { geom = StaticGeometryFunctions.toSimpleGeometry(g); } feature.setGeometry(geom); mc.setInteractionMode(oldInteractionMode); if (feature instanceof DefaultFeatureServiceFeature) { try { fillFeatureWithDefaultValues((DefaultFeatureServiceFeature)feature); ((DefaultFeatureServiceFeature)feature).saveChanges(); for (final FeatureCreatedListener featureCreatedListener : PrimitiveGeometryCreator.this.listener) { featureCreatedListener.featureCreated( new FeatureCreatedEvent(PrimitiveGeometryCreator.this, feature)); } } catch (Exception e) { LOG.error("Cannot save new feature", e); } } } }); mc.addInputListener(SIMPLE_GEOMETRY_LISTENER_KEY, listener); mc.putCursor(SIMPLE_GEOMETRY_LISTENER_KEY, new Cursor(Cursor.CROSSHAIR_CURSOR)); listener.setMode(mode); mc.setInteractionMode(SIMPLE_GEOMETRY_LISTENER_KEY); } }); } @Override public void addFeatureCreatedListener(final FeatureCreatedListener listener) { this.listener.add(listener); } @Override public String getTypeName() { if (mode.equals(CreateGeometryListenerInterface.LINESTRING)) { return NbBundle.getMessage( PrimitiveGeometryCreator.class, "PrimitiveGeometryCreator.getTypeName().linestring"); } else if (mode.equals(CreateGeometryListenerInterface.POLYGON)) { return NbBundle.getMessage( PrimitiveGeometryCreator.class, "PrimitiveGeometryCreator.getTypeName().polygon"); } else if (mode.equals(CreateGeometryListenerInterface.POINT)) { return NbBundle.getMessage(PrimitiveGeometryCreator.class, "PrimitiveGeometryCreator.getTypeName().point"); } else if (mode.equals(CreateGeometryListenerInterface.RECTANGLE)) { return NbBundle.getMessage( PrimitiveGeometryCreator.class, "PrimitiveGeometryCreator.getTypeName().rectangle"); } else if (mode.equals(CreateGeometryListenerInterface.ELLIPSE)) { return NbBundle.getMessage( PrimitiveGeometryCreator.class, "PrimitiveGeometryCreator.getTypeName().ellipse"); } else { return NbBundle.getMessage(PrimitiveGeometryCreator.class, "PrimitiveGeometryCreator.getTypeName().other"); } } /** * DOCUMENT ME! * * @return the multi */ public boolean isMulti() { return multi; } /** * DOCUMENT ME! * * @param multi the multi to set */ public void setMulti(final boolean multi) { this.multi = multi; } }