13a700b0aSSteve Yin /**************************************************************
2b0a7a3cfSSteve Yin *
3b0a7a3cfSSteve Yin * Licensed to the Apache Software Foundation (ASF) under one
4b0a7a3cfSSteve Yin * or more contributor license agreements.  See the NOTICE file
5b0a7a3cfSSteve Yin * distributed with this work for additional information
6b0a7a3cfSSteve Yin * regarding copyright ownership.  The ASF licenses this file
7b0a7a3cfSSteve Yin * to you under the Apache License, Version 2.0 (the
8b0a7a3cfSSteve Yin * "License"); you may not use this file except in compliance
9b0a7a3cfSSteve Yin * with the License.  You may obtain a copy of the License at
10b0a7a3cfSSteve Yin *
11b0a7a3cfSSteve Yin *   http://www.apache.org/licenses/LICENSE-2.0
12b0a7a3cfSSteve Yin *
13b0a7a3cfSSteve Yin * Unless required by applicable law or agreed to in writing,
14b0a7a3cfSSteve Yin * software distributed under the License is distributed on an
15b0a7a3cfSSteve Yin * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b0a7a3cfSSteve Yin * KIND, either express or implied.  See the License for the
17b0a7a3cfSSteve Yin * specific language governing permissions and limitations
18b0a7a3cfSSteve Yin * under the License.
19b0a7a3cfSSteve Yin *
20b0a7a3cfSSteve Yin *************************************************************/
215fdc4257SSteve Yin 
225fdc4257SSteve Yin #include "stdafx.h"
235fdc4257SSteve Yin #include "UAccCOM2.h"
245fdc4257SSteve Yin #include "MAccessible.h"
255fdc4257SSteve Yin 
265fdc4257SSteve Yin #include <algorithm>
275fdc4257SSteve Yin #include "AccAction.h"
285fdc4257SSteve Yin 
295fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleText.hpp>
305fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleEditableText.hpp>
315fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleImage.hpp>
325fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleTable.hpp>
335fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleExtendedComponent.hpp>
345fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleAction.hpp>
355fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleKeyBinding.hpp>
365fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleHyperText.hpp>
375fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleHyperlink.hpp>
385fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleRelationSet.hpp>
395fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleStateType.hpp>
405fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleRole.hpp>
415fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleGroupPosition.hpp>
425fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleValue.hpp>
435fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleExtendedAttributes.hpp>
445fdc4257SSteve Yin #include <com/sun/star/style/LineSpacing.hpp>
455fdc4257SSteve Yin #include <com/sun/star/style/TabStop.hpp>
465fdc4257SSteve Yin #include <com/sun/star/container/XIndexReplace.hpp>
475fdc4257SSteve Yin 
48b0a7a3cfSSteve Yin #include "act.hxx"
493a700b0aSSteve Yin 
505fdc4257SSteve Yin using namespace com::sun::star::accessibility::AccessibleStateType;
515fdc4257SSteve Yin 
525fdc4257SSteve Yin // IA2 states mapping, and name
535fdc4257SSteve Yin // maintenance the consistency, change one array, change the three all
545fdc4257SSteve Yin long IA2_STATES[] =
55b0a7a3cfSSteve Yin {
56b0a7a3cfSSteve Yin 	IA2_STATE_ACTIVE,					// =					0x1;
57b0a7a3cfSSteve Yin 	IA2_STATE_ARMED,					// =					0x2;
58b0a7a3cfSSteve Yin 	IA2_STATE_DEFUNCT,					// =					0x4;
59b0a7a3cfSSteve Yin 	IA2_STATE_EDITABLE,					// =					0x8;
60b0a7a3cfSSteve Yin 	IA2_STATE_HORIZONTAL,				// =					0x10;
61b0a7a3cfSSteve Yin 	IA2_STATE_ICONIFIED,				// =					0x20;
62b0a7a3cfSSteve Yin 	IA2_STATE_INVALID_ENTRY,			// =					0x80;
63b0a7a3cfSSteve Yin 	IA2_STATE_MANAGES_DESCENDANTS,		// =					0x100;
64b0a7a3cfSSteve Yin 	IA2_STATE_MODAL,					// =					0x200;
65b0a7a3cfSSteve Yin 	IA2_STATE_MULTI_LINE,				// =					0x400;
66b0a7a3cfSSteve Yin 	IA2_STATE_OPAQUE,					// =					0x800;
67b0a7a3cfSSteve Yin 	IA2_STATE_REQUIRED,					// =					0x2000;
68b0a7a3cfSSteve Yin 	IA2_STATE_SELECTABLE_TEXT,			// =					0x3000;
69b0a7a3cfSSteve Yin 	IA2_STATE_SINGLE_LINE,				// =					0x4000;
70b0a7a3cfSSteve Yin 	IA2_STATE_STALE,					// =					0x8000;
71b0a7a3cfSSteve Yin 	IA2_STATE_SUPPORTS_AUTOCOMPLETION,	// =					0x10000;
72b0a7a3cfSSteve Yin 	IA2_STATE_TRANSIENT,				//=						0x20000;
73b0a7a3cfSSteve Yin 	IA2_STATE_VERTICAL					// =					0x40000;
74b0a7a3cfSSteve Yin };
755fdc4257SSteve Yin /*
76b0a7a3cfSSteve Yin 
775fdc4257SSteve Yin <=== map ===>
78b0a7a3cfSSteve Yin 
795fdc4257SSteve Yin */
805fdc4257SSteve Yin short UNO_STATES[] =
81b0a7a3cfSSteve Yin {
82b0a7a3cfSSteve Yin 	ACTIVE,			// = (sal_Int16)1;
83b0a7a3cfSSteve Yin 	ARMED,			// = (sal_Int16)2;
84b0a7a3cfSSteve Yin 	DEFUNC,			// = (sal_Int16)5;
85b0a7a3cfSSteve Yin 	EDITABLE,		// = (sal_Int16)6;
86b0a7a3cfSSteve Yin 	HORIZONTAL,		// = (sal_Int16)12;
87b0a7a3cfSSteve Yin 	ICONIFIED,		// = (sal_Int16)13;
88b0a7a3cfSSteve Yin 	-1,				//IA2_STATE_INVALID_ENTRY
89b0a7a3cfSSteve Yin 	MANAGES_DESCENDANTS, // = (sal_Int16)15;
90b0a7a3cfSSteve Yin 	MODAL,			// = (sal_Int16)16;
91b0a7a3cfSSteve Yin 	MULTI_LINE,		// = (sal_Int16)17;
92b0a7a3cfSSteve Yin 	OPAQUE,			// = (sal_Int16)19;
93b0a7a3cfSSteve Yin 	-1,				//IA2_STATE_REQUIRED
94b0a7a3cfSSteve Yin 	-1,				//IA2_STATE_SELECTABLE_TEXT
95b0a7a3cfSSteve Yin 	SINGLE_LINE,	// = (sal_Int16)26;
96b0a7a3cfSSteve Yin 	STALE,			// = (sal_Int16)27;
97b0a7a3cfSSteve Yin 	-1,				//IA2_STATE_SUPPORTS_AUTOCOMPLETION
98b0a7a3cfSSteve Yin 	TRANSIENT,		//IA2_STATE_TRANSIENT
99b0a7a3cfSSteve Yin 	VERTICAL		// = (sal_Int16)29;
100b0a7a3cfSSteve Yin };
1015fdc4257SSteve Yin 
1025fdc4257SSteve Yin //  <=== map ===>
1035fdc4257SSteve Yin 
1045fdc4257SSteve Yin BSTR IA2_STATES_NAME[] =
105b0a7a3cfSSteve Yin {
106b0a7a3cfSSteve Yin 	_T("Active"),
107b0a7a3cfSSteve Yin 	_T("Armed"),
108b0a7a3cfSSteve Yin 	_T("Defunct"),
109b0a7a3cfSSteve Yin 	_T("Editable"),
110b0a7a3cfSSteve Yin 	_T("Horizontal"),
111b0a7a3cfSSteve Yin 	_T("Iconified"),
112b0a7a3cfSSteve Yin 	_T("Invalid Entry"),
113b0a7a3cfSSteve Yin 	_T("Manages Decendents"),
114b0a7a3cfSSteve Yin 	_T("Modal"),
115b0a7a3cfSSteve Yin 	_T("Multi Line"),
116b0a7a3cfSSteve Yin 	_T("Opaque"),
117b0a7a3cfSSteve Yin 	_T("Required"),
118b0a7a3cfSSteve Yin 	_T("Selectable Text"),
119b0a7a3cfSSteve Yin 	_T("Single Line"),
120b0a7a3cfSSteve Yin 	_T("Stale"),
121b0a7a3cfSSteve Yin 	_T("Supports Autocompletion"),
122b0a7a3cfSSteve Yin 	_T("Transient"),
123b0a7a3cfSSteve Yin 	_T("Vertical")
124b0a7a3cfSSteve Yin };
1255fdc4257SSteve Yin 
1265fdc4257SSteve Yin // IA2 states mapping, and name
1275fdc4257SSteve Yin // maintenance the consistency. change one, change them all
1285fdc4257SSteve Yin 
1295fdc4257SSteve Yin BSTR UNO_ALL_STATES[] =
130b0a7a3cfSSteve Yin {
131b0a7a3cfSSteve Yin 	_T("INVALID"),			// 	INVALID	( 0 )
132b0a7a3cfSSteve Yin 	_T("ACTIVE"),			// 	ACTIVE	( 1 )
133b0a7a3cfSSteve Yin 	_T("ARMED"),			// 	ARMED	( 2 )
134b0a7a3cfSSteve Yin 	_T("BUSY"),				// 	BUSY	( 3 )
135b0a7a3cfSSteve Yin 	_T("CHECKED"),			// 	CHECKED	( 4 )
136b0a7a3cfSSteve Yin 	_T("DEFUNC"),			// 	DEFUNC	( 5 )
137b0a7a3cfSSteve Yin 	_T("EDITABLE"),			// 	EDITABLE	( 6 )
138b0a7a3cfSSteve Yin 	_T("ENABLED"),			// 	ENABLED	( 7 )
139b0a7a3cfSSteve Yin 	_T("EXPANDABLE"),		// 	EXPANDABLE	( 8 )
140b0a7a3cfSSteve Yin 	_T("EXPANDED"),			// 	EXPANDED	( 9 )
141b0a7a3cfSSteve Yin 	_T("FOCUSABLE"),		// 	FOCUSABLE	( 10 )
142b0a7a3cfSSteve Yin 	_T("FOCUSED"),			// 	FOCUSED	( 11 )
143b0a7a3cfSSteve Yin 	_T("HORIZONTAL"),		// 	HORIZONTAL	( 12 )
144b0a7a3cfSSteve Yin 	_T("ICONIFIED"),		// 	ICONIFIED	( 13 )
145b0a7a3cfSSteve Yin 	_T("INDETERMINATE"),	// 	INDETERMINATE	( 14 )
146b0a7a3cfSSteve Yin 	_T("MANAGES_DESCENDANTS"),// 	MANAGES_DESCENDANTS	( 15 )
147b0a7a3cfSSteve Yin 	_T("MODAL"),			// 	MODAL	( 16 )
148b0a7a3cfSSteve Yin 	_T("MULTI_LINE"),		// 	MULTI_LINE	( 17 )
149b0a7a3cfSSteve Yin 	_T("MULTI_SELECTABLE"),	// 	MULTI_SELECTABLE	( 18 )
150b0a7a3cfSSteve Yin 	_T("OPAQUE"),			// 	OPAQUE	( 19 )
151b0a7a3cfSSteve Yin 	_T("PRESSED"),			// 	PRESSED	( 20 )
152b0a7a3cfSSteve Yin 	_T("RESIZABLE"),		// 	RESIZABLE	( 21 )
153b0a7a3cfSSteve Yin 	_T("SELECTABLE"),		// 	SELECTABLE	( 22 )
154b0a7a3cfSSteve Yin 	_T("SELECTED"),			// 	SELECTED	( 23 )
155b0a7a3cfSSteve Yin 	_T("SENSITIVE"),		// 	SENSITIVE	( 24 )
156b0a7a3cfSSteve Yin 	_T("SHOWING"),			// 	SHOWING	( 25 )
157b0a7a3cfSSteve Yin 	_T("SINGLE_LINE"),		// 	SINGLE_LINE	( 26 )
158b0a7a3cfSSteve Yin 	_T("STALE"),			// 	STALE	( 27 )
159b0a7a3cfSSteve Yin 	_T("TRANSIENT"),		// 	TRANSIENT	( 28 )
160b0a7a3cfSSteve Yin 	_T("VERTICAL"),			// 	VERTICAL	( 29 )
161b0a7a3cfSSteve Yin 	_T("VISIBLE"),			// 	VISIBLE	( 30 )
162b0a7a3cfSSteve Yin 	_T("MOVEABLE"),			//  MOVEABLE ( 31 )
163b0a7a3cfSSteve Yin 	_T("OFFSCREEN"),		//  OFFSCREEN ( 32 )
164b0a7a3cfSSteve Yin 	_T("COLLAPSE"),			//  COLLAPSE ( 33 )
165b0a7a3cfSSteve Yin 	_T("DEFAULT")			//  DEFAULT ( 34 )
166b0a7a3cfSSteve Yin };
1675fdc4257SSteve Yin 
1685fdc4257SSteve Yin 
1695fdc4257SSteve Yin using namespace com::sun::star::accessibility::AccessibleRole;
1705fdc4257SSteve Yin 
1715fdc4257SSteve Yin 
1725fdc4257SSteve Yin 
1735fdc4257SSteve Yin #define QUERYXINTERFACE(ainterface)	\
1745fdc4257SSteve Yin {							\
1755fdc4257SSteve Yin 	if(pXAcc == NULL)		\
176b0a7a3cfSSteve Yin 	return FALSE;		\
1775fdc4257SSteve Yin 	pRContext = pXAcc->getAccessibleContext();	\
1785fdc4257SSteve Yin 	if( !pRContext.is() )	\
179b0a7a3cfSSteve Yin {						\
180b0a7a3cfSSteve Yin 	return FALSE;		\
181b0a7a3cfSSteve Yin }						\
1825fdc4257SSteve Yin 	Reference<X##ainterface> pRXI(pRContext,UNO_QUERY);\
1835fdc4257SSteve Yin 	if( !pRXI.is() )		\
184b0a7a3cfSSteve Yin {						\
185b0a7a3cfSSteve Yin 	return FALSE;		\
186b0a7a3cfSSteve Yin }						\
1875fdc4257SSteve Yin 	*ppXI = (XInterface*)pRXI.get();		\
1885fdc4257SSteve Yin 	return TRUE;			\
1895fdc4257SSteve Yin }
1905fdc4257SSteve Yin 
1915fdc4257SSteve Yin #define ISDESTROY()	\
1925fdc4257SSteve Yin 	if(m_isDestroy)	\
193b0a7a3cfSSteve Yin 	return S_FALSE;
1945fdc4257SSteve Yin 
1955fdc4257SSteve Yin 
1965fdc4257SSteve Yin AccObjectManagerAgent* CMAccessible::g_pAgent = NULL;
1975fdc4257SSteve Yin 
CMAccessible()1985fdc4257SSteve Yin CMAccessible::CMAccessible():
199b0a7a3cfSSteve Yin m_iRole(0x00),
200b0a7a3cfSSteve Yin m_dState(0x00),
201b0a7a3cfSSteve Yin m_dChildID(0x00),
202b0a7a3cfSSteve Yin m_dFocusChildID(UACC_NO_FOCUS),
203b0a7a3cfSSteve Yin m_hwnd(NULL),
204b0a7a3cfSSteve Yin m_pIParent(NULL),
205b0a7a3cfSSteve Yin m_pszName(NULL),
206b0a7a3cfSSteve Yin m_pszValue(NULL),
207b0a7a3cfSSteve Yin m_pszDescription(NULL),
208b0a7a3cfSSteve Yin m_isDestroy(FALSE),
209b0a7a3cfSSteve Yin m_pszActionDescription(NULL),
210b0a7a3cfSSteve Yin m_pXAction(NULL),
211b0a7a3cfSSteve Yin m_bRequiresSave(FALSE),
212b0a7a3cfSSteve Yin pUNOInterface(NULL)
213b0a7a3cfSSteve Yin {
214b0a7a3cfSSteve Yin 	m_sLocation.m_dLeft=0;
215b0a7a3cfSSteve Yin 	m_sLocation.m_dTop = 0;
216b0a7a3cfSSteve Yin 	m_sLocation.m_dWidth=0;
217b0a7a3cfSSteve Yin 	m_sLocation.m_dHeight=0;
218b0a7a3cfSSteve Yin 	CEnumVariant::Create(&m_pEnumVar);
219693722acSSteve Yin 	m_containedObjects.clear();
2205fdc4257SSteve Yin }
2215fdc4257SSteve Yin 
~CMAccessible()2225fdc4257SSteve Yin CMAccessible::~CMAccessible()
2235fdc4257SSteve Yin {
224b0a7a3cfSSteve Yin 	if(m_pszName!=NULL)
225b0a7a3cfSSteve Yin 	{
226b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszName);
227b0a7a3cfSSteve Yin 		m_pszName=NULL;
228b0a7a3cfSSteve Yin 	}
229b0a7a3cfSSteve Yin 	if(m_pszValue!=NULL)
230b0a7a3cfSSteve Yin 	{
231b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszValue);
232b0a7a3cfSSteve Yin 		m_pszValue=NULL;
233b0a7a3cfSSteve Yin 	}
234b0a7a3cfSSteve Yin 	if(m_pszDescription!=NULL)
235b0a7a3cfSSteve Yin 	{
236b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszDescription);
237b0a7a3cfSSteve Yin 		m_pszDescription=NULL;
238b0a7a3cfSSteve Yin 	}
239b0a7a3cfSSteve Yin 
240b0a7a3cfSSteve Yin 	if(m_pszActionDescription!=NULL)
241b0a7a3cfSSteve Yin 	{
242b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszActionDescription);
243b0a7a3cfSSteve Yin 		m_pszActionDescription=NULL;
244b0a7a3cfSSteve Yin 	}
245b0a7a3cfSSteve Yin 
246b0a7a3cfSSteve Yin 	if(m_pIParent)
247b0a7a3cfSSteve Yin 	{
248b0a7a3cfSSteve Yin 		m_pIParent->Release();
249b0a7a3cfSSteve Yin 		m_pIParent=NULL;
250b0a7a3cfSSteve Yin 	}
251b0a7a3cfSSteve Yin 	pRef = NULL;
252b0a7a3cfSSteve Yin 	m_pEnumVar->Release();
253b0a7a3cfSSteve Yin 	m_containedObjects.clear();
254b0a7a3cfSSteve Yin 	pRContext = NULL;
2555fdc4257SSteve Yin }
2565fdc4257SSteve Yin 
2575fdc4257SSteve Yin /**
2585fdc4257SSteve Yin * Returns the Parent IAccessible interface pointer to AT.
2595fdc4257SSteve Yin * It should add reference, and the client should release the component.
2605fdc4257SSteve Yin * It should return E_FAIL when the parent point is null.
2615fdc4257SSteve Yin * @param	ppdispParent [in,out] used to return the parent interface point.
2625fdc4257SSteve Yin *			when the point is null, should return null.
2635fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if the m_pIParent is NULL.
2645fdc4257SSteve Yin */
get_accParent(IDispatch ** ppdispParent)2655fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accParent(IDispatch **ppdispParent)
2665fdc4257SSteve Yin {
267b0a7a3cfSSteve Yin 
2685fdc4257SSteve Yin 	CHECK_ENABLE_INF
269b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
270b0a7a3cfSSteve Yin 		ISDESTROY()
271b0a7a3cfSSteve Yin 		// #CHECK#
272b0a7a3cfSSteve Yin 		if(ppdispParent == NULL)
273b0a7a3cfSSteve Yin 		{
274b0a7a3cfSSteve Yin 			return E_INVALIDARG;
275b0a7a3cfSSteve Yin 		}
276b0a7a3cfSSteve Yin 
277b0a7a3cfSSteve Yin 		if(m_pIParent)
278b0a7a3cfSSteve Yin 		{
279b0a7a3cfSSteve Yin 			*ppdispParent = m_pIParent;
280b0a7a3cfSSteve Yin 			(*ppdispParent)->AddRef();
281b0a7a3cfSSteve Yin 			return S_OK;
282b0a7a3cfSSteve Yin 		}
283b0a7a3cfSSteve Yin 		else if(m_hwnd)
284b0a7a3cfSSteve Yin 		{
285b0a7a3cfSSteve Yin 			HRESULT hr = AccessibleObjectFromWindow(m_hwnd, OBJID_WINDOW, IID_IAccessible, (void**)ppdispParent);
286b0a7a3cfSSteve Yin 			if( ! SUCCEEDED( hr ) || ! ppdispParent )
287b0a7a3cfSSteve Yin 			{
288b0a7a3cfSSteve Yin 				return S_FALSE;
289b0a7a3cfSSteve Yin 			}
290b0a7a3cfSSteve Yin 			return S_OK;
291b0a7a3cfSSteve Yin 		}
292b0a7a3cfSSteve Yin 		return S_FALSE;
293b0a7a3cfSSteve Yin 
294b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
2955fdc4257SSteve Yin }
2965fdc4257SSteve Yin 
2975fdc4257SSteve Yin /**
2985fdc4257SSteve Yin * Returns child count of current COM object.
2995fdc4257SSteve Yin * @param	pcountChildren [in,out] used to return the children count.
3005fdc4257SSteve Yin * @return   S_OK if successful.
3015fdc4257SSteve Yin */
get_accChildCount(long * pcountChildren)3025fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accChildCount(long *pcountChildren)
3035fdc4257SSteve Yin {
304b0a7a3cfSSteve Yin 
3055fdc4257SSteve Yin 	CHECK_ENABLE_INF
306b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
307b0a7a3cfSSteve Yin 		ISDESTROY()
308b0a7a3cfSSteve Yin 		// #CHECK#
309b0a7a3cfSSteve Yin 		if(pcountChildren == NULL)
310b0a7a3cfSSteve Yin 		{
311b0a7a3cfSSteve Yin 			return E_INVALIDARG;
312b0a7a3cfSSteve Yin 		}
3135fdc4257SSteve Yin 
314b0a7a3cfSSteve Yin 		if(!pUNOInterface)
315b0a7a3cfSSteve Yin 			return S_FALSE;
3165fdc4257SSteve Yin 
317b0a7a3cfSSteve Yin 		Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext();
318b0a7a3cfSSteve Yin 		if( pRContext.is() )
319b0a7a3cfSSteve Yin 		{
320b0a7a3cfSSteve Yin 			*pcountChildren = pRContext->getAccessibleChildCount();
321b0a7a3cfSSteve Yin 		}
3225fdc4257SSteve Yin 
323b0a7a3cfSSteve Yin 		return S_OK;
3245fdc4257SSteve Yin 
325b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
3265fdc4257SSteve Yin }
3275fdc4257SSteve Yin 
3285fdc4257SSteve Yin /**
3295fdc4257SSteve Yin * Returns child interface pointer for AT according to input child ID.
3305fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
3315fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
3325fdc4257SSteve Yin * @param	ppdispChild, [in,out] use to return the child interface point.
3335fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
3345fdc4257SSteve Yin */
get_accChild(VARIANT varChild,IDispatch ** ppdispChild)3355fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accChild(VARIANT varChild, IDispatch **ppdispChild)
3365fdc4257SSteve Yin {
337b0a7a3cfSSteve Yin 
3385fdc4257SSteve Yin 	CHECK_ENABLE_INF
339b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
340b0a7a3cfSSteve Yin 		ISDESTROY()
341b0a7a3cfSSteve Yin 		// #CHECK#
342b0a7a3cfSSteve Yin 		if(ppdispChild == NULL)
343b0a7a3cfSSteve Yin 		{
344b0a7a3cfSSteve Yin 			return E_INVALIDARG;
345b0a7a3cfSSteve Yin 		}
346b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
347b0a7a3cfSSteve Yin 		{
348b0a7a3cfSSteve Yin 			//get child interface pointer due to child ID
349b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
350b0a7a3cfSSteve Yin 			{
351b0a7a3cfSSteve Yin 				AddRef();
352b0a7a3cfSSteve Yin 				*ppdispChild = this;
353b0a7a3cfSSteve Yin 				return S_OK;
354b0a7a3cfSSteve Yin 			}
355b0a7a3cfSSteve Yin 			*ppdispChild = GetChildInterface(varChild.lVal);
356*5b933a9eSSteve Yin 			if((*ppdispChild) == NULL)
357*5b933a9eSSteve Yin 				return E_FAIL;
358b0a7a3cfSSteve Yin 			(*ppdispChild)->AddRef();
359*5b933a9eSSteve Yin 			return S_OK;
360b0a7a3cfSSteve Yin 		}
361b0a7a3cfSSteve Yin 		return S_FALSE;
362b0a7a3cfSSteve Yin 
363b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
3645fdc4257SSteve Yin }
3655fdc4257SSteve Yin 
3665fdc4257SSteve Yin /**
3675fdc4257SSteve Yin * Returns the accessible name of the current COM object self or its one child to AT.
3685fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
3695fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
3705fdc4257SSteve Yin * @param	pszName, [in,out] use to return the name of the proper object.
3715fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
3725fdc4257SSteve Yin */
get_accName(VARIANT varChild,BSTR * pszName)3735fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accName(VARIANT varChild, BSTR *pszName)
3745fdc4257SSteve Yin {
375b0a7a3cfSSteve Yin 
3765fdc4257SSteve Yin 	CHECK_ENABLE_INF
377b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
378b0a7a3cfSSteve Yin 		ISDESTROY()
379b0a7a3cfSSteve Yin 		// #CHECK#
380b0a7a3cfSSteve Yin 		if(pszName == NULL)
381b0a7a3cfSSteve Yin 		{
382b0a7a3cfSSteve Yin 			return E_INVALIDARG;
383b0a7a3cfSSteve Yin 		}
384b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
385b0a7a3cfSSteve Yin 		{
386b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
387b0a7a3cfSSteve Yin 			{
388b0a7a3cfSSteve Yin 				SAFE_SYSFREESTRING(*pszName);
389b0a7a3cfSSteve Yin 				*pszName = SysAllocString(m_pszName);
390b0a7a3cfSSteve Yin 				return S_OK;
391b0a7a3cfSSteve Yin 			}
392b0a7a3cfSSteve Yin 
393b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
394b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
395b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
396b0a7a3cfSSteve Yin 			if(!pChild)
397b0a7a3cfSSteve Yin 				return E_FAIL;
398b0a7a3cfSSteve Yin 			return pChild->get_accName(varChild,pszName);
399b0a7a3cfSSteve Yin 		}
400b0a7a3cfSSteve Yin 		return S_FALSE;
401b0a7a3cfSSteve Yin 
402b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
4035fdc4257SSteve Yin }
4045fdc4257SSteve Yin 
4055fdc4257SSteve Yin /**
4065fdc4257SSteve Yin * Returns the accessible value of the current COM object self or its one child to AT.
4075fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
4085fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
4095fdc4257SSteve Yin * @param	pszValue, [in,out] use to return the value of the proper object.
4105fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
4115fdc4257SSteve Yin */
get_accValue(VARIANT varChild,BSTR * pszValue)4125fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accValue(VARIANT varChild, BSTR *pszValue)
4135fdc4257SSteve Yin {
414b0a7a3cfSSteve Yin 
4155fdc4257SSteve Yin 	CHECK_ENABLE_INF
416b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
417b0a7a3cfSSteve Yin 		ISDESTROY()
418b0a7a3cfSSteve Yin 		// #CHECK#
419b0a7a3cfSSteve Yin 		if( pszValue == NULL )
420b0a7a3cfSSteve Yin 		{
421b0a7a3cfSSteve Yin 			return E_INVALIDARG;
422b0a7a3cfSSteve Yin 		}
423b0a7a3cfSSteve Yin 		if( varChild.vt==VT_I4 )
424b0a7a3cfSSteve Yin 		{
425b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
426b0a7a3cfSSteve Yin 			{
427b0a7a3cfSSteve Yin 				if(m_dState & STATE_SYSTEM_PROTECTED)
428b0a7a3cfSSteve Yin 					return E_ACCESSDENIED;
429b0a7a3cfSSteve Yin 
430b0a7a3cfSSteve Yin 				if ( m_pszValue !=NULL && wcslen(m_pszValue) == 0 )
431b0a7a3cfSSteve Yin 					return S_OK;
432b0a7a3cfSSteve Yin 
433b0a7a3cfSSteve Yin 				SAFE_SYSFREESTRING(*pszValue);
434b0a7a3cfSSteve Yin 				*pszValue = SysAllocString(m_pszValue);
435b0a7a3cfSSteve Yin 				return S_OK;
436b0a7a3cfSSteve Yin 			}
437b0a7a3cfSSteve Yin 
438b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
439b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
440b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
441b0a7a3cfSSteve Yin 			if(!pChild)
442b0a7a3cfSSteve Yin 				return E_FAIL;
443b0a7a3cfSSteve Yin 			return pChild->get_accValue(varChild,pszValue);
444b0a7a3cfSSteve Yin 		}
445b0a7a3cfSSteve Yin 		return S_FALSE;
446b0a7a3cfSSteve Yin 
447b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
4485fdc4257SSteve Yin }
4495fdc4257SSteve Yin 
4505fdc4257SSteve Yin /**
4515fdc4257SSteve Yin * Returns the accessible description of the current COM object self or its one child to AT.
4525fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
4535fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
4545fdc4257SSteve Yin * @param	pszDescription, [in,out] use to return the description of the proper object.
4555fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
4565fdc4257SSteve Yin */
get_accDescription(VARIANT varChild,BSTR * pszDescription)4575fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accDescription(VARIANT varChild, BSTR *pszDescription)
4585fdc4257SSteve Yin {
459b0a7a3cfSSteve Yin 
4605fdc4257SSteve Yin 	CHECK_ENABLE_INF
461b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
462b0a7a3cfSSteve Yin 		ISDESTROY()
463b0a7a3cfSSteve Yin 		// #CHECK#
464b0a7a3cfSSteve Yin 		if(pszDescription == NULL)
465b0a7a3cfSSteve Yin 		{
466b0a7a3cfSSteve Yin 			return E_INVALIDARG;
467b0a7a3cfSSteve Yin 		}
468b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
469b0a7a3cfSSteve Yin 		{
470b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
471b0a7a3cfSSteve Yin 			{
472b0a7a3cfSSteve Yin 				SAFE_SYSFREESTRING(*pszDescription);
473b0a7a3cfSSteve Yin 				*pszDescription = SysAllocString(m_pszDescription);
474b0a7a3cfSSteve Yin 				return S_OK;
475b0a7a3cfSSteve Yin 			}
476b0a7a3cfSSteve Yin 
477b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
478b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
479b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
480b0a7a3cfSSteve Yin 			if(!pChild)
481b0a7a3cfSSteve Yin 				return E_FAIL;
482b0a7a3cfSSteve Yin 			return pChild->get_accDescription(varChild,pszDescription);
483b0a7a3cfSSteve Yin 		}
484b0a7a3cfSSteve Yin 		return S_FALSE;
485b0a7a3cfSSteve Yin 
486b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
4875fdc4257SSteve Yin }
4885fdc4257SSteve Yin 
4895fdc4257SSteve Yin /**
4905fdc4257SSteve Yin * Returns the accessible role of the current COM object self or its one child to AT.
4915fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
4925fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
4935fdc4257SSteve Yin * @param	pvarRole, [in,out] use to return the role of the proper object.
4945fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
4955fdc4257SSteve Yin */
get_accRole(VARIANT varChild,VARIANT * pvarRole)4965fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accRole(VARIANT varChild, VARIANT *pvarRole)
4975fdc4257SSteve Yin {
498b0a7a3cfSSteve Yin 
4995fdc4257SSteve Yin 	CHECK_ENABLE_INF
500b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
501b0a7a3cfSSteve Yin 		ISDESTROY()
502b0a7a3cfSSteve Yin 		// #CHECK#
503b0a7a3cfSSteve Yin 		if(pvarRole == NULL)
504b0a7a3cfSSteve Yin 		{
505b0a7a3cfSSteve Yin 			return E_INVALIDARG;
506b0a7a3cfSSteve Yin 		}
507b0a7a3cfSSteve Yin 		if(varChild.vt == VT_I4)
508b0a7a3cfSSteve Yin 		{
509b0a7a3cfSSteve Yin 
510b0a7a3cfSSteve Yin 			if(varChild.lVal == CHILDID_SELF)
511b0a7a3cfSSteve Yin 			{
512b0a7a3cfSSteve Yin 				if( m_iRole < IA2_ROLE_CAPTION )
513b0a7a3cfSSteve Yin 				{
514b0a7a3cfSSteve Yin 					VariantInit(pvarRole);
515b0a7a3cfSSteve Yin 					pvarRole->vt = VT_I4;
516b0a7a3cfSSteve Yin 					pvarRole->lVal = m_iRole;
517b0a7a3cfSSteve Yin 				}
518b0a7a3cfSSteve Yin 				else
519b0a7a3cfSSteve Yin 				{
520b0a7a3cfSSteve Yin 					VariantInit(pvarRole);
521b0a7a3cfSSteve Yin 					pvarRole->vt = VT_I4;
522b0a7a3cfSSteve Yin 					pvarRole->lVal = ROLE_SYSTEM_CLIENT;
523b0a7a3cfSSteve Yin 				}
524b0a7a3cfSSteve Yin 				return S_OK;
525b0a7a3cfSSteve Yin 			}
526b0a7a3cfSSteve Yin 
527b0a7a3cfSSteve Yin 
528b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
529b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
530b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
531b0a7a3cfSSteve Yin 			if(!pChild)
532b0a7a3cfSSteve Yin 				return E_FAIL;
533b0a7a3cfSSteve Yin 			return pChild->get_accRole(varChild,pvarRole);
534b0a7a3cfSSteve Yin 		}
535b0a7a3cfSSteve Yin 		return S_FALSE;
536b0a7a3cfSSteve Yin 
537b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
5385fdc4257SSteve Yin }
5395fdc4257SSteve Yin 
5405fdc4257SSteve Yin /**
5415fdc4257SSteve Yin * Returns the accessible state of the current COM object self or its one child to AT.
5425fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
5435fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
5445fdc4257SSteve Yin * @param	pvarState, [in,out] use to return the state of the proper object.
5455fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
5465fdc4257SSteve Yin */
get_accState(VARIANT varChild,VARIANT * pvarState)5475fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accState(VARIANT varChild, VARIANT *pvarState)
5485fdc4257SSteve Yin {
549b0a7a3cfSSteve Yin 
5505fdc4257SSteve Yin 	CHECK_ENABLE_INF
551b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
552b0a7a3cfSSteve Yin 		ISDESTROY()
553b0a7a3cfSSteve Yin 		// #CHECK#
554b0a7a3cfSSteve Yin 		if(pvarState == NULL)
555b0a7a3cfSSteve Yin 		{
556b0a7a3cfSSteve Yin 			return E_INVALIDARG;
557b0a7a3cfSSteve Yin 		}
558b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
559b0a7a3cfSSteve Yin 		{
560b0a7a3cfSSteve Yin 			if(varChild.lVal == CHILDID_SELF)
561b0a7a3cfSSteve Yin 			{
562b0a7a3cfSSteve Yin 				if(pUNOInterface)
563b0a7a3cfSSteve Yin 				{
564b0a7a3cfSSteve Yin 					Reference< XAccessibleContext > pContext = pUNOInterface->getAccessibleContext();
565b0a7a3cfSSteve Yin 					if(pContext.is())
566b0a7a3cfSSteve Yin 					{
567b0a7a3cfSSteve Yin 						// add the STATE_SYSTEM_LINKED state
568b0a7a3cfSSteve Yin 						Reference< XAccessibleHypertext > pRHypertext(pContext,UNO_QUERY);
569b0a7a3cfSSteve Yin 						if(pRHypertext.is())
570b0a7a3cfSSteve Yin 						{
571b0a7a3cfSSteve Yin 							if( pRHypertext->getHyperLinkCount() > 0 )
572b0a7a3cfSSteve Yin 								m_dState |= STATE_SYSTEM_LINKED;
573b0a7a3cfSSteve Yin 							else
574b0a7a3cfSSteve Yin 								m_dState &= ~STATE_SYSTEM_LINKED;
575b0a7a3cfSSteve Yin 						}
576b0a7a3cfSSteve Yin 						else
577b0a7a3cfSSteve Yin 							m_dState &= ~STATE_SYSTEM_LINKED;
578b0a7a3cfSSteve Yin 					}
579b0a7a3cfSSteve Yin 				}
580b0a7a3cfSSteve Yin 
581b0a7a3cfSSteve Yin 				VariantInit(pvarState);
582b0a7a3cfSSteve Yin 				pvarState->vt = VT_I4;
583b0a7a3cfSSteve Yin 				pvarState->lVal = m_dState;
584b0a7a3cfSSteve Yin 				return S_OK;
585b0a7a3cfSSteve Yin 			}
586b0a7a3cfSSteve Yin 
587b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
588b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
589b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
590b0a7a3cfSSteve Yin 			if(!pChild)
591b0a7a3cfSSteve Yin 				return E_FAIL;
592b0a7a3cfSSteve Yin 			return pChild->get_accState(varChild,pvarState);
593b0a7a3cfSSteve Yin 		}
594b0a7a3cfSSteve Yin 		return S_FALSE;
595b0a7a3cfSSteve Yin 
596b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
5975fdc4257SSteve Yin }
5985fdc4257SSteve Yin 
5995fdc4257SSteve Yin /**
6005fdc4257SSteve Yin * Returns the accessible helpString of the current COM object self or its one child to AT.
6015fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
6025fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
6035fdc4257SSteve Yin * @param	pszHelp, [in,out] use to return the helpString of the proper object.
6045fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
6055fdc4257SSteve Yin */
get_accHelp(VARIANT,BSTR *)6065fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accHelp(VARIANT, BSTR *)
6075fdc4257SSteve Yin {
608b0a7a3cfSSteve Yin 	return E_NOTIMPL;
6095fdc4257SSteve Yin }
6105fdc4257SSteve Yin 
6115fdc4257SSteve Yin /**
6125fdc4257SSteve Yin * Returns the accessible HelpTopic of the current COM object self or its one child to AT.
6135fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
6145fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
6155fdc4257SSteve Yin * @param	pszHelpFile, [in,out] use to return the HelpTopic of the proper object.
6165fdc4257SSteve Yin * @param	pidTopic, use to return the HelpTopic ID of the proper object.
6175fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
6185fdc4257SSteve Yin * Not implemented yet
6195fdc4257SSteve Yin */
get_accHelpTopic(BSTR *,VARIANT,long *)6205fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accHelpTopic(BSTR *, VARIANT, long *)
6215fdc4257SSteve Yin {
622b0a7a3cfSSteve Yin 	return E_NOTIMPL;
6235fdc4257SSteve Yin }
6245fdc4257SSteve Yin 
GetMnemonicChar(const::rtl::OUString & aStr,WCHAR * wStr)6255fdc4257SSteve Yin static void GetMnemonicChar( const ::rtl::OUString& aStr, WCHAR* wStr)
6265fdc4257SSteve Yin {
627b0a7a3cfSSteve Yin 	int  nLen    = aStr.pData->length;
628b0a7a3cfSSteve Yin 	int  i       = 0;
629b0a7a3cfSSteve Yin 	WCHAR* text = aStr.pData->buffer;
6305fdc4257SSteve Yin 
631b0a7a3cfSSteve Yin 	while ( i < nLen )
632b0a7a3cfSSteve Yin 	{
633b0a7a3cfSSteve Yin 		if ( text[i] == L'~' )
634b0a7a3cfSSteve Yin 			if ( text[i+1] != L'~' )
635b0a7a3cfSSteve Yin 			{
636b0a7a3cfSSteve Yin 				wStr[0] = text[i+1];
637b0a7a3cfSSteve Yin 				break;
638b0a7a3cfSSteve Yin 			}
639b0a7a3cfSSteve Yin 			i++;
640b0a7a3cfSSteve Yin 	}
6415fdc4257SSteve Yin }
6425fdc4257SSteve Yin 
6435fdc4257SSteve Yin /**
6445fdc4257SSteve Yin * Returns the accessible keyboard shortcut of the current COM object self or its one child to AT.
6455fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
6465fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
6475fdc4257SSteve Yin * @param	pszKeyboardShortcut, [in,out] use to return the kbshortcut of the proper object.
6485fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
6495fdc4257SSteve Yin */
get_accKeyboardShortcut(VARIANT varChild,BSTR * pszKeyboardShortcut)6505fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accKeyboardShortcut(VARIANT varChild, BSTR *pszKeyboardShortcut)
6515fdc4257SSteve Yin {
652b0a7a3cfSSteve Yin 
6535fdc4257SSteve Yin 	CHECK_ENABLE_INF
654b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
655b0a7a3cfSSteve Yin 
656b0a7a3cfSSteve Yin 		ISDESTROY()
657b0a7a3cfSSteve Yin 		// #CHECK#
658b0a7a3cfSSteve Yin 		if(pszKeyboardShortcut == NULL)
659b0a7a3cfSSteve Yin 		{
660b0a7a3cfSSteve Yin 			return E_INVALIDARG;
661b0a7a3cfSSteve Yin 		}
662b0a7a3cfSSteve Yin 
663b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
664b0a7a3cfSSteve Yin 		{
665b0a7a3cfSSteve Yin 			if(varChild.lVal == CHILDID_SELF)
666b0a7a3cfSSteve Yin 			{
667b0a7a3cfSSteve Yin 				if( pUNOInterface )
668b0a7a3cfSSteve Yin 				{
669b0a7a3cfSSteve Yin 					Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
670b0a7a3cfSSteve Yin 					if( !pRContext.is() )
671b0a7a3cfSSteve Yin 						return S_FALSE;
672b0a7a3cfSSteve Yin 
673b0a7a3cfSSteve Yin 					Reference<XAccessibleAction> pRXI(pRContext,UNO_QUERY);
674b0a7a3cfSSteve Yin 
675b0a7a3cfSSteve Yin 					OLECHAR wString[64]={0};
676b0a7a3cfSSteve Yin 
677b0a7a3cfSSteve Yin 					if( pRXI.is() && pRXI->getAccessibleActionCount() >= 1)
678b0a7a3cfSSteve Yin 					{
679b0a7a3cfSSteve Yin 						Reference< XAccessibleKeyBinding > binding = pRXI->getAccessibleActionKeyBinding(0);
680b0a7a3cfSSteve Yin 						if( binding.is() )
681b0a7a3cfSSteve Yin 						{
682b0a7a3cfSSteve Yin 							long nCount = binding->getAccessibleKeyBindingCount();
683b0a7a3cfSSteve Yin 							if(nCount >= 1)
684b0a7a3cfSSteve Yin 							{
685b0a7a3cfSSteve Yin 								CAccAction::GetkeyBindingStrByXkeyBinding( binding->getAccessibleKeyBinding(0),wString );
686b0a7a3cfSSteve Yin 							}
687b0a7a3cfSSteve Yin 						}
688b0a7a3cfSSteve Yin 					}
689b0a7a3cfSSteve Yin 					if(wString[0] == 0)
690b0a7a3cfSSteve Yin 					{
691b0a7a3cfSSteve Yin 						Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet();
692b0a7a3cfSSteve Yin 						if(!pRrelationSet.is())
6935fdc4257SSteve Yin 						{
694b0a7a3cfSSteve Yin 							return S_FALSE;
6955fdc4257SSteve Yin 						}
6965fdc4257SSteve Yin 
697b0a7a3cfSSteve Yin 						long nRelCount = pRrelationSet->getRelationCount();
698b0a7a3cfSSteve Yin 
699b0a7a3cfSSteve Yin 						// Modified by Steve Yin, for SODC_1552
700b0a7a3cfSSteve Yin 						if( /*nRelCount <= 0 &&*/ m_iRole == ROLE_SYSTEM_TEXT )
701b0a7a3cfSSteve Yin 						{
702b0a7a3cfSSteve Yin 							VARIANT varParentRole;
703b0a7a3cfSSteve Yin 							VariantInit( &varParentRole );
7045fdc4257SSteve Yin 
705b0a7a3cfSSteve Yin 							m_pIParent->get_accRole(varChild, &varParentRole);
7065fdc4257SSteve Yin 
707b0a7a3cfSSteve Yin 							if( m_pIParent && varParentRole.lVal == ROLE_SYSTEM_COMBOBOX ) // edit in comoboBox
708b0a7a3cfSSteve Yin 							{
709b0a7a3cfSSteve Yin 								m_pIParent->get_accKeyboardShortcut(varChild, pszKeyboardShortcut);
710b0a7a3cfSSteve Yin 								return S_OK;
711b0a7a3cfSSteve Yin 							}
712b0a7a3cfSSteve Yin 						}
713b0a7a3cfSSteve Yin 
714b0a7a3cfSSteve Yin 						AccessibleRelation *paccRelation = NULL;
715b0a7a3cfSSteve Yin 						AccessibleRelation accRelation;
716b0a7a3cfSSteve Yin 						for(int i=0; i<nRelCount ; i++)
717b0a7a3cfSSteve Yin 						{
718b0a7a3cfSSteve Yin 							if( pRrelationSet->getRelation(i).RelationType == 6 )
719b0a7a3cfSSteve Yin 							{
720b0a7a3cfSSteve Yin 								accRelation = pRrelationSet->getRelation(i);
721b0a7a3cfSSteve Yin 								paccRelation = &accRelation;
722b0a7a3cfSSteve Yin 							}
723b0a7a3cfSSteve Yin 						}
7245fdc4257SSteve Yin 
725b0a7a3cfSSteve Yin 						if(paccRelation == NULL)
726b0a7a3cfSSteve Yin 							return S_FALSE;
7275fdc4257SSteve Yin 
728b0a7a3cfSSteve Yin 						Sequence< Reference< XInterface > > xTargets = paccRelation->TargetSet;
729b0a7a3cfSSteve Yin 						Reference<XInterface> pRAcc = xTargets[0];
7305fdc4257SSteve Yin 
731b0a7a3cfSSteve Yin 						XAccessible* pXAcc = (XAccessible*)pRAcc.get();
732b0a7a3cfSSteve Yin 
733b0a7a3cfSSteve Yin 						Reference<XAccessibleContext> pRLebelContext = pXAcc->getAccessibleContext();
734b0a7a3cfSSteve Yin 						if(!pRLebelContext.is())
735b0a7a3cfSSteve Yin 							return S_FALSE;
736b0a7a3cfSSteve Yin 
737b0a7a3cfSSteve Yin 						pRrelationSet = pRLebelContext->getAccessibleRelationSet();
738b0a7a3cfSSteve Yin 						nRelCount = pRrelationSet->getRelationCount();
739b0a7a3cfSSteve Yin 
740b0a7a3cfSSteve Yin 						paccRelation = NULL;
741b0a7a3cfSSteve Yin 						for(int j=0; j<nRelCount ; j++)
742b0a7a3cfSSteve Yin 						{
743b0a7a3cfSSteve Yin 							if( pRrelationSet->getRelation(j).RelationType == 5 )
744b0a7a3cfSSteve Yin 							{
745b0a7a3cfSSteve Yin 								accRelation = pRrelationSet->getRelation(j);
746b0a7a3cfSSteve Yin 								paccRelation = &accRelation;
747b0a7a3cfSSteve Yin 							}
748b0a7a3cfSSteve Yin 						}
749b0a7a3cfSSteve Yin 
750b0a7a3cfSSteve Yin 						if(paccRelation)
751b0a7a3cfSSteve Yin 						{
752b0a7a3cfSSteve Yin 							xTargets = paccRelation->TargetSet;
753b0a7a3cfSSteve Yin 							pRAcc = xTargets[0];
754b0a7a3cfSSteve Yin 							if(pUNOInterface != (XAccessible*)pRAcc.get())
755b0a7a3cfSSteve Yin 								return S_FALSE;
756b0a7a3cfSSteve Yin 						}
757b0a7a3cfSSteve Yin 
758b0a7a3cfSSteve Yin 						Reference<XAccessibleExtendedComponent> pRXIE(pRLebelContext,UNO_QUERY);
759b0a7a3cfSSteve Yin 						if(!pRXIE.is())
760b0a7a3cfSSteve Yin 							return S_FALSE;
761b0a7a3cfSSteve Yin 
762b0a7a3cfSSteve Yin 						::rtl::OUString ouStr = pRXIE->getTitledBorderText();
763b0a7a3cfSSteve Yin 						WCHAR key[2] = {NULL};
764b0a7a3cfSSteve Yin 						GetMnemonicChar(ouStr, key);
765b0a7a3cfSSteve Yin 						if(key[0] != 0)
7665fdc4257SSteve Yin 						{
767b0a7a3cfSSteve Yin 							wcscat(wString, L"Alt+");
768b0a7a3cfSSteve Yin 							wcscat(wString, key);
7695fdc4257SSteve Yin 						}
770b0a7a3cfSSteve Yin 						else
771b0a7a3cfSSteve Yin 							return S_FALSE;
772b0a7a3cfSSteve Yin 					}
773b0a7a3cfSSteve Yin 
774b0a7a3cfSSteve Yin 					SAFE_SYSFREESTRING(*pszKeyboardShortcut);
775b0a7a3cfSSteve Yin 					*pszKeyboardShortcut = SysAllocString(wString);
776b0a7a3cfSSteve Yin 
777b0a7a3cfSSteve Yin 					return S_OK;
778b0a7a3cfSSteve Yin 				}
779b0a7a3cfSSteve Yin 				else
780b0a7a3cfSSteve Yin 				{
781b0a7a3cfSSteve Yin 					return S_FALSE;
782b0a7a3cfSSteve Yin 				}
783b0a7a3cfSSteve Yin 			}
784b0a7a3cfSSteve Yin 
785b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
786b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
787b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
788b0a7a3cfSSteve Yin 			if(!pChild)
789b0a7a3cfSSteve Yin 				return E_FAIL;
790b0a7a3cfSSteve Yin 
791b0a7a3cfSSteve Yin 			return pChild->get_accKeyboardShortcut(varChild,pszKeyboardShortcut);
792b0a7a3cfSSteve Yin 		}
793b0a7a3cfSSteve Yin 		return S_FALSE;
794b0a7a3cfSSteve Yin 
795b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
7965fdc4257SSteve Yin }
7975fdc4257SSteve Yin 
7985fdc4257SSteve Yin /**
7995fdc4257SSteve Yin * Returns the current focused child to AT.
8005fdc4257SSteve Yin * @param	pvarChild, [in,out] vt member of pvarChild must be VT_I4,and lVal member stores the child ID,
8015fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
8025fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
8035fdc4257SSteve Yin */
get_accFocus(VARIANT * pvarChild)8045fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accFocus(VARIANT *pvarChild)
8055fdc4257SSteve Yin {
8065fdc4257SSteve Yin 
807b0a7a3cfSSteve Yin 	CHECK_ENABLE_INF
808b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
809b0a7a3cfSSteve Yin 		ISDESTROY()
810b0a7a3cfSSteve Yin 		// #CHECK#
811b0a7a3cfSSteve Yin 		if(pvarChild == NULL)
812b0a7a3cfSSteve Yin 		{
813b0a7a3cfSSteve Yin 			return E_INVALIDARG;
814b0a7a3cfSSteve Yin 		}
815b0a7a3cfSSteve Yin 		if( m_dFocusChildID==UACC_NO_FOCUS )
816b0a7a3cfSSteve Yin 		{
817b0a7a3cfSSteve Yin 			pvarChild->vt = VT_EMPTY;//no focus on the object and its children
818b0a7a3cfSSteve Yin 			return S_OK;
819b0a7a3cfSSteve Yin 		}
820b0a7a3cfSSteve Yin 		//if the descendant of current object has focus indicated by m_dFocusChildID, return the IDispatch of this focused object
821b0a7a3cfSSteve Yin 		else
822b0a7a3cfSSteve Yin 		{
823b0a7a3cfSSteve Yin 			IMAccessible* pIMAcc = NULL;
824b0a7a3cfSSteve Yin 			g_pAgent->GetIAccessibleFromResID(m_dFocusChildID,&pIMAcc);
825b0a7a3cfSSteve Yin 			pIMAcc->AddRef();
826b0a7a3cfSSteve Yin 			pvarChild->vt = VT_DISPATCH;
827b0a7a3cfSSteve Yin 			pvarChild->pdispVal = pIMAcc;
828b0a7a3cfSSteve Yin 
829b0a7a3cfSSteve Yin 		}
830b0a7a3cfSSteve Yin 		return S_OK;
831b0a7a3cfSSteve Yin 
832b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
8335fdc4257SSteve Yin }
8345fdc4257SSteve Yin 
8355fdc4257SSteve Yin /**
8365fdc4257SSteve Yin * Returns the selection of the current COM object to AT.
8375fdc4257SSteve Yin * @param	pvarChildren,[in,out]
8385fdc4257SSteve Yin * if selection num is 0,return VT_EMPTY for vt,
8395fdc4257SSteve Yin * if selection num is 1,return VT_I4 for vt,and child index for lVal
8405fdc4257SSteve Yin * if selection num >1,return VT_UNKNOWN for vt, and IEnumVariant* for punkVal
8415fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
8425fdc4257SSteve Yin */
get_accSelection(VARIANT * pvarChildren)8435fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accSelection(VARIANT *pvarChildren)
8445fdc4257SSteve Yin {
845b0a7a3cfSSteve Yin 
8465fdc4257SSteve Yin 	CHECK_ENABLE_INF
847b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
848b0a7a3cfSSteve Yin 		ISDESTROY()
849b0a7a3cfSSteve Yin 		// #CHECK#
850b0a7a3cfSSteve Yin 		if(pvarChildren == NULL)
851b0a7a3cfSSteve Yin 		{
852b0a7a3cfSSteve Yin 			return E_INVALIDARG;
853b0a7a3cfSSteve Yin 		}
854b0a7a3cfSSteve Yin 		switch(m_pEnumVar->GetCountOfElements())
855b0a7a3cfSSteve Yin 		{
856b0a7a3cfSSteve Yin 		case 0:
857b0a7a3cfSSteve Yin 			pvarChildren->vt = VT_EMPTY;
858b0a7a3cfSSteve Yin 			break;
859b0a7a3cfSSteve Yin 		case 1:
860b0a7a3cfSSteve Yin 			VARIANT varTmp[1];
861b0a7a3cfSSteve Yin 			ULONG count;
862b0a7a3cfSSteve Yin 			VariantInit(&varTmp[0]);
863b0a7a3cfSSteve Yin 			m_pEnumVar->Next(1,varTmp,&count);
864b0a7a3cfSSteve Yin 			if(count!=1)
865b0a7a3cfSSteve Yin 				return S_FALSE;
866b0a7a3cfSSteve Yin 			pvarChildren->vt = VT_I4;
867b0a7a3cfSSteve Yin 			pvarChildren->lVal = varTmp[0].lVal;
868b0a7a3cfSSteve Yin 			VariantClear(&varTmp[0]);
869b0a7a3cfSSteve Yin 			m_pEnumVar->Reset();
870b0a7a3cfSSteve Yin 			break;
871b0a7a3cfSSteve Yin 		default:
872b0a7a3cfSSteve Yin 			pvarChildren->vt = VT_UNKNOWN;
873b0a7a3cfSSteve Yin 			m_pEnumVar->AddRef();
874b0a7a3cfSSteve Yin 			pvarChildren->punkVal = m_pEnumVar;
875b0a7a3cfSSteve Yin 			break;
876b0a7a3cfSSteve Yin 		}
877b0a7a3cfSSteve Yin 		return S_OK;
878b0a7a3cfSSteve Yin 
879b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
8805fdc4257SSteve Yin }
8815fdc4257SSteve Yin 
8825fdc4257SSteve Yin /**
8835fdc4257SSteve Yin * Returns the location of the current COM object self or its one child to AT.
8845fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
8855fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
8865fdc4257SSteve Yin * @param	pxLeft, [in,out] use to return the x-coordination of the proper object.
8875fdc4257SSteve Yin * @param	pyTop,  [in,out] use to return the y-coordination of the proper object.
8885fdc4257SSteve Yin * @param	pcxWidth, [in,out] use to return the x-coordination width of the proper object.
8895fdc4257SSteve Yin * @param	pcyHeight, [in,out] use to return the y-coordination height of the proper object.
8905fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
8915fdc4257SSteve Yin */
accLocation(long * pxLeft,long * pyTop,long * pcxWidth,long * pcyHeight,VARIANT varChild)8925fdc4257SSteve Yin STDMETHODIMP CMAccessible::accLocation(long *pxLeft, long *pyTop, long *pcxWidth, long *pcyHeight, VARIANT varChild)
8935fdc4257SSteve Yin {
894b0a7a3cfSSteve Yin 
8955fdc4257SSteve Yin 	CHECK_ENABLE_INF
896b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
897b0a7a3cfSSteve Yin 		ISDESTROY()
898b0a7a3cfSSteve Yin 		// #CHECK#
899b0a7a3cfSSteve Yin 		if(pxLeft == NULL || pyTop == NULL || pcxWidth == NULL || pcyHeight == NULL)
900b0a7a3cfSSteve Yin 		{
901b0a7a3cfSSteve Yin 			return E_INVALIDARG;
902b0a7a3cfSSteve Yin 		}
903b0a7a3cfSSteve Yin 
904b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
905b0a7a3cfSSteve Yin 		{
906b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
907b0a7a3cfSSteve Yin 			{
908b0a7a3cfSSteve Yin 
909b0a7a3cfSSteve Yin 				if(pUNOInterface)
910b0a7a3cfSSteve Yin 				{
911b0a7a3cfSSteve Yin 					Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext();
912b0a7a3cfSSteve Yin 					if( !pRContext.is() )
913b0a7a3cfSSteve Yin 						return S_FALSE;
914b0a7a3cfSSteve Yin 					Reference< XAccessibleComponent > pRComponent(pRContext,UNO_QUERY);
915b0a7a3cfSSteve Yin 					if( !pRComponent.is() )
916b0a7a3cfSSteve Yin 						return S_FALSE;
917b0a7a3cfSSteve Yin 
918b0a7a3cfSSteve Yin 					::com::sun::star::awt::Point pCPoint = pRComponent->getLocationOnScreen();
919b0a7a3cfSSteve Yin 					::com::sun::star::awt::Size pCSize = pRComponent->getSize();
920b0a7a3cfSSteve Yin 					*pxLeft = pCPoint.X;
921b0a7a3cfSSteve Yin 					*pyTop =  pCPoint.Y;
922b0a7a3cfSSteve Yin 					*pcxWidth = pCSize.Width;
923b0a7a3cfSSteve Yin 					*pcyHeight = pCSize.Height;
924b0a7a3cfSSteve Yin 					return S_OK;
925b0a7a3cfSSteve Yin 				}
926b0a7a3cfSSteve Yin 				else
927b0a7a3cfSSteve Yin 				{
928b0a7a3cfSSteve Yin 					*pxLeft = m_sLocation.m_dLeft;
929b0a7a3cfSSteve Yin 					*pyTop = m_sLocation.m_dTop;
930b0a7a3cfSSteve Yin 					*pcxWidth = m_sLocation.m_dWidth;
931b0a7a3cfSSteve Yin 					*pcyHeight = m_sLocation.m_dHeight;
932b0a7a3cfSSteve Yin 					return S_OK;
933b0a7a3cfSSteve Yin 				}
934b0a7a3cfSSteve Yin 			}
935b0a7a3cfSSteve Yin 
936b0a7a3cfSSteve Yin 		}
937b0a7a3cfSSteve Yin 		return S_FALSE;
938b0a7a3cfSSteve Yin 
939b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
9405fdc4257SSteve Yin }
9415fdc4257SSteve Yin 
9425fdc4257SSteve Yin /**
9435fdc4257SSteve Yin * Returns the current focused child to AT.
9445fdc4257SSteve Yin * @param	navDir, the direction flag of the navigation.
9455fdc4257SSteve Yin * @param	varStart, the start child id of this navigation action.
9465fdc4257SSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
9475fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
9485fdc4257SSteve Yin */
accNavigate(long navDir,VARIANT varStart,VARIANT * pvarEndUpAt)9495fdc4257SSteve Yin STDMETHODIMP CMAccessible::accNavigate(long navDir, VARIANT varStart, VARIANT *pvarEndUpAt)
9505fdc4257SSteve Yin {
951b0a7a3cfSSteve Yin 
9525fdc4257SSteve Yin 	CHECK_ENABLE_INF
953b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
954b0a7a3cfSSteve Yin 		ISDESTROY()
955b0a7a3cfSSteve Yin 		// #CHECK#
956b0a7a3cfSSteve Yin 		if(pvarEndUpAt == NULL)
957b0a7a3cfSSteve Yin 		{
958b0a7a3cfSSteve Yin 			return E_INVALIDARG;
959b0a7a3cfSSteve Yin 		}
960b0a7a3cfSSteve Yin 		HRESULT ret = E_FAIL;
961b0a7a3cfSSteve Yin 		switch (navDir)
962b0a7a3cfSSteve Yin 		{
963b0a7a3cfSSteve Yin 		case NAVDIR_FIRSTCHILD:
964b0a7a3cfSSteve Yin 			ret = GetFirstChild(varStart,pvarEndUpAt);
965b0a7a3cfSSteve Yin 			break;
966b0a7a3cfSSteve Yin 		case NAVDIR_LASTCHILD:
967b0a7a3cfSSteve Yin 			ret = GetLastChild(varStart,pvarEndUpAt);
968b0a7a3cfSSteve Yin 			break;
969b0a7a3cfSSteve Yin 		case NAVDIR_NEXT:
970b0a7a3cfSSteve Yin 			ret = GetNextSibling(varStart,pvarEndUpAt);
971b0a7a3cfSSteve Yin 			break;
972b0a7a3cfSSteve Yin 		case NAVDIR_PREVIOUS:
973b0a7a3cfSSteve Yin 			ret = GetPreSibling(varStart,pvarEndUpAt);
974b0a7a3cfSSteve Yin 			break;
975b0a7a3cfSSteve Yin 		case NAVDIR_DOWN://do not implement temporarily
976b0a7a3cfSSteve Yin 			break;
977b0a7a3cfSSteve Yin 		case NAVDIR_UP://do not implement temporarily
978b0a7a3cfSSteve Yin 			break;
979b0a7a3cfSSteve Yin 		case NAVDIR_LEFT://do not implement temporarily
980b0a7a3cfSSteve Yin 			break;
981b0a7a3cfSSteve Yin 		case NAVDIR_RIGHT://do not implement temporarily
982b0a7a3cfSSteve Yin 			break;
983b0a7a3cfSSteve Yin 		default:
984b0a7a3cfSSteve Yin 			break;
985b0a7a3cfSSteve Yin 		};
986b0a7a3cfSSteve Yin 		return ret;
987b0a7a3cfSSteve Yin 
988b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
9895fdc4257SSteve Yin }
9905fdc4257SSteve Yin 
accHitTest(long xLeft,long yTop,VARIANT * pvarChild)9915fdc4257SSteve Yin STDMETHODIMP CMAccessible::accHitTest(long xLeft, long yTop, VARIANT *pvarChild)
9925fdc4257SSteve Yin {
993b0a7a3cfSSteve Yin 
9945fdc4257SSteve Yin 	CHECK_ENABLE_INF
995b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
996b0a7a3cfSSteve Yin 		ISDESTROY()
997b0a7a3cfSSteve Yin 		// #CHECK#
998b0a7a3cfSSteve Yin 		if(pvarChild == NULL)
999b0a7a3cfSSteve Yin 		{
1000b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1001b0a7a3cfSSteve Yin 		}
1002b0a7a3cfSSteve Yin 		long x, y, w, h;
1003b0a7a3cfSSteve Yin 		VARIANT varSelf;
1004b0a7a3cfSSteve Yin 		VariantInit(&varSelf);
1005b0a7a3cfSSteve Yin 		varSelf.vt = VT_I4;
1006b0a7a3cfSSteve Yin 		varSelf.lVal = CHILDID_SELF;
1007b0a7a3cfSSteve Yin 		accLocation(&x,&y,&w,&h,varSelf);
1008b0a7a3cfSSteve Yin 		if( (x < xLeft && (x + w) >xLeft) && (y < yTop && (y + h) >yTop) )
1009b0a7a3cfSSteve Yin 		{
1010b0a7a3cfSSteve Yin 			int i, nCount;
1011b0a7a3cfSSteve Yin 			pvarChild->vt = VT_EMPTY;
1012b0a7a3cfSSteve Yin 			Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface);
1013b0a7a3cfSSteve Yin 			nCount = pRContext->getAccessibleChildCount();
1014b0a7a3cfSSteve Yin 			if(nCount > 256)
1015b0a7a3cfSSteve Yin 				return E_FAIL;
1016b0a7a3cfSSteve Yin 			IMAccessible* child = NULL;
1017b0a7a3cfSSteve Yin 			for( i = 0; i<nCount; i++)
1018b0a7a3cfSSteve Yin 			{
1019b0a7a3cfSSteve Yin 
1020b0a7a3cfSSteve Yin 				child = GetChildInterface(i + 1);
1021b0a7a3cfSSteve Yin 				if(child && child->accHitTest(xLeft,yTop,pvarChild) == S_OK)
1022b0a7a3cfSSteve Yin 					break;
1023b0a7a3cfSSteve Yin 			}
1024b0a7a3cfSSteve Yin 
1025b0a7a3cfSSteve Yin 			if(pvarChild->vt == VT_DISPATCH)
1026b0a7a3cfSSteve Yin 				return S_OK;
1027b0a7a3cfSSteve Yin 
1028b0a7a3cfSSteve Yin 			if( i < nCount)
1029b0a7a3cfSSteve Yin 			{
1030b0a7a3cfSSteve Yin 				pvarChild->vt = VT_DISPATCH;
1031b0a7a3cfSSteve Yin 				pvarChild->pdispVal = child;
1032b0a7a3cfSSteve Yin 				child->AddRef();
1033b0a7a3cfSSteve Yin 			}
1034b0a7a3cfSSteve Yin 			else
1035b0a7a3cfSSteve Yin 			{
1036b0a7a3cfSSteve Yin 				pvarChild->vt = VT_I4;
1037b0a7a3cfSSteve Yin 				pvarChild->lVal = CHILDID_SELF;
1038b0a7a3cfSSteve Yin 			}
1039b0a7a3cfSSteve Yin 			return S_OK;
1040b0a7a3cfSSteve Yin 		}
1041b0a7a3cfSSteve Yin 		return S_FALSE;
1042b0a7a3cfSSteve Yin 
1043b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
10445fdc4257SSteve Yin }
10455fdc4257SSteve Yin 
10465fdc4257SSteve Yin /**
10475fdc4257SSteve Yin * Get The other Interface from CMAccessible.
10485fdc4257SSteve Yin * @param	guidService, must be IID_IAccessible here.
10495fdc4257SSteve Yin * @param	riid, the IID interface .
10505fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
10515fdc4257SSteve Yin */
QueryService(REFGUID guidService,REFIID riid,void ** ppvObject)10525fdc4257SSteve Yin STDMETHODIMP CMAccessible::QueryService(REFGUID guidService, REFIID riid, void** ppvObject)
10535fdc4257SSteve Yin {
1054b0a7a3cfSSteve Yin 	if( InlineIsEqualGUID(guidService, IID_IAccessible) )
1055b0a7a3cfSSteve Yin 		return QueryInterface(riid, ppvObject);
1056b0a7a3cfSSteve Yin 	return S_FALSE;
10575fdc4257SSteve Yin }
10585fdc4257SSteve Yin 
10595fdc4257SSteve Yin /**
10605fdc4257SSteve Yin * Set the accessible name of the current COM object self or its one child from UNO.
10615fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
10625fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
10635fdc4257SSteve Yin * @param	szName, the name used to set the name of the proper object.
10645fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
10655fdc4257SSteve Yin */
put_accName(VARIANT varChild,BSTR szName)10665fdc4257SSteve Yin STDMETHODIMP CMAccessible::put_accName(VARIANT varChild, BSTR szName)
10675fdc4257SSteve Yin {
1068b0a7a3cfSSteve Yin 
1069b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1070b0a7a3cfSSteve Yin 		ISDESTROY()
1071b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
1072b0a7a3cfSSteve Yin 		{
1073b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
1074b0a7a3cfSSteve Yin 			{
1075b0a7a3cfSSteve Yin 				SAFE_SYSFREESTRING(m_pszName);
1076b0a7a3cfSSteve Yin 				m_pszName=SysAllocString(szName);
1077b0a7a3cfSSteve Yin 				return S_OK;
1078b0a7a3cfSSteve Yin 			}
1079b0a7a3cfSSteve Yin 
1080b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
1081b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
1082b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
1083b0a7a3cfSSteve Yin 			if(!pChild)
1084b0a7a3cfSSteve Yin 				return E_FAIL;
1085b0a7a3cfSSteve Yin 			return pChild->put_accName(varChild,szName);
1086b0a7a3cfSSteve Yin 		}
1087b0a7a3cfSSteve Yin 		return E_FAIL;
1088b0a7a3cfSSteve Yin 
1089b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
10905fdc4257SSteve Yin }
10915fdc4257SSteve Yin 
10925fdc4257SSteve Yin /**
10935fdc4257SSteve Yin * Set the accessible value of the current COM object self or its one child from UNO.
10945fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
10955fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
10965fdc4257SSteve Yin * @param	szValue, the value used to set the value of the proper object.
10975fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
10985fdc4257SSteve Yin */
put_accValue(VARIANT varChild,BSTR szValue)10995fdc4257SSteve Yin STDMETHODIMP CMAccessible::put_accValue(VARIANT varChild, BSTR szValue)
11005fdc4257SSteve Yin {
1101b0a7a3cfSSteve Yin 
1102b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1103b0a7a3cfSSteve Yin 		ISDESTROY()
1104b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
1105b0a7a3cfSSteve Yin 		{
1106b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
1107b0a7a3cfSSteve Yin 			{
1108b0a7a3cfSSteve Yin 				SysAllocString(m_pszValue);
1109b0a7a3cfSSteve Yin 				m_pszValue=SysAllocString(szValue);
1110b0a7a3cfSSteve Yin 				return S_OK;
1111b0a7a3cfSSteve Yin 			}
1112b0a7a3cfSSteve Yin 
1113b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
1114b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
1115b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
1116b0a7a3cfSSteve Yin 			if(!pChild)
1117b0a7a3cfSSteve Yin 				return E_FAIL;
1118b0a7a3cfSSteve Yin 			return pChild->put_accValue(varChild,szValue);
1119b0a7a3cfSSteve Yin 		}
1120b0a7a3cfSSteve Yin 		return E_FAIL;
1121b0a7a3cfSSteve Yin 
1122b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
11235fdc4257SSteve Yin }
11245fdc4257SSteve Yin 
11255fdc4257SSteve Yin /**
11265fdc4257SSteve Yin * Set the accessible name of the current COM object self from UNO.
11275fdc4257SSteve Yin * @param	pszName, the name value used to set the name of the current object.
11285fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11295fdc4257SSteve Yin */
Put_XAccName(const OLECHAR __RPC_FAR * pszName)11305fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccName(const OLECHAR __RPC_FAR *pszName)
11315fdc4257SSteve Yin {
11325fdc4257SSteve Yin 
1133b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1134b0a7a3cfSSteve Yin 		ISDESTROY()
1135b0a7a3cfSSteve Yin 		// #CHECK#
1136b0a7a3cfSSteve Yin 		if(pszName == NULL)
1137b0a7a3cfSSteve Yin 		{
1138b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1139b0a7a3cfSSteve Yin 		}
1140b0a7a3cfSSteve Yin 
1141b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszName);//??
1142b0a7a3cfSSteve Yin 		m_pszName = SysAllocString(pszName);
1143b0a7a3cfSSteve Yin 		if(m_pszName==NULL)
1144b0a7a3cfSSteve Yin 			return E_FAIL;
1145b0a7a3cfSSteve Yin 		return S_OK;
11465fdc4257SSteve Yin 
1147b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
11485fdc4257SSteve Yin }
11495fdc4257SSteve Yin 
11505fdc4257SSteve Yin /**
11515fdc4257SSteve Yin * Set the accessible role of the current COM object self from UNO.
11525fdc4257SSteve Yin * @param	pRole, the role value used to set the role of the current object.
11535fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11545fdc4257SSteve Yin */
Put_XAccRole(unsigned short pRole)11555fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccRole(unsigned short pRole)
11565fdc4257SSteve Yin {
1157b0a7a3cfSSteve Yin 	m_iRole = pRole;
1158b0a7a3cfSSteve Yin 	return S_OK;
11595fdc4257SSteve Yin }
11605fdc4257SSteve Yin 
11615fdc4257SSteve Yin /**
11625fdc4257SSteve Yin * Add one state into the current state set for the current COM object from UNO.
11635fdc4257SSteve Yin * @param	pXSate, the state used to set the name of the current object.
11645fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11655fdc4257SSteve Yin */
DecreaseState(DWORD pXSate)11665fdc4257SSteve Yin STDMETHODIMP CMAccessible::DecreaseState(DWORD pXSate)
11675fdc4257SSteve Yin {
1168b0a7a3cfSSteve Yin 	m_dState &= (~pXSate);
1169b0a7a3cfSSteve Yin 	return S_OK;
11705fdc4257SSteve Yin }
11715fdc4257SSteve Yin 
11725fdc4257SSteve Yin /**
11735fdc4257SSteve Yin * Delete one state into the current state set for the current COM object from UNO.
11745fdc4257SSteve Yin * @param	pXSate, the state used to set the name of the current object.
11755fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11765fdc4257SSteve Yin */
IncreaseState(DWORD pXSate)11775fdc4257SSteve Yin STDMETHODIMP CMAccessible::IncreaseState(DWORD pXSate)
11785fdc4257SSteve Yin {
1179b0a7a3cfSSteve Yin 	m_dState |= pXSate;
1180b0a7a3cfSSteve Yin 	return S_OK;
11815fdc4257SSteve Yin }
11825fdc4257SSteve Yin 
11835fdc4257SSteve Yin /**
11845fdc4257SSteve Yin * Set state into the current state set for the current COM object from UNO.
11855fdc4257SSteve Yin * @param	pXSate, the state used to set the name of the current object.
11865fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11875fdc4257SSteve Yin */
SetState(DWORD pXSate)11885fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetState(DWORD pXSate)
11895fdc4257SSteve Yin {
1190b0a7a3cfSSteve Yin 	m_dState = pXSate;
1191b0a7a3cfSSteve Yin 	return S_OK;
11925fdc4257SSteve Yin }
11935fdc4257SSteve Yin 
11945fdc4257SSteve Yin 
11955fdc4257SSteve Yin 
11965fdc4257SSteve Yin /**
11975fdc4257SSteve Yin * Set the accessible description of the current COM object self from UNO.
11985fdc4257SSteve Yin * @param	pszDescription, the name used to set the description of the current object.
11995fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
12005fdc4257SSteve Yin */
Put_XAccDescription(const OLECHAR __RPC_FAR * pszDescription)12015fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccDescription(const OLECHAR __RPC_FAR *pszDescription)
12025fdc4257SSteve Yin {
12035fdc4257SSteve Yin 
1204b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1205b0a7a3cfSSteve Yin 		ISDESTROY()
1206b0a7a3cfSSteve Yin 		// #CHECK#
1207b0a7a3cfSSteve Yin 		if(pszDescription == NULL)
1208b0a7a3cfSSteve Yin 		{
1209b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1210b0a7a3cfSSteve Yin 		}
12115fdc4257SSteve Yin 
1212b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszDescription);
1213b0a7a3cfSSteve Yin 		m_pszDescription = SysAllocString(pszDescription);
12145fdc4257SSteve Yin 
1215b0a7a3cfSSteve Yin 		if(m_pszDescription==NULL)
1216b0a7a3cfSSteve Yin 			return E_FAIL;
1217b0a7a3cfSSteve Yin 		return S_OK;
1218b0a7a3cfSSteve Yin 
1219b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
12205fdc4257SSteve Yin }
12215fdc4257SSteve Yin 
12225fdc4257SSteve Yin /**
12235fdc4257SSteve Yin * Set the accessible value of the current COM object self from UNO.
12245fdc4257SSteve Yin * @param	pszAccValue, the name used to set the value of the current object.
12255fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
12265fdc4257SSteve Yin */
Put_XAccValue(const OLECHAR __RPC_FAR * pszAccValue)12275fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccValue(const OLECHAR __RPC_FAR *pszAccValue)
12285fdc4257SSteve Yin {
12295fdc4257SSteve Yin 
1230b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1231b0a7a3cfSSteve Yin 		ISDESTROY()
1232b0a7a3cfSSteve Yin 		// #CHECK#
1233b0a7a3cfSSteve Yin 		if(pszAccValue == NULL)
1234b0a7a3cfSSteve Yin 		{
1235b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1236b0a7a3cfSSteve Yin 		}
1237b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszValue);
1238b0a7a3cfSSteve Yin 		m_pszValue = SysAllocString(pszAccValue);
1239b0a7a3cfSSteve Yin 		if(m_pszValue==NULL)
1240b0a7a3cfSSteve Yin 			return E_FAIL;
1241b0a7a3cfSSteve Yin 		return S_OK;
1242b0a7a3cfSSteve Yin 
1243b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
12445fdc4257SSteve Yin }
12455fdc4257SSteve Yin 
12465fdc4257SSteve Yin /**
12475fdc4257SSteve Yin * Set the HWND value of the current COM object self from UNO. It should set the parent IAccessible
12485fdc4257SSteve Yin * Object through the method AccessibleObjectFromWindow(...).
12495fdc4257SSteve Yin * @param	hwnd, the HWND used to set the value of the current object.
12505fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
12515fdc4257SSteve Yin */
Put_XAccWindowHandle(HWND hwnd)12525fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccWindowHandle(HWND hwnd)
12535fdc4257SSteve Yin {
12545fdc4257SSteve Yin 
1255b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1256b0a7a3cfSSteve Yin 		ISDESTROY()
1257b0a7a3cfSSteve Yin 		m_hwnd = hwnd;
1258b0a7a3cfSSteve Yin 	return S_OK;
1259b0a7a3cfSSteve Yin 
1260b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
12615fdc4257SSteve Yin }
12625fdc4257SSteve Yin 
12635fdc4257SSteve Yin /**
12645fdc4257SSteve Yin * Set accessible focus by specifying child ID
12655fdc4257SSteve Yin * @param	dChildID, the child id identifies the focus child.
12665fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
12675fdc4257SSteve Yin */
Put_XAccFocus(long dChildID)12685fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccFocus(long dChildID)
12695fdc4257SSteve Yin {
12705fdc4257SSteve Yin 
1271b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1272b0a7a3cfSSteve Yin 		ISDESTROY()
1273b0a7a3cfSSteve Yin 
1274b0a7a3cfSSteve Yin 		if(dChildID==CHILDID_SELF)
1275b0a7a3cfSSteve Yin 		{
1276b0a7a3cfSSteve Yin 			if(m_pIParent)
1277b0a7a3cfSSteve Yin 			{
1278b0a7a3cfSSteve Yin 				m_pIParent->Put_XAccFocus(m_dChildID);
1279b0a7a3cfSSteve Yin 			}
1280b0a7a3cfSSteve Yin 		}
1281b0a7a3cfSSteve Yin 		else
1282b0a7a3cfSSteve Yin 		{
1283b0a7a3cfSSteve Yin 			m_dFocusChildID = dChildID;
1284b0a7a3cfSSteve Yin 			//traverse all ancestors to set the focused child ID so that when the get_accFocus is called on
1285b0a7a3cfSSteve Yin 			//any of the ancestors, this id can be used to get the IAccessible of focused object.
1286b0a7a3cfSSteve Yin 			if(m_pIParent)
1287b0a7a3cfSSteve Yin 			{
1288b0a7a3cfSSteve Yin 				m_pIParent->Put_XAccFocus(dChildID);
1289b0a7a3cfSSteve Yin 			}
1290b0a7a3cfSSteve Yin 		}
1291b0a7a3cfSSteve Yin 		return S_OK;
1292b0a7a3cfSSteve Yin 
1293b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
12945fdc4257SSteve Yin }
12955fdc4257SSteve Yin 
12965fdc4257SSteve Yin /**
1297b0a7a3cfSSteve Yin *Set accessible object location for the current COM object
1298b0a7a3cfSSteve Yin * @param	sLocation, the location of the current object.
1299b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1300b0a7a3cfSSteve Yin */
Put_XAccLocation(const Location sLocation)13015fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccLocation(const Location sLocation)
13025fdc4257SSteve Yin {
1303b0a7a3cfSSteve Yin 
1304b0a7a3cfSSteve Yin 	this->m_sLocation = sLocation;
1305b0a7a3cfSSteve Yin 	return S_OK;
13065fdc4257SSteve Yin }
13075fdc4257SSteve Yin 
13085fdc4257SSteve Yin /**
1309b0a7a3cfSSteve Yin * Set accessible parent object for the current COM object if
1310b0a7a3cfSSteve Yin * the current object is a child of some COM object
1311b0a7a3cfSSteve Yin * @param	pIParent, the parent of the current object.
1312b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1313b0a7a3cfSSteve Yin */
Put_XAccParent(IMAccessible __RPC_FAR * pIParent)13145fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccParent(IMAccessible __RPC_FAR *pIParent)
13155fdc4257SSteve Yin {
1316b0a7a3cfSSteve Yin 	this->m_pIParent = pIParent;
13175fdc4257SSteve Yin 
1318b0a7a3cfSSteve Yin 	if(pIParent)
1319b0a7a3cfSSteve Yin 		m_pIParent->AddRef();
13205fdc4257SSteve Yin 
1321b0a7a3cfSSteve Yin 	return S_OK;
13225fdc4257SSteve Yin }
13235fdc4257SSteve Yin 
13245fdc4257SSteve Yin /**
1325b0a7a3cfSSteve Yin * Set unique child id to COM
1326b0a7a3cfSSteve Yin * @param	dChildID, the id of the current object.
1327b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1328b0a7a3cfSSteve Yin */
Put_XAccChildID(long dChildID)13295fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccChildID(long dChildID)
13305fdc4257SSteve Yin {
1331b0a7a3cfSSteve Yin 
1332b0a7a3cfSSteve Yin 	this->m_dChildID = dChildID;
1333b0a7a3cfSSteve Yin 	return S_OK;
13345fdc4257SSteve Yin }
13355fdc4257SSteve Yin 
13365fdc4257SSteve Yin /**
1337b0a7a3cfSSteve Yin * Set AccObjectManagerAgent object pointer to COM
1338b0a7a3cfSSteve Yin * @param	pAgent, the AccObjectManagerAgent point.
1339b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1340b0a7a3cfSSteve Yin */
Put_XAccAgent(long pAgent)13415fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccAgent(long pAgent)
13425fdc4257SSteve Yin {
1343b0a7a3cfSSteve Yin 	g_pAgent = (AccObjectManagerAgent*)pAgent;
1344b0a7a3cfSSteve Yin 	return S_OK;
13455fdc4257SSteve Yin }
13465fdc4257SSteve Yin 
13475fdc4257SSteve Yin /**
1348b0a7a3cfSSteve Yin * When a UNO control disposing, it disposes its listeners,
1349b0a7a3cfSSteve Yin * then notify AccObject in bridge management, then notify
1350b0a7a3cfSSteve Yin * COM that the XAccessible is invalid,so set pUNOInterface as NULL
1351b0a7a3cfSSteve Yin * @param	isDestroy, true is it need to be destroyed.
1352b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1353b0a7a3cfSSteve Yin */
NotifyDestroy(BOOL isDestroy)13545fdc4257SSteve Yin STDMETHODIMP CMAccessible::NotifyDestroy(BOOL isDestroy)
13555fdc4257SSteve Yin {
1356b0a7a3cfSSteve Yin 
1357b0a7a3cfSSteve Yin 	m_isDestroy = isDestroy;
1358b0a7a3cfSSteve Yin 	pUNOInterface = NULL;
1359b0a7a3cfSSteve Yin 	return S_OK;
13605fdc4257SSteve Yin }
13615fdc4257SSteve Yin 
13625fdc4257SSteve Yin /**
1363b0a7a3cfSSteve Yin *private methods that help implement public functions
1364b0a7a3cfSSteve Yin */
13655fdc4257SSteve Yin 
13665fdc4257SSteve Yin /**
1367b0a7a3cfSSteve Yin * Return child interface pointer by child ID,note: need to call AddRef()
1368b0a7a3cfSSteve Yin * @param	lChildID, specify child index,which AT(such as Inspect32) gives.
1369b0a7a3cfSSteve Yin * @return  IMAccessible*, pointer to the corresponding child object.
1370b0a7a3cfSSteve Yin */
GetChildInterface(long dChildID)13715fdc4257SSteve Yin IMAccessible* CMAccessible::GetChildInterface(long dChildID)//for test
13725fdc4257SSteve Yin {
1373b0a7a3cfSSteve Yin 
1374b0a7a3cfSSteve Yin 	long dChildIndex = 0;
1375b0a7a3cfSSteve Yin 	if(dChildID<0)
1376b0a7a3cfSSteve Yin 	{
1377b0a7a3cfSSteve Yin 		if(g_pAgent)
1378b0a7a3cfSSteve Yin 		{
1379b0a7a3cfSSteve Yin 			IMAccessible* pIMAcc = NULL;
1380b0a7a3cfSSteve Yin 			g_pAgent->GetIAccessibleFromResID(dChildID,&pIMAcc);
1381b0a7a3cfSSteve Yin 			return pIMAcc;
1382b0a7a3cfSSteve Yin 		}
1383b0a7a3cfSSteve Yin 		return NULL;
1384b0a7a3cfSSteve Yin 	}
1385b0a7a3cfSSteve Yin 	else
1386b0a7a3cfSSteve Yin 	{
1387b0a7a3cfSSteve Yin 		Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext();
1388b0a7a3cfSSteve Yin 		if( !pRContext.is() )
1389b0a7a3cfSSteve Yin 			return NULL;
1390b0a7a3cfSSteve Yin 
1391b0a7a3cfSSteve Yin 		if(dChildID<1 || dChildID>pRContext->getAccessibleChildCount())
1392b0a7a3cfSSteve Yin 			return NULL;
1393b0a7a3cfSSteve Yin 
1394b0a7a3cfSSteve Yin 		IAccessible* pChild = NULL;
1395b0a7a3cfSSteve Yin 		Reference< XAccessible > pXChild = pRContext->getAccessibleChild(dChildID-1);
1396b0a7a3cfSSteve Yin 		BOOL isGet = get_IAccessibleFromXAccessible((long)pXChild.get(),&pChild);
1397b0a7a3cfSSteve Yin 
1398b0a7a3cfSSteve Yin 		if(!isGet)
1399b0a7a3cfSSteve Yin 		{
1400b0a7a3cfSSteve Yin 			g_pAgent->InsertAccObj(pXChild.get(),pUNOInterface,(long)m_hwnd);
1401b0a7a3cfSSteve Yin 			isGet = get_IAccessibleFromXAccessible((long)pXChild.get(),&pChild);
1402b0a7a3cfSSteve Yin 		}
1403b0a7a3cfSSteve Yin 
1404b0a7a3cfSSteve Yin 		if(isGet)
1405b0a7a3cfSSteve Yin 		{
1406b0a7a3cfSSteve Yin 			IMAccessible* pIMAcc =  (IMAccessible*)pChild;
1407b0a7a3cfSSteve Yin 			return pIMAcc;
1408b0a7a3cfSSteve Yin 		}
1409b0a7a3cfSSteve Yin 	}
1410b0a7a3cfSSteve Yin 
1411b0a7a3cfSSteve Yin 	return NULL;
14125fdc4257SSteve Yin }
14135fdc4257SSteve Yin 
14145fdc4257SSteve Yin /**
1415b0a7a3cfSSteve Yin * For List, tree and table,these roles belong to manage_decendant in UNO,
1416b0a7a3cfSSteve Yin * need to process specifically when navigate
1417b0a7a3cfSSteve Yin * @return  BOOL, if it is decendantmanager, return true.
1418b0a7a3cfSSteve Yin */
IsDecendantManage()14195fdc4257SSteve Yin BOOL CMAccessible::IsDecendantManage()
14205fdc4257SSteve Yin {
1421b0a7a3cfSSteve Yin 
1422b0a7a3cfSSteve Yin 	return (m_iRole==ROLE_SYSTEM_LIST)||(m_iRole==ROLE_SYSTEM_OUTLINE)||(m_iRole==ROLE_SYSTEM_TABLE);
14235fdc4257SSteve Yin }
14245fdc4257SSteve Yin 
14255fdc4257SSteve Yin /**
1426b0a7a3cfSSteve Yin * for decendantmanager circumstance,provide child interface when navigate
1427b0a7a3cfSSteve Yin * @param	varCur, the current child.
1428b0a7a3cfSSteve Yin * @param	flags, the navigation direction.
1429b0a7a3cfSSteve Yin * @return  IMAccessible*, the child of the end up node.
1430b0a7a3cfSSteve Yin */
GetNavigateChildForDM(VARIANT varCur,short flags)14315fdc4257SSteve Yin IMAccessible* CMAccessible::GetNavigateChildForDM(VARIANT varCur, short flags)
14325fdc4257SSteve Yin {
1433b0a7a3cfSSteve Yin 
1434b0a7a3cfSSteve Yin 	XAccessibleContext* pXContext = GetContextByXAcc(pUNOInterface);
1435b0a7a3cfSSteve Yin 	if(pXContext==NULL)
1436b0a7a3cfSSteve Yin 	{
1437b0a7a3cfSSteve Yin 		return NULL;
1438b0a7a3cfSSteve Yin 	}
1439b0a7a3cfSSteve Yin 
1440b0a7a3cfSSteve Yin 	int count = pXContext->getAccessibleChildCount();
1441b0a7a3cfSSteve Yin 	if(count<1)
1442b0a7a3cfSSteve Yin 	{
1443b0a7a3cfSSteve Yin 		return NULL;
1444b0a7a3cfSSteve Yin 	}
1445b0a7a3cfSSteve Yin 
1446b0a7a3cfSSteve Yin 	IMAccessible* pCurChild = NULL;
1447b0a7a3cfSSteve Yin 	XAccessible* pChildXAcc = NULL;
1448b0a7a3cfSSteve Yin 	Reference<XAccessible> pRChildXAcc;
1449b0a7a3cfSSteve Yin 	XAccessibleContext* pChildContext = NULL;
1450b0a7a3cfSSteve Yin 	int index = 0,delta=0;
1451b0a7a3cfSSteve Yin 	switch(flags)
1452b0a7a3cfSSteve Yin 	{
1453b0a7a3cfSSteve Yin 	case DM_FIRSTCHILD:
1454b0a7a3cfSSteve Yin 		pRChildXAcc = pXContext->getAccessibleChild(0);
1455b0a7a3cfSSteve Yin 		break;
1456b0a7a3cfSSteve Yin 	case DM_LASTCHILD:
1457b0a7a3cfSSteve Yin 		pRChildXAcc = pXContext->getAccessibleChild(count-1);
1458b0a7a3cfSSteve Yin 		break;
1459b0a7a3cfSSteve Yin 	case DM_NEXTCHILD:
1460b0a7a3cfSSteve Yin 	case DM_PREVCHILD:
1461b0a7a3cfSSteve Yin 		pCurChild = GetChildInterface(varCur.lVal);
1462b0a7a3cfSSteve Yin 		if(pCurChild==NULL)
1463b0a7a3cfSSteve Yin 		{
1464b0a7a3cfSSteve Yin 			return NULL;
1465b0a7a3cfSSteve Yin 		}
1466b0a7a3cfSSteve Yin 		pCurChild->GetUNOInterface((long*)&pChildXAcc);
1467b0a7a3cfSSteve Yin 		if(pChildXAcc==NULL)
1468b0a7a3cfSSteve Yin 		{
1469b0a7a3cfSSteve Yin 			return NULL;
1470b0a7a3cfSSteve Yin 		}
1471b0a7a3cfSSteve Yin 		pChildContext = GetContextByXAcc(pChildXAcc);
1472b0a7a3cfSSteve Yin 		if(pChildContext == NULL)
1473b0a7a3cfSSteve Yin 		{
1474b0a7a3cfSSteve Yin 			return NULL;
1475b0a7a3cfSSteve Yin 		}
1476b0a7a3cfSSteve Yin 		delta = (flags==DM_NEXTCHILD)?1:-1;
1477b0a7a3cfSSteve Yin 		//currently, getAccessibleIndexInParent is error in UNO for
1478b0a7a3cfSSteve Yin 		//some kind of List,such as ValueSet, the index will be less 1 than
1479b0a7a3cfSSteve Yin 		//what should be, need to fix UNO code
1480b0a7a3cfSSteve Yin 		index = pChildContext->getAccessibleIndexInParent()+delta;
1481b0a7a3cfSSteve Yin 		if((index>=0)&&(index<=count-1))
1482b0a7a3cfSSteve Yin 		{
1483b0a7a3cfSSteve Yin 			pRChildXAcc = pXContext->getAccessibleChild(index);
1484b0a7a3cfSSteve Yin 		}
1485b0a7a3cfSSteve Yin 		break;
1486b0a7a3cfSSteve Yin 	default:
1487b0a7a3cfSSteve Yin 		break;
1488b0a7a3cfSSteve Yin 	}
1489b0a7a3cfSSteve Yin 
1490b0a7a3cfSSteve Yin 	if(!pRChildXAcc.is())
1491b0a7a3cfSSteve Yin 	{
1492b0a7a3cfSSteve Yin 		return NULL;
1493b0a7a3cfSSteve Yin 	}
1494b0a7a3cfSSteve Yin 	pChildXAcc = pRChildXAcc.get();
1495b0a7a3cfSSteve Yin 	g_pAgent->InsertAccObj(pChildXAcc,pUNOInterface);
1496b0a7a3cfSSteve Yin 	return g_pAgent->GetIMAccByXAcc(pChildXAcc);
14975fdc4257SSteve Yin }
14985fdc4257SSteve Yin 
14995fdc4257SSteve Yin /**
1500b0a7a3cfSSteve Yin *the following 4 private methods are for accNavigate implementation
1501b0a7a3cfSSteve Yin */
15025fdc4257SSteve Yin 
15035fdc4257SSteve Yin /**
1504b0a7a3cfSSteve Yin * Return first child for parent container, process differently according
1505b0a7a3cfSSteve Yin * to whether it is decendant manage
1506b0a7a3cfSSteve Yin * @param	varStart, the start child id of this navigation action.
1507b0a7a3cfSSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
1508b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1509b0a7a3cfSSteve Yin */
GetFirstChild(VARIANT varStart,VARIANT * pvarEndUpAt)15105fdc4257SSteve Yin HRESULT CMAccessible::GetFirstChild(VARIANT varStart,VARIANT* pvarEndUpAt)
15115fdc4257SSteve Yin {
1512b0a7a3cfSSteve Yin 
1513b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1514b0a7a3cfSSteve Yin 		ISDESTROY()
1515b0a7a3cfSSteve Yin 		// #CHECK#
1516b0a7a3cfSSteve Yin 		if(pvarEndUpAt == NULL)
1517b0a7a3cfSSteve Yin 		{
1518b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1519b0a7a3cfSSteve Yin 		}
1520b0a7a3cfSSteve Yin 		if(varStart.vt != VT_I4)
1521b0a7a3cfSSteve Yin 		{
1522b0a7a3cfSSteve Yin 			pvarEndUpAt->vt = VT_EMPTY;
1523b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1524b0a7a3cfSSteve Yin 		}
1525b0a7a3cfSSteve Yin 
1526b0a7a3cfSSteve Yin 		pvarEndUpAt->pdispVal = GetNavigateChildForDM(varStart, DM_FIRSTCHILD);
1527b0a7a3cfSSteve Yin 		if(pvarEndUpAt->pdispVal)
1528b0a7a3cfSSteve Yin 		{
1529b0a7a3cfSSteve Yin 			pvarEndUpAt->pdispVal->AddRef();
1530b0a7a3cfSSteve Yin 			pvarEndUpAt->vt = VT_DISPATCH;
1531b0a7a3cfSSteve Yin 			return S_OK;
1532b0a7a3cfSSteve Yin 		}
1533b0a7a3cfSSteve Yin 
1534b0a7a3cfSSteve Yin 		pvarEndUpAt->vt = VT_EMPTY;
1535b0a7a3cfSSteve Yin 		return E_FAIL;
1536b0a7a3cfSSteve Yin 
1537b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
15385fdc4257SSteve Yin }
15395fdc4257SSteve Yin 
15405fdc4257SSteve Yin /**
1541b0a7a3cfSSteve Yin * Return last child for parent container, process differently according
1542b0a7a3cfSSteve Yin * to whether it is decendant manage
1543b0a7a3cfSSteve Yin * @param	varStart, the start child id of this navigation action.
1544b0a7a3cfSSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
1545b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1546b0a7a3cfSSteve Yin */
GetLastChild(VARIANT varStart,VARIANT * pvarEndUpAt)15475fdc4257SSteve Yin HRESULT CMAccessible::GetLastChild(VARIANT varStart,VARIANT* pvarEndUpAt)
15485fdc4257SSteve Yin {
1549b0a7a3cfSSteve Yin 
1550b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1551b0a7a3cfSSteve Yin 		ISDESTROY()
1552b0a7a3cfSSteve Yin 		// #CHECK#
1553b0a7a3cfSSteve Yin 		if(pvarEndUpAt == NULL)
1554b0a7a3cfSSteve Yin 		{
1555b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1556b0a7a3cfSSteve Yin 		}
1557b0a7a3cfSSteve Yin 		if(varStart.vt != VT_I4)
1558b0a7a3cfSSteve Yin 		{
1559b0a7a3cfSSteve Yin 			pvarEndUpAt->vt = VT_EMPTY;
1560b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1561b0a7a3cfSSteve Yin 		}
1562b0a7a3cfSSteve Yin 
1563b0a7a3cfSSteve Yin 		pvarEndUpAt->pdispVal = GetNavigateChildForDM(varStart, DM_LASTCHILD);
1564b0a7a3cfSSteve Yin 		if(pvarEndUpAt->pdispVal)
1565b0a7a3cfSSteve Yin 		{
1566b0a7a3cfSSteve Yin 			pvarEndUpAt->pdispVal->AddRef();
1567b0a7a3cfSSteve Yin 			pvarEndUpAt->vt = VT_DISPATCH;
1568b0a7a3cfSSteve Yin 			return S_OK;
1569b0a7a3cfSSteve Yin 		}
1570b0a7a3cfSSteve Yin 		pvarEndUpAt->vt = VT_EMPTY;
1571b0a7a3cfSSteve Yin 		return E_FAIL;
1572b0a7a3cfSSteve Yin 
1573b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
15745fdc4257SSteve Yin }
15755fdc4257SSteve Yin 
15765fdc4257SSteve Yin /**
1577b0a7a3cfSSteve Yin * The method GetNextSibling is general, whatever it is decendant manage or not
1578b0a7a3cfSSteve Yin * Get the next sibling object.
1579b0a7a3cfSSteve Yin * @param	varStart, the start child id of this navigation action.
1580b0a7a3cfSSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
1581b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1582b0a7a3cfSSteve Yin */
GetNextSibling(VARIANT varStart,VARIANT * pvarEndUpAt)15835fdc4257SSteve Yin HRESULT CMAccessible::GetNextSibling(VARIANT varStart,VARIANT* pvarEndUpAt)
15845fdc4257SSteve Yin {
1585b0a7a3cfSSteve Yin 
1586b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1587b0a7a3cfSSteve Yin 		ISDESTROY()
1588b0a7a3cfSSteve Yin 		if(varStart.vt != VT_I4)
1589b0a7a3cfSSteve Yin 		{
1590b0a7a3cfSSteve Yin 			pvarEndUpAt->vt = VT_EMPTY;
1591b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1592b0a7a3cfSSteve Yin 		}
1593b0a7a3cfSSteve Yin 
1594b0a7a3cfSSteve Yin 		Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface);
1595b0a7a3cfSSteve Yin 		if(pRContext.is())
1596b0a7a3cfSSteve Yin 		{
1597b0a7a3cfSSteve Yin 			varStart.iVal = sal_Int16(pRContext->getAccessibleIndexInParent() + 2);
1598b0a7a3cfSSteve Yin 			if(m_pIParent)
1599b0a7a3cfSSteve Yin 				if( m_pIParent->get_accChild(varStart,&pvarEndUpAt->pdispVal) == S_OK)
1600b0a7a3cfSSteve Yin 				{
1601b0a7a3cfSSteve Yin 					pvarEndUpAt->vt = VT_DISPATCH;
1602b0a7a3cfSSteve Yin 					return S_OK;
1603b0a7a3cfSSteve Yin 				}
1604b0a7a3cfSSteve Yin 		}
1605b0a7a3cfSSteve Yin 		pvarEndUpAt->vt = VT_EMPTY;
1606b0a7a3cfSSteve Yin 		return E_FAIL;
1607b0a7a3cfSSteve Yin 
1608b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
16095fdc4257SSteve Yin }
16105fdc4257SSteve Yin 
16115fdc4257SSteve Yin /**
1612b0a7a3cfSSteve Yin *the method GetPreSibling is general, whatever it is decendant manage or not
1613b0a7a3cfSSteve Yin * @param	varStart, the start child id of this navigation action.
1614b0a7a3cfSSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
1615b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1616b0a7a3cfSSteve Yin */
GetPreSibling(VARIANT varStart,VARIANT * pvarEndUpAt)16175fdc4257SSteve Yin HRESULT CMAccessible::GetPreSibling(VARIANT varStart,VARIANT* pvarEndUpAt)
16185fdc4257SSteve Yin {
1619b0a7a3cfSSteve Yin 
1620b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1621b0a7a3cfSSteve Yin 		ISDESTROY()
1622b0a7a3cfSSteve Yin 		// #CHECK#
1623b0a7a3cfSSteve Yin 		if(pvarEndUpAt == NULL)
1624b0a7a3cfSSteve Yin 		{
1625b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1626b0a7a3cfSSteve Yin 		}
1627b0a7a3cfSSteve Yin 		if(varStart.vt != VT_I4)
1628b0a7a3cfSSteve Yin 		{
1629b0a7a3cfSSteve Yin 			pvarEndUpAt->vt = VT_EMPTY;
1630b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1631b0a7a3cfSSteve Yin 		}
1632b0a7a3cfSSteve Yin 
1633b0a7a3cfSSteve Yin 		Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface);
1634b0a7a3cfSSteve Yin 		if(pRContext.is())
1635b0a7a3cfSSteve Yin 		{
1636b0a7a3cfSSteve Yin 			varStart.iVal = sal_Int16(pRContext->getAccessibleIndexInParent());
1637b0a7a3cfSSteve Yin 			if(m_pIParent && varStart.iVal > 0)
1638b0a7a3cfSSteve Yin 				if( m_pIParent->get_accChild(varStart,&pvarEndUpAt->pdispVal) == S_OK)
1639b0a7a3cfSSteve Yin 				{
1640b0a7a3cfSSteve Yin 					pvarEndUpAt->vt = VT_DISPATCH;
1641b0a7a3cfSSteve Yin 					return S_OK;
1642b0a7a3cfSSteve Yin 				}
1643b0a7a3cfSSteve Yin 		}
1644b0a7a3cfSSteve Yin 		pvarEndUpAt->vt = VT_EMPTY;
1645b0a7a3cfSSteve Yin 		return E_FAIL;
1646b0a7a3cfSSteve Yin 
1647b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
16485fdc4257SSteve Yin }
16495fdc4257SSteve Yin 
16505fdc4257SSteve Yin /**
1651b0a7a3cfSSteve Yin * For IAccessible2 implementation methods
1652b0a7a3cfSSteve Yin */
get_nRelations(long __RPC_FAR * nRelations)16535fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_nRelations( long __RPC_FAR *nRelations)
16545fdc4257SSteve Yin {
1655b0a7a3cfSSteve Yin 
16565fdc4257SSteve Yin 	CHECK_ENABLE_INF
1657b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
1658*5b933a9eSSteve Yin 		ISDESTROY()
16595fdc4257SSteve Yin 
1660b0a7a3cfSSteve Yin 		// #CHECK#
1661b0a7a3cfSSteve Yin 		if(nRelations == NULL)
1662b0a7a3cfSSteve Yin 		{
1663b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1664b0a7a3cfSSteve Yin 		}
16655fdc4257SSteve Yin 
1666b0a7a3cfSSteve Yin 		*nRelations = 0;
16675fdc4257SSteve Yin 
1668b0a7a3cfSSteve Yin 		if( !pRContext.is() )
1669b0a7a3cfSSteve Yin 			return E_FAIL;
1670b0a7a3cfSSteve Yin 		Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet();
1671b0a7a3cfSSteve Yin 		if(!pRrelationSet.is())
1672b0a7a3cfSSteve Yin 		{
1673b0a7a3cfSSteve Yin 			*nRelations = 0;
1674b0a7a3cfSSteve Yin 			return S_OK;
1675b0a7a3cfSSteve Yin 		}
16765fdc4257SSteve Yin 
1677b0a7a3cfSSteve Yin 		*nRelations = pRrelationSet->getRelationCount();
1678b0a7a3cfSSteve Yin 		return S_OK;
16795fdc4257SSteve Yin 
1680b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
16815fdc4257SSteve Yin }
16825fdc4257SSteve Yin 
get_relation(long relationIndex,IAccessibleRelation __RPC_FAR * __RPC_FAR * relation)16835fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_relation( long relationIndex, IAccessibleRelation __RPC_FAR *__RPC_FAR *relation)
16845fdc4257SSteve Yin {
1685b0a7a3cfSSteve Yin 
16865fdc4257SSteve Yin 	CHECK_ENABLE_INF
1687b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
1688b0a7a3cfSSteve Yin 		ISDESTROY()
1689b0a7a3cfSSteve Yin 		// #CHECK#
1690b0a7a3cfSSteve Yin 		if(relation == NULL)
1691b0a7a3cfSSteve Yin 		{
1692b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1693b0a7a3cfSSteve Yin 		}
16945fdc4257SSteve Yin 
1695b0a7a3cfSSteve Yin 		if( !pRContext.is() )
1696b0a7a3cfSSteve Yin 			return E_FAIL;
16975fdc4257SSteve Yin 
16985fdc4257SSteve Yin 
1699b0a7a3cfSSteve Yin 		long nMax = 0;
1700b0a7a3cfSSteve Yin 		long nReal = 0;
1701b0a7a3cfSSteve Yin 		get_nRelations(&nMax);
17025fdc4257SSteve Yin 
1703b0a7a3cfSSteve Yin 		*relation = (IAccessibleRelation*)::CoTaskMemAlloc(sizeof(IAccessibleRelation));
17045fdc4257SSteve Yin 
1705b0a7a3cfSSteve Yin 		// #CHECK Memory Allocation#
1706b0a7a3cfSSteve Yin 		if(*relation == NULL)
1707b0a7a3cfSSteve Yin 		{
1708b0a7a3cfSSteve Yin 			return E_FAIL;
1709b0a7a3cfSSteve Yin 		}
17105fdc4257SSteve Yin 
1711b0a7a3cfSSteve Yin 		if( relationIndex < nMax )
1712b0a7a3cfSSteve Yin 		{
17135fdc4257SSteve Yin 
17145fdc4257SSteve Yin 
1715b0a7a3cfSSteve Yin 			Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet();
1716b0a7a3cfSSteve Yin 			if(!pRrelationSet.is())
1717b0a7a3cfSSteve Yin 			{
17185fdc4257SSteve Yin 
1719b0a7a3cfSSteve Yin 				return E_FAIL;
1720b0a7a3cfSSteve Yin 			}
17215fdc4257SSteve Yin 
1722b0a7a3cfSSteve Yin 			IAccessibleRelation* pRelation = NULL;
1723b0a7a3cfSSteve Yin 			ActivateActContext();
1724b0a7a3cfSSteve Yin 			HRESULT hr = CoCreateInstance( CLSID_AccRelation, NULL, CLSCTX_SERVER ,
1725b0a7a3cfSSteve Yin 				IID_IAccessibleRelation,
1726b0a7a3cfSSteve Yin 				(void **)&pRelation);
1727b0a7a3cfSSteve Yin 			DeactivateActContext();
1728b0a7a3cfSSteve Yin 			if(SUCCEEDED(hr))
1729b0a7a3cfSSteve Yin 			{
1730b0a7a3cfSSteve Yin 				IUNOXWrapper* wrapper = NULL;
1731b0a7a3cfSSteve Yin 				hr = pRelation->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper);
1732b0a7a3cfSSteve Yin 				if(SUCCEEDED(hr))
1733b0a7a3cfSSteve Yin 				{
1734b0a7a3cfSSteve Yin 					AccessibleRelation accRelation = pRrelationSet->getRelation(relationIndex);
1735b0a7a3cfSSteve Yin 					wrapper->put_XSubInterface((long)&accRelation);
1736b0a7a3cfSSteve Yin 					wrapper->Release();
1737b0a7a3cfSSteve Yin 					*relation = pRelation;
1738b0a7a3cfSSteve Yin 					return S_OK;
1739b0a7a3cfSSteve Yin 				}
17405fdc4257SSteve Yin 
1741b0a7a3cfSSteve Yin 			}
1742b0a7a3cfSSteve Yin 		}
17435fdc4257SSteve Yin 
1744b0a7a3cfSSteve Yin 		return E_FAIL;
17455fdc4257SSteve Yin 
1746b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
17475fdc4257SSteve Yin }
17485fdc4257SSteve Yin 
get_relations(long,IAccessibleRelation __RPC_FAR * __RPC_FAR * relation,long __RPC_FAR * nRelations)17495fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_relations( long, IAccessibleRelation __RPC_FAR *__RPC_FAR *relation, long __RPC_FAR *nRelations)
17505fdc4257SSteve Yin {
1751b0a7a3cfSSteve Yin 
17525fdc4257SSteve Yin 	CHECK_ENABLE_INF
1753b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
1754*5b933a9eSSteve Yin 		ISDESTROY()
1755b0a7a3cfSSteve Yin 
1756b0a7a3cfSSteve Yin 		// #CHECK#
1757b0a7a3cfSSteve Yin 		if(relation == NULL || nRelations == NULL)
1758b0a7a3cfSSteve Yin 		{
1759b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1760b0a7a3cfSSteve Yin 		}
1761b0a7a3cfSSteve Yin 		// #CHECK XInterface#
1762b0a7a3cfSSteve Yin 
1763b0a7a3cfSSteve Yin 		if( !pRContext.is() )
1764b0a7a3cfSSteve Yin 			return E_FAIL;
1765b0a7a3cfSSteve Yin 
1766b0a7a3cfSSteve Yin 		Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet();
1767b0a7a3cfSSteve Yin 		if(!pRrelationSet.is())
1768b0a7a3cfSSteve Yin 		{
1769b0a7a3cfSSteve Yin 			*nRelations = 0;
1770b0a7a3cfSSteve Yin 			return S_OK;
1771b0a7a3cfSSteve Yin 		}
1772b0a7a3cfSSteve Yin 
1773b0a7a3cfSSteve Yin 		long nCount = pRrelationSet->getRelationCount();
1774b0a7a3cfSSteve Yin 
1775b0a7a3cfSSteve Yin 		*relation = (IAccessibleRelation*)::CoTaskMemAlloc(nCount*sizeof(IAccessibleRelation));
1776b0a7a3cfSSteve Yin 
1777b0a7a3cfSSteve Yin 		// #CHECK Memory Allocation#
1778b0a7a3cfSSteve Yin 		if(*relation == NULL)
1779b0a7a3cfSSteve Yin 		{
1780b0a7a3cfSSteve Yin 			return E_FAIL;
1781b0a7a3cfSSteve Yin 		}
1782b0a7a3cfSSteve Yin 
1783b0a7a3cfSSteve Yin 		for(int i=0; i<nCount ; i++)
1784b0a7a3cfSSteve Yin 		{
1785b0a7a3cfSSteve Yin 			IAccessibleRelation* pRelation = NULL;
1786b0a7a3cfSSteve Yin 			ActivateActContext();
1787b0a7a3cfSSteve Yin 			HRESULT hr = CoCreateInstance( CLSID_AccRelation, NULL, CLSCTX_SERVER ,
1788b0a7a3cfSSteve Yin 				IID_IAccessibleRelation,
1789b0a7a3cfSSteve Yin 				(void **)&pRelation);
1790b0a7a3cfSSteve Yin 			DeactivateActContext();
1791b0a7a3cfSSteve Yin 			if(SUCCEEDED(hr))
1792b0a7a3cfSSteve Yin 			{
1793b0a7a3cfSSteve Yin 				IUNOXWrapper* wrapper = NULL;
1794b0a7a3cfSSteve Yin 				hr = pRelation->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper);
1795b0a7a3cfSSteve Yin 				if(SUCCEEDED(hr))
1796b0a7a3cfSSteve Yin 				{
1797b0a7a3cfSSteve Yin 					AccessibleRelation accRelation = pRrelationSet->getRelation(i);
1798b0a7a3cfSSteve Yin 					wrapper->put_XSubInterface((long)&accRelation);
1799b0a7a3cfSSteve Yin 					wrapper->Release();
1800b0a7a3cfSSteve Yin 				}
1801b0a7a3cfSSteve Yin 				(relation)[i] = pRelation;
1802b0a7a3cfSSteve Yin 			}
1803b0a7a3cfSSteve Yin 		}
1804b0a7a3cfSSteve Yin 
1805b0a7a3cfSSteve Yin 		*nRelations = nCount;
1806b0a7a3cfSSteve Yin 		return S_OK;
1807b0a7a3cfSSteve Yin 
1808b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
18095fdc4257SSteve Yin }
18105fdc4257SSteve Yin 
role(long __RPC_FAR * role)18115fdc4257SSteve Yin STDMETHODIMP CMAccessible::role(long __RPC_FAR *role)
18125fdc4257SSteve Yin {
1813b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
18145fdc4257SSteve Yin 
1815b0a7a3cfSSteve Yin 		(*role) = m_iRole;
18165fdc4257SSteve Yin 
1817b0a7a3cfSSteve Yin 	return S_OK;
18185fdc4257SSteve Yin 
1819b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
18205fdc4257SSteve Yin }
18215fdc4257SSteve Yin 
18225fdc4257SSteve Yin 
get_nActions(long __RPC_FAR * nActions)18235fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_nActions(long __RPC_FAR *nActions)
18245fdc4257SSteve Yin {
1825b0a7a3cfSSteve Yin 
1826b0a7a3cfSSteve Yin 	try
1827b0a7a3cfSSteve Yin 	{
1828b0a7a3cfSSteve Yin 		ISDESTROY()
1829b0a7a3cfSSteve Yin 			// #CHECK#
1830b0a7a3cfSSteve Yin 			if(nActions == NULL)
1831b0a7a3cfSSteve Yin 			{
1832b0a7a3cfSSteve Yin 				return E_INVALIDARG;
1833b0a7a3cfSSteve Yin 			}
1834b0a7a3cfSSteve Yin 			*nActions = 0L;
1835b0a7a3cfSSteve Yin 			IAccessibleAction* pAcc = NULL;
1836b0a7a3cfSSteve Yin 			HRESULT hr = QueryInterface(IID_IAccessibleAction, (void**)&pAcc);
1837b0a7a3cfSSteve Yin 			if( hr == S_OK )
1838b0a7a3cfSSteve Yin 			{
1839b0a7a3cfSSteve Yin 				pAcc->nActions(nActions);
1840b0a7a3cfSSteve Yin 				pAcc->Release();
1841b0a7a3cfSSteve Yin 			}
1842b0a7a3cfSSteve Yin 
1843b0a7a3cfSSteve Yin 			return S_OK;
1844b0a7a3cfSSteve Yin 	}
1845b0a7a3cfSSteve Yin 	catch(...)
1846b0a7a3cfSSteve Yin 	{
1847b0a7a3cfSSteve Yin 		*nActions = 0L;
1848b0a7a3cfSSteve Yin 		return S_OK;
1849b0a7a3cfSSteve Yin 	}
18505fdc4257SSteve Yin }
18515fdc4257SSteve Yin 
18525fdc4257SSteve Yin 
scrollToPoint(enum IA2CoordinateType,long,long)18535fdc4257SSteve Yin STDMETHODIMP CMAccessible:: scrollToPoint(enum IA2CoordinateType, long, long)
18545fdc4257SSteve Yin {
1855b0a7a3cfSSteve Yin 
1856b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1857b0a7a3cfSSteve Yin 	ISDESTROY()
1858b0a7a3cfSSteve Yin 	return E_NOTIMPL;
1859b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
18605fdc4257SSteve Yin 
18615fdc4257SSteve Yin }
scrollTo(enum IA2ScrollType)18625fdc4257SSteve Yin STDMETHODIMP CMAccessible:: scrollTo(enum IA2ScrollType)
18635fdc4257SSteve Yin {
18645fdc4257SSteve Yin 
1865b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1866b0a7a3cfSSteve Yin 	ISDESTROY()
1867b0a7a3cfSSteve Yin 
1868b0a7a3cfSSteve Yin 	return E_NOTIMPL;
18695fdc4257SSteve Yin 
1870b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
18715fdc4257SSteve Yin }
18725fdc4257SSteve Yin 
getTheParentOfMember(XAccessible * pXAcc)18735fdc4257SSteve Yin static XAccessible* getTheParentOfMember(XAccessible* pXAcc)
18745fdc4257SSteve Yin {
1875b0a7a3cfSSteve Yin 	// #CHECK#
1876b0a7a3cfSSteve Yin 	if(pXAcc == NULL)
1877b0a7a3cfSSteve Yin 	{
1878b0a7a3cfSSteve Yin 		return NULL;
1879b0a7a3cfSSteve Yin 	}
1880b0a7a3cfSSteve Yin 	Reference<XAccessibleContext> pRContext = pXAcc->getAccessibleContext();
1881b0a7a3cfSSteve Yin 	Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet();
1882b0a7a3cfSSteve Yin 	long nRelations = pRrelationSet->getRelationCount();
1883b0a7a3cfSSteve Yin 	for(int i=0 ; i<nRelations ; i++)
1884b0a7a3cfSSteve Yin 	{
1885b0a7a3cfSSteve Yin 		AccessibleRelation accRelation = pRrelationSet->getRelation(i);
1886b0a7a3cfSSteve Yin 		if(accRelation.RelationType == 7)
1887b0a7a3cfSSteve Yin 		{
1888b0a7a3cfSSteve Yin 			Sequence< Reference< XInterface > > xTargets = accRelation.TargetSet;
1889b0a7a3cfSSteve Yin 			return (XAccessible*)xTargets[0].get();
1890b0a7a3cfSSteve Yin 		}
1891b0a7a3cfSSteve Yin 	}
1892b0a7a3cfSSteve Yin 	return NULL;
18935fdc4257SSteve Yin }
18945fdc4257SSteve Yin 
get_groupPosition(long __RPC_FAR * groupLevel,long __RPC_FAR * similarItemsInGroup,long __RPC_FAR * positionInGroup)18955fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_groupPosition(long __RPC_FAR *groupLevel,long __RPC_FAR *similarItemsInGroup,long __RPC_FAR *positionInGroup)
18965fdc4257SSteve Yin {
1897b0a7a3cfSSteve Yin 
18985fdc4257SSteve Yin 	CHECK_ENABLE_INF
1899b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
1900b0a7a3cfSSteve Yin 		ISDESTROY()
1901b0a7a3cfSSteve Yin 		// #CHECK#
1902b0a7a3cfSSteve Yin 		if(groupLevel == NULL || similarItemsInGroup == NULL || positionInGroup == NULL)
1903b0a7a3cfSSteve Yin 		{
1904b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1905b0a7a3cfSSteve Yin 		}
1906b0a7a3cfSSteve Yin 
1907b0a7a3cfSSteve Yin 		Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
1908b0a7a3cfSSteve Yin 		if(!pRContext.is())
1909b0a7a3cfSSteve Yin 			return E_FAIL;
1910b0a7a3cfSSteve Yin 		long Role = pRContext->getAccessibleRole();
1911b0a7a3cfSSteve Yin 
1912b0a7a3cfSSteve Yin 		*groupLevel = 0;
1913b0a7a3cfSSteve Yin 		*similarItemsInGroup = 0;
1914b0a7a3cfSSteve Yin 		*positionInGroup = 0;
1915b0a7a3cfSSteve Yin 
1916b0a7a3cfSSteve Yin 		if (Role != AccessibleRole::DOCUMENT)
1917b0a7a3cfSSteve Yin 		{
1918b0a7a3cfSSteve Yin 			Reference< XAccessibleGroupPosition > xGroupPosition( pRContext, UNO_QUERY );
1919b0a7a3cfSSteve Yin 			if ( xGroupPosition.is() )
1920b0a7a3cfSSteve Yin 			{
1921b0a7a3cfSSteve Yin 				Sequence< sal_Int32 > rSeq = xGroupPosition->getGroupPosition( makeAny( pRContext ) );
1922b0a7a3cfSSteve Yin 				sal_Int32* pSeq = rSeq.getArray();
1923b0a7a3cfSSteve Yin 				if ( pSeq )
1924b0a7a3cfSSteve Yin 				{
1925b0a7a3cfSSteve Yin 					*groupLevel = pSeq[0];
1926b0a7a3cfSSteve Yin 					*similarItemsInGroup = pSeq[1];
1927b0a7a3cfSSteve Yin 					*positionInGroup = pSeq[2];
1928b0a7a3cfSSteve Yin 					return S_OK;
1929b0a7a3cfSSteve Yin 				}
1930b0a7a3cfSSteve Yin 				return S_OK;
1931b0a7a3cfSSteve Yin 			}
1932b0a7a3cfSSteve Yin 		}
1933b0a7a3cfSSteve Yin 
1934b0a7a3cfSSteve Yin 		Reference< XAccessible> pParentAcc = pRContext->getAccessibleParent();
1935b0a7a3cfSSteve Yin 		if( !pParentAcc.is() )
1936b0a7a3cfSSteve Yin 		{
1937b0a7a3cfSSteve Yin 			return S_OK;
1938b0a7a3cfSSteve Yin 		}
1939b0a7a3cfSSteve Yin 
1940b0a7a3cfSSteve Yin 		Reference<XAccessibleContext> pRParentContext = pParentAcc->getAccessibleContext();
1941b0a7a3cfSSteve Yin 
1942b0a7a3cfSSteve Yin 		int level = 0;
1943b0a7a3cfSSteve Yin 		int index = 0;
1944b0a7a3cfSSteve Yin 		int number = 0;
1945b0a7a3cfSSteve Yin 
1946b0a7a3cfSSteve Yin 		if( Role ==  RADIO_BUTTON )
1947b0a7a3cfSSteve Yin 		{
1948b0a7a3cfSSteve Yin 			Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet();
1949b0a7a3cfSSteve Yin 			long nRel = pRrelationSet->getRelationCount();
1950b0a7a3cfSSteve Yin 			for(int i=0 ; i<nRel ; i++)
1951b0a7a3cfSSteve Yin 			{
1952b0a7a3cfSSteve Yin 				AccessibleRelation accRelation = pRrelationSet->getRelation(i);
1953b0a7a3cfSSteve Yin 				if(accRelation.RelationType == 7)
1954b0a7a3cfSSteve Yin 				{
1955b0a7a3cfSSteve Yin 					Sequence< Reference< XInterface > > xTargets = accRelation.TargetSet;
1956b0a7a3cfSSteve Yin 					int nCount = xTargets.getLength();
1957b0a7a3cfSSteve Yin 
1958b0a7a3cfSSteve Yin 					Reference<XInterface> pRAcc = xTargets[0];
1959b0a7a3cfSSteve Yin 					for(int j=0; j<pRParentContext->getAccessibleChildCount(); j++)
1960b0a7a3cfSSteve Yin 					{
1961b0a7a3cfSSteve Yin 						if( getTheParentOfMember(pRParentContext->getAccessibleChild(j).get())
1962b0a7a3cfSSteve Yin 							== (XAccessible*)pRAcc.get() &&
1963b0a7a3cfSSteve Yin 							pRParentContext->getAccessibleChild(j)->getAccessibleContext()->getAccessibleRole() == RADIO_BUTTON)
1964b0a7a3cfSSteve Yin 							number++;
1965b0a7a3cfSSteve Yin 						if(pRParentContext->getAccessibleChild(j).get() == pUNOInterface)
1966b0a7a3cfSSteve Yin 							index = number;
1967b0a7a3cfSSteve Yin 					}
1968b0a7a3cfSSteve Yin 				}
1969b0a7a3cfSSteve Yin 			}
1970b0a7a3cfSSteve Yin 			*groupLevel = 1;
1971b0a7a3cfSSteve Yin 			*similarItemsInGroup = number;
1972b0a7a3cfSSteve Yin 			*positionInGroup = index;
1973b0a7a3cfSSteve Yin 			return S_OK;
1974b0a7a3cfSSteve Yin 		}
1975b0a7a3cfSSteve Yin 
1976b0a7a3cfSSteve Yin 		else if ( COMBO_BOX == Role )
1977b0a7a3cfSSteve Yin 		{
1978b0a7a3cfSSteve Yin 			*groupLevel = 1;
1979b0a7a3cfSSteve Yin 			*similarItemsInGroup = 0;
1980b0a7a3cfSSteve Yin 			*positionInGroup = -1;
1981b0a7a3cfSSteve Yin 
1982b0a7a3cfSSteve Yin 			long nCount = pRContext->getAccessibleChildCount();
1983b0a7a3cfSSteve Yin 			if( 2 != nCount)
1984b0a7a3cfSSteve Yin 			{
1985b0a7a3cfSSteve Yin 				return S_OK;
1986b0a7a3cfSSteve Yin 			}
1987b0a7a3cfSSteve Yin 			Reference<XAccessible> xList=pRContext->getAccessibleChild(1);
1988b0a7a3cfSSteve Yin 			if (!xList.is())
1989b0a7a3cfSSteve Yin 			{
1990b0a7a3cfSSteve Yin 				return S_OK;
1991b0a7a3cfSSteve Yin 			}
1992b0a7a3cfSSteve Yin 			Reference<XAccessibleContext> xListContext(xList,UNO_QUERY);
1993b0a7a3cfSSteve Yin 			if (!xListContext.is())
1994b0a7a3cfSSteve Yin 			{
1995b0a7a3cfSSteve Yin 				return S_OK;
1996b0a7a3cfSSteve Yin 			}
1997b0a7a3cfSSteve Yin 			Reference<XAccessibleSelection> xListSel(xList,UNO_QUERY);
1998b0a7a3cfSSteve Yin 			if (!xListSel.is())
1999b0a7a3cfSSteve Yin 			{
2000b0a7a3cfSSteve Yin 				return S_OK;
2001b0a7a3cfSSteve Yin 			}
2002b0a7a3cfSSteve Yin 			*similarItemsInGroup = xListContext->getAccessibleChildCount();
2003b0a7a3cfSSteve Yin 			if (*similarItemsInGroup > 0 )
2004b0a7a3cfSSteve Yin 			{
2005b0a7a3cfSSteve Yin 				try
2006b0a7a3cfSSteve Yin 				{
2007b0a7a3cfSSteve Yin 					Reference<XAccessible> xChild = xListSel->getSelectedAccessibleChild(0);
2008b0a7a3cfSSteve Yin 					if (xChild.is())
2009b0a7a3cfSSteve Yin 					{
2010b0a7a3cfSSteve Yin 						Reference<XAccessibleContext> xChildContext(xChild,UNO_QUERY);
2011b0a7a3cfSSteve Yin 						if (xChildContext.is())
2012b0a7a3cfSSteve Yin 						{
2013b0a7a3cfSSteve Yin 							*positionInGroup=xChildContext->getAccessibleIndexInParent() + 1 ;
2014b0a7a3cfSSteve Yin 							return S_OK;
2015b0a7a3cfSSteve Yin 						}
2016b0a7a3cfSSteve Yin 					}
2017b0a7a3cfSSteve Yin 				}
2018b0a7a3cfSSteve Yin 				catch(...)
2019b0a7a3cfSSteve Yin 				{}
2020b0a7a3cfSSteve Yin 			}
2021b0a7a3cfSSteve Yin 			return S_OK;
2022b0a7a3cfSSteve Yin 		}
2023b0a7a3cfSSteve Yin 		else if ( PAGE_TAB == Role )
2024b0a7a3cfSSteve Yin 		{
2025b0a7a3cfSSteve Yin 			*groupLevel = 1;
2026b0a7a3cfSSteve Yin 			*similarItemsInGroup = pRParentContext->getAccessibleChildCount();
2027b0a7a3cfSSteve Yin 
2028b0a7a3cfSSteve Yin 			if (*similarItemsInGroup > 0 )
2029b0a7a3cfSSteve Yin 			{
2030b0a7a3cfSSteve Yin 				*positionInGroup=pRContext->getAccessibleIndexInParent() + 1 ;
2031b0a7a3cfSSteve Yin 			}
2032b0a7a3cfSSteve Yin 			else
2033b0a7a3cfSSteve Yin 			{
2034b0a7a3cfSSteve Yin 				*positionInGroup = -1;
2035b0a7a3cfSSteve Yin 			}
2036b0a7a3cfSSteve Yin 			return S_OK;
2037b0a7a3cfSSteve Yin 		}
2038b0a7a3cfSSteve Yin 
2039b0a7a3cfSSteve Yin 
2040b0a7a3cfSSteve Yin 		BOOL isFound = FALSE;
2041b0a7a3cfSSteve Yin 		while( pParentAcc.is() && !isFound)
2042b0a7a3cfSSteve Yin 		{
2043b0a7a3cfSSteve Yin 			level++;
2044b0a7a3cfSSteve Yin 			pRParentContext = pParentAcc->getAccessibleContext();
2045b0a7a3cfSSteve Yin 			Role = pRParentContext->getAccessibleRole();
2046b0a7a3cfSSteve Yin 			if( (Role == TREE) || (Role == LIST) )
2047b0a7a3cfSSteve Yin 				isFound = TRUE;
2048b0a7a3cfSSteve Yin 			pParentAcc = pRParentContext->getAccessibleParent();
2049b0a7a3cfSSteve Yin 		}
2050b0a7a3cfSSteve Yin 
2051b0a7a3cfSSteve Yin 		if( isFound )
2052b0a7a3cfSSteve Yin 		{
2053b0a7a3cfSSteve Yin 			Reference< XAccessible> pTempAcc = pRContext->getAccessibleParent();
2054b0a7a3cfSSteve Yin 			pRParentContext = pTempAcc->getAccessibleContext();
2055b0a7a3cfSSteve Yin 			*groupLevel = level;
2056b0a7a3cfSSteve Yin 			*similarItemsInGroup = pRParentContext->getAccessibleChildCount();
2057b0a7a3cfSSteve Yin 			*positionInGroup = pRContext->getAccessibleIndexInParent() + 1;
2058b0a7a3cfSSteve Yin 		}
2059b0a7a3cfSSteve Yin 		else
2060b0a7a3cfSSteve Yin 		{
2061b0a7a3cfSSteve Yin 			*groupLevel = 0;
2062b0a7a3cfSSteve Yin 			*similarItemsInGroup = 0;
2063b0a7a3cfSSteve Yin 			*positionInGroup = 0;
2064b0a7a3cfSSteve Yin 		}
2065b0a7a3cfSSteve Yin 		return S_OK;
2066b0a7a3cfSSteve Yin 
2067b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
20685fdc4257SSteve Yin }
20695fdc4257SSteve Yin 
get_extendedStates(long,BSTR __RPC_FAR * __RPC_FAR *,long __RPC_FAR *)20705fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_extendedStates( long, BSTR __RPC_FAR *__RPC_FAR *, long __RPC_FAR *)
20715fdc4257SSteve Yin {
2072b0a7a3cfSSteve Yin 
20735fdc4257SSteve Yin 	CHECK_ENABLE_INF
2074b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
2075b0a7a3cfSSteve Yin 		ISDESTROY()
20765fdc4257SSteve Yin 
2077b0a7a3cfSSteve Yin 		return E_NOTIMPL;
20785fdc4257SSteve Yin 
2079b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
20805fdc4257SSteve Yin }
20815fdc4257SSteve Yin 
20825fdc4257SSteve Yin 
get_uniqueID(long __RPC_FAR * uniqueID)20835fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_uniqueID(long __RPC_FAR *uniqueID)
20845fdc4257SSteve Yin {
20855fdc4257SSteve Yin 
2086b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2087b0a7a3cfSSteve Yin 		ISDESTROY()
2088b0a7a3cfSSteve Yin 		// #CHECK#
2089b0a7a3cfSSteve Yin 		if(uniqueID == NULL)
2090b0a7a3cfSSteve Yin 		{
2091b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2092b0a7a3cfSSteve Yin 		}
2093b0a7a3cfSSteve Yin 		*uniqueID = m_dChildID;
2094b0a7a3cfSSteve Yin 		return S_OK;
2095b0a7a3cfSSteve Yin 
2096b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
20975fdc4257SSteve Yin }
20985fdc4257SSteve Yin 
get_windowHandle(HWND __RPC_FAR * windowHandle)20995fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_windowHandle(HWND __RPC_FAR *windowHandle)
21005fdc4257SSteve Yin {
2101b0a7a3cfSSteve Yin 
2102b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2103b0a7a3cfSSteve Yin 		ISDESTROY()
2104b0a7a3cfSSteve Yin 		// #CHECK#
2105b0a7a3cfSSteve Yin 		if(windowHandle == NULL)
2106b0a7a3cfSSteve Yin 		{
2107b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2108b0a7a3cfSSteve Yin 		}
2109b0a7a3cfSSteve Yin 
2110b0a7a3cfSSteve Yin 		HWND nHwnd = m_hwnd;
2111b0a7a3cfSSteve Yin 		IAccessible* pParent = m_pIParent;
2112b0a7a3cfSSteve Yin 		CMAccessible* pChild = this;
2113b0a7a3cfSSteve Yin 		while((nHwnd==0) && pParent)
2114b0a7a3cfSSteve Yin 		{
2115b0a7a3cfSSteve Yin 			pChild = (CMAccessible*)pParent;
2116b0a7a3cfSSteve Yin 			if(pChild)
2117b0a7a3cfSSteve Yin 			{
2118b0a7a3cfSSteve Yin 				pParent = (IAccessible*)pChild->m_pIParent;
2119b0a7a3cfSSteve Yin 				nHwnd = (HWND)pChild->m_hwnd;
2120b0a7a3cfSSteve Yin 			}
2121b0a7a3cfSSteve Yin 			else
2122b0a7a3cfSSteve Yin 				pParent = NULL;
2123b0a7a3cfSSteve Yin 		}
2124b0a7a3cfSSteve Yin 
2125b0a7a3cfSSteve Yin 		*windowHandle = nHwnd;
2126b0a7a3cfSSteve Yin 		return S_OK;
2127b0a7a3cfSSteve Yin 
2128b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
21295fdc4257SSteve Yin }
21305fdc4257SSteve Yin 
21315fdc4257SSteve Yin /**
2132b0a7a3cfSSteve Yin * Get XAccessibleContext directly from UNO by the stored XAccessible pointer
2133b0a7a3cfSSteve Yin * @param	pXAcc, UNO XAccessible object point.
2134b0a7a3cfSSteve Yin * @return   XAccessibleContext*, the context of the pXAcc.
2135b0a7a3cfSSteve Yin */
GetContextByXAcc(XAccessible * pXAcc)21365fdc4257SSteve Yin XAccessibleContext* CMAccessible::GetContextByXAcc( XAccessible* pXAcc )
21375fdc4257SSteve Yin {
2138b0a7a3cfSSteve Yin 	Reference< XAccessibleContext > pRContext;
2139b0a7a3cfSSteve Yin 	if( pXAcc == NULL)
2140b0a7a3cfSSteve Yin 		return NULL;
21415fdc4257SSteve Yin 
2142b0a7a3cfSSteve Yin 	pRContext = pXAcc->getAccessibleContext();
2143b0a7a3cfSSteve Yin 	if( !pRContext.is() )
2144b0a7a3cfSSteve Yin 		return NULL;
2145b0a7a3cfSSteve Yin 	return pRContext.get();
21465fdc4257SSteve Yin }
21475fdc4257SSteve Yin 
21485fdc4257SSteve Yin /**
2149b0a7a3cfSSteve Yin * Return the member variable m_pXAccessibleSelection, instead of
2150b0a7a3cfSSteve Yin * get XAccessibleSelection according to XAccessibleContext because if so,it will
2151b0a7a3cfSSteve Yin * depend on the UNO implementation code,so when COM is created, put XAccessibleSelection
2152b0a7a3cfSSteve Yin * by bridge management system
2153b0a7a3cfSSteve Yin * @return   XAccessibleSelection*, the selection of the current object.
2154b0a7a3cfSSteve Yin */
GetSelection()21555fdc4257SSteve Yin Reference< XAccessibleSelection > CMAccessible::GetSelection()
21565fdc4257SSteve Yin {
2157b0a7a3cfSSteve Yin 	if( pUNOInterface == NULL )
2158b0a7a3cfSSteve Yin 		return NULL;
2159b0a7a3cfSSteve Yin 	Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext();
2160b0a7a3cfSSteve Yin 	if(pRContext.is())
2161b0a7a3cfSSteve Yin 	{
2162b0a7a3cfSSteve Yin 		Reference< XAccessibleSelection > pRSelection(pRContext,UNO_QUERY);
2163b0a7a3cfSSteve Yin 		return pRSelection;
2164b0a7a3cfSSteve Yin 	}
2165b0a7a3cfSSteve Yin 	return NULL;
21665fdc4257SSteve Yin }
21675fdc4257SSteve Yin 
21685fdc4257SSteve Yin /**
2169b0a7a3cfSSteve Yin * Select one XAccessible item, for accSelect implementation
2170b0a7a3cfSSteve Yin * @param	pItem, the item should be selected.
2171b0a7a3cfSSteve Yin * @return  S_OK if successful.
2172b0a7a3cfSSteve Yin */
SelectChild(XAccessible * pItem)21735fdc4257SSteve Yin HRESULT CMAccessible::SelectChild(XAccessible* pItem)
21745fdc4257SSteve Yin {
21755fdc4257SSteve Yin 
2176b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2177b0a7a3cfSSteve Yin 		ISDESTROY()
2178b0a7a3cfSSteve Yin 		XAccessibleContext* pParentContext = GetContextByXAcc( pUNOInterface );
2179b0a7a3cfSSteve Yin 	XAccessibleContext* pContext = GetContextByXAcc( pItem );
2180b0a7a3cfSSteve Yin 	if( pParentContext == NULL || pContext == NULL )
2181b0a7a3cfSSteve Yin 		return E_FAIL;
2182b0a7a3cfSSteve Yin 
2183b0a7a3cfSSteve Yin 	Reference< XAccessibleSelection > pRSelection = GetSelection();
2184b0a7a3cfSSteve Yin 	if( !pRSelection.is() )
2185b0a7a3cfSSteve Yin 		return E_FAIL;
2186b0a7a3cfSSteve Yin 	long Index = pContext->getAccessibleIndexInParent();
2187b0a7a3cfSSteve Yin 	pRSelection->selectAccessibleChild( Index );
2188b0a7a3cfSSteve Yin 	return S_OK;
21895fdc4257SSteve Yin 
2190b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
21915fdc4257SSteve Yin }
21925fdc4257SSteve Yin 
21935fdc4257SSteve Yin /**
2194b0a7a3cfSSteve Yin * Deselect one XAccessible item, for accSelect implimentation
2195b0a7a3cfSSteve Yin * @param	pItem, the item should be deselected.
2196b0a7a3cfSSteve Yin * @return  S_OK if successful.
2197b0a7a3cfSSteve Yin */
DeSelectChild(XAccessible * pItem)21985fdc4257SSteve Yin HRESULT CMAccessible::DeSelectChild(XAccessible* pItem)
21995fdc4257SSteve Yin {
22005fdc4257SSteve Yin 
2201b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2202b0a7a3cfSSteve Yin 		ISDESTROY()
2203b0a7a3cfSSteve Yin 		XAccessibleContext* pParentContext = GetContextByXAcc( pUNOInterface );
2204b0a7a3cfSSteve Yin 	;
2205b0a7a3cfSSteve Yin 	XAccessibleContext* pContext = GetContextByXAcc( pItem );
2206b0a7a3cfSSteve Yin 	if( pParentContext == NULL || pContext == NULL )
2207b0a7a3cfSSteve Yin 		return E_INVALIDARG;
2208b0a7a3cfSSteve Yin 
2209b0a7a3cfSSteve Yin 	Reference< XAccessibleSelection > pRSelection = GetSelection();
2210b0a7a3cfSSteve Yin 	if( !pRSelection.is() )
2211b0a7a3cfSSteve Yin 		return E_FAIL;
2212b0a7a3cfSSteve Yin 	long Index = pContext->getAccessibleIndexInParent();
2213b0a7a3cfSSteve Yin 	pRSelection->deselectAccessibleChild( Index );
22145fdc4257SSteve Yin 
2215b0a7a3cfSSteve Yin 	return S_OK;
22165fdc4257SSteve Yin 
2217b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
22185fdc4257SSteve Yin }
22195fdc4257SSteve Yin 
22205fdc4257SSteve Yin /**
2221b0a7a3cfSSteve Yin * Select multiple XAccessible items,for implementation of accSelect
2222b0a7a3cfSSteve Yin * @param	pItem, the items should be selected.
2223b0a7a3cfSSteve Yin * @param	size, the size of the items.
2224b0a7a3cfSSteve Yin * @return  S_OK if successful.
2225b0a7a3cfSSteve Yin */
SelectMutipleChidren(XAccessible ** pItem,int size)22265fdc4257SSteve Yin HRESULT	CMAccessible::SelectMutipleChidren( XAccessible** pItem,int size )
22275fdc4257SSteve Yin {
22285fdc4257SSteve Yin 
2229b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2230b0a7a3cfSSteve Yin 		ISDESTROY()
2231b0a7a3cfSSteve Yin 		// #CHECK#
2232b0a7a3cfSSteve Yin 		if(pItem == NULL)
2233b0a7a3cfSSteve Yin 		{
2234b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2235b0a7a3cfSSteve Yin 		}
2236b0a7a3cfSSteve Yin 		for(int index = 0;index < size;index++)
2237b0a7a3cfSSteve Yin 		{
2238b0a7a3cfSSteve Yin 			SelectChild( pItem[index] );
2239b0a7a3cfSSteve Yin 		}
2240b0a7a3cfSSteve Yin 		return S_OK;
2241b0a7a3cfSSteve Yin 
2242b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
22435fdc4257SSteve Yin }
22445fdc4257SSteve Yin 
22455fdc4257SSteve Yin /**
2246b0a7a3cfSSteve Yin * Deselect multiple XAccessible items,for implementation of accSelect
2247b0a7a3cfSSteve Yin * @param	pItem, the items should be selected.
2248b0a7a3cfSSteve Yin * @param	size, the size of the items.
2249b0a7a3cfSSteve Yin * @return  S_OK if successful.
2250b0a7a3cfSSteve Yin */
DeSelectMutipleChildren(XAccessible ** pItem,int size)22515fdc4257SSteve Yin HRESULT CMAccessible::DeSelectMutipleChildren( XAccessible** pItem,int size )
22525fdc4257SSteve Yin {
22535fdc4257SSteve Yin 
2254b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2255b0a7a3cfSSteve Yin 		ISDESTROY()
2256b0a7a3cfSSteve Yin 		// #CHECK#
2257b0a7a3cfSSteve Yin 		if(pItem == NULL)
2258b0a7a3cfSSteve Yin 		{
2259b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2260b0a7a3cfSSteve Yin 		}
2261b0a7a3cfSSteve Yin 		for(int index = 0;index < size;index++)
2262b0a7a3cfSSteve Yin 		{
2263b0a7a3cfSSteve Yin 			DeSelectChild( pItem[index] );
2264b0a7a3cfSSteve Yin 		}
2265b0a7a3cfSSteve Yin 		return S_OK;
2266b0a7a3cfSSteve Yin 
2267b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
22685fdc4257SSteve Yin }
22695fdc4257SSteve Yin 
22705fdc4257SSteve Yin /**
2271b0a7a3cfSSteve Yin * When COM is created, UNO set XAccessible pointer to it
2272b0a7a3cfSSteve Yin * in order to COM can operate UNO information
2273b0a7a3cfSSteve Yin * @param	pXAcc, the XAccessible object of current object.
2274b0a7a3cfSSteve Yin * @return  S_OK if successful.
2275b0a7a3cfSSteve Yin */
SetXAccessible(long pXAcc)22765fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetXAccessible(long pXAcc)
22775fdc4257SSteve Yin {
2278b0a7a3cfSSteve Yin 	pUNOInterface = (XAccessible*)pXAcc;
2279b0a7a3cfSSteve Yin 	pRef = pUNOInterface;
2280b0a7a3cfSSteve Yin 	m_pEnumVar->PutSelection(/*XAccessibleSelection*/(long)pUNOInterface);
22815fdc4257SSteve Yin 
2282b0a7a3cfSSteve Yin 	pRContext = pUNOInterface->getAccessibleContext();
2283b0a7a3cfSSteve Yin 	pRContextInterface = (XAccessibleContext*)pRContext.is();
22845fdc4257SSteve Yin 
2285b0a7a3cfSSteve Yin 	return S_OK;
22865fdc4257SSteve Yin }
22875fdc4257SSteve Yin 
22885fdc4257SSteve Yin /**
2289b0a7a3cfSSteve Yin * accSelect method has many optional flags, needs to process comprehensively
2290b0a7a3cfSSteve Yin * Mozilla and Microsoft do not implement SELFLAG_EXTENDSELECTION flag.
2291b0a7a3cfSSteve Yin * The implementation of this flag is a little trouble-shooting,so we also
2292b0a7a3cfSSteve Yin * do not implement it now
2293b0a7a3cfSSteve Yin * @param	flagsSelect, the selection flag of the select action.
2294b0a7a3cfSSteve Yin * @param	varChild, the child object pointer of current action.
2295b0a7a3cfSSteve Yin * @return  S_OK if successful.
2296b0a7a3cfSSteve Yin */
accSelect(long flagsSelect,VARIANT varChild)22975fdc4257SSteve Yin STDMETHODIMP CMAccessible::accSelect(long flagsSelect, VARIANT varChild)
22985fdc4257SSteve Yin {
2299b0a7a3cfSSteve Yin 
23005fdc4257SSteve Yin 	CHECK_ENABLE_INF
2301b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
2302b0a7a3cfSSteve Yin 		ISDESTROY()
2303b0a7a3cfSSteve Yin 		if( (flagsSelect&SELFLAG_ADDSELECTION) &&
2304b0a7a3cfSSteve Yin 			(SELFLAG_REMOVESELECTION&flagsSelect) )
2305b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2306b0a7a3cfSSteve Yin 
2307b0a7a3cfSSteve Yin 	if ( (flagsSelect&SELFLAG_TAKESELECTION) &&
2308b0a7a3cfSSteve Yin 		(
2309b0a7a3cfSSteve Yin 		(flagsSelect&SELFLAG_ADDSELECTION) ||
2310b0a7a3cfSSteve Yin 		(flagsSelect&SELFLAG_REMOVESELECTION) ||
2311b0a7a3cfSSteve Yin 		(flagsSelect&SELFLAG_EXTENDSELECTION )
2312b0a7a3cfSSteve Yin 		)
2313b0a7a3cfSSteve Yin 		)
2314b0a7a3cfSSteve Yin 		return E_INVALIDARG;
2315b0a7a3cfSSteve Yin 
2316b0a7a3cfSSteve Yin 	if ( varChild.vt !=	VT_I4 )
2317b0a7a3cfSSteve Yin 		return E_INVALIDARG;
2318b0a7a3cfSSteve Yin 
2319b0a7a3cfSSteve Yin 	IMAccessible* pSelectAcc;
2320b0a7a3cfSSteve Yin 	if( varChild.lVal == CHILDID_SELF )
2321b0a7a3cfSSteve Yin 	{
2322b0a7a3cfSSteve Yin 		pSelectAcc = this;
2323b0a7a3cfSSteve Yin 		pSelectAcc->AddRef();
2324b0a7a3cfSSteve Yin 	}
2325b0a7a3cfSSteve Yin 	else
2326b0a7a3cfSSteve Yin 	{
2327b0a7a3cfSSteve Yin 		pSelectAcc = GetChildInterface(varChild.lVal);
2328b0a7a3cfSSteve Yin 	}
2329b0a7a3cfSSteve Yin 
2330b0a7a3cfSSteve Yin 	if( pSelectAcc == NULL )
2331b0a7a3cfSSteve Yin 		return E_INVALIDARG;
2332b0a7a3cfSSteve Yin 
2333b0a7a3cfSSteve Yin 	if( flagsSelect&SELFLAG_TAKEFOCUS )
2334b0a7a3cfSSteve Yin 	{
2335b0a7a3cfSSteve Yin 		long pTempUNO = 0;
2336b0a7a3cfSSteve Yin 		pSelectAcc->GetUNOInterface( &pTempUNO);
2337b0a7a3cfSSteve Yin 
2338b0a7a3cfSSteve Yin 		if( pTempUNO == NULL )
2339b0a7a3cfSSteve Yin 			return NULL;
2340b0a7a3cfSSteve Yin 
2341b0a7a3cfSSteve Yin 		Reference< XAccessibleContext > pRContext = ( (XAccessible*)pTempUNO)->getAccessibleContext();
2342b0a7a3cfSSteve Yin 		Reference< XAccessibleComponent > pRComponent(pRContext,UNO_QUERY);
2343b0a7a3cfSSteve Yin 		Reference< XAccessible > pRParentXAcc = pRContext->getAccessibleParent();
2344b0a7a3cfSSteve Yin 		Reference< XAccessibleContext > pRParentContext = pRParentXAcc->getAccessibleContext();
2345b0a7a3cfSSteve Yin 		Reference< XAccessibleComponent > pRParentComponent(pRParentContext,UNO_QUERY);
2346b0a7a3cfSSteve Yin 		Reference< XAccessibleSelection > pRParentSelection(pRParentContext,UNO_QUERY);
2347b0a7a3cfSSteve Yin 
2348b0a7a3cfSSteve Yin 
2349b0a7a3cfSSteve Yin 		pRComponent->grabFocus();
2350b0a7a3cfSSteve Yin 
2351b0a7a3cfSSteve Yin 		if( flagsSelect & SELFLAG_TAKESELECTION )
2352b0a7a3cfSSteve Yin 		{
2353b0a7a3cfSSteve Yin 			pRParentSelection->clearAccessibleSelection();
2354b0a7a3cfSSteve Yin 			pRParentSelection->selectAccessibleChild( pRContext->getAccessibleIndexInParent() );
2355b0a7a3cfSSteve Yin 		}
2356b0a7a3cfSSteve Yin 
2357b0a7a3cfSSteve Yin 		if( flagsSelect & SELFLAG_ADDSELECTION  )
2358b0a7a3cfSSteve Yin 		{
2359b0a7a3cfSSteve Yin 			pRParentSelection->selectAccessibleChild( pRContext->getAccessibleIndexInParent() );
2360b0a7a3cfSSteve Yin 		}
2361b0a7a3cfSSteve Yin 
2362b0a7a3cfSSteve Yin 		if( flagsSelect & SELFLAG_REMOVESELECTION )
2363b0a7a3cfSSteve Yin 		{
2364b0a7a3cfSSteve Yin 			pRParentSelection->deselectAccessibleChild( pRContext->getAccessibleIndexInParent() );
2365b0a7a3cfSSteve Yin 		}
2366b0a7a3cfSSteve Yin 
2367b0a7a3cfSSteve Yin 		if( flagsSelect & SELFLAG_EXTENDSELECTION  )
2368b0a7a3cfSSteve Yin 		{
2369b0a7a3cfSSteve Yin 			long indexInParrent = pRContext->getAccessibleIndexInParent();
2370b0a7a3cfSSteve Yin 
2371b0a7a3cfSSteve Yin 			if( pRParentSelection->isAccessibleChildSelected( indexInParrent + 1 ) ||
2372b0a7a3cfSSteve Yin 				pRParentSelection->isAccessibleChildSelected( indexInParrent - 1 ) )
2373b0a7a3cfSSteve Yin 			{
2374b0a7a3cfSSteve Yin 				pRParentSelection->selectAccessibleChild( indexInParrent );
2375b0a7a3cfSSteve Yin 			}
2376b0a7a3cfSSteve Yin 		}
2377b0a7a3cfSSteve Yin 
2378b0a7a3cfSSteve Yin 	}
2379b0a7a3cfSSteve Yin 
2380b0a7a3cfSSteve Yin 	pSelectAcc->Release();
2381b0a7a3cfSSteve Yin 	return S_OK;
2382b0a7a3cfSSteve Yin 
2383b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
23845fdc4257SSteve Yin }
23855fdc4257SSteve Yin 
23865fdc4257SSteve Yin /**
2387b0a7a3cfSSteve Yin * Return XAccessible interface pointer when needed
2388b0a7a3cfSSteve Yin * @param pXAcc, [in, out] the Uno interface of the current object.
2389b0a7a3cfSSteve Yin * @return S_OK if successful.
2390b0a7a3cfSSteve Yin */
GetUNOInterface(long * pXAcc)23915fdc4257SSteve Yin STDMETHODIMP CMAccessible::GetUNOInterface(long* pXAcc)
23925fdc4257SSteve Yin {
2393b0a7a3cfSSteve Yin 	// #CHECK#
2394b0a7a3cfSSteve Yin 	if(pXAcc == NULL)
2395b0a7a3cfSSteve Yin 		return E_INVALIDARG;
23965fdc4257SSteve Yin 
2397b0a7a3cfSSteve Yin 	*pXAcc = (long)pUNOInterface;
2398b0a7a3cfSSteve Yin 	return S_OK;
23995fdc4257SSteve Yin }
24005fdc4257SSteve Yin 
24015fdc4257SSteve Yin /**
2402b0a7a3cfSSteve Yin * Helper method for Implementation of get_accDefaultAction
2403b0a7a3cfSSteve Yin * @param pAction, the default action point of the current object.
2404b0a7a3cfSSteve Yin * @return S_OK if successful.
2405b0a7a3cfSSteve Yin */
SetDefaultAction(long pAction)24065fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetDefaultAction(long pAction)
24075fdc4257SSteve Yin {
2408b0a7a3cfSSteve Yin 	m_pXAction = (XAccessibleAction*)pAction;
2409b0a7a3cfSSteve Yin 	return S_OK;
24105fdc4257SSteve Yin }
24115fdc4257SSteve Yin 
24125fdc4257SSteve Yin /**
2413b0a7a3cfSSteve Yin * This method is called when AT open some UI elements initially
2414b0a7a3cfSSteve Yin * the UI element takes the default action defined here
2415b0a7a3cfSSteve Yin * @param varChild, the child id of the defaultaction.
2416b0a7a3cfSSteve Yin * @param pszDefaultAction,[in/out] the description of the current action.
2417b0a7a3cfSSteve Yin * @return S_OK if successful.
2418b0a7a3cfSSteve Yin */
get_accDefaultAction(VARIANT varChild,BSTR * pszDefaultAction)24195fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CMAccessible::get_accDefaultAction(VARIANT varChild, BSTR *pszDefaultAction)
24205fdc4257SSteve Yin {
2421b0a7a3cfSSteve Yin 
2422b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2423b0a7a3cfSSteve Yin 		ISDESTROY()
2424b0a7a3cfSSteve Yin 		// #CHECK#
2425b0a7a3cfSSteve Yin 		if(pszDefaultAction == NULL)
2426b0a7a3cfSSteve Yin 		{
2427b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2428b0a7a3cfSSteve Yin 		}
2429b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
2430b0a7a3cfSSteve Yin 		{
2431b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
2432b0a7a3cfSSteve Yin 			{
2433b0a7a3cfSSteve Yin 				if( m_pXAction == NULL )
2434b0a7a3cfSSteve Yin 					return DISP_E_MEMBERNOTFOUND;
2435b0a7a3cfSSteve Yin 				SAFE_SYSFREESTRING(*pszDefaultAction);
2436b0a7a3cfSSteve Yin 				*pszDefaultAction = SysAllocString(m_pszActionDescription);
2437b0a7a3cfSSteve Yin 				return S_OK;
2438b0a7a3cfSSteve Yin 			}
2439b0a7a3cfSSteve Yin 
2440b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
2441b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
2442b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
2443b0a7a3cfSSteve Yin 			if(!pChild)
2444b0a7a3cfSSteve Yin 				return E_FAIL;
2445b0a7a3cfSSteve Yin 			return pChild->get_accDefaultAction(varChild,pszDefaultAction);
2446b0a7a3cfSSteve Yin 		}
2447b0a7a3cfSSteve Yin 		return S_FALSE;
2448b0a7a3cfSSteve Yin 
2449b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
24505fdc4257SSteve Yin }
24515fdc4257SSteve Yin 
24525fdc4257SSteve Yin /**
2453b0a7a3cfSSteve Yin * AT call this method to operate application
2454b0a7a3cfSSteve Yin * @param varChild, the child id of the action object.
2455b0a7a3cfSSteve Yin * @return S_OK if successful.
2456b0a7a3cfSSteve Yin */
accDoDefaultAction(VARIANT varChild)24575fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CMAccessible::accDoDefaultAction(VARIANT varChild)
24585fdc4257SSteve Yin {
2459b0a7a3cfSSteve Yin 
2460b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2461b0a7a3cfSSteve Yin 		ISDESTROY()
2462b0a7a3cfSSteve Yin 		if( varChild.vt != VT_I4 )
2463b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2464b0a7a3cfSSteve Yin 	if( m_pXAction == NULL )
2465b0a7a3cfSSteve Yin 		return E_FAIL;
2466b0a7a3cfSSteve Yin 	if( m_pXAction->getAccessibleActionCount() == 0 )
2467b0a7a3cfSSteve Yin 		return E_FAIL;
2468b0a7a3cfSSteve Yin 
2469b0a7a3cfSSteve Yin 	if(varChild.lVal==CHILDID_SELF)
2470b0a7a3cfSSteve Yin 	{
2471b0a7a3cfSSteve Yin 		if(m_pXAction->getAccessibleActionCount() > 0)
2472b0a7a3cfSSteve Yin 			m_pXAction->doAccessibleAction(0);
2473b0a7a3cfSSteve Yin 		return S_OK;
2474b0a7a3cfSSteve Yin 	}
2475b0a7a3cfSSteve Yin 
2476b0a7a3cfSSteve Yin 	long lVal = varChild.lVal;
2477b0a7a3cfSSteve Yin 	varChild.lVal = CHILDID_SELF;
2478b0a7a3cfSSteve Yin 	IMAccessible *pChild = this->GetChildInterface(lVal);
2479b0a7a3cfSSteve Yin 	if(!pChild)
2480b0a7a3cfSSteve Yin 		return E_FAIL;
2481b0a7a3cfSSteve Yin 	return pChild->accDoDefaultAction( varChild );
2482b0a7a3cfSSteve Yin 
2483b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
24845fdc4257SSteve Yin }
24855fdc4257SSteve Yin 
24865fdc4257SSteve Yin /**
2487b0a7a3cfSSteve Yin * UNO set description information for action to COM.
2488b0a7a3cfSSteve Yin * @param szAction, the action description of the current object.
2489b0a7a3cfSSteve Yin * @return S_OK if successful.
2490b0a7a3cfSSteve Yin */
Put_ActionDescription(const OLECHAR * szAction)24915fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_ActionDescription( const OLECHAR* szAction)
24925fdc4257SSteve Yin {
24935fdc4257SSteve Yin 
2494b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2495b0a7a3cfSSteve Yin 		ISDESTROY()
2496b0a7a3cfSSteve Yin 		// #CHECK#
2497b0a7a3cfSSteve Yin 		if(szAction == NULL)
2498b0a7a3cfSSteve Yin 		{
2499b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2500b0a7a3cfSSteve Yin 		}
2501b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszActionDescription );
2502b0a7a3cfSSteve Yin 		m_pszActionDescription = SysAllocString( szAction );
2503b0a7a3cfSSteve Yin 		return S_OK;
2504b0a7a3cfSSteve Yin 
2505b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
25065fdc4257SSteve Yin }
25075fdc4257SSteve Yin 
GetXInterfaceFromXAccessible(XAccessible * pXAcc,XInterface ** ppXI,int index)25085fdc4257SSteve Yin BOOL CMAccessible::GetXInterfaceFromXAccessible(XAccessible* pXAcc, XInterface** ppXI, int index)
25095fdc4257SSteve Yin {
2510b0a7a3cfSSteve Yin 	Reference< XAccessibleContext > pRContext;
2511b0a7a3cfSSteve Yin 
2512b0a7a3cfSSteve Yin 	switch(index)
2513b0a7a3cfSSteve Yin 	{
2514b0a7a3cfSSteve Yin 	case XI_COMPONENT:
2515b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleComponent)
2516b0a7a3cfSSteve Yin 			break;
2517b0a7a3cfSSteve Yin 	case XI_TEXT:
2518b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleText)
2519b0a7a3cfSSteve Yin 			break;
2520b0a7a3cfSSteve Yin 	case XI_EDITABLETEXT:
2521b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleEditableText)
2522b0a7a3cfSSteve Yin 			break;
2523b0a7a3cfSSteve Yin 	case XI_TABLE:
2524b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleTable)
2525b0a7a3cfSSteve Yin 			break;
2526b0a7a3cfSSteve Yin 	case XI_SELECTION:
2527b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleSelection)
2528b0a7a3cfSSteve Yin 			break;
2529b0a7a3cfSSteve Yin 	case XI_EXTENDEDCOMP:
2530b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleExtendedComponent)
2531b0a7a3cfSSteve Yin 			break;
2532b0a7a3cfSSteve Yin 	case XI_KEYBINDING:
2533b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleKeyBinding)
2534b0a7a3cfSSteve Yin 			break;
2535b0a7a3cfSSteve Yin 	case XI_ACTION:
2536b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleAction)
2537b0a7a3cfSSteve Yin 			break;
2538b0a7a3cfSSteve Yin 	case XI_VALUE:
2539b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleValue)
2540b0a7a3cfSSteve Yin 			break;
2541b0a7a3cfSSteve Yin 	case XI_HYPERTEXT:
2542b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleHypertext)
2543b0a7a3cfSSteve Yin 			break;
2544b0a7a3cfSSteve Yin 	case XI_HYPERLINK:
2545b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleHyperlink)
2546b0a7a3cfSSteve Yin 			break;
2547b0a7a3cfSSteve Yin 	case XI_IMAGE:
2548b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleImage)
2549b0a7a3cfSSteve Yin 			break;
2550b0a7a3cfSSteve Yin 	default:
2551b0a7a3cfSSteve Yin 		break;
2552b0a7a3cfSSteve Yin 	}
2553b0a7a3cfSSteve Yin 
2554b0a7a3cfSSteve Yin 	return FALSE;
25555fdc4257SSteve Yin }
25565fdc4257SSteve Yin 
SmartQI(void * pv,REFIID iid,void ** ppvObject)25575fdc4257SSteve Yin HRESULT WINAPI CMAccessible::SmartQI(void* pv, REFIID iid, void** ppvObject)
25585fdc4257SSteve Yin {
2559b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2560b0a7a3cfSSteve Yin 		ISDESTROY()
2561b0a7a3cfSSteve Yin 		if( ImplIsEqualGUID(iid,IID_IAccIdentity) ||
2562b0a7a3cfSSteve Yin 			ImplIsEqualGUID(iid,IID_IStdMarshalInfo) ||
2563b0a7a3cfSSteve Yin 			ImplIsEqualGUID(iid,IID_IMarshal) ||
2564b0a7a3cfSSteve Yin 			ImplIsEqualGUID(iid,IID_IExternalConnection)||
2565b0a7a3cfSSteve Yin 			ImplIsEqualGUID(iid,IID_IOleWindow))
2566b0a7a3cfSSteve Yin 			return E_FAIL;
2567b0a7a3cfSSteve Yin 
2568b0a7a3cfSSteve Yin 
2569b0a7a3cfSSteve Yin 	_UNO_AGGMAP_ENTRY* pMap = _GetAggEntries();
2570b0a7a3cfSSteve Yin 	while(pMap && pMap->piid)
2571b0a7a3cfSSteve Yin 	{
2572b0a7a3cfSSteve Yin 		if(ImplIsEqualGUID(iid, *pMap->piid))
2573b0a7a3cfSSteve Yin 		{
2574b0a7a3cfSSteve Yin 			XInterface* pXI = NULL;
2575b0a7a3cfSSteve Yin 			BOOL bFound = GetXInterfaceFromXAccessible(pUNOInterface,&pXI,pMap->XIFIndex);
2576b0a7a3cfSSteve Yin 			if(!bFound)
2577b0a7a3cfSSteve Yin 			{
2578b0a7a3cfSSteve Yin 				return E_FAIL;
2579b0a7a3cfSSteve Yin 			}
2580b0a7a3cfSSteve Yin 
2581b0a7a3cfSSteve Yin 			XGUIDToComObjHash::iterator pIndTemp = m_containedObjects.find( iid );
2582b0a7a3cfSSteve Yin 			if ( pIndTemp != m_containedObjects.end() )
2583b0a7a3cfSSteve Yin 			{
2584b0a7a3cfSSteve Yin 				return pIndTemp->second.p->QueryInterface( iid, ppvObject );
2585b0a7a3cfSSteve Yin 			}
2586b0a7a3cfSSteve Yin 			else
2587b0a7a3cfSSteve Yin 			{
2588b0a7a3cfSSteve Yin 				ActivateActContext();
2589b0a7a3cfSSteve Yin 				HRESULT hr = pMap->pfnCreateInstance(pv, iid, ppvObject);
2590b0a7a3cfSSteve Yin 				DeactivateActContext();
2591b0a7a3cfSSteve Yin 				if(hr == S_OK)
2592b0a7a3cfSSteve Yin 				{
2593b0a7a3cfSSteve Yin 					m_containedObjects.insert(XGUIDToComObjHash::value_type(*pMap->piid,(IUnknown*)*ppvObject));
2594b0a7a3cfSSteve Yin 					IUNOXWrapper* wrapper = NULL;
2595b0a7a3cfSSteve Yin 					((IUnknown*)*ppvObject)->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper);
2596b0a7a3cfSSteve Yin 					if(wrapper)
2597b0a7a3cfSSteve Yin 					{
2598b0a7a3cfSSteve Yin 						wrapper->put_XInterface((long)pUNOInterface);
2599b0a7a3cfSSteve Yin 						wrapper->Release();
2600b0a7a3cfSSteve Yin 					}
2601b0a7a3cfSSteve Yin 					return S_OK;
2602b0a7a3cfSSteve Yin 				}
2603b0a7a3cfSSteve Yin 			}
2604b0a7a3cfSSteve Yin 			return E_FAIL;
2605b0a7a3cfSSteve Yin 		}
2606b0a7a3cfSSteve Yin 		pMap++;
2607b0a7a3cfSSteve Yin 	}
2608b0a7a3cfSSteve Yin 	return E_FAIL;
2609b0a7a3cfSSteve Yin 
2610b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
26115fdc4257SSteve Yin }
26125fdc4257SSteve Yin 
get_IAccessibleFromXAccessible(long pXAcc,IAccessible ** ppIA)26135fdc4257SSteve Yin BOOL CMAccessible::get_IAccessibleFromXAccessible(long pXAcc, IAccessible **ppIA)
26145fdc4257SSteve Yin {
26155fdc4257SSteve Yin 
2616b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2617b0a7a3cfSSteve Yin 
2618b0a7a3cfSSteve Yin 		// #CHECK#
2619b0a7a3cfSSteve Yin 		if(ppIA == NULL)
2620b0a7a3cfSSteve Yin 		{
2621b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2622b0a7a3cfSSteve Yin 		}
2623b0a7a3cfSSteve Yin 		BOOL isGet = FALSE;
2624b0a7a3cfSSteve Yin 		if(g_pAgent)
2625b0a7a3cfSSteve Yin 			isGet = g_pAgent->GetIAccessibleFromXAccessible((XAccessible*)pXAcc,ppIA);
2626b0a7a3cfSSteve Yin 
2627b0a7a3cfSSteve Yin 		if(isGet)
2628b0a7a3cfSSteve Yin 			return TRUE;
2629b0a7a3cfSSteve Yin 		else
2630b0a7a3cfSSteve Yin 			return FALSE;
26315fdc4257SSteve Yin 
2632b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
26335fdc4257SSteve Yin }
26345fdc4257SSteve Yin 
get_OLECHARFromAny(Any & pAny,OLECHAR * pChar)26355fdc4257SSteve Yin void CMAccessible::get_OLECHARFromAny(Any& pAny, OLECHAR* pChar)
26365fdc4257SSteve Yin {
2637b0a7a3cfSSteve Yin 	// #CHECK#
2638b0a7a3cfSSteve Yin 	if(pChar == NULL)
2639b0a7a3cfSSteve Yin 		return;
2640b0a7a3cfSSteve Yin 
2641b0a7a3cfSSteve Yin 	switch(pAny.getValueTypeClass())
2642b0a7a3cfSSteve Yin 	{
2643b0a7a3cfSSteve Yin 	case TypeClass_CHAR:
2644b0a7a3cfSSteve Yin 		{
2645b0a7a3cfSSteve Yin 			sal_Int8 val;
2646b0a7a3cfSSteve Yin 			pAny >>= val;
2647b0a7a3cfSSteve Yin 			swprintf( pChar, L"%d", val);
2648b0a7a3cfSSteve Yin 			break;
2649b0a7a3cfSSteve Yin 		}
2650b0a7a3cfSSteve Yin 	case TypeClass_BOOLEAN:
2651b0a7a3cfSSteve Yin 		{
2652b0a7a3cfSSteve Yin 			sal_Bool val;
2653b0a7a3cfSSteve Yin 			pAny >>= val;
2654b0a7a3cfSSteve Yin 			swprintf( pChar, L"%d", val);
2655b0a7a3cfSSteve Yin 			break;
2656b0a7a3cfSSteve Yin 		}
2657b0a7a3cfSSteve Yin 	case TypeClass_BYTE:
2658b0a7a3cfSSteve Yin 		{
2659b0a7a3cfSSteve Yin 			sal_Int8 val;
2660b0a7a3cfSSteve Yin 			pAny >>= val;
2661b0a7a3cfSSteve Yin 			swprintf( pChar, L"%d", val);
2662b0a7a3cfSSteve Yin 			break;
2663b0a7a3cfSSteve Yin 		}
2664b0a7a3cfSSteve Yin 	case TypeClass_SHORT:
2665b0a7a3cfSSteve Yin 		{
2666b0a7a3cfSSteve Yin 			SHORT val;
2667b0a7a3cfSSteve Yin 			pAny >>= val;
2668b0a7a3cfSSteve Yin 			swprintf( pChar, L"%d", val);
2669b0a7a3cfSSteve Yin 			break;
2670b0a7a3cfSSteve Yin 		}
2671b0a7a3cfSSteve Yin 	case TypeClass_UNSIGNED_SHORT:
2672b0a7a3cfSSteve Yin 		{
2673b0a7a3cfSSteve Yin 			USHORT val;
2674b0a7a3cfSSteve Yin 			pAny >>= val;
2675b0a7a3cfSSteve Yin 			swprintf( pChar, L"%d", val);
2676b0a7a3cfSSteve Yin 			break;
2677b0a7a3cfSSteve Yin 		}
2678b0a7a3cfSSteve Yin 	case TypeClass_LONG:
2679b0a7a3cfSSteve Yin 		{
2680b0a7a3cfSSteve Yin 			LONG val;
2681b0a7a3cfSSteve Yin 			pAny >>= val;
2682b0a7a3cfSSteve Yin 			swprintf( pChar, L"%ld", val);
2683b0a7a3cfSSteve Yin 			break;
2684b0a7a3cfSSteve Yin 		}
2685b0a7a3cfSSteve Yin 	case TypeClass_UNSIGNED_LONG:
2686b0a7a3cfSSteve Yin 		{
2687b0a7a3cfSSteve Yin 			ULONG val;
2688b0a7a3cfSSteve Yin 			pAny >>= val;
2689b0a7a3cfSSteve Yin 			swprintf( pChar, L"%ld", val);
2690b0a7a3cfSSteve Yin 			break;
2691b0a7a3cfSSteve Yin 		}
2692b0a7a3cfSSteve Yin 	case TypeClass_FLOAT:
2693b0a7a3cfSSteve Yin 		{
2694b0a7a3cfSSteve Yin 			FLOAT val;
2695b0a7a3cfSSteve Yin 			pAny >>= val;
2696b0a7a3cfSSteve Yin 			swprintf( pChar, L"%.3f", val);
2697b0a7a3cfSSteve Yin 			break;
2698b0a7a3cfSSteve Yin 		}
2699b0a7a3cfSSteve Yin 	case TypeClass_DOUBLE:
2700b0a7a3cfSSteve Yin 		{
2701b0a7a3cfSSteve Yin 			DOUBLE val;
2702b0a7a3cfSSteve Yin 			pAny >>= val;
2703b0a7a3cfSSteve Yin 			swprintf( pChar, L"%.6lf", val);
2704b0a7a3cfSSteve Yin 			break;
2705b0a7a3cfSSteve Yin 		}
2706b0a7a3cfSSteve Yin 	case TypeClass_STRING:
2707b0a7a3cfSSteve Yin 		{
2708b0a7a3cfSSteve Yin 			::rtl::OUString val;
2709b0a7a3cfSSteve Yin 			pAny >>= val;
2710b0a7a3cfSSteve Yin 			wcscpy(pChar, val.getStr());
2711b0a7a3cfSSteve Yin 			break;
2712b0a7a3cfSSteve Yin 		}
2713b0a7a3cfSSteve Yin 	case TypeClass_SEQUENCE:
2714b0a7a3cfSSteve Yin 		{
2715b0a7a3cfSSteve Yin 			if(pAny.getValueType() == getCppuType( (Sequence< ::rtl::OUString > *)0 ) )
2716b0a7a3cfSSteve Yin 			{
2717b0a7a3cfSSteve Yin 				Sequence < ::rtl::OUString > val;
2718b0a7a3cfSSteve Yin 				pAny >>= val;
2719b0a7a3cfSSteve Yin 
2720b0a7a3cfSSteve Yin 				::rtl::OUString pString;
2721b0a7a3cfSSteve Yin 
2722b0a7a3cfSSteve Yin 				int count = val.getLength();
2723b0a7a3cfSSteve Yin 
2724b0a7a3cfSSteve Yin 				for( int iIndex = 0;iIndex < count;iIndex++ )
2725b0a7a3cfSSteve Yin 				{
2726b0a7a3cfSSteve Yin 					pString += val[iIndex];
2727b0a7a3cfSSteve Yin 				}
2728b0a7a3cfSSteve Yin 				wcscpy(pChar, pString.getStr());
2729b0a7a3cfSSteve Yin 			}
2730b0a7a3cfSSteve Yin 			else if (pAny.getValueType() == getCppuType( (Sequence< ::com::sun::star::style::TabStop >* )0 ) )
2731b0a7a3cfSSteve Yin 			{
2732b0a7a3cfSSteve Yin 				Sequence < ::com::sun::star::style::TabStop > val;
2733b0a7a3cfSSteve Yin 				pAny >>= val;
2734b0a7a3cfSSteve Yin 				int count = val.getLength();
2735b0a7a3cfSSteve Yin 
2736b0a7a3cfSSteve Yin 				for( int iIndex = 0;iIndex < count;iIndex++ )
2737b0a7a3cfSSteve Yin 				{
2738b0a7a3cfSSteve Yin 					OLECHAR pAttrs[512] = {NULL};
2739b0a7a3cfSSteve Yin 
2740b0a7a3cfSSteve Yin 					OLECHAR pAttrsPosition[512] = {NULL};
2741b0a7a3cfSSteve Yin 					OLECHAR pAttrsDescimalChar[512] = {NULL};
2742b0a7a3cfSSteve Yin 					OLECHAR pAttrsFillChar[512] = {NULL};
2743b0a7a3cfSSteve Yin 
2744b0a7a3cfSSteve Yin 					::com::sun::star::style::TabStop sigleVal = val[iIndex];
2745b0a7a3cfSSteve Yin 
2746b0a7a3cfSSteve Yin 					swprintf( pAttrsPosition, L"Position=%ld,TabAlign=%ld",
2747b0a7a3cfSSteve Yin 						sigleVal.Position, sigleVal.Alignment);
2748b0a7a3cfSSteve Yin 
2749b0a7a3cfSSteve Yin 					if(sigleVal.DecimalChar==';' || sigleVal.DecimalChar == ':' || sigleVal.DecimalChar == ',' ||
2750b0a7a3cfSSteve Yin 						sigleVal.DecimalChar == '=' || sigleVal.DecimalChar == '\\')
2751b0a7a3cfSSteve Yin 						swprintf( pAttrsDescimalChar, L"DecimalChar=\\%c",sigleVal.DecimalChar);
2752b0a7a3cfSSteve Yin 					else
2753b0a7a3cfSSteve Yin 						swprintf( pAttrsDescimalChar, L"DecimalChar=%c",sigleVal.DecimalChar);
2754b0a7a3cfSSteve Yin 
2755b0a7a3cfSSteve Yin 					if(sigleVal.FillChar==';' || sigleVal.FillChar == ':' || sigleVal.FillChar == ',' ||
2756b0a7a3cfSSteve Yin 						sigleVal.FillChar == '=' || sigleVal.FillChar == '\\')
2757b0a7a3cfSSteve Yin 						swprintf( pAttrsFillChar, L"FillChar=\\%c",sigleVal.FillChar);
2758b0a7a3cfSSteve Yin 					else
2759b0a7a3cfSSteve Yin 						swprintf( pAttrsFillChar, L"FillChar=%c",sigleVal.FillChar);
2760b0a7a3cfSSteve Yin 
2761b0a7a3cfSSteve Yin 					swprintf( pAttrs, L"%s,%s,%s,",pAttrsPosition,pAttrsDescimalChar,pAttrsFillChar);
2762b0a7a3cfSSteve Yin 
2763b0a7a3cfSSteve Yin 					wcscat(pChar,pAttrs);
2764b0a7a3cfSSteve Yin 				}
2765b0a7a3cfSSteve Yin 			}
2766b0a7a3cfSSteve Yin 			break;
2767b0a7a3cfSSteve Yin 		}
2768b0a7a3cfSSteve Yin 	case TypeClass_ENUM:
2769b0a7a3cfSSteve Yin 		{
2770b0a7a3cfSSteve Yin 			if (pAny.getValueType() == getCppuType( (::com::sun::star::awt::FontSlant* )0 ) )
2771b0a7a3cfSSteve Yin 			{
2772b0a7a3cfSSteve Yin 				com::sun::star::awt::FontSlant val;
2773b0a7a3cfSSteve Yin 				pAny >>= val;
2774b0a7a3cfSSteve Yin 				swprintf( pChar, L"%d", val);
2775b0a7a3cfSSteve Yin 			}
2776b0a7a3cfSSteve Yin 		}
2777b0a7a3cfSSteve Yin 	case TypeClass_STRUCT:
2778b0a7a3cfSSteve Yin 		{
2779b0a7a3cfSSteve Yin 			if (pAny.getValueType() == getCppuType( (::com::sun::star::style::LineSpacing* )0 ) )
2780b0a7a3cfSSteve Yin 			{
2781b0a7a3cfSSteve Yin 				com::sun::star::style::LineSpacing val;
2782b0a7a3cfSSteve Yin 				pAny >>= val;
2783b0a7a3cfSSteve Yin 				swprintf( pChar, L"Mode=%ld,Height=%ld,", val.Mode, val.Height);
2784b0a7a3cfSSteve Yin 			}
2785b0a7a3cfSSteve Yin 			else if (pAny.getValueType() == getCppuType( (com::sun::star::accessibility::TextSegment *)0 ) )
2786b0a7a3cfSSteve Yin 			{
2787b0a7a3cfSSteve Yin 				com::sun::star::accessibility::TextSegment val;
2788b0a7a3cfSSteve Yin 				pAny >>= val;
2789b0a7a3cfSSteve Yin 				::rtl::OUString realVal(val.SegmentText);
2790b0a7a3cfSSteve Yin 				wcscpy(pChar, realVal.getStr());
2791b0a7a3cfSSteve Yin 			}
2792b0a7a3cfSSteve Yin 			break;
2793b0a7a3cfSSteve Yin 		}
2794b0a7a3cfSSteve Yin 	case TypeClass_VOID:
2795b0a7a3cfSSteve Yin 	case TypeClass_HYPER:
2796b0a7a3cfSSteve Yin 	case TypeClass_UNSIGNED_HYPER:
2797b0a7a3cfSSteve Yin 	case TypeClass_TYPE:
2798b0a7a3cfSSteve Yin 	case TypeClass_ANY:
2799b0a7a3cfSSteve Yin 	case TypeClass_TYPEDEF:
2800b0a7a3cfSSteve Yin 	case TypeClass_UNION:
2801b0a7a3cfSSteve Yin 	case TypeClass_EXCEPTION:
2802b0a7a3cfSSteve Yin 	case TypeClass_ARRAY:
2803b0a7a3cfSSteve Yin 	case TypeClass_INTERFACE:
2804b0a7a3cfSSteve Yin 	case TypeClass_SERVICE:
2805b0a7a3cfSSteve Yin 	case TypeClass_MODULE:
2806b0a7a3cfSSteve Yin 	case TypeClass_INTERFACE_METHOD:
2807b0a7a3cfSSteve Yin 	case TypeClass_INTERFACE_ATTRIBUTE:
2808b0a7a3cfSSteve Yin 	case TypeClass_UNKNOWN:
2809b0a7a3cfSSteve Yin 	case TypeClass_PROPERTY:
2810b0a7a3cfSSteve Yin 	case TypeClass_CONSTANT:
2811b0a7a3cfSSteve Yin 	case TypeClass_CONSTANTS:
2812b0a7a3cfSSteve Yin 	case TypeClass_SINGLETON:
2813b0a7a3cfSSteve Yin 	case TypeClass_MAKE_FIXED_SIZE:
2814b0a7a3cfSSteve Yin 		break;
2815b0a7a3cfSSteve Yin 	default:
2816b0a7a3cfSSteve Yin 		break;
2817b0a7a3cfSSteve Yin 	}
28185fdc4257SSteve Yin }
28195fdc4257SSteve Yin 
get_OLECHAR4Numbering(const Any & pAny,short numberingLevel,const OUString & numberingPrefix,OLECHAR * pChar)28205fdc4257SSteve Yin void CMAccessible::get_OLECHAR4Numbering(const Any& pAny, short numberingLevel,const OUString& numberingPrefix,OLECHAR* pChar)
28215fdc4257SSteve Yin {
2822b0a7a3cfSSteve Yin 	if(pChar == NULL)
2823b0a7a3cfSSteve Yin 		return;
2824b0a7a3cfSSteve Yin 	Reference< ::com::sun::star::container::XIndexReplace > pXIndex;
2825b0a7a3cfSSteve Yin 	if((pAny>>=pXIndex) && (numberingLevel !=-1))//numbering level is -1,means invalid value
2826b0a7a3cfSSteve Yin 	{
2827b0a7a3cfSSteve Yin 		Any aAny = pXIndex->getByIndex(numberingLevel);
2828b0a7a3cfSSteve Yin 		Sequence< ::com::sun::star::beans::PropertyValue > aProps;
2829b0a7a3cfSSteve Yin 		aAny >>= aProps;
2830b0a7a3cfSSteve Yin 		const ::com::sun::star::beans::PropertyValue* pPropArray = aProps.getConstArray();
2831b0a7a3cfSSteve Yin 		sal_Int32 nCount = aProps.getLength();
2832b0a7a3cfSSteve Yin 		swprintf(pChar,L"Numbering:NumberingLevel=%d,",numberingLevel);
2833b0a7a3cfSSteve Yin 		for( sal_Int32 i=0; i<nCount; i++ )
2834b0a7a3cfSSteve Yin 		{
2835b0a7a3cfSSteve Yin 			::com::sun::star::beans::PropertyValue rProp = pPropArray[i];
2836b0a7a3cfSSteve Yin 			if(	(rProp.Name.compareTo(OUString::createFromAscii("BulletChar"))==0)||
2837b0a7a3cfSSteve Yin 				(rProp.Name.compareTo(OUString::createFromAscii("GraphicURL"))==0)||
2838b0a7a3cfSSteve Yin 				(rProp.Name.compareTo(OUString::createFromAscii("NumberingType"))==0))
2839b0a7a3cfSSteve Yin 			{
2840b0a7a3cfSSteve Yin 				OLECHAR propStr[512] = {NULL};
2841b0a7a3cfSSteve Yin 				swprintf(propStr,L"%s=",rProp.Name.getStr());
2842b0a7a3cfSSteve Yin 				OLECHAR pTemp[256] = {NULL};
2843b0a7a3cfSSteve Yin 				CMAccessible::get_OLECHARFromAny(rProp.Value,pTemp);
2844b0a7a3cfSSteve Yin 				if(rProp.Name.compareTo(OUString::createFromAscii("GraphicURL"))==0)
2845b0a7a3cfSSteve Yin 				{
2846b0a7a3cfSSteve Yin 					OLECHAR* pOccur = wcschr(pTemp,':');
2847b0a7a3cfSSteve Yin 					if(pOccur)
2848b0a7a3cfSSteve Yin 						*pOccur = '.';
2849b0a7a3cfSSteve Yin 				}
2850b0a7a3cfSSteve Yin 				wcscat(propStr,pTemp);
2851b0a7a3cfSSteve Yin 				wcscat(pChar,propStr);
2852b0a7a3cfSSteve Yin 				wcscat(pChar,L",");
2853b0a7a3cfSSteve Yin 
2854b0a7a3cfSSteve Yin 				if(rProp.Name.compareTo(OUString::createFromAscii("NumberingType"))==0)
2855b0a7a3cfSSteve Yin 				{
2856b0a7a3cfSSteve Yin 					if(numberingPrefix.getLength()!=0)
2857b0a7a3cfSSteve Yin 					{
2858b0a7a3cfSSteve Yin 						swprintf(pTemp,L"NumberingPrefix=%s,",numberingPrefix.getStr());
2859b0a7a3cfSSteve Yin 						wcscat(pChar,pTemp);
2860b0a7a3cfSSteve Yin 					}
2861b0a7a3cfSSteve Yin 				}
2862b0a7a3cfSSteve Yin 			}
2863b0a7a3cfSSteve Yin 		}
2864b0a7a3cfSSteve Yin 	}
2865b0a7a3cfSSteve Yin 
2866b0a7a3cfSSteve Yin 	//Because now have three types numbering level:
2867b0a7a3cfSSteve Yin 	//1.real numbering list,numbering level>=0 and numbering Rule !=NULL;
2868b0a7a3cfSSteve Yin 	//2.common paragraph, numbering level >=0, and numbering Rule == NULL;
2869b0a7a3cfSSteve Yin 	//3.TOC paragraph, numbering level >0, and numbering Rule ==NULL;
2870b0a7a3cfSSteve Yin 	// IAText:numberinglevel base on 0, but TOC's level base on 1,
2871b0a7a3cfSSteve Yin 	// so NumberingLevel value will be decreased 1 in bridge code.
2872b0a7a3cfSSteve Yin 	else if(numberingLevel >0)
2873b0a7a3cfSSteve Yin 	{
2874b0a7a3cfSSteve Yin 		swprintf(pChar,L"Numbering:NumberingLevel=%d,NumberingType=4,NumberingPrefix=,",numberingLevel-1);
2875b0a7a3cfSSteve Yin 	}
2876b0a7a3cfSSteve Yin 	else
2877b0a7a3cfSSteve Yin 	{
2878b0a7a3cfSSteve Yin 		swprintf(pChar,L"Numbering:");
2879b0a7a3cfSSteve Yin 	}
28805fdc4257SSteve Yin }
28815fdc4257SSteve Yin 
ConvertAnyToVariant(const::com::sun::star::uno::Any & rAnyVal,VARIANT * pvData)28825fdc4257SSteve Yin void CMAccessible::ConvertAnyToVariant(const ::com::sun::star::uno::Any &rAnyVal, VARIANT *pvData)
28835fdc4257SSteve Yin {
2884b0a7a3cfSSteve Yin 	if(rAnyVal.hasValue())
2885b0a7a3cfSSteve Yin 	{
2886b0a7a3cfSSteve Yin 		// Clear VARIANT variable.
2887b0a7a3cfSSteve Yin 		VariantClear(pvData);
2888b0a7a3cfSSteve Yin 
2889b0a7a3cfSSteve Yin 		// Set value according to value type.
2890b0a7a3cfSSteve Yin 		switch(rAnyVal.getValueTypeClass())
2891b0a7a3cfSSteve Yin 		{
2892b0a7a3cfSSteve Yin 		case TypeClass_CHAR:
2893b0a7a3cfSSteve Yin 			pvData->vt = VT_UI1;
2894b0a7a3cfSSteve Yin 			memcpy(&pvData->bVal, rAnyVal.getValue(), sizeof(sal_Char));
2895b0a7a3cfSSteve Yin 			break;
2896b0a7a3cfSSteve Yin 
2897b0a7a3cfSSteve Yin 		case TypeClass_BOOLEAN:
2898b0a7a3cfSSteve Yin 			pvData->vt = VT_BOOL;
2899b0a7a3cfSSteve Yin 			memcpy(&pvData->boolVal, rAnyVal.getValue(), sizeof(sal_Bool));
2900b0a7a3cfSSteve Yin 			break;
2901b0a7a3cfSSteve Yin 
2902b0a7a3cfSSteve Yin 		case TypeClass_BYTE:
2903b0a7a3cfSSteve Yin 			pvData->vt = VT_UI1;
2904b0a7a3cfSSteve Yin 			memcpy(&pvData->bVal, rAnyVal.getValue(), sizeof(sal_Int8));
2905b0a7a3cfSSteve Yin 			break;
2906b0a7a3cfSSteve Yin 
2907b0a7a3cfSSteve Yin 		case TypeClass_SHORT:
2908b0a7a3cfSSteve Yin 			pvData->vt = VT_I2;
2909b0a7a3cfSSteve Yin 			memcpy(&pvData->iVal, rAnyVal.getValue(), sizeof(sal_Int16));
2910b0a7a3cfSSteve Yin 			break;
2911b0a7a3cfSSteve Yin 
2912b0a7a3cfSSteve Yin 		case TypeClass_UNSIGNED_SHORT:
2913b0a7a3cfSSteve Yin 			pvData->vt = VT_I2;
2914b0a7a3cfSSteve Yin 			memcpy(&pvData->iVal, rAnyVal.getValue(), sizeof(sal_uInt16));
2915b0a7a3cfSSteve Yin 			break;
2916b0a7a3cfSSteve Yin 
2917b0a7a3cfSSteve Yin 		case TypeClass_LONG:
2918b0a7a3cfSSteve Yin 			pvData->vt = VT_I4;
2919b0a7a3cfSSteve Yin 			memcpy(&pvData->lVal, rAnyVal.getValue(), sizeof(sal_Int32));
2920b0a7a3cfSSteve Yin 			break;
2921b0a7a3cfSSteve Yin 
2922b0a7a3cfSSteve Yin 		case TypeClass_UNSIGNED_LONG:
2923b0a7a3cfSSteve Yin 			pvData->vt = VT_I4;
2924b0a7a3cfSSteve Yin 			memcpy(&pvData->lVal, rAnyVal.getValue(), sizeof(sal_uInt32));
2925b0a7a3cfSSteve Yin 			break;
2926b0a7a3cfSSteve Yin 
2927b0a7a3cfSSteve Yin 		case TypeClass_FLOAT:
2928b0a7a3cfSSteve Yin 			pvData->vt = VT_R4;
2929b0a7a3cfSSteve Yin 			memcpy(&pvData->fltVal, rAnyVal.getValue(), sizeof(float));
2930b0a7a3cfSSteve Yin 			break;
2931b0a7a3cfSSteve Yin 
2932b0a7a3cfSSteve Yin 		case TypeClass_DOUBLE:
2933b0a7a3cfSSteve Yin 			pvData->vt = VT_R8;
2934b0a7a3cfSSteve Yin 			memcpy(&pvData->dblVal, rAnyVal.getValue(), sizeof(double));
2935b0a7a3cfSSteve Yin 			break;
2936b0a7a3cfSSteve Yin 
2937b0a7a3cfSSteve Yin 		case TypeClass_STRING:
2938b0a7a3cfSSteve Yin 			{
2939b0a7a3cfSSteve Yin 				pvData->vt = VT_BSTR;
2940b0a7a3cfSSteve Yin 				::rtl::OUString val;
2941b0a7a3cfSSteve Yin 				rAnyVal >>= val;
2942b0a7a3cfSSteve Yin 				pvData->bstrVal = SysAllocString((OLECHAR *)val.getStr());
2943b0a7a3cfSSteve Yin 				break;
2944b0a7a3cfSSteve Yin 			}
2945b0a7a3cfSSteve Yin 
2946b0a7a3cfSSteve Yin 		case TypeClass_VOID:
2947b0a7a3cfSSteve Yin 		case TypeClass_HYPER:
2948b0a7a3cfSSteve Yin 		case TypeClass_UNSIGNED_HYPER:
2949b0a7a3cfSSteve Yin 		case TypeClass_TYPE:
2950b0a7a3cfSSteve Yin 		case TypeClass_ANY:
2951b0a7a3cfSSteve Yin 		case TypeClass_ENUM:
2952b0a7a3cfSSteve Yin 		case TypeClass_TYPEDEF:
2953b0a7a3cfSSteve Yin 		case TypeClass_STRUCT:
2954b0a7a3cfSSteve Yin 		case TypeClass_UNION:
2955b0a7a3cfSSteve Yin 		case TypeClass_EXCEPTION:
2956b0a7a3cfSSteve Yin 		case TypeClass_SEQUENCE:
2957b0a7a3cfSSteve Yin 		case TypeClass_ARRAY:
2958b0a7a3cfSSteve Yin 		case TypeClass_INTERFACE:
2959b0a7a3cfSSteve Yin 			{
2960b0a7a3cfSSteve Yin 				Reference< XAccessible > pXAcc;
2961b0a7a3cfSSteve Yin 				if(rAnyVal >>= pXAcc)
2962b0a7a3cfSSteve Yin 				{
2963b0a7a3cfSSteve Yin 					if(pXAcc.is())
2964b0a7a3cfSSteve Yin 					{
2965b0a7a3cfSSteve Yin 						IAccessible* pIAcc = NULL;
2966b0a7a3cfSSteve Yin 						get_IAccessibleFromXAccessible((long)pXAcc.get(), &pIAcc);
2967b0a7a3cfSSteve Yin 						if(pIAcc == NULL)
2968b0a7a3cfSSteve Yin 						{
2969b0a7a3cfSSteve Yin 							Reference< XAccessibleContext > pXAccContext = pXAcc->getAccessibleContext();
2970b0a7a3cfSSteve Yin 							g_pAgent->InsertAccObj(pXAcc.get(),pXAccContext->getAccessibleParent().get());
2971b0a7a3cfSSteve Yin 							get_IAccessibleFromXAccessible((long)pXAcc.get(), &pIAcc);
2972b0a7a3cfSSteve Yin 						}
2973b0a7a3cfSSteve Yin 						if(pIAcc)
2974b0a7a3cfSSteve Yin 						{
2975b0a7a3cfSSteve Yin 							pIAcc->AddRef();
2976b0a7a3cfSSteve Yin 
2977b0a7a3cfSSteve Yin 							pvData->vt = VT_UNKNOWN;
2978b0a7a3cfSSteve Yin 							pvData->pdispVal = (IAccessible2*)pIAcc;
2979b0a7a3cfSSteve Yin 							break;
2980b0a7a3cfSSteve Yin 						}
2981b0a7a3cfSSteve Yin 					}
2982b0a7a3cfSSteve Yin 				}
2983b0a7a3cfSSteve Yin 			}
2984b0a7a3cfSSteve Yin 		case TypeClass_SERVICE:
2985b0a7a3cfSSteve Yin 		case TypeClass_MODULE:
2986b0a7a3cfSSteve Yin 		case TypeClass_INTERFACE_METHOD:
2987b0a7a3cfSSteve Yin 		case TypeClass_INTERFACE_ATTRIBUTE:
2988b0a7a3cfSSteve Yin 		case TypeClass_UNKNOWN:
2989b0a7a3cfSSteve Yin 		case TypeClass_PROPERTY:
2990b0a7a3cfSSteve Yin 		case TypeClass_CONSTANT:
2991b0a7a3cfSSteve Yin 		case TypeClass_CONSTANTS:
2992b0a7a3cfSSteve Yin 		case TypeClass_SINGLETON:
2993b0a7a3cfSSteve Yin 		case TypeClass_MAKE_FIXED_SIZE:
2994b0a7a3cfSSteve Yin 			// Output the type string, if there is other uno value type.
2995b0a7a3cfSSteve Yin 			pvData->vt = VT_BSTR;
2996b0a7a3cfSSteve Yin 			pvData->bstrVal = SysAllocString(rAnyVal.getValueTypeName().getStr());
2997b0a7a3cfSSteve Yin 			break;
2998b0a7a3cfSSteve Yin 
2999b0a7a3cfSSteve Yin 		default:
3000b0a7a3cfSSteve Yin 			break;
3001b0a7a3cfSSteve Yin 		}
3002b0a7a3cfSSteve Yin 	}
3003b0a7a3cfSSteve Yin 	else
3004b0a7a3cfSSteve Yin 	{
3005b0a7a3cfSSteve Yin 		VariantClear(pvData);
3006b0a7a3cfSSteve Yin 	}
30075fdc4257SSteve Yin }
30085fdc4257SSteve Yin 
Get_XAccChildID(long * childID)30095fdc4257SSteve Yin STDMETHODIMP CMAccessible::Get_XAccChildID(long* childID)
30105fdc4257SSteve Yin {
3011b0a7a3cfSSteve Yin 	// #CHECK#
3012b0a7a3cfSSteve Yin 	if(childID == NULL)
3013b0a7a3cfSSteve Yin 	{
3014b0a7a3cfSSteve Yin 		return E_FAIL;
3015b0a7a3cfSSteve Yin 	}
3016b0a7a3cfSSteve Yin 	*childID = m_dChildID;
3017b0a7a3cfSSteve Yin 	return S_OK;
30185fdc4257SSteve Yin }
get_states(AccessibleStates __RPC_FAR * states)30195fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_states(AccessibleStates __RPC_FAR *states )
30205fdc4257SSteve Yin {
3021b0a7a3cfSSteve Yin 
30225fdc4257SSteve Yin 	CHECK_ENABLE_INF
3023b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
3024b0a7a3cfSSteve Yin 		ISDESTROY()
3025b0a7a3cfSSteve Yin 		// #CHECK XInterface#
3026b0a7a3cfSSteve Yin 		if( !pRContext.is() )
3027b0a7a3cfSSteve Yin 			return E_FAIL;
3028b0a7a3cfSSteve Yin 
3029b0a7a3cfSSteve Yin 	Reference<XAccessibleStateSet> pRStateSet = pRContext.get()->getAccessibleStateSet();
3030b0a7a3cfSSteve Yin 	if(!pRStateSet.is())
3031b0a7a3cfSSteve Yin 	{
3032b0a7a3cfSSteve Yin 		return S_OK;
3033b0a7a3cfSSteve Yin 	}
3034b0a7a3cfSSteve Yin 	Sequence<short> pStates = pRStateSet->getStates();
3035b0a7a3cfSSteve Yin 
3036b0a7a3cfSSteve Yin 
3037b0a7a3cfSSteve Yin 	long count = pStates.getLength() ;
3038b0a7a3cfSSteve Yin 	*states = 0x0;
3039b0a7a3cfSSteve Yin 	for( int i = 0; i < count; i++  )
3040b0a7a3cfSSteve Yin 	{
3041b0a7a3cfSSteve Yin 		for( int j = 0; j < sizeof(UNO_STATES) / sizeof(UNO_STATES[0]); j++ )
3042b0a7a3cfSSteve Yin 		{
3043b0a7a3cfSSteve Yin 			if( pStates[i] == UNO_STATES[j] )
3044b0a7a3cfSSteve Yin 			{
3045b0a7a3cfSSteve Yin 				*states |= IA2_STATES[j];
3046b0a7a3cfSSteve Yin 				break;
3047b0a7a3cfSSteve Yin 			}
3048b0a7a3cfSSteve Yin 		}
3049b0a7a3cfSSteve Yin 	}
3050b0a7a3cfSSteve Yin 	return S_OK;
3051b0a7a3cfSSteve Yin 
3052b0a7a3cfSSteve Yin 
3053b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
30545fdc4257SSteve Yin }
30555fdc4257SSteve Yin 
30565fdc4257SSteve Yin // return the UNO roles
get_extendedRole(BSTR __RPC_FAR *)30575fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_extendedRole( BSTR __RPC_FAR *  )
30585fdc4257SSteve Yin {
3059b0a7a3cfSSteve Yin 
30605fdc4257SSteve Yin 	CHECK_ENABLE_INF
3061b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
3062b0a7a3cfSSteve Yin 		ISDESTROY()
30635fdc4257SSteve Yin 
3064b0a7a3cfSSteve Yin 		return E_NOTIMPL;
30655fdc4257SSteve Yin 
3066b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
30675fdc4257SSteve Yin }
30685fdc4257SSteve Yin 
get_localizedExtendedRole(BSTR __RPC_FAR *)30695fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_localizedExtendedRole( BSTR __RPC_FAR *  )
30705fdc4257SSteve Yin {
30715fdc4257SSteve Yin 
3072b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
3073b0a7a3cfSSteve Yin 		ISDESTROY()
3074b0a7a3cfSSteve Yin 		return E_NOTIMPL;
3075b0a7a3cfSSteve Yin 
3076b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
30775fdc4257SSteve Yin }
get_nExtendedStates(long __RPC_FAR *)30785fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_nExtendedStates( long __RPC_FAR * )
30795fdc4257SSteve Yin {
3080b0a7a3cfSSteve Yin 
30815fdc4257SSteve Yin 	CHECK_ENABLE_INF
3082b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
3083b0a7a3cfSSteve Yin 		ISDESTROY()
30845fdc4257SSteve Yin 
3085b0a7a3cfSSteve Yin 		return E_NOTIMPL;
30865fdc4257SSteve Yin 
3087b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
30885fdc4257SSteve Yin }
30895fdc4257SSteve Yin 
30905fdc4257SSteve Yin 
get_localizedExtendedStates(long,BSTR __RPC_FAR * __RPC_FAR *,long __RPC_FAR *)30915fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_localizedExtendedStates( long, BSTR __RPC_FAR *__RPC_FAR *, long __RPC_FAR *)
30925fdc4257SSteve Yin {
30935fdc4257SSteve Yin 
3094b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
3095b0a7a3cfSSteve Yin 		ISDESTROY()
3096b0a7a3cfSSteve Yin 		return E_NOTIMPL;
3097b0a7a3cfSSteve Yin 
3098b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
30995fdc4257SSteve Yin }
31005fdc4257SSteve Yin 
31015fdc4257SSteve Yin 
get_indexInParent(long __RPC_FAR * accParentIndex)31025fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_indexInParent( long __RPC_FAR *accParentIndex)
31035fdc4257SSteve Yin {
3104b0a7a3cfSSteve Yin 
31055fdc4257SSteve Yin 	CHECK_ENABLE_INF
3106b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
3107b0a7a3cfSSteve Yin 		ISDESTROY()
3108b0a7a3cfSSteve Yin 		// #CHECK#
3109b0a7a3cfSSteve Yin 		if(accParentIndex == NULL)
3110b0a7a3cfSSteve Yin 			return E_INVALIDARG;
31115fdc4257SSteve Yin 
3112b0a7a3cfSSteve Yin 	// #CHECK XInterface#
3113b0a7a3cfSSteve Yin 	if( !pRContext.is() )
3114b0a7a3cfSSteve Yin 		return E_FAIL;
31155fdc4257SSteve Yin 
3116b0a7a3cfSSteve Yin 	*accParentIndex = pRContext.get()->getAccessibleIndexInParent();
3117b0a7a3cfSSteve Yin 	return S_OK;
31185fdc4257SSteve Yin 
31195fdc4257SSteve Yin 
3120b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
31215fdc4257SSteve Yin }
get_locale(IA2Locale __RPC_FAR * locale)31225fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_locale( IA2Locale __RPC_FAR *locale  )
31235fdc4257SSteve Yin {
3124b0a7a3cfSSteve Yin 
31255fdc4257SSteve Yin 	CHECK_ENABLE_INF
3126b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
3127b0a7a3cfSSteve Yin 		ISDESTROY()
3128b0a7a3cfSSteve Yin 		if(locale == NULL)
3129b0a7a3cfSSteve Yin 			return E_INVALIDARG;
3130b0a7a3cfSSteve Yin 	// #CHECK XInterface#
31315fdc4257SSteve Yin 
3132b0a7a3cfSSteve Yin 	if( !pRContext.is() )
3133b0a7a3cfSSteve Yin 		return E_FAIL;
31345fdc4257SSteve Yin 
3135b0a7a3cfSSteve Yin 	::com::sun::star::lang::Locale unoLoc = pRContext.get()->getLocale();
3136b0a7a3cfSSteve Yin 	locale->language = SysAllocString((OLECHAR*)unoLoc.Language.getStr());
3137b0a7a3cfSSteve Yin 	locale->country = SysAllocString((OLECHAR*)unoLoc.Country.getStr());
3138b0a7a3cfSSteve Yin 	locale->variant = SysAllocString((OLECHAR*)unoLoc.Variant.getStr());
31395fdc4257SSteve Yin 
3140b0a7a3cfSSteve Yin 	return S_OK;
31415fdc4257SSteve Yin 
3142b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
31435fdc4257SSteve Yin }
31445fdc4257SSteve Yin 
GetMSAAStateFromUNO(short xState)31455fdc4257SSteve Yin DWORD GetMSAAStateFromUNO(short xState)
31465fdc4257SSteve Yin {
3147b0a7a3cfSSteve Yin 	DWORD IState = STATE_SYSTEM_UNAVAILABLE;
3148b0a7a3cfSSteve Yin 	switch( xState )
3149b0a7a3cfSSteve Yin 	{
3150b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::BUSY:
3151b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_BUSY;
3152b0a7a3cfSSteve Yin 		break;
3153b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::CHECKED:
3154b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_CHECKED;
3155b0a7a3cfSSteve Yin 		break;
3156b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::DEFUNC:
3157b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_UNAVAILABLE;
3158b0a7a3cfSSteve Yin 		break;
3159b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::EXPANDED:
3160b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_EXPANDED;
3161b0a7a3cfSSteve Yin 		break;
3162b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::FOCUSABLE:
3163b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_FOCUSABLE;
3164b0a7a3cfSSteve Yin 		break;
3165b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::FOCUSED:
3166b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_FOCUSED;
3167b0a7a3cfSSteve Yin 		break;
3168b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::INDETERMINATE:
3169b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_MIXED;
3170b0a7a3cfSSteve Yin 		break;
3171b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::MULTI_SELECTABLE:
3172b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_MULTISELECTABLE;
3173b0a7a3cfSSteve Yin 		break;
3174b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::PRESSED:
3175b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_PRESSED;
3176b0a7a3cfSSteve Yin 		break;
3177b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::RESIZABLE:
3178b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_SIZEABLE;
3179b0a7a3cfSSteve Yin 		break;
3180b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::SELECTABLE:
3181b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_SELECTABLE;
3182b0a7a3cfSSteve Yin 		break;
3183b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::SELECTED:
3184b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_SELECTED;
3185b0a7a3cfSSteve Yin 		break;
3186b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::ARMED:
3187b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_FOCUSED;
3188b0a7a3cfSSteve Yin 		break;
3189b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::EXPANDABLE:
3190b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_COLLAPSED;
3191b0a7a3cfSSteve Yin 		break;
3192b0a7a3cfSSteve Yin 	default:
3193b0a7a3cfSSteve Yin 		break;
3194b0a7a3cfSSteve Yin 	}
3195b0a7a3cfSSteve Yin 	return IState;
31965fdc4257SSteve Yin }
31975fdc4257SSteve Yin 
get_appName(BSTR __RPC_FAR * name)31985fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_appName( BSTR __RPC_FAR *name)
31995fdc4257SSteve Yin {
32005fdc4257SSteve Yin 
3201b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
3202b0a7a3cfSSteve Yin 		ISDESTROY()
3203b0a7a3cfSSteve Yin 		if(name == NULL)
3204b0a7a3cfSSteve Yin 			return E_INVALIDARG;
3205b0a7a3cfSSteve Yin 
3206b0a7a3cfSSteve Yin 	*name = SysAllocString(OLESTR("Hannover"));
3207b0a7a3cfSSteve Yin 	return S_OK;
3208b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
32095fdc4257SSteve Yin }
get_appVersion(BSTR __RPC_FAR * version)32105fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_appVersion(BSTR __RPC_FAR *version)
32115fdc4257SSteve Yin {
3212b0a7a3cfSSteve Yin 
3213b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
3214b0a7a3cfSSteve Yin 		ISDESTROY()
3215b0a7a3cfSSteve Yin 		if(version == NULL)
3216b0a7a3cfSSteve Yin 			return E_INVALIDARG;
3217b0a7a3cfSSteve Yin 	*version=SysAllocString(OLESTR("3.0"));
3218b0a7a3cfSSteve Yin 	return S_OK;
3219b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
32205fdc4257SSteve Yin }
get_toolkitName(BSTR __RPC_FAR * name)32215fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_toolkitName(BSTR __RPC_FAR *name)
32225fdc4257SSteve Yin {
3223b0a7a3cfSSteve Yin 
3224b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
3225b0a7a3cfSSteve Yin 		ISDESTROY()
3226b0a7a3cfSSteve Yin 		if(name == NULL)
3227b0a7a3cfSSteve Yin 			return E_INVALIDARG;
3228b0a7a3cfSSteve Yin 	*name = SysAllocString(OLESTR(" "));
3229b0a7a3cfSSteve Yin 	return S_OK;
3230b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
32315fdc4257SSteve Yin }
get_toolkitVersion(BSTR __RPC_FAR * version)32325fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_toolkitVersion(BSTR __RPC_FAR *version)
32335fdc4257SSteve Yin {
3234b0a7a3cfSSteve Yin 
3235b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
3236b0a7a3cfSSteve Yin 		ISDESTROY()
3237b0a7a3cfSSteve Yin 		if(version == NULL)
3238b0a7a3cfSSteve Yin 			return E_INVALIDARG;
3239b0a7a3cfSSteve Yin 	*version = SysAllocString(OLESTR(" "));
3240b0a7a3cfSSteve Yin 	return S_OK;
3241b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
32425fdc4257SSteve Yin }
32435fdc4257SSteve Yin 
32445fdc4257SSteve Yin 
get_attributes(BSTR * pAttr)32455fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_attributes(/*[out]*/ BSTR *pAttr)
32465fdc4257SSteve Yin {
3247*5b933a9eSSteve Yin 	ENTER_PROTECTED_BLOCK
3248*5b933a9eSSteve Yin 	ISDESTROY()
32495fdc4257SSteve Yin 	CHECK_ENABLE_INF
3250b0a7a3cfSSteve Yin 		Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
3251b0a7a3cfSSteve Yin 	if( !pRContext.is() )
3252b0a7a3cfSSteve Yin 	{
3253b0a7a3cfSSteve Yin 		return E_FAIL;
3254b0a7a3cfSSteve Yin 	}
3255b0a7a3cfSSteve Yin 	Reference<XAccessibleExtendedAttributes> pRXI(pRContext,UNO_QUERY);
3256b0a7a3cfSSteve Yin 	if( !pRXI.is() )
3257b0a7a3cfSSteve Yin 		return E_FAIL;
3258b0a7a3cfSSteve Yin 	else
3259b0a7a3cfSSteve Yin 	{
3260b0a7a3cfSSteve Yin 		com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleExtendedAttributes> pRXAttr;
3261b0a7a3cfSSteve Yin 		pRXAttr = pRXI.get();
3262b0a7a3cfSSteve Yin 		::com::sun::star::uno::Any	anyVal = pRXAttr->getExtendedAttributes();
3263b0a7a3cfSSteve Yin 
3264b0a7a3cfSSteve Yin 		::rtl::OUString val;
3265b0a7a3cfSSteve Yin 		anyVal >>= val;
3266b0a7a3cfSSteve Yin 
3267b0a7a3cfSSteve Yin 		if(*pAttr)
3268b0a7a3cfSSteve Yin 			SAFE_SYSFREESTRING(*pAttr);
3269b0a7a3cfSSteve Yin 		*pAttr = SysAllocString((OLECHAR *)val.getStr());
3270b0a7a3cfSSteve Yin 
3271b0a7a3cfSSteve Yin 		return S_OK;
3272b0a7a3cfSSteve Yin 	}
3273*5b933a9eSSteve Yin 	LEAVE_PROTECTED_BLOCK
32745fdc4257SSteve Yin }
32755fdc4257SSteve Yin 
3276