package ecologylab.generic;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.HeadlessException;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.UIManager;
/**
* Static convenience methods for Swing programing.
*
* @author andruid
*/
public class SwingTools
{
public static Color showColorChooser(JColorChooser pane,
Component component,
String title)
throws HeadlessException
{
ColorTracker ok = new ColorTracker(pane);
JDialog dialog = new ColorChooserDialog(component, title, true, pane, ok, null);
dialog.addWindowListener(new ColorChooserDialog.Closer());
dialog.addComponentListener(new ColorChooserDialog.DisposeOnClose());
dialog.show(); // blocks until user brings dialog down...
return ok.getColor();
}
}
/*
* Class which builds a color chooser dialog consisting of
* a JColorChooser with "Ok", "Cancel", and "Reset" buttons.
*
* Note: This needs to be fixed to deal with localization!
*/
class ColorChooserDialog extends JDialog {
private Color initialColor;
private JColorChooser chooserPane;
public ColorChooserDialog(Component c, String title, boolean modal,
JColorChooser chooserPane,
ActionListener okListener, ActionListener cancelListener)
throws HeadlessException {
super(JOptionPane.getFrameForComponent(c), title, modal);
//setResizable(false);
this.chooserPane = chooserPane;
String okString = UIManager.getString("ColorChooser.okText");
String cancelString = UIManager.getString("ColorChooser.cancelText");
String resetString = UIManager.getString("ColorChooser.resetText");
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(chooserPane, BorderLayout.CENTER);
/*
* Create Lower button panel
*/
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new FlowLayout(FlowLayout.CENTER));
JButton okButton = new JButton(okString);
getRootPane().setDefaultButton(okButton);
okButton.setActionCommand("OK");
if (okListener != null) {
okButton.addActionListener(okListener);
}
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
hide();
}
});
buttonPane.add(okButton);
JButton cancelButton = new JButton(cancelString);
// The following few lines are used to register esc to close the dialog
/* Action cancelKeyAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
((AbstractButton)e.getSource()).fireActionPerformed(e);
}
};
KeyStroke cancelKeyStroke = KeyStroke.getKeyStroke((char)KeyEvent.VK_ESCAPE, false);
InputMap inputMap = cancelButton.getInputMap(JComponent.
WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = cancelButton.getActionMap();
if (inputMap != null && actionMap != null) {
inputMap.put(cancelKeyStroke, "cancel");
actionMap.put("cancel", cancelKeyAction);
}
*/ // end esc handling
cancelButton.setActionCommand("cancel");
if (cancelListener != null) {
cancelButton.addActionListener(cancelListener);
}
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
hide();
}
});
buttonPane.add(cancelButton);
JButton resetButton = new JButton(resetString);
resetButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
reset();
}
});
/*int mnemonic = UIManager.getInt("ColorChooser.resetMnemonic", -1);
if (mnemonic != -1) {
resetButton.setMnemonic(mnemonic);
} */
buttonPane.add(resetButton);
contentPane.add(buttonPane, BorderLayout.SOUTH);
if (JDialog.isDefaultLookAndFeelDecorated()) {
boolean supportsWindowDecorations =
UIManager.getLookAndFeel().getSupportsWindowDecorations();
if (supportsWindowDecorations) {
getRootPane().setWindowDecorationStyle(JRootPane.COLOR_CHOOSER_DIALOG);
}
}
applyComponentOrientation(((c == null) ? getRootPane() : c).getComponentOrientation());
pack();
setLocationRelativeTo(c);
}
@Override
public void show() {
initialColor = chooserPane.getColor();
super.show();
}
public void reset() {
chooserPane.setColor(initialColor);
}
static class Closer extends WindowAdapter
{
@Override
public void windowClosing(WindowEvent e) {
Window w = e.getWindow();
w.hide();
}
}
static class DisposeOnClose extends ComponentAdapter
{
@Override
public void componentHidden(ComponentEvent e) {
Window w = (Window)e.getComponent();
w.dispose();
}
}
}
class ColorTracker implements ActionListener {
JColorChooser chooser;
Color color;
public ColorTracker(JColorChooser c) {
chooser = c;
}
@Override
public void actionPerformed(ActionEvent e) {
color = chooser.getColor();
}
public Color getColor() {
return color;
}
}