/*
 * $Id: NewColorConfigurer.java 3907 2008-07-28 15:08:04Z uckelman $
 *
 * Copyright (c) 2000-2003 by Rodney Kinney
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License (LGPL) as published by the Free Software Foundation.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, copies are available
 * at http://www.opensource.org.
 */
package VASSAL.build.module.gamepieceimage;

import java.awt.Color;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.StringTokenizer;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import VASSAL.configure.BooleanConfigurer;
import VASSAL.configure.Configurer;

/**
 * Configurer for {@link Color} values
 */
public class NewColorConfigurer extends Configurer {
  private JPanel p;
  private Panel cp;

  public NewColorConfigurer(String key, String name) {
    this(key, name, Color.black);
  }

  public NewColorConfigurer(String key, String name, Color val) {
    super(key, name, val);
  }

  public String getValueString() {
    return value == null ? "" : colorToString(colorValue()); //$NON-NLS-1$
  }

  public void setValue(Object o) {
//  if (o == null)
//      o = Color.black;
    super.setValue(o);
    if (cp != null)
      cp.repaint();
  }

  public void setValue(String s) {
    setValue(stringToColor(s));
  }

  protected Box colorBox;
  protected Box swatchBox;
  BooleanConfigurer bc;
  ColorSwatchConfigurer csc;
  
  public java.awt.Component getControls() {
    if (p == null) {
      p = new JPanel();
      p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
      
      Box box = Box.createHorizontalBox();
      box.add(new JLabel("Use Named Colors?"));
      bc = new BooleanConfigurer(null, "", Boolean.FALSE); //$NON-NLS-1$
      box.add(bc.getControls());
      bc.addPropertyChangeListener(new PropertyChangeListener() {
        public void propertyChange(PropertyChangeEvent e) {
          colorBox.setVisible(!bc.booleanValue().booleanValue());
          swatchBox.setVisible(bc.booleanValue().booleanValue());
          SwingUtilities.getWindowAncestor(bc.getControls()).pack();
        }   
      });
      p.add(box);
      
      colorBox = Box.createHorizontalBox();
      colorBox.add(new JLabel(getName()));
      cp = new Panel();
      cp.setMaximumSize(new java.awt.Dimension(40, 40));
      cp.setMinimumSize(new java.awt.Dimension(40, 40));
      cp.setSize(new java.awt.Dimension(40, 40));
      colorBox.add(cp);
      JButton b = new JButton("Select");
      colorBox.add(b);
      p.add(colorBox);
      
      b.addActionListener
          (new java.awt.event.ActionListener() {
            public void actionPerformed
                (java.awt.event.ActionEvent e) {
              setValue(JColorChooser.showDialog
                       (null, getName(), colorValue()));
              csc.setValue(new ColorSwatch("", (Color) getValue())); //$NON-NLS-1$
            }
          });
      
      swatchBox = Box.createHorizontalBox();
      csc = new ColorSwatchConfigurer(null, "Select Color:", "WHITE"); //$NON-NLS-2$
      csc.addPropertyChangeListener(new PropertyChangeListener() {
        public void propertyChange(PropertyChangeEvent e) {
          setValue(csc.getValueColor());
        }   
      });
      swatchBox.add(csc.getControls());
      swatchBox.setVisible(false);
      p.add(swatchBox);
      
      
    }
    return p;
  }
  
  private Color colorValue() {
    return (Color) value;
  }

  private class Panel extends JPanel {
    private static final long serialVersionUID = 1L;

    public void paint(java.awt.Graphics g) {
      if (colorValue() != null) {
        g.setColor(colorValue());
        g.fillRect(0, 0, getSize().width, getSize().height);
      }
      else {
        g.clearRect(0, 0, getSize().width, getSize().height);
      }
    }
  }

  public static String colorToString(Color c) {
    return c == null ? null :
        c.getRed() + "," //$NON-NLS-1$
        + c.getGreen() + "," //$NON-NLS-1$
        + c.getBlue();
  }

  public static Color stringToColor(String s) {
    if (s == null || "null".equals(s)) { //$NON-NLS-1$
      return null;
    }

    final StringTokenizer st = new StringTokenizer(s, ","); //$NON-NLS-1$
    try {
      return new Color(Integer.parseInt(st.nextToken()),
                       Integer.parseInt(st.nextToken()),
                       Integer.parseInt(st.nextToken()));
    }
    // FIXME: review error message
    catch (NumberFormatException e) {
      return null;
    }
    catch (IllegalArgumentException e) {
      return null;
    }
  }
}
