/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/

import "oaidl.idl";
import "ocidl.idl";

import "ia2_api_all.idl";
import "defines.idl";

	[
		object,
		uuid(D00F5EB7-588A-487F-A6F6-0B5D7D1815AA),
		dual,
		helpstring("IMAccessible Interface"),
		pointer_default(unique)
	]
	interface IMAccessible : IAccessible2
	{
		[id(1), helpstring("method Put_XAccName")] HRESULT Put_XAccName(const OLECHAR* pszName);
		[id(2), helpstring("method Put_XAccRole")] HRESULT Put_XAccRole(unsigned short pRole);
		[id(3), helpstring("method DecreaseState")] HRESULT DecreaseState(DWORD pXSate);
		[id(4), helpstring("method IncreaseState")] HRESULT IncreaseState(DWORD pXSate);
		[id(5), helpstring("method Put_XDescription")] HRESULT Put_XAccDescription(const OLECHAR* pszDescription);
		[id(6), helpstring("method Put_XAccValue")] HRESULT Put_XAccValue(const OLECHAR* pszAccValue);
		[id(7), helpstring("method SetState")] HRESULT SetState(DWORD pXSate);
		[id(8), helpstring("method Put_XAccLocation")] HRESULT Put_XAccLocation(const Location sLocation);
		[id(9), helpstring("method Put_XAccFocus")] HRESULT Put_XAccFocus(long dChildID);
		[id(10), helpstring("method Put_XAccParent")] HRESULT Put_XAccParent(IMAccessible* pIParent);	
		[id(13), helpstring("method Put_XAccWindowHandle")] HRESULT Put_XAccWindowHandle(HWND hwnd);
		[id(14), helpstring("method Put_XAccChildID")] HRESULT Put_XAccChildID(long dChildID);
		[id(19), helpstring("method SetXAccessible")] HRESULT SetXAccessible( long XAccessible);
		[id(20), helpstring("method GetUNOInterface")] HRESULT GetUNOInterface(long* UNOInterface);
		[id(23), helpstring("method SetDefaultAction")] HRESULT SetDefaultAction(long pAction);
		[id(24), helpstring("method Put_ActionDescription")] HRESULT Put_ActionDescription( const OLECHAR* szAction);
		[id(25), helpstring("method Put_XAccAgent")] HRESULT Put_XAccAgent(long pAgent);
		[id(26), helpstring("method NotifyDestroy")] HRESULT NotifyDestroy(BOOL isDestroy);
		[id(30), helpstring("method Get_XAccChildID")] HRESULT Get_XAccChildID([out,retval] long* childID);
	};
	[
		object,
		uuid(951299EE-1841-4249-9E07-812C0739E489),
		dual,
		helpstring("IEnumVariant Interface"),
		pointer_default(unique)
	]
	interface IEnumVariant : IEnumVARIANT
	{
		[id(1), helpstring("method ClearEnumeration")] HRESULT ClearEnumeration();
		[id(2), helpstring("method PutSelection")] HRESULT PutSelection(long pXSeletion);	
	};
	[
		object,
		uuid(6641185C-E099-4C45-B753-3FBC0EE40646),
		dual,
		helpstring("IUNOXWrapper Interface"),
		pointer_default(unique)
	]
	interface IUNOXWrapper : IUnknown
	{
		[id(1), helpstring("method put_XInterface")] HRESULT put_XInterface(long pXInterface);
		[id(2), helpstring("method put_XSubInterface")] HRESULT put_XSubInterface(long pXSubInterface);
		[id(3), helpstring("method get_XInterface")] HRESULT get_XInterface([out,retval]long* pXInterface);
		[id(4), helpstring("method get_XSubInterface")] HRESULT get_XSubInterface([out,retval]long* pXSubInterface);
	};

[
	uuid(19ECB1B0-9376-4FF9-B580-223FC9C200B8),
	version(1.0),
	helpstring("UAccCOM 1.0 Type Library")
]
library UACCCOMLib
{
	importlib("stdole32.tlb");
	importlib("stdole2.tlb");
	importlib("oleacc.dll");

	[
		uuid(CF8DF8BA-44FE-4B10-BD2E-8C8CB322485F),
		helpstring("MAccessible Class")
	]
	coclass MAccessible
	{
		[default] interface IMAccessible;
	};
	[
		uuid(152884E0-268B-4481-9AE7-1B372D3AA97F),
		helpstring("EnumVariant Class")
	]
	coclass EnumVariant
	{
		[default] interface IEnumVariant;
	};
	[
		uuid(AA360FB0-BC98-41C1-A885-BB921F5ED601),
		helpstring("UNOXWrapper Class")
	]
	coclass UNOXWrapper
	{
		[default] interface IUNOXWrapper;
	};
	
	[
		uuid(9FD9BA47-70AF-4160-99F1-526F2B9F111B),
		helpstring("AccComponent Class")
	]
	coclass AccComponent
	{
		[default] interface IAccessibleComponent;
	};

    [
		uuid(8745CF0C-3104-4BAE-B7D0-D7B1717C006E),
		helpstring("AccRelation Class")
	]
	coclass AccRelation
	{
		[default] interface IAccessibleRelation;
	};
	[
		uuid(AA49F20E-BB4E-400D-A5B0-6F5B7B770227),
		helpstring("AccAction Class")
	]
	coclass AccAction
	{
		[default] interface IAccessibleAction;
	};

	[
		uuid(6D8AB08B-CCE9-471E-8A41-35773D5263F5),
		helpstring("AccText Class")
	]
	coclass AccText
	{
		[default] interface IAccessibleText;
	};
	
	[
		uuid(79CE1450-1F61-48E2-BF76-C07BD10105E2),
		helpstring("AccEditableText Class")
	]
	coclass AccEditableText
	{
		[default] interface IAccessibleEditableText;
	};	

	[
		uuid(CC55D71B-1828-4EE0-89E2-C3749CF9C9AB),
		helpstring("AccHypertext Class")
	]
	coclass AccHypertext
	{
		[default] interface IAccessibletext;
	};

	
	[
		uuid(73A45800-7A62-432C-A1A6-BF8852994331),
		helpstring("AccImage Class")
	]
	coclass AccImage
	{
		[default] interface IAccessibleImage;
	};
	
	[
		uuid(730A561B-1AF6-49E1-9C04-9A2F48CD8512),
		helpstring("AccValue Class")
	]
	coclass AccValue
	{
		[default] interface IAccessibleValue;
	};
	[
		uuid(92BAA62D-535A-4EAB-9ABB-BFA60B7A6DB6),
		helpstring("AccTable Class")
	]
	coclass AccTable
	{
		[default] interface IAccessibleTable;
	};
	
	[
		uuid(519A64CD-F6A6-4793-BE50-4E36C4C593EF),
		helpstring("AccHyperLink Class")
	]
	coclass AccHyperLink
	{
		[default] interface IAccessibleAction;
	};
	
};
