/* AbstractLayoutCache.java --
   Copyright (C) 2002, 2004, 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.tree;

import java.awt.Rectangle;
import java.util.Enumeration;

import javax.swing.event.TreeModelEvent;

/**
 * class AbstractLayoutCache
 * 
 * @author Andrew Selkirk
 */
public abstract class AbstractLayoutCache
  implements RowMapper
{
  /**
   * class NodeDimensions
   */
  public abstract static class NodeDimensions
  {
    /**
     * Creates <code>NodeDimensions</code> object.
     */
    public NodeDimensions()
    {
      // Do nothing here.
    }

   /**
    * Get the node dimensions. The NodeDimensions property must be set (unless
    * the method is overridden, like if {@link FixedHeightLayoutCache}. If the
    * method is not overridden and the property is not set, the InternalError is
    * thrown.
    * 
    * @param value the last node in the path
    * @param row the node row
    * @param depth the indentation depth
    * @param expanded true if this node is expanded, false otherwise
    * @param bounds the area where the tree is displayed
    */
    public abstract Rectangle getNodeDimensions(Object value, int row,
                                                int depth, boolean expanded,
                                                Rectangle bounds);
  }

  /**
   * nodeDimensions
   */
  protected NodeDimensions nodeDimensions;

  /**
   * treeModel
   */
  protected TreeModel treeModel;

  /**
   * treeSelectionModel
   */
  protected TreeSelectionModel treeSelectionModel;

  /**
   * rootVisible
   */
  protected boolean rootVisible;

  /**
   * rowHeight
   */
  protected int rowHeight;

  /**
   * Constructor AbstractLayoutCache
   */
  public AbstractLayoutCache()
  {
    // Do nothing here.
  }

  /**
   * setNodeDimensions
   * 
   * @param dimensions TODO
   */
  public void setNodeDimensions(NodeDimensions dimensions)
  {
    nodeDimensions = dimensions;
  }

  /**
   * getNodeDimensions
   * 
   * @return NodeDimensions
   */
  public NodeDimensions getNodeDimensions()
  {
    return nodeDimensions;
  }

 /**
  * Get the node dimensions. The NodeDimensions property must be set
  * (unless the method is overridden, like if
  * {@link FixedHeightLayoutCache}. If the method is not overridden and
  * the property is not set, the InternalError is thrown.
  * 
  * @param value the last node in the path
  * @param row the node row
  * @param depth the indentation depth
  * @param expanded true if this node is expanded, false otherwise
  * @param bounds the area where the tree is displayed
  */
  protected Rectangle getNodeDimensions(Object value, int row, int depth,
                                        boolean expanded, Rectangle bounds)
  {
    if (nodeDimensions == null)
      throw new InternalError("The NodeDimensions are not set");
    return nodeDimensions.getNodeDimensions(value, row, depth, expanded, bounds);
  }

  /**
   * Sets the model that provides the tree data.
   * 
   * @param model the model
   */
  public void setModel(TreeModel model)
  {
    treeModel = model;
  }

  /**
   * Returns the model that provides the tree data.
   * 
   * @return the model
   */
  public TreeModel getModel()
  {
    return treeModel;
  }

  /**
   * setRootVisible
   * 
   * @param visible <code>true</code> if root should be visible,
   * <code>false</code> otherwise
   */
  public void setRootVisible(boolean visible)
  {
    rootVisible = visible;
  }

  /**
   * isRootVisible
   * 
   * @return <code>true</code> if root is visible,
   * <code>false</code> otherwise
   */
  public boolean isRootVisible()
  {
    return rootVisible;
  }

  /**
   * setRowHeight
   * 
   * @param height the row height
   */
  public void setRowHeight(int height)
  {
    rowHeight = height;
    invalidateSizes();
  }

  /**
   * getRowHeight
   * 
   * @return the row height
   */
  public int getRowHeight()
  {
    return rowHeight;
  }

  /**
   * setSelectionModel
   * 
   * @param model the model
   */
  public void setSelectionModel(TreeSelectionModel model)
  {
    treeSelectionModel = model;
  }

  /**
   * getSelectionModel
   * 
   * @return the model
   */
  public TreeSelectionModel getSelectionModel()
  {
    return treeSelectionModel;
  }

  /**
   * Get the sum of heights for all rows. This class provides a general not
   * optimized implementation that is overridded in derived classes 
   * ({@link VariableHeightLayoutCache}, {@link FixedHeightLayoutCache}) for
   * the better performance.
   */
  public int getPreferredHeight()
  {
    int height = 0;
    int n = getRowCount();
    Rectangle r = new Rectangle();
    for (int i = 0; i < n; i++)
      {
        TreePath path = getPathForRow(i);
        height += getBounds(path, r).height;
      }
    return height;
  }

  /**
   * Get the maximal width. This class provides a general not
   * optimized implementation that is overridded in derived classes 
   * ({@link VariableHeightLayoutCache}, {@link FixedHeightLayoutCache}) for
   * the better performance.
   * 
   * @param rect the rectangle that is used during the method work
   */
  public int getPreferredWidth(Rectangle rect)
  {
    int maximalWidth = 0;
    Rectangle r = new Rectangle();
    int n = getRowCount();
    for (int i = 0; i < n; i++)
      {
        TreePath path = getPathForRow(i);
        r.setBounds(0, 0, 0, 0);        
        r = getBounds(path, r);
        if (r.x + r.width > maximalWidth)
          maximalWidth = r.x + r.width;
        // Invalidate the cached value as this may be the very early call
        // before the heigth is properly set (the vertical coordinate may
        // not be correct).
        invalidatePathBounds(path);
      }
    return maximalWidth;
  }
  /**
   * isExpanded
   * 
   * @param value0 TODO
   * 
   * @return boolean
   */
  public abstract boolean isExpanded(TreePath value0);

  /**
   * getBounds
   * 
   * @param value0 TODO
   * @param value1 TODO
   * 
   * @return Rectangle
   */
  public abstract Rectangle getBounds(TreePath value0, Rectangle value1);

  /**
   * getPathForRow
   * 
   * @param row the row
   * 
   * @return the tree path
   */
  public abstract TreePath getPathForRow(int row);

  /**
   * getRowForPath
   * 
   * @param path the tree path
   * 
   * @return the row
   */
  public abstract int getRowForPath(TreePath path);

  /**
   * getPathClosestTo
   * 
   * @param value0 TODO
   * @param value1 TODO
   * 
   * @return the tree path
   */
  public abstract TreePath getPathClosestTo(int value0, int value1);

  /**
   * getVisiblePathsFrom
   * 
   * @param path the tree path
   * 
   * @return Enumeration
   */
  public abstract Enumeration getVisiblePathsFrom(TreePath path);

  /**
   * getVisibleChildCount
   * 
   * @param path the tree path
   * 
   * @return int
   */
  public abstract int getVisibleChildCount(TreePath path);

  /**
   * setExpandedState
   * 
   * @param value0 TODO
   * 
   * @param value1 TODO
   */
  public abstract void setExpandedState(TreePath value0, boolean value1);

  /**
   * getExpandedState
   * 
   * @param path the tree path
   * 
   * @return boolean
   */
  public abstract boolean getExpandedState(TreePath path);

  /**
   * getRowCount
   * 
   * @return the number of rows
   */
  public abstract int getRowCount();

  /**
   * invalidateSizes
   */
  public abstract void invalidateSizes();

  /**
   * invalidatePathBounds
   * 
   * @param path the tree path
   */
  public abstract void invalidatePathBounds(TreePath path);

  /**
   * treeNodesChanged
   * 
   * @param event the event to send
   */
  public abstract void treeNodesChanged(TreeModelEvent event);

  /**
   * treeNodesInserted
   * 
   * @param event the event to send
   */
  public abstract void treeNodesInserted(TreeModelEvent event);

  /**
   * treeNodesRemoved
   * 
   * @param event the event to send
   */
  public abstract void treeNodesRemoved(TreeModelEvent event);

  /**
   * treeStructureChanged
   * 
   * @param event the event to send
   */
  public abstract void treeStructureChanged(TreeModelEvent event);

  /**
   * Get the tree row numbers for the given pathes. This method performs
   * the "bulk" conversion that may be faster than mapping pathes one by
   * one. To have the benefit from the bulk conversion, the method must be
   * overridden in the derived classes. The default method delegates work
   * to the {@link #getRowForPath(TreePath)}.
   * 
   * @param paths the tree paths the array of the tree pathes.
   * @return the array of the matching tree rows.
   */
  public int[] getRowsForPaths(TreePath[] paths)
  {
    int[] rows = new int[paths.length];
    for (int i = 0; i < rows.length; i++)
      rows[i] = getRowForPath(paths[i]);
    return rows;
  }

  /**
   * Returns true if this layout supposes that all rows have the fixed
   * height.
   * 
   * @return boolean true if all rows in the tree must have the fixed
   * height (false by default).
   */
  protected boolean isFixedRowHeight()
  {
    return false; 
  }
}
