package com.yoursway.ide.undo; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.DocumentEvent; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IMemento; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; public class UndoableTextChange implements IUndoableOperation { private MyDocumentEvent event; private String replacedText; public UndoableTextChange(DocumentEvent event, String replacedText) { this.event = new MyDocumentEvent(event); this.replacedText = replacedText; } private UndoableTextChange(MyDocumentEvent event, String replacedText) { this.event = event; this.replacedText = replacedText; } public void execute() { // nothing to do } @SuppressWarnings("restriction") public void undo() { //if (fDocumentUndoManager.fDocument instanceof IDocumentExtension4) // ((IDocumentExtension4) fDocumentUndoManager.fDocument).replace(fStart, fText.length(), // fPreservedText, fUndoModificationStamp); //else try { // open editor for document IWorkbenchWindow window = Activator.getDefault().getWorkbench().getActiveWorkbenchWindow(); //! if (window == null) return null; IWorkbenchPage p = window.getActivePage(); //! if (p == null) throwPartInitException(JavaEditorMessages.EditorUtility_no_active_WorkbenchPage); p.openEditor(event.input(), "com.yoursway.ide.undo.txteditor", true); //initializeHighlightRange(editorPart); - EditorUtility //return editorPart; event.getDocument().replace(event.offset(), event.text().length(), replacedText); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (PartInitException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public String getLabel() { return "some text changed: '" + replacedText + "' to '" + event.text() + "'" + " in " + event.input().getName(); } public String getFactoryId() { // TODO Auto-generated method stub return null; } public void saveState(IMemento parent) { IMemento memento = parent.createChild("UndoableTextChange"); memento.putString("replacedText", replacedText); memento.putMemento(MyMemento.forPersistableElement(event)); } public static UndoableTextChange from(IMemento memento) { MyDocumentEvent event = new MyDocumentEvent(memento.getChild("MyDocumentEvent")); String replacedText = memento.getString("replacedText"); return new UndoableTextChange(event, replacedText); } public boolean tryToMergeWith(IUndoableOperation last) { if (last instanceof UndoableTextChange) { UndoableTextChange merging = (UndoableTextChange)last; if (event.input().equals(merging.event.input()) && replacedText.equals("") && merging.event.offset() + merging.event.text().length() == event.offset()) { replacedText = merging.replacedText; merging.event.setText(merging.event.text() + event.text()); event = merging.event; return true; } if (event.input().equals(merging.event.input()) && event.text().equals("") && merging.event.text().equals("") && event.offset() + replacedText.length() == merging.event.offset()) { replacedText += merging.replacedText; return true; } } return false; } }