Doesnt move with mouse, friendlier for mac users
[jalview.git] / src / jalview / appletgui / Tooltip.java
index 9306e3d..6766330 100755 (executable)
@@ -27,8 +27,9 @@ import java.util.*;
 public class Tooltip extends Canvas implements MouseListener,\r
     MouseMotionListener\r
 {\r
-\r
         private String [] tip;\r
+        private String lastTip="";\r
+        private boolean setPosition = false;\r
         protected Component owner;\r
 \r
         private Container mainContainer;\r
@@ -45,8 +46,6 @@ public class Tooltip extends Canvas implements MouseListener,
 \r
         FontMetrics fm;\r
 \r
-\r
-\r
         public Tooltip(String tip, Component owner)\r
         {\r
           this.owner = owner;\r
@@ -61,52 +60,53 @@ public class Tooltip extends Canvas implements MouseListener,
           }\r
         }\r
 \r
-\r
         public void paint(Graphics g)\r
         {\r
-                g.drawRect(0,0,getSize().width -1, getSize().height -1);\r
-                int lindex, x;\r
-                for(int i=0; i<tip.length; i++)\r
-                {\r
-                  x = 3;\r
-                  lindex = tip[i].indexOf("%LINK%");\r
-                  if(lindex!=-1)\r
-                  {\r
-                   if(lindex>0)\r
-                   {\r
-                     g.drawString(tip[i].substring(0, lindex), 3, (i+1)*fontHeight-3);\r
-                     x+=fm.stringWidth(tip[i].substring(0, lindex)+3);\r
-                   }\r
-                   g.drawImage(linkImage, x, i * fontHeight+1, this);\r
-                   if(lindex+6<tip[i].length())\r
-                   {\r
-                     g.drawString(tip[i].substring(lindex+6),\r
-                                  x + linkImage.getWidth(this),\r
-                                  (i+1)*fontHeight-3);\r
-                   }\r
-\r
-                  }\r
-                  else\r
-                  g.drawString(tip[i], 3, (i+1)*fontHeight - 3);\r
-                }\r
-        }\r
+          int w = getSize().width;\r
+          int h = getSize().height;\r
 \r
-        private void addToolTip()\r
-        {\r
-                mainContainer.setLayout(null);\r
-                mainContainer.add(this, 0);\r
-                mainContainer.validate();\r
-                repaint();\r
-                shown = true;\r
+          g.drawRect(0, 0, w - 1, h - 1);\r
+          int lindex, x;\r
+          for (int i = 0; i < tip.length; i++)\r
+          {\r
+            x = 3;\r
+            lindex = tip[i].indexOf("%LINK%");\r
+            if (lindex != -1)\r
+            {\r
+              if (lindex > 0)\r
+              {\r
+                g.drawString(tip[i].substring(0, lindex), 3, (i + 1) * fontHeight - 3);\r
+                x += fm.stringWidth(tip[i].substring(0, lindex) + 3);\r
+              }\r
+              g.drawImage(linkImage, x, i * fontHeight + 1, this);\r
+              if (lindex + 6 < tip[i].length())\r
+              {\r
+                g.drawString(tip[i].substring(lindex + 6),\r
+                             x + linkImage.getWidth(this),\r
+                             (i + 1) * fontHeight - 3);\r
+              }\r
+            }\r
+            else\r
+            {\r
+              g.drawString(tip[i], 3, (i + 1) * fontHeight - 3);\r
+            }\r
+          }\r
         }\r
 \r
-        void setTip(String tip)\r
+        synchronized void setTip(String tip)\r
         {\r
           if(tip==null)\r
           {\r
             setTip("");\r
             return;\r
           }\r
+\r
+          if(lastTip.equals(tip))\r
+            return;\r
+\r
+          lastTip = tip;\r
+          setPosition = true;\r
+\r
           fm = getFontMetrics(owner.getFont());\r
           fontHeight = fm.getHeight();\r
 \r
@@ -124,15 +124,18 @@ public class Tooltip extends Canvas implements MouseListener,
 \r
           setSize(longestLine + HORIZONTAL_ENLARGE,\r
                   fontHeight*this.tip.length);\r
-        }\r
-\r
-        void setTipLocation(int x, int y)\r
-        {\r
 \r
-          setLocation((owner.getLocationOnScreen().x - mainContainer.getLocationOnScreen().x) +x,\r
-           (owner.getLocationOnScreen().y - mainContainer.getLocationOnScreen().y + VERTICAL_OFFSET)+y);\r
+          repaint();\r
 \r
+        }\r
 \r
+        void setTipLocation(MouseEvent evt)\r
+        {\r
+          setLocation( (owner.getLocationOnScreen().x\r
+                        - mainContainer.getLocationOnScreen().x) + evt.getX(),\r
+                      (owner.getLocationOnScreen().y -\r
+                       mainContainer.getLocationOnScreen().y\r
+                       + VERTICAL_OFFSET) + evt.getY());\r
 \r
         // correction, whole tool tip must be visible\r
           if (mainContainer.getSize().width < (getLocation().x + getSize().width))\r
@@ -140,7 +143,6 @@ public class Tooltip extends Canvas implements MouseListener,
             setLocation(mainContainer.getSize().width - getSize().width,\r
                         getLocation().y);\r
           }\r
-\r
         }\r
 \r
 \r
@@ -167,7 +169,9 @@ public class Tooltip extends Canvas implements MouseListener,
         }\r
 \r
         public void mouseEntered(MouseEvent me)\r
-        {     }\r
+        {\r
+          setTipLocation(me);\r
+        }\r
 \r
         public void mouseExited(MouseEvent me)\r
         {\r
@@ -187,13 +191,19 @@ public class Tooltip extends Canvas implements MouseListener,
 \r
         public void mouseMoved(MouseEvent me)\r
         {\r
-          if (shown)\r
-            setTipLocation(me.getX(), me.getY());\r
-          else\r
+         if(!shown)\r
           {\r
             findMainContainer();\r
-            addToolTip();\r
-            setTipLocation(me.getX(), me.getY());\r
+            mainContainer.setLayout(null);\r
+            mainContainer.add(this, 0);\r
+            mainContainer.validate();\r
+            shown = true;\r
+            setTipLocation(me);\r
+          }\r
+          else if (setPosition)\r
+          {\r
+            setTipLocation(me);\r
+            setPosition = false;\r
           }\r
         }\r
 \r