NEW FILES
[jalview.git] / src / jalview / appletgui / Tooltip.java
1 \r
2 package jalview.appletgui;\r
3 \r
4 import java.awt.*;\r
5 import java.applet.*;\r
6 import java.awt.event.*;\r
7 import java.util.*;\r
8 \r
9 public class Tooltip extends Canvas implements MouseListener,\r
10     MouseMotionListener\r
11 {\r
12 \r
13         private String [] tip;\r
14         protected Component owner;\r
15 \r
16         private Container mainContainer;\r
17         private LayoutManager mainLayout;\r
18 \r
19         private boolean shown;\r
20 \r
21         private final int VERTICAL_OFFSET = 20;\r
22         private final int HORIZONTAL_ENLARGE = 10;\r
23 \r
24         int fontHeight = 0;\r
25 \r
26         Image linkImage;\r
27 \r
28         FontMetrics fm;\r
29 \r
30 \r
31 \r
32         public Tooltip(String tip, Component owner)\r
33         {\r
34           this.owner = owner;\r
35           owner.addMouseListener(this);\r
36           owner.addMouseMotionListener(this);\r
37           setBackground(new Color(255, 255, 220));\r
38           setTip(tip);\r
39           java.net.URL url = getClass().getResource("/images/link.gif");\r
40           if (url != null)\r
41           {\r
42             linkImage = java.awt.Toolkit.getDefaultToolkit().getImage(url);\r
43           }\r
44         }\r
45 \r
46 \r
47         public void paint(Graphics g)\r
48         {\r
49                 g.drawRect(0,0,getSize().width -1, getSize().height -1);\r
50                 int lindex, x;\r
51                 for(int i=0; i<tip.length; i++)\r
52                 {\r
53                   x = 3;\r
54                   lindex = tip[i].indexOf("%LINK%");\r
55                   if(lindex!=-1)\r
56                   {\r
57                    if(lindex>0)\r
58                    {\r
59                      g.drawString(tip[i].substring(0, lindex), 3, (i+1)*fontHeight-3);\r
60                      x+=fm.stringWidth(tip[i].substring(0, lindex)+3);\r
61                    }\r
62                    // g.drawString("(right click)", linkImage.getWidth(this)+6, (i+1)*fontHeight-3);\r
63                     g.drawImage(linkImage, x, i * fontHeight, this);\r
64                   }\r
65                   else\r
66                   g.drawString(tip[i], 3, (i+1)*fontHeight - 3);\r
67                 }\r
68         }\r
69 \r
70         private void addToolTip()\r
71         {\r
72                 mainContainer.setLayout(null);\r
73                 mainContainer.add(this, 0);\r
74                 mainContainer.validate();\r
75                 repaint();\r
76                 shown = true;\r
77         }\r
78 \r
79         void setTip(String tip)\r
80         {\r
81           fm = getFontMetrics(owner.getFont());\r
82           fontHeight = fm.getHeight();\r
83 \r
84           int longestLine = 0;\r
85           StringTokenizer st = new StringTokenizer(tip, "\n");\r
86           this.tip = new String[st.countTokens()];\r
87           int index = 0;\r
88           while(st.hasMoreElements())\r
89           {\r
90             this.tip[index] = st.nextToken();\r
91             if(fm.stringWidth(this.tip[index])>longestLine)\r
92               longestLine = fm.stringWidth(this.tip[index]);\r
93             index ++;\r
94           }\r
95 \r
96           setSize(longestLine + HORIZONTAL_ENLARGE,\r
97                   fontHeight*this.tip.length);\r
98         }\r
99 \r
100         void setTipLocation(int x, int y)\r
101         {\r
102 \r
103           setLocation((owner.getLocationOnScreen().x - mainContainer.getLocationOnScreen().x) +x,\r
104            (owner.getLocationOnScreen().y - mainContainer.getLocationOnScreen().y + VERTICAL_OFFSET)+y);\r
105 \r
106 \r
107 \r
108         // correction, whole tool tip must be visible\r
109           if (mainContainer.getSize().width < (getLocation().x + getSize().width))\r
110           {\r
111             setLocation(mainContainer.getSize().width - getSize().width,\r
112                         getLocation().y);\r
113           }\r
114 \r
115         }\r
116 \r
117 \r
118         private void removeToolTip() {\r
119                 if (shown) {\r
120                         mainContainer.remove(0);\r
121                         mainContainer.setLayout(mainLayout);\r
122                         mainContainer.validate();\r
123                 }\r
124                 shown = false;\r
125         }\r
126 \r
127         private void findMainContainer() {\r
128                 Container parent = owner.getParent();\r
129                 while (true) {\r
130                         if ((parent instanceof Applet) || (parent instanceof Frame)) {\r
131                                 mainContainer = parent;\r
132                                 break;\r
133                         } else {\r
134                                 parent = parent.getParent();\r
135                         }\r
136                 }\r
137                 mainLayout = mainContainer.getLayout();\r
138         }\r
139 \r
140         public void mouseEntered(MouseEvent me)\r
141         {     }\r
142 \r
143         public void mouseExited(MouseEvent me)\r
144         {\r
145           removeToolTip();\r
146         }\r
147 \r
148         public void mousePressed(MouseEvent me)\r
149         {\r
150           removeToolTip();\r
151         }\r
152 \r
153         public void mouseReleased(MouseEvent me)\r
154         {}\r
155 \r
156         public void mouseClicked(MouseEvent me)\r
157         {}\r
158 \r
159         public void mouseMoved(MouseEvent me)\r
160         {\r
161           if (shown)\r
162             setTipLocation(me.getX(), me.getY());\r
163           else\r
164           {\r
165             findMainContainer();\r
166             addToolTip();\r
167             setTipLocation(me.getX(), me.getY());\r
168           }\r
169         }\r
170 \r
171         public void mouseDragged(MouseEvent me)\r
172         {}\r
173 }\r