/* JTableHeader.java --
   Copyright (C) 2003, 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.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.FocusListener;
import java.beans.PropertyChangeListener;
import java.util.Locale;

import javax.accessibility.Accessible;
import javax.accessibility.AccessibleAction;
import javax.accessibility.AccessibleComponent;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
import javax.accessibility.AccessibleSelection;
import javax.accessibility.AccessibleStateSet;
import javax.accessibility.AccessibleText;
import javax.accessibility.AccessibleValue;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
import javax.swing.plaf.TableHeaderUI;

/**
 * Represents the table header. The header displays the column header values,
 * is always visible event if the rest of the table scrolls up and down and
 * supports column reordering and resizing with mouse.
 */
public class JTableHeader extends JComponent
  implements TableColumnModelListener, Accessible
{
  protected class AccessibleJTableHeader extends AccessibleJComponent
  {
    protected class AccessibleJTableHeaderEntry extends AccessibleContext
      implements Accessible, AccessibleComponent
    {

      private int columnIndex;

      private JTableHeader parent;

      private JTable table;

      public AccessibleJTableHeaderEntry(int c, JTableHeader p, JTable t)
      {
        columnIndex = c;
        parent = p;
        table = t;
      }

      /**
       * Returns the column header renderer.
       *
       * @return The column header renderer.
       */
      Component getColumnHeaderRenderer()
      {
        TableColumn tc = parent.getColumnModel().getColumn(columnIndex);
        TableCellRenderer r = tc.getHeaderRenderer();
        if (r == null)
          r = parent.getDefaultRenderer();
        return r.getTableCellRendererComponent(table, tc.headerValue,
            false, false, -1, columnIndex);
      }

      /**
       * Returns the accessible context for the column header renderer, or
       * <code>null</code>.
       *
       * @return The accessible context.
       */
      AccessibleContext getAccessibleColumnHeaderRenderer()
      {
        Component c = getColumnHeaderRenderer();
        if (c instanceof Accessible)
          return c.getAccessibleContext();
        return null;
      }

      /**
       * @see #removeFocusListener(FocusListener)
       */
      public void addFocusListener(FocusListener l)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          c.addFocusListener(l);
      }

      /**
       * @see #removePropertyChangeListener(PropertyChangeListener)
       */
      public void addPropertyChangeListener(PropertyChangeListener l)
      {
        // add the listener to the accessible context for the header
        // renderer...
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        if (ac != null)
          ac.addPropertyChangeListener(l);
      }

      public boolean contains(Point p)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.contains(p);
        else
          return false;
      }

      public AccessibleAction getAccessibleAction()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        if (ac instanceof AccessibleAction)
          return (AccessibleAction) ac;
        else
          return null;
      }

      public Accessible getAccessibleAt(Point p)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.getAccessibleAt(p);
        else
          return null;
      }

      /**
       * Returns <code>null</code> as the header entry has no accessible
       * children.
       *
       * @return <code>null</code>.
       */
      public Accessible getAccessibleChild(int i)
      {
        return null;
      }

      /**
       * Returns the number of accessible children, zero in this case.
       *
       * @return 0
       */
      public int getAccessibleChildrenCount()
      {
        return 0;
      }

      /**
       * Returns the accessible component for this header entry.
       *
       * @return <code>this</code>.
       */
      public AccessibleComponent getAccessibleComponent()
      {
        return this;
      }

      /**
       * Returns the accessible context for this header entry.
       *
       * @return <code>this</code>.
       */
      public AccessibleContext getAccessibleContext()
      {
        return this;
      }

      /**
       * Returns the accessible description.
       *
       * @return The accessible description.
       *
       * @see #setAccessibleDescription(String)
       */
      public String getAccessibleDescription()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        if (ac != null)
          return ac.getAccessibleDescription();
        return accessibleDescription;
      }

      /**
       * Returns the index of this header entry.
       *
       * @return The index of this header entry.
       */
      public int getAccessibleIndexInParent()
      {
        return columnIndex;
      }

      /**
       * Returns the accessible name.
       *
       * @return The accessible name.
       *
       * @see #setAccessibleName(String)
       */
      public String getAccessibleName()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        if (ac != null)
          return ac.getAccessibleName();
        return accessibleName;
      }

      /**
       * Returns the accessible role for the header entry.
       *
       * @return The accessible role.
       */
      public AccessibleRole getAccessibleRole()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        if (ac != null)
          return ac.getAccessibleRole();
        else
          return null;
      }

      public AccessibleSelection getAccessibleSelection()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        if (ac instanceof AccessibleValue)
          return (AccessibleSelection) ac;
        else
          return null;
      }

      public AccessibleStateSet getAccessibleStateSet()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        if (ac != null)
          return ac.getAccessibleStateSet();
        else
          return null;
      }

      public AccessibleText getAccessibleText()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        if (ac != null)
          return ac.getAccessibleText();
        else
          return null;
      }

      public AccessibleValue getAccessibleValue()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        if (ac instanceof AccessibleValue)
          return (AccessibleValue) ac;
        else
          return null;
      }

      public Color getBackground()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.getBackground();
        else
          return null;
      }

      public Rectangle getBounds()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.getBounds();
        else
          return null;
      }

      public Cursor getCursor()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.getCursor();
        else
          return null;
      }

      public Font getFont()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.getFont();
        else
          return null;
      }

      public FontMetrics getFontMetrics(Font f)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.getFontMetrics(f);
        else
          return null;
      }

      public Color getForeground()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.getForeground();
        else
          return null;
      }

      public Locale getLocale()
      {
        Component c = getColumnHeaderRenderer();
        if (c != null)
          return c.getLocale();
        return null;
      }

      public Point getLocation()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.getLocation();
        else
          return null;
      }

      public Point getLocationOnScreen()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.getLocationOnScreen();
        else
          return null;
      }

      public Dimension getSize()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.getSize();
        else
          return null;
      }

      public boolean isEnabled()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.isEnabled();
        else
          return false;
      }

      public boolean isFocusTraversable()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.isFocusTraversable();
        else
          return false;
      }

      public boolean isShowing()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.isShowing();
        else
          return false;
      }

      public boolean isVisible()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          return c.isVisible();
        else
          return false;
      }

      /**
       * @see #addFocusListener(FocusListener)
       */
      public void removeFocusListener(FocusListener l)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          c.removeFocusListener(l);
      }

      /**
       * @see #addPropertyChangeListener(PropertyChangeListener)
       */
      public void removePropertyChangeListener(PropertyChangeListener l)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        if (ac != null)
          ac.removePropertyChangeListener(l);
      }

      /**
       * @see #addFocusListener(FocusListener)
       */
      public void requestFocus()
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent c = ac.getAccessibleComponent();
        if (c != null)
          c.requestFocus();
      }

      /**
       * @see #getAccessibleDescription()
       */
      public void setAccessibleDescription(String s)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        if (ac != null)
          ac.setAccessibleDescription(s);
        else
          accessibleDescription = s;
      }

      /**
       * @see #getAccessibleName()
       */
      public void setAccessibleName(String s)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        if (ac != null)
          ac.setAccessibleName(s);
      }

      public void setBackground(Color c)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent comp = ac.getAccessibleComponent();
        if (comp != null)
          comp.setBackground(c);
      }

      public void setBounds(Rectangle r)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent comp = ac.getAccessibleComponent();
        if (comp != null)
          comp.setBounds(r);
      }

      public void setCursor(Cursor c)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent comp = ac.getAccessibleComponent();
        if (comp != null)
          comp.setCursor(c);
      }

      public void setEnabled(boolean b)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent comp = ac.getAccessibleComponent();
        if (comp != null)
          comp.setEnabled(b);
      }

      public void setFont(Font f)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent comp = ac.getAccessibleComponent();
        if (comp != null)
          comp.setFont(f);
      }

      public void setForeground(Color c)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent comp = ac.getAccessibleComponent();
        if (comp != null)
          comp.setForeground(c);
      }

      public void setLocation(Point p)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent comp = ac.getAccessibleComponent();
        if (comp != null)
          comp.setLocation(p);
      }

      public void setSize(Dimension d)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent comp = ac.getAccessibleComponent();
        if (comp != null)
          comp.setSize(d);
      }

      public void setVisible(boolean b)
      {
        AccessibleContext ac = getAccessibleColumnHeaderRenderer();
        AccessibleComponent comp = ac.getAccessibleComponent();
        if (comp != null)
          comp.setVisible(b);
      }
    }

    public AccessibleRole getAccessibleRole()
    {
      return AccessibleRole.PANEL;
    }

    public int getAccessibleChildrenCount()
    {
      return table.getColumnCount();
    }

    public Accessible getAccessibleChild(int i)
    {
      return new AccessibleJTableHeaderEntry(i, JTableHeader.this, table);
    }

    public Accessible getAccessibleAt(Point p)
    {
      return getAccessibleChild(columnAtPoint(p));
    }
  }

  /**
   * Use serialVersionUid for interoperability.
   */
  private static final long serialVersionUID = 5144633983372967710L;

  /**
   * The columnModel property.
   */
  protected TableColumnModel columnModel;

  /**
   * The draggedColumn property.
   */
  protected TableColumn draggedColumn;

  /**
   * The draggedDistance property.
   */
  protected int draggedDistance;

  /**
   * The opaque property.
   */
  boolean opaque;

  /**
   * The reorderingAllowed property.
   */
  protected boolean reorderingAllowed;

  /**
   * The resizingAllowed property.
   */
  protected boolean resizingAllowed = true;

  /**
   * The resizingColumn property.
   */
  protected TableColumn resizingColumn;

  /**
   * The table property.
   */
  protected JTable table;

  /**
   * The updateTableInRealTime property.
   */
  protected boolean updateTableInRealTime;

  TableCellRenderer cellRenderer;

  /**
   * Creates a new default instance.
   */
  public JTableHeader()
  {
    this(null);
  }

  /**
   * Creates a new header.  If <code>cm</code> is <code>null</code>, a new
   * table column model is created by calling
   * {@link #createDefaultColumnModel()}.
   *
   * @param cm  the table column model (<code>null</code> permitted).
   */
  public JTableHeader(TableColumnModel cm)
  {
    columnModel = cm == null ? createDefaultColumnModel() : cm;
    initializeLocalVars();
    updateUI();
  }

  /**
   * Creates a default table column model.
   *
   * @return A default table column model.
   */
  protected TableColumnModel createDefaultColumnModel()
  {
    return new DefaultTableColumnModel();
  }

  /**
   * Get the value of the {@link #accessibleContext} property.
   *
   * @return The current value of the property
   */
  public AccessibleContext getAccessibleContext()
  {
    return accessibleContext;
  }

  /**
   * Get the value of the {@link #columnModel} property.
   *
   * @return The current value of the property
   */
  public TableColumnModel getColumnModel()
  {
    return columnModel;
  }

  /**
   * Get the column that is currently being dragged. This is used when
   * handling the column reordering with mouse.
   *
   * @return the column being dragged, null if none.
   */
  public TableColumn getDraggedColumn()
  {
    return draggedColumn;
  }

  /**
   * Get the value of the {@link #draggedDistance} property.
   *
   * @return The current value of the property
   */
  public int getDraggedDistance()
  {
    return draggedDistance;
  }

  /**
   * Check if it is possible to reorder the table columns by dragging column
   * header with mouse. The table reordering is enabled by default, but can be
   * disabled with {@link #setReorderingAllowed(boolean)}.
   *
   * @return true if reordering is allowed, false otherwise.
   */
  public boolean getReorderingAllowed()
  {
    return reorderingAllowed;
  }

  /**
   * Check if it is possible to resize the table columns by dragging the column
   * boundary in the table header with mouse. The resizing is enabled
   * by default, but can be disabled with {@link #setResizingAllowed(boolean)}.
   *
   * @return true if resizing is allowed, false otherwise.
   */
  public boolean getResizingAllowed()
  {
    return resizingAllowed;
  }

  /**
   * Get the column that is currently being resized. This is used when
   * handling the column resizing with mouse.
   *
   * @return the column being currently resized, null if none.
   */
  public TableColumn getResizingColumn()
  {
    return resizingColumn;
  }

  /**
   * Get the table, having this header.
   *
   * @return the table, having this header.
   */
  public JTable getTable()
  {
    return table;
  }

  /**
   * Get the value of the {@link #updateTableInRealTime} property.
   *
   * @return The current value of the property
   */
  public boolean getUpdateTableInRealTime()
  {
    return updateTableInRealTime;
  }

  /**
   * Get the value of the {@link #opaque} property.
   *
   * @return The current value of the property
   */
  public boolean isOpaque()
  {
    return opaque;
  }

  /**
   * Set the value of the {@link #columnModel} property.
   *
   * @param c The new value of the property
   */
  public void setColumnModel(TableColumnModel c)
  {
    columnModel.removeColumnModelListener(this);
    columnModel = c;
    columnModel.addColumnModelListener(this);
  }

  /**
   * Set the column that is currently being dragged. This is used when
   * dragging the column with mouse. Setting to null will stop the
   * dragging session immediately.
   *
   * @param draggingIt the column being currently dragged, null if none.
   */
  public void setDraggedColumn(TableColumn draggingIt)
  {
    draggedColumn = draggingIt;
  }

  /**
   * Set the value of the {@link #draggedDistance} property.
   *
   * @param d The new value of the property
   */
  public void setDraggedDistance(int d)
  {
    draggedDistance = d;
  }

  /**
   * Set the value of the {@link #opaque} property.
   *
   * @param o The new value of the property
   */
  public void setOpaque(boolean o)
  {
    opaque = o;
  }

  /**
   * Set the table ability to reorder columns by dragging column header
   * with mouse. The table reordering is enabled by default, but can be
   * disabled with this method.
   *
   * @param allowed true if reordering is allowed, false otherwise.
   */
  public void setReorderingAllowed(boolean allowed)
  {
    reorderingAllowed = allowed;
  }

  /**
   * Set the table ability to resize columns by dragging the column
   * boundary in the table header with mouse. The resizing is enabled
   * by default, but can be disabled using this method.
   *
   * @param allowed true if resizing is allowed, false otherwise.
   */
  public void setResizingAllowed(boolean allowed)
  {
    resizingAllowed = allowed;
  }

  /**
   * The the column that is currently being resized. This property is used
   * when handling table resizing with mouse. Setting to null would stop
   * the resizing session immediately.
   *
   * @param resizingIt the column being currently resized
   */
  public void setResizingColumn(TableColumn resizingIt)
  {
    resizingColumn = resizingIt;
  }

  /**
   * Set the value of the {@link #table} property.
   *
   * @param t The new value of the property
   */
  public void setTable(JTable t)
  {
    table = t;
  }

  /**
   * Set the value of the {@link #updateTableInRealTime} property.
   *
   * @param u The new value of the property
   */
  public void setUpdateTableInRealTime(boolean u)
  {
    updateTableInRealTime = u;
  }

  /**
   * Creates a default renderer.
   *
   * @return A default renderer.
   */
  protected TableCellRenderer createDefaultRenderer()
  {
    return new DefaultTableCellRenderer();
  }

  /**
   * Returns the default table cell renderer.
   *
   * @return The default table cell renderer.
   */
  public TableCellRenderer getDefaultRenderer()
  {
    return cellRenderer;
  }

  /**
   * Sets the default table cell renderer.
   *
   * @param cellRenderer  the renderer.
   */
  public void setDefaultRenderer(TableCellRenderer cellRenderer)
  {
    this.cellRenderer = cellRenderer;
  }

  /**
   * Get the rectangle, occupied by the header of the given column.
   *
   * @param column the column, for that the header area is requested.
   *
   * @return the column header area.
   */
  public Rectangle getHeaderRect(int column)
  {
    Rectangle r = getTable().getCellRect(-1, column, false);
    r.height = getHeight();
    return r;
  }

  protected String paramString()
  {
    return "JTableHeader";
  }

  // UI support

  public String getUIClassID()
  {
    return "TableHeaderUI";
  }

  public TableHeaderUI getUI()
  {
    return (TableHeaderUI) ui;
  }

  public void setUI(TableHeaderUI u)
  {
    super.setUI(u);
  }

  public void updateUI()
  {
    setUI((TableHeaderUI) UIManager.getUI(this));
  }

  /**
   * Returns the index of the column at the specified point.
   *
   * @param point  the point.
   *
   * @return The column index, or -1.
   */
  public int columnAtPoint(Point point)
  {
    if (getBounds().contains(point))
      return columnModel.getColumnIndexAtX(point.x);

    return -1;
  }

  /**
   * Receives notification when a column is added to the column model.
   *
   * @param event the table column model event
   */
  public void columnAdded(TableColumnModelEvent event)
  {
    // TODO: What else to do here (if anything)?
    resizeAndRepaint();
  }

  /**
   * Receives notification when a column margin changes in the column model.
   *
   * @param event the table column model event
   */
  public void columnMarginChanged(ChangeEvent event)
  {
    // TODO: What else to do here (if anything)?
    resizeAndRepaint();
  }

  /**
   * Receives notification when a column is moved within the column model.
   *
   * @param event the table column model event
   */
  public void columnMoved(TableColumnModelEvent event)
  {
    // TODO: What else to do here (if anything)?
    resizeAndRepaint();
  }

  /**
   * Receives notification when a column is removed from the column model.
   *
   * @param event the table column model event
   */
  public void columnRemoved(TableColumnModelEvent event)
  {
    // TODO: What else to do here (if anything)?
    resizeAndRepaint();
  }

  /**
   * Receives notification when the column selection has changed.
   *
   * @param event the table column model event
   */
  public void columnSelectionChanged(ListSelectionEvent event)
  {
    // TODO: What else to do here (if anything)?
    resizeAndRepaint();
  }

  /**
   * Validates the layout of this table header and repaints it. This is
   * equivalent to <code>revalidate()</code> followed by
   * <code>repaint()</code>.
   */
  public void resizeAndRepaint()
  {
    revalidate();
    repaint();
  }

  /**
   * Initializes the fields and properties of this class with default values.
   * This is called by the constructors.
   */
  protected void initializeLocalVars()
  {
    accessibleContext = new AccessibleJTableHeader();
    draggedColumn = null;
    draggedDistance = 0;
    opaque = true;
    reorderingAllowed = true;
    resizingAllowed = true;
    resizingColumn = null;
    table = null;
    updateTableInRealTime = true;
    cellRenderer = createDefaultRenderer();
  }
}
