/*
 * $Id: TableConfigurer.java 4560 2008-11-28 15:40:49Z 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.configure;

import java.awt.Component;
import java.awt.GridLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


/**
 * @author Brent Easton
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class TableConfigurer extends Configurer implements ActionListener  {

  public static final String ADD_ACTION = "Add";
  public static final String DEL_ACTION = "Remove";
  public static final String INS_ACTION = "Insert";
  
  protected Box controls;
  protected JPanel contents = null;
  
  protected Column[] columns = new Column[0];
  
  protected char rowDelimiter = ',';
  protected char colDelimiter = '|'; 
  
  public TableConfigurer(String key, String name, String[] headings, Class<?>[] types) {
    this(key, name);
    columns = new Column[headings.length];
    for (int i = 0; i < headings.length; i++) {
      columns[i] = new Column(headings[i], types[i]);
    }
  }
  
  public TableConfigurer(String key, String name) {
    super(key, name);
  }

  public String getValueString() {
    return null;
  }

  public void setValue(String s) {

  }
  
  public void setRowDelimiter(char c) {
    rowDelimiter = c;
  }

  public void setColDelimiter(char c) {
    colDelimiter = c;
  }
  
  public int getColumnCount() {
    return columns.length;
  }
  
  public Component getControls() {
    if (controls == null) {
      buildControls();
    }
    return controls;
  }
  
  protected void buildControls() {
    controls = Box.createVerticalBox();
    controls.setBorder(BorderFactory.createEtchedBorder());
    controls.add(new JLabel(getName()));
     
    updateContents();
    
    Box buttonBox = Box.createHorizontalBox();
    JButton addButton = new JButton(ADD_ACTION);
    addButton.addActionListener(this);
    buttonBox.add(addButton);
    JButton delButton = new JButton(DEL_ACTION);
    delButton.addActionListener(this);
    buttonBox.add(delButton);
    JButton insButton = new JButton(INS_ACTION);
    insButton.addActionListener(this);
    buttonBox.add(insButton);
    controls.add(buttonBox);
    repack();
  }

  protected void repack() {
    Window w = SwingUtilities.getWindowAncestor(controls);
    if (w != null) {
      w.pack();
    }
  }
  
  protected void updateContents() {
    if (contents != null) {
      controls.remove(contents);
      contents = null;
    }
    contents = new JPanel();
    contents.setBorder(BorderFactory.createEtchedBorder());
    contents.setLayout(new GridLayout(0, 5));
    
    for (int i = 0; i < columns.length; i++) {
      contents.add(new JLabel(columns[i].getName()));
    }
    
    if (columns[0].getRowCount() > 0) {
      for (int row = 0; row < columns[0].getRowCount(); row++) {
        for (int col = 0; col < columns.length; col++) {
          contents.add(columns[col].getControls(row));
        }
      }
    }
    
    controls.add(contents);
    repack();
  }
  
  public void actionPerformed(ActionEvent e) {
    String action = e.getActionCommand();
    
    if (action.equals(ADD_ACTION)) {
      for (int i = 0; i < getColumnCount(); i++) {
        columns[i].addRow();
      }
      updateContents();
    }
    else if (action.equals(DEL_ACTION)) {
      
    }
    else if (action.equals(INS_ACTION)) {
      
    }
  }

  protected class Column {
    protected Class<?> type;
    protected String name;
    protected List<Configurer> configurers = new ArrayList<Configurer>();
    protected Box controls;
    protected JPanel contents;
    
    public Column(String name, Class<?> type) {
      this.name = name;
      this.type = type;
    }
    
    public Component getControls(int row) {
      if (row >= 0 && row < getRowCount()) {
        return configurers.get(row).getControls();
      }
      return null;
    }
    
    public String getName() {
      return name;
    }
    
    public void addRow() {
      Configurer c = AutoConfigurer.createConfigurer(type, null, "", null);
      configurers.add(c);
    }
    
    public int getRowCount() {
      return configurers.size();
    }
  }
}
