|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package javax.swing.plaf.metal; |
|
|
|
import sun.swing.SwingUtilities2; |
|
import java.awt.*; |
|
import java.awt.event.*; |
|
import javax.swing.*; |
|
import javax.swing.BorderFactory; |
|
import javax.swing.border.Border; |
|
import javax.swing.plaf.*; |
|
import javax.swing.plaf.basic.BasicToolTipUI; |
|
import javax.swing.plaf.basic.BasicHTML; |
|
import javax.swing.text.View; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public class MetalToolTipUI extends BasicToolTipUI { |
|
|
|
static MetalToolTipUI sharedInstance = new MetalToolTipUI(); |
|
private Font smallFont; |
|
|
|
private JToolTip tip; |
|
public static final int padSpaceBetweenStrings = 12; |
|
private String acceleratorDelimiter; |
|
|
|
public MetalToolTipUI() { |
|
super(); |
|
} |
|
|
|
public static ComponentUI createUI(JComponent c) { |
|
return sharedInstance; |
|
} |
|
|
|
public void installUI(JComponent c) { |
|
super.installUI(c); |
|
tip = (JToolTip)c; |
|
Font f = c.getFont(); |
|
smallFont = new Font( f.getName(), f.getStyle(), f.getSize() - 2 ); |
|
acceleratorDelimiter = UIManager.getString( "MenuItem.acceleratorDelimiter" ); |
|
if ( acceleratorDelimiter == null ) { acceleratorDelimiter = "-"; } |
|
} |
|
|
|
public void uninstallUI(JComponent c) { |
|
super.uninstallUI(c); |
|
tip = null; |
|
} |
|
|
|
public void paint(Graphics g, JComponent c) { |
|
JToolTip tip = (JToolTip)c; |
|
Font font = c.getFont(); |
|
FontMetrics metrics = SwingUtilities2.getFontMetrics(c, g, font); |
|
Dimension size = c.getSize(); |
|
int accelBL; |
|
|
|
g.setColor(c.getForeground()); |
|
|
|
String tipText = tip.getTipText(); |
|
if (tipText == null) { |
|
tipText = ""; |
|
} |
|
|
|
String accelString = getAcceleratorString(tip); |
|
FontMetrics accelMetrics = SwingUtilities2.getFontMetrics(c, g, smallFont); |
|
int accelSpacing = calcAccelSpacing(c, accelMetrics, accelString); |
|
|
|
Insets insets = tip.getInsets(); |
|
Rectangle paintTextR = new Rectangle( |
|
insets.left + 3, |
|
insets.top, |
|
size.width - (insets.left + insets.right) - 6 - accelSpacing, |
|
size.height - (insets.top + insets.bottom)); |
|
View v = (View) c.getClientProperty(BasicHTML.propertyKey); |
|
if (v != null) { |
|
v.paint(g, paintTextR); |
|
accelBL = BasicHTML.getHTMLBaseline(v, paintTextR.width, |
|
paintTextR.height); |
|
} else { |
|
g.setFont(font); |
|
SwingUtilities2.drawString(tip, g, tipText, paintTextR.x, |
|
paintTextR.y + metrics.getAscent()); |
|
accelBL = metrics.getAscent(); |
|
} |
|
|
|
if (!accelString.equals("")) { |
|
g.setFont(smallFont); |
|
g.setColor( MetalLookAndFeel.getPrimaryControlDarkShadow() ); |
|
SwingUtilities2.drawString(tip, g, accelString, |
|
tip.getWidth() - 1 - insets.right |
|
- accelSpacing |
|
+ padSpaceBetweenStrings |
|
- 3, |
|
paintTextR.y + accelBL); |
|
} |
|
} |
|
|
|
private int calcAccelSpacing(JComponent c, FontMetrics fm, String accel) { |
|
return accel.equals("") |
|
? 0 |
|
: padSpaceBetweenStrings + |
|
SwingUtilities2.stringWidth(c, fm, accel); |
|
} |
|
|
|
public Dimension getPreferredSize(JComponent c) { |
|
Dimension d = super.getPreferredSize(c); |
|
|
|
String key = getAcceleratorString((JToolTip)c); |
|
if (!(key.equals(""))) { |
|
d.width += calcAccelSpacing(c, c.getFontMetrics(smallFont), key); |
|
} |
|
return d; |
|
} |
|
|
|
protected boolean isAcceleratorHidden() { |
|
Boolean b = (Boolean)UIManager.get("ToolTip.hideAccelerator"); |
|
return b != null && b.booleanValue(); |
|
} |
|
|
|
private String getAcceleratorString(JToolTip tip) { |
|
this.tip = tip; |
|
|
|
String retValue = getAcceleratorString(); |
|
|
|
this.tip = null; |
|
return retValue; |
|
} |
|
|
|
// NOTE: This requires the tip field to be set before this is invoked. |
|
// As MetalToolTipUI is shared between all JToolTips the tip field is |
|
// set appropriately before this is invoked. Unfortunately this means |
|
// that subclasses that randomly invoke this method will see varying |
|
// results. If this becomes an issue, MetalToolTipUI should no longer be |
|
|
|
public String getAcceleratorString() { |
|
if (tip == null || isAcceleratorHidden()) { |
|
return ""; |
|
} |
|
JComponent comp = tip.getComponent(); |
|
if (!(comp instanceof AbstractButton)) { |
|
return ""; |
|
} |
|
|
|
KeyStroke[] keys = comp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).keys(); |
|
if (keys == null) { |
|
return ""; |
|
} |
|
|
|
String controlKeyStr = ""; |
|
|
|
for (int i = 0; i < keys.length; i++) { |
|
int mod = keys[i].getModifiers(); |
|
controlKeyStr = KeyEvent.getKeyModifiersText(mod) + |
|
acceleratorDelimiter + |
|
KeyEvent.getKeyText(keys[i].getKeyCode()); |
|
break; |
|
} |
|
|
|
return controlKeyStr; |
|
} |
|
|
|
} |