129
|
1 /*******************************************************************************
|
|
2 * Copyright (c) 2006, 2008 IBM Corporation and others.
|
|
3 * All rights reserved. This program and the accompanying materials
|
|
4 * are made available under the terms of the Eclipse Public License v1.0
|
|
5 * which accompanies this distribution, and is available at
|
|
6 * http://www.eclipse.org/legal/epl-v10.html
|
|
7 *
|
|
8 * Contributors:
|
|
9 * IBM Corporation - initial API and implementation
|
|
10 * Port to the D programming language:
|
|
11 * Frank Benoit <benoit@tionex.de>
|
|
12 *******************************************************************************/
|
|
13
|
131
|
14
|
|
15 import dwtx.jface.text.IDocumentPartitioningListener; // packageimport
|
|
16 import dwtx.jface.text.DefaultTextHover; // packageimport
|
|
17 import dwtx.jface.text.AbstractInformationControl; // packageimport
|
|
18 import dwtx.jface.text.TextUtilities; // packageimport
|
|
19 import dwtx.jface.text.IInformationControlCreatorExtension; // packageimport
|
|
20 import dwtx.jface.text.AbstractInformationControlManager; // packageimport
|
|
21 import dwtx.jface.text.ITextViewerExtension2; // packageimport
|
|
22 import dwtx.jface.text.IDocumentPartitioner; // packageimport
|
|
23 import dwtx.jface.text.DefaultIndentLineAutoEditStrategy; // packageimport
|
|
24 import dwtx.jface.text.ITextSelection; // packageimport
|
|
25 import dwtx.jface.text.Document; // packageimport
|
|
26 import dwtx.jface.text.FindReplaceDocumentAdapterContentProposalProvider; // packageimport
|
|
27 import dwtx.jface.text.ITextListener; // packageimport
|
|
28 import dwtx.jface.text.BadPartitioningException; // packageimport
|
|
29 import dwtx.jface.text.ITextViewerExtension5; // packageimport
|
|
30 import dwtx.jface.text.IDocumentPartitionerExtension3; // packageimport
|
|
31 import dwtx.jface.text.IUndoManager; // packageimport
|
|
32 import dwtx.jface.text.ITextHoverExtension2; // packageimport
|
|
33 import dwtx.jface.text.IRepairableDocument; // packageimport
|
|
34 import dwtx.jface.text.IRewriteTarget; // packageimport
|
|
35 import dwtx.jface.text.DefaultPositionUpdater; // packageimport
|
|
36 import dwtx.jface.text.RewriteSessionEditProcessor; // packageimport
|
|
37 import dwtx.jface.text.TextViewerHoverManager; // packageimport
|
|
38 import dwtx.jface.text.DocumentRewriteSession; // packageimport
|
|
39 import dwtx.jface.text.TextViewer; // packageimport
|
|
40 import dwtx.jface.text.ITextViewerExtension8; // packageimport
|
|
41 import dwtx.jface.text.RegExMessages; // packageimport
|
|
42 import dwtx.jface.text.IDelayedInputChangeProvider; // packageimport
|
|
43 import dwtx.jface.text.ITextOperationTargetExtension; // packageimport
|
|
44 import dwtx.jface.text.IWidgetTokenOwner; // packageimport
|
|
45 import dwtx.jface.text.IViewportListener; // packageimport
|
|
46 import dwtx.jface.text.GapTextStore; // packageimport
|
|
47 import dwtx.jface.text.MarkSelection; // packageimport
|
|
48 import dwtx.jface.text.IDocumentPartitioningListenerExtension; // packageimport
|
|
49 import dwtx.jface.text.IDocumentAdapterExtension; // packageimport
|
|
50 import dwtx.jface.text.IInformationControlExtension; // packageimport
|
|
51 import dwtx.jface.text.IDocumentPartitioningListenerExtension2; // packageimport
|
|
52 import dwtx.jface.text.DefaultDocumentAdapter; // packageimport
|
|
53 import dwtx.jface.text.ITextViewerExtension3; // packageimport
|
|
54 import dwtx.jface.text.IInformationControlCreator; // packageimport
|
|
55 import dwtx.jface.text.TypedRegion; // packageimport
|
|
56 import dwtx.jface.text.ISynchronizable; // packageimport
|
|
57 import dwtx.jface.text.IMarkRegionTarget; // packageimport
|
|
58 import dwtx.jface.text.IRegion; // packageimport
|
|
59 import dwtx.jface.text.IInformationControlExtension2; // packageimport
|
|
60 import dwtx.jface.text.IDocumentExtension4; // packageimport
|
|
61 import dwtx.jface.text.IDocumentExtension2; // packageimport
|
|
62 import dwtx.jface.text.IDocumentPartitionerExtension2; // packageimport
|
|
63 import dwtx.jface.text.Assert; // packageimport
|
|
64 import dwtx.jface.text.DefaultInformationControl; // packageimport
|
|
65 import dwtx.jface.text.IWidgetTokenOwnerExtension; // packageimport
|
|
66 import dwtx.jface.text.DocumentClone; // packageimport
|
|
67 import dwtx.jface.text.DefaultUndoManager; // packageimport
|
|
68 import dwtx.jface.text.IFindReplaceTarget; // packageimport
|
|
69 import dwtx.jface.text.IAutoEditStrategy; // packageimport
|
|
70 import dwtx.jface.text.ILineTrackerExtension; // packageimport
|
|
71 import dwtx.jface.text.IUndoManagerExtension; // packageimport
|
|
72 import dwtx.jface.text.TextSelection; // packageimport
|
|
73 import dwtx.jface.text.DefaultAutoIndentStrategy; // packageimport
|
|
74 import dwtx.jface.text.IAutoIndentStrategy; // packageimport
|
|
75 import dwtx.jface.text.IPainter; // packageimport
|
|
76 import dwtx.jface.text.IInformationControl; // packageimport
|
|
77 import dwtx.jface.text.IInformationControlExtension3; // packageimport
|
|
78 import dwtx.jface.text.ITextViewerExtension6; // packageimport
|
|
79 import dwtx.jface.text.IInformationControlExtension4; // packageimport
|
|
80 import dwtx.jface.text.DefaultLineTracker; // packageimport
|
|
81 import dwtx.jface.text.IDocumentInformationMappingExtension; // packageimport
|
|
82 import dwtx.jface.text.IRepairableDocumentExtension; // packageimport
|
|
83 import dwtx.jface.text.ITextHover; // packageimport
|
|
84 import dwtx.jface.text.FindReplaceDocumentAdapter; // packageimport
|
|
85 import dwtx.jface.text.ILineTracker; // packageimport
|
|
86 import dwtx.jface.text.Line; // packageimport
|
|
87 import dwtx.jface.text.ITextViewerExtension; // packageimport
|
|
88 import dwtx.jface.text.IDocumentAdapter; // packageimport
|
|
89 import dwtx.jface.text.TextEvent; // packageimport
|
|
90 import dwtx.jface.text.BadLocationException; // packageimport
|
|
91 import dwtx.jface.text.AbstractDocument; // packageimport
|
|
92 import dwtx.jface.text.AbstractLineTracker; // packageimport
|
|
93 import dwtx.jface.text.TreeLineTracker; // packageimport
|
|
94 import dwtx.jface.text.ITextPresentationListener; // packageimport
|
|
95 import dwtx.jface.text.Region; // packageimport
|
|
96 import dwtx.jface.text.ITextViewer; // packageimport
|
|
97 import dwtx.jface.text.IDocumentInformationMapping; // packageimport
|
|
98 import dwtx.jface.text.MarginPainter; // packageimport
|
|
99 import dwtx.jface.text.IPaintPositionManager; // packageimport
|
|
100 import dwtx.jface.text.TextPresentation; // packageimport
|
|
101 import dwtx.jface.text.IFindReplaceTargetExtension; // packageimport
|
|
102 import dwtx.jface.text.ISlaveDocumentManagerExtension; // packageimport
|
|
103 import dwtx.jface.text.ISelectionValidator; // packageimport
|
|
104 import dwtx.jface.text.IDocumentExtension; // packageimport
|
|
105 import dwtx.jface.text.PropagatingFontFieldEditor; // packageimport
|
|
106 import dwtx.jface.text.ConfigurableLineTracker; // packageimport
|
|
107 import dwtx.jface.text.SlaveDocumentEvent; // packageimport
|
|
108 import dwtx.jface.text.IDocumentListener; // packageimport
|
|
109 import dwtx.jface.text.PaintManager; // packageimport
|
|
110 import dwtx.jface.text.IFindReplaceTargetExtension3; // packageimport
|
|
111 import dwtx.jface.text.ITextDoubleClickStrategy; // packageimport
|
|
112 import dwtx.jface.text.IDocumentExtension3; // packageimport
|
|
113 import dwtx.jface.text.Position; // packageimport
|
|
114 import dwtx.jface.text.TextMessages; // packageimport
|
|
115 import dwtx.jface.text.CopyOnWriteTextStore; // packageimport
|
|
116 import dwtx.jface.text.WhitespaceCharacterPainter; // packageimport
|
|
117 import dwtx.jface.text.IPositionUpdater; // packageimport
|
|
118 import dwtx.jface.text.DefaultTextDoubleClickStrategy; // packageimport
|
|
119 import dwtx.jface.text.ListLineTracker; // packageimport
|
|
120 import dwtx.jface.text.ITextInputListener; // packageimport
|
|
121 import dwtx.jface.text.BadPositionCategoryException; // packageimport
|
|
122 import dwtx.jface.text.IWidgetTokenKeeperExtension; // packageimport
|
|
123 import dwtx.jface.text.IInputChangedListener; // packageimport
|
|
124 import dwtx.jface.text.ITextOperationTarget; // packageimport
|
|
125 import dwtx.jface.text.IDocumentInformationMappingExtension2; // packageimport
|
|
126 import dwtx.jface.text.ITextViewerExtension7; // packageimport
|
|
127 import dwtx.jface.text.IInformationControlExtension5; // packageimport
|
|
128 import dwtx.jface.text.IDocumentRewriteSessionListener; // packageimport
|
|
129 import dwtx.jface.text.JFaceTextUtil; // packageimport
|
|
130 import dwtx.jface.text.AbstractReusableInformationControlCreator; // packageimport
|
|
131 import dwtx.jface.text.TabsToSpacesConverter; // packageimport
|
|
132 import dwtx.jface.text.CursorLinePainter; // packageimport
|
|
133 import dwtx.jface.text.ITextHoverExtension; // packageimport
|
|
134 import dwtx.jface.text.IEventConsumer; // packageimport
|
|
135 import dwtx.jface.text.IDocument; // packageimport
|
|
136 import dwtx.jface.text.IWidgetTokenKeeper; // packageimport
|
|
137 import dwtx.jface.text.DocumentCommand; // packageimport
|
|
138 import dwtx.jface.text.TypedPosition; // packageimport
|
|
139 import dwtx.jface.text.IEditingSupportRegistry; // packageimport
|
|
140 import dwtx.jface.text.IDocumentPartitionerExtension; // packageimport
|
|
141 import dwtx.jface.text.AbstractHoverInformationControlManager; // packageimport
|
|
142 import dwtx.jface.text.IEditingSupport; // packageimport
|
|
143 import dwtx.jface.text.IMarkSelection; // packageimport
|
|
144 import dwtx.jface.text.ISlaveDocumentManager; // packageimport
|
|
145 import dwtx.jface.text.DocumentEvent; // packageimport
|
|
146 import dwtx.jface.text.DocumentPartitioningChangedEvent; // packageimport
|
|
147 import dwtx.jface.text.ITextStore; // packageimport
|
|
148 import dwtx.jface.text.JFaceTextMessages; // packageimport
|
|
149 import dwtx.jface.text.DocumentRewriteSessionEvent; // packageimport
|
|
150 import dwtx.jface.text.SequentialRewriteTextStore; // packageimport
|
|
151 import dwtx.jface.text.DocumentRewriteSessionType; // packageimport
|
|
152 import dwtx.jface.text.TextAttribute; // packageimport
|
|
153 import dwtx.jface.text.ITextViewerExtension4; // packageimport
|
|
154 import dwtx.jface.text.ITypedRegion; // packageimport
|
|
155
|
129
|
156 module dwtx.jface.text.TextViewerUndoManager;
|
|
157
|
|
158 import dwt.dwthelper.utils;
|
|
159
|
|
160
|
|
161
|
|
162
|
|
163
|
|
164 import dwt.DWT;
|
|
165 import dwt.custom.StyledText;
|
|
166 import dwt.events.KeyEvent;
|
|
167 import dwt.events.KeyListener;
|
|
168 import dwt.events.MouseEvent;
|
|
169 import dwt.events.MouseListener;
|
|
170 import dwt.widgets.Display;
|
|
171 import dwt.widgets.Shell;
|
|
172 import dwtx.core.commands.ExecutionException;
|
|
173 import dwtx.core.commands.operations.IUndoContext;
|
|
174 import dwtx.jface.dialogs.MessageDialog;
|
|
175 import dwtx.text.undo.DocumentUndoEvent;
|
|
176 import dwtx.text.undo.DocumentUndoManager;
|
|
177 import dwtx.text.undo.DocumentUndoManagerRegistry;
|
|
178 import dwtx.text.undo.IDocumentUndoListener;
|
|
179 import dwtx.text.undo.IDocumentUndoManager;
|
|
180
|
|
181
|
|
182 /**
|
|
183 * Implementation of {@link dwtx.jface.text.IUndoManager} using the shared
|
|
184 * document undo manager.
|
|
185 * <p>
|
|
186 * It registers with the connected text viewer as text input listener, and obtains
|
|
187 * its undo manager from the current document. It also monitors mouse and keyboard
|
|
188 * activities in order to partition the stream of text changes into undo-able
|
|
189 * edit commands.
|
|
190 * <p>
|
|
191 * This class is not intended to be subclassed.
|
|
192 * </p>
|
|
193 *
|
|
194 * @see ITextViewer
|
|
195 * @see ITextInputListener
|
|
196 * @see IDocumentUndoManager
|
|
197 * @see MouseListener
|
|
198 * @see KeyListener
|
|
199 * @see DocumentUndoManager
|
|
200 *
|
|
201 * @since 3.2
|
|
202 * @noextend This class is not intended to be subclassed by clients.
|
|
203 */
|
|
204 public class TextViewerUndoManager : IUndoManager, IUndoManagerExtension {
|
|
205
|
|
206
|
|
207 /**
|
|
208 * Internal listener to mouse and key events.
|
|
209 */
|
|
210 private class KeyAndMouseListener : MouseListener, KeyListener {
|
|
211
|
|
212 /*
|
|
213 * @see MouseListener#mouseDoubleClick
|
|
214 */
|
|
215 public void mouseDoubleClick(MouseEvent e) {
|
|
216 }
|
|
217
|
|
218 /*
|
|
219 * If the right mouse button is pressed, the current editing command is closed
|
|
220 * @see MouseListener#mouseDown
|
|
221 */
|
|
222 public void mouseDown(MouseEvent e) {
|
|
223 if (e.button is 1)
|
|
224 if (isConnected())
|
|
225 fDocumentUndoManager.commit();
|
|
226 }
|
|
227
|
|
228 /*
|
|
229 * @see MouseListener#mouseUp
|
|
230 */
|
|
231 public void mouseUp(MouseEvent e) {
|
|
232 }
|
|
233
|
|
234 /*
|
|
235 * @see KeyListener#keyPressed
|
|
236 */
|
|
237 public void keyReleased(KeyEvent e) {
|
|
238 }
|
|
239
|
|
240 /*
|
|
241 * On cursor keys, the current editing command is closed
|
|
242 * @see KeyListener#keyPressed
|
|
243 */
|
|
244 public void keyPressed(KeyEvent e) {
|
|
245 switch (e.keyCode) {
|
|
246 case DWT.ARROW_UP:
|
|
247 case DWT.ARROW_DOWN:
|
|
248 case DWT.ARROW_LEFT:
|
|
249 case DWT.ARROW_RIGHT:
|
|
250 if (isConnected()) {
|
|
251 fDocumentUndoManager.commit();
|
|
252 }
|
|
253 break;
|
|
254 }
|
|
255 }
|
|
256 }
|
|
257
|
|
258
|
|
259 /**
|
|
260 * Internal text input listener.
|
|
261 */
|
|
262 private class TextInputListener : ITextInputListener {
|
|
263
|
|
264 /*
|
|
265 * @see dwtx.jface.text.ITextInputListener#inputDocumentAboutToBeChanged(dwtx.jface.text.IDocument, dwtx.jface.text.IDocument)
|
|
266 */
|
|
267 public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) {
|
|
268 disconnectDocumentUndoManager();
|
|
269 }
|
|
270
|
|
271 /*
|
|
272 * @see dwtx.jface.text.ITextInputListener#inputDocumentChanged(dwtx.jface.text.IDocument, dwtx.jface.text.IDocument)
|
|
273 */
|
|
274 public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
|
|
275 connectDocumentUndoManager(newInput);
|
|
276 }
|
|
277 }
|
|
278
|
|
279
|
|
280 /**
|
|
281 * Internal document undo listener.
|
|
282 */
|
|
283 private class DocumentUndoListener : IDocumentUndoListener {
|
|
284
|
|
285 /*
|
|
286 * @see dwtx.jface.text.IDocumentUndoListener#documentUndoNotification(DocumentUndoEvent)
|
|
287 */
|
|
288 public void documentUndoNotification(DocumentUndoEvent event ){
|
|
289 if (!isConnected()) return;
|
|
290
|
|
291 int eventType= event.getEventType();
|
|
292 if (((eventType & DocumentUndoEvent.ABOUT_TO_UNDO) !is 0) || ((eventType & DocumentUndoEvent.ABOUT_TO_REDO) !is 0)) {
|
|
293 if (event.isCompound()) {
|
|
294 ITextViewerExtension extension= null;
|
|
295 if (fTextViewer instanceof ITextViewerExtension)
|
|
296 extension= (ITextViewerExtension) fTextViewer;
|
|
297
|
|
298 if (extension !is null)
|
|
299 extension.setRedraw(false);
|
|
300 }
|
|
301 fTextViewer.getTextWidget().getDisplay().syncExec(new Runnable() {
|
|
302 public void run() {
|
|
303 if (fTextViewer instanceof TextViewer)
|
|
304 ((TextViewer)fTextViewer).ignoreAutoEditStrategies(true);
|
|
305 }
|
|
306 });
|
|
307
|
|
308 } else if (((eventType & DocumentUndoEvent.UNDONE) !is 0) || ((eventType & DocumentUndoEvent.REDONE) !is 0)) {
|
|
309 fTextViewer.getTextWidget().getDisplay().syncExec(new Runnable() {
|
|
310 public void run() {
|
|
311 if (fTextViewer instanceof TextViewer)
|
|
312 ((TextViewer)fTextViewer).ignoreAutoEditStrategies(false);
|
|
313 }
|
|
314 });
|
|
315 if (event.isCompound()) {
|
|
316 ITextViewerExtension extension= null;
|
|
317 if (fTextViewer instanceof ITextViewerExtension)
|
|
318 extension= (ITextViewerExtension) fTextViewer;
|
|
319
|
|
320 if (extension !is null)
|
|
321 extension.setRedraw(true);
|
|
322 }
|
|
323
|
|
324 // Reveal the change if this manager's viewer has the focus.
|
|
325 if (fTextViewer !is null) {
|
|
326 StyledText widget= fTextViewer.getTextWidget();
|
|
327 if (widget !is null && !widget.isDisposed() && (widget.isFocusControl()))// || fTextViewer.getTextWidget() is control))
|
|
328 selectAndReveal(event.getOffset(), event.getText() is null ? 0 : event.getText().length());
|
|
329 }
|
|
330 }
|
|
331 }
|
|
332
|
|
333 }
|
|
334
|
|
335 /** The internal key and mouse event listener */
|
|
336 private KeyAndMouseListener fKeyAndMouseListener;
|
|
337 /** The internal text input listener */
|
|
338 private TextInputListener fTextInputListener;
|
|
339
|
|
340
|
|
341 /** The text viewer the undo manager is connected to */
|
|
342 private ITextViewer fTextViewer;
|
|
343
|
|
344 /** The undo level */
|
|
345 private int fUndoLevel;
|
|
346
|
|
347 /** The document undo manager that is active. */
|
|
348 private IDocumentUndoManager fDocumentUndoManager;
|
|
349
|
|
350 /** The document that is active. */
|
|
351 private IDocument fDocument;
|
|
352
|
|
353 /** The document undo listener */
|
|
354 private IDocumentUndoListener fDocumentUndoListener;
|
|
355
|
|
356 /**
|
|
357 * Creates a new undo manager who remembers the specified number of edit commands.
|
|
358 *
|
|
359 * @param undoLevel the length of this manager's history
|
|
360 */
|
|
361 public TextViewerUndoManager(int undoLevel) {
|
|
362 fUndoLevel= undoLevel;
|
|
363 }
|
|
364
|
|
365 /**
|
|
366 * Returns whether this undo manager is connected to a text viewer.
|
|
367 *
|
|
368 * @return <code>true</code> if connected, <code>false</code> otherwise
|
|
369 */
|
|
370 private bool isConnected() {
|
|
371 return fTextViewer !is null && fDocumentUndoManager !is null;
|
|
372 }
|
|
373
|
|
374 /*
|
|
375 * @see IUndoManager#beginCompoundChange
|
|
376 */
|
|
377 public void beginCompoundChange() {
|
|
378 if (isConnected()) {
|
|
379 fDocumentUndoManager.beginCompoundChange();
|
|
380 }
|
|
381 }
|
|
382
|
|
383
|
|
384 /*
|
|
385 * @see IUndoManager#endCompoundChange
|
|
386 */
|
|
387 public void endCompoundChange() {
|
|
388 if (isConnected()) {
|
|
389 fDocumentUndoManager.endCompoundChange();
|
|
390 }
|
|
391 }
|
|
392
|
|
393 /**
|
|
394 * Registers all necessary listeners with the text viewer.
|
|
395 */
|
|
396 private void addListeners() {
|
|
397 StyledText text= fTextViewer.getTextWidget();
|
|
398 if (text !is null) {
|
|
399 fKeyAndMouseListener= new KeyAndMouseListener();
|
|
400 text.addMouseListener(fKeyAndMouseListener);
|
|
401 text.addKeyListener(fKeyAndMouseListener);
|
|
402 fTextInputListener= new TextInputListener();
|
|
403 fTextViewer.addTextInputListener(fTextInputListener);
|
|
404 }
|
|
405 }
|
|
406
|
|
407 /**
|
|
408 * Unregister all previously installed listeners from the text viewer.
|
|
409 */
|
|
410 private void removeListeners() {
|
|
411 StyledText text= fTextViewer.getTextWidget();
|
|
412 if (text !is null) {
|
|
413 if (fKeyAndMouseListener !is null) {
|
|
414 text.removeMouseListener(fKeyAndMouseListener);
|
|
415 text.removeKeyListener(fKeyAndMouseListener);
|
|
416 fKeyAndMouseListener= null;
|
|
417 }
|
|
418 if (fTextInputListener !is null) {
|
|
419 fTextViewer.removeTextInputListener(fTextInputListener);
|
|
420 fTextInputListener= null;
|
|
421 }
|
|
422 }
|
|
423 }
|
|
424
|
|
425 /**
|
|
426 * Shows the given exception in an error dialog.
|
|
427 *
|
|
428 * @param title the dialog title
|
|
429 * @param ex the exception
|
|
430 */
|
|
431 private void openErrorDialog(final String title, final Exception ex) {
|
|
432 Shell shell= null;
|
|
433 if (isConnected()) {
|
|
434 StyledText st= fTextViewer.getTextWidget();
|
|
435 if (st !is null && !st.isDisposed())
|
|
436 shell= st.getShell();
|
|
437 }
|
|
438 if (Display.getCurrent() !is null)
|
|
439 MessageDialog.openError(shell, title, ex.getLocalizedMessage());
|
|
440 else {
|
|
441 Display display;
|
|
442 final Shell finalShell= shell;
|
|
443 if (finalShell !is null)
|
|
444 display= finalShell.getDisplay();
|
|
445 else
|
|
446 display= Display.getDefault();
|
|
447 display.syncExec(new Runnable() {
|
|
448 public void run() {
|
|
449 MessageDialog.openError(finalShell, title, ex.getLocalizedMessage());
|
|
450 }
|
|
451 });
|
|
452 }
|
|
453 }
|
|
454
|
|
455 /*
|
|
456 * @see dwtx.jface.text.IUndoManager#setMaximalUndoLevel(int)
|
|
457 */
|
|
458 public void setMaximalUndoLevel(int undoLevel) {
|
|
459 fUndoLevel= Math.max(0, undoLevel);
|
|
460 if (isConnected()) {
|
|
461 fDocumentUndoManager.setMaximalUndoLevel(fUndoLevel);
|
|
462 }
|
|
463 }
|
|
464
|
|
465 /*
|
|
466 * @see dwtx.jface.text.IUndoManager#connect(dwtx.jface.text.ITextViewer)
|
|
467 */
|
|
468 public void connect(ITextViewer textViewer) {
|
|
469 if (fTextViewer is null && textViewer !is null) {
|
|
470 fTextViewer= textViewer;
|
|
471 addListeners();
|
|
472 }
|
|
473 IDocument doc= fTextViewer.getDocument();
|
|
474 connectDocumentUndoManager(doc);
|
|
475 }
|
|
476
|
|
477 /*
|
|
478 * @see dwtx.jface.text.IUndoManager#disconnect()
|
|
479 */
|
|
480 public void disconnect() {
|
|
481 if (fTextViewer !is null) {
|
|
482 removeListeners();
|
|
483 fTextViewer= null;
|
|
484 }
|
|
485 disconnectDocumentUndoManager();
|
|
486 }
|
|
487
|
|
488 /*
|
|
489 * @see dwtx.jface.text.IUndoManager#reset()
|
|
490 */
|
|
491 public void reset() {
|
|
492 if (isConnected())
|
|
493 fDocumentUndoManager.reset();
|
|
494
|
|
495 }
|
|
496
|
|
497 /*
|
|
498 * @see dwtx.jface.text.IUndoManager#redoable()
|
|
499 */
|
|
500 public bool redoable() {
|
|
501 if (isConnected())
|
|
502 return fDocumentUndoManager.redoable();
|
|
503 return false;
|
|
504 }
|
|
505
|
|
506 /*
|
|
507 * @see dwtx.jface.text.IUndoManager#undoable()
|
|
508 */
|
|
509 public bool undoable() {
|
|
510 if (isConnected())
|
|
511 return fDocumentUndoManager.undoable();
|
|
512 return false;
|
|
513 }
|
|
514
|
|
515 /*
|
|
516 * @see dwtx.jface.text.IUndoManager#redo()
|
|
517 */
|
|
518 public void redo() {
|
|
519 if (isConnected()) {
|
|
520 try {
|
|
521 fDocumentUndoManager.redo();
|
|
522 } catch (ExecutionException ex) {
|
|
523 openErrorDialog(JFaceTextMessages.getString("DefaultUndoManager.error.redoFailed.title"), ex); //$NON-NLS-1$
|
|
524 }
|
|
525 }
|
|
526 }
|
|
527
|
|
528 /*
|
|
529 * @see dwtx.jface.text.IUndoManager#undo()
|
|
530 */
|
|
531 public void undo() {
|
|
532 if (isConnected()) {
|
|
533 try {
|
|
534 fDocumentUndoManager.undo();
|
|
535 } catch (ExecutionException ex) {
|
|
536 openErrorDialog(JFaceTextMessages.getString("DefaultUndoManager.error.undoFailed.title"), ex); //$NON-NLS-1$
|
|
537 }
|
|
538 }
|
|
539 }
|
|
540
|
|
541 /**
|
|
542 * Selects and reveals the specified range.
|
|
543 *
|
|
544 * @param offset the offset of the range
|
|
545 * @param length the length of the range
|
|
546 */
|
|
547 private void selectAndReveal(int offset, int length) {
|
|
548 if (fTextViewer instanceof ITextViewerExtension5) {
|
|
549 ITextViewerExtension5 extension= (ITextViewerExtension5) fTextViewer;
|
|
550 extension.exposeModelRange(new Region(offset, length));
|
|
551 } else if (!fTextViewer.overlapsWithVisibleRegion(offset, length))
|
|
552 fTextViewer.resetVisibleRegion();
|
|
553
|
|
554 fTextViewer.setSelectedRange(offset, length);
|
|
555 fTextViewer.revealRange(offset, length);
|
|
556 }
|
|
557
|
|
558 /*
|
|
559 * @see dwtx.jface.text.IUndoManagerExtension#getUndoContext()
|
|
560 */
|
|
561 public IUndoContext getUndoContext() {
|
|
562 if (isConnected()) {
|
|
563 return fDocumentUndoManager.getUndoContext();
|
|
564 }
|
|
565 return null;
|
|
566 }
|
|
567
|
|
568 private void connectDocumentUndoManager(IDocument document) {
|
|
569 disconnectDocumentUndoManager();
|
|
570 if (document !is null) {
|
|
571 fDocument= document;
|
|
572 DocumentUndoManagerRegistry.connect(fDocument);
|
|
573 fDocumentUndoManager= DocumentUndoManagerRegistry.getDocumentUndoManager(fDocument);
|
|
574 fDocumentUndoManager.connect(this);
|
|
575 setMaximalUndoLevel(fUndoLevel);
|
|
576 fDocumentUndoListener= new DocumentUndoListener();
|
|
577 fDocumentUndoManager.addDocumentUndoListener(fDocumentUndoListener);
|
|
578 }
|
|
579 }
|
|
580
|
|
581 private void disconnectDocumentUndoManager() {
|
|
582 if (fDocumentUndoManager !is null) {
|
|
583 fDocumentUndoManager.disconnect(this);
|
|
584 DocumentUndoManagerRegistry.disconnect(fDocument);
|
|
585 fDocumentUndoManager.removeDocumentUndoListener(fDocumentUndoListener);
|
|
586 fDocumentUndoListener= null;
|
|
587 fDocumentUndoManager= null;
|
|
588 }
|
|
589 }
|
|
590 }
|