145 lines
3.6 KiB
Java
145 lines
3.6 KiB
Java
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.
|
|
* <p>
|
|
* 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 <C> the change type to store in this change manager
|
|
* @param <M> the type of change manager to wrap
|
|
* @author Kai S. K. Engelbart
|
|
* @since 0.0.1
|
|
*/
|
|
public class ChangeManagerWrapper<C extends Change, M extends ChangeManager<C>>
|
|
implements ObservableChangeManager<C> {
|
|
|
|
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<C> 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<C> 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<C> getChanges() {
|
|
return manager.getChanges();
|
|
}
|
|
}
|