/*
 * $Id: SymbolConfigurer.java 4483 2008-11-16 18:15:32Z uckelman $
 * 
 * Copyright (c) 2005 by Rodney Kinney, Brent Easton
 * 
 * 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.Component;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ItemListener;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.SwingConstants;

import VASSAL.tools.image.ImageUtils;

public class SymbolConfigurer extends StringEnumConfigurer {

  public SymbolConfigurer(String key, String name) {
    super(key, name, Symbol.NatoUnitSymbolSet.getSymbolNames());
  }

  public JComboBox getComboBox() {
    return (JComboBox) new SymbolComboBox();
  }

  public class SymbolComboBox extends JComboBox {
    private static final long serialVersionUID = 1L;

    static final int sample_w = 20;
    static final int sample_h = 13;

    public SymbolComboBox() {
      String[] s = Symbol.NatoUnitSymbolSet.getSymbolNames();
      for (int i = 0; i < s.length; ++i) {
        addItem(s[i]);
      }
      SymbolRenderer renderer = new SymbolRenderer();
      setRenderer(renderer);
    }

    public SymbolComboBox(ItemListener l) {
      this();
      addItemListener(l);
    }

    public SymbolComboBox(ItemListener l, String symbolName) {
      this();
      setSelectedItem(symbolName);
      addItemListener(l);
    }

    public class SymbolRenderer extends JLabel implements ListCellRenderer {
      private static final long serialVersionUID = 1L;

      public SymbolRenderer() {
        setOpaque(true);
        setHorizontalAlignment(LEFT);
        setVerticalAlignment(CENTER);
      }

      /*
       * This method finds the image and text corresponding to the selected
       * value and returns the label, set up to display the text and image.
       */
      public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
          boolean cellHasFocus) {

        if (isSelected) {
          setBackground(list.getSelectionBackground());
          setForeground(list.getSelectionForeground());
        }
        else {
          setBackground(list.getBackground());
          setForeground(list.getForeground());
        }

        final BufferedImage img =
          ImageUtils.createCompatibleTranslucentImage(sample_w, sample_h);
        final Graphics2D g = img.createGraphics();

        final String symbol1 = (String) value;
        final String symbol2 = Symbol.NatoUnitSymbolSet.NONE;
        final Rectangle bounds = new Rectangle(0, 0, sample_w-1, sample_h-1);   
        Symbol.NatoUnitSymbolSet.draw(
          symbol1, symbol2, g, bounds,
          Color.BLACK, Color.WHITE, Color.BLACK, 1.0f, ""); //$NON-NLS-1$
        g.dispose();       
 
        setIcon(new ImageIcon(img));
        setText((String) value);
        this.setHorizontalTextPosition(SwingConstants.LEFT);
        this.setHorizontalAlignment(SwingConstants.RIGHT);
        setFont(list.getFont());

        return this;
      }
    }
  }
}
