header updated
[jalview.git] / src / jalview / appletgui / Tooltip.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 \r
20 package jalview.appletgui;\r
21 \r
22 import java.awt.*;\r
23 import java.applet.*;\r
24 import java.awt.event.*;\r
25 import java.util.*;\r
26 \r
27 public class Tooltip extends Canvas implements MouseListener,\r
28     MouseMotionListener\r
29 {\r
30 \r
31         private String [] tip;\r
32         protected Component owner;\r
33 \r
34         private Container mainContainer;\r
35         private LayoutManager mainLayout;\r
36 \r
37         private boolean shown;\r
38 \r
39         private final int VERTICAL_OFFSET = 20;\r
40         private final int HORIZONTAL_ENLARGE = 10;\r
41 \r
42         int fontHeight = 0;\r
43 \r
44         Image linkImage;\r
45 \r
46         FontMetrics fm;\r
47 \r
48 \r
49 \r
50         public Tooltip(String tip, Component owner)\r
51         {\r
52           this.owner = owner;\r
53           owner.addMouseListener(this);\r
54           owner.addMouseMotionListener(this);\r
55           setBackground(new Color(255, 255, 220));\r
56           setTip(tip);\r
57           java.net.URL url = getClass().getResource("/images/link.gif");\r
58           if (url != null)\r
59           {\r
60             linkImage = java.awt.Toolkit.getDefaultToolkit().getImage(url);\r
61           }\r
62         }\r
63 \r
64 \r
65         public void paint(Graphics g)\r
66         {\r
67                 g.drawRect(0,0,getSize().width -1, getSize().height -1);\r
68                 int lindex, x;\r
69                 for(int i=0; i<tip.length; i++)\r
70                 {\r
71                   x = 3;\r
72                   lindex = tip[i].indexOf("%LINK%");\r
73                   if(lindex!=-1)\r
74                   {\r
75                    if(lindex>0)\r
76                    {\r
77                      g.drawString(tip[i].substring(0, lindex), 3, (i+1)*fontHeight-3);\r
78                      x+=fm.stringWidth(tip[i].substring(0, lindex)+3);\r
79                    }\r
80                     g.drawImage(linkImage, x, i * fontHeight+1, this);\r
81                   }\r
82                   else\r
83                   g.drawString(tip[i], 3, (i+1)*fontHeight - 3);\r
84                 }\r
85         }\r
86 \r
87         private void addToolTip()\r
88         {\r
89                 mainContainer.setLayout(null);\r
90                 mainContainer.add(this, 0);\r
91                 mainContainer.validate();\r
92                 repaint();\r
93                 shown = true;\r
94         }\r
95 \r
96         void setTip(String tip)\r
97         {\r
98           fm = getFontMetrics(owner.getFont());\r
99           fontHeight = fm.getHeight();\r
100 \r
101           int longestLine = 0;\r
102           StringTokenizer st = new StringTokenizer(tip, "\n");\r
103           this.tip = new String[st.countTokens()];\r
104           int index = 0;\r
105           while(st.hasMoreElements())\r
106           {\r
107             this.tip[index] = st.nextToken();\r
108             if(fm.stringWidth(this.tip[index])>longestLine)\r
109               longestLine = fm.stringWidth(this.tip[index]);\r
110             index ++;\r
111           }\r
112 \r
113           setSize(longestLine + HORIZONTAL_ENLARGE,\r
114                   fontHeight*this.tip.length);\r
115         }\r
116 \r
117         void setTipLocation(int x, int y)\r
118         {\r
119 \r
120           setLocation((owner.getLocationOnScreen().x - mainContainer.getLocationOnScreen().x) +x,\r
121            (owner.getLocationOnScreen().y - mainContainer.getLocationOnScreen().y + VERTICAL_OFFSET)+y);\r
122 \r
123 \r
124 \r
125         // correction, whole tool tip must be visible\r
126           if (mainContainer.getSize().width < (getLocation().x + getSize().width))\r
127           {\r
128             setLocation(mainContainer.getSize().width - getSize().width,\r
129                         getLocation().y);\r
130           }\r
131 \r
132         }\r
133 \r
134 \r
135         private void removeToolTip() {\r
136                 if (shown) {\r
137                         mainContainer.remove(0);\r
138                         mainContainer.setLayout(mainLayout);\r
139                         mainContainer.validate();\r
140                 }\r
141                 shown = false;\r
142         }\r
143 \r
144         private void findMainContainer() {\r
145                 Container parent = owner.getParent();\r
146                 while (true) {\r
147                         if ((parent instanceof Applet) || (parent instanceof Frame)) {\r
148                                 mainContainer = parent;\r
149                                 break;\r
150                         } else {\r
151                                 parent = parent.getParent();\r
152                         }\r
153                 }\r
154                 mainLayout = mainContainer.getLayout();\r
155         }\r
156 \r
157         public void mouseEntered(MouseEvent me)\r
158         {     }\r
159 \r
160         public void mouseExited(MouseEvent me)\r
161         {\r
162           removeToolTip();\r
163         }\r
164 \r
165         public void mousePressed(MouseEvent me)\r
166         {\r
167           removeToolTip();\r
168         }\r
169 \r
170         public void mouseReleased(MouseEvent me)\r
171         {}\r
172 \r
173         public void mouseClicked(MouseEvent me)\r
174         {}\r
175 \r
176         public void mouseMoved(MouseEvent me)\r
177         {\r
178           if (shown)\r
179             setTipLocation(me.getX(), me.getY());\r
180           else\r
181           {\r
182             findMainContainer();\r
183             addToolTip();\r
184             setTipLocation(me.getX(), me.getY());\r
185           }\r
186         }\r
187 \r
188         public void mouseDragged(MouseEvent me)\r
189         {}\r
190 }\r