diff options
Diffstat (limited to 'org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/views/ToolTipHandler.java')
-rw-r--r-- | org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/views/ToolTipHandler.java | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/views/ToolTipHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/views/ToolTipHandler.java new file mode 100644 index 000000000..5efee7529 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/views/ToolTipHandler.java @@ -0,0 +1,240 @@ +/******************************************************************************* + * Copyright (c) 2004 - 2005 University Of British Columbia 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: + * University Of British Columbia - initial API and implementation + *******************************************************************************/ +/** + * Copied from newsgroup, forwarded from Make Technologies + */ + +package org.eclipse.mylar.tasks.ui.views; + +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.mylar.tasks.ITask; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.*; +import org.eclipse.swt.graphics.*; +import org.eclipse.swt.layout.*; +import org.eclipse.swt.widgets.*; + + +public class ToolTipHandler { + private Shell parentShell; + + private Shell tipShell; + + private Label tipLabelImage; + private Label tipLabelText; + + private Widget tipWidget; // widget this tooltip is hovering over + + protected Point tipPosition; // the position being hovered over on the + // Entire display + + protected Point widgetPosition; // the position hovered over in the Widget; + + /** + * Creates a new tooltip handler + * + * @param parent + * the parent Shell + */ + public ToolTipHandler(Shell parent) { + final Display display = parent.getDisplay(); + this.parentShell = parent; + tipShell = new Shell(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 2; + gridLayout.marginWidth = 2; + gridLayout.marginHeight = 2; + tipShell.setLayout(gridLayout); + tipShell.setBackground(display + .getSystemColor(SWT.COLOR_INFO_BACKGROUND)); + + tipLabelImage = new Label(tipShell, SWT.NONE); + tipLabelImage.setForeground(display + .getSystemColor(SWT.COLOR_INFO_FOREGROUND)); + tipLabelImage.setBackground(display + .getSystemColor(SWT.COLOR_INFO_BACKGROUND)); + + GridData imageGridData = new GridData( + GridData.HORIZONTAL_ALIGN_BEGINNING + | GridData.VERTICAL_ALIGN_BEGINNING); + tipLabelImage.setLayoutData(imageGridData); + + tipLabelText = new Label(tipShell, SWT.NONE); + tipLabelText.setForeground(display + .getSystemColor(SWT.COLOR_INFO_FOREGROUND)); + tipLabelText.setBackground(display + .getSystemColor(SWT.COLOR_INFO_BACKGROUND)); + + GridData textGridData = new GridData(GridData.FILL_HORIZONTAL + | GridData.VERTICAL_ALIGN_CENTER); + tipLabelText.setLayoutData(textGridData); + } + + private ITask getTask(Object hoverObject) { + if (hoverObject instanceof Widget) { + Object data = ((Widget) hoverObject).getData(); + if (data != null) { + if (data instanceof ITask) { + return (ITask) data; + } else if (data instanceof IAdaptable) { + return (ITask) ((IAdaptable) data).getAdapter(ITask.class); + } + + } + } + return null; + } + + protected String getToolTipText(Object object) { + ITask task = getTask(object); + if (task != null) { + return task.getToolTipText(); + } + + if (object instanceof Control) { + return (String) ((Control) object).getData("TIP_TEXT"); + } + return null; + } + + protected Image getToolTipImage(Object object) { + ITask projectNode = getTask(object); + if (projectNode != null) { + // TODO Code for determining image + } + if (object instanceof Control) { + return (Image) ((Control) object).getData("TIP_IMAGE"); + } + return null; + } + + protected Object getToolTipHelp(Object object) { + if (object instanceof Control) { + return (String) ((Control) object).getData("TIP_HELPTEXT"); + } + return null; + } + + /** + * Enables customized hover help for a specified control + * + * @control the control on which to enable hoverhelp + */ + public void activateHoverHelp(final Control control) { + /* + * Get out of the way if we attempt to activate the control underneath + * the tooltip + */ + control.addMouseListener(new MouseAdapter() { + + @Override + public void mouseDown(MouseEvent e) { + if (tipShell.isVisible()) + tipShell.setVisible(false); + } + }); + /* + * Trap hover events to pop-up tooltip + */ + control.addMouseTrackListener(new MouseTrackAdapter() { + + @Override + public void mouseExit(MouseEvent e) { + if (tipShell.isVisible()) + tipShell.setVisible(false); + tipWidget = null; + } + + @Override + public void mouseHover(MouseEvent event) { + widgetPosition = new Point(event.x, event.y); + Widget widget = event.widget; + if (widget instanceof ToolBar) { + ToolBar w = (ToolBar) widget; + widget = w.getItem(widgetPosition); + } + if (widget instanceof Table) { + Table w = (Table) widget; + widget = w.getItem(widgetPosition); + } + if (widget instanceof Tree) { + Tree w = (Tree) widget; + widget = w.getItem(widgetPosition); + } + if (widget == null) { + tipShell.setVisible(false); + tipWidget = null; + return; + } + if (widget == tipWidget) + return; + tipWidget = widget; + tipPosition = control.toDisplay(widgetPosition); + String text = getToolTipText(widget); + Image image = getToolTipImage(widget); + if (text == null) { + return; + } + Control sourceControl = (Control) event.getSource(); + sourceControl.setFocus(); + tipLabelText.setText(text); + tipLabelImage.setImage(image); // accepts null + tipShell.pack(); + setHoverLocation(tipShell, tipPosition); + tipShell.setVisible(true); + } + }); + /* + * Trap F1 Help to pop up a custom help box + */ + control.addHelpListener(new HelpListener() { + public void helpRequested(HelpEvent event) { + if (tipWidget == null) + return; + Object help = getToolTipHelp(tipWidget); + if (help == null) + return; + if (help.getClass() != String.class) { + return; + } + if (tipShell.isVisible()) { + tipShell.setVisible(false); + Shell helpShell = new Shell(parentShell, SWT.SHELL_TRIM); + helpShell.setLayout(new FillLayout()); + Label label = new Label(helpShell, SWT.NONE); + label.setText((String) help); + helpShell.pack(); + setHoverLocation(helpShell, tipPosition); + helpShell.open(); + } + } + }); + } + + /** + * Sets the location for a hovering shell + * + * @param shell + * the object that is to hover + * @param position + * the position of a widget to hover over + * @return the top-left location for a hovering box + */ + private void setHoverLocation(Shell shell, Point position) { + Rectangle displayBounds = shell.getDisplay().getBounds(); + Rectangle shellBounds = shell.getBounds(); + shellBounds.x = Math.max(Math.min(position.x, displayBounds.width + - shellBounds.width), 0); + shellBounds.y = Math.max(Math.min(position.y + 16, displayBounds.height + - shellBounds.height), 0); + shell.setBounds(shellBounds); + } +}
\ No newline at end of file |