1 /*******************************************************************************
2 * Copyright (c) 2000, 2003 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Common Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/cpl-v10.html
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package net.sourceforge.phpdt.internal.ui.text.link;
13 import java.lang.reflect.InvocationTargetException;
15 import net.sourceforge.phpdt.internal.ui.util.ExceptionHandler;
16 import net.sourceforge.phpdt.ui.PreferenceConstants;
17 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
19 import org.eclipse.core.runtime.CoreException;
20 import org.eclipse.jface.dialogs.MessageDialog;
21 import org.eclipse.jface.preference.IPreferenceStore;
22 import org.eclipse.jface.preference.PreferenceConverter;
24 //import org.eclipse.jface.text.Assert;
25 import org.eclipse.core.runtime.Assert;
26 import org.eclipse.jface.text.BadLocationException;
27 import org.eclipse.jface.text.BadPositionCategoryException;
28 import org.eclipse.jface.text.DefaultPositionUpdater;
29 import org.eclipse.jface.text.IDocument;
30 import org.eclipse.jface.text.IPositionUpdater;
31 import org.eclipse.jface.text.IRegion;
32 import org.eclipse.jface.text.IRewriteTarget;
33 import org.eclipse.jface.text.ITextInputListener;
34 import org.eclipse.jface.text.ITextListener;
35 import org.eclipse.jface.text.ITextViewer;
36 import org.eclipse.jface.text.ITextViewerExtension;
37 import org.eclipse.jface.text.ITextViewerExtension2;
38 import org.eclipse.jface.text.ITextViewerExtension5;
39 import org.eclipse.jface.text.Position;
40 import org.eclipse.jface.text.Region;
41 import org.eclipse.jface.text.TextEvent;
42 import org.eclipse.jface.util.IPropertyChangeListener;
43 import org.eclipse.jface.util.PropertyChangeEvent;
44 import org.eclipse.swt.SWT;
45 import org.eclipse.swt.custom.StyledText;
46 import org.eclipse.swt.custom.VerifyKeyListener;
47 import org.eclipse.swt.events.ModifyEvent;
48 import org.eclipse.swt.events.ModifyListener;
49 import org.eclipse.swt.events.PaintEvent;
50 import org.eclipse.swt.events.PaintListener;
51 import org.eclipse.swt.events.ShellEvent;
52 import org.eclipse.swt.events.ShellListener;
53 import org.eclipse.swt.events.VerifyEvent;
54 import org.eclipse.swt.events.VerifyListener;
55 import org.eclipse.swt.graphics.Color;
56 import org.eclipse.swt.graphics.GC;
57 import org.eclipse.swt.graphics.Point;
58 import org.eclipse.swt.graphics.RGB;
59 import org.eclipse.swt.widgets.Display;
60 import org.eclipse.swt.widgets.Shell;
63 * A user interface for <code>LinkedPositionManager</code>, using
64 * <code>ITextViewer</code>.
66 public class LinkedPositionUI implements ILinkedPositionListener,
67 ITextInputListener, ITextListener, ModifyListener, VerifyListener,
68 VerifyKeyListener, PaintListener, IPropertyChangeListener,
72 * A listener for notification when the user cancelled the edit operation.
74 public interface ExitListener {
75 void exit(boolean accept);
78 public static class ExitFlags {
83 public ExitFlags(int flags, boolean doit) {
89 public interface ExitPolicy {
90 ExitFlags doExit(LinkedPositionManager manager, VerifyEvent event,
91 int offset, int length);
95 private static final int UNINSTALL = 1; // uninstall linked position manager
97 public static final int COMMIT = 2; // commit changes
99 private static final int DOCUMENT_CHANGED = 4; // document has changed
101 public static final int UPDATE_CARET = 8; // update caret
103 private static final IPreferenceStore fgStore = PHPeclipsePlugin
104 .getDefault().getPreferenceStore();
106 private static final String CARET_POSITION_PREFIX = "LinkedPositionUI.caret.position"; //$NON-NLS-1$
108 private static int fgCounter = 0;
110 private final ITextViewer fViewer;
112 private final LinkedPositionManager fManager;
114 private final IPositionUpdater fUpdater;
116 private final String fPositionCategoryName;
118 private Color fFrameColor;
120 private int fFinalCaretOffset = -1; // no final caret offset
122 private Position fFinalCaretPosition;
124 private Position fFramePosition;
126 private int fInitialOffset = -1;
128 private int fCaretOffset;
130 private ExitPolicy fExitPolicy;
132 private ExitListener fExitListener;
134 private boolean fNeedRedraw;
136 private String fContentType;
138 private Position fPreviousPosition;
140 // private ContentAssistant2 fAssistant;
143 * Flag that records the state of this ui object. As there are many
144 * different entities that may call leave or exit, these cannot always be
145 * sure whether the linked position infrastructure is still active. This is
146 * especially true for multithreaded situations.
148 private boolean fIsActive = false;
151 * Creates a user interface for <code>LinkedPositionManager</code>.
156 * the <code>LinkedPositionManager</code> managing a
157 * <code>IDocument</code> of the <code>ITextViewer</code>.
159 public LinkedPositionUI(ITextViewer viewer, LinkedPositionManager manager) {
160 Assert.isNotNull(viewer);
161 Assert.isNotNull(manager);
166 fPositionCategoryName = CARET_POSITION_PREFIX + (fgCounter++);
167 fUpdater = new DefaultPositionUpdater(fPositionCategoryName);
169 fManager.setLinkedPositionListener(this);
171 initializeHighlightColor(viewer);
175 * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
177 public void propertyChange(PropertyChangeEvent event) {
178 if (event.getProperty().equals(
179 PreferenceConstants.EDITOR_LINKED_POSITION_COLOR)) {
180 initializeHighlightColor(fViewer);
185 private void initializeHighlightColor(ITextViewer viewer) {
187 if (fFrameColor != null)
188 fFrameColor.dispose();
190 StyledText text = viewer.getTextWidget();
192 Display display = text.getDisplay();
193 fFrameColor = createColor(fgStore,
194 PreferenceConstants.EDITOR_LINKED_POSITION_COLOR, display);
199 * Creates a color from the information stored in the given preference
200 * store. Returns <code>null</code> if there is no such information
203 private Color createColor(IPreferenceStore store, String key,
208 if (store.contains(key)) {
210 if (store.isDefault(key))
211 rgb = PreferenceConverter.getDefaultColor(store, key);
213 rgb = PreferenceConverter.getColor(store, key);
216 return new Color(display, rgb);
223 * Sets the initial offset.
227 // public void setInitialOffset(int offset) {
228 // fInitialOffset = offset;
232 * Sets the final position of the caret when the linked mode is exited
233 * successfully by leaving the last linked position using TAB. The set
234 * position will be a TAB stop as well as the positions configured in the
235 * <code>LinkedPositionManager</code>.
237 public void setFinalCaretOffset(int offset) {
238 fFinalCaretOffset = offset;
242 * Sets a <code>CancelListener</code> which is notified if the linked mode
243 * is exited unsuccessfully by hitting ESC.
245 public void setCancelListener(ExitListener listener) {
246 fExitListener = listener;
250 * Sets an <code>ExitPolicy</code> which decides when and how the linked
253 public void setExitPolicy(ExitPolicy policy) {
254 fExitPolicy = policy;
258 * @see LinkedPositionManager.LinkedPositionListener#setCurrentPositions(Position,
261 public void setCurrentPosition(Position position, int caretOffset) {
263 ;// JavaPlugin.log(new Status(IStatus.WARNING,
264 // JavaPlugin.getPluginId(), IStatus.OK, "LinkedPositionUI is
265 // not active: "+fPositionCategoryName, new
266 // IllegalStateException())); //$NON-NLS-1$
268 if (!fFramePosition.equals(position)) {
270 fFramePosition = position;
273 fCaretOffset = caretOffset;
277 * Enters the linked mode. The linked mode can be left by calling
280 * @see #exit(boolean)
282 public void enter() {
284 ;// JavaPlugin.log(new Status(IStatus.WARNING,
285 // JavaPlugin.getPluginId(), IStatus.OK, "LinkedPositionUI is
286 // already active: "+fPositionCategoryName, new
287 // IllegalStateException())); //$NON-NLS-1$
290 // JavaPlugin.log(new Status(IStatus.INFO, JavaPlugin.getPluginId(),
291 // IStatus.OK, "LinkedPositionUI activated: "+fPositionCategoryName,
292 // new Exception())); //$NON-NLS-1$
296 IDocument document = fViewer.getDocument();
297 document.addPositionCategory(fPositionCategoryName);
298 document.addPositionUpdater(fUpdater);
301 if (fFinalCaretOffset != -1) {
302 fFinalCaretPosition = new Position(fFinalCaretOffset);
304 .addPosition(fPositionCategoryName, fFinalCaretPosition);
306 } catch (BadLocationException e) {
307 handleException(fViewer.getTextWidget().getShell(), e);
309 } catch (BadPositionCategoryException e) {
310 PHPeclipsePlugin.log(e);
311 Assert.isTrue(false);
314 fViewer.addTextInputListener(this);
315 fViewer.addTextListener(this);
317 ITextViewerExtension extension = (ITextViewerExtension) fViewer;
318 extension.prependVerifyKeyListener(this);
320 StyledText text = fViewer.getTextWidget();
321 text.addVerifyListener(this);
322 text.addModifyListener(this);
323 text.addPaintListener(this);
324 text.showSelection();
326 Shell shell = text.getShell();
327 shell.addShellListener(this);
329 fFramePosition = (fInitialOffset == -1) ? fManager.getFirstPosition()
330 : fManager.getPosition(fInitialOffset);
331 if (fFramePosition == null) {
332 leave(UNINSTALL | COMMIT | UPDATE_CARET);
336 fgStore.addPropertyChangeListener(this);
339 // fContentType= TextUtilities.getContentType(document,
340 // IJavaPartitions.JAVA_PARTITIONING, fFramePosition.offset);
341 // if (fViewer instanceof ITextViewerExtension2) {
342 // ((ITextViewerExtension2) fViewer).prependAutoEditStrategy(fManager,
345 // Assert.isTrue(false);
348 // } catch (BadLocationException e) {
349 // handleException(fViewer.getTextWidget().getShell(), e);
352 fContentType = document.getContentType(fFramePosition.offset);
353 if (fViewer instanceof ITextViewerExtension2) {
354 ((ITextViewerExtension2) fViewer).prependAutoEditStrategy(
355 fManager, fContentType);
357 Assert.isTrue(false);
360 } catch (BadLocationException e) {
361 handleException(fViewer.getTextWidget().getShell(), e);
364 // triggerContentAssist();
368 * @see net.sourceforge.phpdt.internal.ui.text.link.ILinkedPositionListener#exit(boolean)
370 public void exit(int flags) {
375 * Returns the cursor selection, after having entered the linked mode.
376 * <code>enter()</code> must be called prior to a call to this method.
378 public IRegion getSelectedRegion() {
380 ;// JavaPlugin.log(new Status(IStatus.WARNING,
381 // JavaPlugin.getPluginId(), IStatus.OK, "LinkedPositionUI is
382 // not active: "+fPositionCategoryName, new
383 // IllegalStateException())); //$NON-NLS-1$
385 if (fFramePosition == null)
386 return new Region(fFinalCaretOffset, 0);
388 return new Region(fFramePosition.getOffset(), fFramePosition
392 private void leave(int flags) {
394 ;// JavaPlugin.log(new Status(IStatus.WARNING,
395 // JavaPlugin.getPluginId(), IStatus.OK, "LinkedPositionUI is
396 // not active: "+fPositionCategoryName, new
397 // IllegalStateException())); //$NON-NLS-1$
400 // JavaPlugin.log(new Status(IStatus.INFO, JavaPlugin.getPluginId(),
401 // IStatus.OK, "LinkedPositionUI deactivated:
402 // "+fPositionCategoryName, new Exception())); //$NON-NLS-1$
407 if ((flags & UNINSTALL) != 0)
408 fManager.uninstall((flags & COMMIT) != 0);
410 fgStore.removePropertyChangeListener(this);
412 if (fFrameColor != null) {
413 fFrameColor.dispose();
417 StyledText text = fViewer.getTextWidget();
418 // bail out if the styled text is null, meaning the viewer has been
419 // disposed (-> document is null as well)
420 // see pr https://bugs.eclipse.org/bugs/show_bug.cgi?id=46821
424 text.removePaintListener(this);
425 text.removeModifyListener(this);
426 text.removeVerifyListener(this);
428 Shell shell = text.getShell();
429 shell.removeShellListener(this);
431 // if (fAssistant != null) {
432 // Display display= text.getDisplay();
433 // if (display != null && !display.isDisposed()) {
434 // display.asyncExec(new Runnable() {
435 // public void run() {
436 // if (fAssistant != null) {
437 // fAssistant.uninstall();
445 ITextViewerExtension extension = (ITextViewerExtension) fViewer;
446 extension.removeVerifyKeyListener(this);
448 IRewriteTarget target = extension.getRewriteTarget();
449 target.endCompoundChange();
451 if (fViewer instanceof ITextViewerExtension2 && fContentType != null)
452 ((ITextViewerExtension2) fViewer).removeAutoEditStrategy(fManager,
456 fViewer.removeTextListener(this);
457 fViewer.removeTextInputListener(this);
460 IDocument document = fViewer.getDocument();
462 if (((flags & COMMIT) != 0) && ((flags & DOCUMENT_CHANGED) == 0)
463 && ((flags & UPDATE_CARET) != 0)) {
464 Position[] positions = document
465 .getPositions(fPositionCategoryName);
466 if ((positions != null) && (positions.length != 0)) {
468 if (fViewer instanceof ITextViewerExtension5) {
469 ITextViewerExtension5 extension3 = (ITextViewerExtension5) fViewer;
470 int widgetOffset = extension3
471 .modelOffset2WidgetOffset(positions[0]
473 if (widgetOffset >= 0)
474 text.setSelection(widgetOffset, widgetOffset);
477 IRegion region = fViewer.getVisibleRegion();
478 int offset = positions[0].getOffset()
479 - region.getOffset();
480 if ((offset >= 0) && (offset <= region.getLength()))
481 text.setSelection(offset, offset);
486 document.removePositionUpdater(fUpdater);
487 document.removePositionCategory(fPositionCategoryName);
489 if (fExitListener != null)
490 fExitListener.exit(((flags & COMMIT) != 0)
491 || ((flags & DOCUMENT_CHANGED) != 0));
493 } catch (BadPositionCategoryException e) {
494 PHPeclipsePlugin.log(e);
495 Assert.isTrue(false);
498 if ((flags & DOCUMENT_CHANGED) == 0)
502 private void next() {
504 ;// JavaPlugin.log(new Status(IStatus.WARNING,
505 // JavaPlugin.getPluginId(), IStatus.OK, "LinkedPositionUI is
506 // not active: "+fPositionCategoryName, new
507 // IllegalStateException())); //$NON-NLS-1$
511 if (fFramePosition == fFinalCaretPosition)
512 fFramePosition = fManager.getFirstPosition();
514 fFramePosition = fManager.getNextPosition(fFramePosition
516 if (fFramePosition == null) {
517 if (fFinalCaretPosition != null)
518 fFramePosition = fFinalCaretPosition;
520 fFramePosition = fManager.getFirstPosition();
522 if (fFramePosition == null) {
523 leave(UNINSTALL | COMMIT | UPDATE_CARET);
526 // triggerContentAssist();
531 private void previous() {
533 ;// JavaPlugin.log(new Status(IStatus.WARNING,
534 // JavaPlugin.getPluginId(), IStatus.OK, "LinkedPositionUI is
535 // not active: "+fPositionCategoryName, new
536 // IllegalStateException())); //$NON-NLS-1$
540 fFramePosition = fManager.getPreviousPosition(fFramePosition
542 if (fFramePosition == null) {
543 if (fFinalCaretPosition != null)
544 fFramePosition = fFinalCaretPosition;
546 fFramePosition = fManager.getLastPosition();
548 if (fFramePosition == null) {
549 leave(UNINSTALL | COMMIT | UPDATE_CARET);
552 // triggerContentAssist();
557 /** Trigger content assist on choice positions */
558 // private void triggerContentAssist() {
559 // if (fFramePosition instanceof ProposalPosition) {
561 // ProposalPosition pp= (ProposalPosition) fFramePosition;
562 // initializeContentAssistant();
563 // if (fAssistant == null)
565 // fAssistant.setCompletions(pp.getChoices());
566 // fAssistant.showPossibleCompletions();
568 // if (fAssistant != null)
569 // fAssistant.setCompletions(new ICompletionProposal[0]);
572 /** Lazy initialize content assistant for this linked ui */
573 // private void initializeContentAssistant() {
574 // if (fAssistant != null)
576 // fAssistant= new ContentAssistant2();
577 // fAssistant.setDocumentPartitioning(IJavaPartitions.JAVA_PARTITIONING);
578 // fAssistant.install(fViewer);
581 * @see VerifyKeyListener#verifyKey(VerifyEvent)
583 public void verifyKey(VerifyEvent event) {
585 if (!event.doit || !fIsActive)
588 Point selection = fViewer.getSelectedRange();
589 int offset = selection.x;
590 int length = selection.y;
592 ExitFlags exitFlags = fExitPolicy == null ? null : fExitPolicy.doExit(
593 fManager, event, offset, length);
594 if (exitFlags != null) {
595 leave(UNINSTALL | exitFlags.flags);
596 event.doit = exitFlags.doit;
600 switch (event.character) {
601 // [SHIFT-]TAB = hop between edit boxes
603 // if tab was treated as a document change, would it exceed variable
605 if (!LinkedPositionManager.includes(fFramePosition, offset, length)) {
606 leave(UNINSTALL | COMMIT);
611 if (event.stateMask == SWT.SHIFT)
620 case 0x0A: // Ctrl+Enter
622 // if (fAssistant != null && fAssistant.wasProposalChosen()) {
624 // event.doit= false;
628 // if enter was treated as a document change, would it exceed
630 if (!LinkedPositionManager.includes(fFramePosition, offset, length)
631 || (fFramePosition == fFinalCaretPosition)) {
632 leave(UNINSTALL | COMMIT);
637 leave(UNINSTALL | COMMIT | UPDATE_CARET);
643 leave(UNINSTALL | COMMIT);
648 leave(UNINSTALL | COMMIT);
653 if (event.character != 0) {
654 if (!controlUndoBehavior(offset, length)
655 || fFramePosition == fFinalCaretPosition) {
656 leave(UNINSTALL | COMMIT);
663 private boolean controlUndoBehavior(int offset, int length) {
665 Position position = fManager.getEmbracingPosition(offset, length);
666 if (position != null) {
668 ITextViewerExtension extension = (ITextViewerExtension) fViewer;
669 IRewriteTarget target = extension.getRewriteTarget();
671 if (fPreviousPosition != null
672 && !fPreviousPosition.equals(position))
673 target.endCompoundChange();
674 target.beginCompoundChange();
677 fPreviousPosition = position;
678 return fPreviousPosition != null;
682 * @see VerifyListener#verifyText(VerifyEvent)
684 public void verifyText(VerifyEvent event) {
691 if (fViewer instanceof ITextViewerExtension5) {
692 ITextViewerExtension5 extension = (ITextViewerExtension5) fViewer;
693 IRegion modelRange = extension.widgetRange2ModelRange(new Region(
694 event.start, event.end - event.start));
695 if (modelRange == null)
698 offset = modelRange.getOffset();
699 length = modelRange.getLength();
702 IRegion visibleRegion = fViewer.getVisibleRegion();
703 offset = event.start + visibleRegion.getOffset();
704 length = event.end - event.start;
707 // allow changes only within linked positions when coming through UI
708 if (!fManager.anyPositionIncludes(offset, length))
709 leave(UNINSTALL | COMMIT);
713 * @see PaintListener#paintControl(PaintEvent)
715 public void paintControl(PaintEvent event) {
716 if (fFramePosition == null)
719 IRegion widgetRange = asWidgetRange(fFramePosition);
720 if (widgetRange == null) {
721 leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);
725 int offset = widgetRange.getOffset();
726 int length = widgetRange.getLength();
728 StyledText text = fViewer.getTextWidget();
731 Point minLocation = getMinimumLocation(text, offset, length);
732 Point maxLocation = getMaximumLocation(text, offset, length);
734 int x1 = minLocation.x;
735 int x2 = minLocation.x + maxLocation.x - minLocation.x - 1;
736 int y = minLocation.y + text.getLineHeight() - 1;
739 gc.setForeground(fFrameColor);
740 gc.drawLine(x1, y, x2, y);
743 protected IRegion asWidgetRange(Position position) {
744 if (fViewer instanceof ITextViewerExtension5) {
746 ITextViewerExtension5 extension = (ITextViewerExtension5) fViewer;
747 return extension.modelRange2WidgetRange(new Region(position
748 .getOffset(), position.getLength()));
752 IRegion region = fViewer.getVisibleRegion();
753 if (includes(region, position))
754 return new Region(position.getOffset() - region.getOffset(),
755 position.getLength());
761 private static Point getMinimumLocation(StyledText text, int offset,
763 Point minLocation = new Point(Integer.MAX_VALUE, Integer.MAX_VALUE);
765 for (int i = 0; i <= length; i++) {
766 Point location = text.getLocationAtOffset(offset + i);
768 if (location.x < minLocation.x)
769 minLocation.x = location.x;
770 if (location.y < minLocation.y)
771 minLocation.y = location.y;
777 private static Point getMaximumLocation(StyledText text, int offset,
779 Point maxLocation = new Point(Integer.MIN_VALUE, Integer.MIN_VALUE);
781 for (int i = 0; i <= length; i++) {
782 Point location = text.getLocationAtOffset(offset + i);
784 if (location.x > maxLocation.x)
785 maxLocation.x = location.x;
786 if (location.y > maxLocation.y)
787 maxLocation.y = location.y;
793 private void redrawRegion() {
794 IRegion widgetRange = asWidgetRange(fFramePosition);
795 if (widgetRange == null) {
796 leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);
800 StyledText text = fViewer.getTextWidget();
801 if (text != null && !text.isDisposed())
802 text.redrawRange(widgetRange.getOffset(), widgetRange.getLength(),
806 private void selectRegion() {
808 IRegion widgetRange = asWidgetRange(fFramePosition);
809 if (widgetRange == null) {
810 leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);
814 StyledText text = fViewer.getTextWidget();
815 if (text != null && !text.isDisposed()) {
816 int start = widgetRange.getOffset();
817 int end = widgetRange.getLength() + start;
818 text.setSelection(start, end);
822 private void updateCaret() {
824 IRegion widgetRange = asWidgetRange(fFramePosition);
825 if (widgetRange == null) {
826 leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);
830 int offset = widgetRange.getOffset() + fCaretOffset;
831 StyledText text = fViewer.getTextWidget();
832 if (text != null && !text.isDisposed())
833 text.setCaretOffset(offset);
837 * @see ModifyListener#modifyText(ModifyEvent)
839 public void modifyText(ModifyEvent e) {
840 // reposition caret after StyledText
845 private static void handleException(Shell shell, Exception e) {
846 String title = LinkedPositionMessages
847 .getString("LinkedPositionUI.error.title"); //$NON-NLS-1$
848 if (e instanceof CoreException)
849 ExceptionHandler.handle((CoreException) e, shell, title, null);
850 else if (e instanceof InvocationTargetException)
851 ExceptionHandler.handle((InvocationTargetException) e, shell,
854 MessageDialog.openError(shell, title, e.getMessage());
855 PHPeclipsePlugin.log(e);
860 * @see ITextInputListener#inputDocumentAboutToBeChanged(IDocument,
863 public void inputDocumentAboutToBeChanged(IDocument oldInput,
864 IDocument newInput) {
865 // 5326: leave linked mode on document change
866 int flags = UNINSTALL | COMMIT
867 | (oldInput.equals(newInput) ? 0 : DOCUMENT_CHANGED);
872 * @see ITextInputListener#inputDocumentChanged(IDocument, IDocument)
874 public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
877 private static boolean includes(IRegion region, Position position) {
878 return position.getOffset() >= region.getOffset()
879 && position.getOffset() + position.getLength() <= region
881 + region.getLength();
885 * @see org.eclipse.jface.text.ITextListener#textChanged(TextEvent)
887 public void textChanged(TextEvent event) {
896 * @see org.eclipse.swt.events.ShellListener#shellActivated(org.eclipse.swt.events.ShellEvent)
898 public void shellActivated(ShellEvent event) {
902 * @see org.eclipse.swt.events.ShellListener#shellClosed(org.eclipse.swt.events.ShellEvent)
904 public void shellClosed(ShellEvent event) {
905 leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);
909 * @see org.eclipse.swt.events.ShellListener#shellDeactivated(org.eclipse.swt.events.ShellEvent)
911 public void shellDeactivated(ShellEvent event) {
912 // don't deactivate on focus lost, since the proposal popups may take
914 // plus: it doesn't hurt if you can check with another window without
915 // losing linked mode
916 // since there is no intrusive popup sticking out.
918 // need to check first what happens on reentering based on an open
920 // Seems to be no problem
922 // TODO check whether we can leave it or uncomment it after debugging
923 // PS: why DOCUMENT_CHANGED? We want to trigger a redraw! (Shell
924 // deactivated does not mean
925 // it is not visible any longer.
926 // leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);
929 // Check with content assistant and only leave if its not the proposal
930 // shell that took the
936 // if (fAssistant == null || fViewer == null || (text=
937 // fViewer.getTextWidget()) == null
938 // || (display= text.getDisplay()) == null || display.isDisposed()) {
939 if (fViewer == null || (text = fViewer.getTextWidget()) == null
940 || (display = text.getDisplay()) == null
941 || display.isDisposed()) {
942 leave(UNINSTALL | COMMIT);
944 // Post in UI thread since the assistant popup will only get the
945 // focus after we lose it.
946 display.asyncExec(new Runnable() {
948 // TODO add isDisposed / isUninstalled / hasLeft check? for
949 // now: check for content type,
950 // since it gets nullified in leave()
951 if (fIsActive) {// && (fAssistant == null ||
952 // !fAssistant.hasFocus())) {
953 leave(UNINSTALL | COMMIT);
961 * @see org.eclipse.swt.events.ShellListener#shellDeiconified(org.eclipse.swt.events.ShellEvent)
963 public void shellDeiconified(ShellEvent event) {
967 * @see org.eclipse.swt.events.ShellListener#shellIconified(org.eclipse.swt.events.ShellEvent)
969 public void shellIconified(ShellEvent event) {
970 leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);