package org.opensourcephysics.tools; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.BorderFactory; import javax.swing.CellRendererPane; import javax.swing.JComponent; import javax.swing.JTextArea; import javax.swing.JToolTip; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicToolTipUI; /** * A multiline tooltip UI based on open source code from http://code.ohloh.net. */ public class MultiLineToolTipUI extends BasicToolTipUI { private static MultiLineToolTipUI sharedInstance = new MultiLineToolTipUI(); private static JTextArea textArea ; private CellRendererPane rendererPane; public static ComponentUI createUI(JComponent c) { return sharedInstance; } /** * Constructor */ protected MultiLineToolTipUI() { super(); } @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; } @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); textArea.setBorder(BorderFactory.createEmptyBorder(0, 2, 2, 2)); rendererPane.removeAll(); rendererPane.add(textArea); textArea.setWrapStyleWord(true); textArea.setLineWrap(false); Dimension dim = textArea.getPreferredSize(); dim.height += 2; dim.width += 2; return dim; } @Override public Dimension getMinimumSize(JComponent c) { return getPreferredSize(c); } @Override public Dimension getMaximumSize(JComponent c) { return getPreferredSize(c); } }