001    /*
002     * $Id: JXColorSelectionButton.java,v 1.1 2006/04/26 04:01:41 joshy Exp $
003     *
004     * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
005     * Santa Clara, California 95054, U.S.A. All rights reserved.
006     *
007     * This library is free software; you can redistribute it and/or
008     * modify it under the terms of the GNU Lesser General Public
009     * License as published by the Free Software Foundation; either
010     * version 2.1 of the License, or (at your option) any later version.
011     * 
012     * This library is distributed in the hope that it will be useful,
013     * but WITHOUT ANY WARRANTY; without even the implied warranty of
014     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
015     * Lesser General Public License for more details.
016     * 
017     * You should have received a copy of the GNU Lesser General Public
018     * License along with this library; if not, write to the Free Software
019     * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
020     */
021    
022    package org.jdesktop.swingx;
023    
024    import java.awt.Color;
025    import java.awt.Graphics;
026    import java.awt.Insets;
027    import java.awt.event.ActionEvent;
028    import java.awt.event.ActionListener;
029    import java.awt.image.BufferedImage;
030    import javax.imageio.ImageIO;
031    import javax.swing.JButton;
032    import javax.swing.JColorChooser;
033    import javax.swing.JComponent;
034    import javax.swing.JDialog;
035    import javax.swing.JFrame;
036    import javax.swing.JLabel;
037    import javax.swing.JPanel;
038    import javax.swing.event.ChangeEvent;
039    import javax.swing.event.ChangeListener;
040    import org.jdesktop.swingx.color.*;
041    
042    /**
043     * A button which allows the user to select a single color. The button has a platform
044     * specific look. Ex: on Mac OS X it will mimic an NSColorWell. When the user
045     * clicks the button it will open a color chooser set to the current background
046     * color of the button. The new selected color will be stored in the background
047     * property and can be retrieved using the getBackground() method. As the user is
048     * choosing colors within the color chooser the background property will be updated.
049     * By listening to this property developers can make other parts of their program
050     * update.
051     *
052     * @author joshua.marinacci@sun.com
053     */
054    public class JXColorSelectionButton extends JButton {
055        
056        private JDialog dialog = null;
057        private JColorChooser chooser = null;
058        
059        /**
060         * Creates a new instance of JXColorSelectionButton
061         */
062        public JXColorSelectionButton() {
063            this(Color.red);
064        }
065        public JXColorSelectionButton(Color col) {
066            setBackground(col);
067            this.addActionListener(new ActionListener() {
068                public void actionPerformed(ActionEvent actionEvent) {
069                    if(dialog == null) {
070                        dialog = JColorChooser.createDialog(
071                                JXColorSelectionButton.this,
072                                "Choose a color",
073                                true, 
074                                getChooser(),
075                                new ActionListener() {
076                                    public void actionPerformed(ActionEvent actionEvent) {
077                                        //System.out.println("okay");
078                                    }
079                                },
080                                new ActionListener() {
081                                    public void actionPerformed(ActionEvent actionEvent) {
082                                        //System.out.println("cancel");
083                                    }
084                                }
085                                );
086                        dialog.getContentPane().add(getChooser());
087                        getChooser().getSelectionModel().addChangeListener(new ColorChangeListener(JXColorSelectionButton.this));
088                    }
089                    dialog.setVisible(true);
090                    Color color = getChooser().getColor();
091                    
092                    if (color != null) {
093                        setBackground(color);
094                    }
095                    
096                }
097            });
098            this.setContentAreaFilled(false);
099            this.setOpaque(false);
100            
101            try {
102                colorwell = ImageIO.read(this.getClass().getResourceAsStream("/org/jdesktop/swingx/color/colorwell.png"));
103            } catch (Exception ex) {
104                ex.printStackTrace();
105            }
106        }
107        
108        private BufferedImage colorwell;
109        
110        private class ColorChangeListener implements ChangeListener {
111            public JXColorSelectionButton button;
112            public ColorChangeListener(JXColorSelectionButton button) {
113                this.button = button;
114            }
115            public void stateChanged(ChangeEvent changeEvent) {
116                button.setBackground(button.getChooser().getColor());
117            }
118        }
119    
120        protected void paintComponent(Graphics g) {
121            Insets ins = new Insets(5,5,5,5);        
122            if(colorwell != null) {
123                ColorUtil.tileStretchPaint(g, this, colorwell, ins);
124            }
125            
126            // 0, 23, 255  = 235o, 100%, 100%
127            // 31, 0, 204 =  249o, 100%,  80%
128        g.setColor(ColorUtil.removeAlpha(getBackground()));
129            g.fillRect(ins.left, ins.top, 
130                        getWidth()  - ins.left - ins.right, 
131                        getHeight() - ins.top - ins.bottom);
132            g.setColor(ColorUtil.setBrightness(getBackground(),0.85f));
133            g.drawRect(ins.left, ins.top,
134                    getWidth() - ins.left - ins.right - 1,
135                    getHeight() - ins.top - ins.bottom - 1);
136            g.drawRect(ins.left + 1, ins.top + 1,
137                    getWidth() - ins.left - ins.right - 3,
138                    getHeight() - ins.top - ins.bottom - 3);
139        }
140    
141    
142        public static void main(String[] args) {
143            JFrame frame = new JFrame("Color Button Test");
144            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
145            JPanel panel = new JPanel();
146            panel.add(new JXColorSelectionButton());
147            panel.add(new JLabel("ColorSelectionButton test"));
148            
149            frame.add(panel);
150            frame.pack();
151            frame.setVisible(true);
152        }
153    
154        /** Get the chooser that is used by this JXColorSelectionButton. This
155         * chooser instance is shared between all invocations of the chooser, but is unique to
156         * this instance of JXColorSelectionButton.
157         */
158        public JColorChooser getChooser() {
159            if(chooser == null) {
160                chooser = new JColorChooser();
161            }
162            return chooser;
163        }
164        
165    }