1 /*******************************************************************************
2 * Copyright (c) 2000, 2012 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
9 * IBM Corporation - initial API and implementation
10 * Brock Janiczak <brockj@tpg.com.au> - [implementation] Streams not being closed in Javadoc views - https://bugs.eclipse.org/bugs/show_bug.cgi?id=214854
11 *******************************************************************************/
12 package org.eclipse.jdt.internal.ui.text.java.hover;
14 import org.eclipse.swt.widgets.Shell;
16 import org.eclipse.jface.text.BadLocationException;
17 import org.eclipse.jface.text.DefaultInformationControl;
18 import org.eclipse.jface.text.IDocument;
19 import org.eclipse.jface.text.IInformationControl;
20 import org.eclipse.jface.text.IInformationControlCreator;
21 import org.eclipse.jface.text.IRegion;
22 import org.eclipse.jface.text.ITextHoverExtension;
23 import org.eclipse.jface.text.ITextHoverExtension2;
24 import org.eclipse.jface.text.ITextViewer;
26 import org.eclipse.ui.IEditorInput;
27 import org.eclipse.ui.IEditorPart;
29 import org.eclipse.ui.editors.text.EditorsUI;
31 import org.eclipse.jdt.core.ICodeAssist;
32 import org.eclipse.jdt.core.IJavaElement;
33 import org.eclipse.jdt.core.ITypeRoot;
34 import org.eclipse.jdt.core.JavaModelException;
36 import org.eclipse.jdt.ui.text.java.hover.IJavaEditorTextHover;
38 import org.eclipse.jdt.internal.ui.JavaPlugin;
39 import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
40 import org.eclipse.jdt.internal.ui.javaeditor.IClassFileEditorInput;
41 import org.eclipse.jdt.internal.ui.javaeditor.WorkingCopyManager;
42 import org.eclipse.jdt.internal.ui.text.JavaWordFinder;
46 * Abstract class for providing hover information for Java elements.
50 public abstract class AbstractJavaEditorTextHover implements IJavaEditorTextHover, ITextHoverExtension, ITextHoverExtension2 {
51 private IEditorPart fEditor;
54 * @see IJavaEditorTextHover#setEditor(IEditorPart)
56 public void setEditor(IEditorPart editor) {
60 protected IEditorPart getEditor() {
64 protected ICodeAssist getCodeAssist() {
65 if (fEditor != null) {
66 IEditorInput input= fEditor.getEditorInput();
67 if (input instanceof IClassFileEditorInput) {
68 IClassFileEditorInput cfeInput= (IClassFileEditorInput) input;
69 return cfeInput.getClassFile();
72 WorkingCopyManager manager= JavaPlugin.getDefault().getWorkingCopyManager();
73 return manager.getWorkingCopy(input, false);
80 * @see org.eclipse.jface.text.ITextHoverExtension2#getHoverInfo2(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion)
83 public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) {
84 return getHoverInfo(textViewer, hoverRegion);
88 * @see ITextHover#getHoverRegion(ITextViewer, int)
90 public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
91 return JavaWordFinder.findWord(textViewer.getDocument(), offset);
95 * Returns the Java elements at the given hover region.
97 * @param textViewer the text viewer
98 * @param hoverRegion the hover region
99 * @return the array with the Java elements or <code>null</code>
102 protected IJavaElement[] getJavaElementsAt(ITextViewer textViewer, IRegion hoverRegion) {
104 * The region should be a word region an not of length 0.
105 * This check is needed because codeSelect(...) also finds
106 * the Java element if the offset is behind the word.
108 if (hoverRegion.getLength() == 0)
111 IDocument document= textViewer.getDocument();
112 if (document != null && isInheritDoc(document, hoverRegion))
115 ICodeAssist resolve= getCodeAssist();
116 if (resolve != null) {
118 return resolve.codeSelect(hoverRegion.getOffset(), hoverRegion.getLength());
119 } catch (JavaModelException x) {
127 * Returns whether the word is "inheritDoc".
129 * @param document the document
130 * @param wordRegion the word region
131 * @return <code>true</code> iff the word is "inheritDoc"
134 private static boolean isInheritDoc(IDocument document, IRegion wordRegion) {
136 String word= document.get(wordRegion.getOffset(), wordRegion.getLength());
137 return "inheritDoc".equals(word); //$NON-NLS-1$
138 } catch (BadLocationException e) {
144 * @see ITextHoverExtension#getHoverControlCreator()
147 public IInformationControlCreator getHoverControlCreator() {
148 return new IInformationControlCreator() {
149 public IInformationControl createInformationControl(Shell parent) {
150 return new DefaultInformationControl(parent, EditorsUI.getTooltipAffordanceString());
156 * Delegate method for {@link JavaInformationProvider#getInformationPresenterControlCreator()}
158 * @return the information control creator or null if none is available
161 public IInformationControlCreator getInformationPresenterControlCreator() {
162 return new IInformationControlCreator() {
163 public IInformationControl createInformationControl(Shell shell) {
164 return new DefaultInformationControl(shell, true);
169 protected ITypeRoot getEditorInputJavaElement() {
170 IEditorPart editor= getEditor();
172 return EditorUtility.getEditorInputJavaElement(editor, false);