/* * ColorButton.java * * Created on May 14, 2005, 5:13 PM */ package edu.oregonstate.cartography.gui; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; /** * A button to select a color. The currently selected color is * displayed by the button. * @author Bernhard Jenny, Institute of Cartography, ETH Zurich. */ public class ColorButton extends JToggleButton implements ActionListener { /** * The current color. */ private Color color; /** * The horizontal width of the icon that displays the color. */ private int iconWidth; /** * The vertical width of the icon that displays the color. */ private int iconHeight; /** * The title of the color chooser dialog. */ private String colorChooserTitle; //The dialog that the button brings up. JColorChooser colorChooser; JDialog dialog; /** * Creates a new instance of ColorButton. Default color is black, default * size of the icon is 16 x 16 pixels. * This button is registered with itself for receiving action performed calls. */ public ColorButton() { this.color = new Color(0, 0, 0); this.iconHeight = 16; this.iconWidth = 16; this.colorChooserTitle = "Choose a Color"; //Set up the dialog that the button brings up. colorChooser = new JColorChooser(); // replace the ugly and useless preview panel by an empty JPanel // colorChooser.setPreviewPanel(new JPanel()); this.updateIcon(); } /** * Internal utility method that creates a new icon. Called after the user * selects a new color, or when the size of the icon changes. */ private void updateIcon() { BufferedImage image = new BufferedImage(iconWidth, iconHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = (Graphics2D)image.getGraphics(); g2d.setColor(this.color); // turn antialiasing off g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); // we want fast rendering g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); g2d.fillRect(0, 0, iconWidth, iconHeight); ImageIcon imageIcon = new ImageIcon(image); this.setIcon(imageIcon); g2d.dispose(); } /** * Action listener for the OK button in the color chooser. */ public void actionPerformed(ActionEvent e) { // ok button in color chooser was pressed. this.setColor(colorChooser.getColor()); super.fireActionPerformed(e); } @Override protected void fireActionPerformed(ActionEvent event) { try { this.setSelected(true); // create the dialog if this has not been done yet. if (this.dialog == null) { // Get the top level ancestor as parent for the new dialog. // This ensures that on Mac OS X the global menu bar remains // visible while the dialog is open. final Container parent = this.getTopLevelAncestor(); dialog = JColorChooser.createDialog(parent, colorChooserTitle, true, //modal colorChooser, this, //OK button handler null); //no CANCEL button handler dialog.pack(); dialog.setResizable(false); } // show the dialog colorChooser.setColor(color); dialog.setVisible(true); /* A simpler option that is displaying the ugly preview panel: Color newColor = JColorChooser.showDialog(this.getTopLevelAncestor(), colorChooserTitle, color); if (newColor != null){ // only set color and fire an event when user did not cancel. this.setColor(newColor); super.fireActionPerformed(event); }*/ } catch (Exception e){ } finally { this.setSelected(false); } } /** * Returns the currently selected Color. * @return The current color. */ public Color getColor() { return color; } /** * Changes the current color. * @param color The new color. */ public void setColor(Color color) { if (color != null) { this.setEnabled(true); this.color = color; this.updateIcon(); } else { this.setEnabled(false); } } /** * Returns the width of the icon used to display the color. * @return The width of the icon. */ public int getIconWidth() { return iconWidth; } /** * Sets the width of the icon used to display the color. * @param iconWidth The new width of the icon. */ public void setIconWidth(int iconWidth) { this.iconWidth = iconWidth; this.updateIcon(); } /** * Returns the height of the icon used to display the color. * @return The height of the icon. */ public int getIconHeight() { return iconHeight; } /** * Sets the height of the icon used to display the color. * @param iconHeight The new height of the icon. */ public void setIconHeight(int iconHeight) { this.iconHeight = iconHeight; this.updateIcon(); } /** * Returns the title of the color chooser dialog. * @return The title. */ public String getColorChooserTitle() { return colorChooserTitle; } /** * Sets the title of the color chooser dialog * @param colorChooserTitle The new title. */ public void setColorChooserTitle(String colorChooserTitle) { this.colorChooserTitle = colorChooserTitle; } }