001    /*
002     * PainterPropertyEditor.java
003     *
004     * Created on March 21, 2006, 11:26 AM
005     *
006     * To change this template, choose Tools | Template Manager
007     * and open the template in the editor.
008     */
009    
010    package org.jdesktop.swingx.editors;
011    
012    import java.awt.Color;
013    import java.awt.Graphics;
014    import java.awt.Graphics2D;
015    import java.awt.Paint;
016    import java.awt.Rectangle;
017    import java.beans.PropertyEditorSupport;
018    import java.util.HashMap;
019    import java.util.Map;
020    //import org.jdesktop.swingx.painter.gradient.BasicGradientPainter;
021    //import org.jdesktop.swingx.painter.gradient.LinearGradientPainter;
022    
023    /**
024     * Two parts to this property editor. The first part is a simple dropdown.
025     * The second part is a complicated UI for constructing multiple "layers" of
026     * various different Painters, including gradient paints.
027     *
028     * @author Richard
029     */
030    public class PaintPropertyEditor extends PropertyEditorSupport {
031        private static Map<Paint, String> DEFAULT_PAINTS = new HashMap<Paint, String>();
032        static {
033            //add the default paints
034            DEFAULT_PAINTS.put(Color.BLACK, "Black");
035            DEFAULT_PAINTS.put(Color.BLUE, "Blue");
036            DEFAULT_PAINTS.put(Color.CYAN, "Cyan");
037            DEFAULT_PAINTS.put(Color.DARK_GRAY, "Dark Gray");
038            DEFAULT_PAINTS.put(Color.GRAY, "Gray");
039            DEFAULT_PAINTS.put(Color.GREEN, "Green");
040            DEFAULT_PAINTS.put(Color.LIGHT_GRAY, "Light Gray");
041            DEFAULT_PAINTS.put(Color.MAGENTA, "Magenta");
042            DEFAULT_PAINTS.put(Color.ORANGE, "Orange");
043            DEFAULT_PAINTS.put(Color.PINK, "Pink");
044            DEFAULT_PAINTS.put(Color.RED, "Red");
045            DEFAULT_PAINTS.put(Color.WHITE, "White");
046            DEFAULT_PAINTS.put(Color.YELLOW, "Yellow");
047            DEFAULT_PAINTS.put(new Color(1f, 1f, 1f, 0f), "Transparent");
048    //        DEFAULT_PAINTS.put(
049    //            BasicGradientPainter.WHITE_TO_CONTROL_HORZONTAL, "White->Control (horizontal)");
050    //        DEFAULT_PAINTS.put(
051    //            BasicGradientPainter.WHITE_TO_CONTROL_VERTICAL, "White->Control (vertical)");
052            /* josh: this should be replaced with matte painters
053            DEFAULT_PAINTS.put(
054                BasicGradientPainter.AERITH, "Aerith");
055            DEFAULT_PAINTS.put(
056                BasicGradientPainter.BLUE_EXPERIENCE, "Blue Experience");
057            DEFAULT_PAINTS.put(
058                BasicGradientPainter.GRAY, "Gray Gradient");
059            DEFAULT_PAINTS.put(
060                BasicGradientPainter.MAC_OSX, "Mac OSX");
061            DEFAULT_PAINTS.put(
062                BasicGradientPainter.MAC_OSX_SELECTED, "Max OSX Selected");
063            DEFAULT_PAINTS.put(
064                BasicGradientPainter.NIGHT_GRAY, "Night Gray");
065            DEFAULT_PAINTS.put(
066                BasicGradientPainter.NIGHT_GRAY_LIGHT, "Night Gray Light");
067            DEFAULT_PAINTS.put(
068                BasicGradientPainter.RED_XP, "Red XP");
069            DEFAULT_PAINTS.put(
070                LinearGradientPainter.BLACK_STAR, "Black Star");
071            DEFAULT_PAINTS.put(
072                LinearGradientPainter.ORANGE_DELIGHT, "Orange Delight");*/
073        }
074        
075        /** Creates a new instance of PainterPropertyEditor */
076        public PaintPropertyEditor() {
077        }
078        
079        public String[] getTags() {
080            String[] names = DEFAULT_PAINTS.values().toArray(new String[0]);
081            String[] results = new String[names.length+1];
082            results[0] = "<none>";
083            System.arraycopy(names, 0, results, 1, names.length);
084            return results;
085        }
086        
087        public Paint getValue() {
088            return (Paint)super.getValue();
089        }
090    
091        public String getJavaInitializationString() {
092            Paint paint = getValue();
093            //TODO!!!
094            return paint == null ? "null" : 
095                "org.jdesktop.swingx.painter.gradient.LinearGradientPainter.BLACK_STAR";
096        }
097    
098        public void setAsText(String text) throws IllegalArgumentException {
099            if (text == null || text.trim().equals("") || text.trim().equalsIgnoreCase("none")
100                    || text.trim().equalsIgnoreCase("<none>")
101                    || text.trim().equalsIgnoreCase("[none]")) {
102                setValue(null);
103                return;
104            }
105            
106            if (text.trim().equalsIgnoreCase("<custom>")) {
107                //do nothing
108            }
109            
110            for (Map.Entry<Paint, String> entry : DEFAULT_PAINTS.entrySet()) {
111                if (entry.getValue().equalsIgnoreCase(text)) {
112                    setValue(entry.getKey());
113                    return;
114                }
115            }
116            
117            throw new IllegalArgumentException("The input value " + text + " does" +
118                    " not match one of the names of the standard paints");
119        }
120    
121        public String getAsText() {
122            Paint p = getValue();
123            if (p == null) {
124                return null;
125            } else if (DEFAULT_PAINTS.containsKey(p)) {
126                return DEFAULT_PAINTS.get(p);
127            } else {
128                return "<custom>";
129            }
130        }
131    
132        public void paintValue(Graphics gfx, Rectangle box) {
133            Paint p = getValue();
134            if (p == null) {
135                //do nothing -- in the future draw the checkerboard or something
136            } else {
137                ((Graphics2D)gfx).setPaint(p);
138                gfx.fillRect(box.x, box.y, box.width, box.height);
139            }
140        }
141    
142        public boolean isPaintable() {
143            return true;
144        }
145    }