/* TableColumnModel.java --
   Copyright (C) 2002, 2004, 2005, 2006,  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath 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
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package javax.swing.table;

import java.util.Enumeration;

import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;

/**
 * The interface used by {@link JTable} to access the columns in the table
 * view.
 * 
 * @author Andrew Selkirk
 */
public interface TableColumnModel
{
  /**
   * Adds a column to the model.
   * 
   * @param column  the new column (<code>null</code> not permitted).
   * 
   * @throws IllegalArgumentException if <code>column</code> is 
   *         <code>null</code>.
   */
  void addColumn(TableColumn column);

  /**
   * Removes a column from the model.  If <code>column</code> is not defined
   * in the model, this method does nothing.
   * 
   * @param column TableColumn
   */
  void removeColumn(TableColumn column);

  /**
   * Moves a column.
   * 
   * @param columnIndex Index of column to move
   * @param newIndex New index of column
   */
  void moveColumn(int columnIndex, int newIndex);

  /**
   * Sets the column margin and sends a {@link ChangeEvent} to all registered
   * {@link TableColumnModelListener}s registered with the model.
   * 
   * @param margin  the column margin.
   * 
   * @see #getColumnMargin()
   */
  void setColumnMargin(int margin);

  /**
   * Returns the number of columns in the model.
   * 
   * @return The column count.
   */
  int getColumnCount();

  /**
   * Returns an enumeration of the columns in the model.
   * 
   * @return An enumeration of the columns in the model.
   */
  Enumeration getColumns();

  /**
   * Returns the index of the {@link TableColumn} with the given identifier.
   *
   * @param identifier  the identifier (<code>null</code> not permitted).
   * 
   * @return The index of the {@link TableColumn} with the given identifier.
   * 
   * @throws IllegalArgumentException if <code>identifier</code> is 
   *         <code>null</code> or there is no column with that identifier.
   */
  int getColumnIndex(Object identifier);

  /**
   * Returns the <code>TableColumn</code> at the specified index.
   * 
   * @param columnIndex  the column index.
   * 
   * @return The table column.
   */
  TableColumn getColumn(int columnIndex);

  /**
   * Returns the column margin.
   * 
   * @return The column margin.
   * 
   * @see #setColumnMargin(int)
   */
  int getColumnMargin();

  /**
   * Returns the index of the column that contains the specified x-coordinate,
   * assuming that:
   * <ul>
   * <li>column zero begins at position zero;</li>
   * <li>all columns appear in order;</li>
   * <li>individual column widths are taken into account, but the column margin
   *     is ignored.</li>
   * </ul>
   * If no column contains the specified position, this method returns 
   * <code>-1</code>.
   * 
   * @param xPosition  the x-position.
   * 
   * @return The column index, or <code>-1</code>.
   */
  int getColumnIndexAtX(int xPosition);

  /**
   * Returns total width of all the columns in the model, ignoring the
   * column margin (see {@link #getColumnMargin()}).
   *
   * @return The total width of all the columns.
   */
  int getTotalColumnWidth();

  /**
   * Sets the flag that indicates whether or not column selection is allowed.
   *
   * @param allowed  the new flag value.
   * 
   * @see #getColumnSelectionAllowed()
   */
  void setColumnSelectionAllowed(boolean allowed);

  /**
   * Returns <code>true</code> if column selection is allowed, and 
   * <code>false</code> if column selection is not allowed.
   *
   * @return A boolean.
   * 
   * @see #setColumnSelectionAllowed(boolean)
   */
  boolean getColumnSelectionAllowed();

  /**
   * getSelectedColumns
   * @return Selected columns
   */
  int[] getSelectedColumns();

  /**
   * Returns the number of selected columns in the model.
   * 
   * @return The selected column count.
   * 
   * @see #getSelectionModel()
   */
  int getSelectedColumnCount();

  /**
   * Sets the selection model that will be used to keep track of the selected 
   * columns.
   *
   * @param model  the selection model (<code>null</code> not permitted).
   * 
   * @throws IllegalArgumentException if <code>model</code> is 
   *     <code>null</code>.
   */
  void setSelectionModel(ListSelectionModel model);

  /**
   * Returns the selection model used to track table column selections.
   * 
   * @return The selection model.
   * 
   * @see #setSelectionModel(ListSelectionModel)
   */
  ListSelectionModel getSelectionModel();

  /**
   * Registers a listener with the model, so that it will receive
   * {@link TableColumnModelEvent} notifications.
   *
   * @param listener the listener (<code>null</code> ignored).
   */
  void addColumnModelListener(TableColumnModelListener listener);

  /**
   * Deregisters a listener, so that it will no longer receive 
   * {@link TableColumnModelEvent} notifications.
   * 
   * @param listener  the listener.
   */
  void removeColumnModelListener(TableColumnModelListener listener);
}
