1 21 22 package org.armedbear.j; 23 24 import javax.swing.undo.AbstractUndoableEdit ; 25 import javax.swing.undo.UndoableEdit ; 26 27 public class UndoDeleteRegion extends AbstractUndoableEdit 28 implements Constants, UndoableEdit 29 { 30 private final PreState preState; 31 private PostState postState; 32 private final LineSequence lines; 33 34 public UndoDeleteRegion(Editor editor, Region r) 35 { 36 Debug.assertTrue(!editor.isColumnSelection()); 37 preState = new PreState(editor); 38 lines = new LineSequence(r.getBeginLine(), r.getEndLine()); 39 } 40 41 public void undo() 42 { 43 super.undo(); 44 final Editor editor = Editor.currentEditor(); 45 final Buffer buffer = editor.getBuffer(); 46 postState = new PostState(editor); 47 preState.restoreState(editor); 48 editor.setUpdateFlag(REFRAME); 49 50 if (postState.modificationCount != preState.modificationCount) { 51 buffer.invalidate(); 53 Sidebar.setUpdateFlagInAllFrames(SIDEBAR_MODIFIED_BUFFER_COUNT | 54 SIDEBAR_REPAINT_BUFFER_LIST); 55 Sidebar.repaintBufferListInAllFrames(); 56 } 57 } 58 59 public void redo() 60 { 61 super.redo(); 62 final Editor editor = Editor.currentEditor(); 63 final Buffer buffer = editor.getBuffer(); 64 postState.restoreState(editor); 65 editor.setUpdateFlag(REFRAME); 66 67 if (postState.modificationCount != preState.modificationCount) { 68 buffer.invalidate(); 70 Sidebar.setUpdateFlagInAllFrames(SIDEBAR_MODIFIED_BUFFER_COUNT | 71 SIDEBAR_REPAINT_BUFFER_LIST); 72 Sidebar.repaintBufferListInAllFrames(); 73 } 74 } 75 76 private class PreState 77 { 78 final int dotLineNumber; 79 final int dotOffset; 80 final int markLineNumber; 81 final int markOffset; 82 final int absCaretCol; 83 final int modificationCount; 84 final boolean modified; 85 86 PreState(Editor editor) 87 { 88 final Line dotLine = editor.getDotLine(); 89 dotLineNumber = dotLine.lineNumber(); 90 dotOffset = editor.getDotOffset(); 91 absCaretCol = editor.getAbsoluteCaretCol(); 92 Position mark = editor.getMark(); 93 if (mark != null) { 94 markLineNumber = mark.lineNumber(); 95 markOffset = mark.getOffset(); 96 } else { 97 markLineNumber = -1; 98 markOffset = -1; 99 } 100 final Buffer buffer = editor.getBuffer(); 101 modificationCount = buffer.getModCount(); 102 modified = buffer.isModified(); 103 } 104 105 void restoreState(Editor editor) 107 { 108 final Buffer buffer = editor.getBuffer(); 109 110 final Line dotLine = editor.getDotLine(); 111 final Line before = dotLine.previous(); 112 final Line after = dotLine.next(); 113 114 editor.adjustMarkers(dotLine); 115 116 Line first = lines.getFirstLine(); 117 Line last = lines.getLastLine(); 118 first.setPrevious(before); 119 if (before != null) 120 before.setNext(first); 121 else 122 buffer.setFirstLine(first); 123 last.setNext(after); 124 if (after != null) 125 after.setPrevious(last); 126 127 buffer.setModCount(modificationCount); 128 129 buffer.needsRenumbering = true; 130 buffer.renumber(); 131 132 editor.setDot(dotLineNumber, dotOffset); 133 editor.setMark(markLineNumber, markOffset); 134 final Display display = editor.getDisplay(); 135 display.setCaretCol(absCaretCol - display.getShift()); 136 display.setUpdateFlag(REPAINT); 137 } 138 } 139 140 private class PostState 141 { 142 final int dotLineNumber; 143 final int dotOffset; 144 final int absCaretCol; 145 final int modificationCount; 146 final boolean modified; 147 final Line line; 148 149 PostState(Editor editor) 150 { 151 final Line dotLine = editor.getDotLine(); 152 dotLineNumber = dotLine.lineNumber(); 153 dotOffset = editor.getDotOffset(); 154 absCaretCol = editor.getAbsoluteCaretCol(); 155 final Buffer buffer = editor.getBuffer(); 156 modificationCount = buffer.getModCount(); 157 modified = buffer.isModified(); 158 line = dotLine.copy(); 159 } 160 161 void restoreState(Editor editor) 163 { 164 final Buffer buffer = editor.getBuffer(); 165 166 final Line before = editor.getDotLine().previous(); 167 Line after = editor.getDotLine(); 168 for (int i = 0; i < lines.size(); i++) { 169 after = after.next(); 170 if (after == null) 171 break; 172 } 173 174 final Line restored = line.copy(); 175 restored.setPrevious(before); 176 if (before != null) 177 before.setNext(restored); 178 else 179 buffer.setFirstLine(restored); 180 restored.setNext(after); 181 if (after != null) 182 after.setPrevious(restored); 183 185 buffer.setModCount(modificationCount); 186 187 buffer.needsRenumbering = true; 188 buffer.renumber(); 189 190 editor.setDot(restored, dotOffset); 191 editor.setMark(null); 192 final Display display = editor.getDisplay(); 193 display.setCaretCol(absCaretCol - display.getShift()); 194 display.setUpdateFlag(REPAINT); 195 } 196 } 197 } 198 | Popular Tags |