Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jface.text/src')
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/AbstractHoverInformationControlManager.java53
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerExtension2.java24
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java87
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewerHoverManager.java4
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewer.java12
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewerConfiguration.java30
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

Back to the top