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