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 * Genady Beryozkin <eclipse@genady.org> - [misc] Display values for constant fields in the Javadoc view - https://bugs.eclipse.org/bugs/show_bug.cgi?id=204914
11 * Brock Janiczak <brockj@tpg.com.au> - [implementation] Streams not being closed in Javadoc views - https://bugs.eclipse.org/bugs/show_bug.cgi?id=214854
12 * Benjamin Muskalla <bmuskalla@innoopract.com> - [javadoc view] NPE on enumerations - https://bugs.eclipse.org/bugs/show_bug.cgi?id=223586
13 *******************************************************************************/
14 package org.eclipse.jdt.internal.ui.infoviews;
16 import java.io.BufferedReader;
17 import java.io.IOException;
18 import java.io.InputStreamReader;
19 import java.io.Reader;
20 import java.io.StringReader;
23 import org.osgi.framework.Bundle;
25 import org.eclipse.swt.SWT;
26 import org.eclipse.swt.SWTError;
27 import org.eclipse.swt.browser.Browser;
28 import org.eclipse.swt.browser.OpenWindowListener;
29 import org.eclipse.swt.browser.WindowEvent;
30 import org.eclipse.swt.custom.StyledText;
31 import org.eclipse.swt.events.ControlAdapter;
32 import org.eclipse.swt.events.ControlEvent;
33 import org.eclipse.swt.events.SelectionAdapter;
34 import org.eclipse.swt.events.SelectionEvent;
35 import org.eclipse.swt.graphics.Color;
36 import org.eclipse.swt.graphics.FontData;
37 import org.eclipse.swt.graphics.RGB;
38 import org.eclipse.swt.graphics.Rectangle;
39 import org.eclipse.swt.widgets.Composite;
40 import org.eclipse.swt.widgets.Control;
41 import org.eclipse.swt.widgets.Display;
43 import org.eclipse.core.runtime.Assert;
44 import org.eclipse.core.runtime.IProgressMonitor;
45 import org.eclipse.core.runtime.ListenerList;
46 import org.eclipse.core.runtime.NullProgressMonitor;
47 import org.eclipse.core.runtime.OperationCanceledException;
48 import org.eclipse.core.runtime.Platform;
50 import org.eclipse.jface.action.Action;
51 import org.eclipse.jface.action.IAction;
52 import org.eclipse.jface.action.IMenuManager;
53 import org.eclipse.jface.action.IToolBarManager;
54 import org.eclipse.jface.action.Separator;
55 import org.eclipse.jface.commands.ActionHandler;
56 import org.eclipse.jface.dialogs.MessageDialogWithToggle;
57 import org.eclipse.jface.internal.text.html.BrowserInput;
58 import org.eclipse.jface.internal.text.html.HTMLPrinter;
59 import org.eclipse.jface.internal.text.html.HTMLTextPresenter;
60 import org.eclipse.jface.preference.IPreferenceStore;
61 import org.eclipse.jface.resource.JFaceResources;
62 import org.eclipse.jface.util.IPropertyChangeListener;
63 import org.eclipse.jface.util.PropertyChangeEvent;
64 import org.eclipse.jface.viewers.ISelection;
65 import org.eclipse.jface.viewers.ISelectionChangedListener;
66 import org.eclipse.jface.viewers.ISelectionProvider;
67 import org.eclipse.jface.viewers.IStructuredSelection;
68 import org.eclipse.jface.viewers.SelectionChangedEvent;
69 import org.eclipse.jface.viewers.StructuredSelection;
70 import org.eclipse.jface.window.Window;
72 import org.eclipse.jface.text.BadLocationException;
73 import org.eclipse.jface.text.BadPartitioningException;
74 import org.eclipse.jface.text.Document;
75 import org.eclipse.jface.text.IDocument;
76 import org.eclipse.jface.text.IDocumentExtension3;
77 import org.eclipse.jface.text.ITextSelection;
78 import org.eclipse.jface.text.Region;
79 import org.eclipse.jface.text.TextPresentation;
80 import org.eclipse.jface.text.TextSelection;
82 import org.eclipse.ui.IActionBars;
83 import org.eclipse.ui.IEditorPart;
84 import org.eclipse.ui.ISharedImages;
85 import org.eclipse.ui.IWorkbenchCommandConstants;
86 import org.eclipse.ui.IWorkbenchPage;
87 import org.eclipse.ui.IWorkbenchPart;
88 import org.eclipse.ui.IWorkbenchPartSite;
89 import org.eclipse.ui.IWorkbenchSite;
90 import org.eclipse.ui.IWorkbenchWindow;
91 import org.eclipse.ui.PartInitException;
92 import org.eclipse.ui.PlatformUI;
93 import org.eclipse.ui.actions.ActionFactory;
94 import org.eclipse.ui.handlers.IHandlerService;
96 import org.eclipse.ui.texteditor.IAbstractTextEditorHelpContextIds;
97 import org.eclipse.ui.texteditor.IDocumentProvider;
98 import org.eclipse.ui.texteditor.ITextEditor;
100 import org.eclipse.jdt.core.IClassFile;
101 import org.eclipse.jdt.core.ICompilationUnit;
102 import org.eclipse.jdt.core.IField;
103 import org.eclipse.jdt.core.IJavaElement;
104 import org.eclipse.jdt.core.IJavaProject;
105 import org.eclipse.jdt.core.ILocalVariable;
106 import org.eclipse.jdt.core.IMember;
107 import org.eclipse.jdt.core.IOpenable;
108 import org.eclipse.jdt.core.IPackageFragmentRoot;
109 import org.eclipse.jdt.core.ISourceRange;
110 import org.eclipse.jdt.core.ITypeRoot;
111 import org.eclipse.jdt.core.JavaCore;
112 import org.eclipse.jdt.core.JavaModelException;
113 import org.eclipse.jdt.core.SourceRange;
114 import org.eclipse.jdt.core.dom.ASTNode;
115 import org.eclipse.jdt.core.dom.ASTParser;
116 import org.eclipse.jdt.core.dom.CompilationUnit;
117 import org.eclipse.jdt.core.dom.Expression;
118 import org.eclipse.jdt.core.dom.IBinding;
119 import org.eclipse.jdt.core.dom.IVariableBinding;
120 import org.eclipse.jdt.core.dom.NodeFinder;
121 import org.eclipse.jdt.core.dom.SimpleName;
122 import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
123 import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
125 import org.eclipse.jdt.internal.corext.javadoc.JavaDocLocations;
126 import org.eclipse.jdt.internal.corext.refactoring.structure.ASTNodeSearchUtil;
127 import org.eclipse.jdt.internal.corext.util.JdtFlags;
128 import org.eclipse.jdt.internal.corext.util.Messages;
130 import org.eclipse.jdt.ui.IContextMenuConstants;
131 import org.eclipse.jdt.ui.JavaElementLabels;
132 import org.eclipse.jdt.ui.JavaUI;
133 import org.eclipse.jdt.ui.PreferenceConstants;
134 import org.eclipse.jdt.ui.SharedASTProvider;
135 import org.eclipse.jdt.ui.actions.IJavaEditorActionDefinitionIds;
136 import org.eclipse.jdt.ui.actions.JdtActionConstants;
137 import org.eclipse.jdt.ui.actions.OpenAttachedJavadocAction;
138 import org.eclipse.jdt.ui.text.IJavaPartitions;
140 import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
141 import org.eclipse.jdt.internal.ui.JavaPlugin;
142 import org.eclipse.jdt.internal.ui.JavaPluginImages;
143 import org.eclipse.jdt.internal.ui.actions.ActionMessages;
144 import org.eclipse.jdt.internal.ui.actions.SimpleSelectionProvider;
145 import org.eclipse.jdt.internal.ui.javaeditor.ASTProvider;
146 import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
147 import org.eclipse.jdt.internal.ui.text.java.hover.JavadocHover;
148 import org.eclipse.jdt.internal.ui.text.javadoc.JavadocContentAccess2;
149 import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels;
150 import org.eclipse.jdt.internal.ui.viewsupport.JavaElementLinks;
154 * View which shows Javadoc for a given Java element.
156 * FIXME: As of 3.0 selectAll() and getSelection() is not working
157 * see https://bugs.eclipse.org/bugs/show_bug.cgi?id=63022
161 public class JavadocView extends AbstractInfoView {
164 * Implementation of a {@link BrowserInput} using
165 * a {@link IJavaElement} as input.
169 private static final class JavaElementBrowserInput extends BrowserInput {
171 private final IJavaElement fInput;
173 public JavaElementBrowserInput(BrowserInput previous, IJavaElement inputElement) {
175 Assert.isNotNull(inputElement);
176 fInput= inputElement;
180 * @see org.eclipse.jdt.internal.ui.infoviews.JavadocView.IBrowserInput#getInputElement()
183 public Object getInputElement() {
188 * @see org.eclipse.jdt.internal.ui.infoviews.JavadocView.IBrowserInput#getInputName()
191 public String getInputName() {
192 return fInput.getElementName();
197 * Implementation of a {@link BrowserInput} using an
198 * {@link URL} as input.
202 private static class URLBrowserInput extends BrowserInput {
204 private final URL fURL;
206 public URLBrowserInput(BrowserInput previous, URL url) {
208 Assert.isNotNull(url);
213 * @see org.eclipse.jdt.internal.ui.infoviews.JavadocView.IBrowserInput#getInputElement()
216 public Object getInputElement() {
221 * @see org.eclipse.jdt.internal.ui.infoviews.JavadocView.IBrowserInput#getInputName()
224 public String getInputName() {
225 return fURL.toExternalForm();
230 * Action to go forward in the history.
234 private final class ForthAction extends Action {
236 public ForthAction() {
237 setText(InfoViewMessages.JavadocView_action_forward_name);
238 ISharedImages images= PlatformUI.getWorkbench().getSharedImages();
239 setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_FORWARD));
240 setDisabledImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_FORWARD_DISABLED));
245 public void update() {
246 if (fCurrent != null && fCurrent.getNext() != null) {
247 BrowserInput element= fCurrent.getNext();
248 setToolTipText(Messages.format(InfoViewMessages.JavadocView_action_forward_enabledTooltip, BasicElementLabels.getJavaElementName(element.getInputName())));
251 setToolTipText(InfoViewMessages.JavadocView_action_forward_disabledTooltip);
257 * @see org.eclipse.jface.action.Action#run()
261 setInput(fCurrent.getNext());
267 * Action to go backwards in the history.
271 private final class BackAction extends Action {
273 public BackAction() {
274 setText(InfoViewMessages.JavadocView_action_back_name);
275 ISharedImages images= PlatformUI.getWorkbench().getSharedImages();
276 setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_BACK));
277 setDisabledImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_BACK_DISABLED));
282 private void update() {
283 if (fCurrent != null && fCurrent.getPrevious() != null) {
284 BrowserInput element= fCurrent.getPrevious();
285 setToolTipText(Messages.format(InfoViewMessages.JavadocView_action_back_enabledTooltip, BasicElementLabels.getJavaElementName(element.getInputName())));
288 setToolTipText(InfoViewMessages.JavadocView_action_back_disabledTooltip);
294 * @see org.eclipse.jface.action.Action#run()
298 setInput(fCurrent.getPrevious());
303 * Action to toggle linking with selection.
307 private class LinkAction extends Action {
309 public LinkAction() {
310 super(InfoViewMessages.JavadocView_action_toogleLinking_text, SWT.TOGGLE);
311 setToolTipText(InfoViewMessages.JavadocView_action_toggleLinking_toolTipText);
312 JavaPluginImages.setLocalImageDescriptors(this, "synced.gif"); //$NON-NLS-1$
313 setChecked(isLinkingEnabled());
317 * @see org.eclipse.jface.action.Action#run()
321 setLinkingEnabled(!isLinkingEnabled());
326 * Action to open the selection in an external browser. If the selection is a java element its
327 * corresponding javadoc is shown if possible. If it is an URL the URL's content is shown.
329 * The action is disabled if the selection can not be opened.
333 private static class OpenInBrowserAction extends OpenAttachedJavadocAction {
336 * Create a new ShowExternalJavadocAction
338 * @param site the site
340 public OpenInBrowserAction(IWorkbenchSite site) {
345 * Method declared on SelectionDispatchAction.
348 public void selectionChanged(IStructuredSelection structuredSelection) {
349 super.selectionChanged(structuredSelection);
350 Object element= structuredSelection.getFirstElement();
351 if (element instanceof URL) {
352 setText(InfoViewMessages.OpenInBrowserAction_url_label);
353 setToolTipText(InfoViewMessages.OpenInBrowserAction_url_toolTip);
355 setText(ActionMessages.OpenAttachedJavadocAction_label);
356 setToolTipText(ActionMessages.OpenAttachedJavadocAction_tooltip);
361 * Method declared on SelectionDispatchAction.
364 public void run(IStructuredSelection selection) {
365 if (!canEnableFor(selection))
368 Object element= selection.getFirstElement();
369 if (element instanceof IJavaElement)
370 super.run(selection);
377 * @see org.eclipse.jdt.ui.actions.OpenAttachedJavadocAction#canEnableFor(org.eclipse.jface.viewers.IStructuredSelection)
380 protected boolean canEnableFor(IStructuredSelection selection) {
381 if (selection.size() != 1)
384 Object element= selection.getFirstElement();
385 return element instanceof URL || super.canEnableFor(selection);
388 public void generated_5908484398134673766(JavadocView javadocview) {
389 setSpecialSelectionProvider(javadocview.fInputSelectionProvider);
390 setImageDescriptor(JavaPluginImages.DESC_ELCL_OPEN_BROWSER);
391 setDisabledImageDescriptor(JavaPluginImages.DESC_DLCL_OPEN_BROWSER);
392 setActionDefinitionId(IJavaEditorActionDefinitionIds.OPEN_ATTACHED_JAVADOC);
393 javadocview.fInputSelectionProvider.addSelectionChangedListener(this);
400 * Preference key for the preference whether to show a dialog
401 * when the SWT Browser widget is not available.
404 private static final String DO_NOT_WARN_PREFERENCE_KEY= "JavadocView.error.doNotWarn"; //$NON-NLS-1$
406 // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=73558
407 private static final boolean WARNING_DIALOG_ENABLED= false;
409 /** Flags used to render a label in the text widget. */
410 private static final long LABEL_FLAGS= JavaElementLabels.ALL_FULLY_QUALIFIED
411 | JavaElementLabels.M_PRE_RETURNTYPE | JavaElementLabels.M_PARAMETER_ANNOTATIONS | JavaElementLabels.M_PARAMETER_TYPES | JavaElementLabels.M_PARAMETER_NAMES | JavaElementLabels.M_EXCEPTIONS
412 | JavaElementLabels.F_PRE_TYPE_SIGNATURE | JavaElementLabels.T_TYPE_PARAMETERS;
415 /** The HTML widget. */
416 private Browser fBrowser;
417 /** The text widget. */
418 private StyledText fText;
419 /** The information presenter. */
420 private HTMLTextPresenter fPresenter;
421 /** The text presentation. */
422 private final TextPresentation fPresentation= new TextPresentation();
423 /** The select all action */
424 private SelectAllAction fSelectAllAction;
425 /** The style sheet (css) */
426 private static String fgStyleSheet;
428 * <code>true</code> once the style sheet has been loaded.
431 private static boolean fgStyleSheetLoaded= false;
433 /** The Browser widget */
434 private boolean fIsUsingBrowserWidget;
436 private RGB fBackgroundColorRGB;
441 private IPropertyChangeListener fFontListener;
444 * Holds original Javadoc input string.
447 private String fOriginalInput;
450 * The current input element if any
453 private BrowserInput fCurrent;
456 * Action to go back in the link history.
459 private BackAction fBackAction;
462 * Action to go forth in the link history.
465 private ForthAction fForthAction;
468 * Action to enable and disable link with selection.
471 private LinkAction fToggleLinkAction;
474 * Action to open the attached Javadoc.
478 private OpenInBrowserAction fOpenBrowserAction;
481 * A selection provider providing the current
482 * Java element input of this view as selection.
485 private ISelectionProvider fInputSelectionProvider;
488 * The Javadoc view's select all action.
490 private class SelectAllAction extends Action {
493 private final Control fControl;
494 /** The selection provider. */
495 private final SelectionProvider fSelectionProvider;
498 * Creates the action.
500 * @param control the widget
501 * @param selectionProvider the selection provider
503 public SelectAllAction(Control control, SelectionProvider selectionProvider) {
504 super("selectAll"); //$NON-NLS-1$
506 Assert.isNotNull(control);
507 Assert.isNotNull(selectionProvider);
509 fSelectionProvider= selectionProvider;
511 // FIXME: see https://bugs.eclipse.org/bugs/show_bug.cgi?id=63022
512 setEnabled(!fIsUsingBrowserWidget);
514 setText(InfoViewMessages.SelectAllAction_label);
515 setToolTipText(InfoViewMessages.SelectAllAction_tooltip);
516 setDescription(InfoViewMessages.SelectAllAction_description);
518 PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IAbstractTextEditorHelpContextIds.SELECT_ALL_ACTION);
522 * Selects all in the view.
526 if (fControl instanceof StyledText)
527 ((StyledText)fControl).selectAll();
529 // FIXME: see https://bugs.eclipse.org/bugs/show_bug.cgi?id=63022
530 // ((Browser)fControl).selectAll();
531 if (fSelectionProvider != null)
532 fSelectionProvider.fireSelectionChanged();
538 * The Javadoc view's selection provider.
540 private static class SelectionProvider implements ISelectionProvider {
542 /** The selection changed listeners. */
543 private final ListenerList fListeners= new ListenerList(ListenerList.IDENTITY);
545 private final Control fControl;
548 * Creates a new selection provider.
550 * @param control the widget
552 public SelectionProvider(Control control) {
553 Assert.isNotNull(control);
555 if (fControl instanceof StyledText) {
556 ((StyledText)fControl).addSelectionListener(new SelectionAdapter() {
558 public void widgetSelected(SelectionEvent e) {
559 fireSelectionChanged();
563 // FIXME: see https://bugs.eclipse.org/bugs/show_bug.cgi?id=63022
564 // ((Browser)fControl).addSelectionListener(new SelectionAdapter() {
565 // public void widgetSelected(SelectionEvent e) {
566 // fireSelectionChanged();
573 * Sends a selection changed event to all listeners.
575 public void fireSelectionChanged() {
576 ISelection selection= getSelection();
577 SelectionChangedEvent event= new SelectionChangedEvent(this, selection);
578 Object[] selectionChangedListeners= fListeners.getListeners();
579 for (int i= 0; i < selectionChangedListeners.length; i++)
580 ((ISelectionChangedListener)selectionChangedListeners[i]).selectionChanged(event);
584 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
586 public void addSelectionChangedListener(ISelectionChangedListener listener) {
587 fListeners.add(listener);
591 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
593 public ISelection getSelection() {
594 if (fControl instanceof StyledText) {
595 IDocument document= new Document(((StyledText)fControl).getSelectionText());
596 return new TextSelection(document, 0, document.getLength());
598 // FIXME: see https://bugs.eclipse.org/bugs/show_bug.cgi?id=63022
599 return StructuredSelection.EMPTY;
604 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
606 public void removeSelectionChangedListener(ISelectionChangedListener listener) {
607 fListeners.remove(listener);
611 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
613 public void setSelection(ISelection selection) {
619 * @see AbstractInfoView#internalCreatePartControl(Composite)
622 protected void internalCreatePartControl(Composite parent) {
624 fBrowser= new Browser(parent, SWT.NONE);
625 fBrowser.setJavascriptEnabled(false);
626 fIsUsingBrowserWidget= true;
627 addLinkListener(fBrowser);
628 fBrowser.addOpenWindowListener(new OpenWindowListener() {
629 public void open(WindowEvent event) {
630 event.required= true; // Cancel opening of new windows
634 } catch (SWTError er) {
636 /* The Browser widget throws an SWTError if it fails to
637 * instantiate properly. Application code should catch
638 * this SWTError and disable any feature requiring the
640 * Platform requirements for the SWT Browser widget are available
641 * from the SWT FAQ web site.
644 IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
645 boolean doNotWarn= store.getBoolean(DO_NOT_WARN_PREFERENCE_KEY);
646 if (WARNING_DIALOG_ENABLED) {
648 String title= InfoViewMessages.JavadocView_error_noBrowser_title;
649 String message= InfoViewMessages.JavadocView_error_noBrowser_message;
650 String toggleMessage= InfoViewMessages.JavadocView_error_noBrowser_doNotWarn;
651 MessageDialogWithToggle dialog= MessageDialogWithToggle.openError(parent.getShell(), title, message, toggleMessage, false, null, null);
652 if (dialog.getReturnCode() == Window.OK)
653 store.setValue(DO_NOT_WARN_PREFERENCE_KEY, dialog.getToggleState());
657 fIsUsingBrowserWidget= false;
660 if (!fIsUsingBrowserWidget) {
661 fText= new StyledText(parent, SWT.V_SCROLL | SWT.H_SCROLL);
662 fText.setEditable(false);
663 fPresenter= new HTMLTextPresenter(false);
665 fText.addControlListener(new ControlAdapter() {
667 * @see org.eclipse.swt.events.ControlAdapter#controlResized(org.eclipse.swt.events.ControlEvent)
670 public void controlResized(ControlEvent e) {
671 doSetInput(fOriginalInput);
677 listenForFontChanges();
678 getViewSite().setSelectionProvider(new SelectionProvider(getControl()));
682 * Registers a listener for the Java editor font.
686 private void listenForFontChanges() {
687 fFontListener= new IPropertyChangeListener() {
688 public void propertyChange(PropertyChangeEvent event) {
689 if (PreferenceConstants.APPEARANCE_JAVADOC_FONT.equals(event.getProperty())) {
690 fgStyleSheetLoaded= false;
691 // trigger reloading, but make sure other listeners have already run, so that
692 // the style sheet gets reloaded only once.
693 final Display display= getSite().getPage().getWorkbenchWindow().getWorkbench().getDisplay();
694 if (!display.isDisposed()) {
695 display.asyncExec(new Runnable() {
697 if (!display.isDisposed()) {
707 JFaceResources.getFontRegistry().addListener(fFontListener);
710 private static void initStyleSheet() {
711 if (fgStyleSheetLoaded)
713 fgStyleSheetLoaded= true;
714 fgStyleSheet= loadStyleSheet();
717 private static String loadStyleSheet() {
718 Bundle bundle= Platform.getBundle(JavaPlugin.getPluginId());
719 URL styleSheetURL= bundle.getEntry("/JavadocViewStyleSheet.css"); //$NON-NLS-1$
720 if (styleSheetURL == null)
723 BufferedReader reader= null;
725 reader= new BufferedReader(new InputStreamReader(styleSheetURL.openStream()));
726 StringBuffer buffer= new StringBuffer(1500);
727 String line= reader.readLine();
728 while (line != null) {
731 line= reader.readLine();
734 FontData fontData= JFaceResources.getFontRegistry().getFontData(PreferenceConstants.APPEARANCE_JAVADOC_FONT)[0];
735 return HTMLPrinter.convertTopLevelFont(buffer.toString(), fontData);
736 } catch (IOException ex) {
743 } catch (IOException e) {
749 * @see AbstractInfoView#createActions()
752 protected void createActions() {
753 super.createActions();
754 fSelectAllAction= new SelectAllAction(getControl(), (SelectionProvider) getSelectionProvider());
756 fBackAction= new BackAction();
757 fBackAction.setActionDefinitionId(IWorkbenchCommandConstants.NAVIGATE_BACK);
758 fForthAction= new ForthAction();
759 fForthAction.setActionDefinitionId(IWorkbenchCommandConstants.NAVIGATE_FORWARD);
761 fToggleLinkAction= new LinkAction();
762 fToggleLinkAction.setActionDefinitionId(IWorkbenchCommandConstants.NAVIGATE_TOGGLE_LINK_WITH_EDITOR);
764 fInputSelectionProvider= new SimpleSelectionProvider();
765 fOpenBrowserAction= new OpenInBrowserAction(getSite());
766 fOpenBrowserAction.generated_5908484398134673766(this);
768 IJavaElement input= getInput();
769 StructuredSelection selection;
771 selection= new StructuredSelection(input);
773 selection= new StructuredSelection();
775 fInputSelectionProvider.setSelection(selection);
779 * @see org.eclipse.jdt.internal.ui.infoviews.AbstractInfoView#fillActionBars(org.eclipse.ui.IActionBars)
783 protected void fillActionBars(final IActionBars actionBars) {
784 super.fillActionBars(actionBars);
786 actionBars.setGlobalActionHandler(ActionFactory.BACK.getId(), fBackAction);
787 actionBars.setGlobalActionHandler(ActionFactory.FORWARD.getId(), fForthAction);
789 fInputSelectionProvider.addSelectionChangedListener(new ISelectionChangedListener() {
790 public void selectionChanged(SelectionChangedEvent event) {
791 actionBars.setGlobalActionHandler(JdtActionConstants.OPEN_ATTACHED_JAVA_DOC, fOpenBrowserAction);
795 IHandlerService handlerService= (IHandlerService) getSite().getService(IHandlerService.class);
796 handlerService.activateHandler(IWorkbenchCommandConstants.NAVIGATE_TOGGLE_LINK_WITH_EDITOR, new ActionHandler(fToggleLinkAction));
800 * @see org.eclipse.jdt.internal.ui.infoviews.AbstractInfoView#fillToolBar(org.eclipse.jface.action.IToolBarManager)
804 protected void fillToolBar(IToolBarManager tbm) {
805 tbm.add(fBackAction);
806 tbm.add(fForthAction);
807 tbm.add(new Separator());
809 tbm.add(fToggleLinkAction);
810 super.fillToolBar(tbm);
811 tbm.add(fOpenBrowserAction);
815 * @see org.eclipse.jdt.internal.ui.infoviews.AbstractInfoView#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
819 public void menuAboutToShow(IMenuManager menu) {
820 super.menuAboutToShow(menu);
822 menu.appendToGroup(IContextMenuConstants.GROUP_GOTO, fBackAction);
823 menu.appendToGroup(IContextMenuConstants.GROUP_GOTO, fForthAction);
825 menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, fOpenBrowserAction);
829 * @see org.eclipse.jdt.internal.ui.infoviews.AbstractInfoView#getSelectAllAction()
833 protected IAction getSelectAllAction() {
834 // FIXME: see https://bugs.eclipse.org/bugs/show_bug.cgi?id=63022
835 if (fIsUsingBrowserWidget)
838 return fSelectAllAction;
842 * @see org.eclipse.jdt.internal.ui.infoviews.AbstractInfoView#getCopyToClipboardAction()
846 protected IAction getCopyToClipboardAction() {
847 // FIXME: see https://bugs.eclipse.org/bugs/show_bug.cgi?id=63022
848 if (fIsUsingBrowserWidget)
851 return super.getCopyToClipboardAction();
855 * @see AbstractInfoView#setForeground(Color)
858 protected void setForeground(Color color) {
859 getControl().setForeground(color);
863 * @see AbstractInfoView#setBackground(Color)
866 protected void setBackground(Color color) {
867 getControl().setBackground(color);
868 fBackgroundColorRGB= color.getRGB();
873 * Refreshes the view.
877 private void refresh() {
878 IJavaElement input= getInput();
880 StringBuffer buffer= new StringBuffer(""); //$NON-NLS-1$
881 HTMLPrinter.insertPageProlog(buffer, 0, null, fBackgroundColorRGB, fgStyleSheet);
882 doSetInput(buffer.toString());
884 doSetInput(computeInput(input));
889 * @see org.eclipse.jdt.internal.ui.infoviews.AbstractInfoView#getBackgroundColorKey()
893 protected String getBackgroundColorKey() {
894 return "org.eclipse.jdt.ui.JavadocView.backgroundColor"; //$NON-NLS-1$
898 * @see AbstractInfoView#internalDispose()
901 protected void internalDispose() {
904 if (fFontListener != null) {
905 JFaceResources.getFontRegistry().removeListener(fFontListener);
909 if (fOpenBrowserAction != null) {
910 fInputSelectionProvider.removeSelectionChangedListener(fOpenBrowserAction);
911 fOpenBrowserAction= null;
916 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
919 public void setFocus() {
920 getControl().setFocus();
924 * @see AbstractInfoView#computeInput(Object)
927 protected Object computeInput(Object input) {
928 if (getControl() == null || ! (input instanceof IJavaElement))
929 return getInputForNull();
931 IWorkbenchPart part= null;
932 IWorkbenchWindow window= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
933 if (window != null) {
934 IWorkbenchPage page= window.getActivePage();
936 part= page.getActivePart();
940 ISelection selection= null;
942 IWorkbenchPartSite site= part.getSite();
944 ISelectionProvider provider= site.getSelectionProvider();
945 if (provider != null) {
946 selection= provider.getSelection();
951 return computeInput(part, selection, (IJavaElement) input, new NullProgressMonitor());
955 * @see org.eclipse.jdt.internal.ui.infoviews.AbstractInfoView#computeInput(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection, org.eclipse.jdt.core.IJavaElement, org.eclipse.core.runtime.IProgressMonitor)
959 protected Object computeInput(IWorkbenchPart part, ISelection selection, IJavaElement input, IProgressMonitor monitor) {
960 if (getControl() == null || input == null)
961 return getInputForNull();
965 switch (input.getElementType()) {
966 case IJavaElement.COMPILATION_UNIT:
968 javadocHtml= getJavadocHtml(((ICompilationUnit) input).getTypes(), part, selection, monitor);
969 } catch (JavaModelException ex) {
973 case IJavaElement.CLASS_FILE:
974 javadocHtml= getJavadocHtml(new IJavaElement[] { ((IClassFile) input).getType() }, part, selection, monitor);
977 javadocHtml= getJavadocHtml(new IJavaElement[] { input }, part, selection, monitor);
980 if (javadocHtml == null)
981 return ""; //$NON-NLS-1$
987 * @see AbstractInfoView#computeDescription(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection, org.eclipse.jdt.core.IJavaElement, org.eclipse.core.runtime.IProgressMonitor)
991 protected String computeDescription(IWorkbenchPart part, ISelection selection, IJavaElement inputElement, IProgressMonitor monitor) {
992 return ""; //$NON-NLS-1$
996 * Set input to the given input.
998 * @param input the input for the view
1001 public void setInput(BrowserInput input) {
1004 Object inputElement= input.getInputElement();
1005 if (inputElement instanceof IJavaElement) {
1006 setInput((IJavaElement) inputElement);
1007 } else if (inputElement instanceof URL) {
1008 fBrowser.setUrl(((URL) inputElement).toExternalForm());
1010 if (fInputSelectionProvider != null)
1011 fInputSelectionProvider.setSelection(new StructuredSelection(inputElement));
1014 fForthAction.update();
1015 fBackAction.update();
1021 * @param input a String containing the HTML to be showin in the view
1024 protected void doSetInput(Object input) {
1025 String javadocHtml= (String)input;
1026 fOriginalInput= javadocHtml;
1028 if (fInputSelectionProvider != null) {
1029 IJavaElement inputElement= getInput();
1030 StructuredSelection selection= inputElement == null ? StructuredSelection.EMPTY : new StructuredSelection(inputElement);
1031 fInputSelectionProvider.setSelection(selection);
1034 if (fIsUsingBrowserWidget) {
1035 if (javadocHtml != null && javadocHtml.length() > 0) {
1036 boolean RTL= (getSite().getShell().getStyle() & SWT.RIGHT_TO_LEFT) != 0;
1038 StringBuffer buffer= new StringBuffer(javadocHtml);
1039 HTMLPrinter.insertStyles(buffer, new String[] { "direction:rtl" } ); //$NON-NLS-1$
1040 javadocHtml= buffer.toString();
1043 fBrowser.setText(javadocHtml);
1045 fPresentation.clear();
1046 Rectangle size= fText.getClientArea();
1049 javadocHtml= fPresenter.updatePresentation(fText, javadocHtml, fPresentation, size.width, size.height);
1050 } catch (IllegalArgumentException ex) {
1051 // the javadoc might no longer be valid
1054 fText.setText(javadocHtml);
1055 TextPresentation.applyTextPresentation(fPresentation, fText);
1060 * Returns the Javadoc in HTML format.
1062 * @param result the Java elements for which to get the Javadoc
1063 * @param activePart the active part if any
1064 * @param selection the selection of the active site if any
1065 * @param monitor a monitor to report progress to
1066 * @return a string with the Javadoc in HTML format.
1068 private String getJavadocHtml(IJavaElement[] result, IWorkbenchPart activePart, ISelection selection, IProgressMonitor monitor) {
1069 StringBuffer buffer= new StringBuffer();
1070 int nResults= result.length;
1078 for (int i= 0; i < result.length; i++) {
1079 HTMLPrinter.startBulletList(buffer);
1080 IJavaElement curr= result[i];
1081 if (curr instanceof IMember || curr.getElementType() == IJavaElement.LOCAL_VARIABLE)
1082 HTMLPrinter.addBullet(buffer, getInfoText(curr, null, false));
1083 HTMLPrinter.endBulletList(buffer);
1088 IJavaElement curr= result[0];
1089 if (curr instanceof IMember) {
1090 final IMember member= (IMember)curr;
1092 String constantValue= null;
1093 if (member instanceof IField) {
1094 constantValue= computeFieldConstant(activePart, selection, (IField) member, monitor);
1095 if (constantValue != null)
1096 constantValue= HTMLPrinter.convertToHTMLContentWithWhitespace(constantValue);
1099 HTMLPrinter.addSmallHeader(buffer, getInfoText(member, constantValue, true));
1102 ISourceRange nameRange= ((IMember)curr).getNameRange();
1103 if (SourceRange.isAvailable(nameRange)) {
1104 ITypeRoot typeRoot= ((IMember)curr).getTypeRoot();
1105 Region hoverRegion= new Region(nameRange.getOffset(), nameRange.getLength());
1106 buffer.append("<br>"); //$NON-NLS-1$
1107 JavadocHover.addAnnotations(buffer, curr, typeRoot, hoverRegion);
1109 } catch (JavaModelException e) {
1110 // no annotations this time...
1115 String content= JavadocContentAccess2.getHTMLContent(member, true);
1116 reader= content == null ? null : new StringReader(content);
1118 // Provide hint why there's no Javadoc
1119 if (reader == null && member.isBinary()) {
1120 boolean hasAttachedJavadoc= JavaDocLocations.getJavadocBaseLocation(member) != null;
1121 IPackageFragmentRoot root= (IPackageFragmentRoot)member.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
1122 boolean hasAttachedSource= root != null && root.getSourceAttachmentPath() != null;
1123 IOpenable openable= member.getOpenable();
1124 boolean hasSource= openable.getBuffer() != null;
1126 if (!hasAttachedSource && !hasAttachedJavadoc)
1127 reader= new StringReader(InfoViewMessages.JavadocView_noAttachments);
1128 else if (!hasAttachedJavadoc && !hasSource)
1129 reader= new StringReader(InfoViewMessages.JavadocView_noAttachedJavadoc);
1130 else if (!hasAttachedSource)
1131 reader= new StringReader(InfoViewMessages.JavadocView_noAttachedSource);
1132 else if (!hasSource)
1133 reader= new StringReader(InfoViewMessages.JavadocView_noInformation);
1136 base= JavaDocLocations.getBaseURL(member);
1139 } catch (JavaModelException ex) {
1140 reader= new StringReader(InfoViewMessages.JavadocView_error_gettingJavadoc);
1141 JavaPlugin.log(ex.getStatus());
1143 if (reader != null) {
1144 HTMLPrinter.addParagraph(buffer, reader);
1147 } else if (curr.getElementType() == IJavaElement.LOCAL_VARIABLE || curr.getElementType() == IJavaElement.TYPE_PARAMETER) {
1148 HTMLPrinter.addSmallHeader(buffer, getInfoText(curr, null, true));
1149 if (curr instanceof ILocalVariable) {
1150 ISourceRange nameRange= ((ILocalVariable) curr).getNameRange();
1151 ITypeRoot typeRoot= ((ILocalVariable) curr).getTypeRoot();
1152 Region hoverRegion= new Region(nameRange.getOffset(), nameRange.getLength());
1153 buffer.append("<br>"); //$NON-NLS-1$
1154 JavadocHover.addAnnotations(buffer, curr, typeRoot, hoverRegion);
1159 HTMLPrinter.insertPageProlog(buffer, 0, null, fBackgroundColorRGB, fgStyleSheet);
1161 int endHeadIdx= buffer.indexOf("</head>"); //$NON-NLS-1$
1162 buffer.insert(endHeadIdx, "\n<base href='" + base + "'>\n"); //$NON-NLS-1$ //$NON-NLS-2$
1164 HTMLPrinter.addPageEpilog(buffer);
1165 return buffer.toString();
1168 private String getInputForNull() {
1169 StringBuffer buffer= new StringBuffer();
1170 HTMLPrinter.insertPageProlog(buffer, 0, null, fBackgroundColorRGB, fgStyleSheet);
1171 HTMLPrinter.addPageEpilog(buffer);
1172 return buffer.toString();
1176 * Gets the label for the given member.
1178 * @param member the Java member
1179 * @param constantValue the constant value if any
1180 * @param allowImage true if the java element image should be shown
1181 * @return a string containing the member's label
1183 private String getInfoText(IJavaElement member, String constantValue, boolean allowImage) {
1184 StringBuffer label= new StringBuffer(JavaElementLinks.getElementLabel(member, LABEL_FLAGS));
1185 if (member.getElementType() == IJavaElement.FIELD && constantValue != null) {
1186 label.append(constantValue);
1189 String imageName= null;
1191 URL imageUrl= JavaPlugin.getDefault().getImagesOnFSRegistry().getImageURL(member);
1192 if (imageUrl != null) {
1193 imageName= imageUrl.toExternalForm();
1197 StringBuffer buf= new StringBuffer();
1198 JavadocHover.addImageAndLabel(buf, member, imageName, 16, 16, label.toString(), 20, 2);
1199 return buf.toString();
1203 * @see org.eclipse.jdt.internal.ui.infoviews.AbstractInfoView#isIgnoringNewInput(org.eclipse.jdt.core.IJavaElement, org.eclipse.jface.viewers.ISelection)
1207 protected boolean isIgnoringNewInput(IJavaElement je, IWorkbenchPart part, ISelection selection) {
1208 if (fCurrent != null && fCurrent.getInputElement() instanceof URL)
1211 if (super.isIgnoringNewInput(je, part, selection)
1212 && part instanceof ITextEditor
1213 && selection instanceof ITextSelection) {
1215 ITextEditor editor= (ITextEditor)part;
1216 IDocumentProvider docProvider= editor.getDocumentProvider();
1217 if (docProvider == null)
1220 IDocument document= docProvider.getDocument(editor.getEditorInput());
1221 if (!(document instanceof IDocumentExtension3))
1225 int offset= ((ITextSelection)selection).getOffset();
1226 String partition= ((IDocumentExtension3)document).getContentType(IJavaPartitions.JAVA_PARTITIONING, offset, false);
1227 return partition != IJavaPartitions.JAVA_DOC;
1228 } catch (BadPartitioningException ex) {
1230 } catch (BadLocationException ex) {
1239 * @see AbstractInfoView#findSelectedJavaElement(IWorkbenchPart)
1242 protected IJavaElement findSelectedJavaElement(IWorkbenchPart part, ISelection selection) {
1243 IJavaElement element;
1245 element= super.findSelectedJavaElement(part, selection);
1247 if (element == null && part instanceof JavaEditor && selection instanceof ITextSelection) {
1249 JavaEditor editor= (JavaEditor)part;
1250 return editor.generated_685633402562717764(part, selection);
1253 } catch (JavaModelException e) {
1255 } catch (BadLocationException e) {
1261 * @see AbstractInfoView#getControl()
1264 protected Control getControl() {
1265 if (fIsUsingBrowserWidget)
1272 * @see org.eclipse.jdt.internal.ui.infoviews.AbstractInfoView#getHelpContextId()
1276 protected String getHelpContextId() {
1277 return IJavaHelpContextIds.JAVADOC_VIEW;
1281 * Compute the textual representation of a 'static' 'final' field's constant initializer value.
1283 * @param activePart the part that triggered the computation, or <code>null</code>
1284 * @param selection the selection that references the field, or <code>null</code>
1285 * @param resolvedField the filed whose constant value will be computed
1286 * @param monitor the progress monitor
1288 * @return the textual representation of the constant, or <code>null</code> if the
1289 * field is not a constant field, the initializer value could not be computed, or
1290 * the progress monitor was cancelled
1293 private String computeFieldConstant(IWorkbenchPart activePart, ISelection selection, IField resolvedField, IProgressMonitor monitor) {
1295 if (!isStaticFinal(resolvedField))
1298 Object constantValue;
1299 IJavaProject preferenceProject;
1301 if (selection instanceof ITextSelection && activePart instanceof JavaEditor) {
1302 IEditorPart editor= (IEditorPart) activePart;
1303 ITypeRoot activeType= JavaUI.getEditorInputTypeRoot(editor.getEditorInput());
1304 preferenceProject= activeType.getJavaProject();
1305 constantValue= getConstantValueFromActiveEditor(activeType, resolvedField, (ITextSelection) selection, monitor);
1306 if (constantValue == null) // fall back - e.g. when selection is inside Javadoc of the element
1307 constantValue= computeFieldConstantFromTypeAST(resolvedField, monitor);
1309 constantValue= computeFieldConstantFromTypeAST(resolvedField, monitor);
1310 preferenceProject= resolvedField.getJavaProject();
1313 if (constantValue != null)
1314 return getFormattedAssignmentOperator(preferenceProject) + formatCompilerConstantValue(constantValue);
1320 * Retrieve a constant initializer value of a field by (AST) parsing field's type.
1322 * @param constantField the constant field
1323 * @param monitor the progress monitor
1324 * @return the constant value of the field, or <code>null</code> if it could not be computed
1325 * (or if the progress was cancelled).
1328 private Object computeFieldConstantFromTypeAST(IField constantField, IProgressMonitor monitor) {
1329 if (monitor.isCanceled())
1332 CompilationUnit ast= SharedASTProvider.getAST(constantField.getTypeRoot(), SharedASTProvider.WAIT_NO, monitor);
1335 if (constantField.isEnumConstant())
1338 VariableDeclarationFragment fieldDecl= ASTNodeSearchUtil.getFieldDeclarationFragmentNode(constantField, ast);
1339 if (fieldDecl == null)
1341 Expression initializer= fieldDecl.getInitializer();
1342 if (initializer == null)
1344 return initializer.resolveConstantExpressionValue();
1345 } catch (JavaModelException e) {
1346 // ignore the exception and try the next method
1350 if (monitor.isCanceled())
1353 ASTParser p= ASTParser.newParser(ASTProvider.SHARED_AST_LEVEL);
1354 p.setProject(constantField.getJavaProject());
1355 IBinding[] createBindings;
1357 createBindings= p.createBindings(new IJavaElement[] { constantField }, monitor);
1358 } catch (OperationCanceledException e) {
1362 IVariableBinding variableBinding= (IVariableBinding) createBindings[0];
1363 if (variableBinding != null)
1364 return variableBinding.getConstantValue();
1370 * Tells whether the given member is static final.
1372 * XXX: Copied from {@link JavadocHover}.
1374 * @param member the member to test
1375 * @return <code>true</code> if static final
1378 private static boolean isStaticFinal(IJavaElement member) {
1379 if (member.getElementType() != IJavaElement.FIELD)
1382 IField field= (IField)member;
1384 return JdtFlags.isFinal(field) && JdtFlags.isStatic(field);
1385 } catch (JavaModelException e) {
1392 * Returns the constant value for a field that is referenced by the currently active type.
1393 * This method does may not run in the main UI thread.
1395 * XXX: This method was part of the JavadocHover#getConstantValue(IField field, IRegion hoverRegion)
1396 * method (lines 299-314).
1398 * @param activeType the type that is currently active
1399 * @param field the field that is being referenced (usually not declared in <code>activeType</code>)
1400 * @param selection the region in <code>activeType</code> that contains the field reference
1401 * @param monitor a progress monitor
1403 * @return the constant value for the given field or <code>null</code> if none
1406 private static Object getConstantValueFromActiveEditor(ITypeRoot activeType, IField field, ITextSelection selection, IProgressMonitor monitor) {
1407 Object constantValue= null;
1409 CompilationUnit unit= SharedASTProvider.getAST(activeType, SharedASTProvider.WAIT_ACTIVE_ONLY, monitor);
1413 ASTNode node= NodeFinder.perform(unit, selection.getOffset(), selection.getLength());
1414 if (node != null && node.getNodeType() == ASTNode.SIMPLE_NAME) {
1415 IBinding binding= ((SimpleName)node).resolveBinding();
1416 if (binding != null && binding.getKind() == IBinding.VARIABLE) {
1417 IVariableBinding variableBinding= (IVariableBinding)binding;
1418 if (field.equals(variableBinding.getJavaElement())) {
1419 constantValue= variableBinding.getConstantValue();
1423 return constantValue;
1427 * Returns the string representation of the given constant value.
1429 * XXX: In {@link JavadocHover} this method was part of JavadocHover#getConstantValue lines 318-361.
1431 * @param constantValue the constant value
1432 * @return the string representation of the given constant value.
1435 private static String formatCompilerConstantValue(Object constantValue) {
1436 if (constantValue instanceof String) {
1437 StringBuffer result= new StringBuffer();
1439 String stringConstant= (String)constantValue;
1440 if (stringConstant.length() > 80) {
1441 result.append(stringConstant.substring(0, 80));
1442 result.append(JavaElementLabels.ELLIPSIS_STRING);
1444 result.append(stringConstant);
1447 return result.toString();
1449 } else if (constantValue instanceof Character) {
1450 String constantResult= '\'' + constantValue.toString() + '\'';
1452 char charValue= ((Character) constantValue).charValue();
1453 String hexString= Integer.toHexString(charValue);
1454 StringBuffer hexResult= new StringBuffer("\\u"); //$NON-NLS-1$
1455 for (int i= hexString.length(); i < 4; i++) {
1456 hexResult.append('0');
1458 hexResult.append(hexString);
1459 return formatWithHexValue(constantResult, hexResult.toString());
1461 } else if (constantValue instanceof Byte) {
1462 int byteValue= ((Byte) constantValue).intValue() & 0xFF;
1463 return formatWithHexValue(constantValue, "0x" + Integer.toHexString(byteValue)); //$NON-NLS-1$
1465 } else if (constantValue instanceof Short) {
1466 int shortValue= ((Short) constantValue).shortValue() & 0xFFFF;
1467 return formatWithHexValue(constantValue, "0x" + Integer.toHexString(shortValue)); //$NON-NLS-1$
1469 } else if (constantValue instanceof Integer) {
1470 int intValue= ((Integer) constantValue).intValue();
1471 return formatWithHexValue(constantValue, "0x" + Integer.toHexString(intValue)); //$NON-NLS-1$
1473 } else if (constantValue instanceof Long) {
1474 long longValue= ((Long) constantValue).longValue();
1475 return formatWithHexValue(constantValue, "0x" + Long.toHexString(longValue)); //$NON-NLS-1$
1478 return constantValue.toString();
1483 * Creates and returns a formatted message for the given
1484 * constant with its hex value.
1486 * XXX: Copied from {@link JavadocHover}.
1489 * @param constantValue the constant value
1490 * @param hexValue the hex value
1491 * @return a formatted string with constant and hex values
1494 private static String formatWithHexValue(Object constantValue, String hexValue) {
1495 return Messages.format(InfoViewMessages.JavadocView_constantValue_hexValue, new String[] { constantValue.toString(), hexValue });
1499 * Returns the assignment operator string with the project's formatting applied to it.
1501 * XXX: This method was extracted from JavadocHover#getInfoText method.
1503 * @param javaProject the Java project whose formatting options will be used.
1504 * @return the formatted assignment operator string.
1507 private static String getFormattedAssignmentOperator(IJavaProject javaProject) {
1508 StringBuffer buffer= new StringBuffer();
1509 if (JavaCore.INSERT.equals(javaProject.getOption(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_ASSIGNMENT_OPERATOR, true)))
1512 if (JavaCore.INSERT.equals(javaProject.getOption(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_ASSIGNMENT_OPERATOR, true)))
1514 return buffer.toString();
1518 * see also org.eclipse.jdt.internal.ui.text.java.hover.JavadocHover.addLinkListener(BrowserInformationControl)
1520 * Add link listener to the given browser
1521 * @param browser the browser to add a listener to
1524 private void addLinkListener(Browser browser) {
1525 browser.addLocationListener(JavaElementLinks.createLocationListener(new JavaElementLinks.ILinkHandler() {
1528 * @see org.eclipse.jdt.internal.ui.viewsupport.JavaElementLinks.ILinkHandler#handleDeclarationLink(org.eclipse.jdt.core.IJavaElement)
1530 public void handleDeclarationLink(IJavaElement target) {
1532 JavaUI.openInEditor(target);
1533 } catch (PartInitException e) {
1535 } catch (JavaModelException e) {
1541 * @see org.eclipse.jdt.internal.ui.viewsupport.JavaElementLinks.ILinkHandler#handleExternalLink(java.net.URL, org.eclipse.swt.widgets.Display)
1543 public boolean handleExternalLink(final URL url, Display display) {
1544 if (fCurrent == null || (fCurrent.getInputElement() instanceof URL && !url.toExternalForm().equals(((URL) fCurrent.getInputElement()).toExternalForm()))) {
1545 fCurrent= new URLBrowserInput(fCurrent, url);
1547 if (fBackAction != null) {
1548 fBackAction.update();
1549 fForthAction.update();
1552 if (fInputSelectionProvider != null)
1553 fInputSelectionProvider.setSelection(new StructuredSelection(url));
1560 * @see org.eclipse.jdt.internal.ui.viewsupport.JavaElementLinks.ILinkHandler#handleInlineJavadocLink(org.eclipse.jdt.core.IJavaElement)
1562 public void handleInlineJavadocLink(IJavaElement target) {
1563 JavaElementBrowserInput newInput= new JavaElementBrowserInput(fCurrent, target);
1564 JavadocView.this.setInput(newInput);
1568 * @see org.eclipse.jdt.internal.ui.viewsupport.JavaElementLinks.ILinkHandler#handleJavadocViewLink(org.eclipse.jdt.core.IJavaElement)
1570 public void handleJavadocViewLink(IJavaElement target) {
1571 handleInlineJavadocLink(target);
1575 * @see org.eclipse.jdt.internal.ui.viewsupport.JavaElementLinks.ILinkHandler#handleTextSet()
1577 public void handleTextSet() {
1578 IJavaElement input= getInput();
1582 if (fCurrent == null || !fCurrent.getInputElement().equals(input)) {
1583 fCurrent= new JavaElementBrowserInput(null, input);
1585 if (fBackAction != null) {
1586 fBackAction.update();
1587 fForthAction.update();