/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* HandleMoveAction.java
*
* Created on 11. Dezember 2007, 09:14
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package de.cismet.cismap.commons.gui.piccolo.eventlistener.actions;
import edu.umd.cs.piccolo.PLayer;
import java.util.Collection;
import java.util.Set;
import java.util.Vector;
import de.cismet.cismap.commons.features.DefaultFeatureCollection;
import de.cismet.cismap.commons.features.Feature;
import de.cismet.cismap.commons.gui.piccolo.PFeature;
import de.cismet.tools.collections.MultiMap;
/**
* Implementiert das CustomAction-Interface und wird von der Memento-Klasse verwendet, um ein Handle, das vom Benutzer
* bewegt wurde wieder an den Uersprungsort zur\u00FCckverschoben wird.
*
* @author nh
* @version $Revision$, $Date$
*/
public class HandleMoveAction implements CustomAction {
//~ Instance fields --------------------------------------------------------
private MultiMap gluedCoordinates;
private PFeature pf;
private final int entityPosition;
private final int ringPosition;
private final int coordPosition;
private float startX;
private float startY;
private float endX;
private float endY;
private boolean isGluedAction;
//~ Constructors -----------------------------------------------------------
/**
* Erzeugt eine HandleMoveAction-Instanz.
*
* @param entityPosition DOCUMENT ME!
* @param ringPosition DOCUMENT ME!
* @param coordPosition Position der HandleKoordinaten im Koordinatenarray des PFeatures
* @param pf PFeature dem das Handle zugeordnet ist
* @param startX X-Koordinate des Anfangspunkts
* @param startY Y-Koordinate des Anfangspunkts
* @param endX X-Koordinate des Endpunkts
* @param endY Y-Koordinate des Endpunkts
* @param isGlued Waren beim Verschieben mehrere Handles gekoppelt?
*/
public HandleMoveAction(final int entityPosition,
final int ringPosition,
final int coordPosition,
final PFeature pf,
final float startX,
final float startY,
final float endX,
final float endY,
final boolean isGlued) {
this.gluedCoordinates = null;
this.entityPosition = entityPosition;
this.ringPosition = ringPosition;
this.coordPosition = coordPosition;
this.pf = pf;
this.startX = startX;
this.startY = startY;
this.endX = endX;
this.endY = endY;
this.isGluedAction = isGlued;
}
//~ Methods ----------------------------------------------------------------
/**
* Bewegt das gespeicherte PHandle von der Start- zur Zielkoordinate.
*/
@Override
public void doAction() {
if (isGluedAction) { // werden mehrere Punkte bewegt?
gluedCoordinates = pf.checkforGlueCoords(entityPosition, ringPosition, coordPosition);
}
// Bewege das Handle
pf.moveCoordinateToNewPiccoloPosition(entityPosition, ringPosition, coordPosition, startX, startY);
// Falls zusammengeh\u00F6rige Punkte gefunden wurden, bewege diese ebenfalls
if (gluedCoordinates != null) {
final Set<PFeature> pFeatureSet = gluedCoordinates.keySet();
for (final PFeature gluePFeature : pFeatureSet) {
if (gluePFeature.getFeature().isEditable()) {
final Collection coordinates = (Collection)gluedCoordinates.get(gluePFeature);
if (coordinates != null) {
for (final Object o : coordinates) {
final int oIndex = (Integer)o;
gluePFeature.moveCoordinateToNewPiccoloPosition(
entityPosition,
ringPosition,
oIndex,
startX,
startY,
false);
}
gluePFeature.updatePath();
}
}
}
}
// Aktualisiere Handles durch entfernen und neu erstellen
// (nur wenn das PFeature auch selektiert ist)
if (pf.isSelected()) {
final PLayer handleLayer = pf.getViewer().getHandleLayer();
handleLayer.removeAllChildren();
pf.addHandles(handleLayer);
}
pf.syncGeometry();
final Vector v = new Vector();
v.add(pf.getFeature());
((DefaultFeatureCollection)pf.getViewer().getFeatureCollection()).fireFeaturesChanged(v);
}
/**
* Liefert eine Beschreibung der Aktion als String.
*
* @return Beschreibungsstring
*/
@Override
public String info() {
return org.openide.util.NbBundle.getMessage(
HandleMoveAction.class,
"HandleMoveAction.info().return",
new Object[] { new Float(startX).intValue(), new Float(startY).intValue() }); // NOI18N
}
/**
* Liefert als Gegenteil die Bewegung des Handles in die andere Richtung.
*
* @return gegenteilige HandleMoveAction
*/
@Override
public CustomAction getInverse() {
return new HandleMoveAction(
entityPosition,
ringPosition,
coordPosition,
pf,
endX,
endY,
startX,
startY,
isGluedAction);
}
@Override
public boolean featureConcerned(final Feature feature) {
return (pf != null) && pf.getFeature().equals(feature);
}
}