/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cismap.commons.gui.piccolo.eventlistener;
import edu.umd.cs.piccolo.event.PBasicInputEventHandler;
import edu.umd.cs.piccolox.event.PNotificationCenter;
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 thorsten.hell@cismet.de
* @version $Revision$, $Date$
*/
public class SplitPolygonListener extends PBasicInputEventHandler {
//~ Static fields/initializers ---------------------------------------------
public static final String SPLIT_FINISHED = "SPLIT_FINISHED"; // NOI18N
public static final String SELECTION_CHANGED = "SELECTION_CHANGED"; // NOI18N
//~ Instance fields --------------------------------------------------------
private final MappingComponent mc;
private PFeature pFeature = null;
private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass());
//~ Constructors -----------------------------------------------------------
/**
* Creates a new SplitPolygonListener object.
*
* @param mc DOCUMENT ME!
*/
public SplitPolygonListener(final MappingComponent mc) {
super();
this.mc = mc;
}
//~ Methods ----------------------------------------------------------------
@Override
public void mouseClicked(final edu.umd.cs.piccolo.event.PInputEvent pInputEvent) {
if (log.isDebugEnabled()) {
log.debug("mouseClicked()"); // NOI18N
}
final Object o = PFeatureTools.getFirstValidObjectUnderPointer(pInputEvent, new Class[] { PFeature.class });
if (o instanceof PFeature) {
super.mouseClicked(pInputEvent);
pFeature = (PFeature)(o);
if (pFeature.isSelected() == false) {
mc.getFeatureCollection().select(pFeature.getFeature());
} else if (pFeature.inSplitProgress()) {
Point2D point = null;
if (mc.isSnappingEnabled()) {
point = PFeatureTools.getNearestPointInArea(mc, pInputEvent.getCanvasPosition());
}
if (point == null) {
point = pInputEvent.getPosition();
}
if (pFeature.inSplitProgress()) {
pFeature.getSplitPoints().add(point);
updateSplitLine(null);
}
} else {
postClickDetected();
}
} else {
pFeature = null;
}
}
/**
* DOCUMENT ME!
*/
private void postClickDetected() {
final PNotificationCenter pn = PNotificationCenter.defaultCenter();
pn.postNotification(SPLIT_FINISHED, this);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public PFeature getFeatureClickedOn() {
return pFeature;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public PFeature getSelectedPFeature() {
return pFeature;
}
//TODO
@Override
public void mouseMoved(final edu.umd.cs.piccolo.event.PInputEvent event) {
final Object o = PFeatureTools.getFirstValidObjectUnderPointer(event, new Class[] { PFeature.class });
pFeature = (PFeature)o;
if ((pFeature == null) && (mc.getFeatureCollection().getSelectedFeatures().size() == 1)) {
pFeature = (PFeature)mc.getPFeatureHM().get(mc.getFeatureCollection().getSelectedFeatures().toArray()[0]);
// p=mc.getSelectedNode();
}
if ((pFeature != null) && pFeature.inSplitProgress()) {
if (log.isDebugEnabled()) {
log.debug("want to draw line"); // NOI18N
}
Point2D point = null;
if (mc.isSnappingEnabled()) {
point = PFeatureTools.getNearestPointInArea(mc, event.getCanvasPosition());
}
if (point == null) {
point = event.getPosition();
}
updateSplitLine((point));
}
super.mouseMoved(event);
}
/**
* DOCUMENT ME!
*
* @param lastPoint DOCUMENT ME!
*/
private void updateSplitLine(final Point2D lastPoint) {
final Point2D[] pa = getPoints(lastPoint);
if (log.isDebugEnabled()) {
log.debug("getSplitLine()" + pFeature.getSplitLine()); // NOI18N
}
pFeature.getSplitLine().setPathToPolyline(pa);
pFeature.getSplitLine().repaint();
}
/**
* DOCUMENT ME!
*
* @param lastPoint DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private Point2D[] getPoints(final Point2D lastPoint) {
int plus;
boolean movin;
if (lastPoint != null) {
plus = 1;
movin = true;
} else {
plus = 0;
movin = false;
}
final Point2D[] pa = new Point2D[pFeature.getSplitPoints().size() + plus];
for (int i = 0; i < pFeature.getSplitPoints().size(); ++i) {
pa[i] = (Point2D)(pFeature.getSplitPoints().get(i));
}
if (movin) {
pa[pFeature.getSplitPoints().size()] = lastPoint;
// pa[p.getSplitPoints().size()+1]=p.getFirstSplitHandle();
} else {
// pa[p.getSplitPoints().size()]=p.getFirstSplitHandle();
}
return pa;
}
}