/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* FeatureMoveAction.java
*
* Created on 6. Dezember 2007, 12:13
*
* 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.util.PDimension;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import de.cismet.cismap.commons.features.DefaultFeatureCollection;
import de.cismet.cismap.commons.features.Feature;
import de.cismet.cismap.commons.gui.MappingComponent;
import de.cismet.cismap.commons.gui.piccolo.PFeature;
/**
* Implementiert das CustomAction-Interface und wird von der Memento-Klasse verwendet, um ein (oder mehrere) vom
* Benutzer verschobenes Feature an den Ursprungsort zu verschieben.
*
* @author nh
* @version $Revision$, $Date$
*/
public class FeatureMoveAction implements CustomAction {
//~ Instance fields --------------------------------------------------------
private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass());
private MappingComponent mc;
private List<PFeature> features;
private PDimension dim;
//~ Constructors -----------------------------------------------------------
/**
* Erzeugt eine FeatureMoveAction-Instanz.
*
* @param mc MappingComponent auf dem die PFeatures bewegt werden
* @param features Vektor mit allen bewegten Features
* @param dim PDimension-Objekt das die Bewegung darstellt
* @param dimensionInPixel DOCUMENT ME!
*/
public FeatureMoveAction(final MappingComponent mc,
final List<PFeature> features,
final PDimension dim,
final boolean dimensionInPixel) {
this.mc = mc;
this.features = features;
if (dimensionInPixel) {
this.dim = createDimension(dim, false);
} else {
this.dim = dim;
}
}
//~ Methods ----------------------------------------------------------------
/**
* Bewegt das Feature.
*/
@Override
public void doAction() {
if (log.isDebugEnabled()) {
log.debug("X=" + dim.getWidth()); // NOI18N
}
if (log.isDebugEnabled()) {
log.debug("Y=" + dim.getHeight()); // NOI18N
}
final Iterator<PFeature> it = features.iterator();
while (it.hasNext()) {
final PFeature o = it.next();
if (((PFeature)o).getFeature().isEditable()
&& ((PFeature)o).getFeature().canBeSelected()) {
PFeature f = (PFeature)o;
// the pfeature from the map should be used. Otherwise, the undo/redo buttons does not
// work properly (only one polygon of a multi polygon is moved),
// if the featureMoveAction is used in a sequence with the featureAddEntityAction
f = mc.getPFeatureHM().get(f.getFeature());
if (f != null) {
f.moveFeature(createDimension(dim, true));
if (mc.getFeatureCollection() instanceof DefaultFeatureCollection) {
final Vector v = new Vector();
v.add(f.getFeature());
((DefaultFeatureCollection)mc.getFeatureCollection()).fireFeaturesChanged(v);
}
}
}
}
}
/**
* Liefert eine Beschreibung der Aktion als String.
*
* @return Beschreibungsstring
*/
@Override
public String info() {
return org.openide.util.NbBundle.getMessage(
FeatureMoveAction.class,
"FeatureMoveAction.info().return",
new Object[] { dim.getWidth(), dim.getHeight() }); // NOI18N
}
/**
* Liefert die gegenteilige Bewegungsaktion.
*
* @return gegenteilige Bewegungsaktion
*/
@Override
public CustomAction getInverse() {
final PDimension inverseDim = new PDimension(dim.getWidth() * (-1), dim.getHeight() * (-1));
return new FeatureMoveAction(mc, features, inverseDim, false);
}
/**
* Berechnet Pixelwerte zu PCanvas-Koordinaten und umgekehrt.
*
* @param dim umzurechnendes PDimension-Objekt
* @param toPixel boolean-Variable zur Angabe der Berechnungsrichtung
*
* @return PDimension-Objekt mit umgerechneten Werten
*/
private PDimension createDimension(final PDimension dim, final boolean toPixel) {
final double scale = mc.getCamera().getViewScale();
PDimension newDim;
if (toPixel) {
newDim = new PDimension(dim.getWidth() * scale, dim.getHeight() * scale);
} else {
newDim = new PDimension(dim.getWidth() / scale, dim.getHeight() / scale);
}
return newDim;
}
@Override
public boolean featureConcerned(final Feature feature) {
for (final PFeature f : features) {
if (f.getFeature().equals(feature)) {
return true;
}
}
return false;
}
}