001    /*
002     * PaintPicker.java
003     *
004     * Created on July 19, 2006, 7:13 PM
005     */
006    
007    package org.jdesktop.swingx.editors;
008    
009    import java.awt.Color;
010    import java.awt.Component;
011    import java.awt.LinearGradientPaint;
012    import java.awt.MultipleGradientPaint;
013    import java.awt.Paint;
014    import java.awt.Rectangle;
015    import java.awt.geom.Point2D;
016    import java.beans.PropertyChangeEvent;
017    import java.beans.PropertyChangeListener;
018    
019    import javax.swing.JComponent;
020    import javax.swing.event.ChangeEvent;
021    import javax.swing.event.ChangeListener;
022    
023    import org.jdesktop.swingx.JXGradientChooser;
024    import org.jdesktop.swingx.color.ColorUtil;
025    import org.jdesktop.swingx.color.EyeDropperColorChooserPanel;
026    
027    /**
028     *
029     * @author  joshy
030     */
031    public class PaintPicker extends javax.swing.JPanel {
032        Component lastPickerUsed = null;
033        Paint selectedPaint = Color.PINK;
034        JXGradientChooser gradientPicker;
035        /** Creates new form PaintPicker */
036        public PaintPicker() {
037            initComponents();
038            
039            // set up the color picker
040            lastPickerUsed = colorPicker;
041            colorPicker.addChooserPanel(new EyeDropperColorChooserPanel());
042            ColorListener colorListener = new ColorListener();
043            colorPicker.getSelectionModel().addChangeListener(colorListener);
044            alphaSlider.addChangeListener(colorListener);
045            
046            // set up the gradient picker
047            gradientPicker = new JXGradientChooser();
048            tabbedPane.addTab("Gradient",gradientPicker);
049            gradientPicker.addPropertyChangeListener("gradient",new PropertyChangeListener() {
050                public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
051                    lastPickerUsed = gradientPicker;
052                    setPaint(gradientPicker.getGradient());
053                }
054            });
055            
056            // update when the tabs change
057            tabbedPane.getModel().addChangeListener(new ChangeListener() {
058                public void stateChanged(ChangeEvent changeEvent) {
059                    lastPickerUsed = tabbedPane.getSelectedComponent();
060                    Paint old = selectedPaint;
061                    if(lastPickerUsed == colorPickerParent) {
062                        selectedPaint = colorPicker.getSelectionModel().getSelectedColor();
063                    }
064                    if(lastPickerUsed == gradientPicker) {
065                        selectedPaint = gradientPicker.getGradient();
066                    }
067                    firePropertyChange("paint",old,selectedPaint);
068                }
069            });
070            
071        }
072        
073        public Paint getPaint() {
074            return selectedPaint;
075        }
076        
077        public void addPicker(JComponent comp, String title) {
078            tabbedPane.addTab(title,comp);
079        }
080        
081        /** This method is called from within the constructor to
082         * initialize the form.
083         * WARNING: Do NOT modify this code. The content of this method is
084         * always regenerated by the Form Editor.
085         */
086        // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
087        private void initComponents() {
088            java.awt.GridBagConstraints gridBagConstraints;
089    
090            tabbedPane = new javax.swing.JTabbedPane();
091            colorPickerParent = new javax.swing.JPanel();
092            colorPicker = new javax.swing.JColorChooser();
093            jLabel1 = new javax.swing.JLabel();
094            alphaSlider = new javax.swing.JSlider();
095    
096            setLayout(new java.awt.GridBagLayout());
097    
098            colorPickerParent.setLayout(new java.awt.GridBagLayout());
099    
100            gridBagConstraints = new java.awt.GridBagConstraints();
101            gridBagConstraints.gridwidth = 2;
102            gridBagConstraints.weightx = 10.0;
103            gridBagConstraints.weighty = 10.0;
104            colorPickerParent.add(colorPicker, gridBagConstraints);
105    
106            jLabel1.setText("Alpha:");
107            gridBagConstraints = new java.awt.GridBagConstraints();
108            gridBagConstraints.gridx = 0;
109            gridBagConstraints.gridy = 1;
110            colorPickerParent.add(jLabel1, gridBagConstraints);
111    
112            alphaSlider.setMaximum(255);
113            alphaSlider.setValue(255);
114            gridBagConstraints = new java.awt.GridBagConstraints();
115            gridBagConstraints.gridx = 1;
116            gridBagConstraints.gridy = 1;
117            gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
118            gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
119            colorPickerParent.add(alphaSlider, gridBagConstraints);
120    
121            tabbedPane.addTab("Color", colorPickerParent);
122    
123            gridBagConstraints = new java.awt.GridBagConstraints();
124            gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
125            gridBagConstraints.weightx = 10.0;
126            gridBagConstraints.weighty = 10.0;
127            add(tabbedPane, gridBagConstraints);
128    
129        }// </editor-fold>//GEN-END:initComponents
130    
131        public void setPaint(Paint paint) {
132            if(paint == selectedPaint) {
133                return;
134            }
135            Paint old = selectedPaint;
136            selectedPaint = paint;
137            if(paint instanceof Color) {
138                tabbedPane.setSelectedComponent(colorPickerParent);
139                colorPicker.setColor((Color)paint);
140                alphaSlider.setValue(((Color)paint).getAlpha());
141            }
142            if(paint instanceof MultipleGradientPaint) {
143                tabbedPane.setSelectedComponent(gradientPicker);
144                gradientPicker.setGradient((MultipleGradientPaint)paint);
145            }
146            firePropertyChange("paint", old, selectedPaint);
147        }
148    
149        // return a paint suitable for display in a property sheet preview
150        Paint getDisplayPaint(Rectangle box) {
151            if(getPaint() instanceof MultipleGradientPaint) {
152                return getFlatGradient(gradientPicker, box.getWidth());
153            }
154            return getPaint();
155        }
156        
157        /**
158         * Creates a flat version of the current gradient. This is a linear gradient
159         * from 0.0 to length,0. This gradient is suitable for drawing previews of
160         * the real gradient.
161         *
162         * @param length
163         * @return a gradient Paint with values between 0.0 and length
164         */
165        private MultipleGradientPaint getFlatGradient(JXGradientChooser chooser, double length) {
166            MultipleGradientPaint gp = chooser.getGradient();
167    
168            // set up the data for the gradient
169            float[] fractions = gp.getFractions();
170            Color[] colors = gp.getColors();
171    
172            // fill in the gradient
173            Point2D start = new Point2D.Float(0, 0);
174            Point2D end = new Point2D.Float((float) length, 0);
175            MultipleGradientPaint paint = new LinearGradientPaint(
176                    (float) start.getX(),
177                    (float) start.getY(),
178                    (float) end.getX(),
179                    (float) end.getY(),
180                    fractions, colors);
181            return paint;
182        }
183    
184    
185        // Variables declaration - do not modify//GEN-BEGIN:variables
186        private javax.swing.JSlider alphaSlider;
187        public javax.swing.JColorChooser colorPicker;
188        private javax.swing.JPanel colorPickerParent;
189        private javax.swing.JLabel jLabel1;
190        private javax.swing.JTabbedPane tabbedPane;
191        // End of variables declaration//GEN-END:variables
192    
193        private class ColorListener implements ChangeListener {
194            public void stateChanged(ChangeEvent e) {
195                lastPickerUsed = colorPicker;
196                Paint old = selectedPaint;
197                selectedPaint = ColorUtil.setAlpha(colorPicker.getSelectionModel().getSelectedColor(), alphaSlider.getValue());
198                firePropertyChange("paint", old, selectedPaint);
199            }
200        }
201    
202        
203    }