/*
 * $Id: ColorSwatchConfigurer.java 2911 2008-01-28 20:37:32Z 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.awt.Window;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import VASSAL.configure.ColorConfigurer;
import VASSAL.configure.Configurer;
import VASSAL.tools.SequenceEncoder;

public class ColorSwatchConfigurer extends Configurer {

  protected JPanel p;
  protected JPanel swatchPanel;
  protected JComboBox swatches;
  protected Box colorBox;
  protected ColorConfigurer config;

  public ColorSwatchConfigurer(String key, String name) {
    this(key, name, ColorSwatch.getDefaultSwatch());
  }

  public ColorSwatchConfigurer(String key, String name, ColorSwatch swatch) {
    super(key, name);
    setValue(swatch);
  }

  public ColorSwatchConfigurer(String key, String name, String swatchName) {
    this(key, name, ColorManager.getColorManager().getColorSwatch(swatchName));
  }

  public ColorSwatchConfigurer(String key, String name, Color color) {
    this(key, name, ColorManager.getColorManager().getColorSwatch(color));
  }

  public String getValueString() {
    return "";
  }

  public Color getValueColor() {
    return ((ColorSwatch) value).getColor();
  }

  public ColorSwatch getValueColorSwatch() {
    return (ColorSwatch) value;
  }

  public java.awt.Component getControls() {
    if (p == null) {
      p = new JPanel();
      swatchPanel = new JPanel();

      p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));

      Box box = Box.createHorizontalBox();
      box.add(new JLabel(name));
      buildSwatches();

      box.add(swatchPanel);
      p.add(box);

      colorBox = Box.createHorizontalBox();
      config = new ColorConfigurer("", "Select Color  "); //$NON-NLS-1$
      config.addPropertyChangeListener(new PropertyChangeListener() {
        public void propertyChange(PropertyChangeEvent e) {
          Color c = (Color) config.getValue();
          ColorSwatch cs = ColorManager.getColorManager().getColorSwatch(c);
          setValue(cs);
          buildSwatches();
          updateValue();
        }
      });
      colorBox.add(config.getControls());
      p.add(colorBox);

      repack();

    }
    return p;
  }

  protected void buildSwatches() {
    if (swatchPanel == null) {
      return;
    }

    if (swatches != null) {
      swatchPanel.remove(swatches);
    }

    ItemListener l = new ItemListener() {
      public void itemStateChanged(ItemEvent evt) {
        updateValue();
      }
    };

    swatches = new SwatchComboBox(l, ((ColorSwatch) value).getConfigureName());
    swatchPanel.add(swatches);

  }

  protected void updateValue() {
    String s = (String) swatches.getSelectedItem();
    if (s.equals(ColorManager.SELECT_COLOR)) {
      setValue(ColorManager.getColorManager().getColorSwatch((Color) config.getValue()));
    }
    else {
      setValue(ColorManager.getColorManager().getColorSwatch(s));
    }
    repack();
  }

  protected void repack() {
    colorBox.setVisible(((ColorSwatch) getValue()).getConfigureName().equals(ColorManager.SELECT_COLOR));
    Window w = SwingUtilities.getWindowAncestor(colorBox);
    if (w != null) {
      w.pack();
    }
  }

  public void setValue(String s) {
    super.setValue(new ColorSwatch(s));
    buildSwatches();
  }
  
  public static ColorSwatch decode(String s) {
    SequenceEncoder.Decoder sd = new SequenceEncoder.Decoder(s, '|');
    return new ColorSwatch(sd.nextToken(), sd.nextColor(Color.WHITE));
  }

  public static String encode(ColorSwatch f) {
    SequenceEncoder se = new SequenceEncoder(f.getConfigureName(), '|');
    se.append(ColorConfigurer.colorToString(f.getColor()));
    return se.getValue();
  }
}
