package iiuf.swing;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.util.ArrayList;
import javax.swing.JToolTip;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
import javax.swing.plaf.metal.MetalToolTipUI;
import javax.swing.text.Segment;
import javax.swing.text.Utilities;
import iiuf.util.Strings;
/**
A multi-line tool tip implementation.
(c) 2001, DIUF<p>
@author $Author: ohitz $
@version $Name: $ $Revision: 1.1 $
*/
public class MultiLineToolTip
extends
JToolTip
{
static class MultiLineToolTipUI
extends
MetalToolTipUI
{
private String[] lines;
private int maxWidth;
private int maxAllowedWidth;
MultiLineToolTipUI(int maxWidth) {
maxAllowedWidth = maxWidth;
}
public void paint(Graphics g, JComponent c) {
FontMetrics metrics = g.getFontMetrics();
Dimension size = c.getSize();
g.setColor(c.getBackground());
g.fillRect(0, 0, size.width, size.height);
g.setColor(c.getForeground());
int y = metrics.getAscent() + 1;
int h = metrics.getHeight();
if(lines != null)
for (int i = 0; i < lines.length; i++) {
g.drawString(lines[i], 3, y);
y += h;
}
}
public Dimension getPreferredSize(JComponent c) {
FontMetrics metrics = c.getFontMetrics(c.getFont());
String tipText = ((JToolTip)c).getTipText();
if(tipText == null) tipText = "";
ArrayList linesa = new ArrayList();
String[] strs = Strings.split(tipText, '\n');
for(int i = 0; i < strs.length; i++) {
Segment s = new Segment(strs[i].toCharArray(), 0, strs[i].length());
for(int brk = 0; ;) {
if(Utilities.getTabbedTextWidth(s, metrics, 0, null, 0) < maxAllowedWidth) {
linesa.add(new String(s.array, s.offset, s.array.length - s.offset));
break;
}
brk = Utilities.getBreakLocation(s, metrics, 0, maxAllowedWidth, null, 0);
linesa.add(new String(s.array, s.offset, brk));
s.offset += brk;
s.count -= brk;
}
}
lines = (String[])linesa.toArray(new String[linesa.size()]);
maxWidth = 0;
for(int i = 0; i < lines.length; i++)
maxWidth = Math.max(maxWidth, SwingUtilities.computeStringWidth(metrics, lines[i]));
return new Dimension(maxWidth + 6, metrics.getHeight() * lines.length + 2);
}
}
public MultiLineToolTip() {
setUI(new MultiLineToolTipUI(400));
}
public MultiLineToolTip(int maxWidth) {
setUI(new MultiLineToolTipUI(maxWidth));
}
}
/*
$Log: MultiLineToolTip.java,v $
Revision 1.1 2002/07/11 12:09:52 ohitz
Initial checkin
Revision 1.3 2001/02/19 15:10:38 schubige
Fixed graph edge port location bug
Revision 1.2 2001/02/11 16:25:39 schubige
working on soundium
Revision 1.1 2001/02/09 17:34:48 schubige
working on soundium
*/