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 }