/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * RectangleRubberBandListener.java * * Created on 5. M\u00E4rz 2005, 14:47 */ package de.cismet.cismap.commons.gui.piccolo.eventlistener; import edu.umd.cs.piccolo.*; import edu.umd.cs.piccolo.event.*; import edu.umd.cs.piccolo.nodes.*; import edu.umd.cs.piccolo.util.PBounds; import java.awt.*; import java.awt.geom.Point2D; import de.cismet.cismap.commons.gui.MappingComponent; import de.cismet.cismap.commons.gui.piccolo.PFeature; import de.cismet.cismap.commons.tools.PFeatureTools; /** * DOCUMENT ME! * * @author HP * @version $Revision$, $Date$ */ public class RectangleRubberBandListener extends PBasicInputEventHandler { //~ Instance fields -------------------------------------------------------- /** The rectangle that is currently getting created. */ protected PPath rectangle; /** The mouse press location for the current pressed, drag and release sequence. */ protected Point2D pressPoint; /** The current drag location. */ protected Point2D dragPoint; protected boolean rectangleEmpty = true; private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass()); //~ Constructors ----------------------------------------------------------- /** * Creates a new instance of RectangleRubberBandListener. */ public RectangleRubberBandListener() { } //~ Methods ---------------------------------------------------------------- @Override public void mousePressed(final PInputEvent e) { super.mousePressed(e); try { if (e.isLeftMouseButton() && !isMouseOverStickyNode(e)) { final PLayer layer = ((MappingComponent)(e.getComponent())).getRubberBandLayer(); // Initialize the locations. pressPoint = e.getPosition(); dragPoint = pressPoint; // create a new rectangle and add it to the canvas layer so // that we can see it. rectangle = new PPath(); rectangle.setPaint(new java.awt.Color(20, 20, 20, 20)); rectangle.setStroke(new BasicStroke((float)(1 / e.getCamera().getViewScale()))); layer.addChild(rectangle); rectangle.moveToFront(); updateRectangle(); rectangleEmpty = true; } } catch (ClassCastException cce) { log.error("PCanvas muss vom Typ SimpleFeatureViewer sein", cce); // NOI18N } } @Override public void mouseDragged(final PInputEvent e) { super.mouseDragged(e); dragPoint = e.getPosition(); updateRectangle(); rectangleEmpty = false; } @Override public void mouseReleased(final PInputEvent e) { super.mouseReleased(e); final PBounds b = new PBounds(); if (pressPoint != null) { b.add(pressPoint); b.add(dragPoint); } if (e.getButton() == 1) { // Linke Maustaste: TODO: konnte die piccolo Konstanten nicht inden // update the rectangle shape. updateRectangle(); if ((rectangle != null) && (rectangle.getParent() != null)) { rectangle.removeFromParent(); } // rectangle = null; } } /** * Updates the rectangle shape. */ private void updateRectangle() { // create a new bounds that contains both the press and // current drag point. if (rectangle != null) { PBounds b = new PBounds(); b.add(pressPoint); b.add(dragPoint); // Set the rectangles bounds. // rectangle.setPathToRectangle((float)pressPoint.getX(),(float)pressPoint.getY(),(float)(pressPoint.getX()-dragPoint.getX()),(float)(pressPoint.getY()-dragPoint.getY())); rectangle.setPathTo(b); b = null; } } /** * DOCUMENT ME! * * @param pInputEvent DOCUMENT ME! * * @return DOCUMENT ME! */ private boolean isMouseOverStickyNode(final PInputEvent pInputEvent) { final Object firstPFeatureUnderMouse = PFeatureTools.getFirstValidObjectUnderPointer( pInputEvent, new Class[] { PFeature.class }); if ((firstPFeatureUnderMouse != null) && (firstPFeatureUnderMouse instanceof PFeature)) { final PFeature pFeature = (PFeature)firstPFeatureUnderMouse; final PNode stickyChild = pFeature.getStickyChild(); if ((stickyChild != null) && stickyChild.getVisible()) { if (stickyChild.getFullBounds().contains(pInputEvent.getPosition())) { return true; } } } return false; } }