/*************************************************************************
 *
 *  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. 
 * 
 ************************************************************************/ 

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

/** 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
    );

}
