/*
* This File is part of PortableSigner (http://portablesigner.sf.net/)
* and is under the European Public License V1.1 (http://www.osor.eu/eupl)
* (c) Peter Pfl�ging <peter@pflaeging.net>
*
* Stolen from http://de.pastebin.ca/942635
*/
package net.pflaeging.PortableSigner;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.CellRendererPane;
import javax.swing.JComponent;
import javax.swing.JTextArea;
import javax.swing.JToolTip;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicToolTipUI;
/*
* Renders ToolTips:
* - with multiple lines
* - autowidth + max. width
* - linewrap
* - uses jTextArea
*
* For ease of use insert the following lines into you Application:
*
* MultiLineToolTipUI.setMaximumWidth(250);
* MultiLineToolTipUI.initialize();
* javax.swing.ToolTipManager.sharedInstance().setDismissDelay(20000);
*
* � Dexter 2008
*/
public class MultiLineToolTipUI extends BasicToolTipUI {
protected CellRendererPane rendererPane;
private static JTextArea textArea;
private static int maximumWidth = 0;
static MultiLineToolTipUI singleton = new MultiLineToolTipUI();
public static void initialize() {
// don't hardcode class name
String key = "ToolTipUI";
Class cls = singleton.getClass();
String name = cls.getName();
UIManager.put(key,name);
UIManager.put(name,cls);
}
private MultiLineToolTipUI() {
super();
}
public static ComponentUI createUI(JComponent c) {
return singleton;
}
@Override
public void installUI(JComponent c) {
super.installUI(c);
rendererPane = new CellRendererPane();
c.add(rendererPane);
}
@Override
public void uninstallUI(JComponent c) {
super.uninstallUI(c);
c.remove(rendererPane);
rendererPane = null;
}
/**
* set maximum width
* 0 = no maximum width
*/
public static void setMaximumWidth(int width){
maximumWidth = width;
}
@Override
public void paint(Graphics g, JComponent c) {
Dimension size = c.getSize();
textArea.setBackground(c.getBackground());
rendererPane.paintComponent(g, textArea, c, 1, 1,
size.width - 1, size.height - 1, true);
}
@Override
public Dimension getPreferredSize(JComponent c) {
String tipText = ((JToolTip)c).getTipText();
if (tipText == null){
return new Dimension(0,0);
}
textArea = new JTextArea(tipText );
rendererPane.removeAll();
rendererPane.add(textArea );
textArea.setWrapStyleWord(true);
textArea.setLineWrap(false);
if( maximumWidth > 0 && maximumWidth < textArea.getPreferredSize().getWidth()){
textArea.setLineWrap(true);
Dimension d = textArea.getPreferredSize();
d.width = maximumWidth;
d.height++;
textArea.setSize(d);
}
Dimension dim = textArea.getPreferredSize();
dim.height += 1;
dim.width += 1;
return dim;
}
@Override
public Dimension getMinimumSize(JComponent c) {
return getPreferredSize(c);
}
@Override
public Dimension getMaximumSize(JComponent c) {
return getPreferredSize(c);
}
}