package magic.ui.screen.widget;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.AbstractAction;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import magic.data.MagicIcon;
import magic.translate.MText;
import magic.ui.MagicImages;
import magic.ui.ScreenController;
import magic.ui.helpers.ImageHelper;
import magic.ui.utility.MagicStyle;
import magic.ui.FontsAndBorders;
import magic.ui.widget.button.LayoutButton;
@SuppressWarnings("serial")
public class MenuButton extends JButton {
// translatable strings
private static final String _S1 = "Close";
private final static Color COLOR_NORMAL = Color.WHITE;
private final static Color COLOR_DISABLED = Color.DARK_GRAY;
private boolean isRunnable;
private boolean hasSeparator;
public MenuButton(final String caption, final AbstractAction action, final String tooltip, final boolean showSeparator) {
super(caption);
this.isRunnable = (action != null);
this.hasSeparator = showSeparator;
setFont(FontsAndBorders.FONT_MENU_BUTTON);
setHorizontalAlignment(SwingConstants.CENTER);
setForeground(COLOR_NORMAL);
setButtonTransparent();
setFocusable(true);
setToolTipText(tooltip);
if (isRunnable) {
setMouseAdapter();
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
addActionListener(action);
}
}
public MenuButton(final String caption, final AbstractAction action, final String tooltip) {
this(caption, action, tooltip, true);
}
public MenuButton(final String caption, final AbstractAction action) {
this(caption, action, null);
}
protected MenuButton() {
isRunnable = false;
hasSeparator = false;
}
public boolean isRunnable() {
return isRunnable;
}
private void setButtonTransparent() {
setOpaque(false);
setContentAreaFilled(false);
setBorderPainted(false);
if (!isRunnable) {
setBorder(null);
}
}
private void setMouseAdapter() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
if (isEnabled()) {
setForeground(MagicStyle.getRolloverColor());
}
}
@Override
public void mouseExited(MouseEvent e) {
if (isEnabled()) {
setForeground(Color.WHITE);
}
}
@Override
public void mousePressed(MouseEvent e) {
if (isEnabled() && SwingUtilities.isLeftMouseButton(e)) {
setForeground(MagicStyle.getPressedColor());
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (isEnabled()) {
setForeground(Color.WHITE);
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}
}
});
}
@Override
public void setEnabled(boolean b) {
super.setEnabled(b);
isRunnable = b;
setForeground(b ? COLOR_NORMAL : COLOR_DISABLED);
}
public boolean hasSeparator() {
return hasSeparator;
}
public void setSeparator(boolean b) {
hasSeparator = b;
}
//
// Static convenience methods.
//
private final static AbstractAction closeScreenAction = new AbstractAction() {
@Override
public void actionPerformed(final ActionEvent e) {
ScreenController.closeActiveScreen(false);
}
};
public static MenuButton getCloseScreenButton(final String caption) {
return new MenuButton(caption, closeScreenAction);
}
@Override
public void setIcon(final Icon defaultIcon) {
super.setIcon(defaultIcon);
setRolloverIcon(ImageHelper.getRecoloredIcon(
(ImageIcon) defaultIcon,
MagicStyle.getRolloverColor())
);
setPressedIcon(ImageHelper.getRecoloredIcon(
(ImageIcon) defaultIcon,
MagicStyle.getPressedColor())
);
setDisabledIcon(ImageHelper.getRecoloredIcon(
(ImageIcon) defaultIcon,
COLOR_DISABLED)
);
}
public static MenuButton getCloseScreenButton() {
return getCloseScreenButton(MText.get(_S1));
}
public static MenuButton getTestButton() {
return new MenuButton("Test", closeScreenAction);
}
/**
* Creates an icon-only button with tooltip.<br>
*
* @param action click action
* @param icon
* @param title tooltip title text (<b>in English</b>).
* @param description tooltip body text (<b>in English</b>).
* @return
*/
public static MenuButton build(Runnable action, ImageIcon image, String title, String description) {
return new ActionBarButton(
image, title, description,
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
action.run();
}
}
);
}
public static MenuButton build(Runnable action, MagicIcon icon, String title) {
return build(action, MagicImages.getIcon(icon), title, null);
}
/**
* Creates an icon-only button with tooltip.<br>
*
* @param action click action
* @param icon
* @param title tooltip title text (<b>in English</b>).
* @param description tooltip body text (<b>in English</b>).
* @return
*/
public static MenuButton build(Runnable action, MagicIcon icon, String title, String description) {
return build(action, MagicImages.getIcon(icon), title, description);
}
/**
* Creates a text-only button with tooltip.
*
* @param action click action.
* @param title button caption and tooltip title (<b>in English</b>).
* @param tooltip main tooltip text (<b>in English</b>).
* @return
*/
public static MenuButton build(Runnable action, String title, String tooltip) {
return new ActionBarButton(
title, tooltip,
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
action.run();
}
}
);
}
/**
* Creates a text-only button.
*
* @param action click action.
* @param text button caption (<b>in English</b>).
* @return
*/
public static MenuButton build(Runnable action, String title) {
return new ActionBarButton(title, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
action.run();
}
});
}
/**
* Action bar button used to change screen layout.
*/
public static MenuButton buildLayoutButton(final Runnable action) {
return new LayoutButton(action);
}
}