package org.openstreetmap.josm.plugins.piclayer.command;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.util.Collection;
import javax.swing.Icon;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.command.Command;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.plugins.piclayer.layer.PicLayerAbstract;
import org.openstreetmap.josm.plugins.piclayer.transform.PictureTransform;
import org.openstreetmap.josm.tools.ImageProvider;
public class TransformCommand extends Command {
private PicLayerAbstract layer;
private PictureTransform beforeTransform;
private PictureTransform afterTransform;
private String actionName;
public TransformCommand(PicLayerAbstract layer, String actionName) {
this.layer = layer;
this.actionName = actionName;
beforeTransform = extractTransform();
}
@Override
public void fillModifiedData(Collection<OsmPrimitive> modified,
Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
}
@Override
public boolean executeCommand() {
placeTransform(afterTransform);
Main.map.mapView.repaint();
return true;
}
@Override
public void undoCommand() {
placeTransform(beforeTransform);
Main.map.mapView.repaint();
}
private void placeTransform(PictureTransform transform) {
layer.getTransformer().setTransform(transform.getTransform());
layer.getTransformer().setOriginPoints(transform.getOriginPoints());
layer.getTransformer().setImagePosition(transform.getImagePosition());
}
private PictureTransform extractTransform() {
PictureTransform transform = new PictureTransform();
transform.setOriginPoints(layer.getTransformer().getOriginPoints());
transform.setTransform(layer.getTransformer().getTransform());
transform.setImagePosition(layer.getTransformer().getImagePosition());
return transform;
}
@Override
public boolean invalidBecauselayerRemoved(Layer oldLayer) {
return oldLayer == layer;
}
@Override
public Icon getDescriptionIcon() {
return ImageProvider.get("layericon");
}
@Override
public String getDescriptionText() {
return tr("PicLayer: {0}", actionName);
}
private boolean alreadyAdded = false;
public void addIfChanged() {
afterTransform = extractTransform();
boolean changed = !(beforeTransform.getTransform().equals(afterTransform.getTransform())) ||
!(beforeTransform.getOriginPoints().equals(afterTransform.getOriginPoints())) ||
!(beforeTransform.getImagePosition().equals(afterTransform.getImagePosition()));
if (changed && !alreadyAdded) {
Main.main.undoRedo.add(this);
alreadyAdded = true;
}
}
}