KickJava   Java API By Example, From Geeks To Geeks.

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


1 /*
2  * UndoDeleteRegion.java
3  *
4  * Copyright (C) 2002-2003 Peter Graves
5  * $Id: UndoDeleteRegion.java,v 1.4 2003/06/11 15:07:24 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 class UndoDeleteRegion extends AbstractUndoableEdit JavaDoc
28     implements Constants, UndoableEdit JavaDoc
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 was changed.
52
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 was changed.
69
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         // Undo.
106
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         // Redo the deletion.
162
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             // Markers!!
184

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