mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Format the source Hovering better.
* src/org/eclipse/cdt/internal/ui/text/c/hover/CSourceHover.java * src/org/eclipse/cdt/internal/ui/text/c/hover/SourceViewerInformationControl.java
This commit is contained in:
parent
6d05a79a53
commit
cab2547573
3 changed files with 435 additions and 1 deletions
|
@ -1,3 +1,9 @@
|
|||
2004-06-01 Alain Magloire
|
||||
|
||||
Format the source Hovering better.
|
||||
* src/org/eclipse/cdt/internal/ui/text/c/hover/CSourceHover.java
|
||||
* src/org/eclipse/cdt/internal/ui/text/c/hover/SourceViewerInformationControl.java
|
||||
|
||||
2004-06-01 Alain Magloire
|
||||
|
||||
A release of the CDT was distributed with
|
||||
|
|
|
@ -25,15 +25,21 @@ import org.eclipse.cdt.ui.IWorkingCopyManager;
|
|||
import org.eclipse.jface.text.BadLocationException;
|
||||
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.IRegion;
|
||||
import org.eclipse.jface.text.ITextHoverExtension;
|
||||
import org.eclipse.jface.text.ITextViewer;
|
||||
import org.eclipse.jface.text.information.IInformationProviderExtension2;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.widgets.Shell;
|
||||
import org.eclipse.ui.IEditorInput;
|
||||
import org.eclipse.ui.IEditorPart;
|
||||
|
||||
/**
|
||||
* CSourceHover
|
||||
*/
|
||||
public class CSourceHover extends AbstractCEditorTextHover {
|
||||
public class CSourceHover extends AbstractCEditorTextHover implements ITextHoverExtension, IInformationProviderExtension2 {
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -130,4 +136,30 @@ public class CSourceHover extends AbstractCEditorTextHover {
|
|||
return source.substring(i);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see org.eclipse.jface.text.ITextHoverExtension#getHoverControlCreator()
|
||||
* @since 3.0
|
||||
*/
|
||||
public IInformationControlCreator getHoverControlCreator() {
|
||||
return new IInformationControlCreator() {
|
||||
public IInformationControl createInformationControl(Shell parent) {
|
||||
return new SourceViewerInformationControl(parent, getTooltipAffordanceString());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationProviderExtension2#getInformationPresenterControlCreator()
|
||||
* @since 3.0
|
||||
*/
|
||||
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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,396 @@
|
|||
/**********************************************************************
|
||||
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Common Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/cpl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* QNX Software Systems - Initial API and implementation
|
||||
***********************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.ui.text.c.hover;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.text.CSourceViewerConfiguration;
|
||||
import org.eclipse.cdt.ui.CUIPlugin;
|
||||
import org.eclipse.jface.text.Document;
|
||||
import org.eclipse.jface.text.IDocument;
|
||||
import org.eclipse.jface.text.IInformationControl;
|
||||
import org.eclipse.jface.text.IInformationControlExtension;
|
||||
import org.eclipse.jface.text.source.ISourceViewer;
|
||||
import org.eclipse.jface.text.source.SourceViewer;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.custom.StyledText;
|
||||
import org.eclipse.swt.events.DisposeEvent;
|
||||
import org.eclipse.swt.events.DisposeListener;
|
||||
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.FontData;
|
||||
import org.eclipse.swt.graphics.Point;
|
||||
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.Display;
|
||||
import org.eclipse.swt.widgets.Label;
|
||||
import org.eclipse.swt.widgets.Shell;
|
||||
|
||||
/**
|
||||
* SourceViewerInformationControl
|
||||
* Source viewer based implementation of <code>IInformationControl</code>.
|
||||
* Displays information in a source viewer.
|
||||
*
|
||||
*/
|
||||
public class SourceViewerInformationControl implements IInformationControl, IInformationControlExtension, DisposeListener {
|
||||
|
||||
/** Border thickness in pixels. */
|
||||
private static final int BORDER= 1;
|
||||
/** The control's shell */
|
||||
private Shell fShell;
|
||||
/** The control's text widget */
|
||||
private StyledText fText;
|
||||
/** The control's source viewer */
|
||||
private SourceViewer fViewer;
|
||||
/**
|
||||
* The optional status field.
|
||||
*
|
||||
* @since 3.0
|
||||
*/
|
||||
private Label fStatusField;
|
||||
/**
|
||||
* The separator for the optional status field.
|
||||
*
|
||||
* @since 3.0
|
||||
*/
|
||||
private Label fSeparator;
|
||||
/**
|
||||
* The font of the optional status text label.
|
||||
*
|
||||
* @since 3.0
|
||||
*/
|
||||
private Font fStatusTextFont;
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
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 statusFieldText the text to be used in the optional status field
|
||||
* or <code>null</code> if the status field should be hidden
|
||||
* @since 3.0
|
||||
*/
|
||||
public SourceViewerInformationControl(Shell parent, int shellStyle, int style, String statusFieldText) {
|
||||
GridLayout layout;
|
||||
GridData gd;
|
||||
|
||||
fShell= new Shell(parent, SWT.NO_FOCUS | SWT.ON_TOP | shellStyle);
|
||||
Display display= fShell.getDisplay();
|
||||
fShell.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
|
||||
|
||||
Composite composite= fShell;
|
||||
layout= new GridLayout(1, false);
|
||||
int border= ((shellStyle & SWT.NO_TRIM) == 0) ? 0 : BORDER;
|
||||
layout.marginHeight= border;
|
||||
layout.marginWidth= border;
|
||||
composite.setLayout(layout);
|
||||
gd= new GridData(GridData.FILL_HORIZONTAL);
|
||||
composite.setLayoutData(gd);
|
||||
|
||||
if (statusFieldText != null) {
|
||||
composite= new Composite(composite, SWT.NONE);
|
||||
layout= new GridLayout(1, false);
|
||||
layout.marginHeight= 0;
|
||||
layout.marginWidth= 0;
|
||||
composite.setLayout(layout);
|
||||
gd= new GridData(GridData.FILL_BOTH);
|
||||
composite.setLayoutData(gd);
|
||||
composite.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
|
||||
composite.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
|
||||
}
|
||||
|
||||
// Source viewer
|
||||
//IPreferenceStore store= CUIPlugin.getDefault().getCombinedPreferenceStore();
|
||||
fViewer= new SourceViewer(composite, null, null, false, style);
|
||||
fViewer.configure(new CSourceViewerConfiguration(CUIPlugin.getDefault().getTextTools(), null));
|
||||
fViewer.setEditable(false);
|
||||
|
||||
fText= fViewer.getTextWidget();
|
||||
gd= new GridData(GridData.BEGINNING | GridData.FILL_BOTH);
|
||||
fText.setLayoutData(gd);
|
||||
fText.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
|
||||
fText.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
|
||||
|
||||
fText.addKeyListener(new KeyListener() {
|
||||
|
||||
public void keyPressed(KeyEvent e) {
|
||||
if (e.character == 0x1B) // ESC
|
||||
fShell.dispose();
|
||||
}
|
||||
|
||||
public void keyReleased(KeyEvent e) {}
|
||||
});
|
||||
|
||||
// Status field
|
||||
if (statusFieldText != null) {
|
||||
|
||||
// Horizontal separator line
|
||||
fSeparator= new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL | SWT.LINE_DOT);
|
||||
fSeparator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||
|
||||
// Status field label
|
||||
fStatusField= new Label(composite, SWT.RIGHT);
|
||||
fStatusField.setText(statusFieldText);
|
||||
Font font= fStatusField.getFont();
|
||||
FontData[] fontDatas= font.getFontData();
|
||||
for (int i= 0; i < fontDatas.length; i++)
|
||||
fontDatas[i].setHeight(fontDatas[i].getHeight() * 9 / 10);
|
||||
fStatusTextFont= new Font(fStatusField.getDisplay(), fontDatas);
|
||||
fStatusField.setFont(fStatusTextFont);
|
||||
GridData gd2= new GridData(GridData.FILL_VERTICAL | GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING);
|
||||
fStatusField.setLayoutData(gd2);
|
||||
|
||||
// Regarding the color see bug 41128
|
||||
fStatusField.setForeground(display.getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW));
|
||||
|
||||
fStatusField.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
|
||||
}
|
||||
|
||||
addDisposeListener(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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, 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 <code>null</code> if the status field should be hidden
|
||||
* @since 3.0
|
||||
*/
|
||||
public SourceViewerInformationControl(Shell parent,int style, String statusFieldText) {
|
||||
this(parent, SWT.NO_TRIM, 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 <code>null</code> if the status field should be hidden
|
||||
* @since 3.0
|
||||
*/
|
||||
public SourceViewerInformationControl(Shell parent, String statusFieldText) {
|
||||
this(parent, SWT.NONE, statusFieldText);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see org.eclipse.jface.text.IInformationControlExtension2#setInput(java.lang.Object)
|
||||
*/
|
||||
public void setInput(Object input) {
|
||||
if (input instanceof String)
|
||||
setInformation((String)input);
|
||||
else
|
||||
setInformation(null);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControl#setInformation(String)
|
||||
*/
|
||||
public void setInformation(String content) {
|
||||
if (content == null) {
|
||||
fViewer.setInput(null);
|
||||
return;
|
||||
}
|
||||
|
||||
IDocument doc= new Document(content);
|
||||
CUIPlugin.getDefault().getTextTools().setupCDocument(doc);
|
||||
fViewer.setInput(doc);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControl#setVisible(boolean)
|
||||
*/
|
||||
public void setVisible(boolean visible) {
|
||||
fShell.setVisible(visible);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @since 3.0
|
||||
*/
|
||||
public void widgetDisposed(DisposeEvent event) {
|
||||
if (fStatusTextFont != null && !fStatusTextFont.isDisposed())
|
||||
fStatusTextFont.dispose();
|
||||
|
||||
fStatusTextFont= null;
|
||||
fShell= null;
|
||||
fText= null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public final void dispose() {
|
||||
if (fShell != null && !fShell.isDisposed())
|
||||
fShell.dispose();
|
||||
else
|
||||
widgetDisposed(null);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControl#setSize(int, int)
|
||||
*/
|
||||
public void setSize(int width, int height) {
|
||||
|
||||
if (fStatusField != null) {
|
||||
GridData gd= (GridData)fViewer.getTextWidget().getLayoutData();
|
||||
Point statusSize= fStatusField.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
|
||||
Point separatorSize= fSeparator.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
|
||||
gd.heightHint= height - statusSize.y - separatorSize.y;
|
||||
}
|
||||
fShell.setSize(width, height);
|
||||
|
||||
if (fStatusField != null)
|
||||
fShell.pack(true);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControl#setLocation(Point)
|
||||
*/
|
||||
public void setLocation(Point location) {
|
||||
Rectangle trim= fShell.computeTrim(0, 0, 0, 0);
|
||||
Point textLocation= fText.getLocation();
|
||||
location.x += trim.x - textLocation.x;
|
||||
location.y += trim.y - textLocation.y;
|
||||
fShell.setLocation(location);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControl#setSizeConstraints(int, int)
|
||||
*/
|
||||
public void setSizeConstraints(int maxWidth, int maxHeight) {
|
||||
maxWidth= maxHeight;
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControl#computeSizeHint()
|
||||
*/
|
||||
public Point computeSizeHint() {
|
||||
return fShell.computeSize(SWT.DEFAULT, SWT.DEFAULT);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControl#addDisposeListener(DisposeListener)
|
||||
*/
|
||||
public void addDisposeListener(DisposeListener listener) {
|
||||
fShell.addDisposeListener(listener);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControl#removeDisposeListener(DisposeListener)
|
||||
*/
|
||||
public void removeDisposeListener(DisposeListener listener) {
|
||||
fShell.removeDisposeListener(listener);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControl#setForegroundColor(Color)
|
||||
*/
|
||||
public void setForegroundColor(Color foreground) {
|
||||
fText.setForeground(foreground);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControl#setBackgroundColor(Color)
|
||||
*/
|
||||
public void setBackgroundColor(Color background) {
|
||||
fText.setBackground(background);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControl#isFocusControl()
|
||||
*/
|
||||
public boolean isFocusControl() {
|
||||
return fText.isFocusControl();
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControl#setFocus()
|
||||
*/
|
||||
public void setFocus() {
|
||||
fShell.forceFocus();
|
||||
fText.setFocus();
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControl#addFocusListener(FocusListener)
|
||||
*/
|
||||
public void addFocusListener(FocusListener listener) {
|
||||
fText.addFocusListener(listener);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControl#removeFocusListener(FocusListener)
|
||||
*/
|
||||
public void removeFocusListener(FocusListener listener) {
|
||||
fText.removeFocusListener(listener);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see IInformationControlExtension#hasContents()
|
||||
*/
|
||||
public boolean hasContents() {
|
||||
return fText.getCharCount() > 0;
|
||||
}
|
||||
|
||||
protected ISourceViewer getViewer() {
|
||||
return fViewer;
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Reference in a new issue