1 21 22 package org.armedbear.j; 23 24 import javax.swing.undo.AbstractUndoableEdit ; 25 import javax.swing.undo.UndoableEdit ; 26 27 public final class UndoRemoveLine extends AbstractUndoableEdit 28 implements Constants, UndoableEdit 29 { 30 private final boolean insertBefore; 31 private final PreState preState; 32 private PostState postState; 33 34 public UndoRemoveLine(Editor editor, boolean insertBefore) 35 { 36 this.insertBefore = insertBefore; 37 preState = new PreState(editor); 38 } 39 40 public void undo() 41 { 42 super.undo(); 43 final Editor editor = Editor.currentEditor(); 44 final Buffer buffer = editor.getBuffer(); 45 postState = new PostState(editor); 46 preState.restoreState(editor); 47 editor.setUpdateFlag(REFRAME); 48 49 if (postState.modificationCount != preState.modificationCount) { 50 buffer.invalidate(); 52 Sidebar.setUpdateFlagInAllFrames(SIDEBAR_MODIFIED_BUFFER_COUNT | 53 SIDEBAR_REPAINT_BUFFER_LIST); 54 Sidebar.repaintBufferListInAllFrames(); 55 } 56 buffer.repaint(); 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 buffer.repaint(); 75 } 76 77 private class PreState 78 { 79 final int dotLineNumber; 80 final int dotOffset; 81 final int absCaretCol; 82 final int modificationCount; 83 final boolean modified; 84 final Line line; 85 86 PreState(Editor editor) 87 { 88 final Line dotLine = editor.getDotLine(); 89 dotLineNumber = dotLine.lineNumber(); 90 dotOffset = editor.getDotOffset(); 91 Debug.assertTrue(dotOffset == 0); 92 absCaretCol = editor.getAbsoluteCaretCol(); 93 final Buffer buffer = editor.getBuffer(); 94 modificationCount = buffer.getModCount(); 95 modified = buffer.isModified(); 96 97 final Line toBeRemoved = insertBefore ? dotLine.previous() : dotLine.next(); 98 Debug.assertTrue(toBeRemoved != null); 99 line = toBeRemoved.copy(); 100 } 101 102 void restoreState(Editor editor) 104 { 105 final Buffer buffer = editor.getBuffer(); 106 Line before, after; 107 if (insertBefore) { 108 before = editor.getDotLine().previous(); 109 after = editor.getDotLine(); 110 } else { 111 before = editor.getDotLine(); 112 after = editor.getDotLine().next(); 113 } 114 line.setPrevious(before); 115 if (before != null) 116 before.setNext(line); 117 else 118 buffer.setFirstLine(line); 119 line.setNext(after); 120 if (after != null) 121 after.setPrevious(line); 122 124 buffer.setModCount(modificationCount); 125 buffer.needsRenumbering = true; 126 buffer.renumber(); 127 128 final Display display = editor.getDisplay(); 129 display.setCaretCol(absCaretCol - display.getShift()); 130 } 131 } 132 133 private class PostState 134 { 135 final int dotLineNumber; 136 final int dotOffset; 137 final int absCaretCol; 138 final int modificationCount; 139 final boolean modified; 140 141 PostState(Editor editor) 142 { 143 final Line dotLine = editor.getDotLine(); 144 dotLineNumber = dotLine.lineNumber(); 145 dotOffset = editor.getDotOffset(); 146 absCaretCol = editor.getAbsoluteCaretCol(); 147 final Buffer buffer = editor.getBuffer(); 148 modificationCount = buffer.getModCount(); 149 modified = buffer.isModified(); 150 } 151 152 void restoreState(Editor editor) 154 { 155 final Buffer buffer = editor.getBuffer(); 156 157 Line remove; 158 if (insertBefore) { 159 remove = editor.getDotLine().previous(); 161 } else { 162 remove = editor.getDotLine().next(); 164 } 165 final Line before = remove.previous(); 166 final Line after = remove.next(); 167 168 if (before != null) 169 before.setNext(after); 170 else 171 buffer.setFirstLine(after); 172 if (after != null) 173 after.setPrevious(before); 174 176 buffer.setModCount(modificationCount); 177 buffer.needsRenumbering = true; 178 buffer.renumber(); 179 180 editor.setDot(dotLineNumber, dotOffset); 181 final Display display = editor.getDisplay(); 182 display.setCaretCol(absCaretCol - display.getShift()); 183 184 for (EditorIterator it = new EditorIterator(); it.hasNext();) { 185 Editor ed = it.nextEditor(); 186 if (ed.getTopLine() == remove) 187 ed.setTopLine(editor.getDotLine()); 188 } 189 } 190 } 191 } 192 | Popular Tags |