SynthMenuItemUIpublic class SynthMenuItemUI extends BasicMenuItemUI implements SynthUI, PropertyChangeListener
Fields Summary |
---|
private SynthStyle | style | private SynthStyle | accStyle | private String | acceleratorDelimiter | static Rectangle | iconRect | static Rectangle | textRect | static Rectangle | acceleratorRect | static Rectangle | checkIconRect | static Rectangle | arrowIconRect | static Rectangle | viewRect | static Rectangle | r |
Methods Summary |
---|
public static javax.swing.plaf.ComponentUI | createUI(javax.swing.JComponent c)
return new SynthMenuItemUI();
| private int | getComponentState(javax.swing.JComponent c)
int state;
if (!c.isEnabled()) {
return DISABLED;
}
if (menuItem.isArmed()) {
state = MOUSE_OVER;
}
else {
state = SynthLookAndFeel.getComponentState(c);
}
if (menuItem.isSelected()) {
state |= SELECTED;
}
return state;
| private int | getComponentState(javax.swing.JComponent c, javax.swing.plaf.synth.Region region)
return getComponentState(c);
| public javax.swing.plaf.synth.SynthContext | getContext(javax.swing.JComponent c)
return getContext(c, getComponentState(c));
| javax.swing.plaf.synth.SynthContext | getContext(javax.swing.JComponent c, int state)
return SynthContext.getContext(SynthContext.class, c,
SynthLookAndFeel.getRegion(c), style, state);
| public javax.swing.plaf.synth.SynthContext | getContext(javax.swing.JComponent c, javax.swing.plaf.synth.Region region)
return getContext(c, region, getComponentState(c, region));
| private javax.swing.plaf.synth.SynthContext | getContext(javax.swing.JComponent c, javax.swing.plaf.synth.Region region, int state)
return SynthContext.getContext(SynthContext.class, c,
region, accStyle, state);
| protected java.awt.Dimension | getPreferredMenuItemSize(javax.swing.JComponent c, javax.swing.Icon checkIcon, javax.swing.Icon arrowIcon, int defaultTextIconGap)
SynthContext context = getContext(c);
SynthContext accContext = getContext(c, Region.MENU_ITEM_ACCELERATOR);
Dimension value = getPreferredMenuItemSize(context, accContext,
true, c, checkIcon, arrowIcon, defaultTextIconGap,
acceleratorDelimiter);
context.dispose();
accContext.dispose();
return value;
| static java.awt.Dimension | getPreferredMenuItemSize(javax.swing.plaf.synth.SynthContext context, javax.swing.plaf.synth.SynthContext accContext, boolean useCheckAndArrow, javax.swing.JComponent c, javax.swing.Icon checkIcon, javax.swing.Icon arrowIcon, int defaultTextIconGap, java.lang.String acceleratorDelimiter)
JMenuItem b = (JMenuItem) c;
Icon icon = (Icon) b.getIcon();
String text = b.getText();
KeyStroke accelerator = b.getAccelerator();
String acceleratorText = "";
if (accelerator != null) {
int modifiers = accelerator.getModifiers();
if (modifiers > 0) {
acceleratorText = KeyEvent.getKeyModifiersText(modifiers);
acceleratorText += acceleratorDelimiter;
}
int keyCode = accelerator.getKeyCode();
if (keyCode != 0) {
acceleratorText += KeyEvent.getKeyText(keyCode);
} else {
acceleratorText += accelerator.getKeyChar();
}
}
Font font = context.getStyle().getFont(context);
FontMetrics fm = b.getFontMetrics(font);
FontMetrics fmAccel = b.getFontMetrics(accContext.getStyle().
getFont(accContext));
resetRects();
layoutMenuItem(
context, fm, accContext, text, fmAccel, acceleratorText,
icon, checkIcon, arrowIcon, b.getVerticalAlignment(),
b.getHorizontalAlignment(), b.getVerticalTextPosition(),
b.getHorizontalTextPosition(), viewRect, iconRect, textRect,
acceleratorRect, checkIconRect, arrowIconRect,
text == null ? 0 : defaultTextIconGap, defaultTextIconGap,
useCheckAndArrow);
// find the union of the icon and text rects
r.setBounds(textRect);
r = SwingUtilities.computeUnion(iconRect.x,
iconRect.y,
iconRect.width,
iconRect.height,
r);
// To make the accelerator texts appear in a column,
// find the widest MenuItem text and the widest accelerator text.
// Get the parent, which stores the information.
Container parent = b.getParent();
if (parent instanceof JPopupMenu) {
SynthPopupMenuUI popupUI = (SynthPopupMenuUI)SynthLookAndFeel.
getUIOfType(((JPopupMenu)parent).getUI(),
SynthPopupMenuUI.class);
if (popupUI != null) {
r.width = popupUI.adjustTextWidth(r.width);
popupUI.adjustAcceleratorWidth(acceleratorRect.width);
r.width += popupUI.getMaxAcceleratorWidth();
}
}
else if (parent != null && !(b instanceof JMenu &&
((JMenu)b).isTopLevelMenu())) {
r.width += acceleratorRect.width;
}
if( useCheckAndArrow ) {
// Add in the checkIcon
r.width += checkIconRect.width;
r.width += defaultTextIconGap;
// Add in the arrowIcon
r.width += defaultTextIconGap;
r.width += arrowIconRect.width;
}
r.width += 2*defaultTextIconGap;
Insets insets = b.getInsets();
if(insets != null) {
r.width += insets.left + insets.right;
r.height += insets.top + insets.bottom;
}
// if the width is even, bump it up one. This is critical
// for the focus dash line to draw properly
if(r.width%2 == 0) {
r.width++;
}
// if the height is even, bump it up one. This is critical
// for the text to center properly
if(r.height%2 == 0) {
r.height++;
}
return r.getSize();
| private javax.swing.plaf.synth.Region | getRegion(javax.swing.JComponent c)
return SynthLookAndFeel.getRegion(c);
| protected void | installDefaults()
updateStyle(menuItem);
| protected void | installListeners()
super.installListeners();
menuItem.addPropertyChangeListener(this);
| private static java.lang.String | layoutMenuItem(javax.swing.plaf.synth.SynthContext context, java.awt.FontMetrics fm, javax.swing.plaf.synth.SynthContext accContext, java.lang.String text, java.awt.FontMetrics fmAccel, java.lang.String acceleratorText, javax.swing.Icon icon, javax.swing.Icon checkIcon, javax.swing.Icon arrowIcon, int verticalAlignment, int horizontalAlignment, int verticalTextPosition, int horizontalTextPosition, java.awt.Rectangle viewRect, java.awt.Rectangle iconRect, java.awt.Rectangle textRect, java.awt.Rectangle acceleratorRect, java.awt.Rectangle checkIconRect, java.awt.Rectangle arrowIconRect, int textIconGap, int menuItemGap, boolean useCheckAndArrow)Compute and return the location of the icons origin, the
location of origin of the text baseline, and a possibly clipped
version of the compound labels string. Locations are computed
relative to the viewRect rectangle.
context.getStyle().getGraphicsUtils(context).layoutText(
context, fm, text, icon,horizontalAlignment, verticalAlignment,
horizontalTextPosition, verticalTextPosition, viewRect,
iconRect, textRect, textIconGap);
/* Initialize the acceelratorText bounds rectangle textRect. If a null
* or and empty String was specified we substitute "" here
* and use 0,0,0,0 for acceleratorTextRect.
*/
if( (acceleratorText == null) || acceleratorText.equals("") ) {
acceleratorRect.width = acceleratorRect.height = 0;
acceleratorText = "";
}
else {
SynthStyle style = accContext.getStyle();
acceleratorRect.width = style.getGraphicsUtils(accContext).
computeStringWidth(accContext, fmAccel.getFont(), fmAccel,
acceleratorText);
acceleratorRect.height = fmAccel.getHeight();
}
/* Initialize the checkIcon bounds rectangle's width & height.
*/
if( useCheckAndArrow) {
if (checkIcon != null) {
checkIconRect.width = SynthIcon.getIconWidth(checkIcon,
context);
checkIconRect.height = SynthIcon.getIconHeight(checkIcon,
context);
}
else {
checkIconRect.width = checkIconRect.height = 0;
}
/* Initialize the arrowIcon bounds rectangle width & height.
*/
if (arrowIcon != null) {
arrowIconRect.width = SynthIcon.getIconWidth(arrowIcon,
context);
arrowIconRect.height = SynthIcon.getIconHeight(arrowIcon,
context);
} else {
arrowIconRect.width = arrowIconRect.height = 0;
}
}
Rectangle labelRect = iconRect.union(textRect);
if( SynthLookAndFeel.isLeftToRight(context.getComponent()) ) {
textRect.x += menuItemGap;
iconRect.x += menuItemGap;
// Position the Accelerator text rect
acceleratorRect.x = viewRect.x + viewRect.width -
arrowIconRect.width - menuItemGap - acceleratorRect.width;
// Position the Check and Arrow Icons
if (useCheckAndArrow) {
checkIconRect.x = viewRect.x + menuItemGap;
textRect.x += menuItemGap + checkIconRect.width;
iconRect.x += menuItemGap + checkIconRect.width;
arrowIconRect.x = viewRect.x + viewRect.width - menuItemGap
- arrowIconRect.width;
}
} else {
textRect.x -= menuItemGap;
iconRect.x -= menuItemGap;
// Position the Accelerator text rect
acceleratorRect.x = viewRect.x + arrowIconRect.width + menuItemGap;
// Position the Check and Arrow Icons
if (useCheckAndArrow) {
checkIconRect.x = viewRect.x + viewRect.width - menuItemGap
- checkIconRect.width;
textRect.x -= menuItemGap + checkIconRect.width;
iconRect.x -= menuItemGap + checkIconRect.width;
arrowIconRect.x = viewRect.x + menuItemGap;
}
}
// Align the accelertor text and the check and arrow icons vertically
// with the center of the label rect.
acceleratorRect.y = labelRect.y + (labelRect.height/2) - (acceleratorRect.height/2);
if( useCheckAndArrow ) {
arrowIconRect.y = labelRect.y + (labelRect.height/2) - (arrowIconRect.height/2);
checkIconRect.y = labelRect.y + (labelRect.height/2) - (checkIconRect.height/2);
}
return text;
| public void | paint(java.awt.Graphics g, javax.swing.JComponent c)
SynthContext context = getContext(c);
paint(context, g);
context.dispose();
| protected void | paint(javax.swing.plaf.synth.SynthContext context, java.awt.Graphics g)
SynthContext accContext = getContext(menuItem,
Region.MENU_ITEM_ACCELERATOR);
String prefix = getPropertyPrefix();
paint(context, accContext, g,
style.getIcon(getContext(context.getComponent()),
prefix + ".checkIcon"),
style.getIcon(getContext(context.getComponent()),
prefix + ".arrowIcon"),
true, acceleratorDelimiter, defaultTextIconGap);
accContext.dispose();
| static void | paint(javax.swing.plaf.synth.SynthContext context, javax.swing.plaf.synth.SynthContext accContext, java.awt.Graphics g, javax.swing.Icon checkIcon, javax.swing.Icon arrowIcon, boolean useCheckAndArrow, java.lang.String acceleratorDelimiter, int defaultTextIconGap)
JComponent c = context.getComponent();
JMenuItem b = (JMenuItem)c;
ButtonModel model = b.getModel();
Insets i = b.getInsets();
resetRects();
viewRect.setBounds(0, 0, b.getWidth(), b.getHeight());
viewRect.x += i.left;
viewRect.y += i.top;
viewRect.width -= (i.right + viewRect.x);
viewRect.height -= (i.bottom + viewRect.y);
SynthStyle style = context.getStyle();
Font f = style.getFont(context);
g.setFont(f);
FontMetrics fm = SwingUtilities2.getFontMetrics(c, g, f);
FontMetrics accFM = SwingUtilities2.getFontMetrics(c, g,
accContext.getStyle().
getFont(accContext));
// get Accelerator text
KeyStroke accelerator = b.getAccelerator();
String acceleratorText = "";
if (accelerator != null) {
int modifiers = accelerator.getModifiers();
if (modifiers > 0) {
acceleratorText = KeyEvent.getKeyModifiersText(modifiers);
acceleratorText += acceleratorDelimiter;
}
int keyCode = accelerator.getKeyCode();
if (keyCode != 0) {
acceleratorText += KeyEvent.getKeyText(keyCode);
} else {
acceleratorText += accelerator.getKeyChar();
}
}
// layoutl the text and icon
String text = layoutMenuItem(context, fm, accContext,
b.getText(), accFM, acceleratorText, b.getIcon(),
checkIcon, arrowIcon,
b.getVerticalAlignment(), b.getHorizontalAlignment(),
b.getVerticalTextPosition(), b.getHorizontalTextPosition(),
viewRect, iconRect, textRect, acceleratorRect,
checkIconRect, arrowIconRect,
b.getText() == null ? 0 : defaultTextIconGap,
defaultTextIconGap, useCheckAndArrow
);
// Paint the Check
if (checkIcon != null && useCheckAndArrow ) {
SynthIcon.paintIcon(checkIcon, context, g, checkIconRect.x,
checkIconRect.y, checkIconRect.width, checkIconRect.height);
}
// Paint the Icon
if(b.getIcon() != null) {
Icon icon;
if(!model.isEnabled()) {
icon = (Icon) b.getDisabledIcon();
} else if(model.isPressed() && model.isArmed()) {
icon = (Icon) b.getPressedIcon();
if(icon == null) {
// Use default icon
icon = (Icon) b.getIcon();
}
} else {
icon = (Icon) b.getIcon();
}
if (icon!=null) {
SynthIcon.paintIcon(icon, context, g, iconRect.x,
iconRect.y, iconRect.width, iconRect.height);
}
}
// Draw the Text
if(text != null) {
View v = (View) c.getClientProperty(BasicHTML.propertyKey);
if (v != null) {
v.paint(g, textRect);
} else {
g.setColor(style.getColor(context, ColorType.TEXT_FOREGROUND));
g.setFont(style.getFont(context));
style.getGraphicsUtils(context).paintText(context, g, text,
textRect.x, textRect.y, b.getDisplayedMnemonicIndex());
}
}
// Draw the Accelerator Text
if(acceleratorText != null && !acceleratorText.equals("")) {
// Get the maxAccWidth from the parent to calculate the offset.
int accOffset = 0;
Container parent = b.getParent();
if (parent != null && parent instanceof JPopupMenu) {
SynthPopupMenuUI popupUI = (SynthPopupMenuUI)
((JPopupMenu)parent).getUI();
if (popupUI != null) {
// Calculate the offset, with which the accelerator texts
// will be drawn with.
int max = popupUI.getMaxAcceleratorWidth();
if (max > 0) {
accOffset = max - acceleratorRect.width;
}
}
}
SynthStyle accStyle = accContext.getStyle();
g.setColor(accStyle.getColor(accContext,
ColorType.TEXT_FOREGROUND));
g.setFont(accStyle.getFont(accContext));
accStyle.getGraphicsUtils(accContext).paintText(
accContext, g, acceleratorText, acceleratorRect.x -
accOffset, acceleratorRect.y, -1);
}
// Paint the Arrow
if (arrowIcon != null && useCheckAndArrow) {
SynthIcon.paintIcon(arrowIcon, context, g, arrowIconRect.x,
arrowIconRect.y, arrowIconRect.width, arrowIconRect.height);
}
| void | paintBackground(javax.swing.plaf.synth.SynthContext context, java.awt.Graphics g, javax.swing.JComponent c)
context.getPainter().paintMenuItemBackground(context, g, 0, 0,
c.getWidth(), c.getHeight());
| public void | paintBorder(javax.swing.plaf.synth.SynthContext context, java.awt.Graphics g, int x, int y, int w, int h)
context.getPainter().paintMenuItemBorder(context, g, x, y, w, h);
| public void | propertyChange(java.beans.PropertyChangeEvent e)
if (SynthLookAndFeel.shouldUpdateStyle(e)) {
updateStyle((JMenuItem)e.getSource());
}
| private static void | resetRects()
iconRect.setBounds(0, 0, 0, 0);
textRect.setBounds(0, 0, 0, 0);
acceleratorRect.setBounds(0, 0, 0, 0);
checkIconRect.setBounds(0, 0, 0, 0);
arrowIconRect.setBounds(0, 0, 0, 0);
viewRect.setBounds(0,0,Short.MAX_VALUE, Short.MAX_VALUE);
r.setBounds(0, 0, 0, 0);
| protected void | uninstallDefaults()
SynthContext context = getContext(menuItem, ENABLED);
style.uninstallDefaults(context);
context.dispose();
style = null;
SynthContext accContext = getContext(menuItem,
Region.MENU_ITEM_ACCELERATOR, ENABLED);
accStyle.uninstallDefaults(accContext);
accContext.dispose();
accStyle = null;
super.uninstallDefaults();
| protected void | uninstallListeners()
super.uninstallListeners();
menuItem.removePropertyChangeListener(this);
| public void | update(java.awt.Graphics g, javax.swing.JComponent c)
SynthContext context = getContext(c);
SynthLookAndFeel.update(context, g);
paintBackground(context, g, c);
paint(context, g);
context.dispose();
| private void | updateStyle(javax.swing.JMenuItem mi)
SynthContext context = getContext(mi, ENABLED);
SynthStyle oldStyle = style;
style = SynthLookAndFeel.updateStyle(context, this);
if (oldStyle != style) {
String prefix = getPropertyPrefix();
defaultTextIconGap = style.getInt(
context, prefix + ".textIconGap", 4);
if (menuItem.getMargin() == null ||
(menuItem.getMargin() instanceof UIResource)) {
Insets insets = (Insets)style.get(context, prefix + ".margin");
if (insets == null) {
// Some places assume margins are non-null.
insets = SynthLookAndFeel.EMPTY_UIRESOURCE_INSETS;
}
menuItem.setMargin(insets);
}
acceleratorDelimiter = style.getString(context, prefix +
".acceleratorDelimiter", "+");
arrowIcon = style.getIcon(context, prefix + ".arrowIcon");
checkIcon = style.getIcon(context, prefix + ".checkIcon");
if (oldStyle != null) {
uninstallKeyboardActions();
installKeyboardActions();
}
}
context.dispose();
SynthContext accContext = getContext(mi, Region.MENU_ITEM_ACCELERATOR,
ENABLED);
accStyle = SynthLookAndFeel.updateStyle(accContext, this);
accContext.dispose();
|
|