1 21 22 package org.armedbear.j; 23 24 import javax.swing.undo.AbstractUndoableEdit ; 25 26 public class UndoMove extends AbstractUndoableEdit implements Constants 27 { 28 private final State preState; 29 private State postState; 30 31 public UndoMove(Editor editor) 32 { 33 preState = new State(editor); 34 } 35 36 public void undo() 37 { 38 super.undo(); 39 final Editor editor = Editor.currentEditor(); 40 postState = new State(editor); 41 preState.restoreState(editor); 42 editor.setUpdateFlag(REFRAME); 43 } 44 45 public void redo() 46 { 47 super.redo(); 48 final Editor editor = Editor.currentEditor(); 49 postState.restoreState(editor); 50 editor.setUpdateFlag(REFRAME); 51 } 52 53 private static class State 54 { 55 final int dotLineNumber; 56 final int dotOffset; 57 final int markLineNumber; 58 final int markOffset; 59 final int absCaretCol; 60 final boolean isColumnSelection; 61 62 State(Editor editor) 63 { 64 dotLineNumber = editor.getDotLine().lineNumber();; 65 dotOffset = editor.getDotOffset(); 66 Position mark = editor.getMark(); 67 if (mark != null) { 68 markLineNumber = mark.lineNumber(); 69 markOffset = mark.getOffset(); 70 } else { 71 markLineNumber = -1; 72 markOffset = -1; 73 } 74 absCaretCol = editor.getAbsoluteCaretCol(); 75 isColumnSelection = editor.isColumnSelection(); 76 } 77 78 void restoreState(Editor editor) 79 { 80 boolean wasMarked = editor.getMark() != null; 81 editor.updateDotLine(); 82 editor.setDot(dotLineNumber, dotOffset); 83 if (markLineNumber >= 0) { 84 editor.setMark(markLineNumber, markOffset); 85 editor.setColumnSelection(isColumnSelection); 86 } else 87 editor.setMark(null); 88 editor.updateDotLine(); 89 final Display display = editor.getDisplay(); 90 display.setCaretCol(absCaretCol - display.getShift()); 91 if (wasMarked || editor.getMark() != null) 92 display.setUpdateFlag(REPAINT); 93 } 94 } 95 } 96 | Popular Tags |