|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package javax.swing.plaf.basic; |
|
|
|
import sun.swing.SwingUtilities2; |
|
import java.awt.*; |
|
import java.beans.PropertyChangeEvent; |
|
import java.beans.PropertyChangeListener; |
|
|
|
import javax.swing.*; |
|
import javax.swing.BorderFactory; |
|
import javax.swing.border.Border; |
|
import javax.swing.plaf.ToolTipUI; |
|
import javax.swing.plaf.ComponentUI; |
|
import javax.swing.plaf.UIResource; |
|
import javax.swing.text.View; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public class BasicToolTipUI extends ToolTipUI |
|
{ |
|
static BasicToolTipUI sharedInstance = new BasicToolTipUI(); |
|
|
|
|
|
|
|
*/ |
|
private static PropertyChangeListener sharedPropertyChangedListener; |
|
|
|
private PropertyChangeListener propertyChangeListener; |
|
|
|
public static ComponentUI createUI(JComponent c) { |
|
return sharedInstance; |
|
} |
|
|
|
public BasicToolTipUI() { |
|
super(); |
|
} |
|
|
|
public void installUI(JComponent c) { |
|
installDefaults(c); |
|
installComponents(c); |
|
installListeners(c); |
|
} |
|
|
|
public void uninstallUI(JComponent c) { |
|
|
|
uninstallDefaults(c); |
|
uninstallComponents(c); |
|
uninstallListeners(c); |
|
} |
|
|
|
protected void installDefaults(JComponent c){ |
|
LookAndFeel.installColorsAndFont(c, "ToolTip.background", |
|
"ToolTip.foreground", |
|
"ToolTip.font"); |
|
LookAndFeel.installProperty(c, "opaque", Boolean.TRUE); |
|
componentChanged(c); |
|
} |
|
|
|
protected void uninstallDefaults(JComponent c){ |
|
LookAndFeel.uninstallBorder(c); |
|
} |
|
|
|
|
|
*/ |
|
private void installComponents(JComponent c){ |
|
BasicHTML.updateRenderer(c, ((JToolTip)c).getTipText()); |
|
} |
|
|
|
|
|
*/ |
|
private void uninstallComponents(JComponent c){ |
|
BasicHTML.updateRenderer(c, ""); |
|
} |
|
|
|
protected void installListeners(JComponent c) { |
|
propertyChangeListener = createPropertyChangeListener(c); |
|
|
|
c.addPropertyChangeListener(propertyChangeListener); |
|
} |
|
|
|
protected void uninstallListeners(JComponent c) { |
|
c.removePropertyChangeListener(propertyChangeListener); |
|
|
|
propertyChangeListener = null; |
|
} |
|
|
|
|
|
*/ |
|
private PropertyChangeListener createPropertyChangeListener(JComponent c) { |
|
if (sharedPropertyChangedListener == null) { |
|
sharedPropertyChangedListener = new PropertyChangeHandler(); |
|
} |
|
return sharedPropertyChangedListener; |
|
} |
|
|
|
public void paint(Graphics g, JComponent c) { |
|
Font font = c.getFont(); |
|
FontMetrics metrics = SwingUtilities2.getFontMetrics(c, g, font); |
|
Dimension size = c.getSize(); |
|
|
|
g.setColor(c.getForeground()); |
|
|
|
String tipText = ((JToolTip)c).getTipText(); |
|
if (tipText == null) { |
|
tipText = ""; |
|
} |
|
|
|
Insets insets = c.getInsets(); |
|
Rectangle paintTextR = new Rectangle( |
|
insets.left + 3, |
|
insets.top, |
|
size.width - (insets.left + insets.right) - 6, |
|
size.height - (insets.top + insets.bottom)); |
|
View v = (View) c.getClientProperty(BasicHTML.propertyKey); |
|
if (v != null) { |
|
v.paint(g, paintTextR); |
|
} else { |
|
g.setFont(font); |
|
SwingUtilities2.drawString(c, g, tipText, paintTextR.x, |
|
paintTextR.y + metrics.getAscent()); |
|
} |
|
} |
|
|
|
public Dimension getPreferredSize(JComponent c) { |
|
Font font = c.getFont(); |
|
FontMetrics fm = c.getFontMetrics(font); |
|
Insets insets = c.getInsets(); |
|
|
|
Dimension prefSize = new Dimension(insets.left+insets.right, |
|
insets.top+insets.bottom); |
|
String text = ((JToolTip)c).getTipText(); |
|
|
|
if ((text == null) || text.equals("")) { |
|
text = ""; |
|
} |
|
else { |
|
View v = (c != null) ? (View) c.getClientProperty("html") : null; |
|
if (v != null) { |
|
prefSize.width += (int) v.getPreferredSpan(View.X_AXIS) + 6; |
|
prefSize.height += (int) v.getPreferredSpan(View.Y_AXIS); |
|
} else { |
|
prefSize.width += SwingUtilities2.stringWidth(c,fm,text) + 6; |
|
prefSize.height += fm.getHeight(); |
|
} |
|
} |
|
return prefSize; |
|
} |
|
|
|
public Dimension getMinimumSize(JComponent c) { |
|
Dimension d = getPreferredSize(c); |
|
View v = (View) c.getClientProperty(BasicHTML.propertyKey); |
|
if (v != null) { |
|
d.width -= v.getPreferredSpan(View.X_AXIS) - v.getMinimumSpan(View.X_AXIS); |
|
} |
|
return d; |
|
} |
|
|
|
public Dimension getMaximumSize(JComponent c) { |
|
Dimension d = getPreferredSize(c); |
|
View v = (View) c.getClientProperty(BasicHTML.propertyKey); |
|
if (v != null) { |
|
d.width += v.getMaximumSpan(View.X_AXIS) - v.getPreferredSpan(View.X_AXIS); |
|
} |
|
return d; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
private void componentChanged(JComponent c) { |
|
JComponent comp = ((JToolTip)c).getComponent(); |
|
|
|
if (comp != null && !(comp.isEnabled())) { |
|
// For better backward compatibility, only install inactive |
|
|
|
if (UIManager.getBorder("ToolTip.borderInactive") != null) { |
|
LookAndFeel.installBorder(c, "ToolTip.borderInactive"); |
|
} |
|
else { |
|
LookAndFeel.installBorder(c, "ToolTip.border"); |
|
} |
|
if (UIManager.getColor("ToolTip.backgroundInactive") != null) { |
|
LookAndFeel.installColors(c,"ToolTip.backgroundInactive", |
|
"ToolTip.foregroundInactive"); |
|
} |
|
else { |
|
LookAndFeel.installColors(c,"ToolTip.background", |
|
"ToolTip.foreground"); |
|
} |
|
} else { |
|
LookAndFeel.installBorder(c, "ToolTip.border"); |
|
LookAndFeel.installColors(c, "ToolTip.background", |
|
"ToolTip.foreground"); |
|
} |
|
} |
|
|
|
|
|
private static class PropertyChangeHandler implements |
|
PropertyChangeListener { |
|
public void propertyChange(PropertyChangeEvent e) { |
|
String name = e.getPropertyName(); |
|
if (name.equals("tiptext") || "font".equals(name) || |
|
"foreground".equals(name)) { |
|
// remove the old html view client property if one |
|
// existed, and install a new one if the text installed |
|
|
|
JToolTip tip = ((JToolTip) e.getSource()); |
|
String text = tip.getTipText(); |
|
BasicHTML.updateRenderer(tip, text); |
|
} |
|
else if ("component".equals(name)) { |
|
JToolTip tip = ((JToolTip) e.getSource()); |
|
|
|
if (tip.getUI() instanceof BasicToolTipUI) { |
|
((BasicToolTipUI)tip.getUI()).componentChanged(tip); |
|
} |
|
} |
|
} |
|
} |
|
} |