/***************************************************
*
* 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.piccolo;
import edu.umd.cs.piccolo.event.PInputEvent;
import edu.umd.cs.piccolo.util.PDimension;
import edu.umd.cs.piccolox.util.PLocator;
import java.awt.geom.Point2D;
import java.util.Collection;
import de.cismet.cismap.commons.features.DefaultFeatureCollection;
import de.cismet.cismap.commons.features.RequestForRotatingPivotLock;
import de.cismet.cismap.commons.gui.MappingComponent;
import de.cismet.cismap.commons.gui.piccolo.eventlistener.SimpleMoveListener;
/**
* DOCUMENT ME!
*
* @author jruiz
* @version $Revision$, $Date$
*/
public class PivotPHandle extends PHandle {
//~ Instance fields --------------------------------------------------------
private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass());
private PFeature pfeature;
private Point2D mid;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new PivotPHandle object.
*
* @param pfeature DOCUMENT ME!
* @param mid DOCUMENT ME!
*/
public PivotPHandle(final PFeature pfeature, final Point2D mid) {
super(new PLocator() {
@Override
public double locateX() {
if (mid == null) {
return pfeature.getBounds().getCenter2D().getX();
} else {
return mid.getX();
}
}
@Override
public double locateY() {
if (mid == null) {
return pfeature.getBounds().getCenter2D().getY();
} else {
return mid.getY();
}
}
}, pfeature.getViewer());
this.pfeature = pfeature;
this.mid = mid;
}
//~ Methods ----------------------------------------------------------------
@Override
public void dragHandle(final PDimension aLocalDimension, final PInputEvent aEvent) {
if (!((pfeature != null) && (pfeature.getFeature() instanceof RequestForRotatingPivotLock))) {
final double scale = pfeature.getViewer().getCamera().getViewScale();
final SimpleMoveListener moveListener = (SimpleMoveListener)pfeature.getViewer()
.getInputListener(MappingComponent.MOTION);
if (moveListener != null) {
moveListener.mouseMoved(aEvent);
} else {
log.warn("Movelistener zur Abstimmung der Mauszeiger nicht gefunden.");
}
mid.setLocation(mid.getX() + (aLocalDimension.width / scale),
mid.getY()
+ (aLocalDimension.height / scale));
relocateHandle();
}
}
@Override
public void endHandleDrag(final java.awt.geom.Point2D aLocalPoint, final PInputEvent aEvent) {
if (!((pfeature != null) && (pfeature.getFeature() instanceof RequestForRotatingPivotLock))) {
if (pfeature.getViewer().getFeatureCollection() instanceof DefaultFeatureCollection) {
final Collection selArr = pfeature.getViewer().getFeatureCollection().getSelectedFeatures();
for (final Object o : selArr) {
final PFeature pf = (PFeature)(pfeature.getViewer().getPFeatureHM().get(o));
pf.setPivotPoint(mid);
}
}
if (pfeature.getViewer().isFeatureDebugging()) {
if (log.isDebugEnabled()) {
log.debug("neuer PivotPunkt=(" + mid.getX() + ", " + mid.getY() + ")");
}
}
super.endHandleDrag(aLocalPoint, aEvent);
}
}
@Override
public void mouseMovedNotInDragOperation(final edu.umd.cs.piccolo.event.PInputEvent pInputEvent) {
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.");
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Point2D getMid() {
return mid;
}
}