/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.cismap.commons.gui.piccolo; import edu.umd.cs.piccolo.PNode; import edu.umd.cs.piccolo.event.PBasicInputEventHandler; import edu.umd.cs.piccolo.event.PInputEvent; import edu.umd.cs.piccolo.nodes.PPath; import edu.umd.cs.piccolo.util.PBounds; import edu.umd.cs.piccolox.util.PLocator; import pswing.PSwing; import pswing.PSwingCanvas; import java.awt.Color; import java.awt.Shape; import java.awt.event.MouseEvent; import java.awt.geom.Ellipse2D; import java.awt.geom.Point2D; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.text.DecimalFormat; import de.cismet.cismap.commons.gui.MappingComponent; import de.cismet.cismap.commons.gui.piccolo.eventlistener.CreateLinearReferencedMarksListener; /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ public class LinearReferencedPointMarkPHandle extends PPath { //~ Static fields/initializers --------------------------------------------- private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger( LinearReferencedPointMarkPHandle.class); public static final double DEFAULT_HANDLE_SIZE = 8; public static final Shape DEFAULT_HANDLE_SHAPE = new Ellipse2D.Double( 0f, 0f, DEFAULT_HANDLE_SIZE, DEFAULT_HANDLE_SIZE); public static final Color DEFAULT_COLOR = Color.BLUE; //~ Instance fields -------------------------------------------------------- private PLocator locator; private MappingComponent mc = null; private LinearReferencedPointInfoPanel measurementPanel; private CreateLinearReferencedMarksListener measurementListener; private PSwing pswingComp; //~ Constructors ----------------------------------------------------------- /** * Construct a new handle that will use the given locator to locate itself on its parent node. * * @param locator DOCUMENT ME! * @param listener DOCUMENT ME! * @param mc DOCUMENT ME! */ public LinearReferencedPointMarkPHandle(final PLocator locator, final CreateLinearReferencedMarksListener listener, final MappingComponent mc) { super(DEFAULT_HANDLE_SHAPE); this.mc = mc; this.locator = locator; this.measurementListener = listener; installEventListener(); setPaint(DEFAULT_COLOR); installHandleEventHandlers(); startResizeBounds(); initPanel(); relocateHandle(); } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @param zeroToOne DOCUMENT ME! */ public void setInfoPanelTransparency(final float zeroToOne) { pswingComp.setTransparency(zeroToOne); } /** * DOCUMENT ME! */ private void installEventListener() { final PBasicInputEventHandler moveAndClickListener = new PBasicInputEventHandler() { @Override public void mouseClicked(final PInputEvent pInputEvent) { handleClicked(pInputEvent); } @Override public void mouseEntered(final PInputEvent pInputEvent) { // switch (measurementListener.getModus()) { // case MARK_SELECTION: { measurementListener.getPLayer().removeChild(LinearReferencedPointMarkPHandle.this); measurementListener.getPLayer().addChild(LinearReferencedPointMarkPHandle.this); // break; // } // } } }; addInputEventListener(moveAndClickListener); } /** * DOCUMENT ME! * * @param pInputEvent DOCUMENT ME! */ private void handleClicked(final PInputEvent pInputEvent) { // switch (measurementListener.getModus()) { // case MARK_SELECTION: { // if (log.isDebugEnabled()) { // log.debug("handle selected"); // } if (pInputEvent.isRightMouseButton()) { final MouseEvent swingEvent = ((MouseEvent)pInputEvent.getSourceSwingEvent()); measurementListener.setSelectedMark(this); measurementListener.getContextMenu().show(pswingComp.getComponent(), swingEvent.getX(), swingEvent.getY()); } // break; // } // } } /** * DOCUMENT ME! */ private void initPanel() { measurementPanel = new LinearReferencedPointInfoPanel(); pswingComp = new PSwing((PSwingCanvas)mc, measurementPanel); measurementPanel.setPNodeParent(pswingComp); addChild(pswingComp); } /** * DOCUMENT ME! * * @param mark DOCUMENT ME! */ public void setMarkPosition(final double mark) { final String info = new DecimalFormat("0.00").format(mark); measurementPanel.setLengthInfo(info); relocateHandle(); repaint(); } /** * DOCUMENT ME! */ protected void installHandleEventHandlers() { addPropertyChangeListener(PNode.PROPERTY_TRANSFORM, new PropertyChangeListener() { @Override public void propertyChange(final PropertyChangeEvent evt) { relocateHandle(); } }); } /** * Get the locator that this handle uses to position itself on its parent node. * * @return DOCUMENT ME! */ public PLocator getLocator() { return locator; } /** * Set the locator that this handle uses to position itself on its parent node. * * @param locator DOCUMENT ME! */ public void setLocator(final PLocator locator) { this.locator = locator; invalidatePaint(); relocateHandle(); } @Override public void setParent(final PNode newParent) { super.setParent(newParent); relocateHandle(); } @Override public void parentBoundsChanged() { relocateHandle(); } /** * Force this handle to relocate itself using its locator. */ public void relocateHandle() { if (locator != null) { final PBounds b = getBoundsReference(); final Point2D aPoint = locator.locatePoint(null); mc.getCamera().viewToLocal(aPoint); final double newCenterX = aPoint.getX(); final double newCenterY = aPoint.getY(); pswingComp.setOffset(newCenterX + DEFAULT_HANDLE_SIZE, newCenterY - (pswingComp.getHeight() / 2)); if ((newCenterX != b.getCenterX()) || (newCenterY != b.getCenterY())) { this.setBounds(0, 0, DEFAULT_HANDLE_SIZE, DEFAULT_HANDLE_SIZE); centerBoundsOnPoint(newCenterX, newCenterY); } } } }