diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java index b5fb763c36a..90095640f7a 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java @@ -2515,7 +2515,7 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IC fProjectionSupport.addSummarizableAnnotationType("org.eclipse.search.results"); //$NON-NLS-1$ fProjectionSupport.setHoverControlCreator(new IInformationControlCreator() { public IInformationControl createInformationControl(Shell shell) { - return new SourceViewerInformationControl(shell, SWT.TOOL | SWT.NO_TRIM | getOrientation(), SWT.NONE); + return new SourceViewerInformationControl(shell, false, getOrientation(), null); } }); fProjectionSupport.install(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/AbstractCompareViewerInformationControl.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/AbstractCompareViewerInformationControl.java index eafea150ce6..07ae9fd6411 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/AbstractCompareViewerInformationControl.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/AbstractCompareViewerInformationControl.java @@ -18,9 +18,14 @@ import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.PopupDialog; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; +import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.IInformationControl; +import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IInformationControlExtension; import org.eclipse.jface.text.IInformationControlExtension2; +import org.eclipse.jface.text.IInformationControlExtension3; +import org.eclipse.jface.text.IInformationControlExtension4; +import org.eclipse.jface.text.IInformationControlExtension5; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ViewForm; @@ -30,6 +35,8 @@ import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; @@ -45,7 +52,7 @@ import org.eclipse.cdt.ui.PreferenceConstants; * * @since 5.0 */ -public abstract class AbstractCompareViewerInformationControl extends PopupDialog implements IInformationControl, IInformationControlExtension, IInformationControlExtension2, DisposeListener { +public abstract class AbstractCompareViewerInformationControl extends PopupDialog implements IInformationControl, IInformationControlExtension, IInformationControlExtension2, IInformationControlExtension3, IInformationControlExtension4, IInformationControlExtension5, DisposeListener { protected class CompareViewerControl extends ViewForm { private CompareConfiguration fCompareConfiguration; @@ -281,7 +288,7 @@ public abstract class AbstractCompareViewerInformationControl extends PopupDialo } protected Point getInitialLocation(Point initialSize) { - if (!getPersistBounds()) { + if (!restoresSize()) { Point size = new Point(400, 400); Rectangle parentBounds = getParentShell().getBounds(); int x = parentBounds.x + parentBounds.width / 2 - size.x / 2; @@ -341,7 +348,7 @@ public abstract class AbstractCompareViewerInformationControl extends PopupDialo * {@inheritDoc} */ public void setLocation(Point location) { - if (!getPersistBounds() || getDialogSettings() == null || fUseDefaultBounds) + if (!restoresLocation() || getDialogSettings() == null || fUseDefaultBounds) getShell().setLocation(location); } @@ -349,7 +356,7 @@ public abstract class AbstractCompareViewerInformationControl extends PopupDialo * {@inheritDoc} */ public void setSize(int width, int height) { - if (!getPersistBounds() || getDialogSettings() == null || fUseDefaultBounds) { + if (!restoresSize() || getDialogSettings() == null || fUseDefaultBounds) { getShell().setSize(width, height); } } @@ -433,4 +440,93 @@ public abstract class AbstractCompareViewerInformationControl extends PopupDialo } return settings; } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension3#computeTrim() + */ + public Rectangle computeTrim() { + Rectangle trim= getShell().computeTrim(0, 0, 0, 50); + return trim; + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension3#getBounds() + */ + public Rectangle getBounds() { + return getShell().getBounds(); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension3#restoresLocation() + */ + public boolean restoresLocation() { +// return getPersistLocation(); + return getPersistBounds(); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension3#restoresSize() + */ + public boolean restoresSize() { +// return getPersistSize(); + return getPersistBounds(); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension4#setStatusText(java.lang.String) + */ + public void setStatusText(String statusFieldText) { + setInfoText(statusFieldText); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#computeSizeConstraints(int, int) + */ + public Point computeSizeConstraints(int widthInChars, int heightInChars) { + Font font= JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT); + GC gc= new GC(fCompareViewerControl); + gc.setFont(font); + int width= gc.getFontMetrics().getAverageCharWidth(); + int height= gc.getFontMetrics().getHeight(); + gc.dispose(); + + return new Point(widthInChars * width, heightInChars * height); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#containsControl(org.eclipse.swt.widgets.Control) + */ + public boolean containsControl(Control control) { + do { + if (control == getShell()) + return true; + if (control instanceof Shell) + return false; + control= control.getParent(); + } while (control != null); + return false; + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#isVisible() + */ + public boolean isVisible() { + Shell shell= getShell(); + return shell != null && !shell.isDisposed() && shell.isVisible(); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#getInformationPresenterControlCreator() + */ + public IInformationControlCreator getInformationPresenterControlCreator() { + return null; + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#allowMoveIntoControl() + */ + public boolean allowMoveIntoControl() { + return false; + } + } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/AbstractSourceViewerInformationControl.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/AbstractSourceViewerInformationControl.java index f33ff0e7083..22251c5e44d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/AbstractSourceViewerInformationControl.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/AbstractSourceViewerInformationControl.java @@ -23,8 +23,12 @@ import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IInformationControl; +import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IInformationControlExtension; import org.eclipse.jface.text.IInformationControlExtension2; +import org.eclipse.jface.text.IInformationControlExtension3; +import org.eclipse.jface.text.IInformationControlExtension4; +import org.eclipse.jface.text.IInformationControlExtension5; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.jface.viewers.Viewer; @@ -37,6 +41,7 @@ import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; @@ -56,7 +61,7 @@ import org.eclipse.cdt.internal.ui.editor.CSourceViewer; * * @since 5.0 */ -public abstract class AbstractSourceViewerInformationControl extends PopupDialog implements IInformationControl, IInformationControlExtension, IInformationControlExtension2, DisposeListener { +public abstract class AbstractSourceViewerInformationControl extends PopupDialog implements IInformationControl, IInformationControlExtension, IInformationControlExtension2, IInformationControlExtension3, IInformationControlExtension4, IInformationControlExtension5, DisposeListener { private int fTextStyle; @@ -70,7 +75,11 @@ public abstract class AbstractSourceViewerInformationControl extends PopupDialog private int fMaxHeight; - private List fColorExclusionControls= new ArrayList(); + private List fColorExclusionControls= new ArrayList(); + + private Font fTextFont; + + private StyledText fText; /** * Creates a source viewer information control with the given shell as parent. The given @@ -118,8 +127,8 @@ public abstract class AbstractSourceViewerInformationControl extends PopupDialog */ protected Control createContents(Composite parent) { Control contents= super.createContents(parent); - for (Iterator it= fColorExclusionControls.iterator(); it.hasNext(); ) { - Control ctrl = (Control) it.next(); + for (Iterator it= fColorExclusionControls.iterator(); it.hasNext(); ) { + Control ctrl = it.next(); ctrl.setBackground(fBackgroundColor); } return contents; @@ -150,23 +159,23 @@ public abstract class AbstractSourceViewerInformationControl extends PopupDialog return ((Viewer)fSourceViewer).getControl(); } - protected ISourceViewer createSourceViewer(Composite parent, int style) { + protected final ISourceViewer createSourceViewer(Composite parent, int style) { IPreferenceStore store= CUIPlugin.getDefault().getCombinedPreferenceStore(); SourceViewer sourceViewer= new CSourceViewer(parent, null, null, false, style, store); CTextTools tools= CUIPlugin.getDefault().getTextTools(); sourceViewer.configure(new SimpleCSourceViewerConfiguration(tools.getColorManager(), store, null, ICPartitions.C_PARTITIONING, false)); sourceViewer.setEditable(false); - StyledText styledText= sourceViewer.getTextWidget(); + fText= sourceViewer.getTextWidget(); GridData gd= new GridData(GridData.BEGINNING | GridData.FILL_BOTH); - styledText.setLayoutData(gd); + fText.setLayoutData(gd); initializeColors(); - styledText.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND)); - styledText.setBackground(fBackgroundColor); - fColorExclusionControls.add(styledText); + fText.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND)); + fText.setBackground(fBackgroundColor); + fColorExclusionControls.add(fText); - Font font= JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT); - styledText.setFont(font); + fTextFont= JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT); + fText.setFont(fTextFont); return sourceViewer; } @@ -192,8 +201,8 @@ public abstract class AbstractSourceViewerInformationControl extends PopupDialog /* * @see org.eclipse.jface.dialogs.PopupDialog#getBackgroundColorExclusions() */ - protected List getBackgroundColorExclusions() { - List exclusions= super.getBackgroundColorExclusions(); + protected List getBackgroundColorExclusions() { + List exclusions= super.getBackgroundColorExclusions(); exclusions.addAll(fColorExclusionControls); return exclusions; } @@ -201,8 +210,8 @@ public abstract class AbstractSourceViewerInformationControl extends PopupDialog /* * @see org.eclipse.jface.dialogs.PopupDialog#getForegroundColorExclusions() */ - protected List getForegroundColorExclusions() { - List exclusions= super.getForegroundColorExclusions(); + protected List getForegroundColorExclusions() { + List exclusions= super.getForegroundColorExclusions(); exclusions.addAll(fColorExclusionControls); return exclusions; } @@ -305,7 +314,7 @@ public abstract class AbstractSourceViewerInformationControl extends PopupDialog } protected Point getInitialLocation(Point initialSize) { - if (!getPersistBounds()) { + if (!restoresLocation()) { Point size = new Point(400, 400); Rectangle parentBounds = getParentShell().getBounds(); int x = parentBounds.x + parentBounds.width / 2 - size.x / 2; @@ -366,7 +375,7 @@ public abstract class AbstractSourceViewerInformationControl extends PopupDialog * {@inheritDoc} */ public void setLocation(Point location) { - if (!getPersistBounds() || getDialogSettings() == null) + if (!restoresLocation() || getDialogSettings() == null) getShell().setLocation(location); } @@ -374,7 +383,7 @@ public abstract class AbstractSourceViewerInformationControl extends PopupDialog * {@inheritDoc} */ public void setSize(int width, int height) { - if (!getPersistBounds() || getDialogSettings() == null) { + if (!restoresSize() || getDialogSettings() == null) { getShell().setSize(width, height); } } @@ -457,4 +466,91 @@ public abstract class AbstractSourceViewerInformationControl extends PopupDialog return settings; } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension3#computeTrim() + */ + public Rectangle computeTrim() { + return getShell().computeTrim(0, 0, 0, 0); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension3#getBounds() + */ + public Rectangle getBounds() { + return getShell().getBounds(); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension3#restoresLocation() + */ + public boolean restoresLocation() { +// return getPersistLocation(); + return getPersistBounds(); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension3#restoresSize() + */ + public boolean restoresSize() { +// return getPersistSize(); + return getPersistBounds(); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension4#setStatusText(java.lang.String) + */ + public void setStatusText(String statusFieldText) { + setInfoText(statusFieldText); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#computeSizeConstraints(int, int) + */ + public Point computeSizeConstraints(int widthInChars, int heightInChars) { + GC gc= new GC(fText); + gc.setFont(fTextFont); + int width= gc.getFontMetrics().getAverageCharWidth(); + int height= gc.getFontMetrics().getHeight(); + gc.dispose(); + + return new Point(widthInChars * width, heightInChars * height); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#containsControl(org.eclipse.swt.widgets.Control) + */ + public boolean containsControl(Control control) { + do { + if (control == getShell()) + return true; + if (control instanceof Shell) + return false; + control= control.getParent(); + } while (control != null); + return false; + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#isVisible() + */ + public boolean isVisible() { + Shell shell= getShell(); + return shell != null && !shell.isDisposed() && shell.isVisible(); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#getInformationPresenterControlCreator() + */ + public IInformationControlCreator getInformationPresenterControlCreator() { + return null; + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#allowMoveIntoControl() + */ + public boolean allowMoveIntoControl() { + return false; + } + } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java index 56dac58fc87..6632d9deed5 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java @@ -929,9 +929,7 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { private IInformationControlCreator getMacroExplorationControlCreator() { final IInformationControlCreator conrolCreator = new IInformationControlCreator() { public IInformationControl createInformationControl(Shell parent) { - int shellStyle= SWT.RESIZE; - int textStyle= SWT.V_SCROLL | SWT.H_SCROLL; - return new CMacroExpansionExplorationControl(parent, shellStyle, textStyle); + return new CMacroExpansionExplorationControl(parent); } }; return conrolCreator; 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 6955dce2dff..c343853ab92 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 @@ -21,6 +21,7 @@ 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.jface.text.information.IInformationProviderExtension2; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Shell; @@ -37,7 +38,7 @@ import org.eclipse.cdt.internal.ui.text.HTMLTextPresenter; * elements. * */ -public abstract class AbstractCEditorTextHover implements ICEditorTextHover, ITextHoverExtension, ITextHoverExtension2 { +public abstract class AbstractCEditorTextHover implements ICEditorTextHover, ITextHoverExtension, ITextHoverExtension2, IInformationProviderExtension2 { private IEditorPart fEditor; 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 d54a4bab4be..2827c1390b1 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 @@ -157,8 +157,7 @@ public class BestMatchHover extends AbstractCEditorTextHover { * @since 3.0 */ public IInformationControlCreator getInformationPresenterControlCreator() { - if (fBestHover instanceof ITextHoverExtension2) - return ((ITextHoverExtension2)fBestHover).getInformationPresenterControlCreator(); + // this is wrong, but left here for backwards compatibility 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 54380c9cd70..4f0f4aed8f5 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 @@ -118,9 +118,8 @@ public class CEditorTextHoverProxy extends AbstractCEditorTextHover { */ public IInformationControlCreator getInformationPresenterControlCreator() { if (ensureHoverCreated()) { - if (fHover instanceof ITextHoverExtension2) - return ((ITextHoverExtension2) fHover).getInformationPresenterControlCreator(); - if (fHover instanceof IInformationProviderExtension2) // this is wrong, but left here for backwards compatibility + // this is wrong, but left here for backwards compatibility + if (fHover instanceof IInformationProviderExtension2) 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 00846a8a4be..fadcc21a843 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 @@ -16,11 +16,9 @@ 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; -import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IPartListener; @@ -29,8 +27,6 @@ import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.cdt.ui.text.c.hover.ICEditorTextHover; -import org.eclipse.cdt.internal.ui.text.HTMLTextPresenter; - /** * Provides information for the current word under the cursor based on the documentation hover. @@ -45,9 +41,7 @@ public class CInformationProvider implements IInformationProvider, IInformationP */ private static final class ControlCreator extends AbstractReusableInformationControlCreator { public IInformationControl doCreateInformationControl(Shell parent) { - int shellStyle= SWT.RESIZE | SWT.TOOL; - int style= SWT.V_SCROLL | SWT.H_SCROLL; - return new DefaultInformationControl(parent, shellStyle, style, new HTMLTextPresenter(false)); + return new DefaultInformationControl(parent); } } @@ -123,10 +117,6 @@ public class CInformationProvider implements IInformationProvider, IInformationP * @see IInformationProviderExtension2#getInformationPresenterControlCreator() */ public IInformationControlCreator getInformationPresenterControlCreator() { - if (fImplementation instanceof ITextHoverExtension2) { - ITextHoverExtension2 ext2= (ITextHoverExtension2) fImplementation; - return ext2.getInformationPresenterControlCreator(); - } if (fPresenterControlCreator == null) fPresenterControlCreator= new ControlCreator(); return fPresenterControlCreator; 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 ebeb7c579a0..449327dc9fc 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 @@ -12,6 +12,8 @@ package org.eclipse.cdt.internal.ui.text.c.hover; import org.eclipse.jface.dialogs.PopupDialog; +import org.eclipse.jface.text.IInformationControl; +import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Shell; @@ -58,9 +60,29 @@ public class CMacroExpansionControl extends AbstractSourceViewerInformationContr @Override public void setInput(Object input) { if (input instanceof CMacroExpansionInput) { - setInformation(((CMacroExpansionInput) input).fExplorer.getFullExpansion().getCodeAfterStep()); + CMacroExpansionInput macroExpansionInput= (CMacroExpansionInput) input; + setInformation(macroExpansionInput.fExplorer.getFullExpansion().getCodeAfterStep()); } else { super.setInput(input); } } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#getInformationPresenterControlCreator() + */ + public IInformationControlCreator getInformationPresenterControlCreator() { + return new IInformationControlCreator() { + public IInformationControl createInformationControl(Shell parent) { + return new CMacroExpansionExplorationControl(parent); + } + }; + } + + /* + * @see org.eclipse.cdt.internal.ui.text.AbstractSourceViewerInformationControl#allowMoveIntoControl() + */ + @Override + public boolean allowMoveIntoControl() { + return true; + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionExplorationControl.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionExplorationControl.java index b7a378bfdbc..7fe51ee771b 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionExplorationControl.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionExplorationControl.java @@ -40,6 +40,7 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; @@ -110,17 +111,16 @@ public class CMacroExpansionExplorationControl extends AbstractCompareViewerInfo private CMacroExpansionInput fInput; private CMacroCompareViewer fMacroCompareViewer; private ISourceViewer fMacroViewer; + private StyledText fMacroText; /** * Creates a new control for use as a "quick view" where the control immediately takes the focus. * * @param parent parent shell - * @param shellStyle shell style bits - * @param style text viewer style bits * @param input the input object, may be null */ - public CMacroExpansionExplorationControl(Shell parent, int shellStyle, int style, CMacroExpansionInput input) { - super(parent, shellStyle, style, true, true, true); + public CMacroExpansionExplorationControl(Shell parent, CMacroExpansionInput input) { + super(parent, SWT.RESIZE, SWT.NONE, true, true, true); setMacroExpansionInput(input); } @@ -128,11 +128,9 @@ public class CMacroExpansionExplorationControl extends AbstractCompareViewerInfo * Creates a new control for use as a "quick view" where the control immediately takes the focus. * * @param parent parent shell - * @param shellStyle shell style bits - * @param textStyle text viewer style bits */ - public CMacroExpansionExplorationControl(Shell parent, int shellStyle, int textStyle) { - this(parent, shellStyle, textStyle, null); + public CMacroExpansionExplorationControl(Shell parent) { + this(parent, null); } /* @@ -173,15 +171,15 @@ public class CMacroExpansionExplorationControl extends AbstractCompareViewerInfo sourceViewer.configure(new SimpleCSourceViewerConfiguration(tools.getColorManager(), store, null, ICPartitions.C_PARTITIONING, false)); sourceViewer.setEditable(false); - StyledText styledText= sourceViewer.getTextWidget(); + fMacroText= sourceViewer.getTextWidget(); Font font= JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT); - styledText.setFont(font); + fMacroText.setFont(font); GridData gd= new GridData(GridData.BEGINNING | GridData.FILL_BOTH); - gd.heightHint= styledText.getLineHeight() * 2; - styledText.setLayoutData(gd); - styledText.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND)); + gd.heightHint= fMacroText.getLineHeight() * 2; + fMacroText.setLayoutData(gd); + fMacroText.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND)); final Document doc= new Document(); CUIPlugin.getDefault().getTextTools().setupCDocument(doc); @@ -347,6 +345,16 @@ public class CMacroExpansionExplorationControl extends AbstractCompareViewerInfo } } + /* + * @see org.eclipse.cdt.internal.ui.text.AbstractCompareViewerInformationControl#computeTrim() + */ + @Override + public Rectangle computeTrim() { + Rectangle trim= super.computeTrim(); + trim.height += fMacroText.getLineHeight(); + return trim; + } + /** * Set the input for this information control. * @param 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 e761c67f0d7..6cbc096a0a9 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 @@ -21,7 +21,6 @@ import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorPart; @@ -64,9 +63,7 @@ public class CMacroExpansionHover extends AbstractCEditorTextHover { public IInformationControlCreator getInformationPresenterControlCreator() { return new IInformationControlCreator() { public IInformationControl createInformationControl(Shell parent) { - int shellStyle= SWT.RESIZE; - int style= SWT.V_SCROLL | SWT.H_SCROLL; - return new CMacroExpansionExplorationControl(parent, shellStyle, style, getCachedMacroExpansionInput()); + return new CMacroExpansionExplorationControl(parent, getCachedMacroExpansionInput()); } }; } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInformationProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInformationProvider.java index 8fc07a87837..5cc42809394 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInformationProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInformationProvider.java @@ -8,15 +8,18 @@ * Contributors: * Anton Leherbauer (Wind River Systems) - initial API and implementation *******************************************************************************/ - package org.eclipse.cdt.internal.ui.text.c.hover; +import org.eclipse.jface.text.IInformationControl; +import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.information.IInformationProvider; import org.eclipse.jface.text.information.IInformationProviderExtension; +import org.eclipse.jface.text.information.IInformationProviderExtension2; import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.texteditor.ITextEditor; @@ -25,7 +28,7 @@ import org.eclipse.ui.texteditor.ITextEditor; * * @since 5.0 */ -public class CMacroExpansionInformationProvider implements IInformationProvider, IInformationProviderExtension { +public class CMacroExpansionInformationProvider implements IInformationProvider, IInformationProviderExtension, IInformationProviderExtension2 { private final ITextEditor fEditor; @@ -55,4 +58,15 @@ public class CMacroExpansionInformationProvider implements IInformationProvider, return CMacroExpansionInput.create(fEditor, subject, true); } + /* + * @see org.eclipse.jface.text.information.IInformationProviderExtension2#getInformationPresenterControlCreator() + */ + public IInformationControlCreator getInformationPresenterControlCreator() { + return new IInformationControlCreator() { + public IInformationControl createInformationControl(Shell parent) { + return new CMacroExpansionExplorationControl(parent); + } + }; + } + } 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 9d1dce900bf..222f461663a 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 @@ -43,6 +43,7 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.part.IWorkbenchPartOrientation; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.IPositionConverter; @@ -841,7 +842,11 @@ public class CSourceHover extends AbstractCEditorTextHover { public IInformationControlCreator getHoverControlCreator() { return new IInformationControlCreator() { public IInformationControl createInformationControl(Shell parent) { - return new SourceViewerInformationControl(parent, getTooltipAffordanceString()); + IEditorPart editor= getEditor(); + int orientation= SWT.NONE; + if (editor instanceof IWorkbenchPartOrientation) + orientation= ((IWorkbenchPartOrientation) editor).getOrientation(); + return new SourceViewerInformationControl(parent, false, orientation, getTooltipAffordanceString()); } }; } @@ -853,9 +858,11 @@ public class CSourceHover extends AbstractCEditorTextHover { public IInformationControlCreator getInformationPresenterControlCreator() { return new IInformationControlCreator() { public IInformationControl createInformationControl(Shell parent) { - int shellStyle= SWT.RESIZE; - int style= SWT.V_SCROLL | SWT.H_SCROLL; - return new SourceViewerInformationControl(parent, shellStyle, style); + IEditorPart editor= getEditor(); + int orientation= SWT.NONE; + if (editor instanceof IWorkbenchPartOrientation) + orientation= ((IWorkbenchPartOrientation) editor).getOrientation(); + return new SourceViewerInformationControl(parent, true, orientation, getTooltipAffordanceString()); } }; } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/SourceViewerInformationControl.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/SourceViewerInformationControl.java index 62e9128a851..f673739c791 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/SourceViewerInformationControl.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/SourceViewerInformationControl.java @@ -12,13 +12,17 @@ package org.eclipse.cdt.internal.ui.text.c.hover; +import org.eclipse.core.runtime.Assert; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IInformationControl; +import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IInformationControlExtension; +import org.eclipse.jface.text.IInformationControlExtension3; +import org.eclipse.jface.text.IInformationControlExtension5; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.swt.SWT; @@ -31,11 +35,14 @@ import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; @@ -54,7 +61,7 @@ import org.eclipse.cdt.internal.ui.text.SimpleCSourceViewerConfiguration; * Displays information in a source viewer. * */ -public class SourceViewerInformationControl implements IInformationControl, IInformationControlExtension, DisposeListener { +public class SourceViewerInformationControl implements IInformationControl, IInformationControlExtension, IInformationControlExtension3, IInformationControlExtension5, DisposeListener { /** Border thickness in pixels. */ private static final int BORDER= 1; @@ -64,6 +71,8 @@ public class SourceViewerInformationControl implements IInformationControl, IInf private StyledText fText; /** The control's source viewer */ private SourceViewer fViewer; + /** The text font (do not dispose!) */ + private Font fTextFont; /** * The optional status field. * @@ -92,6 +101,11 @@ public class SourceViewerInformationControl implements IInformationControl, IInf * @since 4.0 */ private int fMaxHeight= SWT.DEFAULT; + /** + * The orientation of the shell + * @since 3.4 + */ + private final int fOrientation; private Color fBackgroundColor; private boolean fIsSystemBackgroundColor= true; @@ -102,29 +116,21 @@ public class SourceViewerInformationControl implements IInformationControl, IInf * styles are applied to the created styled text widget. * * @param parent the parent shell - * @param shellStyle the additional styles for the shell - * @param style the additional styles for the styled text widget - */ - public SourceViewerInformationControl(Shell parent, int shellStyle, int style) { - this(parent, shellStyle, style, null); - } - - /** - * Creates a default information control with the given shell as parent. The given - * information presenter is used to process the information to be displayed. The given - * styles are applied to the created styled text widget. - * - * @param parent the parent shell - * @param shellStyle the additional styles for the shell - * @param style the additional styles for the styled text widget + * @param isResizable true if resizable + * @param orientation the orientation * @param statusFieldText the text to be used in the optional status field * or null if the status field should be hidden - * @since 3.0 */ - public SourceViewerInformationControl(Shell parent, int shellStyle, int style, String statusFieldText) { + public SourceViewerInformationControl(Shell parent, boolean isResizable, int orientation, String statusFieldText) { + Assert.isLegal(orientation == SWT.RIGHT_TO_LEFT || orientation == SWT.LEFT_TO_RIGHT || orientation == SWT.NONE); + fOrientation= orientation; + GridLayout layout; GridData gd; + int shellStyle= SWT.TOOL | SWT.ON_TOP | orientation | (isResizable ? SWT.RESIZE : 0); + int textStyle= isResizable ? SWT.V_SCROLL | SWT.H_SCROLL : SWT.NONE; + fShell= new Shell(parent, SWT.NO_FOCUS | SWT.ON_TOP | shellStyle); Display display= fShell.getDisplay(); fShell.setBackground(display.getSystemColor(SWT.COLOR_BLACK)); @@ -154,7 +160,7 @@ public class SourceViewerInformationControl implements IInformationControl, IInf // Source viewer IPreferenceStore store= CUIPlugin.getDefault().getCombinedPreferenceStore(); - fViewer= new CSourceViewer(composite, null, null, false, style, store); + fViewer= new CSourceViewer(composite, null, null, false, textStyle, store); CTextTools tools= CUIPlugin.getDefault().getTextTools(); fViewer.configure(new SimpleCSourceViewerConfiguration(tools.getColorManager(), store, null, ICPartitions.C_PARTITIONING, false)); fViewer.setEditable(false); @@ -222,67 +228,15 @@ public class SourceViewerInformationControl implements IInformationControl, IInf : PreferenceConverter.getColor(store, PreferenceConstants.EDITOR_SOURCE_HOVER_BACKGROUND_COLOR); } - /** - * Creates a default information control with the given shell as parent. The given - * information presenter is used to process the information to be displayed. The given - * styles are applied to the created styled text widget. - * - * @param parent the parent shell - * @param style the additional styles for the styled text widget - */ - public SourceViewerInformationControl(Shell parent,int style) { - this(parent, SWT.NO_TRIM | SWT.TOOL, style); - } - - /** - * Creates a default information control with the given shell as parent. The given - * information presenter is used to process the information to be displayed. The given - * styles are applied to the created styled text widget. - * - * @param parent the parent shell - * @param style the additional styles for the styled text widget - * @param statusFieldText the text to be used in the optional status field - * or null if the status field should be hidden - * @since 3.0 - */ - public SourceViewerInformationControl(Shell parent, int style, String statusFieldText) { - this(parent, SWT.NO_TRIM | SWT.TOOL, style, statusFieldText); - } - - /** - * Creates a default information control with the given shell as parent. - * No information presenter is used to process the information - * to be displayed. No additional styles are applied to the styled text widget. - * - * @param parent the parent shell - */ - public SourceViewerInformationControl(Shell parent) { - this(parent, SWT.NONE); - } - - /** - * Creates a default information control with the given shell as parent. - * No information presenter is used to process the information - * to be displayed. No additional styles are applied to the styled text widget. - * - * @param parent the parent shell - * @param statusFieldText the text to be used in the optional status field - * or null if the status field should be hidden - * @since 3.0 - */ - public SourceViewerInformationControl(Shell parent, String statusFieldText) { - this(parent, SWT.NONE, statusFieldText); - } - /** * Initialize the font to the editor font. * * @since 4.0 */ private void initializeFont() { - Font font= JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT); + fTextFont= JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT); StyledText styledText= getViewer().getTextWidget(); - styledText.setFont(font); + styledText.setFont(fTextFont); } /* @@ -461,4 +415,113 @@ public class SourceViewerInformationControl implements IInformationControl, IInf return fViewer; } + /* + * @see org.eclipse.jface.text.IInformationControlExtension3#computeTrim() + * @since 5.0 + */ + public Rectangle computeTrim() { + Rectangle trim= fShell.computeTrim(0, 0, 0, 0); + addInternalTrim(trim); + return trim; + } + + /** + * Adds the internal trimmings to the given trim of the shell. + * + * @param trim the shell's trim, will be updated + * @since 5.0 + */ + private void addInternalTrim(Rectangle trim) { + Rectangle textTrim= fText.computeTrim(0, 0, 0, 0); + trim.x+= textTrim.x; + trim.y+= textTrim.y; + trim.width+= textTrim.width; + trim.height+= textTrim.height; + + if (fStatusField != null) { + trim.height+= fSeparator.computeSize(SWT.DEFAULT, SWT.DEFAULT).y; + trim.height+= fStatusField.computeSize(SWT.DEFAULT, SWT.DEFAULT).y; + trim.height+= 1; // verticalSpacing + } + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension3#getBounds() + * @since 5.0 + */ + public Rectangle getBounds() { + return fShell.getBounds(); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension3#restoresLocation() + * @since 5.0 + */ + public boolean restoresLocation() { + return false; + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension3#restoresSize() + * @since 5.0 + */ + public boolean restoresSize() { + return false; + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#getInformationPresenterControlCreator() + * @since 5.0 + */ + public IInformationControlCreator getInformationPresenterControlCreator() { + return new IInformationControlCreator() { + public IInformationControl createInformationControl(Shell parent) { + return new SourceViewerInformationControl(parent, true, fOrientation, null); + } + }; + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#containsControl(org.eclipse.swt.widgets.Control) + * @since 5.0 + */ + public boolean containsControl(Control control) { + do { + if (control == fShell) + return true; + if (control instanceof Shell) + return false; + control= control.getParent(); + } while (control != null); + return false; + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#isVisible() + * @since 5.0 + */ + public boolean isVisible() { + return fShell != null && !fShell.isDisposed() && fShell.isVisible(); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#computeSizeConstraints(int, int) + */ + public Point computeSizeConstraints(int widthInChars, int heightInChars) { + GC gc= new GC(fText); + gc.setFont(fTextFont); + int width= gc.getFontMetrics().getAverageCharWidth(); + int height= gc.getFontMetrics().getHeight(); + gc.dispose(); + + return new Point(widthInChars * width, heightInChars * height); + } + + /* + * @see org.eclipse.jface.text.IInformationControlExtension5#allowMoveIntoControl() + */ + public boolean allowMoveIntoControl() { + return true; + } + } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/template/TemplateEngine.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/template/TemplateEngine.java index b7fceb0e058..fa2a502c500 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/template/TemplateEngine.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/template/TemplateEngine.java @@ -64,15 +64,14 @@ public class TemplateEngine { public class CTemplateProposal extends TemplateProposal implements ICCompletionProposal { - /* (non-Javadoc) + /* * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension3#getInformationControlCreator() */ public IInformationControlCreator getInformationControlCreator() { return new IInformationControlCreator() { public IInformationControl createInformationControl(Shell parent) { - int shellStyle= SWT.RESIZE; - int style= SWT.V_SCROLL | SWT.H_SCROLL; - return new SourceViewerInformationControl(parent, shellStyle, style); + int orientation = SWT.LEFT_TO_RIGHT; + return new SourceViewerInformationControl(parent, false, orientation, null); } }; } @@ -178,10 +177,11 @@ public class TemplateEngine { Template[] templates= CUIPlugin.getDefault().getTemplateStore().getTemplates(); + Image image= CPluginImages.get(CPluginImages.IMG_OBJS_TEMPLATE); if (selection.y == 0) { for (int i= 0; i != templates.length; i++) if (context.canEvaluate(templates[i])) - fProposals.add(new CTemplateProposal(templates[i], context, region, CPluginImages.get(CPluginImages.IMG_OBJS_TEMPLATE))); + fProposals.add(new CTemplateProposal(templates[i], context, region, image)); } else { @@ -194,7 +194,7 @@ public class TemplateEngine { template.getContextTypeId().equals(context.getContextType().getId()) && (!multipleLinesSelected && template.getPattern().indexOf($_WORD_SELECTION) != -1 || (multipleLinesSelected && template.getPattern().indexOf($_LINE_SELECTION) != -1))) { - fProposals.add(new CTemplateProposal(templates[i], context, region, CPluginImages.get(CPluginImages.IMG_OBJS_TEMPLATE))); + fProposals.add(new CTemplateProposal(templates[i], context, region, image)); } } }