Subversion Repositories wimsdev

Rev

Rev 3662 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2.     Sketch Elements: Chemistry molecular diagram drawing tool.
  3.    
  4.     (c) 2005 Dr. Alex M. Clark
  5.    
  6.     Released as GNUware, under the Gnu Public License (GPL)
  7.    
  8.     See www.gnu.org for details.
  9. */
  10.  
  11. package WIMSchem;
  12.  
  13. import javax.swing.*;
  14. import javax.swing.plaf.*;
  15. import java.awt.*;
  16. import java.awt.event.*;
  17. import java.awt.font.*;
  18. import java.io.*;
  19. import java.util.*;
  20.  
  21. // Subclassed version of the ToolButton which supports tool-tips with multiple lines.
  22.  
  23. public class ToolButton extends JToggleButton
  24. {
  25.     public ToolButton(Icon icon) {super(icon);}
  26.  
  27.     public JToolTip createToolTip()
  28.     {
  29.         MultiLineToolTip tip=new MultiLineToolTip();
  30.         tip.setComponent(this);
  31.         return tip;
  32.     }
  33. }
  34.  
  35. class MultiLineToolTip extends JToolTip
  36. {
  37.     public MultiLineToolTip()
  38.     {
  39.         setUI(new MultiLineToolTipUI());
  40.     }
  41. }
  42.  
  43. class MultiLineToolTipUI extends ToolTipUI
  44. {
  45.     String[] strs;
  46.     int maxWidth=0;
  47.    
  48.     public void paint(Graphics g,JComponent c)
  49.     {
  50.         Font font=g.getFont();
  51.         FontMetrics metrics=g.getFontMetrics();
  52.         FontRenderContext frc=new FontRenderContext(null,false,false);
  53.         Dimension size=c.getSize();
  54.         g.setColor(c.getBackground());
  55.         g.fillRect(0,0,size.width,size.height);
  56.         g.setColor(c.getForeground());
  57.         g.drawRect(0,0,size.width-1,size.height-1);
  58.         if (strs!=null)
  59.         {
  60.             int y=0;
  61.             for (int i=0;i<strs.length;i++)
  62.             {
  63.                 y+=(int)font.getLineMetrics(strs[i],frc).getHeight()+2;
  64.                 g.drawString(strs[i],3,y);
  65.                 //g.drawString(strs[i],3,(metrics.getHeight())*(i+1));
  66.             }
  67.         }
  68.     }
  69.  
  70.     public Dimension getPreferredSize(JComponent c)
  71.     {
  72.         Font font=c.getFont();
  73.         FontRenderContext frc=new FontRenderContext(null,false,false);
  74.         String tipText=((JToolTip) c).getTipText();
  75.         if (tipText==null) tipText="";
  76.         while (tipText.endsWith("\n")) {tipText=tipText.substring(0,tipText.length()-1);}
  77.         BufferedReader br=new BufferedReader(new StringReader(tipText));
  78.         String line;
  79.         int maxWidth=0,totalHeight=0;
  80.         Vector<String> v=new Vector<String>();
  81.         try
  82.         {
  83.             while ((line=br.readLine())!=null)
  84.             {
  85.                 int width=(int)font.getStringBounds(line,frc).getWidth();
  86.                 maxWidth=(maxWidth<width) ? width : maxWidth;
  87.                 v.addElement(line);
  88.                 totalHeight+=(int)font.getLineMetrics(line,frc).getHeight()+2;
  89.             }
  90.         }
  91.         catch (IOException ex)
  92.         {
  93.             ex.printStackTrace();
  94.         }
  95.         int lines=v.size();
  96.         if (lines<1)
  97.         {
  98.             strs=null;
  99.             lines=1;
  100.         }
  101.         else
  102.         {
  103.             strs=new String[lines];
  104.             int i=0;
  105.             for (Enumeration e=v.elements();e.hasMoreElements();i++) strs[i]=(String)e.nextElement();
  106.         }
  107.         this.maxWidth=maxWidth;
  108.         return new Dimension(maxWidth+6,totalHeight+4);
  109.     }
  110. }
  111.