diff options
Diffstat (limited to 'org.eclipse.jface.text/src')
6 files changed, 196 insertions, 14 deletions
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/AbstractHoverInformationControlManager.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/AbstractHoverInformationControlManager.java index 0f006c35295..b4fdf843460 100644 --- a/org.eclipse.jface.text/src/org/eclipse/jface/text/AbstractHoverInformationControlManager.java +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/AbstractHoverInformationControlManager.java @@ -229,7 +229,7 @@ abstract public class AbstractHoverInformationControlManager extends AbstractInf private boolean fIsActive= false; /** Indicates whether the mouse has been lost. */ private boolean fMouseLost= false; - /** Indicates whether the subject control's shelll has been deactivated. */ + /** Indicates whether the subject control's shell has been deactivated. */ private boolean fShellDeactivated= false; /** @@ -349,7 +349,7 @@ abstract public class AbstractHoverInformationControlManager extends AbstractInf if (!fSubjectArea.contains(event.x, event.y)) deactivate(); } - + /* * @see ShellListener#shellDeactivated(ShellEvent) */ @@ -404,6 +404,17 @@ abstract public class AbstractHoverInformationControlManager extends AbstractInf private MouseTracker fMouseTracker= new MouseTracker(); /** The remembered hover event location */ private Point fHoverEventLocation= new Point(-1, -1); + + /** + * The key listener to get modifier state mask mouse tracker events. + * TODO: Workaround for bug 24619 and can be removed once the bug is fixed + */ + private KeyListener fKeyListener; + /** + * State mask of the keyboard modifiers. + * TODO: Workaround for bug 24619 and can be removed once the bug is fixed + */ + private int fStateMask= 0; /** * Creates a new hover information control manager using the given information control creator. @@ -460,4 +471,42 @@ abstract public class AbstractHoverInformationControlManager extends AbstractInf protected Point getHoverEventLocation() { return fHoverEventLocation; } + + /* + * @see AbstractInformationControlManager#setEnabled(boolean) + * TODO: Workaround for bug 24619. This method can be removed once the bug is fixed + */ + public void install(Control subjectControl) { + super.install(subjectControl); + if (subjectControl != null) { + fKeyListener= new KeyListener() { + public void keyPressed(KeyEvent event) { + fStateMask= event.stateMask | event.keyCode; + } + public void keyReleased(KeyEvent event) { + fStateMask= 0; + } + }; + subjectControl.addKeyListener(fKeyListener); + } + } + + /* + * @see AbstractInformationControlManager#setEnabled(boolean) + * TODO: Workaround for bug 24619. This method can be removed once the bug is fixed + */ + public void dispose() { + if (fKeyListener != null && getSubjectControl() != null) + getSubjectControl().removeKeyListener(fKeyListener); + super.dispose(); + } + + /** + * Returns the SWT event state mask. + * TODO: Workaround for bug 24619. This method can be removed once the bug is fixed + * + * @deprecated The state mask should be provided by the mouse event or the display.
*/ + int getStateMask() { + return fStateMask; + } }
\ No newline at end of file diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerExtension2.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerExtension2.java index fc3625715d0..eb5620f6be8 100644 --- a/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerExtension2.java +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerExtension2.java @@ -16,14 +16,36 @@ package org.eclipse.jface.text; * Extension interface for <code>ITextViewer</code>. Extends <code>ITextViewer</code> with * <ul> * <li> a replacement of the invalidateTextPresentation method + * <li> a replacement of the setTextHover method now accepting state masks * </ul> * * @since 2.1 */ public interface ITextViewerExtension2 { + /** + * The state mask of the default hover (value <code>0xff</code>). + * @since 2.1 + */ + final int DEFAULT_HOVER_STATE_MASK= 0xff; + /** * Invalidates the viewer's text presentation for the given range. - *
* @param offset the offset of the first character to be redrawn
* @param length the length of the range to be redrawn
*/ + * + * @param offset the offset of the first character to be redrawn + * @param length the length of the range to be redrawn + */ void invalidateTextPresentation(int offset, int length); + + /** + * Sets this viewer's text hover for the given content type. + * + * @param textViewerHover the new hover. <code>null</code> uninstalls the hover for the + * given content type and state mask. + * @param contentType the type for which the hover is registered + * @param stateMask the SWT event state mask; <code>DEFAULT_HOVER_STATE_MASK</code> indicates that + * the hover is installed as the default hover. + * @since 2.1 + */ + void setTextHover(ITextHover textViewerHover, String contentType, int stateMask); } diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java index 736d754215b..c1484c23c9a 100644 --- a/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java @@ -21,9 +21,9 @@ import java.util.Map; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.LineBackgroundEvent; import org.eclipse.swt.custom.LineBackgroundListener; +import org.eclipse.swt.custom.ST; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; -import org.eclipse.swt.custom.ST; import org.eclipse.swt.custom.VerifyKeyListener; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.ControlListener; @@ -51,6 +51,7 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.ScrollBar; +import org.eclipse.jface.text.Assert; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; @@ -910,6 +911,42 @@ public class TextViewer extends Viewer implements } }; + /** + * Value object uses as key in the text hover configuration table. It is + * modifiable only for efficiency reasons only inside this compilation unit + * to allow the reuse of created objects.
*/ + protected class TextHoverKey { + + private String fContentType; + private int fStateMask; + + protected TextHoverKey(String contentType, int stateMask) { + Assert.isNotNull(contentType); + fContentType= contentType; + fStateMask= stateMask; + } + + /* + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + if (obj == null || obj.getClass() != getClass()) + return false; + TextHoverKey textHoverKey= (TextHoverKey)obj; + return textHoverKey.fContentType.equals(fContentType) && textHoverKey.fStateMask == fStateMask; + } + + /* + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return fStateMask << 16 | fContentType.hashCode(); + } + + private void setStateMask(int stateMask) { + fStateMask= stateMask; + } + } /** ID for originators of view port changes */ protected static final int SCROLLER= 1; @@ -974,7 +1011,7 @@ public class TextViewer extends Viewer implements * The mark position category. * @since 2.0 */ - private final String MARK_POSITION_CATEGORY="__mark_category_" + hashCode(); + private final String MARK_POSITION_CATEGORY="__mark_category_" + hashCode(); //$NON-NLS-1$ /** * The mark position updater * @since 2.0 @@ -1317,18 +1354,25 @@ public class TextViewer extends Viewer implements public void setUndoManager(IUndoManager undoManager) { fUndoManager= undoManager; } - + /* * @see ITextViewer#setTextHover */ public void setTextHover(ITextHover hover, String contentType) { - + setTextHover(hover, contentType, ITextViewerExtension2.DEFAULT_HOVER_STATE_MASK); + } + + /* + * @see ITextViewerExtension2#setTextHover + */ + public void setTextHover(ITextHover hover, String contentType, int stateMask) { + TextHoverKey key= new TextHoverKey(contentType, stateMask); if (hover != null) { if (fTextHovers == null) fTextHovers= new HashMap(); - fTextHovers.put(contentType, hover); + fTextHovers.put(key, hover); } else if (fTextHovers != null) - fTextHovers.remove(contentType); + fTextHovers.remove(key); } /** @@ -1338,9 +1382,36 @@ public class TextViewer extends Viewer implements * @return the text hover for the given offset */ protected ITextHover getTextHover(int offset) { - return (ITextHover) selectContentTypePlugin(offset, fTextHovers); + return getTextHover(offset, ITextViewerExtension2.DEFAULT_HOVER_STATE_MASK); } - + + /** + * Returns the text hover for a given offset. + * + * @param offset the offset for which to return the text hover + * @param stateMask the SWT event state mask + * @return the text hover for the given offset + */ + protected ITextHover getTextHover(int offset, int stateMask) { + if (fTextHovers == null) + return null; + + try { + TextHoverKey key= new TextHoverKey(getDocument().getContentType(offset), stateMask); + Object textHover= fTextHovers.get(key); + if (textHover == null) { + // Use default text hover + key.setStateMask(ITextViewerExtension2.DEFAULT_HOVER_STATE_MASK); + textHover= fTextHovers.get(key); + } + return (ITextHover)textHover; + } catch (BadLocationException x) { + if (TRACE_ERRORS) + System.out.println(JFaceTextMessages.getString("TextViewer.error.bad_location.selectContentTypePlugin")); //$NON-NLS-1$ + } + return null; + } + /** * Returns the text hovering controller of this viewer. * diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewerHoverManager.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewerHoverManager.java index 426bdb67db8..ce540e31f96 100644 --- a/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewerHoverManager.java +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewerHoverManager.java @@ -75,7 +75,7 @@ class TextViewerHoverManager extends AbstractHoverInformationControlManager impl return; } - final ITextHover hover= fTextViewer.getTextHover(offset); + final ITextHover hover= fTextViewer.getTextHover(offset, getStateMask()); if (hover == null) { setInformation(null, null); return; @@ -98,7 +98,7 @@ class TextViewerHoverManager extends AbstractHoverInformationControlManager impl return; } - fThread= new Thread() { + fThread= new Thread("Text Viewer Hover Presenter") { //$NON-NLS-1$ public void run() { // http://bugs.eclipse.org/bugs/show_bug.cgi?id=17693 try { diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewer.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewer.java index 15dcb2d68bc..dcad1009c21 100644 --- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewer.java +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewer.java @@ -24,6 +24,7 @@ import org.eclipse.jface.text.AbstractHoverInformationControlManager; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.ITextViewerExtension2; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.TextViewer; @@ -228,7 +229,16 @@ public class SourceViewer extends TextViewer implements ISourceViewer { setAutoIndentStrategy(configuration.getAutoIndentStrategy(this, t), t); setTextDoubleClickStrategy(configuration.getDoubleClickStrategy(this, t), t); - setTextHover(configuration.getTextHover(this, t), t); + + int[] stateMasks= configuration.getConfiguredTextHoverStateMasks(this, t); + if (stateMasks != null) { + for (int j= 0; j < stateMasks.length; j++) { + int stateMask= stateMasks[j]; + setTextHover(configuration.getTextHover(this, t, stateMask), t, stateMask); + } + } else { + setTextHover(configuration.getTextHover(this, t), t, ITextViewerExtension2.DEFAULT_HOVER_STATE_MASK); + } String[] prefixes= configuration.getIndentPrefixes(this, t); if (prefixes != null && prefixes.length > 0) diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewerConfiguration.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewerConfiguration.java index 2e5e46836fe..954cc7fbaaf 100644 --- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewerConfiguration.java +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewerConfiguration.java @@ -184,6 +184,36 @@ public class SourceViewerConfiguration { public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) { return null; } + + /** + * Returns the SWT event state masks for which text hover are configured for + * the given content type. + * + * @param sourceViewer the source viewer to be configured by this configuration + * @param contentType the content type + * @return an <code>int</code> array with the configured SWT event state masks + * or <code>null</code> if text hovers are not supported for the given content type + * @since 2.1 + */ + public int[] getConfiguredTextHoverStateMasks(ISourceViewer sourceViewer, String contentType) { + return null; + } + + /** + * Returns the text hover which will provide the information to be shown + * in a text hover popup window when requested for the given source viewer and + * the given content type. This implementation always returns <code> + * null</code>. + * + * @param sourceViewer the source viewer to be configured by this configuration + * @param contentType the content type + * @param stateMask the SWT event state mask + * @return a text hover or <code>null</code> if no hover support should be installed + * @since 2.1 + */ + public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType, int stateMask) { + return null; + } /** * Returns the text hover which will provide the information to be shown |