package org.jabref.gui.undo; import javax.swing.undo.CannotUndoException; import javax.swing.undo.UndoManager; import javax.swing.undo.UndoableEdit; import org.jabref.logic.l10n.Localization; import org.jabref.logic.undo.AddUndoableActionEvent; import org.jabref.logic.undo.UndoRedoEvent; import com.google.common.eventbus.EventBus; public class CountingUndoManager extends UndoManager { private int unchangedPoint; private int current; private final EventBus eventBus = new EventBus(); @Override public synchronized boolean addEdit(UndoableEdit edit) { current++; boolean returnvalue = super.addEdit(edit); postAddUndoEvent(); return returnvalue; } @Override public synchronized void undo() throws CannotUndoException { super.undo(); current--; postUndoRedoEvent(); } @Override public synchronized void redo() throws CannotUndoException { super.redo(); current++; postUndoRedoEvent(); } public synchronized void markUnchanged() { unchangedPoint = current; } public synchronized boolean hasChanged() { return (current != unchangedPoint); } public void registerListener(Object object) { this.eventBus.register(object); postUndoRedoEvent(); // Send event to trigger changes } public void unregisterListener(Object object) { this.eventBus.unregister(object); } public void postUndoRedoEvent() { boolean canRedo = this.canRedo(); boolean canUndo = this.canUndo(); eventBus.post(new UndoRedoEvent(canUndo, canUndo ? getUndoPresentationName() : Localization.lang("Undo"), canRedo, canRedo ? getRedoPresentationName() : Localization.lang("Redo"))); } private void postAddUndoEvent() { boolean canRedo = this.canRedo(); boolean canUndo = this.canUndo(); eventBus.post(new AddUndoableActionEvent(canUndo, canUndo ? getUndoPresentationName() : Localization.lang("Undo"), canRedo, canRedo ? getRedoPresentationName() : Localization.lang("Redo"))); } }