Fix for bug 389328: Provide hover time for time graph tool tip info.
authorPatrick Tasse <patrick.tasse@gmail.com>
Wed, 12 Sep 2012 14:11:50 +0000 (10:11 -0400)
committerPatrick Tasse <patrick.tasse@gmail.com>
Wed, 12 Sep 2012 15:00:58 +0000 (11:00 -0400)
Change-Id: I2eaf701ff090fbac1a48f5bc159d27e64dd3938d
Reviewed-on: https://git.eclipse.org/r/7713
Tested-by: Hudson CI
Reviewed-by: Bernd Hufmann <bhufmann@gmail.com>
IP-Clean: Bernd Hufmann <bhufmann@gmail.com>
Tested-by: Bernd Hufmann <bhufmann@gmail.com>
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/widgets/timegraph/ITimeGraphPresentationProvider.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/widgets/timegraph/TimeGraphPresentationProvider.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/widgets/timegraph/widgets/TimeGraphTooltipHandler.java

index f5f51cad733379bd0f2386cf91c61b38f976f42c..799fc6b74a1e6c8811ce43e66ade234f3c60a986 100644 (file)
-/*******************************************************************************\r
- * Copyright (c) 2012 Ericsson\r
- *\r
- * All rights reserved. This program and the accompanying materials are\r
- * made available under the terms of the Eclipse Public License v1.0 which\r
- * accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *   Patrick Tasse - Initial API and implementation\r
- *******************************************************************************/\r
-\r
-package org.eclipse.linuxtools.tmf.ui.widgets.timegraph;\r
-\r
-import java.util.Map;\r
-\r
-import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;\r
-import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;\r
-import org.eclipse.swt.graphics.GC;\r
-import org.eclipse.swt.graphics.Image;\r
-import org.eclipse.swt.graphics.Rectangle;\r
-\r
-/**\r
- * Interface for the time graph widget provider\r
- *\r
- * @version 1.0\r
- * @author Patrick Tasse\r
- */\r
-public interface ITimeGraphPresentationProvider {\r
-\r
-    /**\r
-     * Returns the name of state types.\r
-     *\r
-     * @return the name of state types\r
-     */\r
-    public String getStateTypeName();\r
-\r
-   /**\r
-    * Returns the name of state type depending on the given entry.\r
-    * Note that this overwrites the name which is return by getStateTypeName().\r
-    *\r
-    * @param entry\r
-    *           the entry\r
-    * @return the name of state type depending on the given entry or null.\r
-    * @since 2.0\r
-    */\r
-   public String getStateTypeName(ITimeGraphEntry entry);\r
-\r
-    /**\r
-     * Returns table of states with state name to state color relationship.\r
-     *\r
-     * @return table of states with color and name\r
-     *\r
-     * @see #getStateTableIndex\r
-     */\r
-    public StateItem[] getStateTable();\r
-\r
-    /**\r
-     * Returns the index in the state table corresponding to this time event.\r
-     * The index should correspond to a state in the state table,\r
-     * otherwise the color SWT.COLOR_BLACK will be used.\r
-     * If the index returned is negative, the event will not be drawn.\r
-     *\r
-     * @param event the time event\r
-     * @return the corresponding state table index\r
-     *\r
-     * @see #getStateTable\r
-     */\r
-    public int getStateTableIndex(ITimeEvent event);\r
-\r
-    /**\r
-     * Called after drawing the control\r
-     *\r
-     * @param bounds\r
-     *            The drawing rectangle\r
-     * @param gc\r
-     *            The graphics context\r
-     */\r
-    public void postDrawControl(Rectangle bounds, GC gc);\r
-\r
-    /**\r
-     * Called after drawing an entry\r
-     *\r
-     * @param entry\r
-     *            the entry that was drawn\r
-     * @param bounds\r
-     *            the drawing rectangle\r
-     * @param gc\r
-     *            the graphics context\r
-     */\r
-    public void postDrawEntry(ITimeGraphEntry entry, Rectangle bounds, GC gc);\r
-\r
-    /**\r
-     * Called after drawing an event\r
-     *\r
-     * @param event\r
-     *            the event that was drawn\r
-     * @param bounds\r
-     *            the drawing rectangle\r
-     * @param gc\r
-     *            the graphics context\r
-     */\r
-    public void postDrawEvent(ITimeEvent event, Rectangle bounds, GC gc);\r
-\r
-    /**\r
-     * Returns the height of this item. This value is ignored if the time graph has a fixed item height.\r
-     *\r
-     * @param entry the entry\r
-     * @return the item height\r
-     *\r
-     * @see TimeGraphViewer#setItemHeight\r
-     */\r
-    public int getItemHeight(ITimeGraphEntry entry);\r
-\r
-    /**\r
-     * Provides the image icon for a given entry.\r
-     *\r
-     * @param entry the entry\r
-     * @return the image icon\r
-     */\r
-    public Image getItemImage(ITimeGraphEntry entry);\r
-\r
-    /**\r
-     * Returns the name of this event.\r
-     *\r
-     * @param event\r
-     *            The event\r
-     * @return The event name\r
-     */\r
-    public String getEventName(ITimeEvent event);\r
-\r
-    /**\r
-     * Returns a map of name and value providing additional information\r
-     * to display in the tool tip for this event.\r
-     *\r
-     * @param event the time event\r
-     * @return a map of tool tip information\r
-     */\r
-    public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event);\r
-\r
+/*******************************************************************************
+ * Copyright (c) 2012 Ericsson
+ *
+ * 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:
+ *   Patrick Tasse - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.ui.widgets.timegraph;
+
+import java.util.Map;
+
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Rectangle;
+
+/**
+ * Interface for the time graph widget provider
+ *
+ * @version 1.0
+ * @author Patrick Tasse
+ */
+public interface ITimeGraphPresentationProvider {
+
+    /**
+     * Returns the name of state types.
+     *
+     * @return the name of state types
+     */
+    public String getStateTypeName();
+
+   /**
+    * Returns the name of state type depending on the given entry.
+    * Note that this overwrites the name which is return by getStateTypeName().
+    *
+    * @param entry
+    *           the entry
+    * @return the name of state type depending on the given entry or null.
+    * @since 2.0
+    */
+   public String getStateTypeName(ITimeGraphEntry entry);
+
+    /**
+     * Returns table of states with state name to state color relationship.
+     *
+     * @return table of states with color and name
+     *
+     * @see #getStateTableIndex
+     */
+    public StateItem[] getStateTable();
+
+    /**
+     * Returns the index in the state table corresponding to this time event.
+     * The index should correspond to a state in the state table,
+     * otherwise the color SWT.COLOR_BLACK will be used.
+     * If the index returned is negative, the event will not be drawn.
+     *
+     * @param event the time event
+     * @return the corresponding state table index
+     *
+     * @see #getStateTable
+     */
+    public int getStateTableIndex(ITimeEvent event);
+
+    /**
+     * Called after drawing the control
+     *
+     * @param bounds
+     *            The drawing rectangle
+     * @param gc
+     *            The graphics context
+     */
+    public void postDrawControl(Rectangle bounds, GC gc);
+
+    /**
+     * Called after drawing an entry
+     *
+     * @param entry
+     *            the entry that was drawn
+     * @param bounds
+     *            the drawing rectangle
+     * @param gc
+     *            the graphics context
+     */
+    public void postDrawEntry(ITimeGraphEntry entry, Rectangle bounds, GC gc);
+
+    /**
+     * Called after drawing an event
+     *
+     * @param event
+     *            the event that was drawn
+     * @param bounds
+     *            the drawing rectangle
+     * @param gc
+     *            the graphics context
+     */
+    public void postDrawEvent(ITimeEvent event, Rectangle bounds, GC gc);
+
+    /**
+     * Returns the height of this item. This value is ignored if the time graph has a fixed item height.
+     *
+     * @param entry the entry
+     * @return the item height
+     *
+     * @see TimeGraphViewer#setItemHeight
+     */
+    public int getItemHeight(ITimeGraphEntry entry);
+
+    /**
+     * Provides the image icon for a given entry.
+     *
+     * @param entry the entry
+     * @return the image icon
+     */
+    public Image getItemImage(ITimeGraphEntry entry);
+
+    /**
+     * Returns the name of this event.
+     *
+     * @param event
+     *            The event
+     * @return The event name
+     */
+    public String getEventName(ITimeEvent event);
+
+    /**
+     * Returns a map of name and value providing additional information
+     * to display in the tool tip for this event.
+     *
+     * @param event the time event
+     * @return a map of tool tip information
+     */
+    public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event);
+
+    /**
+     * Returns a map of name and value providing additional information
+     * to display in the tool tip for this event.
+     *
+     * @param event the time event
+     * @param hoverTime the time corresponding to the mouse hover position
+     * @return a map of tool tip information
+     *
+     * @since 2.0
+     */
+    public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event, long hoverTime);
+
 }
\ No newline at end of file
index 53b50fc4991ab99701c62aeb54489fdf31db00be..19b4cf383c86379e9cfd12df48c2d545454825b0 100644 (file)
-/*******************************************************************************\r
- * Copyright (c) 2009, 2010, 2012 Ericsson\r
- *\r
- * All rights reserved. This program and the accompanying materials are\r
- * made available under the terms of the Eclipse Public License v1.0 which\r
- * accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *   Alvaro Sanchez-Leon - Initial API and implementation\r
- *   Patrick Tasse - Refactoring\r
- *******************************************************************************/\r
-\r
-package org.eclipse.linuxtools.tmf.ui.widgets.timegraph;\r
-\r
-import java.util.Map;\r
-\r
-import org.eclipse.linuxtools.internal.tmf.ui.Messages;\r
-import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;\r
-import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;\r
-import org.eclipse.swt.graphics.GC;\r
-import org.eclipse.swt.graphics.Image;\r
-import org.eclipse.swt.graphics.Rectangle;\r
-\r
-/**\r
- * Provider class for the time graph provider\r
- *\r
- * @version 1.0\r
- * @author Patrick Tasse\r
- *\r
- */\r
-public class TimeGraphPresentationProvider implements ITimeGraphPresentationProvider {\r
-\r
-    // ------------------------------------------------------------------------\r
-    // Constants\r
-    // ------------------------------------------------------------------------\r
-    private static final int DEFAULT_ITEM_HEIGHT = 19;\r
-\r
-    // ------------------------------------------------------------------------\r
-    // Operations\r
-    // ------------------------------------------------------------------------\r
-\r
-    /*\r
-     * (non-Javadoc)\r
-     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getStateTypeName()\r
-     */\r
-    @Override\r
-    public String getStateTypeName() {\r
-        return Messages.TmfTimeLegend_TRACE_STATES;\r
-    }\r
-\r
-    /**\r
-     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getStateTypeName(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry)\r
-     * @since 2.0\r
-     */\r
-    @Override\r
-    public String getStateTypeName(ITimeGraphEntry entry) {\r
-        return null;\r
-    }\r
-    /*\r
-     * (non-Javadoc)\r
-     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getStateTable()\r
-     */\r
-    @Override\r
-    public StateItem[] getStateTable() {\r
-        return null;\r
-    }\r
-\r
-    /*\r
-     * (non-Javadoc)\r
-     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getEventTableIndex(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent)\r
-     */\r
-    @Override\r
-    public int getStateTableIndex(ITimeEvent event) {\r
-        return 0;\r
-    }\r
-\r
-    /*\r
-     * (non-Javadoc)\r
-     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#postDrawControl(org.eclipse.swt.graphics.Rectangle, org.eclipse.swt.graphics.GC)\r
-     */\r
-    @Override\r
-    public void postDrawControl(Rectangle bounds, GC gc) {\r
-        // Override to add own drawing code\r
-    }\r
-\r
-    /*\r
-     * (non-Javadoc)\r
-     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#postDrawEntry(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry, org.eclipse.swt.graphics.Rectangle, org.eclipse.swt.graphics.GC)\r
-     */\r
-    @Override\r
-    public void postDrawEntry(ITimeGraphEntry entry, Rectangle bounds, GC gc) {\r
-        // Override to add own drawing code\r
-    }\r
-\r
-    /*\r
-     * (non-Javadoc)\r
-     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#postDrawEvent(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent, org.eclipse.swt.graphics.Rectangle, org.eclipse.swt.graphics.GC)\r
-     */\r
-    @Override\r
-    public void postDrawEvent(ITimeEvent event, Rectangle bounds, GC gc) {\r
-        // Override to add own drawing code\r
-    }\r
-\r
-    /*\r
-     * (non-Javadoc)\r
-     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getItemHeight(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry)\r
-     */\r
-    @Override\r
-    public int getItemHeight(ITimeGraphEntry entry) {\r
-        return DEFAULT_ITEM_HEIGHT;\r
-    }\r
-\r
-    /*\r
-     * (non-Javadoc)\r
-     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getItemImage(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry)\r
-     */\r
-    @Override\r
-    public Image getItemImage(ITimeGraphEntry entry) {\r
-        return null;\r
-    }\r
-\r
-    /*\r
-     * (non-Javadoc)\r
-     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getEventName(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent)\r
-     */\r
-    @Override\r
-    public String getEventName(ITimeEvent event) {\r
-        return null;\r
-    }\r
-\r
-    /*\r
-     * (non-Javadoc)\r
-     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getEventHoverToolTipInfo(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent)\r
-     */\r
-    @Override\r
-    public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event) {\r
-        return null;\r
-    }\r
-\r
+/*******************************************************************************
+ * Copyright (c) 2009, 2010, 2012 Ericsson
+ *
+ * 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:
+ *   Alvaro Sanchez-Leon - Initial API and implementation
+ *   Patrick Tasse - Refactoring
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.ui.widgets.timegraph;
+
+import java.util.Map;
+
+import org.eclipse.linuxtools.internal.tmf.ui.Messages;
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Rectangle;
+
+/**
+ * Provider class for the time graph provider
+ *
+ * @version 1.0
+ * @author Patrick Tasse
+ *
+ */
+public class TimeGraphPresentationProvider implements ITimeGraphPresentationProvider {
+
+    // ------------------------------------------------------------------------
+    // Constants
+    // ------------------------------------------------------------------------
+    private static final int DEFAULT_ITEM_HEIGHT = 19;
+
+    // ------------------------------------------------------------------------
+    // Operations
+    // ------------------------------------------------------------------------
+
+    /*
+     * (non-Javadoc)
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getStateTypeName()
+     */
+    @Override
+    public String getStateTypeName() {
+        return Messages.TmfTimeLegend_TRACE_STATES;
+    }
+
+    /**
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getStateTypeName(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry)
+     * @since 2.0
+     */
+    @Override
+    public String getStateTypeName(ITimeGraphEntry entry) {
+        return null;
+    }
+    /*
+     * (non-Javadoc)
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getStateTable()
+     */
+    @Override
+    public StateItem[] getStateTable() {
+        return null;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getEventTableIndex(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent)
+     */
+    @Override
+    public int getStateTableIndex(ITimeEvent event) {
+        return 0;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#postDrawControl(org.eclipse.swt.graphics.Rectangle, org.eclipse.swt.graphics.GC)
+     */
+    @Override
+    public void postDrawControl(Rectangle bounds, GC gc) {
+        // Override to add own drawing code
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#postDrawEntry(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry, org.eclipse.swt.graphics.Rectangle, org.eclipse.swt.graphics.GC)
+     */
+    @Override
+    public void postDrawEntry(ITimeGraphEntry entry, Rectangle bounds, GC gc) {
+        // Override to add own drawing code
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#postDrawEvent(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent, org.eclipse.swt.graphics.Rectangle, org.eclipse.swt.graphics.GC)
+     */
+    @Override
+    public void postDrawEvent(ITimeEvent event, Rectangle bounds, GC gc) {
+        // Override to add own drawing code
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getItemHeight(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry)
+     */
+    @Override
+    public int getItemHeight(ITimeGraphEntry entry) {
+        return DEFAULT_ITEM_HEIGHT;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getItemImage(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry)
+     */
+    @Override
+    public Image getItemImage(ITimeGraphEntry entry) {
+        return null;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getEventName(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent)
+     */
+    @Override
+    public String getEventName(ITimeEvent event) {
+        return null;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getEventHoverToolTipInfo(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent)
+     */
+    @Override
+    public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event) {
+        return null;
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider#getEventHoverToolTipInfo(org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent, long)
+     */
+    /**
+     * @since 2.0
+     */
+    @Override
+    public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event, long hoverTime) {
+        return getEventHoverToolTipInfo(event);
+    }
+
 }
\ No newline at end of file
index f2b8040d8ddaadaf0c35b05ed1825d1ea144e8b8..11c65a8a94b3c3b8a9c2f03970564d72cc79c8dc 100644 (file)
-/*****************************************************************************\r
- * Copyright (c) 2007 Intel Corporation, 2009, 2012 Ericsson.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *   Intel Corporation - Initial API and implementation\r
- *   Vitaly A. Provodin, Intel - Initial API and implementation\r
- *   Alvaro Sanchez-Leon - Updated for TMF\r
- *   Patrick Tasse - Refactoring\r
- *\r
- *****************************************************************************/\r
-package org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets;\r
-\r
-import java.util.Iterator;\r
-import java.util.Map;\r
-\r
-import org.eclipse.linuxtools.internal.tmf.ui.Messages;\r
-import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider;\r
-import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;\r
-import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;\r
-import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils.Resolution;\r
-import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils.TimeFormat;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.MouseAdapter;\r
-import org.eclipse.swt.events.MouseEvent;\r
-import org.eclipse.swt.events.MouseMoveListener;\r
-import org.eclipse.swt.events.MouseTrackAdapter;\r
-import org.eclipse.swt.graphics.Point;\r
-import org.eclipse.swt.graphics.Rectangle;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.swt.widgets.Table;\r
-import org.eclipse.swt.widgets.TableColumn;\r
-import org.eclipse.swt.widgets.TableItem;\r
-\r
-/**\r
- * Handler for the tool tips in the generic time graph view.\r
- *\r
- * @version 1.0\r
- * @author Alvaro Sanchez-Leon\r
- * @author Patrick Tasse\r
- */\r
-public class TimeGraphTooltipHandler {\r
-\r
-    private Shell _tipShell;\r
-    private Table _tipTable;\r
-    private Point _tipPosition;\r
-    private final ITimeDataProvider _timeDataProvider;\r
-    ITimeGraphPresentationProvider _utilImp = null;\r
-\r
-    /**\r
-     * Standard constructor\r
-     *\r
-     * @param parent\r
-     *            The parent shell (unused, can be null)\r
-     * @param rUtilImpl\r
-     *            The presentation provider\r
-     * @param timeProv\r
-     *            The time provider\r
-     */\r
-    public TimeGraphTooltipHandler(Shell parent, ITimeGraphPresentationProvider rUtilImpl,\r
-            ITimeDataProvider timeProv) {\r
-\r
-        this._utilImp = rUtilImpl;\r
-        this._timeDataProvider = timeProv;\r
-    }\r
-\r
-    private void createTooltipShell(Shell parent) {\r
-        final Display display = parent.getDisplay();\r
-        if (_tipShell != null && ! _tipShell.isDisposed()) {\r
-            _tipShell.dispose();\r
-        }\r
-        _tipShell = new Shell(parent, SWT.ON_TOP | SWT.TOOL);\r
-        GridLayout gridLayout = new GridLayout();\r
-        gridLayout.numColumns = 2;\r
-        gridLayout.marginWidth = 2;\r
-        gridLayout.marginHeight = 2;\r
-        _tipShell.setLayout(gridLayout);\r
-        _tipShell.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));\r
-\r
-        _tipTable = new Table(_tipShell, SWT.NONE);\r
-        new TableColumn(_tipTable, SWT.NONE);\r
-        new TableColumn(_tipTable, SWT.NONE);\r
-        _tipTable.setForeground(display\r
-                .getSystemColor(SWT.COLOR_INFO_FOREGROUND));\r
-        _tipTable.setBackground(display\r
-                .getSystemColor(SWT.COLOR_INFO_BACKGROUND));\r
-        _tipTable.setHeaderVisible(false);\r
-        _tipTable.setLinesVisible(false);\r
-\r
-        _tipTable.addMouseListener(new MouseAdapter() {\r
-            @Override\r
-            public void mouseDown(MouseEvent e) {\r
-                _tipShell.dispose();\r
-            }\r
-        });\r
-\r
-        _tipTable.addMouseTrackListener(new MouseTrackAdapter() {\r
-            @Override\r
-            public void mouseExit(MouseEvent e) {\r
-                _tipShell.dispose();\r
-            }\r
-        });\r
-\r
-        _tipTable.addMouseMoveListener(new MouseMoveListener() {\r
-            @Override\r
-            public void mouseMove(MouseEvent e) {\r
-                _tipShell.dispose();\r
-            }\r
-        });\r
-    }\r
-\r
-    /**\r
-     * Callback for the mouse-over tooltip\r
-     *\r
-     * @param control\r
-     *            The control object to use\r
-     */\r
-    public void activateHoverHelp(final Control control) {\r
-        control.addMouseListener(new MouseAdapter() {\r
-            @Override\r
-            public void mouseDown(MouseEvent e) {\r
-                if (_tipShell != null && ! _tipShell.isDisposed()) {\r
-                    _tipShell.dispose();\r
-                }\r
-            }\r
-        });\r
-\r
-        control.addMouseMoveListener(new MouseMoveListener() {\r
-            @Override\r
-            public void mouseMove(MouseEvent e) {\r
-                if (_tipShell != null && ! _tipShell.isDisposed()) {\r
-                    _tipShell.dispose();\r
-                }\r
-            }\r
-        });\r
-\r
-        control.addMouseTrackListener(new MouseTrackAdapter() {\r
-            @Override\r
-            public void mouseExit(MouseEvent e) {\r
-                if (_tipShell != null && ! _tipShell.isDisposed()) {\r
-                    Point pt = control.toDisplay(e.x, e.y);\r
-                    if (! _tipShell.getBounds().contains(pt)) {\r
-                        _tipShell.dispose();\r
-                    }\r
-                }\r
-            }\r
-\r
-            private void addItem(String name, String value) {\r
-                TableItem line = new TableItem(_tipTable, SWT.NONE);\r
-                line.setText(0, name);\r
-                line.setText(1, value);\r
-            }\r
-\r
-            private void fillValues(Point pt, TimeGraphControl timeGraphControl, ITimeGraphEntry entry) {\r
-                if (entry == null) {\r
-                    return;\r
-                }\r
-                if (entry.hasTimeEvents()) {\r
-                    long currPixelTime = timeGraphControl.getTimeAtX(pt.x);\r
-                    long nextPixelTime = timeGraphControl.getTimeAtX(pt.x + 1);\r
-                    if (nextPixelTime == currPixelTime) {\r
-                        nextPixelTime++;\r
-                    }\r
-                    ITimeEvent currEvent = Utils.findEvent(entry, currPixelTime, 0);\r
-                    ITimeEvent nextEvent = Utils.findEvent(entry, currPixelTime, 1);\r
-\r
-                    // if there is no current event at the start of the current pixel range,\r
-                    // or if the current event starts before the current pixel range,\r
-                    // use the next event as long as it starts within the current pixel range\r
-                    if (currEvent == null || currEvent.getTime() < currPixelTime) {\r
-                        if (nextEvent != null && nextEvent.getTime() < nextPixelTime) {\r
-                            currEvent = nextEvent;\r
-                        }\r
-                    }\r
-\r
-                    // state name\r
-                    String stateTypeName = _utilImp.getStateTypeName(entry);\r
-                    String entryName = entry.getName();\r
-                    if (stateTypeName == null) {\r
-                        stateTypeName = _utilImp.getStateTypeName();\r
-                    }\r
-\r
-                    if (!entryName.isEmpty()) {\r
-                        addItem(stateTypeName, entry.getName());\r
-                    }\r
-\r
-                    if (currEvent == null) {\r
-                        return;\r
-                    }\r
-\r
-                    // state\r
-                    String state = _utilImp.getEventName(currEvent);\r
-                    if (state != null) {\r
-                        addItem(Messages.TmfTimeTipHandler_TRACE_STATE, state);\r
-                    }\r
-\r
-                    // This block receives a list of <String, String> values to be added to the tip table\r
-                    Map<String, String> eventAddOns = _utilImp.getEventHoverToolTipInfo(currEvent);\r
-                    if (eventAddOns != null) {\r
-                        for (Iterator<String> iter = eventAddOns.keySet().iterator(); iter.hasNext();) {\r
-                            String message = iter.next();\r
-                            addItem(message, eventAddOns.get(message));\r
-                        }\r
-                    }\r
-\r
-                    long eventStartTime = -1;\r
-                    long eventDuration = -1;\r
-                    long eventEndTime = -1;\r
-\r
-                    eventStartTime = currEvent.getTime();\r
-                    eventDuration = currEvent.getDuration();\r
-                    if (eventDuration < 0 && nextEvent != null) {\r
-                        eventEndTime = nextEvent.getTime();\r
-                        eventDuration = eventEndTime - eventStartTime;\r
-                    } else {\r
-                        eventEndTime = eventStartTime + eventDuration;\r
-                    }\r
-\r
-                    Resolution res = Resolution.NANOSEC;\r
-                    if (_timeDataProvider.isCalendarFormat()) {\r
-                        addItem(Messages.TmfTimeTipHandler_TRACE_DATE, eventStartTime > -1 ?\r
-                                Utils.formatDate(eventStartTime)\r
-                                : "?"); //$NON-NLS-1$\r
-                        if (eventDuration > 0) {\r
-                            addItem(Messages.TmfTimeTipHandler_TRACE_START_TIME, eventStartTime > -1 ?\r
-                                    Utils.formatTime(eventStartTime, TimeFormat.ABSOLUTE, res)\r
-                                    : "?"); //$NON-NLS-1$\r
-\r
-                            addItem(Messages.TmfTimeTipHandler_TRACE_STOP_TIME, eventEndTime > -1 ?\r
-                                    Utils.formatTime(eventEndTime, TimeFormat.ABSOLUTE, res)\r
-                                    : "?"); //$NON-NLS-1$\r
-                        } else {\r
-                            addItem(Messages.TmfTimeTipHandler_TRACE_EVENT_TIME, eventStartTime > -1 ?\r
-                                    Utils.formatTime(eventStartTime, TimeFormat.ABSOLUTE, res)\r
-                                    : "?"); //$NON-NLS-1$\r
-                        }\r
-                    } else {\r
-                        if (eventDuration > 0) {\r
-                            addItem(Messages.TmfTimeTipHandler_TRACE_START_TIME, eventStartTime > -1 ?\r
-                                    Utils.formatTime(eventStartTime, TimeFormat.RELATIVE, res)\r
-                                    : "?"); //$NON-NLS-1$\r
-\r
-                            addItem(Messages.TmfTimeTipHandler_TRACE_STOP_TIME, eventEndTime > -1 ?\r
-                                    Utils.formatTime(eventEndTime, TimeFormat.RELATIVE, res)\r
-                                    : "?"); //$NON-NLS-1$\r
-                        } else {\r
-                            addItem(Messages.TmfTimeTipHandler_TRACE_EVENT_TIME, eventStartTime > -1 ?\r
-                                    Utils.formatTime(eventStartTime, TimeFormat.RELATIVE, res)\r
-                                    : "?"); //$NON-NLS-1$\r
-                        }\r
-                    }\r
-\r
-                    if (eventDuration > 0) {\r
-                        // Duration in relative format in any case\r
-                        addItem(Messages.TmfTimeTipHandler_DURATION, eventDuration > -1 ?\r
-                                Utils.formatTime(eventDuration, TimeFormat.RELATIVE, res)\r
-                                : "?"); //$NON-NLS-1$\r
-                    }\r
-                }\r
-            }\r
-\r
-            @Override\r
-            public void mouseHover(MouseEvent event) {\r
-                Point pt = new Point(event.x, event.y);\r
-                TimeGraphControl timeGraphControl = (TimeGraphControl) event.widget;\r
-                createTooltipShell(timeGraphControl.getShell());\r
-                ITimeGraphEntry entry = timeGraphControl.getEntry(pt);\r
-                _tipTable.remove(0, _tipTable.getItemCount() - 1);\r
-                fillValues(pt, timeGraphControl, entry);\r
-                if (_tipTable.getItemCount() == 0) {\r
-                    return;\r
-                }\r
-                _tipTable.getColumn(0).pack();\r
-                _tipTable.getColumn(1).pack();\r
-                _tipShell.pack();\r
-                _tipPosition = control.toDisplay(pt);\r
-                _tipShell.pack();\r
-                setHoverLocation(_tipShell, _tipPosition);\r
-                _tipShell.setVisible(true);\r
-            }\r
-        });\r
-    }\r
-\r
-    private static void setHoverLocation(Shell shell, Point position) {\r
-        Rectangle displayBounds = shell.getDisplay().getBounds();\r
-        Rectangle shellBounds = shell.getBounds();\r
-        if (position.x + shellBounds.width + 16 > displayBounds.width && position.x - shellBounds.width - 16 >= 0) {\r
-            shellBounds.x = position.x - shellBounds.width - 16;\r
-        } else {\r
-            shellBounds.x = Math.max(Math.min(position.x + 16, displayBounds.width - shellBounds.width), 0);\r
-        }\r
-        if (position.y + shellBounds.height + 16 > displayBounds.height && position.y - shellBounds.height - 16 >= 0) {\r
-            shellBounds.y = position.y - shellBounds.height - 16;\r
-        } else {\r
-            shellBounds.y = Math.max(Math.min(position.y + 16, displayBounds.height - shellBounds.height), 0);\r
-        }\r
-        shell.setBounds(shellBounds);\r
-    }\r
-\r
+/*****************************************************************************
+ * Copyright (c) 2007 Intel Corporation, 2009, 2012 Ericsson.
+ * 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:
+ *   Intel Corporation - Initial API and implementation
+ *   Vitaly A. Provodin, Intel - Initial API and implementation
+ *   Alvaro Sanchez-Leon - Updated for TMF
+ *   Patrick Tasse - Refactoring
+ *
+ *****************************************************************************/
+package org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.linuxtools.internal.tmf.ui.Messages;
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider;
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils.Resolution;
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils.TimeFormat;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.events.MouseTrackAdapter;
+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.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Handler for the tool tips in the generic time graph view.
+ *
+ * @version 1.0
+ * @author Alvaro Sanchez-Leon
+ * @author Patrick Tasse
+ */
+public class TimeGraphTooltipHandler {
+
+    private Shell _tipShell;
+    private Composite _tipComposite;
+    private Point _tipPosition;
+    private final ITimeDataProvider _timeDataProvider;
+    ITimeGraphPresentationProvider _utilImp = null;
+
+    /**
+     * Standard constructor
+     *
+     * @param parent
+     *            The parent shell (unused, can be null)
+     * @param rUtilImpl
+     *            The presentation provider
+     * @param timeProv
+     *            The time provider
+     */
+    public TimeGraphTooltipHandler(Shell parent, ITimeGraphPresentationProvider rUtilImpl,
+            ITimeDataProvider timeProv) {
+
+        this._utilImp = rUtilImpl;
+        this._timeDataProvider = timeProv;
+    }
+
+    private void createTooltipShell(Shell parent) {
+        final Display display = parent.getDisplay();
+        if (_tipShell != null && ! _tipShell.isDisposed()) {
+            _tipShell.dispose();
+        }
+        _tipShell = new Shell(parent, SWT.ON_TOP | SWT.TOOL);
+        GridLayout gridLayout = new GridLayout();
+        gridLayout.numColumns = 2;
+        gridLayout.marginWidth = 2;
+        gridLayout.marginHeight = 2;
+        _tipShell.setLayout(gridLayout);
+        _tipShell.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+        _tipComposite = new Composite(_tipShell, SWT.NONE);
+        _tipComposite.setLayout(new GridLayout(3, false));
+        setupControl(_tipComposite);
+
+    }
+
+    /**
+     * Callback for the mouse-over tooltip
+     *
+     * @param control
+     *            The control object to use
+     */
+    public void activateHoverHelp(final Control control) {
+        control.addMouseListener(new MouseAdapter() {
+            @Override
+            public void mouseDown(MouseEvent e) {
+                if (_tipShell != null && ! _tipShell.isDisposed()) {
+                    _tipShell.dispose();
+                }
+            }
+        });
+
+        control.addMouseMoveListener(new MouseMoveListener() {
+            @Override
+            public void mouseMove(MouseEvent e) {
+                if (_tipShell != null && ! _tipShell.isDisposed()) {
+                    _tipShell.dispose();
+                }
+            }
+        });
+
+        control.addMouseTrackListener(new MouseTrackAdapter() {
+            @Override
+            public void mouseExit(MouseEvent e) {
+                if (_tipShell != null && ! _tipShell.isDisposed()) {
+                    Point pt = control.toDisplay(e.x, e.y);
+                    if (! _tipShell.getBounds().contains(pt)) {
+                        _tipShell.dispose();
+                    }
+                }
+            }
+
+            private void addItem(String name, String value) {
+                Label nameLabel = new Label(_tipComposite, SWT.NO_FOCUS);
+                nameLabel.setText(name);
+                setupControl(nameLabel);
+                Label separator = new Label(_tipComposite, SWT.NO_FOCUS | SWT.SEPARATOR | SWT.VERTICAL);
+                GridData gd = new GridData(SWT.CENTER, SWT.CENTER, false, false);
+                gd.heightHint = nameLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
+                separator.setLayoutData(gd);
+                setupControl(separator);
+                Label valueLabel = new Label(_tipComposite, SWT.NO_FOCUS);
+                valueLabel.setText(value);
+                setupControl(valueLabel);
+            }
+
+            private void fillValues(Point pt, TimeGraphControl timeGraphControl, ITimeGraphEntry entry) {
+                if (entry == null) {
+                    return;
+                }
+                if (entry.hasTimeEvents()) {
+                    long currPixelTime = timeGraphControl.getTimeAtX(pt.x);
+                    long nextPixelTime = timeGraphControl.getTimeAtX(pt.x + 1);
+                    if (nextPixelTime == currPixelTime) {
+                        nextPixelTime++;
+                    }
+                    ITimeEvent currEvent = Utils.findEvent(entry, currPixelTime, 0);
+                    ITimeEvent nextEvent = Utils.findEvent(entry, currPixelTime, 1);
+
+                    // if there is no current event at the start of the current pixel range,
+                    // or if the current event starts before the current pixel range,
+                    // use the next event as long as it starts within the current pixel range
+                    if (currEvent == null || currEvent.getTime() < currPixelTime) {
+                        if (nextEvent != null && nextEvent.getTime() < nextPixelTime) {
+                            currEvent = nextEvent;
+                            currPixelTime = nextEvent.getTime();
+                        }
+                    }
+
+                    // state name
+                    String stateTypeName = _utilImp.getStateTypeName(entry);
+                    String entryName = entry.getName();
+                    if (stateTypeName == null) {
+                        stateTypeName = _utilImp.getStateTypeName();
+                    }
+
+                    if (!entryName.isEmpty()) {
+                        addItem(stateTypeName, entry.getName());
+                    }
+
+                    if (currEvent == null) {
+                        return;
+                    }
+
+                    // state
+                    String state = _utilImp.getEventName(currEvent);
+                    if (state != null) {
+                        addItem(Messages.TmfTimeTipHandler_TRACE_STATE, state);
+                    }
+
+                    // This block receives a list of <String, String> values to be added to the tip table
+                    Map<String, String> eventAddOns = _utilImp.getEventHoverToolTipInfo(currEvent, currPixelTime);
+                    if (eventAddOns != null) {
+                        for (Iterator<String> iter = eventAddOns.keySet().iterator(); iter.hasNext();) {
+                            String message = iter.next();
+                            addItem(message, eventAddOns.get(message));
+                        }
+                    }
+
+                    long eventStartTime = -1;
+                    long eventDuration = -1;
+                    long eventEndTime = -1;
+
+                    eventStartTime = currEvent.getTime();
+                    eventDuration = currEvent.getDuration();
+                    if (eventDuration < 0 && nextEvent != null) {
+                        eventEndTime = nextEvent.getTime();
+                        eventDuration = eventEndTime - eventStartTime;
+                    } else {
+                        eventEndTime = eventStartTime + eventDuration;
+                    }
+
+                    Resolution res = Resolution.NANOSEC;
+                    if (_timeDataProvider.isCalendarFormat()) {
+                        addItem(Messages.TmfTimeTipHandler_TRACE_DATE, eventStartTime > -1 ?
+                                Utils.formatDate(eventStartTime)
+                                : "?"); //$NON-NLS-1$
+                        if (eventDuration > 0) {
+                            addItem(Messages.TmfTimeTipHandler_TRACE_START_TIME, eventStartTime > -1 ?
+                                    Utils.formatTime(eventStartTime, TimeFormat.ABSOLUTE, res)
+                                    : "?"); //$NON-NLS-1$
+
+                            addItem(Messages.TmfTimeTipHandler_TRACE_STOP_TIME, eventEndTime > -1 ?
+                                    Utils.formatTime(eventEndTime, TimeFormat.ABSOLUTE, res)
+                                    : "?"); //$NON-NLS-1$
+                        } else {
+                            addItem(Messages.TmfTimeTipHandler_TRACE_EVENT_TIME, eventStartTime > -1 ?
+                                    Utils.formatTime(eventStartTime, TimeFormat.ABSOLUTE, res)
+                                    : "?"); //$NON-NLS-1$
+                        }
+                    } else {
+                        if (eventDuration > 0) {
+                            addItem(Messages.TmfTimeTipHandler_TRACE_START_TIME, eventStartTime > -1 ?
+                                    Utils.formatTime(eventStartTime, TimeFormat.RELATIVE, res)
+                                    : "?"); //$NON-NLS-1$
+
+                            addItem(Messages.TmfTimeTipHandler_TRACE_STOP_TIME, eventEndTime > -1 ?
+                                    Utils.formatTime(eventEndTime, TimeFormat.RELATIVE, res)
+                                    : "?"); //$NON-NLS-1$
+                        } else {
+                            addItem(Messages.TmfTimeTipHandler_TRACE_EVENT_TIME, eventStartTime > -1 ?
+                                    Utils.formatTime(eventStartTime, TimeFormat.RELATIVE, res)
+                                    : "?"); //$NON-NLS-1$
+                        }
+                    }
+
+                    if (eventDuration > 0) {
+                        // Duration in relative format in any case
+                        addItem(Messages.TmfTimeTipHandler_DURATION, eventDuration > -1 ?
+                                Utils.formatTime(eventDuration, TimeFormat.RELATIVE, res)
+                                : "?"); //$NON-NLS-1$
+                    }
+                }
+            }
+
+            @Override
+            public void mouseHover(MouseEvent event) {
+                Point pt = new Point(event.x, event.y);
+                TimeGraphControl timeGraphControl = (TimeGraphControl) event.widget;
+                createTooltipShell(timeGraphControl.getShell());
+                ITimeGraphEntry entry = timeGraphControl.getEntry(pt);
+                for (Control child : _tipComposite.getChildren()) {
+                    child.dispose();
+                }
+                fillValues(pt, timeGraphControl, entry);
+                if (_tipComposite.getChildren().length == 0) {
+                    return;
+                }
+                _tipShell.pack();
+                _tipPosition = control.toDisplay(pt);
+                _tipShell.pack();
+                setHoverLocation(_tipShell, _tipPosition);
+                _tipShell.setVisible(true);
+            }
+        });
+    }
+
+    private static void setHoverLocation(Shell shell, Point position) {
+        Rectangle displayBounds = shell.getDisplay().getBounds();
+        Rectangle shellBounds = shell.getBounds();
+        if (position.x + shellBounds.width + 16 > displayBounds.width && position.x - shellBounds.width - 16 >= 0) {
+            shellBounds.x = position.x - shellBounds.width - 16;
+        } else {
+            shellBounds.x = Math.max(Math.min(position.x + 16, displayBounds.width - shellBounds.width), 0);
+        }
+        if (position.y + shellBounds.height + 16 > displayBounds.height && position.y - shellBounds.height - 16 >= 0) {
+            shellBounds.y = position.y - shellBounds.height - 16;
+        } else {
+            shellBounds.y = Math.max(Math.min(position.y + 16, displayBounds.height - shellBounds.height), 0);
+        }
+        shell.setBounds(shellBounds);
+    }
+
+    private void setupControl(Control control) {
+        control.setForeground(_tipShell.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
+        control.setBackground(_tipShell.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+        control.addMouseListener(new MouseAdapter() {
+            @Override
+            public void mouseDown(MouseEvent e) {
+                _tipShell.dispose();
+            }
+        });
+
+        control.addMouseTrackListener(new MouseTrackAdapter() {
+            @Override
+            public void mouseExit(MouseEvent e) {
+                _tipShell.dispose();
+            }
+        });
+
+        control.addMouseMoveListener(new MouseMoveListener() {
+            @Override
+            public void mouseMove(MouseEvent e) {
+                _tipShell.dispose();
+            }
+        });
+    }
 }
This page took 0.039068 seconds and 5 git commands to generate.