/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * CreatePolygonFeatureListener.java * * Created on 19. April 2005, 09:33 */ package de.cismet.cismap.commons.gui.piccolo.eventlistener; import edu.umd.cs.piccolo.event.PBasicInputEventHandler; import edu.umd.cs.piccolo.nodes.PPath; import java.awt.Color; import java.awt.geom.Point2D; import java.util.Vector; import de.cismet.cismap.commons.gui.MappingComponent; import de.cismet.cismap.commons.gui.piccolo.FixedWidthStroke; import de.cismet.cismap.commons.gui.piccolo.PFeature; import de.cismet.cismap.commons.tools.PFeatureTools; /** * DOCUMENT ME! * * @author hell * @version $Revision$, $Date$ */ public class CreatePolygonFeatureListener extends PBasicInputEventHandler { //~ Instance fields -------------------------------------------------------- protected Point2D startPoint; protected PPath tempFeature; protected MappingComponent mc; protected boolean inProgress; private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass()); private Vector points; private SimpleMoveListener moveListener; //~ Constructors ----------------------------------------------------------- /** * Creates a new instance of CreatePolygonFeatureListener. * * @param mc DOCUMENT ME! */ public CreatePolygonFeatureListener(final MappingComponent mc) { this.mc = mc; moveListener = (SimpleMoveListener)mc.getInputListener(MappingComponent.MOTION); } //~ Methods ---------------------------------------------------------------- @Override public void mouseMoved(final edu.umd.cs.piccolo.event.PInputEvent pInputEvent) { super.mouseMoved(pInputEvent); if (moveListener != null) { moveListener.mouseMoved(pInputEvent); } else { log.warn("Movelistener zur Abstimmung der Mauszeiger nicht gefunden."); // NOI18N } if (inProgress) { Point2D point = null; if (mc.isSnappingEnabled()) { final boolean vertexRequired = mc.isSnappingOnLineEnabled(); point = PFeatureTools.getNearestPointInArea( mc, pInputEvent.getCanvasPosition(), vertexRequired, true); } if (point == null) { point = pInputEvent.getPosition(); } updatePolygon(point); } } // public void mousePressed(edu.umd.cs.piccolo.event.PInputEvent pInputEvent) { // mouseClicked(pInputEvent); // } // // public void mouseDragged(edu.umd.cs.piccolo.event.PInputEvent pInputEvent) { // mouseMoved(pInputEvent); // } @Override public void mouseClicked(final edu.umd.cs.piccolo.event.PInputEvent pInputEvent) { super.mouseClicked(pInputEvent); if (pInputEvent.getButton() == 1) { // Linke Maustaste: TODO: konnte die piccolo Konstanten nicht finden if (pInputEvent.getClickCount() == 1) { Point2D point = null; if (mc.isSnappingEnabled()) { final boolean vertexRequired = mc.isSnappingOnLineEnabled(); point = PFeatureTools.getNearestPointInArea( mc, pInputEvent.getCanvasPosition(), vertexRequired, true); } if (point == null) { point = pInputEvent.getPosition(); } if (!inProgress) { // Polygon erzeugen tempFeature = new PPath(); points = new Vector(); tempFeature.setStroke(new FixedWidthStroke()); tempFeature.setPaint(getFillingColor()); mc.getTmpFeatureLayer().removeAllChildren(); mc.getTmpFeatureLayer().addChild(tempFeature); // Ersten Punkt anlegen startPoint = point; points.add(startPoint); inProgress = true; } else { // Zus\u00E4tzlichen Punkt anlegen points.add(point); updatePolygon(null); } } else if (pInputEvent.getClickCount() == 2) { // Anlegen des neuen PFeatures mc.getTmpFeatureLayer().removeAllChildren(); final PFeature newFeature = new PFeature(getPoints(null), mc.getWtst(), mc.getClip_offset_x(), mc.getClip_offset_y(), mc); newFeature.setViewer(mc); mc.getFeatureLayer().addChild(newFeature); inProgress = false; } } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ protected Color getFillingColor() { return new Color(1f, 0f, 0f, 0.5f); } /** * DOCUMENT ME! * * @param lastPoint DOCUMENT ME! */ protected void updatePolygon(final Point2D lastPoint) { final Point2D[] p = getPoints(lastPoint); tempFeature.setPathToPolyline(p); tempFeature.repaint(); } /** * DOCUMENT ME! * * @param lastPoint DOCUMENT ME! * * @return DOCUMENT ME! */ protected Point2D[] getPoints(final Point2D lastPoint) { int plus; boolean movin = false; if (lastPoint != null) { plus = 2; movin = true; } else { plus = 1; movin = false; } final Point2D[] p = new Point2D[points.size() + plus]; for (int i = 0; i < points.size(); ++i) { p[i] = (Point2D)(points.get(i)); } if (movin) { p[points.size()] = lastPoint; p[points.size() + 1] = startPoint; } else { p[points.size()] = startPoint; } return p; } }