package dev.kske.undoredo.javafx; import java.util.List; import javafx.beans.property.*; import dev.kske.undoredo.core.*; /** * Wraps an ordinary change manager into an observable change manager, providing the required * properties for concrete implementations. *

* The properties have the same name as their corresponding {@code -property()} methods and can be * accessed reflectively from JavaFX, e.g. through * {@link javafx.beans.binding.Bindings#select(Object, String...)}. Alternatively, the property * names are available as constants. * * @param the change type to store in this change manager * @param the type of change manager to wrap * @author Kai S. K. Engelbart * @since 0.0.1 */ public class ChangeManagerWrapper> implements ObservableChangeManager { public static final String LAST_CHANGE = "lastChange"; public static final String AT_MARKED_CHANGE = "atMarkedChange"; public static final String UNDO_AVAILABLE = "undoAvailable"; public static final String REDO_AVAILABLE = "redoAvailable"; protected final ReadOnlyObjectWrapper lastChange = new ReadOnlyObjectWrapper<>(this, LAST_CHANGE); protected final ReadOnlyBooleanWrapper atMarkedChange = new ReadOnlyBooleanWrapper(this, AT_MARKED_CHANGE); protected final ReadOnlyBooleanWrapper undoAvailable = new ReadOnlyBooleanWrapper(this, UNDO_AVAILABLE); protected final ReadOnlyBooleanWrapper redoAvailable = new ReadOnlyBooleanWrapper(this, REDO_AVAILABLE); protected final M manager; /** * Initializes a change manager wrapper. * * @param manager the change manager to wrap * @since 0.0.1 */ public ChangeManagerWrapper(M manager) { this.manager = manager; updateProperties(); } @Override public boolean addChange(C change) { if (manager.addChange(change)) { updateProperties(); return true; } return false; } @Override public boolean undo() { if (manager.undo()) { updateProperties(); return true; } return false; } @Override public boolean redo() { if (manager.redo()) { updateProperties(); return true; } return false; } @Override public void mark() { manager.mark(); setAtMarkedChange(manager.isAtMarkedChange()); } @Override public void unmark() { manager.unmark(); setAtMarkedChange(manager.isAtMarkedChange()); } /** * Sets the values of all properties to those present in the wrapped change manager. * * @since 0.0.1 */ private void updateProperties() { setLastChange(manager.getLastChange().orElse(null)); setAtMarkedChange(manager.isAtMarkedChange()); setUndoAvailable(manager.isUndoAvailable()); setRedoAvailable(manager.isRedoAvailable()); } @Override public final ReadOnlyObjectProperty lastChangeProperty() { return lastChange.getReadOnlyProperty(); } protected final void setLastChange(C lastChange) { this.lastChange.set(lastChange); } @Override public final ReadOnlyBooleanProperty atMarkedChangeProperty() { return atMarkedChange.getReadOnlyProperty(); } protected final void setAtMarkedChange(boolean atMarkedChange) { this.atMarkedChange.set(atMarkedChange); } @Override public final ReadOnlyBooleanProperty undoAvailableProperty() { return undoAvailable.getReadOnlyProperty(); } protected final void setUndoAvailable(boolean undoAvailable) { this.undoAvailable.set(undoAvailable); } @Override public final ReadOnlyBooleanProperty redoAvailableProperty() { return redoAvailable.getReadOnlyProperty(); } protected final void setRedoAvailable(boolean redoAvailable) { this.redoAvailable.set(redoAvailable); } @Override public List getChanges() { return manager.getChanges(); } }