From 01a5281372254a1c63da9ae5c35b026c650632d1 Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Thu, 20 Mar 2008 16:02:42 +0000 Subject: [PATCH] Adopt ITextHoverExtension2 --- .../c/hover/AbstractCEditorTextHover.java | 35 ++++++++++++---- .../ui/text/c/hover/BestMatchHover.java | 42 +++++++++++++++++-- .../text/c/hover/CEditorTextHoverProxy.java | 36 ++++++++++++---- .../ui/text/c/hover/CInformationProvider.java | 7 ++-- .../text/c/hover/CMacroExpansionControl.java | 11 +++++ .../ui/text/c/hover/CMacroExpansionHover.java | 32 ++++++-------- .../ui/text/c/hover/CMacroExpansionInput.java | 16 ++++--- .../ui/text/c/hover/CSourceHover.java | 4 +- 8 files changed, 135 insertions(+), 48 deletions(-) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/AbstractCEditorTextHover.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/AbstractCEditorTextHover.java index 948eb173c6c..6955dce2dff 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/AbstractCEditorTextHover.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/AbstractCEditorTextHover.java @@ -1,13 +1,14 @@ /******************************************************************************* - * Copyright (c) 2002, 2007 QNX Software Systems and others. + * Copyright (c) 2002, 2008 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX Software Systems - Initial API and implementation - * IBM Corporation + * QNX Software Systems - Initial API and implementation + * IBM Corporation + * Anton Leherbauer (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.ui.text.c.hover; @@ -17,6 +18,7 @@ import org.eclipse.jface.text.IInformationControl; import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextHoverExtension; +import org.eclipse.jface.text.ITextHoverExtension2; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; import org.eclipse.swt.SWT; @@ -31,12 +33,11 @@ import org.eclipse.cdt.internal.ui.text.CWordFinder; import org.eclipse.cdt.internal.ui.text.HTMLTextPresenter; /** - * AbstractCEditorTextHover Abstract class for providing hover information for C + * Abstract class for providing hover information for C * elements. * */ -public abstract class AbstractCEditorTextHover implements ICEditorTextHover, - ITextHoverExtension { +public abstract class AbstractCEditorTextHover implements ICEditorTextHover, ITextHoverExtension, ITextHoverExtension2 { private IEditorPart fEditor; @@ -77,6 +78,13 @@ public abstract class AbstractCEditorTextHover implements ICEditorTextHover, */ public abstract String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion); + /* + * @see ITextHoverExtension2#getHoverInfo2(ITextViewer, IRegion) + */ + public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) { + return getHoverInfo(textViewer, hoverRegion); + } + /* * @see ITextHoverExtension#getHoverControlCreator() * @since 3.0 @@ -90,7 +98,20 @@ public abstract class AbstractCEditorTextHover implements ICEditorTextHover, } }; } - + + /* + * @see org.eclipse.jface.text.ITextHoverExtension2#getInformationPresenterControlCreator() + * @since 5.0 + */ + public IInformationControlCreator getInformationPresenterControlCreator() { + return new IInformationControlCreator() { + public IInformationControl createInformationControl(Shell shell) { + int style= SWT.V_SCROLL | SWT.H_SCROLL; + return new DefaultInformationControl(shell, SWT.RESIZE | SWT.TOOL, style, new HTMLTextPresenter(false)); + } + }; + } + /** * Returns the tool tip affordance string. * diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/BestMatchHover.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/BestMatchHover.java index ff7d5c5f565..d54a4bab4be 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/BestMatchHover.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/BestMatchHover.java @@ -1,12 +1,13 @@ /******************************************************************************* - * Copyright (c) 2002, 2006 QNX Software Systems and others. + * Copyright (c) 2002, 2008 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX Software Systems - Initial API and implementation + * QNX Software Systems - Initial API and implementation + * Anton Leherbauer (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.ui.text.c.hover; @@ -22,6 +23,7 @@ import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextHover; import org.eclipse.jface.text.ITextHoverExtension; +import org.eclipse.jface.text.ITextHoverExtension2; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.information.IInformationProviderExtension2; import org.eclipse.ui.IEditorPart; @@ -29,7 +31,7 @@ import org.eclipse.ui.IEditorPart; /** * BestMatchHover */ -public class BestMatchHover extends AbstractCEditorTextHover implements ITextHoverExtension, IInformationProviderExtension2 { +public class BestMatchHover extends AbstractCEditorTextHover { private List fTextHoverSpecifications; private List fInstantiatedTextHovers; @@ -107,6 +109,38 @@ public class BestMatchHover extends AbstractCEditorTextHover implements ITextHov return null; } + /* + * @see org.eclipse.jface.text.ITextHoverExtension2#getHoverInfo2(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion) + */ + public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) { + + checkTextHovers(); + fBestHover= null; + + if (fInstantiatedTextHovers == null) + return null; + + for (Iterator iterator= fInstantiatedTextHovers.iterator(); iterator.hasNext(); ) { + ITextHover hover= (ITextHover)iterator.next(); + + if (hover instanceof ITextHoverExtension2) { + Object info= ((ITextHoverExtension2) hover).getHoverInfo2(textViewer, hoverRegion); + if (info != null) { + fBestHover= hover; + return info; + } + } else { + String s= hover.getHoverInfo(textViewer, hoverRegion); + if (s != null && s.trim().length() > 0) { + fBestHover= hover; + return s; + } + } + } + + return null; + } + /* * @see org.eclipse.jface.text.ITextHoverExtension#getHoverControlCreator() * @since 3.0 @@ -123,6 +157,8 @@ public class BestMatchHover extends AbstractCEditorTextHover implements ITextHov * @since 3.0 */ public IInformationControlCreator getInformationPresenterControlCreator() { + if (fBestHover instanceof ITextHoverExtension2) + return ((ITextHoverExtension2)fBestHover).getInformationPresenterControlCreator(); if (fBestHover instanceof IInformationProviderExtension2) return ((IInformationProviderExtension2)fBestHover).getInformationPresenterControlCreator(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CEditorTextHoverProxy.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CEditorTextHoverProxy.java index 7d2f1ed9fba..54380c9cd70 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CEditorTextHoverProxy.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CEditorTextHoverProxy.java @@ -1,28 +1,31 @@ /******************************************************************************* - * Copyright (c) 2002, 2006 QNX Software Systems and others. + * Copyright (c) 2002, 2008 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX Software Systems - Initial API and implementation + * QNX Software Systems - Initial API and implementation + * Anton Leherbauer (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.ui.text.c.hover; -import org.eclipse.cdt.ui.text.c.hover.ICEditorTextHover; import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextHoverExtension; +import org.eclipse.jface.text.ITextHoverExtension2; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.information.IInformationProviderExtension2; import org.eclipse.ui.IEditorPart; +import org.eclipse.cdt.ui.text.c.hover.ICEditorTextHover; + /** * CEditorTexHoverProxy */ -public class CEditorTextHoverProxy extends AbstractCEditorTextHover implements ITextHoverExtension, IInformationProviderExtension2 { +public class CEditorTextHoverProxy extends AbstractCEditorTextHover { private CEditorTextHoverDescriptor fHoverDescriptor; private ICEditorTextHover fHover; @@ -66,6 +69,22 @@ public class CEditorTextHoverProxy extends AbstractCEditorTextHover implements I return null; } + + /* + * @see org.eclipse.jface.text.ITextHoverExtension2#getHoverInfo2(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion) + * @since 5.0 + */ + public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) { + if (ensureHoverCreated()) { + if (fHover instanceof ITextHoverExtension2) + return ((ITextHoverExtension2) fHover).getHoverInfo2(textViewer, hoverRegion); + else + return fHover.getHoverInfo(textViewer, hoverRegion); + } + + return null; + } + private boolean ensureHoverCreated() { if (!isEnabled() || fHoverDescriptor == null) return false; @@ -98,9 +117,12 @@ public class CEditorTextHoverProxy extends AbstractCEditorTextHover implements I * @see org.eclipse.jface.text.information.IInformationProviderExtension2#getInformationPresenterControlCreator() */ public IInformationControlCreator getInformationPresenterControlCreator() { - if (ensureHoverCreated() && (fHover instanceof IInformationProviderExtension2)) - return ((IInformationProviderExtension2)fHover).getInformationPresenterControlCreator(); - + if (ensureHoverCreated()) { + if (fHover instanceof ITextHoverExtension2) + return ((ITextHoverExtension2) fHover).getInformationPresenterControlCreator(); + if (fHover instanceof IInformationProviderExtension2) // this is wrong, but left here for backwards compatibility + return ((IInformationProviderExtension2) fHover).getInformationPresenterControlCreator(); + } return null; } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CInformationProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CInformationProvider.java index f6005f3780d..00846a8a4be 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CInformationProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CInformationProvider.java @@ -11,12 +11,12 @@ *******************************************************************************/ package org.eclipse.cdt.internal.ui.text.c.hover; - import org.eclipse.jface.text.AbstractReusableInformationControlCreator; import org.eclipse.jface.text.DefaultInformationControl; import org.eclipse.jface.text.IInformationControl; import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.ITextHoverExtension2; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.information.IInformationProvider; import org.eclipse.jface.text.information.IInformationProviderExtension2; @@ -40,7 +40,6 @@ import org.eclipse.cdt.internal.ui.text.HTMLTextPresenter; */ public class CInformationProvider implements IInformationProvider, IInformationProviderExtension2 { - /** * Default control creator. */ @@ -124,8 +123,8 @@ public class CInformationProvider implements IInformationProvider, IInformationP * @see IInformationProviderExtension2#getInformationPresenterControlCreator() */ public IInformationControlCreator getInformationPresenterControlCreator() { - if (fImplementation instanceof IInformationProviderExtension2) { - IInformationProviderExtension2 ext2= (IInformationProviderExtension2) fImplementation; + if (fImplementation instanceof ITextHoverExtension2) { + ITextHoverExtension2 ext2= (ITextHoverExtension2) fImplementation; return ext2.getInformationPresenterControlCreator(); } if (fPresenterControlCreator == null) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionControl.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionControl.java index 21186ac3e9c..ebeb7c579a0 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionControl.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionControl.java @@ -52,4 +52,15 @@ public class CMacroExpansionControl extends AbstractSourceViewerInformationContr return "org.eclipse.cdt.ui.text.hover.CMacroExpansion"; //$NON-NLS-1$ } + /* + * @see org.eclipse.cdt.internal.ui.text.AbstractSourceViewerInformationControl#setInput(java.lang.Object) + */ + @Override + public void setInput(Object input) { + if (input instanceof CMacroExpansionInput) { + setInformation(((CMacroExpansionInput) input).fExplorer.getFullExpansion().getCodeAfterStep()); + } else { + super.setInput(input); + } + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionHover.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionHover.java index 630878d6722..e761c67f0d7 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionHover.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionHover.java @@ -12,7 +12,6 @@ package org.eclipse.cdt.internal.ui.text.c.hover; import java.lang.ref.Reference; -import java.lang.ref.SoftReference; import org.eclipse.jface.text.IInformationControl; import org.eclipse.jface.text.IInformationControlCreator; @@ -20,7 +19,6 @@ import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; -import org.eclipse.jface.text.information.IInformationProviderExtension2; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.swt.SWT; @@ -32,25 +30,21 @@ import org.eclipse.ui.IEditorPart; * * @since 5.0 */ -public class CMacroExpansionHover extends AbstractCEditorTextHover implements IInformationProviderExtension2 { +public class CMacroExpansionHover extends AbstractCEditorTextHover { - private Reference fCache; + private Reference fCache; - /* - * @see org.eclipse.cdt.internal.ui.text.c.hover.AbstractCEditorTextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion) - */ public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { + Object hoverInfo= getHoverInfo2(textViewer, hoverRegion); + return hoverInfo != null ? hoverInfo.toString() : null; + } + + /* + * @see org.eclipse.cdt.internal.ui.text.c.hover.AbstractCEditorTextHover#getHoverInfo2(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion) + */ + public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) { CMacroExpansionInput input= CMacroExpansionInput.create(getEditor(), hoverRegion, false); - if (input == null) { - return null; - } - fCache= new SoftReference(input); - String result= input.fExplorer.getFullExpansion().getCodeAfterStep(); - if (result.length() == 0) { - // expansion is empty - hover should show empty string - result= "/* EMPTY */"; //$NON-NLS-1$ - } - return result; + return input; } /* @@ -65,7 +59,7 @@ public class CMacroExpansionHover extends AbstractCEditorTextHover implements II } /* - * @see IInformationProviderExtension2#getInformationPresenterControlCreator() + * @see org.eclipse.cdt.internal.ui.text.c.hover.AbstractCEditorTextHover#getInformationPresenterControlCreator() */ public IInformationControlCreator getInformationPresenterControlCreator() { return new IInformationControlCreator() { @@ -81,7 +75,7 @@ public class CMacroExpansionHover extends AbstractCEditorTextHover implements II if (fCache == null) { return null; } - CMacroExpansionInput input= (CMacroExpansionInput) fCache.get(); + CMacroExpansionInput input= fCache.get(); fCache= null; if (input == null) { IEditorPart editor= getEditor(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInput.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInput.java index c7e626f7ff7..57d5886a4c6 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInput.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInput.java @@ -15,6 +15,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; @@ -222,13 +223,19 @@ public class CMacroExpansionInput { } } - MacroExpansionExplorer fExplorer; + final MacroExpansionExplorer fExplorer; boolean fStartWithFullExpansion= true; - private CMacroExpansionInput() { - // forbidden + private CMacroExpansionInput(MacroExpansionExplorer explorer) { + Assert.isNotNull(explorer); + fExplorer= explorer; } + @Override + public String toString() { + return fExplorer.getFullExpansion().getCodeAfterStep(); + } + /** * Creates an input object for the macro expansion exploration control {@link CMacroExpansionExplorationControl}. * @@ -256,8 +263,7 @@ public class CMacroExpansionInput { return null; } - CMacroExpansionInput input= new CMacroExpansionInput(); - input.fExplorer= explorer; + CMacroExpansionInput input= new CMacroExpansionInput(explorer); return input; } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CSourceHover.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CSourceHover.java index b8bd9cd0779..9d1dce900bf 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CSourceHover.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CSourceHover.java @@ -35,12 +35,10 @@ import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IInformationControl; import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.ITextHoverExtension; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.ITypedRegion; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.TextUtilities; -import org.eclipse.jface.text.information.IInformationProviderExtension2; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorInput; @@ -99,7 +97,7 @@ import org.eclipse.cdt.internal.ui.util.EditorUtility; /** * A text hover presenting the source of the element under the cursor. */ -public class CSourceHover extends AbstractCEditorTextHover implements ITextHoverExtension, IInformationProviderExtension2 { +public class CSourceHover extends AbstractCEditorTextHover { private static final boolean DEBUG = false;