swingx-master/swingx-beaninfo/src/main/java/org/jdesktop/beans/editors/PaintPropertyEditor.java
/*
 * PainterPropertyEditor.java
 *
 * Created on March 21, 2006, 11:26 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package org.jdesktop.beans.editors;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Rectangle;
import java.beans.PropertyEditorSupport;
import java.util.HashMap;
import java.util.Map;

/**
 * Two parts to this property editor. The first part is a simple dropdown.
 * The second part is a complicated UI for constructing multiple "layers" of
 * various different Painters, including gradient paints.
 *
 * @author Richard
 */
public class PaintPropertyEditor extends PropertyEditorSupport {
    private static Map<Paint, String> DEFAULT_PAINTS = new HashMap<Paint, String>();
    static {
        //add the default paints
        DEFAULT_PAINTS.put(Color.BLACK, "Black");
        DEFAULT_PAINTS.put(Color.BLUE, "Blue");
        DEFAULT_PAINTS.put(Color.CYAN, "Cyan");
        DEFAULT_PAINTS.put(Color.DARK_GRAY, "Dark Gray");
        DEFAULT_PAINTS.put(Color.GRAY, "Gray");
        DEFAULT_PAINTS.put(Color.GREEN, "Green");
        DEFAULT_PAINTS.put(Color.LIGHT_GRAY, "Light Gray");
        DEFAULT_PAINTS.put(Color.MAGENTA, "Magenta");
        DEFAULT_PAINTS.put(Color.ORANGE, "Orange");
        DEFAULT_PAINTS.put(Color.PINK, "Pink");
        DEFAULT_PAINTS.put(Color.RED, "Red");
        DEFAULT_PAINTS.put(Color.WHITE, "White");
        DEFAULT_PAINTS.put(Color.YELLOW, "Yellow");
        DEFAULT_PAINTS.put(new Color(1f, 1f, 1f, 0f), "Transparent");
//        DEFAULT_PAINTS.put(
//            BasicGradientPainter.WHITE_TO_CONTROL_HORZONTAL, "White->Control (horizontal)");
//        DEFAULT_PAINTS.put(
//            BasicGradientPainter.WHITE_TO_CONTROL_VERTICAL, "White->Control (vertical)");
        /* josh: this should be replaced with matte painters
        DEFAULT_PAINTS.put(
            BasicGradientPainter.AERITH, "Aerith");
        DEFAULT_PAINTS.put(
            BasicGradientPainter.BLUE_EXPERIENCE, "Blue Experience");
        DEFAULT_PAINTS.put(
            BasicGradientPainter.GRAY, "Gray Gradient");
        DEFAULT_PAINTS.put(
            BasicGradientPainter.MAC_OSX, "Mac OSX");
        DEFAULT_PAINTS.put(
            BasicGradientPainter.MAC_OSX_SELECTED, "Max OSX Selected");
        DEFAULT_PAINTS.put(
            BasicGradientPainter.NIGHT_GRAY, "Night Gray");
        DEFAULT_PAINTS.put(
            BasicGradientPainter.NIGHT_GRAY_LIGHT, "Night Gray Light");
        DEFAULT_PAINTS.put(
            BasicGradientPainter.RED_XP, "Red XP");
        DEFAULT_PAINTS.put(
            LinearGradientPainter.BLACK_STAR, "Black Star");
        DEFAULT_PAINTS.put(
            LinearGradientPainter.ORANGE_DELIGHT, "Orange Delight");*/
    }
    
    /** Creates a new instance of PainterPropertyEditor */
    public PaintPropertyEditor() {
    }
    
    @Override
    public String[] getTags() {
        String[] names = DEFAULT_PAINTS.values().toArray(new String[0]);
        String[] results = new String[names.length+1];
        results[0] = "<none>";
        System.arraycopy(names, 0, results, 1, names.length);
        return results;
    }
    
    @Override
    public Paint getValue() {
        return (Paint)super.getValue();
    }

    @Override
    public String getJavaInitializationString() {
        Paint paint = getValue();
        //TODO!!!
        return paint == null ? "null" : 
            "org.jdesktop.swingx.painter.gradient.LinearGradientPainter.BLACK_STAR";
    }

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (text == null || text.trim().equals("") || text.trim().equalsIgnoreCase("none")
                || text.trim().equalsIgnoreCase("<none>")
                || text.trim().equalsIgnoreCase("[none]")) {
            setValue(null);
            return;
        }
        
        if (text.trim().equalsIgnoreCase("<custom>")) {
            //do nothing
        }
        
        for (Map.Entry<Paint, String> entry : DEFAULT_PAINTS.entrySet()) {
            if (entry.getValue().equalsIgnoreCase(text)) {
                setValue(entry.getKey());
                return;
            }
        }
        
        throw new IllegalArgumentException("The input value " + text + " does" +
                " not match one of the names of the standard paints");
    }

    @Override
    public String getAsText() {
        Paint p = getValue();
        if (p == null) {
            return null;
        } else if (DEFAULT_PAINTS.containsKey(p)) {
            return DEFAULT_PAINTS.get(p);
        } else {
            return "<custom>";
        }
    }

    @Override
    public void paintValue(Graphics gfx, Rectangle box) {
        Paint p = getValue();
        if (p == null) {
            //do nothing -- in the future draw the checkerboard or something
        } else {
            ((Graphics2D)gfx).setPaint(p);
            gfx.fillRect(box.x, box.y, box.width, box.height);
        }
    }

    @Override
    public boolean isPaintable() {
        return true;
    }
}
