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

public class TableEventsDemo extends JApplet {
  // Create table column names
  private String[] columnNames =
    {"Title", "Copies Needed", "Publisher", "Date Published",
     "In-stock", "Book Photo"};

  // Create image icons
  private ImageIcon intro1eImageIcon =
    new ImageIcon(getClass().getResource("/image/intro1e.gif"));
  private ImageIcon intro2eImageIcon =
    new ImageIcon(getClass().getResource("/image/intro2e.gif"));
  private ImageIcon intro3eImageIcon =
    new ImageIcon(getClass().getResource("/image/intro3e.jpg"));

  // Create table data
  private Object[][] rowData = {
    {"Introduction to Java Programming", 120,
     "Que Education & Training",
      new GregorianCalendar(1998, 1-1, 6).getTime(),
      false, intro1eImageIcon},
    {"Introduction to Java Programming, 2E", 220,
     "Que Education & Training",
      new GregorianCalendar(1999, 1-1, 6).getTime(),
      false, intro2eImageIcon},
    {"Introduction to Java Programming, 3E", 220,
      "Prentice Hall",
      new GregorianCalendar(2000, 12-1, 0).getTime(),
      true, intro3eImageIcon},
  };

  // Create a table model
  private MyTableModel tableModel = new MyTableModel(
    rowData, columnNames);

  // Create a table
  private JTable jTable1 = new JTable(tableModel);

  // Get table column model
  private TableColumnModel tableColumnModel =
    jTable1.getColumnModel();

  // Get table selection model
  private ListSelectionModel selectionModel =
    jTable1.getSelectionModel();

  // Create a text area
  private JTextArea jtaMessage = new JTextArea();

  // Create a button
  private JButton jbtDeleteColumn =
    new JButton("Delete Selected Column");

  public TableEventsDemo() {
    // Set custom renderer for displaying images
    TableColumn bookCover = jTable1.getColumn("Book Photo");
    bookCover.setCellRenderer(new MyImageCellRenderer());

    // Create a combo box for publishers
    JComboBox jcboPublishers = new JComboBox();
    jcboPublishers.addItem("Prentice Hall");
    jcboPublishers.addItem("Que Education & Training");
    jcboPublishers.addItem("McGraw-Hill");

    // Set combo box as the editor for the publisher column
    TableColumn publisherColumn = jTable1.getColumn("Publisher");
    publisherColumn.setCellEditor(
      new DefaultCellEditor(jcboPublishers));

    jTable1.setRowHeight(60);
    jTable1.setColumnSelectionAllowed(true);

    JSplitPane jSplitPane1 = new JSplitPane(
      JSplitPane.VERTICAL_SPLIT);
    jSplitPane1.add(new JScrollPane(jTable1), JSplitPane.LEFT);
    jSplitPane1.add(new JScrollPane(jtaMessage), JSplitPane.RIGHT);
    add(jbtDeleteColumn, BorderLayout.NORTH);
    add(jSplitPane1, BorderLayout.CENTER);

    tableModel.addTableModelListener(new TableModelListener() {
      @Override
      public void tableChanged(TableModelEvent e) {
        jtaMessage.append("Table changed at row " +
          e.getFirstRow() + " and column " + e.getColumn() + "\n");
      }
    });

    tableColumnModel.addColumnModelListener(
        new TableColumnModelListener() {
      @Override
      public void columnRemoved(TableColumnModelEvent e) {
        jtaMessage.append("Column indexed at " + e.getFromIndex() +
          " is deleted \n");
      }
      
      @Override
      public void columnAdded(TableColumnModelEvent e) {
      }
      
      @Override
      public void columnMoved(TableColumnModelEvent e) {
      }
      
      @Override
      public void columnMarginChanged(ChangeEvent e) {
      }
      
      @Override
      public void columnSelectionChanged(ListSelectionEvent e) {
      }
    });

    jbtDeleteColumn.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        if (jTable1.getSelectedColumn() >= 0) {
          TableColumnModel columnModel = jTable1.getColumnModel();
          TableColumn tableColumn =
              columnModel.getColumn(jTable1.getSelectedColumn());
          columnModel.removeColumn(tableColumn);
        }
      }
    });

    selectionModel.addListSelectionListener(
        new ListSelectionListener() {
      @Override
      public void valueChanged(ListSelectionEvent e) {
        jtaMessage.append("Row " + jTable1.getSelectedRow() +
          " and column " + jTable1.getSelectedColumn() +
          " selected\n");
      }
    });
  }

  public static void main(String[] args) {
    TableEventsDemo applet = new TableEventsDemo();
    JFrame frame = new JFrame();
    //EXIT_ON_CLOSE == 3
    frame.setDefaultCloseOperation(3);
    frame.setTitle("TableEventsDemo");
    frame.getContentPane().add(applet, BorderLayout.CENTER);
    applet.init();
    applet.start();
    frame.setSize(400,320);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    frame.setLocation((d.width - frame.getSize().width) / 2,
      (d.height - frame.getSize().height) / 2);
    frame.setVisible(true);
  }
}