/* 
* Copyright 2016 Agencia Estatal de Administración Tibutaria
*
* Licencia con arreglo a la EUPL, Versión 1.1 o –en cuanto
* sean aprobadas por la Comisión Europea– versiones
* posteriores de la EUPL (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en:
*  
* https://joinup.ec.europa.eu/software/page/eupl
*  
* Salvo cuando lo exija la legislación aplicable o se acuerde
* por escrito, el programa distribuido con arreglo a la
* Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES
* DE NINGÚN TIPO, ni expresasni implícitas.
*
* Véase la Licencia en el idioma concreto que rige los permisos y 
* limitaciones que establece la Licencia.
*/ 


package servidor.utiles;

import java.awt.Dimension; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Toolkit; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.StringReader; 
import java.util.Enumeration; 
import java.util.StringTokenizer; 
import java.util.Vector; 
import javax.swing.JComponent; 
import javax.swing.JToolTip; 
import javax.swing.SwingUtilities; 
import javax.swing.plaf.metal.MetalToolTipUI ; 



public  class MultiLineToolTipUI extends MetalToolTipUI { 

	  public void paint(Graphics g, JComponent c) { 
	    FontMetrics metrics = Toolkit.getDefaultToolkit().getFontMetrics(g.getFont()); 
	    Dimension size = c.getSize(); 
	    g.setColor(c.getBackground()); 
	    g.fillRect(0, 0, size.width, size.height); 
	    g.setColor(c.getForeground()); 
	    if (strs != null) { 
	      for (int i = 0; i < strs.length; i++) { 
	        g.drawString(strs[i], 3, (metrics.getHeight()) * (i+1)); 
	      } 
	    } 
	  } 

	  public Dimension getPreferredSize(JComponent c) { 
	    FontMetrics metrics = Toolkit.getDefaultToolkit().getFontMetrics(c.getFont()); 
	    String tipText = ((JToolTip)c).getTipText(); 
	    if (tipText == null) { 
	      tipText = ""; 
	    } 

	    StringBuffer tip = new StringBuffer(); 
	    StringTokenizer tok = new StringTokenizer(tipText); 
	    int ps = 0; 
	    while (tok.hasMoreTokens()) { 
	      final String s = tok.nextToken(); 
	      if (ps + s.length() > 66) { 
	ps = 0; 
	tip.append (s + (tok.hasMoreTokens() ? "\n" : "")); 
	      } else { 
	tip.append(s + (tok.hasMoreTokens() ? " " : "")); 
	      } 
	      ps += s.length() + 1; 
	    } 

	    BufferedReader br = new BufferedReader(new StringReader( tip.toString())); 
	    String line; 
	    int maxWidth = 0; 
	    Vector v = new Vector(); 
	    try { 
	      while ((line = br.readLine()) != null) { 
	        int width = SwingUtilities.computeStringWidth(metrics,line); 
	        maxWidth = (maxWidth < width) ? width : maxWidth; 
	        v.addElement(line); 
	      } 
	    } catch (IOException ex) { 
	      ex.printStackTrace(); 
	    } 

	    int lines = v.size(); 
	    if (lines < 1) { 
	      strs = null; 
	      lines = 1; 
	    } else { 
	      strs = new String[lines]; 
	      int i=0; 
	      for (Enumeration e = v.elements(); e.hasMoreElements() ;i++) { 
	        strs[i] = (String)e.nextElement(); 
	      } 
	    } 
	    int height = metrics.getHeight() * lines; 

	    return new Dimension(maxWidth + 6, height + 4); 
	  } 


	  // ---------------------------------------------------------------------- 
	  // DATA MEMBERS 
	  // ---------------------------------------------------------------------- 

	  private String[] strs; 

	} 