package com.yoursway.ide.undo; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.ObjectInputStream; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.ui.IMemento; import org.eclipse.ui.IPersistableElement; import org.eclipse.ui.XMLMemento; public class OperationHistory implements IPersistableElement { private final List<IUndoableOperation> operations = Collections .synchronizedList(new ArrayList<IUndoableOperation>()); private final OperationHistoryListenerList listeners = new OperationHistoryListenerList(); private boolean locked; private static OperationHistory instance; private OperationHistory() { } public static OperationHistory get() { if (instance == null) { instance = new OperationHistory(); } return instance; } public void execute(IUndoableOperation operation) { operation.execute(); if (!locked) { if (operations.size() > 0) { IUndoableOperation last = operations.get(operations.size() - 1); boolean merged = operation.tryToMergeWith(last); if (merged) { operations.remove(last); listeners.remove(last); } } operations.add(operation); listeners.add(operation); } } public IUndoableOperation[] getUndoHistory() { return operations.toArray(new IUndoableOperation[0]); } public void undo(IUndoableOperation operation) { locked = true; operation.undo(); operations.remove(operation); listeners.remove(operation); locked = false; } public void undoLastOperation() { IUndoableOperation lastOperation = operations.get(operations.size() - 1); undo(lastOperation); } public void addListener(IOperationHistoryListener listener) { listeners.addListener(listener); } public String getFactoryId() { // TODO Auto-generated method stub return null; } public void saveState(IMemento memento) { for (IUndoableOperation operation : operations) { memento.putMemento(MyMemento.forPersistableElement(operation)); } } public static void init(IMemento memento) { OperationHistory history = get(); IMemento[] children = memento.getChildren("UndoableTextChange"); for (IMemento child : children) { history.operations.add(UndoableTextChange.from(child)); } } }