/*************************************************************************
 *
 *  File Name (api_all_headers.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2013 Linux Foundation 
 *  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. 
 * 
 ************************************************************************/ 

import "objidl.idl";
import "oaidl.idl";
import "oleacc.idl";

/*************************************************************************
 *
 *  File Name (IA2CommonTypes.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2013 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;
/*************************************************************************
 *
 *  File Name (AccessibleRelation.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2013 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. 
 * 
 ************************************************************************/ 





/** @defgroup grpRelations Relations 
  Use the following constants to compare against the BSTRs returned by 
  IAccessibleRelation::relationType.
*/ 
///@{

/** The target object is the containing application object. */
const WCHAR *const IA2_RELATION_CONTAINING_APPLICATION = L"containingApplication";

/** The target object is the containing document object. The target object implements
 the IAccessibleDocument interface.
*/
const WCHAR *const IA2_RELATION_CONTAINING_DOCUMENT = L"containingDocument";

/** The target object is the containing tab pane object. */
const WCHAR *const IA2_RELATION_CONTAINING_TAB_PANE = L"containingTabPane";

/** The target object is the containing window object. */
const WCHAR *const IA2_RELATION_CONTAINING_WINDOW = L"containingWindow";

/** Some attribute of this object is affected by a target object. */
const WCHAR *const IA2_RELATION_CONTROLLED_BY = L"controlledBy";

/** This object is interactive and controls some attribute of a target object. */
const WCHAR *const IA2_RELATION_CONTROLLER_FOR = L"controllerFor";

/** This object is described by the target object. */
const WCHAR *const IA2_RELATION_DESCRIBED_BY = L"describedBy";

/** This object is describes the target object. */
const WCHAR *const IA2_RELATION_DESCRIPTION_FOR = L"descriptionFor";

/** This object is embedded by a target object. */
const WCHAR *const IA2_RELATION_EMBEDDED_BY = L"embeddedBy";

/** This object embeds a target object. This relation can be used on the
 OBJID_CLIENT accessible for a top level window to show where the content 
 areas are.
*/
const WCHAR *const IA2_RELATION_EMBEDS = L"embeds";

/** Content flows to this object from a target object. 
 This relation and IA2_RELATION_FLOWS_TO are useful to tie text and non-text
 objects together in order to allow assistive technology to follow the
 intended reading order.
*/
const WCHAR *const IA2_RELATION_FLOWS_FROM = L"flowsFrom";

/** Content flows from this object to a target object. */
const WCHAR *const IA2_RELATION_FLOWS_TO = L"flowsTo";

/** This object is label for a target object. */
const WCHAR *const IA2_RELATION_LABEL_FOR = L"labelFor";

/** This object is labelled by a target object. Note that the double L spelling
 which follows is preferred.  Please use it instead.  This single L version may
 be removed in a later version.
*/
const WCHAR *const IA2_RELATION_LABELED_BY = L"labelledBy";

/** This object is labelled by a target object. */
const WCHAR *const IA2_RELATION_LABELLED_BY = L"labelledBy";

/** This object is a member of a group of one or more objects. When 
 there is more than one object in the group each member may have one and the 
 same target, e.g. a grouping object.  It is also possible that each member has 
 multiple additional targets, e.g. one for every other member in the group.
*/
const WCHAR *const IA2_RELATION_MEMBER_OF = L"memberOf";

/** The target object is the next object in the tab order. */
const WCHAR *const IA2_RELATION_NEXT_TABBABLE = L"nextTabbable";

/** This object is a logical child of a target object.  This relation is the reciprocal
 of the IA2_RELATION_NODE_PARENT_OF relation. In some cases an application's accessible
 tree is such that objects can be in a logical parent-child relationship which is
 different from the hierarchy of the accessible tree. */
const WCHAR *const IA2_RELATION_NODE_CHILD_OF = L"nodeChildOf";

/** This object is a logical parent of a target object. This relation is the reciprocal
 of the IA2_RELATION_NODE_CHILD_OF relation. In some cases an application's accessible
 tree is such that objects can be in a logical parent-child relationship which is
 different from the hierarchy of the accessible tree. */
const WCHAR *const IA2_RELATION_NODE_PARENT_OF = L"nodeParentOf";

/** This object is a parent window of the target object. */
const WCHAR *const IA2_RELATION_PARENT_WINDOW_OF = L"parentWindowOf";

/** This object is a transient component related to the target object. 
 When this object is activated the target object doesn't lose focus.
*/
const WCHAR *const IA2_RELATION_POPUP_FOR = L"popupFor";

/** The target object is the previous object in the tab order. */
const WCHAR *const IA2_RELATION_PREVIOUS_TABBABLE = L"previousTabbable";

/** This object is a sub window of a target object. */
const WCHAR *const IA2_RELATION_SUBWINDOW_OF = L"subwindowOf";

///@}

/** This interface gives access to an object's set of relations.
*/
[object, uuid(7CDF86EE-C3DA-496a-BDA4-281B336E1FDC)]
interface IAccessibleRelation : IUnknown
{
  /** @brief Returns the type of the relation.
   @param [out] relationType
    The strings returned are defined @ref grpRelations "in this section of the documentation".
   @retval S_OK
  */
  [propget] HRESULT relationType
    (
     [out, retval] BSTR *relationType
    );

  /** @brief Returns a localized version of the relation type.
   @param [out] localizedRelationType
   @retval S_OK
  */
  [propget] HRESULT localizedRelationType
    (
     [out, retval] BSTR *localizedRelationType
    );

  /** @brief Returns the number of targets for this relation.
   @param [out] nTargets
   @retval S_OK
  */
  [propget] HRESULT nTargets
    (
     [out, retval] long *nTargets
    );

  /** @brief Returns one accessible relation target.
   @param [in] targetIndex
    0 based index
   @param [out] target
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
   @note Use QueryInterface to get IAccessible2.
  */
  [propget] HRESULT target
    (
     [in] long targetIndex,
     [out, retval] IUnknown **target 
    );

  /** @brief Returns multiple accessible relation targets
   @param [in] maxTargets
    maximum size of the array allocated by the client
   @param [out] targets
    The array of target objects.  Note that this array is to be allocated by the
	client and freed when no longer needed.  Refer to @ref _arrayConsideration 
	"Special Consideration when using Arrays" for more details.  You will need to use 
	QueryInterface on the IUnknown to get the IAccessible2.
   @param [out] nTargets
	actual number of targets in the returned array (not more than maxTargets)
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, e.g. a negative value
  */
  [propget] HRESULT targets
    (
     [in] long maxTargets, 
     [out, size_is(maxTargets), length_is(*nTargets)]
       IUnknown **targets, 
     [out, retval] long *nTargets 
    );

}
/*************************************************************************
 *
 *  File Name (AccessibleAction.idl)
 *
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2013 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. 
 * 
 ************************************************************************/ 





/** This enum defines values which are predefined actions for use when implementing
 support for media.

 This enum is used when specifying an action for IAccessibleAction::doAction.
*/

enum IA2Actions {
  IA2_ACTION_OPEN = -1,         /**< Used to inform the server that the client will
                                signal via IA2_ACTION_COMPLETE when it has consumed
                                the content provided by the object.  This action
                                allows the object's server to wait for all clients
                                to signal their readiness for additional content.
                                Any form of content generation that requires
                                synchronization with an AT would require use of this
                                action.  One example is the generation of text describing
                                visual content not obvious from a video's sound track.
                                In this scenario the Text to Speech or Braille output
                                may take more time than the related length of silence
                                in the video's sound track. */
  IA2_ACTION_COMPLETE = -2,  	/**< Used by the client to inform the server that it has
                                consumed the most recent content provided by this object. */
  IA2_ACTION_CLOSE = -3         /**< Used to inform the server that the client no longer
                                requires synchronization. */
};
        
/** @brief This interface gives access to actions that can be executed
  for accessible objects.

 Every accessible object that can be manipulated via the native GUI beyond the 
  methods available either in the MSAA IAccessible interface or in the set of 
  IAccessible2 interfaces (other than this IAccessibleAction interface) should 
  support the IAccessibleAction interface in order to provide Assistive Technology
  access to all the actions that can be performed by the object.  Each action can 
  be performed or queried for a name, description or associated key bindings.  
  Actions are needed more for ATs that assist the mobility impaired, such as
  on-screen keyboards and voice command software.  By providing actions directly,
  the AT can present them to the user without the user having to perform the extra
  steps to navigate a context menu.

 The first action should be equivalent to the MSAA default action.  If there is 
  only one action, %IAccessibleAction should also be implemented.
*/
[object, uuid(B70D9F59-3B5A-4dba-AB9E-22012F607DF5)]
interface IAccessibleAction : IUnknown
{

  /** @brief Returns the number of accessible actions available in this object.
    
   If there are more than one, the first one is considered the
    "default" action of the object.
   @param [out] nActions
    The returned value of the number of actions is zero if there are
    no actions.
   @retval S_OK
   @note This method is missing a [propget] prefix in the IDL.  The result is the
    method is named nActions in generated C++ code instead of get_nActions.
  */
  HRESULT nActions
    (
     [out,retval] long* nActions
    );

  /** @brief Performs the specified Action on the object.
   @param [in] actionIndex
    0 based index specifying the action to perform.  If it lies outside
    the valid range no action is performed.
   @retval S_OK
   @retval S_FALSE if action could not be performed
   @retval E_INVALIDARG if bad [in] passed
   @note If implementing support for media, refer to the predefined constants in the ::IA2Actions enum.
    */
  HRESULT doAction
    (
     [in] long actionIndex
    );

  /** @brief Returns a description of the specified action of the object.
   @param [in] actionIndex
    0 based index specifying which action's description to return.
    If it lies outside the valid range an empty string is returned.
   @param [out] description
    The returned value is a localized string of the specified action.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
   @retval E_INVALIDARG if bad [in] passed
    */
  [propget] HRESULT description
    (
     [in] long actionIndex,
     [out, retval] BSTR *description
    );

  /** @brief Returns an array of BSTRs describing one or more key bindings, if
   there are any, associated with the specified action.

   The returned strings are the localized human readable key sequences to be
   used to activate each action, e.g. "Ctrl+Shift+D".  Since these key
   sequences are to be used when the object has focus, they are like
   mnemonics (access keys), and not like shortcut (accelerator) keys.

   There is no need to implement this method for single action controls since
   that would be redundant with the standard MSAA programming practice of
   getting the mnemonic from get_accKeyboardShortcut.

   An AT such as an On Screen Keyboard might not expose these bindings but
   provide alternative means of activation.

   Note: the client allocates and passes in an array of pointers.  The server
   allocates the BSTRs and passes back one or more pointers to these BSTRs into
   the array of pointers allocated by the client.  The client is responsible 
   for deallocating the BSTRs.

   @param [in] actionIndex
    0 based index specifying which action's key bindings should be returned.
   @param [in] nMaxBindings
    This parameter is ignored. Refer to @ref _arrayConsideration
	"Special Consideration when using Arrays" for more details.
   @param [out] keyBindings
    An array of BSTRs, allocated by the server, one for each key binding.
	The client must free it with CoTaskMemFree.
   @param [out] nBindings
    The number of key bindings returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there are no key bindings, [out] values are NULL and 0 respectively 
   @retval E_INVALIDARG if bad [in] passed
	*/
  [propget] HRESULT keyBinding
    (
     [in] long actionIndex,
     [in] long nMaxBindings,
     [out, size_is(,nMaxBindings), length_is(,*nBindings)] BSTR **keyBindings,
	 [out, retval] long *nBindings
    );

  /** @brief Returns the non-localized name of specified action.
   @param [in] actionIndex
    0 based index specifying which action's non-localized name should be returned.
   @param [out] name
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
   @retval E_INVALIDARG if bad [in] passed
   */
  [propget] HRESULT name
    (
     [in] long actionIndex,
     [out, retval] BSTR *name
    );

  /** @brief Returns the localized name of specified action.
   @param [in] actionIndex
    0 based index specifying which action's localized name should be returned.
   @param [out] localizedName
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
   @retval E_INVALIDARG if bad [in] passed
   */
  [propget] HRESULT localizedName
    (
     [in] long actionIndex,
     [out, retval] BSTR *localizedName
    );

}
/*************************************************************************
 *
 *  File Name (AccessibleRole.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2013 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. 
 * 
 ************************************************************************/ 



/** Collection of roles

  This enumerator defines an extended set of accessible roles of objects implementing
  the %IAccessible2 interface. These roles are in addition to the MSAA roles obtained
  through the MSAA get_accRole method.  Examples are 'footnote', 'heading', and 
  'label'. You obtain an object's %IAccessible2 roles by calling IAccessible2::role.
*/
enum IA2Role {

  /** Unknown role. The object contains some Accessible information, but its 
   role is not known.
  */
  IA2_ROLE_UNKNOWN = 0,

  /** An object that can be drawn into and to manage events from the objects
   drawn into it.  Also refer to ::IA2_ROLE_FRAME,
   ::IA2_ROLE_GLASS_PANE, and ::IA2_ROLE_LAYERED_PANE. 
  */
  IA2_ROLE_CANVAS = 0x401,

  /// A caption describing another object.
  IA2_ROLE_CAPTION,

  /// Used for check buttons that are menu items.
  IA2_ROLE_CHECK_MENU_ITEM,

  /// A specialized dialog that lets the user choose a color.
  IA2_ROLE_COLOR_CHOOSER,

  /// A date editor.
  IA2_ROLE_DATE_EDITOR,

  /** An iconified internal frame in an ::IA2_ROLE_DESKTOP_PANE. 
   Also refer to ::IA2_ROLE_INTERNAL_FRAME.
  */
  IA2_ROLE_DESKTOP_ICON,

  /** A desktop pane. A pane that supports internal frames and iconified 
   versions of those internal frames.  Also refer to ::IA2_ROLE_INTERNAL_FRAME.
  */
  IA2_ROLE_DESKTOP_PANE,

  /** A directory pane. A pane that allows the user to navigate through 
   and select the contents of a directory. May be used by a file chooser.   
   Also refer to ::IA2_ROLE_FILE_CHOOSER.
  */
  IA2_ROLE_DIRECTORY_PANE,

  /** An editable text object in a toolbar. <b>Deprecated.</b>
   The edit bar role was meant for a text area in a tool bar. However, to detect
   a text area in a tool bar the AT can query the parent.
  */
  IA2_ROLE_EDITBAR,

  /// Embedded (OLE) object.
  IA2_ROLE_EMBEDDED_OBJECT,

  /// Text that is used as an endnote (footnote at the end of a chapter or section).
  IA2_ROLE_ENDNOTE,

  /** A file chooser. A specialized dialog that displays the files in the 
   directory and lets the user select a file, browse a different directory, 
   or specify a filename. May use the directory pane to show the contents of 
   a directory.  
   Also refer to ::IA2_ROLE_DIRECTORY_PANE.
  */
  IA2_ROLE_FILE_CHOOSER,

  /** A font chooser. A font chooser is a component that lets the user pick 
   various attributes for fonts.
  */
  IA2_ROLE_FONT_CHOOSER,

  /** Footer of a document page.
   Also refer to ::IA2_ROLE_HEADER.
  */
  IA2_ROLE_FOOTER,

  /// Text that is used as a footnote.  Also refer to ::IA2_ROLE_ENDNOTE.
  IA2_ROLE_FOOTNOTE,

  /** A container of form controls.  An example of the use of this role is to
   represent an HTML FORM tag.
  */
  IA2_ROLE_FORM,

  /** Frame role. A top level window with a title bar, border, menu bar, etc.  
   It is often used as the primary window for an application.  Also refer to
   ::IA2_ROLE_CANVAS and the MSAA roles of dialog and window.
  */
  IA2_ROLE_FRAME,

  /** A glass pane. A pane that is guaranteed to be painted on top of all panes
   beneath it.  Also refer to ::IA2_ROLE_CANVAS, ::IA2_ROLE_INTERNAL_FRAME, and
   ::IA2_ROLE_ROOT_PANE.
  */
  IA2_ROLE_GLASS_PANE,

  /** Header of a document page.
   Also refer to ::IA2_ROLE_FOOTER.
  */
  IA2_ROLE_HEADER,

  /// Heading.  Use the IAccessible2::attributes level attribute to determine the heading level.
  IA2_ROLE_HEADING,

  /// A small fixed size picture, typically used to decorate components.
  IA2_ROLE_ICON,

  /** An image map object.  Usually a graphic with multiple hotspots, where 
   each hotspot can be activated resulting in the loading of another document
   or section of a document.
  */
  IA2_ROLE_IMAGE_MAP,

  /** An object which is used to allow input of characters not found on a keyboard,
   such as the input of Chinese characters on a Western keyboard.
  */
  IA2_ROLE_INPUT_METHOD_WINDOW,

  /** An internal frame. A frame-like object that is clipped by a desktop pane.  
   The desktop pane, internal frame, and desktop icon objects are often used to 
   create multiple document interfaces within an application.
   Also refer to ::IA2_ROLE_DESKTOP_ICON, ::IA2_ROLE_DESKTOP_PANE, and ::IA2_ROLE_FRAME.
  */
  IA2_ROLE_INTERNAL_FRAME,

  /// An object used to present an icon or short string in an interface.
  IA2_ROLE_LABEL,

  /** A layered pane. A specialized pane that allows its children to be drawn 
   in layers, providing a form of stacking order. This is usually the pane that 
   holds the menu bar as  well as the pane that contains most of the visual 
   components in a window.
   Also refer to ::IA2_ROLE_CANVAS, ::IA2_ROLE_GLASS_PANE, and ::IA2_ROLE_ROOT_PANE.
  */
  IA2_ROLE_LAYERED_PANE,

  /** A section whose content is parenthetic or ancillary to the main content
   of the resource.
  */
  IA2_ROLE_NOTE,

 /** A specialized pane whose primary use is inside a dialog.
   Also refer to MSAA's dialog role.
  */
  IA2_ROLE_OPTION_PANE,

  /** An object representing a page of document content.  It is used in documents
   which are accessed by the user on a page by page basis.
  */
  IA2_ROLE_PAGE,

  /// A paragraph of text.
  IA2_ROLE_PARAGRAPH,

  /** A radio button that is a menu item.
   Also refer to MSAA's button and menu item roles.
  */
  IA2_ROLE_RADIO_MENU_ITEM,

  /** An object which is redundant with another object in the accessible hierarchy.
   ATs typically ignore objects with this role.
  */
  IA2_ROLE_REDUNDANT_OBJECT,

  /** A root pane. A specialized pane that has a glass pane and a layered pane 
   as its children.
   Also refer to ::IA2_ROLE_GLASS_PANE and ::IA2_ROLE_LAYERED_PANE
  */
  IA2_ROLE_ROOT_PANE,

  /** A ruler such as those used in word processors.
  */
  IA2_ROLE_RULER,

  /** A scroll pane. An object that allows a user to incrementally view a large 
   amount of information.  Its children can include scroll bars and a viewport.
   Also refer to ::IA2_ROLE_VIEW_PORT and MSAA's scroll bar role.
  */
  IA2_ROLE_SCROLL_PANE,

  /** A container of document content.  An example of the use of this role is to
   represent an HTML DIV tag.  A section may be used as a region.  A region is a 
   group of elements that together form a perceivable unit.  A region does not 
   necessarily follow the logical structure of the content, but follows the 
   perceivable structure of the page.  A region may have an attribute in the set 
   of IAccessible2::attributes which indicates that it is "live".  A live region 
   is content that is likely to change in response to a timed change, a user 
   event, or some other programmed logic or event.
  */
  IA2_ROLE_SECTION,

  /// Object with graphical representation used to represent content on draw pages.
  IA2_ROLE_SHAPE,

  /** A split pane. A specialized panel that presents two other panels at the 
   same time. Between the two panels is a divider the user can manipulate to make 
   one panel larger and the other panel smaller.
  */
  IA2_ROLE_SPLIT_PANE,

  /** An object that forms part of a menu system but which can be "undocked" 
   from or "torn off" the menu system to exist as a separate window.
  */
  IA2_ROLE_TEAR_OFF_MENU,

  /// An object used as a terminal emulator.
  IA2_ROLE_TERMINAL,

  /// Collection of objects that constitute a logical text entity.
  IA2_ROLE_TEXT_FRAME,

  /** A toggle button. A specialized push button that can be checked or unchecked, 
   but does not provide a separate indicator for the current state.
   Also refer to MSAA's roles of push button, check box, and radio button.
   <BR><B>Note:</B> IA2_ROLE_TOGGLE_BUTTON should not be used.  Instead, use MSAA's 
   ROLE_SYSTEM_PUSHBUTTON and STATE_SYSTEM_PRESSED.
  */
  IA2_ROLE_TOGGLE_BUTTON,

  /** A viewport. An object usually used in a scroll pane. It represents the 
   portion of the entire data that the user can see. As the user manipulates 
   the scroll bars, the contents of the viewport can change.
   Also refer to ::IA2_ROLE_SCROLL_PANE.
  */
  IA2_ROLE_VIEW_PORT,

  /** An object containing content which is complementary to the main content of
   a document, but remains meaningful when separated from the main content.  There
   are various types of content that would appropriately have this role.  For example,
   in the case where content is delivered via a web portal to a web browser, this may
   include but not be limited to show times, current weather, related articles, or
   stocks to watch.  The complementary role indicates that contained content is relevant
   to the main content.  If the complementary content is completely separable main
   content, it may be appropriate to use a more general role.
  */
  IA2_ROLE_COMPLEMENTARY_CONTENT,
  
  /** An object representing a navigational landmark, a region on a page to
   which the user may want quick access, such as navigating, searching,
   perusing the primary content.
  */
  IA2_ROLE_LANDMARK,

  /**
   * A bar that serves as a level indicator to, for instance, show
   * the strength of a password or the charge of a battery.
   */
  IA2_ROLE_LEVEL_BAR,

  /** Content previously deleted or proposed for deletion, e.g. in revision
   history or a content view providing suggestions from reviewers.
   */
  IA2_ROLE_CONTENT_DELETION,

  /** Content previously inserted or proposed for insertion, e.g. in revision
   history or a content view providing suggestions from reviewers.
   */
  IA2_ROLE_CONTENT_INSERTION
};

/*************************************************************************
 *
 *  File Name (AccessibleStates.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. 
 * 
 ************************************************************************/ 



typedef long AccessibleStates;

/** %IAccessible2 specific state bit constants

  This enum defines the state bits returned by IAccessible2::states.  The 
  %IAccessible2 state bits are in addition to those returned by MSAA.
*/
enum IA2States {

/** Indicates a window is currently the active window, or is an active subelement 
  within a container or table.

 This state can be used to indicate the current active item in a container, even 
  if the container itself is not currently active. In other words this would indicate
  the item that will get focus if you tab to the container.

 This information is important for knowing what to report for trees and potentially 
  other containers in a virtual buffer.

 Also, see ::IA2_STATE_MANAGES_DESCENDANTS for more information.
*/
IA2_STATE_ACTIVE =					0x1,

/** Indicates that the object is armed.

 Used to indicate that the control is "pressed" and will be invoked when the 
  actuator, e.g. a mouse button, is "released".  An AT which either monitors the 
  mouse or synthesizes mouse events might need to know that, and possibly a talking
  interface would even let the user know about it.  It could also potentially be
  useful to on screen keyboards or test tools since the information does indicate
  something about the state of the interface, for example, code operating asynchronously
  might need to wait for the armed state to change before doing something else.

*/
IA2_STATE_ARMED =					0x2,

/** Indicates the user interface object corresponding to this object no longer exists. */
IA2_STATE_DEFUNCT =					0x4,

/** An object with this state has a caret and implements the IAccessibleText interface.
  
 Such fields may be read-only, so STATE_SYSTEM_READONLY is valid in combination
  with IA2_STATE_EDITABLE.

*/
IA2_STATE_EDITABLE =				0x8,

/** Indicates the orientation of this object is horizontal. */
IA2_STATE_HORIZONTAL =				0x10,

/** Indicates this object is minimized and is represented only by an icon. */
IA2_STATE_ICONIFIED =				0x20,

/** Indicates an input validation failure. */
IA2_STATE_INVALID_ENTRY =			0x40,

/** Indicates that this object manages its children.

 Note: Due to the fact that MSAA's WinEvents don't allow the active child index
  to be passed on the IA2_EVENT_ACTIVE_DESCENDANT_CHANGED event, the manages
  descendants	scheme can't be used.  Instead the active child object has to fire
  MSAA's EVENT_OBJECT_FOCUS.  In a future release a new event mechanism may be
  added to provide for event specific data to be passed with the event.  At that
  time the IA2_EVENT_ACTIVE_DECENDENT_CHANGED event and
  IA2_STATE_MANAGES_DESCENDANTS state would be useful.
*/
IA2_STATE_MANAGES_DESCENDANTS =		0x80,

/** Indicates that an object is modal.

 Modal objects have the behavior that something must be done with the object 
  before the user can interact with an object in a different window.
*/
IA2_STATE_MODAL =					0x100,

/** Indicates this text object can contain multiple lines of text. */
IA2_STATE_MULTI_LINE =				0x200,

/** Indicates this object paints every pixel within its rectangular region. */
IA2_STATE_OPAQUE =					0x400,

/** Indicates that user interaction is required.

 An example of when this state is used is when a field in a form must be filled 
  before a form can be processed.
*/
IA2_STATE_REQUIRED =				0x800,

/** Indicates an object which supports text selection.

 Note: This is different than MSAA STATE_SYSTEM_SELECTABLE.
*/
IA2_STATE_SELECTABLE_TEXT =			0x1000,

/** Indicates that this text object can contain only a single line of text. */
IA2_STATE_SINGLE_LINE =				0x2000,

/** Indicates that the accessible object is stale.

 This state is used when the accessible object no longer accurately 
  represents the state of the object which it is representing such as when an
  object is transient or when an object has been or is in the process of being
  destroyed or when the object's index in its parent has changed.
*/
IA2_STATE_STALE =					0x4000,

/** Indicates that the object implements autocompletion.

 This state indicates that a text control will respond to the input of 
 one ore more characters and cause a sub-item to become selected.  The 
 selection may also result in events fired on the parent object.
*/
IA2_STATE_SUPPORTS_AUTOCOMPLETION =	0x8000,

/** Indicates this object is transient.

 An object has this state when its parent object has the state ::IA2_STATE_MANAGES_DESCENDANTS.
 For example, a list item object may be managed by its parent list object and may only 
 exist as long as the object is actually rendered.  Similarly a table cell's accessible 
 object may exist only while the cell has focus.  However, from the perspective of an 
 assistive technology a transient object behaves like a non-transient object.  As a 
 result it is likely that this state is not of use to an assistive technology, but it 
 is provided in case an assistive technology determines that knowledge of the transient 
 nature of the object is useful and also for harmony with the Linux accessibility API.

 Also, see ::IA2_STATE_MANAGES_DESCENDANTS for more information.
 */
IA2_STATE_TRANSIENT =				0x10000,

/** Indicates the orientation of this object is vertical. */
IA2_STATE_VERTICAL =				0x20000,

/** Indicates this object is checkable.

 The standard checkable objects are check boxes, radio buttons, check box menu
 items, radio menu items, and toggle buttons.  Since assistive technology will
 determine that these objects are checkable via the object's role the checkable
 state is not required.  However, this state is necessary in those cases where
 an object has a role which is not one of the previously mentioned roles.  An
 example is a table cell which indicates whether or not an email has an attachment,
 whether or not an mail is considered spam, and whether or not an email has been read.
 */
IA2_STATE_CHECKABLE =				0x40000,

/** Indicates this object is pinned.

 This state indicates that an object is fixed at a certain location.  One example
 is a browser tab that when pinned cannot be moved until unpinned.  Another example
 is a movable or floating object that when pinned remains in its pinned location
 until being unpinned.
 */
IA2_STATE_PINNED =					0x80000

};
/*************************************************************************
 *
 *  File Name (Accessible2.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2013 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. 
 * 
 ************************************************************************/ 

/** @mainpage

 @section _interfaces Interfaces
  IAccessible2\n
  IAccessible2_2\n
  IAccessibleAction\n
  IAccessibleApplication\n
  IAccessibleComponent\n
  IAccessibleDocument\n
  IAccessibleEditableText\n
  IAccessibleHypertext\n
  IAccessibleHypertext2\n
  IAccessibleHyperlink\n
  IAccessibleImage\n
  IAccessibleRelation\n
  IAccessibleTable [Deprecated]\n
  IAccessibleTable2\n
  IAccessibleTableCell\n
  IAccessibleText\n
  IAccessibleText2\n
  IAccessibleValue

 @section _structs Structs
  IA2Locale\n
  IA2TableModelChange\n
  IA2TextSegment

 @section _enums Enums
  ::IA2Actions values are predefined actions for use when implementing support for HTML5 media.\n
  ::IA2CoordinateType values define the requested coordinate type (screen or parent window).\n
  ::IA2EventID values identify events.\n
  ::IA2Role values defines roles which are in addition to the existing MSAA roles.\n
  ::IA2ScrollType values define where to place an object or substring on the screen.\n
  ::IA2States values define states which are in addition to the existing MSAA states.\n
  ::IA2TableModelChangeType values describe the kinds of changes made to a table (insert, delete, update).\n
  ::IA2TextBoundaryType values define the requested text unit (character, word, sentence, line, paragraph).\n
  ::IA2TextSpecialOffsets values define special offsets for use in the text interfaces.

 @section _constants Constants
  @ref grpRelations

 @section _misc Miscellaneous
  @ref _licensePage "BSD License"\n
  @ref _generalInfo "General Information"\n

 @page _licensePage BSD License
  %IAccessible2 IDL Specification

  Copyright (c) 2007, 2013 Linux Foundation\n
  Copyright (c) 2006 IBM Corporation\n
  Copyright (c) 2000, 2006 Sun Microsystems, Inc.\n
  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
  <a href="http://www.linuxfoundation.org/collaborate/workgroups/accessibility/trademark-policy">
  Linux Foundation Trademark Policy</a> to indicate compliance with the %IAccessible2 specification. 

 @page _generalInfo General Information 
  The following information is applicable to two or more interfaces.

 @ref _errors\n
 @ref _memory\n
 &nbsp;&nbsp;@ref _arrayConsideration\n
 @ref _indexes\n
 @ref _enumBase\n
 @ref _specialOffsets\n
 @ref _dicoveringInterfaces\n
 @ref _changingInterfaces\n
 @ref _applicationInfo\n
 @ref _childIDs\n
 @ref _variants\n
 @ref _iaaction-iahyperlink\n
 @ref _trademark

 @section _errors Error Handling
  HRESULT values are defined by the Microsoft&reg; Win32&reg; API.  For more information, refer to
  <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa378137%28v=vs.85%29.aspx">
  Interpreting HRESULT Values</a> in MSDN&reg;.

  Note that the S_FALSE return value is considered a non-error value and the 
  SUCCEEDED macro will return TRUE.  S_FALSE is used when there is no failure
  but there was nothing valid to return, e.g. in IAccessible2::attributes when
  there are no attributes.  When S_FALSE is returned [out] pointer types should 
  be NULL and [out] longs should generally be 0, but sometimes -1 is used such
  as IAccessible2::indexInParent, IAccessibleText::caretOffset, and
  IAccessibleHypertext::hyperlinkIndex.

  Note that for BSTR [out] variables common COM practice is that the server does 
  the SysAllocString and the client does the SysFreeString.  Also note that when
  NULL is returned there is no need for the client to call SysFreeString.  Please
  refer to the documentation for each method for more details regarding error handling.

 @section _memory Memory Management
  The following memory management issues should be considered:
  @li Although [out] BSTR variables are declared by the client, their space is 
   allocated by the server.  They need to be freed with SysFreeString by the 
   client at end of life; the same is true when BSTRs are used in structs or 
   arrays which are passed to the server.
  @li If there is no valid [out] BSTR to return, the server should return S_FALSE and 
   assign NULL to the output, e.g. *theOutBSTR = NULL;. 
  @li COM interfaces need to be referenced with AddRef when used and dereferenced
   with Release at end of life.
  @li Single [out] longs, HWNDs, booleans, and structs are declared by the caller
   and passed by reference. The marshaller does all the memory management.
  
  The following articles may be helpful for understanding memory management issues:
  @li An article by Don Box in a
   <a href="http://www.microsoft.com/msj/1196/activex1196.aspx">Q & A section</a>
   of the November 1996 edition of the Microsoft Systems Journal.
  @li A posting to a CodeGuru forum, 
   <a href="http://www.codeguru.com/forum/showthread.php?t=364511">Windows SDK 
   String: What are the rules for BSTR allocation and deallocation?</a>

 @subsection _arrayConsideration Special Consideration when using Arrays
  There are several methods which return arrays.  In the case of IAccessible2::relations
  and IAccessibleRelation::targets the client must allocate and free the arrays.

  For the remaining methods which return arrays, the server must allocate the array
  and the client must free the array when no longer needed.  These methods are
  IAccessible2::extendedStates, IAccessible2::localizedExtendedStates,
  IAccessible2_2::relationTargetsOfType, IAccessibleAction::keyBinding, 
  IAccessibleHypertext2::hyperlinks, IAccessibleTable::selectedChildren, 
  IAccessibleTable::selectedColumns, IAccessibleTable::selectedRows,
  IAccessibleTable2::selectedCells, IAccessibleTable2::selectedColumns,
  IAccessibleTable2::selectedRows, IAccessibleTableCell::columnHeaderCells,
  and IAccessibleTableCell::rowHeaderCells.
  For those methods, the server must allocate both the top level array and any storage 
  associated with it, e.g. for BSTRs.  The server must allocate the arrays with 
  CoTaskMemAlloc and any BSTRs with SysAllocString.  The client must use CoTaskMemFree
  to free the array and any BSTRs must be freed with SysFreeString.  
  
  Also, the IDL for IAccessible2::extendedStates, IAccessible2::localizedExtendedStates, 
  IAccessibleAction::keyBinding, IAccessibleTable::selectedChildren, 
  IAccessibleTable::selectedColumns, and IAccessibleTable::selectedRows includes an
  extraneous [in] parameter for the caller to specify the max size of the array.
  This parameter will be ignored by the COM server.

 @section _indexes Zero and One Based Indexes
  Unless otherwise specified all offsets and indexes are 0 based. 

 @section _enumBase Enum Base
  Note that enums start at 0.

 @section _specialOffsets Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods
  IAccessibleText and IAccessibleEditableText can use one or more of the following
  special offset values.  They are defined in the ::IA2TextSpecialOffsets enum.
  @li Using ::IA2_TEXT_OFFSET_LENGTH (-1) as an offset in any of the IAccessibleText or
   IAccessibleEditableText methods is the same as specifying the length of the string.
  @li Using ::IA2_TEXT_OFFSET_CARET (-2) as an offset for IAccessibleText::textBeforeOffset, 
   IAccessibleText::textAtOffset, and IAccessibleText::textAfterOffset indicates that the 
   text related to the physical location of the caret should be used.  This is needed for 
   applications that consider the character offset of the end of one line (as reached by 
   pressing the End key) the same as the offset of the first character on the next line.
   Since the same offset is associated with two different lines a special means is needed 
   to fetch text from the line where the caret is physically located.

 @section _dicoveringInterfaces Discovery of Interfaces
  In general AT (Assistive Technology) should try IAccessible2 interfaces, followed by using 
  the MSAA (Microsoft&reg; Active Accessibility&reg;) interfaces.  (In cases where the an application
  is known to have custom interfaces which provide information not supplied by IAccessible2
  or MSAA, then those custom interfaces can be used.)  The AT can then, by default, support
  unknown IAccessible2/MSAA applications, without the application developers having to request
  AT vendors for support on an individual application by application basis.

  When you have a reference to an IAccessible and require a reference to an IAccessible2 use 
  QueryService as follows:
  @code
  // pAcc is a reference to the accessible object's IAccessible interface. 
  IServiceProvider *pService = NULL; 
  hr = pAcc->QueryInterface(IID_IServiceProvider, (void **)&pService); 
  if(SUCCEEDED(hr)) { 
    IAccessible2 *pIA2 = NULL; 
    hr = pService->QueryService(IID_IAccessible, IID_IAccessible2, (void**)&pIA2); 
    if (SUCCEEDED(hr) && pIA2) { 
      // The control supports IAccessible2. 
      // pIA2 is the reference to the accessible object's IAccessible2 interface.
    } 
  } 
  @endcode

  @section _changingInterfaces Changing between Accessible Interfaces
  Note that developers must always implement MSAA's IAccessible and, if needed, some
  of the interfaces in the set of IAccessible2 interfaces.  Although the IAccessible2
  IDL is coded such that IAccessible2 is a subclass of MSAA's IAccessible, none of
  MSAA's IAccessible methods are redefined by IAccessible2.

  QueryService must be used to switch from a reference to an MSAA IAccessible interface 
  to another interface.  This has been 
  <a href="http://www.atia.org/files/public/Introducing_IAccessibleEx.doc">
  documented</a> and the pertinent facts have been extracted below: 

  @par 
   Why use QueryService instead of just using QueryInterface to get IAccessibleEx 
   directly? The reason is that since MSAA 2.0, clients don't talk to a server's 
   IAccessible interface directly; instead they talk to an intermediate MSAA-provided 
   wrapper that calls through to the original IAccessible. This wrapper provides services 
   such as implementing IDispatch, supplying information from MSAA 2.0's Dynamic Annotation 
   service, and scaling locations when running on Windows Vista with DPI scaling enabled. 
   QueryService is the supported way to expose additional interfaces from an existing 
   IAccessible and was originally used by MSHTML to expose IHTMLElement objects corresponding 
   to IAccessibles. QueryService is often more convenient for servers to implement than 
   QueryInterface because it does not have the same requirements for preserving object 
   identity or symmetry/transitivity as QueryInterface, so QueryService allows servers to 
   easily implement the interface on the same object or a separate object. The latter is 
   often hard to do with QueryInterface unless the original object supports aggregation. 

  Two related references in MSDN&reg; are: 
  @li <a href="http://msdn.microsoft.com/en-us/library/ms696078(VS.85).aspx">
  "Using QueryService to expose a native object model interface for an IAccessible object"</a>
  @li <a href="http://msdn.microsoft.com/en-us/library/ms528415.aspx#acc_obj"> 
  "Accessing the Internet Explorer Object Associated with an Accessible Object"</a>

  Based on this information from Microsoft, QueryService must be used to switch back and forth 
  between a reference to an MSAA IAccessible interface and any of the IAccessible2 interfaces. 

  Regarding switching between any of the IAccessible2 interfaces, applications implementing
  IAccessible2 should implement the IAccessible2 interfaces on a single object since ATs
  will be using QueryInterface to switch between the IAccessilbe2 interfaces.  Implementing
  the IAccessible2 interfaces on separate objects would require the use of QueryService.
  There is one exception, IAccessibleApplication can be implemented on a separate object so
  its common code doesn't have to be included in each accessible object.  ATs should use
  QueryService to access IAccessibleApplication.

 @section _applicationInfo Access to Information about the Application
  Servers implementing IAccessible2 should provide access to the IAccessibleApplication 
  interface via QueryService from any object so that ATs can easily determine specific 
  information about the application such as its name or version.

 @section _childIDs Child IDs
  The IAccessible2 interfaces do not support child IDs, i.e. simple child elements.
  Full accessible objects must be created for each object that supports IAccessible2.
  Therefore MSAA's get_accChild should never return a child ID (other than CHILDID_SELF)
  for an object that implements any of the IAccessible2 interfaces.

  Microsoft's UI Automation specification has the same limitation and this was resolved
  in the UI Automation Express specification by adding IAccessibleEx::GetObjectForChild
  and IAccessibleEx::GetIAccessiblePair.  These methods allow mapping back and forth 
  between an IAccessibleEx and an {IAccessible, Child ID} pair.  A future version of 
  IAccessible2 may include similar methods to map back and forth between an IAccessible2
  and an {IAccessible, Child ID} pair.

 @section _variants VARIANTs
  Some methods return a VARIANT.  Implementers need to make sure that the return type is 
  specified, i.e. VT_I4, VT_IDISPATCH, etc.  The methods that return VARIANTs are 
  IAccessibleHyperlink::anchor, IAccessibleHyperlink::anchorTarget, IAccessibleValue::currentValue,
  IAccessibleValue::maximumValue, IAccessibleValue::minimumValue.

 @section _iaaction-iahyperlink IAccessibleHyperlink as subclass of IAccessibleAction
  In this version of the IDL, IAccessibleHyperlink is a subclass of IAccessibleAction.  
  However, there is no practical need for that inheritance and in some cases, such as
  an image map of smart tags, it doesn't make sense because such an image map doesn't 
  have actionable objects; it's the secondary smart tags that are actionable.  As a 
  result, implementations should not rely on the inheritance as it may be removed in 
  a later version of the IDL.

 @section _trademark Trademark Attribution
  The names of actual companies and products mentioned herein may be the trademarks of
  their respective owners.  In particular, Active Accessibility, Microsoft, MSDN, and Win32
  are trademarks of the Microsoft group of companies in the U.S.A. and/or other countries.

**/








/** A structure defining the locale of an accessible object.
 
IAccessible2::locale returns this struct.
*/
typedef struct IA2Locale {
  BSTR language; ///< ISO 639-1 Alpha-2 two character language code
  BSTR country;  ///< ISO 3166-1 Alpha-2 two character country code
  BSTR variant;  ///< Application specific variant of the locale
} IA2Locale;

/** @brief This interface exposes the primary set of information about an
 IAccessible2 enabled accessible object.

 This interface must always be provided for objects that support some
 portion of the collection of the %IAccessible2 interfaces.

 Please refer to @ref _changingInterfaces "Changing between Accessible Interfaces"
 for special considerations related to use of the MSAA IAccessible interface and 
 the set of %IAccessible2 interfaces.
 */
[object, uuid(E89F726E-C4F4-4c19-BB19-B647D7FA8478)]
interface IAccessible2 : IAccessible
{

  /** @brief Returns the number of accessible relations for this object.
   @param [out] nRelations
   @retval S_OK
  */
  [propget] HRESULT nRelations
    (
     [out, retval] long *nRelations
    );

  /** @brief Returns one accessible relation for this object.
   @param [in] relationIndex
     0 based
   @param [out] relation
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT relation
    (
     [in] long relationIndex,
     [out, retval] IAccessibleRelation **relation
    );

  /** @brief Returns multiple accessible relations for this object.
   @param [in] maxRelations
     maximum size of the array allocated by the client
   @param [out] relations
    The array of accessible relation objects.  Note that this array is to be
	allocated by the client and freed when no longer needed.  Refer to @ref 
	_arrayConsideration "Special Consideration when using Arrays" for more details.
   @param [out] nRelations 
    actual number of relations in the returned array (not more than maxRelations)
   @retval S_OK
   @retval S_FALSE if there are no relations, nRelations is set to 0
   @note As a performant alternative, client code should consider using IAccessible2_2::relationTargetsOfType.
  */
  [propget] HRESULT relations
    (
     [in] long maxRelations, 
     [out, size_is(maxRelations), length_is(*nRelations)]
       IAccessibleRelation **relations, 
     [out, retval] long *nRelations 
    );

  /** @brief Returns the role of an %IAccessible2 object.
   @param [out] role
    The role of an %IAccessible2 object.
   @retval S_OK
   @note 
   @li For convenience MSAA roles are also passed through this method so the
    AT doesn't have to also fetch roles through MSAA's get_accRole.
   @li %IAccessible2 roles should not be passed through MSAA's get_accRole.
   @li For compatibility with non IAccessible2 enabled ATs, IAccessible2 
    applications should also add support to get_accRole to return the closest 
	MSAA role or ROLE_SYSTEM_CLIENT (the MSAA defined default role) if there 
	is not a good match.  
   @li This method is missing a [propget] prefix in the IDL.  The result is the
    method is named role in generated C++ code instead of get_role.
  */
  HRESULT role
    (
     [out, retval] long *role
    );

  /** @brief Makes an object visible on the screen.
   @param [in] scrollType
    Defines where the object should be placed on the screen.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT scrollTo
    (
     [in] enum IA2ScrollType scrollType 
    );

  /** @brief Moves the top left of an object to a specified location.

   @param [in] coordinateType
    Specifies whether the coordinates are relative to the screen or the parent object.
   @param [in] x
    Defines the x coordinate.
   @param [in] y
    Defines the y coordinate.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT scrollToPoint
    (
     [in] enum IA2CoordinateType coordinateType,
	 [in] long x,
	 [in] long y 
    );

  /** @brief Returns grouping information.
   
   Used for tree items, list items, tab panel labels, radio buttons, etc.
   Also used for collections of non-text objects.

   @param [out] groupLevel
    1 based, 0 indicates that this value is not applicable
   @param [out] similarItemsInGroup
    1 based, 0 indicates that this value is not applicable
   @param [out] positionInGroup
    1 based, 0 indicates that this value is not applicable. This is an index
    into the objects in the current group, not an index into all the objects
    at the same group level.
   @retval S_OK if at least one value is valid
   @retval S_FALSE if no values are valid, [out] values are 0s
   @note This method is meant to describe the nature of an object's containment
    structure.  It's exposed by trees, tree grids, nested lists, nested menus,
    but not headings, which uses the level object attribute.  It is also exposed
    by radio buttons (with groupLevel == 0).
   @note This is normally not implemented on a combo box to describe the nature
    of its contents.  Normally an AT will get that information from its child list 
    object.  However, in some cases when non-edit combo boxes are not able to be structured
    such that the list is a child of the combo box, this method is implemented on
    the combo box itself. ATs can use this interface if a child list is not found.
	*/
  [propget] HRESULT groupPosition
    (
     [out] long *groupLevel,
     [out] long *similarItemsInGroup,
     [out, retval] long *positionInGroup 
    );

  /** @brief Returns the bit strip containing any IAccessible2 states.
  
   The IAccessible2 states are in addition to the MSAA states and are defined in
   the IA2States enum.

   @param [out] states
   @retval S_OK
  */
  [propget] HRESULT states
    (
	 [out, retval] AccessibleStates *states
    );

  /** @brief Returns the extended role.
   
   An extended role is a role which is dynamically generated by the application.
   It is not predefined by the %IAccessible2 specification.
   
   @param [out] extendedRole
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL
  */
  [propget] HRESULT extendedRole
    (
	 [out, retval] BSTR *extendedRole
    );

  /** @brief Returns the localized extended role.
   @param [out] localizedExtendedRole
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL
  */
  [propget] HRESULT localizedExtendedRole
    (
	 [out, retval] BSTR *localizedExtendedRole
    );

  /** @brief Returns the number of extended states.
   @param [out] nExtendedStates
   @retval S_OK
  */
  [propget] HRESULT nExtendedStates
    (
     [out, retval] long *nExtendedStates
    );

  /** @brief Returns the extended states (array of strings).

   An extended state is a state which is dynamically generated by the application.
   It is not predefined by the %IAccessible2 specification.

   @param [in] maxExtendedStates
    This parameter is ignored. Refer to @ref _arrayConsideration 
	"Special Consideration when using Arrays" for more details.
   @param [out] extendedStates
    This array is allocated by the server.  The client must free it with CoTaskMemFree.
   @param [out] nExtendedStates
    The number of extended states returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there are no states, [out] values are NULL and 0 respectively
  */
  [propget] HRESULT extendedStates
    (
     [in] long maxExtendedStates,
     [out, size_is(,maxExtendedStates), length_is(,*nExtendedStates)] BSTR **extendedStates,
     [out, retval] long *nExtendedStates
    );

  /** @brief Returns the localized extended states (array of strings).

   @param [in] maxLocalizedExtendedStates
    This parameter is ignored. Refer to @ref _arrayConsideration 
	"Special Consideration when using Arrays" for more details.
   @param [out] localizedExtendedStates
    This array is allocated by the server.  The client must free it with CoTaskMemFree. 
   @param [out] nLocalizedExtendedStates
    The number of localized extended states returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there are no states, [out] values are NULL and 0 respectively
  */
  [propget] HRESULT localizedExtendedStates
    (
     [in] long maxLocalizedExtendedStates,
     [out, size_is(,maxLocalizedExtendedStates), length_is(,*nLocalizedExtendedStates)] BSTR **localizedExtendedStates,
     [out, retval] long *nLocalizedExtendedStates
    );

  /** @brief Returns the unique ID.
   
   The uniqueID is an identifier for this object, is unique within the
   current window, and remains the same for the lifetime of the accessible
   object. 
   
   The uniqueID is not related to:
   - the MSAA objectID which is used by the server to disambiguate between
   IAccessibles per HWND or
   - the MSAA childID which is used to disambiguate between children being
   managed by an IAccessible.

   This value is provided so the AT can have access to a unique runtime persistent 
   identifier even when not handling an event for the object.
   
   An example of when this value is useful is if the AT wants to build a cache. 
   The AT could cache the uniqueIDs in addition to other data being cached. 
   When an event is fired the AT could map the uniqueID to its internal model.
   Thus, if there's a REORDER/SHOW/HIDE event the AT knows which part of the 
   internal structure has been invalidated and can refetch just that part.

   This value can also be used by an AT to determine when the current control
   has changed. If the role is the same for two controls that are adjacent in 
   the tab order, this can be used to detect the new control.

   Another use of this value by an AT is to identify when a grouping object has 
   changed, e.g. when moving from a radio button in one group to a radio button in a 
   different group.

   One means of implementing this would be to create a factory with a 32 bit number 
   generator and a reuse pool.  The number generator would emit numbers starting 
   at 1.  Each time an object's life cycle ended, its number would be saved into a 
   reuse pool.  The number generator would be used whenever the reuse pool was empty.

   Another way to create a unique ID is to generate it from a pointer value, e.g. an
   object's address. That would be unique because no two active objects can use the
   same allocated memory space.

   @param [out] uniqueID
   @retval S_OK
  */
  [propget] HRESULT uniqueID
    (
     [out, retval] long *uniqueID
    );

  /** @brief Returns the window handle for the parent window which contains this object.

   This is the same window handle which will be passed for any events that occur on the 
   object, but is cached in the accessible object for use when it would be helpful to 
   access the window handle in cases where an event isn't fired on this object.

   A use case is when a screen reader is grabbing an entire web page on a page load. 
   Without the availability of windowHandle, the AT would have to get the window handle
   by using WindowFromAccessibleObject on each IAccessible, which is slow because it's 
   implemented by oleacc.dll as a loop which crawls up the ancestor chain and looks for 
   a ROLE_WINDOW object, mapping that back to a window handle.
   
   @param [out] windowHandle
   @retval S_OK
  */
  [propget] HRESULT windowHandle
    (
     [out, retval] HWND *windowHandle
    );
 
  /** @brief Returns the index of this object in its parent object.
   @param [out] indexInParent
     0 based; -1 indicates there is no parent; the upper bound is the value 
	 returned by the parent's IAccessible::get_accChildCount.
   @retval S_OK
   @retval S_FALSE if no parent, [out] value is -1
  */
  [propget] HRESULT indexInParent
    (
     [out, retval] long *indexInParent
    );

  /** @brief Returns the IA2Locale of the accessible object. 
   @param [out] locale
   @retval S_OK
  */
  [propget] HRESULT locale
    (
     [out, retval] IA2Locale *locale
    );

  /** @brief Returns the attributes specific to this object, such as a cell's formula.
   @param [out] attributes
   @retval S_OK
   @retval S_FALSE returned if there is nothing to return, [out] value is NULL
  */
  [propget] HRESULT attributes
    (
     [out, retval] BSTR *attributes
    );

}

/*************************************************************************
 *
 *  File Name (Accessible2_2.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2013 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. 
 * 
 ************************************************************************/ 






/** @brief This interface exposes the primary set of information about an
 IAccessible2 enabled accessible object.

 This interface must always be provided for objects that support some
 portion of the collection of the %IAccessible2 interfaces.

 Please refer to @ref _changingInterfaces "Changing between Accessible Interfaces"
 for special considerations related to use of the MSAA IAccessible interface and 
 the set of %IAccessible2 interfaces.
 */
[object, uuid(6C9430E9-299D-4E6F-BD01-A82A1E88D3FF)]
interface IAccessible2_2 : IAccessible2
{
  /** @brief Returns the attribute value of a specified attribute specific to this object.
   @param [in] name
   @param [out] attribute
   @retval S_OK
   @retval S_FALSE returned if there is nothing to return, [out] value is NULL.
   @retval E_INVALIDARG if bad [in] passed.
   @note The output value is a VARIANT.  Typically it will be a VT_BSTR, but there
     are some cases where it will be a VT_I4 or VT_BOOL.  Refer to the <a href=
     "http://www.linuxfoundation.org/collaborate/workgroups/accessibility/iaccessible2/objectattributesIAccessible2">
     Object Attributes specification</a> for more information.
  */
  [propget] HRESULT attribute
    (
     [in] BSTR name,
     [out, retval] VARIANT *attribute
    );

  /** @brief Returns the deepest hypertext accessible in the subtree of this object, and the caret offset within it.
   @param [out] accessible
   @param [out] caretOffset
   @retval S_OK
   @retval S_FALSE returned if there is no caret in any of the objects in the subtree, [out] accessible is NULL and [out] caretOffset is -1.
  */
  [propget] HRESULT accessibleWithCaret
    (
     [out] IUnknown **accessible,
     [out, retval] long *caretOffset
    );

  /** @brief Returns relation targets for a specified target type.
   @param [in] type
    The requested @ref grpRelations "relation type".
   @param [in] maxTargets
    The number of targets requested.  0 indicates that all targets should be returned.
   @param [out] targets
    This array is allocated by the server.  The client must free it with CoTaskMemFree.
   @param [out] nTargets
    The number of targets returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there are no targets, [out] values are NULL and 0 respectively.
   @retval E_INVALIDARG if bad [in] passed.
  */
  [propget] HRESULT relationTargetsOfType
    (
     [in] BSTR type,
     [in] long maxTargets,
     [out, size_is(,*nTargets)] IUnknown ***targets,
     [out, retval] long *nTargets
    );

}

/*************************************************************************
 *
 *  File Name (AccessibleComponent.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. 
 * 
 ************************************************************************/ 





/** A value specifying a color in ARGB format, where each 8 bit color component
specifies alpha, red, green, and blue respectively.  The alpha value is optional.
*/
typedef long IA2Color;

/** @brief This interface is implemented by any object that can be rendered 
 on the screen.

 This interface provides the standard mechanism for an assistive technology
  to retrieve information concerning the graphical representation of an object. 
  Coordinates used by the functions of this interface are specified in
  different coordinate systems.  Their scale is the same and is equal to
  that of the screen coordinate system.  In other words all coordinates
  are measured in pixels.  They differ in their respective origin:
  <ul>
   <li>The screen coordinate system has its origin in the upper left
    corner of the current screen.</li>
   <li>The origin of the parent coordinate system is the upper left corner
    of the parent's bounding box.  With no parent the screen coordinate
    system is used instead.</li>
  </ul>
*/
[object, uuid(1546D4B0-4C98-4bda-89AE-9A64748BDDE4)]
interface IAccessibleComponent : IUnknown
{

  /** @brief Returns the location of the upper left corner of the object's
    bounding box relative to the immediate parent object.
	
	The coordinates of the bounding box are given relative to the parent's 
	coordinate system. The coordinates of the returned position are relative 
	to this object's parent or relative to the screen on which this object
    is rendered if it has no parent. If the object is not on any screen
    the returned position is (0,0).
   
   @param [out] x
   @param [out] y
   @retval S_OK
  */
  [propget] HRESULT locationInParent
    (
	 [out] long *x,
     [out, retval] long *y
    );

  /** @brief Returns the foreground color of this object.
   @param [out] foreground
    The returned color is the foreground color of this object or, if
    that is not supported, the default foreground color.
   @retval S_OK
  */ 
  [propget] HRESULT foreground
    (
     [out, retval] IA2Color *foreground
    );

   /** @brief Returns the background color of this object.
    @param [out] background
     The returned color is the background color of this object or, if
     that is not supported, the default background color.
    @retval S_OK
   */ 
  [propget] HRESULT background
    (
     [out, retval] IA2Color *background
    );
}
/*************************************************************************
 *
 *  File Name (AccessibleValue.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. 
 * 
 ************************************************************************/ 





/** @brief This interface gives access to a single numerical value.

 The %IAccessibleValue interface represents a single numerical value and should 
  be implemented by any class that supports numerical value like progress bars 
  and spin boxes.  This interface lets you access the value and its upper and 
  lower bounds.
*/
[object, uuid(35855B5B-C566-4fd0-A7B1-E65465600394)]
interface IAccessibleValue : IUnknown
{

  /** @brief Returns the value of this object as a number.
        
   The exact return type is implementation dependent.  Typical types are long and 
    double.
   @param [out] currentValue
    Returns the current value represented by this object.  See the section about 
	@ref _variants "VARIANTs" for additional information.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is a VARIANT with vt = VT_EMPTY
  */
  [propget] HRESULT currentValue
    (
     [out, retval] VARIANT *currentValue
    );

  /** @brief Sets the value of this object to the given number.
        
   The argument is clipped to the valid interval whose upper and lower 
    bounds are returned by the methods IAccessibleValue::maximumValue and 
	IAccessibleValue::minimumValue, i.e. if it is 	lower than the minimum 
	value the new value will be the minimum and if it is greater than the 
	maximum then the new value will be the maximum.

   @param [in] value
    The new value represented by this object.  The set of admissible types for 
    this argument is implementation dependent.
   @retval S_OK
  */
  HRESULT setCurrentValue
    (
     [in] VARIANT value
    );

  /** @brief Returns the maximal value that can be represented by this object.
        
   The type of the returned value is implementation dependent.  It does not have 
    to be the same type as that returned by method IAccessibleValue::currentValue.

   @param [out] maximumValue
    Returns the maximal value in an implementation dependent type. If this object 
    has no upper bound then an empty object is returned.  See the section about 
	@ref _variants "VARIANTs" for additional information.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is a VARIANT with vt = VT_EMPTY
  */
  [propget] HRESULT maximumValue
    (
     [out, retval] VARIANT *maximumValue
    );

  /** @brief Returns the minimal value that can be represented by this object.
        
   The type of the returned value is implementation dependent.  It does not have 
    to be the same type as that returned by method IAccessibleValue::currentValue.
   
   @param [out] minimumValue
    Returns the minimal value in an implementation dependent type. If this object 
    has no lower bound then an empty object is returned.  See the section about 
	@ref _variants "VARIANTs" for additional information.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is a VARIANT with vt = VT_EMPTY
  */
  [propget] HRESULT minimumValue
    (
     [out, retval] VARIANT *minimumValue
    );

};
/*************************************************************************
 *
 *  File Name (AccessibleText.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2013 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. 
 * 
 ************************************************************************/ 






/** A structure containing a substring and the start and end offsets in the enclosing string.
 
 IAccessibleText::newText and IAccessibleText::oldText return this struct.
*/
typedef struct IA2TextSegment {
  BSTR text;	///< A copy of a segment of text taken from an enclosing paragraph.
  long start;	///< Index of the first character of the segment in the enclosing text.  
  long end;		///< Index of the character following the last character of the segment in the enclosing text. 
} IA2TextSegment;

/** This enum defines values which specify a text boundary type.

 IA2_TEXT_BOUNDARY_SENTENCE is optional.  When a method doesn't implement this 
 method it must return S_FALSE.  Typically this feature would not be implemented
 by an application.  However, if the application developer was not satisfied with
 how screen readers have handled the reading of sentences this boundary type
 could be implemented and screen readers could use the application's version of a 
 sentence rather than the screen reader's.

 The rest of the boundary types must be supported.

 This enum is used in IAccessibleText::textBeforeOffset, IAccessibleText::textAtOffset,
 and IAccessibleText::textAfterOffset.
*/

enum IA2TextBoundaryType {
  IA2_TEXT_BOUNDARY_CHAR,       /**< Typically, a single character is returned.  In some cases more than
                                 one character is returned, for example, when a document contains field
                                 data such as a field containing a date, time, or footnote reference.
                                 In this case the caret can move over several characters in one movement
                                 of the caret.  Note that after the caret moves, the caret offset changes
                                 by the number of characters in the field, e.g. by 8 characters in the 
                                 following date: 03/26/07. */
  IA2_TEXT_BOUNDARY_WORD,       /**< The range provided matches the range observed when the application
                                 processes the Ctrl + left arrow and Ctrl + right arrow key sequences.
                                 Typically this is from the start of one word to the start of the next, but
                                 various applications are inconsistent in the handling of the end of a line. */
  IA2_TEXT_BOUNDARY_SENTENCE,   ///< Range is from start of one sentence to the start of another sentence.
  IA2_TEXT_BOUNDARY_PARAGRAPH,  ///< Range is from start of one paragraph to the start of another paragraph.
  IA2_TEXT_BOUNDARY_LINE,       /**< Range is from start of one line to the start of another line. This
                                 often means that an end-of-line character will appear at the end of the
                                 range. However in the case of some applications an end-of-line character
                                 indicates the end of a paragraph and the lines composing the paragraph,
                                 other than the last line, do not contain an end of line character. */
  IA2_TEXT_BOUNDARY_ALL         ///< Using this value will cause all text to be returned.
};

/** @brief This interface gives read-only access to text.

 The %IAccessibleText interface should be implemented by all components 
  that present textual information on the display like  buttons, 
  text entry fields, or text portions of the document window.  The interface 
  provides access to the text's content, attributes, and spatial location.  
  However, text can not be modified with this interface.  That is the task 
  of the IAccessibleEditableText interface.
        
 The text length, i.e. the number of characters in the text, is
  returned by IAccessibleText::nCharacters. All methods that operate 
  on particular characters (e.g. IAccessibleText::textAtOffset) use character 
  indices from 0 to length-1. All methods that operate on character positions 
  (e.g. IAccessibleText::text) use indices from 0 to length.

 Please note that accessible text does not necessarily support selection.  
  In this case it should behave as if there where no selection.  An empty 
  selection is used for example to express the current cursor position.

 Refer to @ref _specialOffsets 
  "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
  for information about special offsets that can be used in %IAccessibleText methods.

 E_FAIL is returned in the following cases
 @li endOffset < startOffset
 @li endoffset > length
*/
[object, uuid(24FD2FFB-3AAD-4a08-8335-A3AD89C0FB4B)]
interface IAccessibleText : IUnknown
{

  /** @brief Adds a text selection
   @param [in] startOffset
    Starting offset ( 0 based).
   @param [in] endOffset
    Offset of first character after new selection (0 based).
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
   @note  Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleText methods.
  */
  HRESULT addSelection
    (
     [in] long startOffset,
     [in] long endOffset
    );

  /** @brief Returns text attributes.
   @param [in] offset
    Text offset (0 based).  Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleText methods.
   @param [out] startOffset    
    The starting offset of the character range over which all text attributes match 
    those of offset. (0 based)
   @param [out] endOffset    
    The offset of the first character past the character range over which all text 
    attributes match those of offset. (0 based)
   @param [out] textAttributes  
    A string of attributes describing the text.  The attributes are described in the
    <a href="http://www.linuxfoundation.org/en/Accessibility/IAccessible2/TextAttributes">
    text attributes specification</a> on the %IAccessible2 web site.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] values are 0s and NULL respectively 
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT attributes
    (
     [in] long offset,	
     [out] long *startOffset,
     [out] long *endOffset,	
     [out, retval] BSTR *textAttributes
    );

  /** @brief Returns the position of the caret.

   Returns the 0-based offset of the caret within the text.  If the text is 
   implemented as a tree of text objects with embed characters in higher levels
   representing substrings of child text objects and the caret is in one of the 
   child text objects, then the offset in the higher level text object would be
   at the embed character representing child text object that contains the caret.

   For example, if the string "one two three" is implemented as a two text objects,
   with a top level text object containing an embed character "one ? three" and a
   child text object containing "two" and if the caret is in the descendant object
   just before the 'o' in "two", then:
   <ul>
   <li>the caretOffset for the "one ? three" object would be 4, matching the embed character</li>
   <li>the caretOffset for "two" would be 2, matching the "o"</li>
   </ul>
   The caret position/offset is that of the character logically following it, e.g.
   to the right of it in a left to right language, or to the left of it in a right
   to left language.
   @param [out] offset
    The returned offset is relative to the text represented by this object.
   @retval S_OK
   @retval S_FALSE if the caret is not currently active on this object, i.e. the
    caret is located on some other object.  The returned offset value will be -1.
   @note S_FALSE (and an offset of -1) will not be returned if the caret is somewhere
   in the text object or one of its descendants. 
  */
  [propget] HRESULT caretOffset
    (
     [out, retval] long *offset
    );


  /** @brief Returns the bounding box of the specified position.
        
   The virtual character after the last character of the represented
    text, i.e. the one at position length is a special case. It represents the 
    current input position and will therefore typically be queried by AT more 
    often than other positions.  Because it does not represent an existing character 
    its bounding box is defined in relation to preceding characters.  It should be 
    roughly equivalent to the bounding box of some character when inserted at the 
    end of the text.  Its height typically being the maximal height of all the
    characters in the text or the height of the preceding character, its width being 
    at least one pixel so that the bounding box is not degenerate.

   Note that the index 'length' is not always valid.  Whether it is or not is 
    implementation dependent.  It typically is when text is editable or otherwise 
    when on the screen the caret can be placed behind the text.  You can be sure 
    that the index is valid after you have received a ::IA2_EVENT_TEXT_CARET_MOVED
    event for this index.
   @param [in] offset
    Index of the character for which to return its bounding box. The valid range 
    is 0..length.  Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleText methods.
   @param [in] coordType
    Specifies if the coordinates are relative to the screen or to the parent window.
   @param [out] x
    X coordinate of the top left corner of the bounding box of the referenced character. 
   @param [out] y
    Y coordinate of the top left corner of the bounding box of the referenced character. 
   @param [out] width
    Width of the bounding box of the referenced character. 
   @param [out] height
    Height of the bounding box of the referenced character. 
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT characterExtents
    (
     [in] long offset,
     [in] enum IA2CoordinateType coordType,
     [out] long *x,
     [out] long *y,
     [out] long *width,
     [out, retval] long *height
    );


  /** @brief Returns the number of active non-contiguous selections
   @param [out] nSelections
   @retval S_OK
  */
  [propget] HRESULT nSelections
    (
     [out, retval] long *nSelections
    );

  /** @brief Returns the text position for the specified screen position.
    
   Given a point return the zero-based index of the character under that
   point.  The same functionality could be achieved by using the bounding
   boxes for each character as returned by IAccessibleText::characterExtents.
   The method IAccessibleText::offsetAtPoint, however, can be implemented 
   more efficiently.
            
   @param [in] x
    The position's x value for which to look up the index of the character that
    is rendered on to the display at that point.
   @param [in] y
    The position's y value for which to look up the index of the character that
    is rendered on to the display at that point.            
   @param [in] coordType
    Screen coordinates or window coordinates.
   @param [out] offset
    Index of the character under the given point or -1 if the point
    is invalid or there is no character under the point.
   @retval S_OK
   @retval S_FALSE if nothing to return, [out] value is -1

   @retval E_INVALIDARG if bad [in] passed
    */
  [propget] HRESULT offsetAtPoint
    (
     [in] long x,
     [in] long y,
     [in] enum IA2CoordinateType coordType,
     [out, retval] long *offset
    );

  /** @brief Returns the character offsets of Nth active text selection

   Returns the 0-based starting and ending offsets of the Nth selection.  If the
   text is implemented as a tree of text objects with embed characters in higher
   levels representing substrings of child text objects, consider the following.
   If the starting selection offset is in one of the child text objects, then the
   starting offset in the higher level text object would be at the embed character
   representing the child text object that contains the starting selection offset.
   If the ending selection offset is in one of the child text objects, then the
   ending offset in the higher level text object would be just after the embed
   character representing the child text object that contains the ending selection
   offset.

   For example, if the string "one two three" is implemented as a two text objects,
   with a top level text object containing an embed character "one ? three" and a
   child text object containing "two" and if the selection is the string "two" then:
   <ul>
   <li>the startOffset for the "one ? three" object would be 4, matching the embed character and the endOffset would be 5.</li>
   <li>the startOffset for the "two" object would be 0, and the endOffset would be 3</li>
   </ul>
   Selection offsets are that of the character logically following it, e.g.
   to the right of it in a left to right language or to the left of it in a right to left language.
   @param [in] selectionIndex
    Index of selection (0 based).
   @param [out] startOffset
    0 based offset of first selected character
   @param [out] endOffset
    0 based offset of one past the last selected character.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT selection
    (
     [in] long selectionIndex,
     [out] long *startOffset,
     [out, retval] long *endOffset
    );

  /** @brief Returns the substring between the two given indices.

   The substring starts with the character at startOffset (inclusive) and up to 
    the character at endOffset (exclusive), if startOffset is less or equal 
    endOffset.  If endOffset is lower than startOffset, the result is the same 
    as a call with the two arguments being exchanged.

   The whole text can be requested by passing the indices zero and 
    IAccessibleText::nCharacters. If both indices have the same value, an empty 
    string is returned.
   @param [in] startOffset
    Index of the first character to include in the returned string. The valid range 
    is 0..length.
   @param [in] endOffset
    Index of the last character to exclude in the returned string. The valid range 
    is 0..length.
   @param [out] text
    Returns the substring starting with the character at startOffset (inclusive) 
    and up to the character at endOffset (exclusive), if startOffset is less than 
    or equal to endOffset.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
   @note
   @li The returned string may be longer than endOffset-startOffset bytes if text 
    contains multi-byte characters.
   @li Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleText methods.
  */
  [propget] HRESULT text
    (
     [in] long startOffset,
     [in] long endOffset,
     [out, retval] BSTR *text
    );

  /** @brief Returns a text portion before the given position.
    
   Returns the substring of the specified text type that is located before the 
    given character and does not include it. The result of this method should be 
    same as a result for IAccessibleText::textAtOffset with a suitably decreased 
    index value.

   For example, if text type is ::IA2_TEXT_BOUNDARY_WORD, then the complete 
    word that is closest to and located before offset is returned.

   If the index is valid, but no text is found, S_FALSE is returned along with out
    values of 0, 0, and a NULL pointer.  This would happen for boundary types other
    than character when the text consists entirely of whitespace.

   @param [in] offset
    Index of the character for which to return the text part before it.  The index 
    character will not be part of the returned string. The valid range is 0..length.
    Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleText methods.
   @param [in] boundaryType
    The type of the text portion to return.  See ::IA2TextBoundaryType for the 
    complete list.
   @param [out] startOffset
    0 based offset of first character.
   @param [out] endOffset
    0 based offset of one past the last character.
   @param [out] text
    Returns the requested text portion.  This portion may be empty or invalid when 
    no appropriate text portion is found or text type is invalid.
   @retval S_OK
   @retval S_FALSE if the requested boundary type is not implemented, such as 
    ::IA2_TEXT_BOUNDARY_SENTENCE, or if there is nothing to return; 
    [out] values are 0s and NULL respectively 
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT textBeforeOffset
    (
     [in] long offset,
     [in] enum IA2TextBoundaryType boundaryType,
     [out] long *startOffset,
     [out] long *endOffset,
     [out, retval] BSTR *text
    );

  /** @brief Returns a text portion after the given position.
    
   Returns the substring of the specified text type that is located after the 
    given character and does not include it. The result of this method should be 
    same as a result for IAccessibleText::textAtOffset with a suitably increased 
    index value.

   For example, if text type is ::IA2_TEXT_BOUNDARY_WORD, then the complete 
    word that is closest to and located after offset is returned.

   If the index is valid, but no text is found, S_FALSE is returned along with out
    values of 0, 0, and a NULL pointer.  This would happen for boundary types other
    than character when the text consists entirely of whitespace.

   @param [in] offset
    Index of the character for which to return the text part after it.  The index 
    character will not be part of the returned string. The valid range is 0..length.
    Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleText methods.
   @param [in] boundaryType
    The type of the text portion to return.  See ::IA2TextBoundaryType for the complete 
    list.
   @param [out] startOffset
    0 based offset of first character.
   @param [out] endOffset
    0 based offset of one past the last character.
   @param [out] text
    Returns the requested text portion.  This portion may be empty or invalid when 
    no appropriate text portion is found or text type is invalid.
   @retval S_OK
   @retval S_FALSE if the requested boundary type is not implemented, such as 
    ::IA2_TEXT_BOUNDARY_SENTENCE, or if there is nothing to return; 
    [out] values are 0s and NULL respectively 
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT textAfterOffset
    (
     [in] long offset,
     [in] enum IA2TextBoundaryType boundaryType,
     [out] long *startOffset,
     [out] long *endOffset,
     [out, retval] BSTR *text
    );

  /** @brief Returns a text portion that spans the given position.

   Returns the substring defined by the specified boundary type at the specified
    offset.  Refer to IA2TextBoundaryType for more details.

   For the word boundary type the returned string will contain the word at the
    offset if the offset is inside a word and will contain the word before the
    offset if the offset is not inside a word.  All offsets from the first to the
    last characters of a word are considered inside the word.  Boundary types of
    sentence and paragraph should exhibit similar behavior.

   If the index is valid, but no text is found, S_FALSE is returned along with out
    values of 0, 0, and a NULL pointer.  This would happen for boundary types other
    than character when the text consists entirely of whitespace.

   @param [in] offset
    Index of the character for which to return the text part it belongs to.  The valid
    range is 0..length.
    Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleText methods.
   @param [in] boundaryType
    The type of the text portion to return.  See ::IA2TextBoundaryType for the complete 
    list.
   @param [out] startOffset
    0 based offset of first character.
   @param [out] endOffset
    0 based offset of one past the last character.
   @param [out] text
    Returns the requested text portion.  This portion may be empty or invalid when 
    no appropriate text portion is found or text type is invalid.
   @retval S_OK
   @retval S_FALSE if the requested boundary type is not implemented, such as 
    ::IA2_TEXT_BOUNDARY_SENTENCE, or if there is nothing to return; 
    [out] values are 0s and NULL respectively 
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT textAtOffset
    (
     [in] long offset,
     [in] enum IA2TextBoundaryType boundaryType,
     [out] long *startOffset,
     [out] long *endOffset,
     [out, retval] BSTR *text
    );

  /** @brief Unselects a range of text.
   @param [in] selectionIndex
    Index of selection to remove (0 based).
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT removeSelection
    (
     [in] long selectionIndex
    );

  /** @brief Sets the position of the caret.

   The caret position/offset is that of the character logically following it,
   e.g. to the right of it in a left to right language.

   Setting the caret position may or may not alter the current selection.  A 
    change of the selection is notified to the accessibility event listeners with 
    an ::IA2_EVENT_TEXT_SELECTION_CHANGED event.

   When the new caret position differs from the old one (which, of course, is the 
    standard case) this is notified to the accessibility event listeners with an
    ::IA2_EVENT_TEXT_CARET_MOVED event.
   @param [in] offset
    The new index of the caret.  This caret is actually placed to the left side of 
    the character with that index.  An index of 0 places the caret so that the next 
    insertion goes before the first character.  An index of IAccessibleText::nCharacters 
    leads to insertion after the last character.  Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleText methods.
   @retval S_OK
   @retval E_FAIL if the caret cannot be set
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT setCaretOffset
    (
     [in] long offset
    );

  /** @brief Changes the bounds of an existing selection.
   @param [in] selectionIndex
    Index of selection to change (0 based)
   @param [in] startOffset
    New starting offset (0 based)
   @param [in] endOffset
    New ending offset (0 based) - the offset of the character just past the last character of the selection.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
   @note Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleText methods.
  */
  HRESULT setSelection
    (
     [in] long selectionIndex,
     [in] long startOffset,
     [in] long endOffset
    );

  /** @brief Returns total number of characters.

   Note that this may be different than the total number of bytes required to store the 
    text, if the text contains multi-byte characters.
   @param [out] nCharacters
   @retval S_OK
  */
  [propget] HRESULT nCharacters
    (
     [out, retval] long *nCharacters
    );

  /** @brief Makes a specific part of string visible on screen.
   @param [in] startIndex
    0 based character offset.
   @param [in] endIndex
    0 based character offset - the offset of the character just past the last character of the string.
   @param [in] scrollType
    Defines where the object should be placed on the screen.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
   @note Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleText methods.
  */
  HRESULT scrollSubstringTo
    (
     [in] long startIndex,
     [in] long endIndex,
     [in] enum IA2ScrollType scrollType
    );

  /** @brief Moves the top left of a substring to a specified location.

   @param [in] startIndex
    0 based character offset.
   @param [in] endIndex
    0 based character offset - the offset of the character just past the last character of the string.
   @param [in] coordinateType
    Specifies whether the coordinates are relative to the screen or the parent object.
   @param [in] x
    Defines the x coordinate.
   @param [in] y
    Defines the y coordinate.
   @retval S_OK
   @retval S_FALSE if the object is already at the specified location.
   @retval E_INVALIDARG if bad [in] passed
   @note Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleText methods.
  */
  HRESULT scrollSubstringToPoint
    (
     [in] long startIndex,
     [in] long endIndex,
     [in] enum IA2CoordinateType coordinateType,
     [in] long x,
     [in] long y 
    );

  /** @brief Returns any inserted text.

   Provided for use by the ::IA2_EVENT_TEXT_INSERTED and ::IA2_EVENT_TEXT_UPDATED 
    event handlers.

   This data is only guaranteed to be valid while the thread notifying the event 
   continues. Once the handler has returned, the validity of the data depends on 
   how the server manages the life cycle of its objects. Also, note that the server 
   may have different life cycle management strategies for controls depending on 
   whether or not a control manages its children. Lists, trees, and tables can have 
   a large number of children and thus it's possible that the child objects for those 
   controls would only be created as needed. Servers should document their life cycle 
   strategy as this will be of interest to assistive technology or script engines 
   accessing data out of process or from other threads. Servers only need to save the 
   last inserted block of text and a scope of the entire application is adequate.

   @param [out] newText
    The text that was just inserted.
   @retval S_OK
   @retval S_FALSE If there is nothing to return, the values of IA2TextSegment
    struct are set as follows:  text = NULL, start = 0, end = 0.

  */
  [propget] HRESULT newText
    (
     [out, retval] IA2TextSegment *newText
    );

  /** @brief Returns any removed text.

   Provided for use by the IA2_EVENT_TEXT_REMOVED/UPDATED event handlers.
   
   This data is only guaranteed to be valid while the thread notifying the event 
   continues. Once the handler has returned, the validity of the data depends on 
   how the server manages the life cycle of its objects. Also, note that the server 
   may have different life cycle management strategies for controls depending on 
   whether or not a control manages its children. Lists, trees, and tables can have 
   a large number of children and thus it's possible that the child objects for those 
   controls would only be created as needed. Servers should document their life cycle 
   strategy as this will be of interest to assistive technology or script engines 
   accessing data out of process or from other threads. Servers only need to save the 
   last removed block of text and a scope of the entire application is adequate.

   @param [out] oldText
    The text that was just removed.
   @retval S_OK
   @retval S_FALSE If there is nothing to return, the values of IA2TextSegment
    struct are set as follows:  text = NULL, start = 0, end = 0.
  */
  [propget] HRESULT oldText
    (
     [out, retval] IA2TextSegment *oldText
    );

}
/*************************************************************************
 *
 *  File Name (AccessibleText2.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2013 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. 
 * 
 ************************************************************************/ 







/** @brief This interface gives read-only access to text.

 The %IAccessibleText2 interface extends the functionality of the
 %IAccessibleText interface.
*/
[object, uuid(9690A9CC-5C80-4DF5-852E-2D5AE4189A54)]
interface IAccessibleText2 : IAccessibleText
{

  /** @brief Returns the range and of the specified set of attributes.

   Return the range (start and end offsets) and text attributes that correspond
    to the given attributes filter at the given offset.

   @param [in] offset
    The offset at which to search for the attributes specified in the filter.
   @param [in] filter
    The requested attribute names.  The filter format is "attribute1, attribute2".
   @param [out] startOffset
    The starting (0-based) offset of the text containing the specified attributes.
   @param [out] endOffset
    The (0-based) offset one past the last character of the text containing the
    specified attributes.
   @param [out] attributeValues
    The values of the requested attributes.
   @retval S_OK
   @retval S_FALSE if nothing to return, [out] values are -1, -1, NULL respectively.
   @retval E_INVALIDARG if bad [in] passed.
   */
  [propget] HRESULT attributeRange
    (
     [in] long offset,
     [in] BSTR filter,
     [out] long *startOffset,
     [out] long *endOffset,	
     [out, retval] BSTR *attributeValues
    );

}
/*************************************************************************
 *
 *  File Name (AccessibleEditableText.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2012 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. 
 * 
 ************************************************************************/ 






/** @brief This interface provides clipboard capability to text objects.

 This interface is typically used in conjunction with the IAccessibleText 
  interface and complements that interface with the additional capability of
  clipboard operations.  Note that even a read only text object can support
  the copy capability so this interface is not limited to editable objects.

 The substrings used with this interface are specified as follows:
  If startOffset is less than endOffset, the substring starts with the 
  character at startOffset and ends with the character just before endOffset.
  If endOffset is lower than startOffset,  the result is the same as a call 
  with the two arguments exchanged. The whole text can be defined by passing 
  the indices zero and IAccessibleText::nCharacters. If both indices have the 
  same value, an empty string is defined. 

 Refer to the @ref _specialOffsets
  "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
  for information about a special offset constant that can be used in %IAccessibleEditableText methods.
*/
[object, uuid(A59AA09A-7011-4b65-939D-32B1FB5547E3)]
interface IAccessibleEditableText : IUnknown
{

  /** @brief Copies the text range into the clipboard.
    
   The selection is set to the specified offsets and then selection is copied into
   the system clipboard.
        
   @param [in] startOffset
    Start index of the text to moved into the clipboard.
    The valid range is 0..length.
   @param [in] endOffset
    End index of the text to moved into the clipboard.
    The valid range is 0..length.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
   @note Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleEditableText
    methods.
   @deprecated This function is available via the application's GUI.
  */
  HRESULT copyText
    (
     [in] long startOffset, 
     [in] long endOffset 
    );

  /** @brief Deletes a range of text.
    
   The text between and including the two given indices is deleted
    from the text represented by this object.

   @param [in] startOffset
    Start index of the text to be deleted.
    The valid range is 0..length.
   @param [in] endOffset
    End index of the text to be deleted.
    The valid range is 0..length.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
   @note Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleEditableText
    methods.
  */
  HRESULT deleteText
    (
     [in] long startOffset, 
     [in] long endOffset 
    );
  
  /** @brief Inserts text at the specified position.
    
   The specified string is inserted at the given index into the text
    represented by this object.

   @param [in] offset
    Index at which to insert the text.
    The valid range is 0..length.
	Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleEditableText
    methods.
   @param [in] text
    Text that is inserted.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT insertText
    (
     [in] long offset,
     [in] BSTR *text
    );
  
  /** @brief Deletes a range of text and copies it to the clipboard.
    
   The selection is set to the specified offsets, the selection is then copied into
    the system clipboard, and then the selection is deleted.

   @param [in] startOffset
    Start index of the text to be deleted.
    The valid range is 0..length.
   @param [in] endOffset 	
    End index of the text to be deleted.
    The valid range is 0..length.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
   @note Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleEditableText
    methods.
   @deprecated This function is available via the application's GUI.
  */
  HRESULT cutText
    (
     [in] long startOffset,
     [in] long endOffset
    );

  /** @brief Pastes content from the clipboard.
    
   Any existing selection is removed, the clipboard content is then pasted into 
    this object's text at the given offset.  This method is similar to the insertText
    method.  If the index is not valid the system clipboard content is not inserted. The
    behavior is the same as	when Ctrl+V is used, i.e. the pasted contents are not
    necessarily plain text.
  
   @param [in] offset
    Index at which to insert the content from the system clipboard into
    the text represented by this object.
    The valid range is 0..length.
	Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleEditableText
    methods.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
   @deprecated This function is available via the application's GUI.
  */
  HRESULT pasteText
    (
     [in] long offset
    );

  /** @brief Replaces text.
    
   The text between the two given indices is replaced by the specified 
    replacement string. This method is equivalent to calling first
    IAccessibleEditableText::deleteText with the two indices and then 
    calling IAccessibleEditableText::insertText with the replacement text
	at the start index.
       
   @param [in] startOffset
    Start index of the text to be replaced.
    The valid range is 0..length.
   @param [in] endOffset
    End index of the text to be replaced.
    The valid range is 0..length.
   @param [in] text
    The Text that replaces the text between the given indices.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
   @note Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleEditableText
    methods.
  */
  HRESULT replaceText
    (
     [in] long startOffset,
     [in] long endOffset,
     [in] BSTR *text
    );

  /** @brief Replaces the attributes of a text range by the given set of attributes.
    
   Sets the attributes for the text between the two given indices. The old
    attributes are replaced by the new list of attributes.
        
   @param [in] startOffset
    Start index of the text whose attributes are modified.
    The valid range is 0..length.
   @param [in] endOffset
    End index of the text whose attributes are modified.
    The valid range is 0..length.
   @param [in] attributes
    Set of attributes that replaces the old list of attributes of
    the specified text portion.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
   @note Refer to @ref _specialOffsets 
    "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
    for information about special offsets that can be used in %IAccessibleEditableText
    methods.
  */
  HRESULT setAttributes
    (
     [in] long startOffset,
     [in] long endOffset,
     [in] BSTR *attributes
    );
}

/*************************************************************************
 *
 *  File Name (AccessibleHyperlink.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. 
 * 
 ************************************************************************/ 






/** @brief This interface represents hyperlinks.

 This interface represents a hyperlink associated with a single substring 
  of text or single non-text object.  Non-text objects can have either a 
  single link or a collection of links such as when the non-text object is 
  an image map.

 Linked objects and anchors are implementation dependent. This interface is derived
  from IAccessibleAction.  IAccessibleAction::nActions is one greater than the 
  maximum value for the indices used with the methods of this interface.
        
 Furthermore, the object that implements this interface has to be connected 
  implicitly or explicitly with an object that implements IAccessibleText.
  IAccessibleHyperlink::startIndex and IAccessibleHyperlink::endIndex are
  indices with respect to the text exposed by IAccessibleText.

 This interface provides access to a single object which can have multiple actions.
  An example is an image map which is an image with multiple links each of which is
  associated with a separate non-overlapping area of the image.  This interface could
  also be applied to other kinds of objects with multiple actions such as "smart tags"
  which are objects, typically strings, which have multiple actions such as
  "Activate URI", "Bookmark URI", etc.

 An interesting use case is an image map where each area is associated with multiple
  actions, e.g. an image map of smart tags.  In this case you would have to implement
  two levels of accessible hyperlinks.  The first level hyperlinks would only implement
  anchor and anchorTarget.  The anchors would all reference the image object.  The
  anchorTargets would reference the second level accessible hyperlink objects.  None
  of the IAccessibleAction methods would be implemented on the first level hyperlink
  objects.  The second level hyperlink objects would implement the IAccessibleAction
  methods.  Their anchors would also reference the image object and their anchorTargets
  would reference URLs or the objects that would be activated.

 This use case demonstrates that in some cases there is no need for IAccessibleHyperlink
  to derive from IAccessibleAction.  As a result it may be removed in a later version of
  the IDL and it is suggested that implementations should not rely on the inheritance.

*/
[object, uuid(01C20F2B-3DD2-400f-949F-AD00BDAB1D41)]
interface IAccessibleHyperlink : IAccessibleAction
{

  /** @brief Returns an object that represents the link anchor, as appropriate
   for the link at the specified index.       
   @param [in] index
    A 0 based index identifies the anchor when, as in the case of an image map,
    there is more than one link represented by this object.  The valid maximal
    index is indicated by IAccessibleAction::nActions.
   @param [out] anchor
    This is an implementation dependent value.  For example, for a text link this 
	method could return the substring of the containing string where the substring
	is overridden with link behavior, and for an image link this method could return 
	an IUnknown VARIANT for IAccessibleImage.  See the section about 
	@ref _variants "VARIANTs" for additional information.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT anchor
    (
     [in] long index,
     [out, retval] VARIANT *anchor
    );

  /** @brief Returns an object representing the target of the link, as appropriate
   for the link at the specified index.       
   @param [in] index
    A 0 based index identifies the anchor when, as in the case of an image map,
    there is more than one link represented by this object.  The valid maximal
    index is indicated by IAccessibleAction::nActions.
   @param [out] anchorTarget
    This is an implementation dependent value.  For example this method could
	return a BSTR VARIANT of the URI.  Alternatively this method could return an
	IUnknown VARIANT of a COM interface representing a target object to be 
	activated when the link is activated.  See the section about 
	@ref _variants "VARIANTs" for additional information.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT anchorTarget
    (
     [in] long index,
     [out, retval] VARIANT *anchorTarget
    );

  /** @brief Returns the 0 based character offset at which the textual representation of the hyperlink starts.

   The returned value is related to the IAccessibleText interface of the object that 
   owns this hyperlink. 
   @param [out] index
   @retval S_OK
  */
  [propget] HRESULT startIndex
    (
     [out, retval] long *index
    );

  /** @brief Returns the 0 based character offset at which the textual representation of the hyperlink ends.
    
   The returned value is related to the IAccessibleText interface of the object that 
   owns this hyperlink. The character at the index is not part of the hypertext.  
   @param [out] index
   @retval S_OK
  */
  [propget] HRESULT endIndex
    (
     [out, retval] long *index
    );

  /** @brief Returns whether the target object referenced by this link is still valid.
        
   This is a volatile state that may change without sending an appropriate event.
   Returns TRUE if the referenced target is still valid and FALSE otherwise.

   This has also been used to indicate whether or not the URI of the anchorTarget
   is malformed.

   @param [out] valid
    If false, one or more of the object's links are invalid.
	If true, all of the object's links are valid.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is FALSE
   @note This method is not being used, is deprecated, and should not be implemented or
    used.  It is likely that this method will be removed in a later version of the IDL.
  */
  [propget] HRESULT valid
    (
     [out, retval] boolean *valid
    );
}
/*************************************************************************
 *
 *  File Name (AccessibleHypertext.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. 
 * 
 ************************************************************************/ 







/** @brief This interface exposes information about hypertext in a document.

 The %IAccessibleHypertext interface is the main interface to expose
  hyperlinks in a document, typically a text document, that are used 
  to reference other documents.  A typical implementation is to implement 
  this interface on the smallest text object such as a paragraph of text.
*/
[object, uuid(6B4F8BBF-F1F2-418a-B35E-A195BC4103B9)]
interface IAccessibleHypertext : IAccessibleText
{

  /** @brief Returns the number of links and link groups contained within this hypertext 
    paragraph.
   @param [out] hyperlinkCount
    The number of links and link groups within this hypertext paragraph.  
    Returns 0 if there is no link.
   @retval S_OK
  */
  [propget] HRESULT nHyperlinks
    (
     [out, retval] long *hyperlinkCount
    );

  /** @brief Returns the specified link.
    
   The returned IAccessibleHyperlink object encapsulates the hyperlink and 
    provides several kinds of information describing it.
   @param [in] index
    This 0 based index specifies the hyperlink to return.
   @param [out] hyperlink
    If the given index is valid, i.e. lies in the interval from 0 to the number 
    of links minus one, a reference to the specified hyperlink object is returned.  
    If the index is invalid then a NULL pointer is returned.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT hyperlink
    (
     [in] long index,
     [out, retval] IAccessibleHyperlink **hyperlink
    );

  /** @brief Returns the index of the hyperlink that is associated with this character index.
        
   This is the case when a link spans the given character index.
   @param [in] charIndex
    A 0 based index of the character for which to return the link index.  If 
	IAccessibleText is used to represent the text containing the link, then the 
	character index is only  valid if it is greater than or equal to zero and 
	lower than the number of characters in the text.
   @param [out] hyperlinkIndex
    Returns the 0 based index of the hyperlink that is associated with this 
	character index, or -1 if charIndex is not on a link.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is -1
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT hyperlinkIndex
    (
     [in] long charIndex,
     [out, retval] long *hyperlinkIndex
    );

}
/*************************************************************************
 *
 *  File Name (AccessibleHypertext2.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2013 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. 
 * 
 ************************************************************************/ 







/** @brief This interface exposes information about hypertext in a document.

 The %IAccessibleHypertext2 interface extends the functinality of the
 %IAccessibleHypertext inteface.
*/
[object, uuid(CF64D89F-8287-4B44-8501-A827453A6077)]
interface IAccessibleHypertext2 : IAccessibleHypertext
{

 /** @brief Returns the links for this object.

   The returned IAccessibleHyperlink objects encapsulate the hyperlink and 
    provides several kinds of information describing it.

   @param [out] hyperlinks
    This array is allocated by the server.  The client must free it with CoTaskMemFree.
   @param [out] nHyperlinks
    The number of links returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there are no links, [out] values are NULL and 0 respectively
  */
  [propget] HRESULT hyperlinks
    (
     [out, size_is(,*nHyperlinks)] IAccessibleHyperlink ***hyperlinks,
     [out, retval] long *nHyperlinks
    );

}
/*************************************************************************
 *
 *  File Name (AccessibleTable.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2013 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. 
 * 
 ************************************************************************/ 







/** @brief This interface gives access to a two-dimensional table. 
       
 Typically all accessible objects that represent cells or cell-clusters of a table 
  will be at the same time children of the table.  In this case IAccessible2::indexInParent
  will return the child index which then can be used when calling IAccessibleTable::rowIndex
  and IAccessibleTable::columnIndex.

 However, in some cases that kind of implementation will not be possible.  When
  the table cells are not direct children of a table, the object representing
  the cell can define a "table-cell-index" object attribute identifying the 0 
  based table cell index.  This object attribute is obtained by parsing the
  attribute string returned by IAccessible2::attributes.  The "table-cell-index"
  attribute can be used just like a child index of the typical case.  ATs should 
  first test for the presence of the "table-cell-index" attribute and if it is not
  present then IAccessible2::indexInParent can be used as in the typical case
  where cells are direct children of the table.
              
 The range of valid coordinates for this interface are implementation dependent.  
  However, that range includes at least the intervals from the from the first row 
  or column with the index 0 up to the last (but not including) used row or column 
  as returned by IAccessibleTable::nRows and IAccessibleTable::nColumns.

 Note that newer implementations are now using IAccessibleTable2 and IAccessibleTableCell
  rather than this interface.
*/
[object, uuid(35AD8070-C20C-4fb4-B094-F4F7275DD469)]
interface IAccessibleTable : IUnknown
{

  /** @brief Returns the accessible object at the specified row and column in 
    the table.  This object could be an IAccessible or an IAccessible2.
   @param [in] row
    The 0 based row index for which to retrieve the cell.
   @param [in] column
    The 0 based column index for which to retrieve the cell.
   @param [out] accessible
    If both row and column index are valid then the corresponding accessible 
    object is returned that represents the requested cell regardless of whether 
    the cell is currently visible (on the screen).
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is NULL 
  */
  [propget] HRESULT accessibleAt
    (
     [in] long row, 
     [in] long column,
     [out, retval] IUnknown **accessible 
    );

  /** @brief Returns the caption for the table.  The returned object could be 
    an IAccessible or an IAccessible2.
   @param [out] accessible
    If the table has a caption then a reference to it is returned, else a NULL 
    pointer is returned.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
  */
  [propget] HRESULT caption
    (
     [out, retval] IUnknown **accessible 
    );
	  
  /** @brief Translates the given row and column indexes into the corresponding cell index.
   @param [in] rowIndex
    0 based row index for the cell.
   @param [in] columnIndex
    0 based column index for the cell.
   @param [out] cellIndex
    Returns the 0 based index of the cell at the specified row and column indexes.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is 0
   @note The returned value is not necessarily a child index of the immediate parent.
    In cases where the table cells are not direct children of the table the index 
    is actually the cell index, i.e. conceptually it's an index into a one dimensional
	array of cells laid out in row order.
  */
  [propget] HRESULT childIndex
	(
	 [in] long rowIndex,
	 [in] long columnIndex,
	 [out, retval] long *cellIndex
	);

  /** @brief Returns the description text of the specified column in the table.
   @param [in] column
    The 0 based index of the column for which to retrieve the description.
   @param [out] description
    Returns the description text of the specified column in the table if such a 
    description exists.  Otherwise a NULL pointer is returned.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
   @retval E_INVALIDARG if bad [in] passed, [out] value is NULL
  */
  [propget] HRESULT columnDescription
    (
     [in] long column,
     [out, retval] BSTR *description
    );

  /** @brief Returns the number of columns occupied by the accessible object 
    at the specified row and column in the table.
        
   The result is greater than 1 if the specified cell spans multiple columns.
   @param [in] row
    0 based row index of the accessible for which to return the column extent.
   @param [in] column
    0 based column index of the accessible for which to return the column extent.
   @param [out] nColumnsSpanned
    Returns the 1 based column extent of the specified cell.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is 0
  */
  [propget] HRESULT columnExtentAt
    (
     [in] long row,
     [in] long column,
     [out, retval] long *nColumnsSpanned 
    );

  /** @brief Returns the column headers as an %IAccessibleTable object.
        
   Content and size of the returned table are implementation dependent.
   @param [out] accessibleTable
    The column header
   @param [out] startingRowIndex
    The 0 based row index where the header starts, usually 0.
   @retval S_OK
   @retval S_FALSE if there is no header, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT columnHeader
    (
     [out] IAccessibleTable **accessibleTable,
	 [out, retval] long *startingRowIndex
    );

  /** @brief Translates the given cell index into the corresponding column index.
   @param [in] cellIndex
    0 based index of the cell in the parent or closest ancestor table.  Typically this
	is the value returned from IAccessible2::indexInParent, but in the case where the 
	table cells are not direct children of the table this is the cell index specified 
	by the "table-cell-index" object attribute obtained from parsing the attributes 
	string returned by calling IAccessible2::attributes on the cell object.
   @param [out] columnIndex
    Returns the 0 based column index of the cell of the specified child or the index of 
    the first column if the child spans multiple columns.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is 0
  */
  [propget] HRESULT columnIndex
    (
	 [in] long cellIndex,
	 [out, retval] long *columnIndex
	);

  /** @brief Returns the total number of columns in table
   @param [out] columnCount
    Number of columns in table (including columns outside the current viewport)
   @retval S_OK
  */
  [propget] HRESULT nColumns
    (
     [out, retval] long *columnCount 
    );

  /** @brief Returns the total number of rows in table
   @param [out] rowCount
    Number of rows in table (including rows outside the current viewport)
   @retval S_OK
  */
  [propget] HRESULT nRows
    (
     [out, retval] long *rowCount 
    );

  /** @brief Returns the total number of selected cells
   @param [out] cellCount
    Number of cells currently selected
   @retval S_OK
  */
  [propget] HRESULT nSelectedChildren
    (
	 [out, retval] long *cellCount
	);

  /** @brief Returns the total number of selected columns
   @param [out] columnCount
    Number of columns currently selected
   @retval S_OK
  */
  [propget] HRESULT nSelectedColumns
    (
     [out, retval] long *columnCount 
    );

  /** @brief Returns the total number of selected rows
   @param [out] rowCount
    Number of rows currently selected
   @retval S_OK
  */
  [propget] HRESULT nSelectedRows
    (
     [out, retval] long *rowCount 
    );

  /** @brief Returns the description text of the specified row in the table.
   @param [in] row
    The 0 based index of the row for which to retrieve the description.
   @param [out] description
    Returns the description text of the specified row in the table if such a 
    description exists.  Otherwise a NULL pointer is returned.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
   @retval E_INVALIDARG if bad [in] passed, [out] value is NULL
  */
  [propget] HRESULT rowDescription
    (
     [in] long row, 
     [out, retval] BSTR *description
    );

  /** @brief Returns the number of rows occupied by the accessible object 
    at the specified row and column in the table.
        
   The result is greater than 1 if the specified cell spans multiple rows.
   @param [in] row
    0 based row index of the accessible for which to return the row extent.
   @param [in] column
    0 based column index of the accessible for which to return the row extent.
   @param [out] nRowsSpanned
    Returns the row extent of the specified cell.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is 0
  */
  [propget] HRESULT rowExtentAt
    (
     [in] long row,
     [in] long column,
     [out, retval] long *nRowsSpanned
    );

  /** @brief Returns the row headers as an %IAccessibleTable object.
        
   Content and size of the returned table are implementation dependent.
   @param [out] accessibleTable
    The row header.
   @param [out] startingColumnIndex
    The 0 based column index where the header starts, usually 0.
   @retval S_OK
   @retval S_FALSE if there is no header, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT rowHeader
    (
     [out] IAccessibleTable **accessibleTable,
	 [out, retval] long *startingColumnIndex
    );

  /** @brief Translates the given cell index into a row index.
   @param [in] cellIndex
    0 based index of the cell in the parent or closest ancestor table.  Typically this 
	is the value returned from IAccessible2::indexInParent, but in the case where the 
	table cells are not direct children of the table this is the cell index specified 
	by the "table-cell-index" object attribute obtained from parsing the attributes 
	string returned by calling IAccessible2::attributes on the cell object.
   @param [out] rowIndex
    0 based row index
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is 0
  */
  [propget] HRESULT rowIndex
    (
	 [in] long cellIndex,
	 [out, retval] long *rowIndex 
	);

  /** @brief Returns a list of cell indexes currently selected (0 based).
   @param [in] maxChildren
    This parameter is ignored. Refer to @ref _arrayConsideration
	"Special Consideration when using Arrays" for more details.
   @param [out] children
    An array of cell indexes of selected cells (each index is 0 based), 
	allocated by the server. The client must free it with CoTaskMemFree.
   @param [out] nChildren
    The number of cell indexes returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there are none, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT selectedChildren
    (
     [in] long maxChildren,
     [out, size_is(,maxChildren), length_is(,*nChildren)] long **children,
     [out, retval] long *nChildren
    );

  /** @brief Returns a list of column indexes currently selected (0 based).
   @param [in] maxColumns
    This parameter is ignored. Refer to @ref _arrayConsideration 
	"Special Consideration when using Arrays" for more details.
   @param [out] columns
	An array of column indexes of selected columns (each index is 0 based), allocated
	by the server. The client must free it with CoTaskMemFree.
   @param [out] nColumns
    The number of column indexes returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there are none, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT selectedColumns
    (
     [in] long maxColumns,
     [out, size_is(,maxColumns), length_is(,*nColumns)] long **columns,
     [out, retval] long *nColumns
    );

  /** @brief Returns a list of row indexes currently selected (0 based).
   @param [in] maxRows
    This parameter is ignored. Refer to @ref _arrayConsideration
	"Special Consideration when using Arrays" for more details.
   @param [out] rows
    An array of row indexes of selected rows (each index is 0 based), allocated
	by the server. The client must free it with CoTaskMemFree.
   @param [out] nRows
    The number of row indexes returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there are none, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT selectedRows
    (
     [in] long maxRows, 
     [out, size_is(,maxRows), length_is(,*nRows)] long **rows, 
     [out, retval] long *nRows 
    );

  /** @brief Returns the summary description of the table.  The returned object could be 
    an IAccessible or an IAccessible2.
   @param [out] accessible
    Returns a reference to an implementation dependent accessible object 
    representing the table's summary or a NULL pointer if the table 
    does not support a summary.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
  */
  [propget] HRESULT summary
    (
     [out, retval] IUnknown **accessible 
    );

  /** @brief Returns a boolean value indicating whether the specified column is 
    completely selected.
   @param [in] column
    0 based index of the column for which to determine whether it is selected.
   @param [out] isSelected
    Returns TRUE if the specified column is selected completely and FALSE otherwise.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is FALSE
  */
  [propget] HRESULT isColumnSelected
    (
     [in] long column,
     [out, retval] boolean *isSelected
    );

  /** @brief Returns a boolean value indicating whether the specified row is completely 
    selected.
   @param [in] row
    0 based index of the row for which to determine whether it is selected.
   @param [out] isSelected
    Returns TRUE if the specified row is selected completely and FALSE otherwise.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is FALSE
  */
  [propget] HRESULT isRowSelected
    (
     [in] long row,
     [out, retval] boolean *isSelected
    );

  /** @brief Returns a boolean value indicating whether the specified cell is selected.
   @param [in] row
    0 based index of the row for the cell to determine whether it is selected.
   @param [in] column
    0 based index of the column for the cell to determine whether it is selected.
   @param [out] isSelected
    Returns TRUE if the specified cell is selected and FALSE otherwise.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is FALSE
  */
  [propget] HRESULT isSelected
    (
     [in] long row,
     [in] long column,
     [out, retval] boolean *isSelected 
    );

  /** @brief Selects a row and unselects all previously selected rows.
   @param [in] row
    0 based index of the row to be selected.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT selectRow
    (
     [in] long row 
    );

  /** @brief Selects a column and unselects all previously selected columns.
   @param [in] column
    0 based index of the column to be selected.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT selectColumn
    (
     [in] long column
    );

  /** @brief Unselects one row, leaving other selected rows selected (if any).
   @param [in] row
    0 based index of the row to be unselected.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT unselectRow
    (
     [in] long row
    );

  /** @brief Unselects one column, leaving other selected columns selected (if any).
   @param [in] column
    0 based index of the column to be unselected.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT unselectColumn
    (
     [in] long column
    );
  
  /** @brief Given a cell index, gets the row and column indexes and extents of a cell 
    and whether or not it is selected.

   This is a convenience function.  It is not mandatory to implement it.
   @param [in] index
    0 based index of this cell in the table.
   @param [out] row
    0 based row index.
   @param [out] column
    0 based column index.
   @param [out] rowExtents
    Number of cells spanned by this cell in this row.
   @param [out] columnExtents
    Number of cells spanned by this cell in this column.
   @param [out] isSelected
    Indicates if the specified cell is selected.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] values are 0s and FALSE respectively
  */
  [propget] HRESULT rowColumnExtentsAtIndex
    (
	 [in] long index, 
	 [out] long *row,  
	 [out] long *column,
	 [out] long *rowExtents,
	 [out] long *columnExtents,
	 [out, retval] boolean *isSelected
	);

  /** @brief Returns the type and extents describing how a table changed.
  
   Provided for use by the IA2_EVENT_TABLE_MODEL_CHANGED event handler.

   This data is only guaranteed to be valid while the thread notifying the event 
   continues. Once the handler has returned, the validity of the data depends on 
   how the server manages the life cycle of its objects. Also, note that the server 
   may have different life cycle management strategies for controls depending on 
   whether or not a control manages its children. Lists, trees, and tables can have 
   a large number of children and thus it's possible that the child objects for those 
   controls would only be created as needed. Servers should document their life cycle 
   strategy as this will be of interest to assistive technology or script engines 
   accessing data out of process or from other threads. Servers only need to save the 
   most recent row and column values associated with the change and a scope of the 
   entire application is adequate.

   @param [out] modelChange
    A struct of (type(insert, delete, update), firstRow, lastRow, firstColumn, lastColumn).
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
  */
  [propget] HRESULT modelChange
    (
	 [out, retval] IA2TableModelChange *modelChange
    );

}
/*************************************************************************
 *
 *  File Name (AccessibleTable2.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2012 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. 
 * 
 ************************************************************************/ 







/** @brief This interface gives access to a two-dimensional table.

 Please also refer to the IAccessibleTableCell interface.

 If you want to support older applications you should also support the
  IAccessibleTable inteface.
*/
[object, uuid(6167f295-06f0-4cdd-a1fa-02e25153d869)]
interface IAccessibleTable2 : IUnknown
{

  /** @brief Returns the accessible object at the specified row and column in 
    the table.  This object could be an IAccessible or an IAccessible2.
   @param [in] row
    The 0 based row index for which to retrieve the cell.
   @param [in] column
    The 0 based column index for which to retrieve the cell.
   @param [out] cell
    If both row and column index are valid then the corresponding accessible 
    object is returned that represents the requested cell regardless of whether 
    the cell is currently visible (on the screen).
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT cellAt
    (
     [in] long row, 
     [in] long column,
     [out, retval] IUnknown **cell
    );

  /** @brief Returns the caption for the table.  The returned object could be 
    an IAccessible or an IAccessible2.
   @param [out] accessible
    If the table has a caption then a reference to it is returned, else a NULL 
    pointer is returned.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL
   @deprecated use a describedBy relation
  */
  [propget] HRESULT caption
    (
     [out, retval] IUnknown **accessible
    );
	  
  /** @brief Returns the description text of the specified column in the table.
   @param [in] column
    The 0 based index of the column for which to retrieve the description.
   @param [out] description
    Returns the description text of the specified column in the table if such a 
    description exists.  Otherwise a NULL pointer is returned.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT columnDescription
    (
     [in] long column,
     [out, retval] BSTR *description
    );


  /** @brief Returns the total number of columns in table
   @param [out] columnCount
    Number of columns in table (including columns outside the current viewport)
   @retval S_OK
  */
  [propget] HRESULT nColumns
    (
     [out, retval] long *columnCount 
    );

  /** @brief Returns the total number of rows in table
   @param [out] rowCount
    Number of rows in table (including rows outside the current viewport)
   @retval S_OK
  */
  [propget] HRESULT nRows
    (
     [out, retval] long *rowCount 
    );

  /** @brief Returns the total number of selected cells
   @param [out] cellCount
    Number of cells currently selected
   @retval S_OK
  */
  [propget] HRESULT nSelectedCells
    (
     [out, retval] long *cellCount
    );

  /** @brief Returns the total number of selected columns
   @param [out] columnCount
    Number of columns currently selected
   @retval S_OK
  */
  [propget] HRESULT nSelectedColumns
    (
     [out, retval] long *columnCount 
    );

  /** @brief Returns the total number of selected rows
   @param [out] rowCount
    Number of rows currently selected
   @retval S_OK
  */
  [propget] HRESULT nSelectedRows
    (
     [out, retval] long *rowCount 
    );

  /** @brief Returns the description text of the specified row in the table.
   @param [in] row
    The 0 based index of the row for which to retrieve the description.
   @param [out] description
    Returns the description text of the specified row in the table if such a 
    description exists.  Otherwise a NULL pointer is returned.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT rowDescription
    (
     [in] long row, 
     [out, retval] BSTR *description
    );

  /** @brief Returns a list of accessibles currently selected.
   @param [out] cells
    Pointer to an array of references to selected accessibles.  The array is
    allocated by the server with CoTaskMemAlloc and freed by the client with
    CoTaskMemFree.
   @param [out] nSelectedCells
    The number of accessibles returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there are none, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT selectedCells
    (
     [out, size_is(,*nSelectedCells)] IUnknown ***cells,
     [out, retval] long *nSelectedCells
    );

  /** @brief Returns a list of column indexes currently selected (0 based).
   @param [out] selectedColumns
    A pointer to an array of column indexes of selected columns (each index is
    0 based).  The array is allocated by the server with CoTaskMemAlloc and
    freed by the client with CoTaskMemFree.
   @param [out] nColumns
    The number of column indexes returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there are none, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT selectedColumns
    (
     [out, size_is(,*nColumns)] long **selectedColumns,
     [out, retval] long *nColumns
    );

  /** @brief Returns a list of row indexes currently selected (0 based).
   @param [out] selectedRows
    An array of row indexes of selected rows (each index is 0 based).  The array
    is allocated by the server with CoTaskMemAlloc and freed by the client with
    CoTaskMemFree.
   @param [out] nRows
    The number of row indexes returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there are none, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT selectedRows
    (
     [out, size_is(,*nRows)] long **selectedRows, 
     [out, retval] long *nRows 
    );

  /** @brief Returns the summary description of the table.  The returned object could be 
    an IAccessible or an IAccessible2.
   @param [out] accessible
    Returns a reference to an implementation dependent accessible object 
    representing the table's summary or a NULL pointer if the table 
    does not support a summary.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL
   @deprecated Use the labeledBy relation
  */
  [propget] HRESULT summary
    (
     [out, retval] IUnknown **accessible 
    );

  /** @brief Returns a boolean value indicating whether the specified column is 
    completely selected.
   @param [in] column
    0 based index of the column for which to determine whether it is selected.
   @param [out] isSelected
    Returns TRUE if the specified column is selected completely and FALSE otherwise.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT isColumnSelected
    (
     [in] long column,
     [out, retval] boolean *isSelected
    );

  /** @brief Returns a boolean value indicating whether the specified row is completely 
    selected.
   @param [in] row
    0 based index of the row for which to determine whether it is selected.
   @param [out] isSelected
    Returns TRUE if the specified row is selected completely and FALSE otherwise.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  [propget] HRESULT isRowSelected
    (
     [in] long row,
     [out, retval] boolean *isSelected
    );

  /** @brief Selects a row and unselects all previously selected rows.

   The behavior should mimic that of the application, but for those applications
    which do not have a means in the GUI to select a full row of cells the behavior 
    should be as follows:  First any selected rows in the table are unselected.  Then
    the entire row of cells for the specified row is selected.  If any of the
    cells in the selected row span additional rows, the cells in those rows
    are also selected. 
   @param [in] row
    0 based index of the row to be selected.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT selectRow
    (
     [in] long row 
    );

  /** @brief Selects a column and unselects all previously selected columns.

   The behavior should mimic that of the application, but for those applications
    which do not have a means in the GUI to select a full column of cells the behavior 
    should be as follows:  First any selected columns in the table are unselected.  Then
    the entire column of cells for the specified column is selected.  If any of the
    cells in the selected column span additional columns, the cells in those columns
    are also selected. 
   @param [in] column
    0 based index of the column to be selected.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT selectColumn
    (
     [in] long column
    );

  /** @brief Unselects one row, leaving other selected rows selected (if any).

   The behavior should mimic that of the application, but for those applications
    which do not have a means in the GUI to unselect a full row of cells the
    behavior should be as follows:  The entire row of cells for the specified
    row is unselected.  If any of the cells in the selected row span additional
    rows, the cells in those rows are also unselected. 
   @param [in] row
    0 based index of the row to be unselected.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT unselectRow
    (
     [in] long row
    );

  /** @brief Unselects one column, leaving other selected columns selected (if any).

   The behavior should mimic that of the application, but for those applications
    which do not have a means in the GUI to unselect a full column of cells the
    behavior should be as follows:  The entire column of cells for the specified
    column is unselected.  If any of the cells in the selected column span additional
    columns, the cells in those columns are also unselected. 
   @param [in] column
    0 based index of the column to be unselected.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT unselectColumn
    (
     [in] long column
    );

  /** @brief Returns the type and extents describing how a table changed.
  
   Provided for use by the IA2_EVENT_TABLE_MODEL_CHANGED event handler.

   This data is only guaranteed to be valid while the thread notifying the event 
   continues. Once the handler has returned, the validity of the data depends on 
   how the server manages the life cycle of its objects. Also, note that the server 
   may have different life cycle management strategies for controls depending on 
   whether or not a control manages its children. Lists, trees, and tables can have 
   a large number of children and thus it's possible that the child objects for those 
   controls would only be created as needed. Servers should document their life cycle 
   strategy as this will be of interest to assistive technology or script engines 
   accessing data out of process or from other threads. Servers only need to save the 
   most recent row and column values associated with the change and a scope of the 
   entire application is adequate.

   @param [out] modelChange
    A struct of (type(insert, delete, update), firstRow, lastRow, firstColumn, lastColumn).
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
  */
  [propget] HRESULT modelChange
    (
     [out, retval] IA2TableModelChange *modelChange
    );

}
/*************************************************************************
 *
 *  File Name (AccessibleTableCell.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2013 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. 
 * 
 ************************************************************************/ 






/** @brief This interface gives access to the cells of a two-dimensional table.

 Please also refer to the IAccessibleTable2 interface.

*/
[object, uuid(594116B1-C99F-4847-AD06-0A7A86ECE645)]
interface IAccessibleTableCell : IUnknown
{

  /** @brief Returns the number of columns occupied by this cell accessible.
        
   The result is greater than 1 if the specified cell spans multiple columns.
   @param [out] nColumnsSpanned
    Returns the 1 based column extent of the specified cell.
   @retval S_OK
  */
  [propget] HRESULT columnExtent
    (
     [out, retval] long *nColumnsSpanned 
    );

  /** @brief Returns the column headers as an array of cell accessibles.

   @param [out] cellAccessibles
    Pointer to an array of references to cell accessibles.  The array is allocated
	by the server.  The client must free it with CoTaskMemFree.
   @param [out] nColumnHeaderCells
    The number of accessibles returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there is no header, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT columnHeaderCells
    (
     [out, size_is(,*nColumnHeaderCells)] IUnknown ***cellAccessibles,
     [out, retval] long *nColumnHeaderCells
    );

  /** @brief Translates this cell accessible into the corresponding column index.

   @param [out] columnIndex
    Returns the 0 based column index of the cell of the specified cell or the index of 
    the first column if the cell spans multiple columns.
   @retval S_OK
  */
  [propget] HRESULT columnIndex
    (
     [out, retval] long *columnIndex
    );

  /** @brief Returns the number of rows occupied by this cell accessible.
        
   @param [out] nRowsSpanned
    Returns the row extent of the specified cell.
   @retval S_OK
  */
  [propget] HRESULT rowExtent
    (
     [out, retval] long *nRowsSpanned
    );

  /** @brief Returns the row headers as an array of cell accessibles.

   @param [out] cellAccessibles
    Pointer to an array of references to cell accessibles.  The array is allocated
	by the server.  The client must free it with CoTaskMemFree.
   @param [out] nRowHeaderCells
    The number of accessibles returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there is no header, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT rowHeaderCells
    (
     [out, size_is(,*nRowHeaderCells)] IUnknown ***cellAccessibles,
     [out, retval] long *nRowHeaderCells
    );

  /** @brief Translates this cell accessible into the corresponding row index.

   @param [out] rowIndex
    Returns the 0 based row index of the specified cell or the index of 
    the first row if the cell spans multiple rows.
   @retval S_OK
  */
  [propget] HRESULT rowIndex
    (
     [out, retval] long *rowIndex 
    );

  /** @brief Returns a boolean value indicating whether this cell is selected.

   @param [out] isSelected
    Returns TRUE if the specified cell is selected and FALSE otherwise.
   @retval S_OK
  */
  [propget] HRESULT isSelected
    (
     [out, retval] boolean *isSelected 
    );
  
  /** @brief Gets the row and column indexes and extents of this cell accessible
    and whether or not it is selected.

   This is a convenience function.  It is not mandatory to implement it.
   @param [out] row
    0 based row index.
   @param [out] column
    0 based column index.
   @param [out] rowExtents
    Number of cells spanned by this cell in this row.
   @param [out] columnExtents
    Number of cells spanned by this cell in this column.
   @param [out] isSelected
    Indicates if the specified cell is selected.
   @retval S_OK
  */
  [propget] HRESULT rowColumnExtents
    (
     [out] long *row,  
     [out] long *column,
     [out] long *rowExtents,
     [out] long *columnExtents,
     [out, retval] boolean *isSelected
    );

  /** @brief Returns a reference to the accessbile of the containing table.

   @param [out] table
    Returns a reference to the IUnknown of the containing table.
   @retval S_OK
  */
  [propget] HRESULT table
    (
     [out, retval] IUnknown **table
    );

}
/*************************************************************************
 *
 *  File Name (AccessibleImage.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. 
 * 
 ************************************************************************/ 






/** @brief This interface represents images and icons.

 This interface is used for a representation of images like icons on buttons.
  %IAccessibleImage only needs to be implemented in certain situations.  Some
  examples are:
  <ol>
   <li>The accessible name and description are not enough to fully
    describe the image, e.g. when the accessible description is used to define the
    behavior of an actionable image and the image itself conveys semantically
    significant information.
   <li>The user can edit the content that includes an
    image and therefore the user needs to be able to review the image's position.
  </ol>
*/
[object, uuid(FE5ABB3D-615E-4f7b-909F-5F0EDA9E8DDE)]
interface IAccessibleImage : IUnknown
{
  /** @brief Returns the localized description of the image.          
   @param [out] description
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL
  */
  [propget] HRESULT description
    (
     [out, retval] BSTR *description
    );

  /** @brief Returns the coordinates of the image.
   @param [in] coordinateType
    Specifies whether the returned coordinates should be relative to the screen or the parent object.
   @param [out] x
   @param [out] y
   @retval S_OK
  */
  [propget] HRESULT imagePosition
    (
	 [in] enum IA2CoordinateType coordinateType,
	 [out] long *x,
     [out, retval] long *y
    );

  /** @brief Returns the size of the image in units specified by parent's coordinate system.
   @param [out] height
   @param [out] width
   @retval S_OK
  */

  [propget] HRESULT imageSize
    (
     [out] long *height,
	 [out, retval] long *width
    );
}
/*************************************************************************
 *
 *  File Name (AccessibleEventID.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. 
 * 
 ************************************************************************/ 

/** %IAccessible2 specific event constants 

 This enum defines the event IDs fired by %IAccessible2 objects.  The event IDs
 are in addition to those used by MSAA.
*/
enum IA2EventID {

  /** The change of the number or attributes of actions of an accessible
    object is signaled by events of this type. 
  */
  IA2_EVENT_ACTION_CHANGED = 0x101,

  /** <b>Deprecated.</b> The active descendant of a component has changed.
	
	Note: This event constant is misspelled and thus is deprecated and will be
	removed in a later version. Please use the correctly spelled version which
	follows.
  */
  IA2_EVENT_ACTIVE_DECENDENT_CHANGED,

  /** The active descendant of a component has changed.  The active descendant 
    is used in objects with transient children.  

    Note: Due to the fact that MSAA's WinEvents don't allow the active child index
	to be passed on the IA2_EVENT_ACTIVE_DESCENDANT_CHANGED event the manages
	descendants	scheme can't be used.  Instead the active child object has to fire
	MSAA's EVENT_OBJECT_FOCUS.  In a future release a new event mechanism may be
	added to provide for event specific data to be passed with the event.  At that
	time the IA2_EVENT_ACTIVE_DECENDENT_CHANGED event and
	IA2_STATE_MANAGES_DESCENDANTS state would be useful.
  */
  IA2_EVENT_ACTIVE_DESCENDANT_CHANGED = IA2_EVENT_ACTIVE_DECENDENT_CHANGED,

  /** The document wide attributes of the document object have changed.
  */
  IA2_EVENT_DOCUMENT_ATTRIBUTE_CHANGED,

  /** The contents of the document have changed.
  */
  IA2_EVENT_DOCUMENT_CONTENT_CHANGED,

  /** The loading of the document has completed.
  */
  IA2_EVENT_DOCUMENT_LOAD_COMPLETE,

  /** The loading of the document was interrupted.
  */
  IA2_EVENT_DOCUMENT_LOAD_STOPPED,

  /** The document contents are being reloaded.
  */
  IA2_EVENT_DOCUMENT_RELOAD,

  /** The ending index of this link within the containing string has changed.
  */
  IA2_EVENT_HYPERLINK_END_INDEX_CHANGED,

  /** The number of anchors associated with this hyperlink object has changed.
  */
  IA2_EVENT_HYPERLINK_NUMBER_OF_ANCHORS_CHANGED,

  /** The hyperlink selected state changed from selected to unselected or
    from unselected to selected.
  */
  IA2_EVENT_HYPERLINK_SELECTED_LINK_CHANGED,

  /** One of the links associated with the hypertext object has been activated.
  */
  IA2_EVENT_HYPERTEXT_LINK_ACTIVATED,

  /** One of the links associated with the hypertext object has been selected.
  */
  IA2_EVENT_HYPERTEXT_LINK_SELECTED,

  /** The starting index of this link within the containing string has changed.
  */
  IA2_EVENT_HYPERLINK_START_INDEX_CHANGED,

  /** Focus has changed from one hypertext object to another, or focus moved
   from a non-hypertext object to a hypertext object, or focus moved from a
   hypertext object to a non-hypertext object.
  */
  IA2_EVENT_HYPERTEXT_CHANGED,

  /** The number of hyperlinks associated with a hypertext object changed
  */
  IA2_EVENT_HYPERTEXT_NLINKS_CHANGED,

  /** An object's attributes changed.
  Also see ::IA2_EVENT_TEXT_ATTRIBUTE_CHANGED.
  */
  IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED,

  /** A slide changed in a presentation document or a page boundary was 
   crossed in a word processing document.
  */
  IA2_EVENT_PAGE_CHANGED,  

  /** The caret moved from one section to the next.
  */
  IA2_EVENT_SECTION_CHANGED,
  
  /** A table caption changed.
  */
  IA2_EVENT_TABLE_CAPTION_CHANGED,

  /** A table's column description changed.
  */
  IA2_EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED,

  /** A table's column header changed.
  */
  IA2_EVENT_TABLE_COLUMN_HEADER_CHANGED,

  /** A table's data changed.
  */
  IA2_EVENT_TABLE_MODEL_CHANGED,

  /** A table's row description changed.
  */
  IA2_EVENT_TABLE_ROW_DESCRIPTION_CHANGED,

  /** A table's row header changed.
  */
  IA2_EVENT_TABLE_ROW_HEADER_CHANGED,

  /** A table's summary changed.
  */
  IA2_EVENT_TABLE_SUMMARY_CHANGED,

  /** A text object's attributes changed.
  Also see ::IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED.
  */
  IA2_EVENT_TEXT_ATTRIBUTE_CHANGED,

  /** The caret has moved to a new position.
  */
  IA2_EVENT_TEXT_CARET_MOVED,

  /** <b>Deprecated.</b>  This event is equivalent to ::IA2_EVENT_TEXT_UPDATED.
  */
  IA2_EVENT_TEXT_CHANGED,

  /** The caret moved from one column to the next.
  */
  IA2_EVENT_TEXT_COLUMN_CHANGED,

  /** Text was inserted.
  */
  IA2_EVENT_TEXT_INSERTED,

  /** Text was removed.
  */
  IA2_EVENT_TEXT_REMOVED,

  /** This event indicates general text changes, i.e. changes to text that are 
    exposed through the IAccessibleText interface.  For compatibility with ATK/AT-SPI
	which does not have an equivalent event, servers can alternatively fire 
	::IA2_EVENT_TEXT_REMOVED and ::IA2_EVENT_TEXT_INSERTED.
  */
  IA2_EVENT_TEXT_UPDATED,

  /** The text selection changed.  Later versions of Microsoft development environments 
   have an equivalent event identified, EVENT_OBJECT_TEXTSELECTIONCHANGED.  Servers 
   should use that if it is available and use IA2_EVENT_TEXT_SELECTION_CHANGED otherwise.  
   Clients should be prepared to respond to either event.

  */
  IA2_EVENT_TEXT_SELECTION_CHANGED,

  /** A visible data event indicates the change of the visual appearance
    of an accessible object.  This includes for example most of the
    attributes available via the IAccessibleComponent interface.
  */
  IA2_EVENT_VISIBLE_DATA_CHANGED

};
/*************************************************************************
 *
 *  File Name (AccessibleApplication.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. 
 * 
 ************************************************************************/ 






/** @brief This interface gives access to the application's name and version information.
        
 This interface provides the AT with the information it needs to differentiate 
 this application from other applications, from other versions of this 
 application, or from other versions of this application running on different 
 versions of an accessibility bridge or accessibility toolkit.

 Servers implementing IAccessible2 should provide access to the %IAccessibleApplication 
 interface via QueryService from any object so that ATs can easily determine specific 
 information about the application such as its name or version.
*/
[object, uuid(D49DED83-5B25-43F4-9B95-93B44595979E)]
interface IAccessibleApplication : IUnknown
{
  
  /** @brief Returns the application name.
   @param [out] name
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL
  */
  [propget] HRESULT appName
    (
     [out, retval] BSTR *name
    );

  /** @brief Returns the application version.
   @param [out] version
    The version string must not contain levels when it is know beforehand that
    this information will never require a change in a client's behavior.
    For example, use "3.6.0" rather than "3.6.0.v201005131500".
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL
  */
  [propget] HRESULT appVersion
    (
     [out, retval] BSTR *version
    );

  /** @brief Returns the toolkit/bridge name.
   @param [out] name
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL
  */
  [propget] HRESULT toolkitName
    (
     [out, retval] BSTR *name
    );

  /** @brief Returns the toolkit/bridge version.
   @param [out] version
    The version string must not contain levels when it is know beforehand that
    this information will never require a change in a client's behavior.
    For example, use "3.6.0" rather than "3.6.0.v201005131500".
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL
  */
  [propget] HRESULT toolkitVersion
    (
     [out, retval] BSTR *version
    );  

}

/*************************************************************************
 *
 *  File Name (AccessibleDocument.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2013 Linux Foundation 
 *  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. 
 * 
 ************************************************************************/ 





/** @brief This interface represents documents.

 This interface is used for a representation of documents.
*/
[object, uuid(C48C7FCF-4AB5-4056-AFA6-902D6E1D1149)]
interface IAccessibleDocument : IUnknown
{
  /** @brief Returns the most recently used anchor target within a document.
  
   A document's most recently targeted in-page anchor is returned.  A typical use
    of this method is to fetch the anchor target within an HTML document.  In this
    case anchor targets are those which have been defined with the &lt;a&gt; tag.  

   @param [out] accessible
   @retval S_OK
   @retval S_FALSE if there are no existing valid anchor targets, [out] value is NULL.
  */
  [propget] HRESULT anchorTarget
    (
     [out, retval] IUnknown **accessible
    );

}
/*************************************************************************
 *
 *  File Name (IA2TypeLibrary.idl)
 * 
 *  IAccessible2 IDL Specification 
 * 
 *  Copyright (c) 2007, 2012 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. 
 * 
 ************************************************************************/ 

// This is not a standalone file.  It is to be appended to the end of the 
// merged IDL file.

cpp_quote("")
cpp_quote("// Type Library Definitions")
cpp_quote("")

[
    uuid(CE3F726E-D1D3-44FE-B995-FF1DB3B48B2B),
    helpstring("IAccessible2 Type Library"),
    version(1.3),
    hidden
]

library IAccessible2Lib
{
    importlib ("stdole2.tlb");
    importlib ("oleacc.dll");
    interface IAccessible2;
    interface IAccessible2_2;
    interface IAccessibleAction;
    interface IAccessibleApplication;
    interface IAccessibleComponent;
    interface IAccessibleDocument;
    interface IAccessibleEditableText;
    interface IAccessibleHyperlink;
    interface IAccessibleHypertext;
    interface IAccessibleHypertext2;
    interface IAccessibleImage;
    interface IAccessibleRelation;
    interface IAccessibleTable;
    interface IAccessibleTable2;
    interface IAccessibleTableCell;
    interface IAccessibleText;
    interface IAccessibleText2;
    interface IAccessibleValue;
    enum IA2CoordinateType;
    enum IA2EventID;
    enum IA2Role;
    enum IA2ScrollType;
    enum IA2States;
    enum IA2TableModelChangeType;
    enum IA2TextBoundaryType;
    enum IA2TextSpecialOffsets;
}
