KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > armedbear > j > UndoRemoveLine


1 /*
2  * UndoRemoveLine.java
3  *
4  * Copyright (C) 2002-2003 Peter Graves
5  * $Id: UndoRemoveLine.java,v 1.4 2003/06/11 15:06:42 piso Exp $
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  */

21
22 package org.armedbear.j;
23
24 import javax.swing.undo.AbstractUndoableEdit JavaDoc;
25 import javax.swing.undo.UndoableEdit JavaDoc;
26
27 public final class UndoRemoveLine extends AbstractUndoableEdit JavaDoc
28     implements Constants, UndoableEdit JavaDoc
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 was changed.
51
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 was changed.
69
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         // Undo remove line.
103
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             // Markers!!
123

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         // Redo remove line.
153
void restoreState(Editor editor)
154         {
155             final Buffer buffer = editor.getBuffer();
156
157             Line remove;
158             if (insertBefore) {
159                 // Remove line before dot.
160
remove = editor.getDotLine().previous();
161             } else {
162                 // Remove line after dot.
163
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             // Markers!!
175

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