/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 2002
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *   Louie Zhao <Louie.Zhao@sun.com> (original author)
 *   Alexander Surkov <surkov.alexander@gmail.com>
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

#include "nsISupports.idl"
#include "nsITreeColumns.idl"

interface nsIAccessible;

/**
 * A private interface to operate with tree accessible.
 *
 * @status UNDER_REVIEW
 */
[uuid(7e0f50b0-6444-4372-b00f-4ce81c6b058a)]
interface nsIAccessibleTreeCache : nsISupports
{
  /**
   * Get tree item from cache according to row and column, create if doesn't
   * exist in cache.
   *
   * @param aRow     the given row index
   * @param aColumn  the given column object. If is is nsnull then primary
   *                 column is used. It makes sense for ATK only.
   */
  nsIAccessible getCachedTreeitemAccessible(in long aRow,
                                            in nsITreeColumn aColumn);

  /**
   * Invalidates the number of cached treeitem accessibles.
   *
   * @param aRow    row index the invalidation starts from
   * @param aCount  the number of treeitem accessibles to invalidate,
   *                the number sign specifies whether rows have been
   *                inserted (plus) or removed (minus)
   */
  void invalidateCache(in long aRow, in long aCount);

  /**
   * Fires name change events for invalidated area of tree.
   *
   * @param aStartRow  row index invalidation starts from
   * @param aEndRow    row index invalidation ends, -1 means last row index
   * @param aStartCol  column index invalidation starts from
   * @param aEndCol    column index invalidation ends, -1 mens last column
   *                   index
   */
  void treeViewInvalidated(in long aStartRow, in long aEndRow,
                           in long aStartCol, in long aEndCol);
};

[uuid(b71532f9-53b2-4647-a5b2-1c5f57e9aed6)]
interface nsPIAccessibleTreeItem : nsISupports
{
  /**
   * Get/set cached name.
   */
  attribute AString cachedName;
};

