package com.k_int.AdminApp.widgets;

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.util.logging.*;

// Should really be an interface we implement here
import com.k_int.AdminApp.gui.RecordView.SetComponentModel;

/**
 *  A custom component that represents a set of link entities in a many
 *  to many relationship. In editable mode, the component allows addition
 *  of new rows and removal of rows.
 *
 *  @author     Ian Ibbotson
 *  @version    1.0 02-Feb-2004
 */
public class ManyToManySetTable extends JPanel {

    private static Logger cat = Logger.getLogger("com.k_int.AdminApp.widgets.ManyToManySetTable");
  private JTable the_table;
  private String[] allowable_subclass_names;
  private SetComponentModel set_component_model = null;
  private int selected_row;
  private boolean editable = false;
  private JComboBox new_row_combo = null;
  private JButton delete_button = null;

  private ActionListener new_row_action_listener = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        JComboBox cb = (JComboBox)e.getSource();
        String selected_class_name = (String)cb.getSelectedItem();
        cat.finest("create a new instance of "+selected_class_name);
        if ( set_component_model != null )
          set_component_model.newRow(selected_class_name);
    }
  };

  /**
   *  
   */
  public ManyToManySetTable(SetComponentModel set_component_model,
                            String[] allowable_subclass_names) {
    cat.fine("Many to many set table created");
    set_component_model.addEditableChangeListener(this);
    this.set_component_model = set_component_model;
    this.allowable_subclass_names = allowable_subclass_names;
    the_table = new JTable(set_component_model);
    buildUI();
  }

  public ManyToManySetTable(SetComponentModel set_component_model,
                            TableColumnModel tcm,
                            String[] allowable_subclass_names) {
    cat.fine("Many to many set table created");
    set_component_model.addEditableChangeListener(this);
    this.set_component_model = set_component_model;
     this.allowable_subclass_names = allowable_subclass_names;
    the_table = new JTable(set_component_model,tcm);
    buildUI();
  }

  public ManyToManySetTable(SetComponentModel set_component_model,
                            TableColumnModel tcm, 
                            ListSelectionModel lsm,
                            String[] allowable_subclass_names) {
    cat.fine("Many to many set table created");
    set_component_model.addEditableChangeListener(this);
    this.set_component_model = set_component_model;
    this.allowable_subclass_names = allowable_subclass_names;
    the_table = new JTable(set_component_model,tcm,lsm);
    buildUI();
  }

  public void setModel(SetComponentModel tm)
  {
    this.set_component_model = tm;
    the_table.setModel(tm);
  }

  private void buildUI()
  {
      cat.finest("Build ui called");
    this.setLayout(new BorderLayout());
    //this.add(new JScrollPane(the_table), BorderLayout.CENTER);
   // this.add(buildButtonBar(), BorderLayout.SOUTH);
  }

  private JPanel buildButtonBar()
  {
     cat.finest("Build button bar");
    new_row_combo = new JComboBox( allowable_subclass_names);
    new_row_combo.addActionListener(new_row_action_listener);
    JPanel result = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    result.add(new_row_combo);
    delete_button = new JButton("Delete");
    result.add(delete_button);

    ListSelectionModel row_selection_model = the_table.getSelectionModel();
    row_selection_model.addListSelectionListener(new ListSelectionListener() {

    public void valueChanged(ListSelectionEvent e) {
        //Ignore extra messages.
        if (e.getValueIsAdjusting()) return;

        ListSelectionModel lsm = (ListSelectionModel)e.getSource();
        if (lsm.isSelectionEmpty()) {
            //no rows are selected
        } else {
            selected_row = lsm.getMinSelectionIndex();
            cat.finest("Row selection change : "+selected_row);
        }
    } });

    the_table.addMouseListener( new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        if ( e.getClickCount() == 2 ) {
          set_component_model.notifyDoubleClickRow(selected_row);
        }
      }
    } );
   cat.finest("returning with JPanel");
    return result;
  }

  public void setEditable(boolean editable)
  {
    this.editable = editable;
    if ( ( delete_button != null ) && ( new_row_combo != null ) )
    {
      new_row_combo.setVisible(editable);
      delete_button.setVisible(editable);
    }
  }
}
