package org.esa.snap.rcp.placemark;
import org.esa.snap.core.datamodel.Placemark;
import org.esa.snap.core.datamodel.PlacemarkDescriptor;
import org.esa.snap.core.datamodel.PlacemarkGroup;
import org.esa.snap.core.datamodel.Product;
import javax.swing.undo.AbstractUndoableEdit;
import java.util.List;
/**
* @author Tonio Fincke
*/
class UndoablePlacemarkActionFactory {
static UndoablePlacemarkAction createUndoablePlacemarkRemoval(Product product, List<Placemark> placemarks,
PlacemarkDescriptor placemarkDescriptor) {
return new UndoablePlacemarkAction(new UndoablePlacemarkRemovalStrategy(product, placemarks, placemarkDescriptor));
}
static UndoablePlacemarkAction createUndoablePlacemarkInsertion(Product product, Placemark placemark,
PlacemarkDescriptor placemarkDescriptor) {
return new UndoablePlacemarkAction(new UndoablePlacemarkInsertionStrategy(product, placemark, placemarkDescriptor));
}
static UndoablePlacemarkAction createUndoablePlacemarkCopying(Product product, Placemark placemark,
PlacemarkDescriptor placemarkDescriptor) {
return new UndoablePlacemarkAction(new UndoablePlacemarkCopyingStrategy(product, placemark, placemarkDescriptor));
}
static UndoablePlacemarkAction createUndoablePlacemarkEditing(Product product, Placemark oldPlacemark, Placemark newPlacemark,
PlacemarkDescriptor placemarkDescriptor) {
return new UndoablePlacemarkAction(new UndoablePlacemarkEditingStrategy(product, oldPlacemark, newPlacemark, placemarkDescriptor));
}
private static class UndoablePlacemarkAction extends AbstractUndoableEdit {
private UndoablePlacemarkActionStrategy strategy;
public UndoablePlacemarkAction(UndoablePlacemarkActionStrategy strategy) {
this.strategy = strategy;
}
@Override
public void undo() {
super.undo();
strategy.undo();
}
@Override
public void redo() {
super.redo();
strategy.redo();
}
@Override
public String getPresentationName() {
return strategy.getPresentationName();
}
@Override
public void die() {
super.die();
strategy = null;
}
}
private interface UndoablePlacemarkActionStrategy {
void undo();
void redo();
String getPresentationName();
}
private static class UndoablePlacemarkInsertionStrategy implements UndoablePlacemarkActionStrategy {
private Product product;
private Placemark newPlacemark;
private PlacemarkDescriptor placemarkDescriptor;
UndoablePlacemarkInsertionStrategy(Product product, Placemark newPlacemark, PlacemarkDescriptor placemarkDescriptor) {
this.product = product;
this.newPlacemark = newPlacemark;
this.placemarkDescriptor = placemarkDescriptor;
}
@Override
public void undo() {
placemarkDescriptor.getPlacemarkGroup(product).remove(newPlacemark);
}
@Override
public void redo() {
placemarkDescriptor.getPlacemarkGroup(product).add(newPlacemark);
}
@Override
public String getPresentationName() {
return "Insert " + placemarkDescriptor.getRoleLabel();
}
}
private static class UndoablePlacemarkCopyingStrategy implements UndoablePlacemarkActionStrategy {
private Product product;
private Placemark newPlacemark;
private PlacemarkDescriptor placemarkDescriptor;
UndoablePlacemarkCopyingStrategy(Product product, Placemark newPlacemark, PlacemarkDescriptor placemarkDescriptor) {
this.product = product;
this.newPlacemark = newPlacemark;
this.placemarkDescriptor = placemarkDescriptor;
}
@Override
public void undo() {
placemarkDescriptor.getPlacemarkGroup(product).remove(newPlacemark);
}
@Override
public void redo() {
placemarkDescriptor.getPlacemarkGroup(product).add(newPlacemark);
}
@Override
public String getPresentationName() {
return "Copying " + placemarkDescriptor.getRoleLabel();
}
}
//todo does not work satisfyingly yet -> placemarks are added to the end of the table
private static class UndoablePlacemarkEditingStrategy implements UndoablePlacemarkActionStrategy {
private final Placemark oldPlacemark;
private Product product;
private Placemark newPlacemark;
private Placemark placemarkInView;
private PlacemarkDescriptor placemarkDescriptor;
UndoablePlacemarkEditingStrategy(Product product, Placemark oldPlacemark, Placemark newPlacemark, PlacemarkDescriptor placemarkDescriptor) {
this.product = product;
this.oldPlacemark = oldPlacemark;
this.newPlacemark = Placemark.createPointPlacemark(newPlacemark.getDescriptor(),
newPlacemark.getName(),
newPlacemark.getLabel(),
newPlacemark.getDescription(),
newPlacemark.getPixelPos(),
newPlacemark.getGeoPos(),
newPlacemark.getProduct().getSceneGeoCoding());
placemarkInView = newPlacemark;
this.placemarkDescriptor = placemarkDescriptor;
}
@Override
public void undo() {
placemarkInView.setName(oldPlacemark.getName());
placemarkInView.setLabel(oldPlacemark.getLabel());
placemarkInView.setDescription(oldPlacemark.getDescription());
placemarkInView.setGeoPos(oldPlacemark.getGeoPos());
placemarkInView.setStyleCss(oldPlacemark.getStyleCss());
}
@Override
public void redo() {
placemarkInView.setName(newPlacemark.getName());
placemarkInView.setLabel(newPlacemark.getLabel());
placemarkInView.setDescription(newPlacemark.getDescription());
placemarkInView.setGeoPos(newPlacemark.getGeoPos());
placemarkInView.setStyleCss(newPlacemark.getStyleCss());
}
@Override
public String getPresentationName() {
return "Editing " + placemarkDescriptor.getRoleLabel();
}
}
private static class UndoablePlacemarkRemovalStrategy implements UndoablePlacemarkActionStrategy {
private final List<Placemark> placemarks;
private Product product;
private PlacemarkDescriptor placemarkDescriptor;
UndoablePlacemarkRemovalStrategy(Product product, List<Placemark> placemarks, PlacemarkDescriptor placemarkDescriptor) {
this.product = product;
this.placemarks = placemarks;
this.placemarkDescriptor = placemarkDescriptor;
}
@Override
public void undo() {
final PlacemarkGroup placemarkGroup = placemarkDescriptor.getPlacemarkGroup(product);
for (Placemark placemark : placemarks) {
placemarkGroup.add(placemark);
}
}
@Override
public void redo() {
final PlacemarkGroup placemarkGroup = placemarkDescriptor.getPlacemarkGroup(product);
for (Placemark placemark : placemarks) {
placemarkGroup.remove(placemark);
}
}
@Override
public String getPresentationName() {
return "Removing " + placemarkDescriptor.getRoleLabel();
}
}
}