package org.basex.gui.layout; import static org.basex.core.Text.*; import static org.basex.gui.layout.BaseXKeys.*; import java.awt.Insets; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.Locale; import javax.swing.AbstractButton; import javax.swing.JButton; import javax.swing.border.EmptyBorder; import org.basex.core.Prop; import org.basex.gui.GUI; import org.basex.gui.GUICommand; import org.basex.gui.dialog.Dialog; import org.basex.util.Token; /** * Project specific button implementation. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public class BaseXButton extends JButton { /** * Constructor for text buttons. * @param l button title * @param win parent window */ public BaseXButton(final String l, final Window win) { super(l); BaseXLayout.addInteraction(this, win); if(!(win instanceof Dialog)) return; final Dialog d = (Dialog) win; addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { final String text = getText(); if(text.equals(B_CANCEL)) d.cancel(); else if(text.equals(B_OK)) d.close(); else d.action(e.getSource()); } }); addKeyListener(new KeyAdapter() { @Override public void keyPressed(final KeyEvent e) { if(ESCAPE.is(e)) d.cancel(); } }); setMnemonic(this, d.mnem); } /** * Constructor for image buttons. * @param gui main window * @param img image reference * @param hlp help text */ public BaseXButton(final Window gui, final String img, final byte[] hlp) { super(BaseXLayout.icon(img)); BaseXLayout.addInteraction(this, gui); if(hlp != null) setToolTipText(Token.string(hlp)); // trim horizontal button margins final Insets in = getMargin(); in.left /= 4; in.right /= 4; if(in.top < in.left) setMargin(in); } /** * Sets the label borders. * @param t top distance * @param l left distance * @param b bottom distance * @param r right distance * @return self reference */ public BaseXButton border(final int t, final int l, final int b, final int r) { setBorder(new EmptyBorder(t, l, b, r)); return this; } /** * Creates a new image button for the specified command. * @param cmd command * @param gui reference to main window * @return button */ public static BaseXButton command(final GUICommand cmd, final GUI gui) { final BaseXButton button = new BaseXButton(gui, cmd.toString().toLowerCase(Locale.ENGLISH), Token.token(cmd.help())); button.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { cmd.execute(gui); } }); return button; } /** * Sets a mnemomic for the specified button. * @param b button * @param mnem mnemonics that have already been assigned */ public static void setMnemonic(final AbstractButton b, final StringBuilder mnem) { // do not set mnemonics for Mac! Alt+key used for special characters. if(Prop.MAC) return; // find and assign unused mnemomic final String label = b.getText(); for(int l = 0; l < label.length(); l++) { final char ch = Character.toLowerCase(label.charAt(l)); if(!Token.letter(ch) || mnem.indexOf(Character.toString(ch)) != -1) continue; b.setMnemonic(ch); mnem.append(ch); break; } } @Override public void setEnabled(final boolean flag) { if(flag != isEnabled()) super.setEnabled(flag); } }