/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.cismap.commons.gui.piccolo; import com.vividsolutions.jts.geom.Coordinate; import edu.umd.cs.piccolo.event.PInputEvent; import edu.umd.cs.piccolo.util.PBounds; import edu.umd.cs.piccolo.util.PDimension; import edu.umd.cs.piccolox.util.PLocator; import pswing.PSwing; import pswing.PSwingCanvas; import java.awt.geom.Point2D; import java.text.Format; import de.cismet.cismap.commons.WorldToScreenTransform; import de.cismet.cismap.commons.gui.MappingComponent; import de.cismet.cismap.commons.gui.piccolo.eventlistener.LinearReferencedPointFeature; import de.cismet.cismap.commons.gui.piccolo.eventlistener.LinearReferencedPointFeatureListener; import de.cismet.cismap.commons.gui.piccolo.eventlistener.SimpleMoveListener; /** * DOCUMENT ME! * * @author jruiz * @version $Revision$, $Date$ */ public class LinearReferencedPointPHandle extends PHandle { //~ Static fields/initializers --------------------------------------------- private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger( LinearReferencedPointPHandle.class); //~ Instance fields -------------------------------------------------------- private PFeature pfeature; private LinearReferencedPointInfoPanel infoPanel; private PSwing pswingComp; //~ Constructors ----------------------------------------------------------- /** * Creates a new LinearReferencedPointPHandle object. * * @param pfeature DOCUMENT ME! */ public LinearReferencedPointPHandle(final PFeature pfeature) { super(new PLocator() { @Override public double locateX() { try { return pfeature.getXp(0, 0)[0]; } catch (Exception ex) { return -1; } } @Override public double locateY() { try { return pfeature.getYp(0, 0)[0]; } catch (Exception ex) { return -1; } } }, pfeature.getViewer()); this.pfeature = pfeature; initPanel(); ((LinearReferencedPointFeature)pfeature.getFeature()).addListener(new LinearReferencedPointFeatureListener() { @Override public void featureMoved(final LinearReferencedPointFeature pointFeature) { relocateHandle(); } @Override public void featureMerged(final LinearReferencedPointFeature withPoint, final LinearReferencedPointFeature mergePoint) { } }); } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public PFeature getPFeature() { return pfeature; } /** * DOCUMENT ME! */ private void initPanel() { infoPanel = new LinearReferencedPointInfoPanel(); pswingComp = new PSwing((PSwingCanvas)pfeature.getViewer(), infoPanel); infoPanel.setPNodeParent(pswingComp); addChild(pswingComp); } @Override public void dragHandle(final PDimension aLocalDimension, final PInputEvent pInputEvent) { try { final SimpleMoveListener moveListener = (SimpleMoveListener)pfeature.getViewer() .getInputListener(MappingComponent.MOTION); if (moveListener != null) { moveListener.mouseMoved(pInputEvent); } else { LOG.warn("Movelistener zur Abstimmung der Mauszeiger nicht gefunden."); } if (pfeature.getViewer().getHandleInteractionMode().equals(MappingComponent.MOVE_HANDLE)) { pfeature.getViewer().getCamera().localToView(aLocalDimension); final WorldToScreenTransform wtst = pfeature.getViewer().getWtst(); final LinearReferencedPointFeature linref = (LinearReferencedPointFeature)pfeature.getFeature(); final Point2D dragPoint = pInputEvent.getPosition(); final Coordinate coord = new Coordinate( wtst.getSourceX(dragPoint.getX()), wtst.getSourceY(dragPoint.getY())); linref.moveTo(coord, null); relocateHandle(); } } catch (Throwable t) { if (LOG.isDebugEnabled()) { LOG.debug("Error in dragHandle.", t); } } } @Override public void endHandleDrag(final Point2D aLocalPoint, final PInputEvent aEvent) { super.endHandleDrag(aLocalPoint, aEvent); final LinearReferencedPointFeature linref = (LinearReferencedPointFeature)pfeature.getFeature(); linref.moveFinished(); } @Override public void relocateHandle() { super.relocateHandle(); if (pfeature != null) { final LinearReferencedPointFeature linref = (LinearReferencedPointFeature)pfeature.getFeature(); String info = ""; final Format infoFormat = ((LinearReferencedPointFeature)pfeature.getFeature()).getInfoFormat(); if (infoFormat != null) { info = infoFormat.format(linref.getCurrentPosition()); } else { info = String.valueOf(linref.getCurrentPosition()); } infoPanel.setLengthInfo(info); final PBounds b = getBoundsReference(); final Point2D aPoint = getLocator().locatePoint(null); pfeature.getViewer().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); } } } }