2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\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
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
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
20 package jalview.appletgui;
\r
22 import java.applet.*;
\r
26 import java.awt.event.*;
\r
28 public class Tooltip
\r
29 extends Canvas implements MouseListener,
\r
32 private String[] tip;
\r
33 private String lastTip = "";
\r
34 private boolean setPosition = false;
\r
35 protected Component owner;
\r
37 private Container mainContainer;
\r
38 private LayoutManager mainLayout;
\r
40 private boolean shown;
\r
42 private final int VERTICAL_OFFSET = 20;
\r
43 private final int HORIZONTAL_ENLARGE = 10;
\r
51 public Tooltip(String tip, Component owner)
\r
54 owner.addMouseListener(this);
\r
55 owner.addMouseMotionListener(this);
\r
56 setBackground(new Color(255, 255, 220));
\r
58 java.net.URL url = getClass().getResource("/images/link.gif");
\r
61 linkImage = java.awt.Toolkit.getDefaultToolkit().getImage(url);
\r
65 public void paint(Graphics g)
\r
67 int w = getSize().width;
\r
68 int h = getSize().height;
\r
70 g.drawRect(0, 0, w - 1, h - 1);
\r
72 for (int i = 0; i < tip.length; i++)
\r
75 lindex = tip[i].indexOf("%LINK%");
\r
80 g.drawString(tip[i].substring(0, lindex), 3, (i + 1) * fontHeight - 3);
\r
81 x += fm.stringWidth(tip[i].substring(0, lindex) + 3);
\r
83 g.drawImage(linkImage, x, i * fontHeight + 1, this);
\r
84 if (lindex + 6 < tip[i].length())
\r
86 g.drawString(tip[i].substring(lindex + 6),
\r
87 x + linkImage.getWidth(this),
\r
88 (i + 1) * fontHeight - 3);
\r
93 g.drawString(tip[i], 3, (i + 1) * fontHeight - 3);
\r
98 synchronized void setTip(String tip)
\r
106 if (lastTip.equals(tip))
\r
112 setPosition = true;
\r
114 fm = getFontMetrics(owner.getFont());
\r
115 fontHeight = fm.getHeight();
\r
117 int longestLine = 0;
\r
118 StringTokenizer st = new StringTokenizer(tip, "\n");
\r
119 this.tip = new String[st.countTokens()];
\r
121 while (st.hasMoreElements())
\r
123 this.tip[index] = st.nextToken();
\r
124 if (fm.stringWidth(this.tip[index]) > longestLine)
\r
126 longestLine = fm.stringWidth(this.tip[index]);
\r
131 setSize(longestLine + HORIZONTAL_ENLARGE,
\r
132 fontHeight * this.tip.length);
\r
138 void setTipLocation(MouseEvent evt)
\r
140 if(mainContainer==null || owner==null)
\r
144 setLocation( (owner.getLocationOnScreen().x
\r
145 - mainContainer.getLocationOnScreen().x) + evt.getX(),
\r
146 (owner.getLocationOnScreen().y -
\r
147 mainContainer.getLocationOnScreen().y
\r
148 + VERTICAL_OFFSET) + evt.getY());
\r
150 // correction, whole tool tip must be visible
\r
151 if (mainContainer.getSize().width < (getLocation().x + getSize().width))
\r
153 setLocation(mainContainer.getSize().width - getSize().width,
\r
158 private void removeToolTip()
\r
162 mainContainer.remove(0);
\r
163 mainContainer.setLayout(mainLayout);
\r
164 mainContainer.validate();
\r
169 private void findMainContainer()
\r
171 Container parent = owner.getParent();
\r
174 if ( (parent instanceof Applet) || (parent instanceof Frame))
\r
176 mainContainer = parent;
\r
181 parent = parent.getParent();
\r
184 mainLayout = mainContainer.getLayout();
\r
187 public void mouseEntered(MouseEvent me)
\r
189 setTipLocation(me);
\r
192 public void mouseExited(MouseEvent me)
\r
197 public void mousePressed(MouseEvent me)
\r
202 public void mouseReleased(MouseEvent me)
\r
205 public void mouseClicked(MouseEvent me)
\r
208 public void mouseMoved(MouseEvent me)
\r
212 findMainContainer();
\r
213 mainContainer.setLayout(null);
\r
214 mainContainer.add(this, 0);
\r
215 mainContainer.validate();
\r
217 setTipLocation(me);
\r
219 else if (setPosition)
\r
221 setTipLocation(me);
\r
222 setPosition = false;
\r
226 public void mouseDragged(MouseEvent me)
\r