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
\r
FontMetrics fm;\r
\r
-\r
-\r
public Tooltip(String tip, Component owner)\r
{\r
this.owner = owner;\r
}\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
\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
setLocation(mainContainer.getSize().width - getSize().width,\r
getLocation().y);\r
}\r
-\r
}\r
\r
\r
}\r
\r
public void mouseEntered(MouseEvent me)\r
- { }\r
+ {\r
+ setTipLocation(me);\r
+ }\r
\r
public void mouseExited(MouseEvent me)\r
{\r
\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