diff options
Diffstat (limited to 'org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java')
-rw-r--r-- | org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java | 87 |
1 files changed, 79 insertions, 8 deletions
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. * |