X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FTooltip.java;h=7168cf3b1419bb3f4f230f1c3da8e7a71873970e;hb=2de8acfae59aced665e4c37ad0f7dcc2ed68818e;hp=b25abd5c7bc26f1b17f7fa2df88137129b8d4855;hpb=bceadbb394604c88ac18e2dcf4b33e735377d7ac;p=jalview.git diff --git a/src/jalview/appletgui/Tooltip.java b/src/jalview/appletgui/Tooltip.java index b25abd5..7168cf3 100755 --- a/src/jalview/appletgui/Tooltip.java +++ b/src/jalview/appletgui/Tooltip.java @@ -1,172 +1,233 @@ - +/* + * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1) + * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ package jalview.appletgui; -import java.awt.*; import java.applet.*; -import java.awt.event.*; import java.util.*; +import java.awt.*; +import java.awt.event.*; + public class Tooltip extends Canvas implements MouseListener, - MouseMotionListener + MouseMotionListener { + private String[] tip; - private String [] tip; - protected Component owner; - - private Container mainContainer; - private LayoutManager mainLayout; - - private boolean shown; - - private final int VERTICAL_OFFSET = 20; - private final int HORIZONTAL_ENLARGE = 10; - - int fontHeight = 0; - - Image linkImage; - - FontMetrics fm; - - - - public Tooltip(String tip, Component owner) - { - this.owner = owner; - owner.addMouseListener(this); - owner.addMouseMotionListener(this); - setBackground(new Color(255, 255, 220)); - setTip(tip); - java.net.URL url = getClass().getResource("/images/link.gif"); - if (url != null) - { - linkImage = java.awt.Toolkit.getDefaultToolkit().getImage(url); - } - } - + private String lastTip = ""; - public void paint(Graphics g) - { - g.drawRect(0,0,getSize().width -1, getSize().height -1); - int lindex, x; - for(int i=0; i0) - { - g.drawString(tip[i].substring(0, lindex), 3, (i+1)*fontHeight-3); - x+=fm.stringWidth(tip[i].substring(0, lindex)+3); - } - g.drawImage(linkImage, x, i * fontHeight+1, this); - } - else - g.drawString(tip[i], 3, (i+1)*fontHeight - 3); - } - } - - private void addToolTip() - { - mainContainer.setLayout(null); - mainContainer.add(this, 0); - mainContainer.validate(); - repaint(); - shown = true; - } + private boolean setPosition = false; - void setTip(String tip) - { - fm = getFontMetrics(owner.getFont()); - fontHeight = fm.getHeight(); - - int longestLine = 0; - StringTokenizer st = new StringTokenizer(tip, "\n"); - this.tip = new String[st.countTokens()]; - int index = 0; - while(st.hasMoreElements()) - { - this.tip[index] = st.nextToken(); - if(fm.stringWidth(this.tip[index])>longestLine) - longestLine = fm.stringWidth(this.tip[index]); - index ++; - } - - setSize(longestLine + HORIZONTAL_ENLARGE, - fontHeight*this.tip.length); - } - - void setTipLocation(int x, int y) - { + protected Component owner; - setLocation((owner.getLocationOnScreen().x - mainContainer.getLocationOnScreen().x) +x, - (owner.getLocationOnScreen().y - mainContainer.getLocationOnScreen().y + VERTICAL_OFFSET)+y); + private Container mainContainer; + private LayoutManager mainLayout; + private boolean shown; - // correction, whole tool tip must be visible - if (mainContainer.getSize().width < (getLocation().x + getSize().width)) - { - setLocation(mainContainer.getSize().width - getSize().width, - getLocation().y); - } + private final int VERTICAL_OFFSET = 20; - } + private final int HORIZONTAL_ENLARGE = 10; + int fontHeight = 0; - private void removeToolTip() { - if (shown) { - mainContainer.remove(0); - mainContainer.setLayout(mainLayout); - mainContainer.validate(); - } - shown = false; - } + Image linkImage; - private void findMainContainer() { - Container parent = owner.getParent(); - while (true) { - if ((parent instanceof Applet) || (parent instanceof Frame)) { - mainContainer = parent; - break; - } else { - parent = parent.getParent(); - } - } - mainLayout = mainContainer.getLayout(); - } + FontMetrics fm; - public void mouseEntered(MouseEvent me) - { } + public Tooltip(String tip, Component owner) + { + this.owner = owner; + owner.addMouseListener(this); + owner.addMouseMotionListener(this); + setBackground(new Color(255, 255, 220)); + setTip(tip); + java.net.URL url = getClass().getResource("/images/link.gif"); + if (url != null) + { + linkImage = java.awt.Toolkit.getDefaultToolkit().getImage(url); + } + } - public void mouseExited(MouseEvent me) - { - removeToolTip(); - } + public void paint(Graphics g) + { + int w = getSize().width; + int h = getSize().height; - public void mousePressed(MouseEvent me) + g.drawRect(0, 0, w - 1, h - 1); + int lindex, x; + for (int i = 0; i < tip.length; i++) + { + x = 3; + lindex = tip[i].indexOf("%LINK%"); + if (lindex != -1) + { + if (lindex > 0) { - removeToolTip(); + g.drawString(tip[i].substring(0, lindex), 3, (i + 1) * fontHeight + - 3); + x += fm.stringWidth(tip[i].substring(0, lindex) + 3); } - - public void mouseReleased(MouseEvent me) - {} - - public void mouseClicked(MouseEvent me) - {} - - public void mouseMoved(MouseEvent me) + g.drawImage(linkImage, x, i * fontHeight + 1, this); + if (lindex + 6 < tip[i].length()) { - if (shown) - setTipLocation(me.getX(), me.getY()); - else - { - findMainContainer(); - addToolTip(); - setTipLocation(me.getX(), me.getY()); - } + g.drawString(tip[i].substring(lindex + 6), x + + linkImage.getWidth(this), (i + 1) * fontHeight - 3); } - - public void mouseDragged(MouseEvent me) - {} + } + else + { + g.drawString(tip[i], 3, (i + 1) * fontHeight - 3); + } + } + } + + synchronized void setTip(String tip) + { + if (tip == null) + { + setTip(""); + return; + } + + if (lastTip.equals(tip)) + { + return; + } + + lastTip = tip; + setPosition = true; + + fm = getFontMetrics(owner.getFont()); + fontHeight = fm.getHeight(); + + int longestLine = 0; + StringTokenizer st = new StringTokenizer(tip, "\n"); + this.tip = new String[st.countTokens()]; + int index = 0; + while (st.hasMoreElements()) + { + this.tip[index] = st.nextToken(); + if (fm.stringWidth(this.tip[index]) > longestLine) + { + longestLine = fm.stringWidth(this.tip[index]); + } + index++; + } + + setSize(longestLine + HORIZONTAL_ENLARGE, fontHeight * this.tip.length); + + repaint(); + + } + + void setTipLocation(MouseEvent evt) + { + if (mainContainer == null || owner == null) + { + return; + } + setLocation((owner.getLocationOnScreen().x - mainContainer + .getLocationOnScreen().x) + + evt.getX(), (owner.getLocationOnScreen().y + - mainContainer.getLocationOnScreen().y + VERTICAL_OFFSET) + + evt.getY()); + + // correction, whole tool tip must be visible + if (mainContainer.getSize().width < (getLocation().x + getSize().width)) + { + setLocation(mainContainer.getSize().width - getSize().width, + getLocation().y); + } + } + + private void removeToolTip() + { + if (shown) + { + mainContainer.remove(0); + mainContainer.setLayout(mainLayout); + mainContainer.validate(); + } + shown = false; + } + + private void findMainContainer() + { + Container parent = owner.getParent(); + while (true) + { + if ((parent instanceof Applet) || (parent instanceof Frame)) + { + mainContainer = parent; + break; + } + else + { + parent = parent.getParent(); + } + } + mainLayout = mainContainer.getLayout(); + } + + public void mouseEntered(MouseEvent me) + { + setTipLocation(me); + } + + public void mouseExited(MouseEvent me) + { + removeToolTip(); + } + + public void mousePressed(MouseEvent me) + { + removeToolTip(); + } + + public void mouseReleased(MouseEvent me) + { + } + + public void mouseClicked(MouseEvent me) + { + } + + public void mouseMoved(MouseEvent me) + { + if (!shown) + { + findMainContainer(); + mainContainer.setLayout(null); + mainContainer.add(this, 0); + mainContainer.validate(); + shown = true; + setTipLocation(me); + } + else if (setPosition) + { + setTipLocation(me); + setPosition = false; + } + } + + public void mouseDragged(MouseEvent me) + { + } }