/*
 * Created on 04-Oct-2003
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package com.k_int.AdminApp.gui.RecordView;

import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.jxpath.JXPathContext;
import com.k_int.AdminApp.gui.AdminControllerComponent;
import java.util.logging.*;


/**
 * @author Administrator
 *
 * A class that acts as a bridge between a Set attribute of
 * an entity and a JTable that shows the rows of that set.
 */
public class ListComponentModel extends AbstractTableModel implements RecordModelListener
{
    private static Logger cat = Logger.getLogger("com.k_int.AdminApp.gui.RecordView.ListComponentMOdel");
  private String access_path;
  private String[] column_attr_paths;
  private String[] column_headings;
  private List data = null;
  private AdminControllerComponent controller = null;
     
  public ListComponentModel(String access_path,
                            String[] column_attr_paths,
                            String[] column_headings)
  {
    this.access_path = access_path;
    this.column_attr_paths = column_attr_paths;
    this.column_headings = column_headings;
  }
    
  /* (non-Javadoc)
   * @see com.k_int.AdminApp.gui.RecordView.RecordModelListener#recordChanged(java.lang.Object, boolean)
   */
  public void recordChanged(Object record, boolean editable)
  {
    cat.fine("Looking up data");
    data = (List)JXPathContext.newContext(record).getValue(access_path);
    cat.fine("Got data"+data);
    this.fireTableDataChanged();
  }
  
  
 
  /* (non-Javadoc)
   * @see com.k_int.AdminApp.gui.RecordView.RecordModelListener#synchronizeViewToModel()
   */
  public void synchronizeViewToModel()
  {
    this.fireTableDataChanged();
  }

  public String getColumnName(int col)
  {
    return column_headings[col];
  }

  public int getColumnCount()
  {
    return column_headings.length;
  }

  public int getRowCount()
  {
    if ( data != null )
      return data.size();
    else
      return 0;
  }

  public Object getValueAt(int row_num, int col)
  {
    Object result = null;

    if ( data != null )
    {
      Object row = data.get(row_num);
      if ( row != null )
      {
        // Now access the value indicated by that cols access path.
        try
        {
          result = BeanUtils.getProperty(row, column_attr_paths[col]);
        }
        catch ( java.lang.IllegalAccessException iae )
        {
        }
        catch ( java.lang.reflect.InvocationTargetException ite )
        {
        }
        catch ( java.lang.NoSuchMethodException nsme )
        {
        }
      }
    }

    return result;
  }

  public void setController(AdminControllerComponent c)
  {
    this.controller = c;
  }

}
