Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java240
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

Back to the top