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 }