if (width > prefWidth) {
shiftX = (width - prefWidth) / 2;
}
}
ResizableIcon buttonIcon = commandButton.getIcon();
String buttonText = commandButton.getText();
String buttonExtraText = commandButton.getExtraText();
boolean hasIcon = (buttonIcon != null);
boolean hasText = (buttonText != null) || (buttonExtraText != null);
boolean hasPopupIcon = FlamingoUtilities.hasPopupAction(commandButton);
boolean ltr = commandButton.getComponentOrientation().isLeftToRight();
FontMetrics fm = g.getFontMetrics();
int labelHeight = fm.getAscent() + fm.getDescent();
JCommandButton.CommandButtonKind buttonKind = (commandButton instanceof JCommandButton) ? ((JCommandButton) commandButton)
.getCommandButtonKind()
: JCommandButton.CommandButtonKind.ACTION_ONLY;
int layoutHGap = FlamingoUtilities.getHLayoutGap(commandButton);
if (ltr) {
int x = ins.left + shiftX - layoutHGap;
// icon
if (hasIcon) {
x += layoutHGap;
int iconHeight = buttonIcon.getIconHeight();
int iconWidth = buttonIcon.getIconWidth();
result.iconRect.x = x;
result.iconRect.y = (height - iconHeight) / 2;
result.iconRect.width = iconWidth;
result.iconRect.height = iconHeight;
x += (iconWidth + layoutHGap);
}
// text
if (hasText) {
x += layoutHGap;
TextLayoutInfo lineLayoutInfo = new TextLayoutInfo();
lineLayoutInfo.text = commandButton.getText();
lineLayoutInfo.textRect = new Rectangle();
lineLayoutInfo.textRect.x = x;
lineLayoutInfo.textRect.y = (height - 2 * labelHeight) / 2;
lineLayoutInfo.textRect.width = (buttonText == null) ? 0
: (int) fm.getStringBounds(buttonText, g).getWidth();
lineLayoutInfo.textRect.height = labelHeight;
result.textLayoutInfoList = new ArrayList<TextLayoutInfo>();
result.textLayoutInfoList.add(lineLayoutInfo);
String extraText = commandButton.getExtraText();
TextLayoutInfo extraLineLayoutInfo = new TextLayoutInfo();
extraLineLayoutInfo.text = extraText;
extraLineLayoutInfo.textRect = new Rectangle();
extraLineLayoutInfo.textRect.x = x;
extraLineLayoutInfo.textRect.y = lineLayoutInfo.textRect.y
+ labelHeight;
extraLineLayoutInfo.textRect.width = (extraText == null) ? 0
: (int) fm.getStringBounds(extraText, g).getWidth();
extraLineLayoutInfo.textRect.height = labelHeight;
result.extraTextLayoutInfoList = new ArrayList<TextLayoutInfo>();
result.extraTextLayoutInfoList.add(extraLineLayoutInfo);
x += Math.max(lineLayoutInfo.textRect.width,
extraLineLayoutInfo.textRect.width);
x += layoutHGap;
}
if (hasPopupIcon) {
x += 2 * layoutHGap;
result.popupActionRect.x = x;
result.popupActionRect.y = (height - labelHeight) / 2 - 1;
result.popupActionRect.width = 1 + labelHeight / 2;
result.popupActionRect.height = labelHeight + 2;
x += result.popupActionRect.width;
x += 2 * layoutHGap;
}
int xBorderBetweenActionAndPopup = 0;
int verticalSeparatorWidth = new JSeparator(JSeparator.VERTICAL)
.getPreferredSize().width;
// compute the action and popup click areas
switch (buttonKind) {
case ACTION_ONLY:
result.actionClickArea.x = 0;
result.actionClickArea.y = 0;
result.actionClickArea.width = width;
result.actionClickArea.height = height;
result.isTextInActionArea = true;
break;
case POPUP_ONLY:
result.popupClickArea.x = 0;
result.popupClickArea.y = 0;
result.popupClickArea.width = width;
result.popupClickArea.height = height;
result.isTextInActionArea = false;
break;
case ACTION_AND_POPUP_MAIN_ACTION:
// 1. break before popup icon if button has text or icon
// 2. no break (all popup) if button has no text and no icon
if (hasText || hasIcon) {
// shift popup action rectangle to the right to
// accomodate the vertical separator
result.popupActionRect.x += verticalSeparatorWidth;
xBorderBetweenActionAndPopup = result.popupActionRect.x - 2
* layoutHGap;
result.actionClickArea.x = 0;
result.actionClickArea.y = 0;
result.actionClickArea.width = xBorderBetweenActionAndPopup;
result.actionClickArea.height = height;
result.popupClickArea.x = xBorderBetweenActionAndPopup;
result.popupClickArea.y = 0;
result.popupClickArea.width = width
- xBorderBetweenActionAndPopup;
result.popupClickArea.height = height;
result.separatorOrientation = CommandButtonSeparatorOrientation.VERTICAL;
result.separatorArea = new Rectangle();
result.separatorArea.x = xBorderBetweenActionAndPopup;
result.separatorArea.y = 0;
result.separatorArea.width = verticalSeparatorWidth;
result.separatorArea.height = height;
result.isTextInActionArea = true;
} else {
result.popupClickArea.x = 0;
result.popupClickArea.y = 0;
result.popupClickArea.width = width;
result.popupClickArea.height = height;
result.isTextInActionArea = true;
}
break;
case ACTION_AND_POPUP_MAIN_POPUP:
// 1. break after icon if button has icon
// 2. no break (all popup) if button has no icon
if (hasIcon) {
// shift text rectangles and popup action rectangle to the
// right
// to accomodate the vertical separator
if (result.textLayoutInfoList != null) {
for (TextLayoutInfo textLayoutInfo : result.textLayoutInfoList) {
textLayoutInfo.textRect.x += verticalSeparatorWidth;
}
}
if (result.extraTextLayoutInfoList != null) {
for (TextLayoutInfo extraTextLayoutInfo : result.extraTextLayoutInfoList) {
extraTextLayoutInfo.textRect.x += verticalSeparatorWidth;
}
}
result.popupActionRect.x += verticalSeparatorWidth;
xBorderBetweenActionAndPopup = result.iconRect.x
+ result.iconRect.width + layoutHGap;
result.actionClickArea.x = 0;
result.actionClickArea.y = 0;
result.actionClickArea.width = xBorderBetweenActionAndPopup;
result.actionClickArea.height = height;
result.popupClickArea.x = xBorderBetweenActionAndPopup;
result.popupClickArea.y = 0;
result.popupClickArea.width = width
- xBorderBetweenActionAndPopup;
result.popupClickArea.height = height;
result.separatorOrientation = CommandButtonSeparatorOrientation.VERTICAL;
result.separatorArea = new Rectangle();
result.separatorArea.x = xBorderBetweenActionAndPopup;
result.separatorArea.y = 0;
result.separatorArea.width = verticalSeparatorWidth;
result.separatorArea.height = height;
result.isTextInActionArea = true;
} else {
result.popupClickArea.x = 0;
result.popupClickArea.y = 0;
result.popupClickArea.width = width;
result.popupClickArea.height = height;
result.isTextInActionArea = true;
}
break;
}
} else {
int x = width - ins.right - shiftX + layoutHGap;
// icon
if (hasIcon) {
x -= layoutHGap;
int iconHeight = buttonIcon.getIconHeight();
int iconWidth = buttonIcon.getIconWidth();
result.iconRect.x = x - iconWidth;
result.iconRect.y = (height - iconHeight) / 2;
result.iconRect.width = iconWidth;
result.iconRect.height = iconHeight;