1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46: import ;
47: import ;
48: import ;
49: import ;
50: import ;
51:
52: import ;
53: import ;
54: import ;
55: import ;
56: import ;
57: import ;
58: import ;
59: import ;
60: import ;
61: import ;
62: import ;
63: import ;
64:
65:
68: public class MetalToolTipUI
69: extends BasicToolTipUI
70: {
71:
75: public static final int padSpaceBetweenStrings = 12;
76:
77:
78: private static MetalToolTipUI instance = null;
79:
80:
81: private boolean isAcceleratorHidden;
82:
83:
84: private String acceleratorString;
85:
86:
89: private String acceleratorDelimiter;
90:
91:
92: private Font acceleratorFont;
93:
94:
95: private Color acceleratorForeground;
96:
97:
98: private Border activeBorder;
99:
100:
101: private Border inactiveBorder;
102:
103:
106: public MetalToolTipUI()
107: {
108: super();
109: activeBorder = UIManager.getBorder("ToolTip.border");
110: inactiveBorder = UIManager.getBorder("ToolTip.borderInactive");
111: isAcceleratorHidden = UIManager.getBoolean("ToolTip.hideAccelerator");
112: acceleratorFont = UIManager.getFont("MenuItem.acceleratorFont");
113: acceleratorForeground = UIManager.getColor("MenuItem.acceleratorForeground");
114: acceleratorDelimiter = UIManager.getString("MenuItem.acceleratorDelimiter");
115: }
116:
117:
126: public static ComponentUI createUI(JComponent component)
127: {
128: if (instance == null)
129: instance = new MetalToolTipUI();
130: return instance;
131: }
132:
133:
139: public String getAcceleratorString()
140: {
141: return acceleratorString;
142: }
143:
144:
149: public void installUI(JComponent c)
150: {
151: super.installUI(c);
152: Border existingBorder = c.getBorder();
153: if (existingBorder == null || existingBorder instanceof UIResource)
154: {
155: if (c.isEnabled())
156: c.setBorder(activeBorder);
157: else
158: c.setBorder(inactiveBorder);
159: }
160: }
161:
162:
167: public void uninstallUI(JComponent c)
168: {
169: super.uninstallUI(c);
170: if (c.getBorder() instanceof UIResource)
171: c.setBorder(null);
172: }
173:
174:
181: protected boolean isAcceleratorHidden()
182: {
183: return isAcceleratorHidden;
184: }
185:
186:
193: public Dimension getPreferredSize(JComponent c)
194: {
195: if (isAcceleratorHidden())
196: return super.getPreferredSize(c);
197: else
198: {
199: Insets insets = c.getInsets();
200: JToolTip tt = (JToolTip) c;
201: String tipText = tt.getTipText();
202: if (tipText != null)
203: {
204: FontMetrics fm = c.getFontMetrics(c.getFont());
205: int prefH = fm.getHeight() + insets.top + insets.bottom;
206: int prefW = fm.stringWidth(tipText) + insets.left + insets.right;
207:
208:
209:
210: acceleratorString = fetchAcceleratorString(c);
211: if (acceleratorString != null)
212: {
213: prefW += padSpaceBetweenStrings;
214: fm = c.getFontMetrics(acceleratorFont);
215: prefW += fm.stringWidth(acceleratorString);
216: }
217: return new Dimension(prefW, prefH);
218: }
219: else return new Dimension(0, 0);
220: }
221: }
222:
223:
229: public void paint(Graphics g, JComponent c)
230: {
231: JToolTip tip = (JToolTip) c;
232:
233: String text = tip.getTipText();
234: Toolkit t = tip.getToolkit();
235: if (text == null)
236: return;
237:
238: Rectangle vr = new Rectangle();
239: vr = SwingUtilities.calculateInnerArea(tip, vr);
240: Rectangle ir = new Rectangle();
241: Rectangle tr = new Rectangle();
242: FontMetrics fm = t.getFontMetrics(tip.getFont());
243: int ascent = fm.getAscent();
244: SwingUtilities.layoutCompoundLabel(tip, fm, text, null,
245: SwingConstants.CENTER, SwingConstants.LEFT,
246: SwingConstants.CENTER, SwingConstants.CENTER, vr, ir, tr, 0);
247: Color saved = g.getColor();
248: g.setColor(Color.BLACK);
249:
250: g.drawString(text, vr.x, vr.y + ascent);
251:
252:
253: if (acceleratorString != null)
254: {
255: g.setFont(acceleratorFont);
256: g.setColor(acceleratorForeground);
257: fm = t.getFontMetrics(acceleratorFont);
258: int width = fm.stringWidth(acceleratorString);
259: g.drawString(acceleratorString, vr.x + vr.width - width - padSpaceBetweenStrings/2,
260: vr.y + vr.height - fm.getDescent());
261: }
262:
263: g.setColor(saved);
264: }
265:
266:
275: private String fetchAcceleratorString(JComponent c)
276: {
277: String result = null;
278: if (c instanceof JToolTip)
279: {
280: JToolTip toolTip = (JToolTip) c;
281: JComponent component = toolTip.getComponent();
282: KeyStroke ks = null;
283: int mne = 0;
284: if (component instanceof JMenuItem)
285: {
286: JMenuItem item = (JMenuItem) component;
287: ks = item.getAccelerator();
288: if (ks == null)
289: mne = item.getMnemonic();
290: }
291: else if (component instanceof AbstractButton)
292: {
293: AbstractButton button = (AbstractButton) component;
294: mne = button.getMnemonic();
295: }
296: if (mne > 0)
297: ks = KeyStroke.getKeyStroke(Character.toUpperCase((char) mne),
298: InputEvent.ALT_MASK, false);
299: if (ks != null)
300: result = acceleratorToString(ks);
301: }
302: return result;
303: }
304:
305:
312: private String acceleratorToString(KeyStroke accelerator)
313: {
314:
315: String modifiersText = "";
316: int modifiers = accelerator.getModifiers();
317: char keyChar = accelerator.getKeyChar();
318: int keyCode = accelerator.getKeyCode();
319:
320: if (modifiers != 0)
321: modifiersText = KeyEvent.getKeyModifiersText(modifiers)
322: + acceleratorDelimiter;
323:
324: if (keyCode == KeyEvent.VK_UNDEFINED)
325: return modifiersText + keyChar;
326: else
327: return modifiersText + KeyEvent.getKeyText(keyCode);
328: }
329:
330: }