JAL-1807 still testing
[jalviewjs.git] / unused / appletgui / Tooltip.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)\r
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors\r
4  * \r
5  * This file is part of Jalview.\r
6  * \r
7  * Jalview is free software: you can redistribute it and/or\r
8  * modify it under the terms of the GNU General Public License \r
9  * as published by the Free Software Foundation, either version 3\r
10  * of the License, or (at your option) any later version.\r
11  *  \r
12  * Jalview is distributed in the hope that it will be useful, but \r
13  * WITHOUT ANY WARRANTY; without even the implied warranty \r
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
15  * PURPOSE.  See the GNU General Public License for more details.\r
16  * \r
17  * You should have received a copy of the GNU General Public License\r
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
19  * The Jalview Authors are detailed in the 'AUTHORS' file.\r
20  */\r
21 package jalview.appletgui;\r
22 \r
23 import javax.swing.JApplet;\r
24 import java.awt.Color;\r
25 import java.awt.Component;\r
26 import java.awt.Container;\r
27 import java.awt.FontMetrics;\r
28 import java.awt.Graphics;\r
29 import java.awt.Image;\r
30 import java.awt.LayoutManager;\r
31 import java.awt.event.MouseEvent;\r
32 import java.awt.event.MouseListener;\r
33 import java.awt.event.MouseMotionListener;\r
34 import java.util.StringTokenizer;\r
35 \r
36 import javax.swing.JPanel;\r
37 import javax.swing.JFrame;\r
38 \r
39 public class Tooltip extends JPanel implements MouseListener,\r
40         MouseMotionListener\r
41 {\r
42   private String[] tip;\r
43 \r
44   private String lastTip = "";\r
45 \r
46   private boolean setPosition = false;\r
47 \r
48   protected Component owner;\r
49 \r
50   private Container mainContainer;\r
51 \r
52   private LayoutManager mainLayout;\r
53 \r
54   private boolean shown;\r
55 \r
56   private final int VERTICAL_OFFSET = 20;\r
57 \r
58   private final int HORIZONTAL_ENLARGE = 10;\r
59 \r
60   int fontHeight = 0;\r
61 \r
62   Image linkImage;\r
63 \r
64   FontMetrics fm;\r
65 \r
66   public Tooltip(String tip, Component owner)\r
67   {\r
68     this.owner = owner;\r
69     owner.addMouseListener(this);\r
70     owner.addMouseMotionListener(this);\r
71     setBackground(new Color(255, 255, 220));\r
72     setTip(tip);\r
73     java.net.URL url = getClass().getResource("/images/link.gif");\r
74     if (url != null)\r
75     {\r
76       linkImage = java.awt.Toolkit.getDefaultToolkit().getImage(url);\r
77     }\r
78   }\r
79 \r
80   public void paint(Graphics g)\r
81   {\r
82     int w = getSize().width;\r
83     int h = getSize().height;\r
84 \r
85     g.drawRect(0, 0, w - 1, h - 1);\r
86     int lindex, x;\r
87     for (int i = 0; i < tip.length; i++)\r
88     {\r
89       x = 3;\r
90       lindex = tip[i].indexOf("%LINK%");\r
91       if (lindex != -1)\r
92       {\r
93         if (lindex > 0)\r
94         {\r
95           g.drawString(tip[i].substring(0, lindex), 3, (i + 1) * fontHeight\r
96                   - 3);\r
97           x += fm.stringWidth(tip[i].substring(0, lindex) + 3);\r
98         }\r
99         g.drawImage(linkImage, x, i * fontHeight + 1, this);\r
100         if (lindex + 6 < tip[i].length())\r
101         {\r
102           g.drawString(tip[i].substring(lindex + 6),\r
103                   x + linkImage.getWidth(this), (i + 1) * fontHeight - 3);\r
104         }\r
105       }\r
106       else\r
107       {\r
108         g.drawString(tip[i], 3, (i + 1) * fontHeight - 3);\r
109       }\r
110     }\r
111   }\r
112 \r
113   synchronized void setTip(String tip)\r
114   {\r
115     if (tip == null)\r
116     {\r
117       setTip("");\r
118       return;\r
119     }\r
120 \r
121     if (lastTip.equals(tip))\r
122     {\r
123       return;\r
124     }\r
125 \r
126     lastTip = tip;\r
127     setPosition = true;\r
128 \r
129     fm = getFontMetrics(owner.getFont());\r
130     fontHeight = fm.getHeight();\r
131 \r
132     int longestLine = 0;\r
133     StringTokenizer st = new StringTokenizer(tip, "\n");\r
134     this.tip = new String[st.countTokens()];\r
135     int index = 0;\r
136     while (st.hasMoreElements())\r
137     {\r
138       this.tip[index] = st.nextToken();\r
139       if (fm.stringWidth(this.tip[index]) > longestLine)\r
140       {\r
141         longestLine = fm.stringWidth(this.tip[index]);\r
142       }\r
143       index++;\r
144     }\r
145 \r
146     setSize(longestLine + HORIZONTAL_ENLARGE, fontHeight * this.tip.length);\r
147 \r
148     repaint();\r
149 \r
150   }\r
151 \r
152   void setTipLocation(MouseEvent evt)\r
153   {\r
154     if (mainContainer == null || owner == null)\r
155     {\r
156       return;\r
157     }\r
158     setLocation(\r
159             (owner.getLocationOnScreen().x - mainContainer.getLocationOnScreen().x)\r
160                     + evt.getX(),\r
161             (owner.getLocationOnScreen().y\r
162                     - mainContainer.getLocationOnScreen().y + VERTICAL_OFFSET)\r
163                     + evt.getY());\r
164 \r
165     // correction, whole tool tip must be visible\r
166     if (mainContainer.getSize().width < (getLocation().x + getSize().width))\r
167     {\r
168       setLocation(mainContainer.getSize().width - getSize().width,\r
169               getLocation().y);\r
170     }\r
171   }\r
172 \r
173   private void removeToolTip()\r
174   {\r
175     if (shown)\r
176     {\r
177       mainContainer.remove(0);\r
178       mainContainer.setLayout(mainLayout);\r
179       mainContainer.validate();\r
180     }\r
181     shown = false;\r
182   }\r
183 \r
184   private void findMainContainer()\r
185   {\r
186     Container parent = owner.getParent();\r
187     while (true)\r
188     {\r
189       if ((parent instanceof JApplet) || (parent instanceof JFrame))\r
190       {\r
191         mainContainer = parent;\r
192         break;\r
193       }\r
194       else\r
195       {\r
196         parent = parent.getParent();\r
197       }\r
198     }\r
199     mainLayout = mainContainer.getLayout();\r
200   }\r
201 \r
202   public void mouseEntered(MouseEvent me)\r
203   {\r
204     setTipLocation(me);\r
205   }\r
206 \r
207   public void mouseExited(MouseEvent me)\r
208   {\r
209     removeToolTip();\r
210   }\r
211 \r
212   public void mousePressed(MouseEvent me)\r
213   {\r
214     removeToolTip();\r
215   }\r
216 \r
217   public void mouseReleased(MouseEvent me)\r
218   {\r
219   }\r
220 \r
221   public void mouseClicked(MouseEvent me)\r
222   {\r
223   }\r
224 \r
225   public void mouseMoved(MouseEvent me)\r
226   {\r
227     if (!shown)\r
228     {\r
229       findMainContainer();\r
230       mainContainer.setLayout(null);\r
231       mainContainer.add(this, 0);\r
232       mainContainer.validate();\r
233       shown = true;\r
234       setTipLocation(me);\r
235     }\r
236     else if (setPosition)\r
237     {\r
238       setTipLocation(me);\r
239       setPosition = false;\r
240     }\r
241   }\r
242 \r
243   public void mouseDragged(MouseEvent me)\r
244   {\r
245   }\r
246 }\r