/*************************************************************************
 *
 *  File Name (IA2CommonTypes.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2010 Linux Foundation 
 *  Copyright (c) 2006 IBM Corporation 
 *  Copyright (c) 2000, 2006 Sun Microsystems, Inc. 
 *  All rights reserved. 
 *   
 *   
 *  Redistribution and use in source and binary forms, with or without 
 *  modification, are permitted provided that the following conditions 
 *  are met: 
 *   
 *   1. Redistributions of source code must retain the above copyright 
 *      notice, this list of conditions and the following disclaimer. 
 *   
 *   2. Redistributions in binary form must reproduce the above 
 *      copyright notice, this list of conditions and the following 
 *      disclaimer in the documentation and/or other materials 
 *      provided with the distribution. 
 *
 *   3. Neither the name of the Linux Foundation nor the names of its 
 *      contributors may be used to endorse or promote products 
 *      derived from this software without specific prior written 
 *      permission. 
 *   
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
 *  CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
 *  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 *  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
 *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
 *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 *  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
 *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
 *  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 *   
 *  This BSD License conforms to the Open Source Initiative "Simplified 
 *  BSD License" as published at: 
 *  http://www.opensource.org/licenses/bsd-license.php 
 *   
 *  IAccessible2 is a trademark of the Linux Foundation. The IAccessible2 
 *  mark may be used in accordance with the Linux Foundation Trademark 
 *  Policy to indicate compliance with the IAccessible2 specification. 
 * 
 ************************************************************************/ 

 /** These constants control the scrolling of an object or substring into a window.

 This enum is used in IAccessible2::scrollTo and IAccessibleText::scrollSubstringTo.
*/
enum IA2ScrollType {

  /** Scroll the top left corner of the object or substring such that the top left
   corner (and as much as possible of the rest of the object or substring) is within
   the top level window.  In cases where the entire object or substring fits within 
   the top level window, the placement of the object or substring is dependent on 
   the application.  For example, the object or substring may be scrolled to the 
   closest edge, the furthest edge, or midway between those two edges.  In cases
   where there is a hierarchy of nested scrollable controls, more than one control
   may have to be scrolled.
  */
  IA2_SCROLL_TYPE_TOP_LEFT, 

  /** Scroll the bottom right corner of the object or substring such that the bottom right
   corner (and as much as possible of the rest of the object or substring) is within
   the top level window.  In cases where the entire object or substring fits within 
   the top level window, the placement of the object or substring is dependent on 
   the application.  For example, the object or substring may be scrolled to the 
   closest edge, the furthest edge, or midway between those two edges.  In cases
   where there is a hierarchy of nested scrollable controls, more than one control
   may have to be scrolled.
  */
  IA2_SCROLL_TYPE_BOTTOM_RIGHT,

  /** Scroll the top edge of the object or substring such that the top edge 
   (and as much as possible of the rest of the object or substring) is within the
   top level window.  In cases where the entire object or substring fits within 
   the top level window, the placement of the object or substring is dependent on 
   the application.  For example, the object or substring may be scrolled to the 
   closest edge, the furthest edge, or midway between those two edges.  In cases
   where there is a hierarchy of nested scrollable controls, more than one control
   may have to be scrolled.
  */
  IA2_SCROLL_TYPE_TOP_EDGE,

  /** Scroll the bottom edge of the object or substring such that the bottom edge 
   (and as much as possible of the rest of the object or substring) is within the
   top level window.  In cases where the entire object or substring fits within 
   the top level window, the placement of the object or substring is dependent on 
   the application.  For example, the object or substring may be scrolled to the 
   closest edge, the furthest edge, or midway between those two edges.  In cases
   where there is a hierarchy of nested scrollable controls, more than one control
   may have to be scrolled.
  */
  IA2_SCROLL_TYPE_BOTTOM_EDGE, 

  /** Scroll the left edge of the object or substring such that the left edge 
   (and as much as possible of the rest of the object or substring) is within the
   top level window.  In cases where the entire object or substring fits within 
   the top level window, the placement of the object or substring is dependent on 
   the application.  For example, the object or substring may be scrolled to the 
   closest edge, the furthest edge, or midway between those two edges.  In cases
   where there is a hierarchy of nested scrollable controls, more than one control
   may have to be scrolled.
  */
  IA2_SCROLL_TYPE_LEFT_EDGE, 

  /** Scroll the right edge of the object or substring such that the right edge 
   (and as much as possible of the rest of the object or substring) is within the
   top level window.  In cases where the entire object or substring fits within 
   the top level window, the placement of the object or substring is dependent on 
   the application.  For example, the object or substring may be scrolled to the 
   closest edge, the furthest edge, or midway between those two edges.  In cases
   where there is a hierarchy of nested scrollable controls, more than one control
   may have to be scrolled.
  */
  IA2_SCROLL_TYPE_RIGHT_EDGE,

  /** Scroll the object or substring such that as much as possible of the 
   object or substring is within the top level window.  The placement of 
   the object is dependent on the application.  For example, the object or
   substring may be scrolled to to closest edge, the furthest edge, or midway
   between those two edges.
  */
  IA2_SCROLL_TYPE_ANYWHERE
};

/** These constants define which coordinate system a point is located in.
 
 This enum is used in IAccessible2::scrollToPoint, IAccessibleImage::imagePosition,
 IAccessibleText::characterExtents, and IAccessibleText::offsetAtPoint, and 
 IAccessibleText::scrollSubstringToPoint.
*/
enum IA2CoordinateType {

  /// The coordinates are relative to the screen.
  IA2_COORDTYPE_SCREEN_RELATIVE, 

  /** The coordinates are relative to the upper left corner of the bounding box
   of the immediate parent.
  */
  IA2_COORDTYPE_PARENT_RELATIVE  

};

/** Special offsets for use in IAccessibleText and IAccessibleEditableText methods
  
  Refer to @ref _specialOffsets 
  "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
  for more information.
*/
enum IA2TextSpecialOffsets {
  IA2_TEXT_OFFSET_LENGTH = -1,  /**< This offset is equivalent to the length of the string.  It eliminates
                                     the need to call IAccessibleText::nCharacters. */
  IA2_TEXT_OFFSET_CARET = -2    /**< This offset signifies that the text related to the physical location
                                     of the caret should be used. */
};

/** These constants specify the kind of change made to a table.

   This enum is used in the IA2TableModelChange struct which in turn is used by
   IAccessibleTable::modelChange and IAccessibleTable2::modelChange.
*/
enum IA2TableModelChangeType {
  IA2_TABLE_MODEL_CHANGE_INSERT,  // = 0;
  IA2_TABLE_MODEL_CHANGE_DELETE,
  IA2_TABLE_MODEL_CHANGE_UPDATE
};

/** A structure defining the type of and extents of changes made to a table
 
 IAccessibleTable::modelChange and IAccessibleTable2::modelChange return this struct.
 In the case of an insertion or change the row and column offsets define the boundaries
 of the inserted or changed subtable after the operation.  In the case of a deletion
 the row and column offsets define the boundaries of the subtable being removed before
 the removal.
*/
typedef struct IA2TableModelChange {
  enum IA2TableModelChangeType type;  // insert, delete, update
  long firstRow;                      ///< 0 based, inclusive
  long lastRow;                       ///< 0 based, inclusive
  long firstColumn;                   ///< 0 based, inclusive
  long lastColumn;                    ///< 0 based, inclusive
} IA2TableModelChange;
