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 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); 219*693722acSSteve Yin m_containedObjects.clear(); 2205fdc4257SSteve Yin } 2215fdc4257SSteve Yin 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 */ 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 */ 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 */ 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); 356b0a7a3cfSSteve Yin (*ppdispChild)->AddRef(); 357b0a7a3cfSSteve Yin return (*ppdispChild)?S_OK:S_FALSE; 358b0a7a3cfSSteve Yin } 359b0a7a3cfSSteve Yin return S_FALSE; 360b0a7a3cfSSteve Yin 361b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 3625fdc4257SSteve Yin } 3635fdc4257SSteve Yin 3645fdc4257SSteve Yin /** 3655fdc4257SSteve Yin * Returns the accessible name of the current COM object self or its one child to AT. 3665fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 3675fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 3685fdc4257SSteve Yin * @param pszName, [in,out] use to return the name of the proper object. 3695fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 3705fdc4257SSteve Yin */ 3715fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accName(VARIANT varChild, BSTR *pszName) 3725fdc4257SSteve Yin { 373b0a7a3cfSSteve Yin 3745fdc4257SSteve Yin CHECK_ENABLE_INF 375b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 376b0a7a3cfSSteve Yin ISDESTROY() 377b0a7a3cfSSteve Yin // #CHECK# 378b0a7a3cfSSteve Yin if(pszName == NULL) 379b0a7a3cfSSteve Yin { 380b0a7a3cfSSteve Yin return E_INVALIDARG; 381b0a7a3cfSSteve Yin } 382b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 383b0a7a3cfSSteve Yin { 384b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 385b0a7a3cfSSteve Yin { 386b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(*pszName); 387b0a7a3cfSSteve Yin *pszName = SysAllocString(m_pszName); 388b0a7a3cfSSteve Yin return S_OK; 389b0a7a3cfSSteve Yin } 390b0a7a3cfSSteve Yin 391b0a7a3cfSSteve Yin long lVal = varChild.lVal; 392b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 393b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 394b0a7a3cfSSteve Yin if(!pChild) 395b0a7a3cfSSteve Yin return E_FAIL; 396b0a7a3cfSSteve Yin return pChild->get_accName(varChild,pszName); 397b0a7a3cfSSteve Yin } 398b0a7a3cfSSteve Yin return S_FALSE; 399b0a7a3cfSSteve Yin 400b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 4015fdc4257SSteve Yin } 4025fdc4257SSteve Yin 4035fdc4257SSteve Yin /** 4045fdc4257SSteve Yin * Returns the accessible value of the current COM object self or its one child to AT. 4055fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 4065fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 4075fdc4257SSteve Yin * @param pszValue, [in,out] use to return the value of the proper object. 4085fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 4095fdc4257SSteve Yin */ 4105fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accValue(VARIANT varChild, BSTR *pszValue) 4115fdc4257SSteve Yin { 412b0a7a3cfSSteve Yin 4135fdc4257SSteve Yin CHECK_ENABLE_INF 414b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 415b0a7a3cfSSteve Yin ISDESTROY() 416b0a7a3cfSSteve Yin // #CHECK# 417b0a7a3cfSSteve Yin if( pszValue == NULL ) 418b0a7a3cfSSteve Yin { 419b0a7a3cfSSteve Yin return E_INVALIDARG; 420b0a7a3cfSSteve Yin } 421b0a7a3cfSSteve Yin if( varChild.vt==VT_I4 ) 422b0a7a3cfSSteve Yin { 423b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 424b0a7a3cfSSteve Yin { 425b0a7a3cfSSteve Yin if(m_dState & STATE_SYSTEM_PROTECTED) 426b0a7a3cfSSteve Yin return E_ACCESSDENIED; 427b0a7a3cfSSteve Yin 428b0a7a3cfSSteve Yin if ( m_pszValue !=NULL && wcslen(m_pszValue) == 0 ) 429b0a7a3cfSSteve Yin return S_OK; 430b0a7a3cfSSteve Yin 431b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(*pszValue); 432b0a7a3cfSSteve Yin *pszValue = SysAllocString(m_pszValue); 433b0a7a3cfSSteve Yin return S_OK; 434b0a7a3cfSSteve Yin } 435b0a7a3cfSSteve Yin 436b0a7a3cfSSteve Yin long lVal = varChild.lVal; 437b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 438b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 439b0a7a3cfSSteve Yin if(!pChild) 440b0a7a3cfSSteve Yin return E_FAIL; 441b0a7a3cfSSteve Yin return pChild->get_accValue(varChild,pszValue); 442b0a7a3cfSSteve Yin } 443b0a7a3cfSSteve Yin return S_FALSE; 444b0a7a3cfSSteve Yin 445b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 4465fdc4257SSteve Yin } 4475fdc4257SSteve Yin 4485fdc4257SSteve Yin /** 4495fdc4257SSteve Yin * Returns the accessible description of the current COM object self or its one child to AT. 4505fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 4515fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 4525fdc4257SSteve Yin * @param pszDescription, [in,out] use to return the description of the proper object. 4535fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 4545fdc4257SSteve Yin */ 4555fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accDescription(VARIANT varChild, BSTR *pszDescription) 4565fdc4257SSteve Yin { 457b0a7a3cfSSteve Yin 4585fdc4257SSteve Yin CHECK_ENABLE_INF 459b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 460b0a7a3cfSSteve Yin ISDESTROY() 461b0a7a3cfSSteve Yin // #CHECK# 462b0a7a3cfSSteve Yin if(pszDescription == NULL) 463b0a7a3cfSSteve Yin { 464b0a7a3cfSSteve Yin return E_INVALIDARG; 465b0a7a3cfSSteve Yin } 466b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 467b0a7a3cfSSteve Yin { 468b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 469b0a7a3cfSSteve Yin { 470b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(*pszDescription); 471b0a7a3cfSSteve Yin *pszDescription = SysAllocString(m_pszDescription); 472b0a7a3cfSSteve Yin return S_OK; 473b0a7a3cfSSteve Yin } 474b0a7a3cfSSteve Yin 475b0a7a3cfSSteve Yin long lVal = varChild.lVal; 476b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 477b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 478b0a7a3cfSSteve Yin if(!pChild) 479b0a7a3cfSSteve Yin return E_FAIL; 480b0a7a3cfSSteve Yin return pChild->get_accDescription(varChild,pszDescription); 481b0a7a3cfSSteve Yin } 482b0a7a3cfSSteve Yin return S_FALSE; 483b0a7a3cfSSteve Yin 484b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 4855fdc4257SSteve Yin } 4865fdc4257SSteve Yin 4875fdc4257SSteve Yin /** 4885fdc4257SSteve Yin * Returns the accessible role of the current COM object self or its one child to AT. 4895fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 4905fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 4915fdc4257SSteve Yin * @param pvarRole, [in,out] use to return the role of the proper object. 4925fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 4935fdc4257SSteve Yin */ 4945fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accRole(VARIANT varChild, VARIANT *pvarRole) 4955fdc4257SSteve Yin { 496b0a7a3cfSSteve Yin 4975fdc4257SSteve Yin CHECK_ENABLE_INF 498b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 499b0a7a3cfSSteve Yin ISDESTROY() 500b0a7a3cfSSteve Yin // #CHECK# 501b0a7a3cfSSteve Yin if(pvarRole == NULL) 502b0a7a3cfSSteve Yin { 503b0a7a3cfSSteve Yin return E_INVALIDARG; 504b0a7a3cfSSteve Yin } 505b0a7a3cfSSteve Yin if(varChild.vt == VT_I4) 506b0a7a3cfSSteve Yin { 507b0a7a3cfSSteve Yin 508b0a7a3cfSSteve Yin if(varChild.lVal == CHILDID_SELF) 509b0a7a3cfSSteve Yin { 510b0a7a3cfSSteve Yin if( m_iRole < IA2_ROLE_CAPTION ) 511b0a7a3cfSSteve Yin { 512b0a7a3cfSSteve Yin VariantInit(pvarRole); 513b0a7a3cfSSteve Yin pvarRole->vt = VT_I4; 514b0a7a3cfSSteve Yin pvarRole->lVal = m_iRole; 515b0a7a3cfSSteve Yin } 516b0a7a3cfSSteve Yin else 517b0a7a3cfSSteve Yin { 518b0a7a3cfSSteve Yin VariantInit(pvarRole); 519b0a7a3cfSSteve Yin pvarRole->vt = VT_I4; 520b0a7a3cfSSteve Yin pvarRole->lVal = ROLE_SYSTEM_CLIENT; 521b0a7a3cfSSteve Yin } 522b0a7a3cfSSteve Yin return S_OK; 523b0a7a3cfSSteve Yin } 524b0a7a3cfSSteve Yin 525b0a7a3cfSSteve Yin 526b0a7a3cfSSteve Yin long lVal = varChild.lVal; 527b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 528b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 529b0a7a3cfSSteve Yin if(!pChild) 530b0a7a3cfSSteve Yin return E_FAIL; 531b0a7a3cfSSteve Yin return pChild->get_accRole(varChild,pvarRole); 532b0a7a3cfSSteve Yin } 533b0a7a3cfSSteve Yin return S_FALSE; 534b0a7a3cfSSteve Yin 535b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 5365fdc4257SSteve Yin } 5375fdc4257SSteve Yin 5385fdc4257SSteve Yin /** 5395fdc4257SSteve Yin * Returns the accessible state of the current COM object self or its one child to AT. 5405fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 5415fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 5425fdc4257SSteve Yin * @param pvarState, [in,out] use to return the state of the proper object. 5435fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 5445fdc4257SSteve Yin */ 5455fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accState(VARIANT varChild, VARIANT *pvarState) 5465fdc4257SSteve Yin { 547b0a7a3cfSSteve Yin 5485fdc4257SSteve Yin CHECK_ENABLE_INF 549b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 550b0a7a3cfSSteve Yin ISDESTROY() 551b0a7a3cfSSteve Yin // #CHECK# 552b0a7a3cfSSteve Yin if(pvarState == NULL) 553b0a7a3cfSSteve Yin { 554b0a7a3cfSSteve Yin return E_INVALIDARG; 555b0a7a3cfSSteve Yin } 556b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 557b0a7a3cfSSteve Yin { 558b0a7a3cfSSteve Yin if(varChild.lVal == CHILDID_SELF) 559b0a7a3cfSSteve Yin { 560b0a7a3cfSSteve Yin if(pUNOInterface) 561b0a7a3cfSSteve Yin { 562b0a7a3cfSSteve Yin Reference< XAccessibleContext > pContext = pUNOInterface->getAccessibleContext(); 563b0a7a3cfSSteve Yin if(pContext.is()) 564b0a7a3cfSSteve Yin { 565b0a7a3cfSSteve Yin // add the STATE_SYSTEM_LINKED state 566b0a7a3cfSSteve Yin Reference< XAccessibleHypertext > pRHypertext(pContext,UNO_QUERY); 567b0a7a3cfSSteve Yin if(pRHypertext.is()) 568b0a7a3cfSSteve Yin { 569b0a7a3cfSSteve Yin if( pRHypertext->getHyperLinkCount() > 0 ) 570b0a7a3cfSSteve Yin m_dState |= STATE_SYSTEM_LINKED; 571b0a7a3cfSSteve Yin else 572b0a7a3cfSSteve Yin m_dState &= ~STATE_SYSTEM_LINKED; 573b0a7a3cfSSteve Yin } 574b0a7a3cfSSteve Yin else 575b0a7a3cfSSteve Yin m_dState &= ~STATE_SYSTEM_LINKED; 576b0a7a3cfSSteve Yin } 577b0a7a3cfSSteve Yin } 578b0a7a3cfSSteve Yin 579b0a7a3cfSSteve Yin VariantInit(pvarState); 580b0a7a3cfSSteve Yin pvarState->vt = VT_I4; 581b0a7a3cfSSteve Yin pvarState->lVal = m_dState; 582b0a7a3cfSSteve Yin return S_OK; 583b0a7a3cfSSteve Yin } 584b0a7a3cfSSteve Yin 585b0a7a3cfSSteve Yin long lVal = varChild.lVal; 586b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 587b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 588b0a7a3cfSSteve Yin if(!pChild) 589b0a7a3cfSSteve Yin return E_FAIL; 590b0a7a3cfSSteve Yin return pChild->get_accState(varChild,pvarState); 591b0a7a3cfSSteve Yin } 592b0a7a3cfSSteve Yin return S_FALSE; 593b0a7a3cfSSteve Yin 594b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 5955fdc4257SSteve Yin } 5965fdc4257SSteve Yin 5975fdc4257SSteve Yin /** 5985fdc4257SSteve Yin * Returns the accessible helpString of the current COM object self or its one child to AT. 5995fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 6005fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 6015fdc4257SSteve Yin * @param pszHelp, [in,out] use to return the helpString of the proper object. 6025fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 6035fdc4257SSteve Yin */ 6045fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accHelp(VARIANT, BSTR *) 6055fdc4257SSteve Yin { 606b0a7a3cfSSteve Yin return E_NOTIMPL; 6075fdc4257SSteve Yin } 6085fdc4257SSteve Yin 6095fdc4257SSteve Yin /** 6105fdc4257SSteve Yin * Returns the accessible HelpTopic of the current COM object self or its one child to AT. 6115fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 6125fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 6135fdc4257SSteve Yin * @param pszHelpFile, [in,out] use to return the HelpTopic of the proper object. 6145fdc4257SSteve Yin * @param pidTopic, use to return the HelpTopic ID of the proper object. 6155fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 6165fdc4257SSteve Yin * Not implemented yet 6175fdc4257SSteve Yin */ 6185fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accHelpTopic(BSTR *, VARIANT, long *) 6195fdc4257SSteve Yin { 620b0a7a3cfSSteve Yin return E_NOTIMPL; 6215fdc4257SSteve Yin } 6225fdc4257SSteve Yin 6235fdc4257SSteve Yin static void GetMnemonicChar( const ::rtl::OUString& aStr, WCHAR* wStr) 6245fdc4257SSteve Yin { 625b0a7a3cfSSteve Yin int nLen = aStr.pData->length; 626b0a7a3cfSSteve Yin int i = 0; 627b0a7a3cfSSteve Yin WCHAR* text = aStr.pData->buffer; 6285fdc4257SSteve Yin 629b0a7a3cfSSteve Yin while ( i < nLen ) 630b0a7a3cfSSteve Yin { 631b0a7a3cfSSteve Yin if ( text[i] == L'~' ) 632b0a7a3cfSSteve Yin if ( text[i+1] != L'~' ) 633b0a7a3cfSSteve Yin { 634b0a7a3cfSSteve Yin wStr[0] = text[i+1]; 635b0a7a3cfSSteve Yin break; 636b0a7a3cfSSteve Yin } 637b0a7a3cfSSteve Yin i++; 638b0a7a3cfSSteve Yin } 6395fdc4257SSteve Yin } 6405fdc4257SSteve Yin 6415fdc4257SSteve Yin /** 6425fdc4257SSteve Yin * Returns the accessible keyboard shortcut of the current COM object self or its one child to AT. 6435fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 6445fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 6455fdc4257SSteve Yin * @param pszKeyboardShortcut, [in,out] use to return the kbshortcut of the proper object. 6465fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 6475fdc4257SSteve Yin */ 6485fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accKeyboardShortcut(VARIANT varChild, BSTR *pszKeyboardShortcut) 6495fdc4257SSteve Yin { 650b0a7a3cfSSteve Yin 6515fdc4257SSteve Yin CHECK_ENABLE_INF 652b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 653b0a7a3cfSSteve Yin 654b0a7a3cfSSteve Yin ISDESTROY() 655b0a7a3cfSSteve Yin // #CHECK# 656b0a7a3cfSSteve Yin if(pszKeyboardShortcut == NULL) 657b0a7a3cfSSteve Yin { 658b0a7a3cfSSteve Yin return E_INVALIDARG; 659b0a7a3cfSSteve Yin } 660b0a7a3cfSSteve Yin 661b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 662b0a7a3cfSSteve Yin { 663b0a7a3cfSSteve Yin if(varChild.lVal == CHILDID_SELF) 664b0a7a3cfSSteve Yin { 665b0a7a3cfSSteve Yin if( pUNOInterface ) 666b0a7a3cfSSteve Yin { 667b0a7a3cfSSteve Yin Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext(); 668b0a7a3cfSSteve Yin if( !pRContext.is() ) 669b0a7a3cfSSteve Yin return S_FALSE; 670b0a7a3cfSSteve Yin 671b0a7a3cfSSteve Yin Reference<XAccessibleAction> pRXI(pRContext,UNO_QUERY); 672b0a7a3cfSSteve Yin 673b0a7a3cfSSteve Yin OLECHAR wString[64]={0}; 674b0a7a3cfSSteve Yin 675b0a7a3cfSSteve Yin if( pRXI.is() && pRXI->getAccessibleActionCount() >= 1) 676b0a7a3cfSSteve Yin { 677b0a7a3cfSSteve Yin Reference< XAccessibleKeyBinding > binding = pRXI->getAccessibleActionKeyBinding(0); 678b0a7a3cfSSteve Yin if( binding.is() ) 679b0a7a3cfSSteve Yin { 680b0a7a3cfSSteve Yin long nCount = binding->getAccessibleKeyBindingCount(); 681b0a7a3cfSSteve Yin if(nCount >= 1) 682b0a7a3cfSSteve Yin { 683b0a7a3cfSSteve Yin CAccAction::GetkeyBindingStrByXkeyBinding( binding->getAccessibleKeyBinding(0),wString ); 684b0a7a3cfSSteve Yin } 685b0a7a3cfSSteve Yin } 686b0a7a3cfSSteve Yin } 687b0a7a3cfSSteve Yin if(wString[0] == 0) 688b0a7a3cfSSteve Yin { 689b0a7a3cfSSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet(); 690b0a7a3cfSSteve Yin if(!pRrelationSet.is()) 6915fdc4257SSteve Yin { 692b0a7a3cfSSteve Yin return S_FALSE; 6935fdc4257SSteve Yin } 6945fdc4257SSteve Yin 695b0a7a3cfSSteve Yin long nRelCount = pRrelationSet->getRelationCount(); 696b0a7a3cfSSteve Yin 697b0a7a3cfSSteve Yin // Modified by Steve Yin, for SODC_1552 698b0a7a3cfSSteve Yin if( /*nRelCount <= 0 &&*/ m_iRole == ROLE_SYSTEM_TEXT ) 699b0a7a3cfSSteve Yin { 700b0a7a3cfSSteve Yin VARIANT varParentRole; 701b0a7a3cfSSteve Yin VariantInit( &varParentRole ); 7025fdc4257SSteve Yin 703b0a7a3cfSSteve Yin m_pIParent->get_accRole(varChild, &varParentRole); 7045fdc4257SSteve Yin 705b0a7a3cfSSteve Yin if( m_pIParent && varParentRole.lVal == ROLE_SYSTEM_COMBOBOX ) // edit in comoboBox 706b0a7a3cfSSteve Yin { 707b0a7a3cfSSteve Yin m_pIParent->get_accKeyboardShortcut(varChild, pszKeyboardShortcut); 708b0a7a3cfSSteve Yin return S_OK; 709b0a7a3cfSSteve Yin } 710b0a7a3cfSSteve Yin } 711b0a7a3cfSSteve Yin 712b0a7a3cfSSteve Yin AccessibleRelation *paccRelation = NULL; 713b0a7a3cfSSteve Yin AccessibleRelation accRelation; 714b0a7a3cfSSteve Yin for(int i=0; i<nRelCount ; i++) 715b0a7a3cfSSteve Yin { 716b0a7a3cfSSteve Yin if( pRrelationSet->getRelation(i).RelationType == 6 ) 717b0a7a3cfSSteve Yin { 718b0a7a3cfSSteve Yin accRelation = pRrelationSet->getRelation(i); 719b0a7a3cfSSteve Yin paccRelation = &accRelation; 720b0a7a3cfSSteve Yin } 721b0a7a3cfSSteve Yin } 7225fdc4257SSteve Yin 723b0a7a3cfSSteve Yin if(paccRelation == NULL) 724b0a7a3cfSSteve Yin return S_FALSE; 7255fdc4257SSteve Yin 726b0a7a3cfSSteve Yin Sequence< Reference< XInterface > > xTargets = paccRelation->TargetSet; 727b0a7a3cfSSteve Yin Reference<XInterface> pRAcc = xTargets[0]; 7285fdc4257SSteve Yin 729b0a7a3cfSSteve Yin XAccessible* pXAcc = (XAccessible*)pRAcc.get(); 730b0a7a3cfSSteve Yin 731b0a7a3cfSSteve Yin Reference<XAccessibleContext> pRLebelContext = pXAcc->getAccessibleContext(); 732b0a7a3cfSSteve Yin if(!pRLebelContext.is()) 733b0a7a3cfSSteve Yin return S_FALSE; 734b0a7a3cfSSteve Yin 735b0a7a3cfSSteve Yin pRrelationSet = pRLebelContext->getAccessibleRelationSet(); 736b0a7a3cfSSteve Yin nRelCount = pRrelationSet->getRelationCount(); 737b0a7a3cfSSteve Yin 738b0a7a3cfSSteve Yin paccRelation = NULL; 739b0a7a3cfSSteve Yin for(int j=0; j<nRelCount ; j++) 740b0a7a3cfSSteve Yin { 741b0a7a3cfSSteve Yin if( pRrelationSet->getRelation(j).RelationType == 5 ) 742b0a7a3cfSSteve Yin { 743b0a7a3cfSSteve Yin accRelation = pRrelationSet->getRelation(j); 744b0a7a3cfSSteve Yin paccRelation = &accRelation; 745b0a7a3cfSSteve Yin } 746b0a7a3cfSSteve Yin } 747b0a7a3cfSSteve Yin 748b0a7a3cfSSteve Yin if(paccRelation) 749b0a7a3cfSSteve Yin { 750b0a7a3cfSSteve Yin xTargets = paccRelation->TargetSet; 751b0a7a3cfSSteve Yin pRAcc = xTargets[0]; 752b0a7a3cfSSteve Yin if(pUNOInterface != (XAccessible*)pRAcc.get()) 753b0a7a3cfSSteve Yin return S_FALSE; 754b0a7a3cfSSteve Yin } 755b0a7a3cfSSteve Yin 756b0a7a3cfSSteve Yin Reference<XAccessibleExtendedComponent> pRXIE(pRLebelContext,UNO_QUERY); 757b0a7a3cfSSteve Yin if(!pRXIE.is()) 758b0a7a3cfSSteve Yin return S_FALSE; 759b0a7a3cfSSteve Yin 760b0a7a3cfSSteve Yin ::rtl::OUString ouStr = pRXIE->getTitledBorderText(); 761b0a7a3cfSSteve Yin WCHAR key[2] = {NULL}; 762b0a7a3cfSSteve Yin GetMnemonicChar(ouStr, key); 763b0a7a3cfSSteve Yin if(key[0] != 0) 7645fdc4257SSteve Yin { 765b0a7a3cfSSteve Yin wcscat(wString, L"Alt+"); 766b0a7a3cfSSteve Yin wcscat(wString, key); 7675fdc4257SSteve Yin } 768b0a7a3cfSSteve Yin else 769b0a7a3cfSSteve Yin return S_FALSE; 770b0a7a3cfSSteve Yin } 771b0a7a3cfSSteve Yin 772b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(*pszKeyboardShortcut); 773b0a7a3cfSSteve Yin *pszKeyboardShortcut = SysAllocString(wString); 774b0a7a3cfSSteve Yin 775b0a7a3cfSSteve Yin return S_OK; 776b0a7a3cfSSteve Yin } 777b0a7a3cfSSteve Yin else 778b0a7a3cfSSteve Yin { 779b0a7a3cfSSteve Yin return S_FALSE; 780b0a7a3cfSSteve Yin } 781b0a7a3cfSSteve Yin } 782b0a7a3cfSSteve Yin 783b0a7a3cfSSteve Yin long lVal = varChild.lVal; 784b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 785b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 786b0a7a3cfSSteve Yin if(!pChild) 787b0a7a3cfSSteve Yin return E_FAIL; 788b0a7a3cfSSteve Yin 789b0a7a3cfSSteve Yin return pChild->get_accKeyboardShortcut(varChild,pszKeyboardShortcut); 790b0a7a3cfSSteve Yin } 791b0a7a3cfSSteve Yin return S_FALSE; 792b0a7a3cfSSteve Yin 793b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 7945fdc4257SSteve Yin } 7955fdc4257SSteve Yin 7965fdc4257SSteve Yin /** 7975fdc4257SSteve Yin * Returns the current focused child to AT. 7985fdc4257SSteve Yin * @param pvarChild, [in,out] vt member of pvarChild must be VT_I4,and lVal member stores the child ID, 7995fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 8005fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 8015fdc4257SSteve Yin */ 8025fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accFocus(VARIANT *pvarChild) 8035fdc4257SSteve Yin { 8045fdc4257SSteve Yin 805b0a7a3cfSSteve Yin CHECK_ENABLE_INF 806b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 807b0a7a3cfSSteve Yin ISDESTROY() 808b0a7a3cfSSteve Yin // #CHECK# 809b0a7a3cfSSteve Yin if(pvarChild == NULL) 810b0a7a3cfSSteve Yin { 811b0a7a3cfSSteve Yin return E_INVALIDARG; 812b0a7a3cfSSteve Yin } 813b0a7a3cfSSteve Yin if( m_dFocusChildID==UACC_NO_FOCUS ) 814b0a7a3cfSSteve Yin { 815b0a7a3cfSSteve Yin pvarChild->vt = VT_EMPTY;//no focus on the object and its children 816b0a7a3cfSSteve Yin return S_OK; 817b0a7a3cfSSteve Yin } 818b0a7a3cfSSteve Yin //if the descendant of current object has focus indicated by m_dFocusChildID, return the IDispatch of this focused object 819b0a7a3cfSSteve Yin else 820b0a7a3cfSSteve Yin { 821b0a7a3cfSSteve Yin IMAccessible* pIMAcc = NULL; 822b0a7a3cfSSteve Yin g_pAgent->GetIAccessibleFromResID(m_dFocusChildID,&pIMAcc); 823b0a7a3cfSSteve Yin pIMAcc->AddRef(); 824b0a7a3cfSSteve Yin pvarChild->vt = VT_DISPATCH; 825b0a7a3cfSSteve Yin pvarChild->pdispVal = pIMAcc; 826b0a7a3cfSSteve Yin 827b0a7a3cfSSteve Yin } 828b0a7a3cfSSteve Yin return S_OK; 829b0a7a3cfSSteve Yin 830b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 8315fdc4257SSteve Yin } 8325fdc4257SSteve Yin 8335fdc4257SSteve Yin /** 8345fdc4257SSteve Yin * Returns the selection of the current COM object to AT. 8355fdc4257SSteve Yin * @param pvarChildren,[in,out] 8365fdc4257SSteve Yin * if selection num is 0,return VT_EMPTY for vt, 8375fdc4257SSteve Yin * if selection num is 1,return VT_I4 for vt,and child index for lVal 8385fdc4257SSteve Yin * if selection num >1,return VT_UNKNOWN for vt, and IEnumVariant* for punkVal 8395fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 8405fdc4257SSteve Yin */ 8415fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accSelection(VARIANT *pvarChildren) 8425fdc4257SSteve Yin { 843b0a7a3cfSSteve Yin 8445fdc4257SSteve Yin CHECK_ENABLE_INF 845b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 846b0a7a3cfSSteve Yin ISDESTROY() 847b0a7a3cfSSteve Yin // #CHECK# 848b0a7a3cfSSteve Yin if(pvarChildren == NULL) 849b0a7a3cfSSteve Yin { 850b0a7a3cfSSteve Yin return E_INVALIDARG; 851b0a7a3cfSSteve Yin } 852b0a7a3cfSSteve Yin switch(m_pEnumVar->GetCountOfElements()) 853b0a7a3cfSSteve Yin { 854b0a7a3cfSSteve Yin case 0: 855b0a7a3cfSSteve Yin pvarChildren->vt = VT_EMPTY; 856b0a7a3cfSSteve Yin break; 857b0a7a3cfSSteve Yin case 1: 858b0a7a3cfSSteve Yin VARIANT varTmp[1]; 859b0a7a3cfSSteve Yin ULONG count; 860b0a7a3cfSSteve Yin VariantInit(&varTmp[0]); 861b0a7a3cfSSteve Yin m_pEnumVar->Next(1,varTmp,&count); 862b0a7a3cfSSteve Yin if(count!=1) 863b0a7a3cfSSteve Yin return S_FALSE; 864b0a7a3cfSSteve Yin pvarChildren->vt = VT_I4; 865b0a7a3cfSSteve Yin pvarChildren->lVal = varTmp[0].lVal; 866b0a7a3cfSSteve Yin VariantClear(&varTmp[0]); 867b0a7a3cfSSteve Yin m_pEnumVar->Reset(); 868b0a7a3cfSSteve Yin break; 869b0a7a3cfSSteve Yin default: 870b0a7a3cfSSteve Yin pvarChildren->vt = VT_UNKNOWN; 871b0a7a3cfSSteve Yin m_pEnumVar->AddRef(); 872b0a7a3cfSSteve Yin pvarChildren->punkVal = m_pEnumVar; 873b0a7a3cfSSteve Yin break; 874b0a7a3cfSSteve Yin } 875b0a7a3cfSSteve Yin return S_OK; 876b0a7a3cfSSteve Yin 877b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 8785fdc4257SSteve Yin } 8795fdc4257SSteve Yin 8805fdc4257SSteve Yin /** 8815fdc4257SSteve Yin * Returns the location of the current COM object self or its one child to AT. 8825fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 8835fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 8845fdc4257SSteve Yin * @param pxLeft, [in,out] use to return the x-coordination of the proper object. 8855fdc4257SSteve Yin * @param pyTop, [in,out] use to return the y-coordination of the proper object. 8865fdc4257SSteve Yin * @param pcxWidth, [in,out] use to return the x-coordination width of the proper object. 8875fdc4257SSteve Yin * @param pcyHeight, [in,out] use to return the y-coordination height of the proper object. 8885fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 8895fdc4257SSteve Yin */ 8905fdc4257SSteve Yin STDMETHODIMP CMAccessible::accLocation(long *pxLeft, long *pyTop, long *pcxWidth, long *pcyHeight, VARIANT varChild) 8915fdc4257SSteve Yin { 892b0a7a3cfSSteve Yin 8935fdc4257SSteve Yin CHECK_ENABLE_INF 894b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 895b0a7a3cfSSteve Yin ISDESTROY() 896b0a7a3cfSSteve Yin // #CHECK# 897b0a7a3cfSSteve Yin if(pxLeft == NULL || pyTop == NULL || pcxWidth == NULL || pcyHeight == NULL) 898b0a7a3cfSSteve Yin { 899b0a7a3cfSSteve Yin return E_INVALIDARG; 900b0a7a3cfSSteve Yin } 901b0a7a3cfSSteve Yin 902b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 903b0a7a3cfSSteve Yin { 904b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 905b0a7a3cfSSteve Yin { 906b0a7a3cfSSteve Yin 907b0a7a3cfSSteve Yin if(pUNOInterface) 908b0a7a3cfSSteve Yin { 909b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext(); 910b0a7a3cfSSteve Yin if( !pRContext.is() ) 911b0a7a3cfSSteve Yin return S_FALSE; 912b0a7a3cfSSteve Yin Reference< XAccessibleComponent > pRComponent(pRContext,UNO_QUERY); 913b0a7a3cfSSteve Yin if( !pRComponent.is() ) 914b0a7a3cfSSteve Yin return S_FALSE; 915b0a7a3cfSSteve Yin 916b0a7a3cfSSteve Yin ::com::sun::star::awt::Point pCPoint = pRComponent->getLocationOnScreen(); 917b0a7a3cfSSteve Yin ::com::sun::star::awt::Size pCSize = pRComponent->getSize(); 918b0a7a3cfSSteve Yin *pxLeft = pCPoint.X; 919b0a7a3cfSSteve Yin *pyTop = pCPoint.Y; 920b0a7a3cfSSteve Yin *pcxWidth = pCSize.Width; 921b0a7a3cfSSteve Yin *pcyHeight = pCSize.Height; 922b0a7a3cfSSteve Yin return S_OK; 923b0a7a3cfSSteve Yin } 924b0a7a3cfSSteve Yin else 925b0a7a3cfSSteve Yin { 926b0a7a3cfSSteve Yin *pxLeft = m_sLocation.m_dLeft; 927b0a7a3cfSSteve Yin *pyTop = m_sLocation.m_dTop; 928b0a7a3cfSSteve Yin *pcxWidth = m_sLocation.m_dWidth; 929b0a7a3cfSSteve Yin *pcyHeight = m_sLocation.m_dHeight; 930b0a7a3cfSSteve Yin return S_OK; 931b0a7a3cfSSteve Yin } 932b0a7a3cfSSteve Yin } 933b0a7a3cfSSteve Yin 934b0a7a3cfSSteve Yin } 935b0a7a3cfSSteve Yin return S_FALSE; 936b0a7a3cfSSteve Yin 937b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 9385fdc4257SSteve Yin } 9395fdc4257SSteve Yin 9405fdc4257SSteve Yin /** 9415fdc4257SSteve Yin * Returns the current focused child to AT. 9425fdc4257SSteve Yin * @param navDir, the direction flag of the navigation. 9435fdc4257SSteve Yin * @param varStart, the start child id of this navigation action. 9445fdc4257SSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 9455fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 9465fdc4257SSteve Yin */ 9475fdc4257SSteve Yin STDMETHODIMP CMAccessible::accNavigate(long navDir, VARIANT varStart, VARIANT *pvarEndUpAt) 9485fdc4257SSteve Yin { 949b0a7a3cfSSteve Yin 9505fdc4257SSteve Yin CHECK_ENABLE_INF 951b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 952b0a7a3cfSSteve Yin ISDESTROY() 953b0a7a3cfSSteve Yin // #CHECK# 954b0a7a3cfSSteve Yin if(pvarEndUpAt == NULL) 955b0a7a3cfSSteve Yin { 956b0a7a3cfSSteve Yin return E_INVALIDARG; 957b0a7a3cfSSteve Yin } 958b0a7a3cfSSteve Yin HRESULT ret = E_FAIL; 959b0a7a3cfSSteve Yin switch (navDir) 960b0a7a3cfSSteve Yin { 961b0a7a3cfSSteve Yin case NAVDIR_FIRSTCHILD: 962b0a7a3cfSSteve Yin ret = GetFirstChild(varStart,pvarEndUpAt); 963b0a7a3cfSSteve Yin break; 964b0a7a3cfSSteve Yin case NAVDIR_LASTCHILD: 965b0a7a3cfSSteve Yin ret = GetLastChild(varStart,pvarEndUpAt); 966b0a7a3cfSSteve Yin break; 967b0a7a3cfSSteve Yin case NAVDIR_NEXT: 968b0a7a3cfSSteve Yin ret = GetNextSibling(varStart,pvarEndUpAt); 969b0a7a3cfSSteve Yin break; 970b0a7a3cfSSteve Yin case NAVDIR_PREVIOUS: 971b0a7a3cfSSteve Yin ret = GetPreSibling(varStart,pvarEndUpAt); 972b0a7a3cfSSteve Yin break; 973b0a7a3cfSSteve Yin case NAVDIR_DOWN://do not implement temporarily 974b0a7a3cfSSteve Yin break; 975b0a7a3cfSSteve Yin case NAVDIR_UP://do not implement temporarily 976b0a7a3cfSSteve Yin break; 977b0a7a3cfSSteve Yin case NAVDIR_LEFT://do not implement temporarily 978b0a7a3cfSSteve Yin break; 979b0a7a3cfSSteve Yin case NAVDIR_RIGHT://do not implement temporarily 980b0a7a3cfSSteve Yin break; 981b0a7a3cfSSteve Yin default: 982b0a7a3cfSSteve Yin break; 983b0a7a3cfSSteve Yin }; 984b0a7a3cfSSteve Yin return ret; 985b0a7a3cfSSteve Yin 986b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 9875fdc4257SSteve Yin } 9885fdc4257SSteve Yin 9895fdc4257SSteve Yin STDMETHODIMP CMAccessible::accHitTest(long xLeft, long yTop, VARIANT *pvarChild) 9905fdc4257SSteve Yin { 991b0a7a3cfSSteve Yin 9925fdc4257SSteve Yin CHECK_ENABLE_INF 993b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 994b0a7a3cfSSteve Yin ISDESTROY() 995b0a7a3cfSSteve Yin // #CHECK# 996b0a7a3cfSSteve Yin if(pvarChild == NULL) 997b0a7a3cfSSteve Yin { 998b0a7a3cfSSteve Yin return E_INVALIDARG; 999b0a7a3cfSSteve Yin } 1000b0a7a3cfSSteve Yin long x, y, w, h; 1001b0a7a3cfSSteve Yin VARIANT varSelf; 1002b0a7a3cfSSteve Yin VariantInit(&varSelf); 1003b0a7a3cfSSteve Yin varSelf.vt = VT_I4; 1004b0a7a3cfSSteve Yin varSelf.lVal = CHILDID_SELF; 1005b0a7a3cfSSteve Yin accLocation(&x,&y,&w,&h,varSelf); 1006b0a7a3cfSSteve Yin if( (x < xLeft && (x + w) >xLeft) && (y < yTop && (y + h) >yTop) ) 1007b0a7a3cfSSteve Yin { 1008b0a7a3cfSSteve Yin int i, nCount; 1009b0a7a3cfSSteve Yin pvarChild->vt = VT_EMPTY; 1010b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface); 1011b0a7a3cfSSteve Yin nCount = pRContext->getAccessibleChildCount(); 1012b0a7a3cfSSteve Yin if(nCount > 256) 1013b0a7a3cfSSteve Yin return E_FAIL; 1014b0a7a3cfSSteve Yin IMAccessible* child = NULL; 1015b0a7a3cfSSteve Yin for( i = 0; i<nCount; i++) 1016b0a7a3cfSSteve Yin { 1017b0a7a3cfSSteve Yin 1018b0a7a3cfSSteve Yin child = GetChildInterface(i + 1); 1019b0a7a3cfSSteve Yin if(child && child->accHitTest(xLeft,yTop,pvarChild) == S_OK) 1020b0a7a3cfSSteve Yin break; 1021b0a7a3cfSSteve Yin } 1022b0a7a3cfSSteve Yin 1023b0a7a3cfSSteve Yin if(pvarChild->vt == VT_DISPATCH) 1024b0a7a3cfSSteve Yin return S_OK; 1025b0a7a3cfSSteve Yin 1026b0a7a3cfSSteve Yin if( i < nCount) 1027b0a7a3cfSSteve Yin { 1028b0a7a3cfSSteve Yin pvarChild->vt = VT_DISPATCH; 1029b0a7a3cfSSteve Yin pvarChild->pdispVal = child; 1030b0a7a3cfSSteve Yin child->AddRef(); 1031b0a7a3cfSSteve Yin } 1032b0a7a3cfSSteve Yin else 1033b0a7a3cfSSteve Yin { 1034b0a7a3cfSSteve Yin pvarChild->vt = VT_I4; 1035b0a7a3cfSSteve Yin pvarChild->lVal = CHILDID_SELF; 1036b0a7a3cfSSteve Yin } 1037b0a7a3cfSSteve Yin return S_OK; 1038b0a7a3cfSSteve Yin } 1039b0a7a3cfSSteve Yin return S_FALSE; 1040b0a7a3cfSSteve Yin 1041b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 10425fdc4257SSteve Yin } 10435fdc4257SSteve Yin 10445fdc4257SSteve Yin /** 10455fdc4257SSteve Yin * Get The other Interface from CMAccessible. 10465fdc4257SSteve Yin * @param guidService, must be IID_IAccessible here. 10475fdc4257SSteve Yin * @param riid, the IID interface . 10485fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 10495fdc4257SSteve Yin */ 10505fdc4257SSteve Yin STDMETHODIMP CMAccessible::QueryService(REFGUID guidService, REFIID riid, void** ppvObject) 10515fdc4257SSteve Yin { 1052b0a7a3cfSSteve Yin if( InlineIsEqualGUID(guidService, IID_IAccessible) ) 1053b0a7a3cfSSteve Yin return QueryInterface(riid, ppvObject); 1054b0a7a3cfSSteve Yin return S_FALSE; 10555fdc4257SSteve Yin } 10565fdc4257SSteve Yin 10575fdc4257SSteve Yin /** 10585fdc4257SSteve Yin * Set the accessible name of the current COM object self or its one child from UNO. 10595fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 10605fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 10615fdc4257SSteve Yin * @param szName, the name used to set the name of the proper object. 10625fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 10635fdc4257SSteve Yin */ 10645fdc4257SSteve Yin STDMETHODIMP CMAccessible::put_accName(VARIANT varChild, BSTR szName) 10655fdc4257SSteve Yin { 1066b0a7a3cfSSteve Yin 1067b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1068b0a7a3cfSSteve Yin ISDESTROY() 1069b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 1070b0a7a3cfSSteve Yin { 1071b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 1072b0a7a3cfSSteve Yin { 1073b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(m_pszName); 1074b0a7a3cfSSteve Yin m_pszName=SysAllocString(szName); 1075b0a7a3cfSSteve Yin return S_OK; 1076b0a7a3cfSSteve Yin } 1077b0a7a3cfSSteve Yin 1078b0a7a3cfSSteve Yin long lVal = varChild.lVal; 1079b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 1080b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 1081b0a7a3cfSSteve Yin if(!pChild) 1082b0a7a3cfSSteve Yin return E_FAIL; 1083b0a7a3cfSSteve Yin return pChild->put_accName(varChild,szName); 1084b0a7a3cfSSteve Yin } 1085b0a7a3cfSSteve Yin return E_FAIL; 1086b0a7a3cfSSteve Yin 1087b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 10885fdc4257SSteve Yin } 10895fdc4257SSteve Yin 10905fdc4257SSteve Yin /** 10915fdc4257SSteve Yin * Set the accessible value of the current COM object self or its one child from UNO. 10925fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 10935fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 10945fdc4257SSteve Yin * @param szValue, the value used to set the value of the proper object. 10955fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 10965fdc4257SSteve Yin */ 10975fdc4257SSteve Yin STDMETHODIMP CMAccessible::put_accValue(VARIANT varChild, BSTR szValue) 10985fdc4257SSteve Yin { 1099b0a7a3cfSSteve Yin 1100b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1101b0a7a3cfSSteve Yin ISDESTROY() 1102b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 1103b0a7a3cfSSteve Yin { 1104b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 1105b0a7a3cfSSteve Yin { 1106b0a7a3cfSSteve Yin SysAllocString(m_pszValue); 1107b0a7a3cfSSteve Yin m_pszValue=SysAllocString(szValue); 1108b0a7a3cfSSteve Yin return S_OK; 1109b0a7a3cfSSteve Yin } 1110b0a7a3cfSSteve Yin 1111b0a7a3cfSSteve Yin long lVal = varChild.lVal; 1112b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 1113b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 1114b0a7a3cfSSteve Yin if(!pChild) 1115b0a7a3cfSSteve Yin return E_FAIL; 1116b0a7a3cfSSteve Yin return pChild->put_accValue(varChild,szValue); 1117b0a7a3cfSSteve Yin } 1118b0a7a3cfSSteve Yin return E_FAIL; 1119b0a7a3cfSSteve Yin 1120b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 11215fdc4257SSteve Yin } 11225fdc4257SSteve Yin 11235fdc4257SSteve Yin /** 11245fdc4257SSteve Yin * Set the accessible name of the current COM object self from UNO. 11255fdc4257SSteve Yin * @param pszName, the name value used to set the name of the current object. 11265fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11275fdc4257SSteve Yin */ 11285fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccName(const OLECHAR __RPC_FAR *pszName) 11295fdc4257SSteve Yin { 11305fdc4257SSteve Yin 1131b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1132b0a7a3cfSSteve Yin ISDESTROY() 1133b0a7a3cfSSteve Yin // #CHECK# 1134b0a7a3cfSSteve Yin if(pszName == NULL) 1135b0a7a3cfSSteve Yin { 1136b0a7a3cfSSteve Yin return E_INVALIDARG; 1137b0a7a3cfSSteve Yin } 1138b0a7a3cfSSteve Yin 1139b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(m_pszName);//?? 1140b0a7a3cfSSteve Yin m_pszName = SysAllocString(pszName); 1141b0a7a3cfSSteve Yin if(m_pszName==NULL) 1142b0a7a3cfSSteve Yin return E_FAIL; 1143b0a7a3cfSSteve Yin return S_OK; 11445fdc4257SSteve Yin 1145b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 11465fdc4257SSteve Yin } 11475fdc4257SSteve Yin 11485fdc4257SSteve Yin /** 11495fdc4257SSteve Yin * Set the accessible role of the current COM object self from UNO. 11505fdc4257SSteve Yin * @param pRole, the role value used to set the role of the current object. 11515fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11525fdc4257SSteve Yin */ 11535fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccRole(unsigned short pRole) 11545fdc4257SSteve Yin { 1155b0a7a3cfSSteve Yin m_iRole = pRole; 1156b0a7a3cfSSteve Yin return S_OK; 11575fdc4257SSteve Yin } 11585fdc4257SSteve Yin 11595fdc4257SSteve Yin /** 11605fdc4257SSteve Yin * Add one state into the current state set for the current COM object from UNO. 11615fdc4257SSteve Yin * @param pXSate, the state used to set the name of the current object. 11625fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11635fdc4257SSteve Yin */ 11645fdc4257SSteve Yin STDMETHODIMP CMAccessible::DecreaseState(DWORD pXSate) 11655fdc4257SSteve Yin { 1166b0a7a3cfSSteve Yin m_dState &= (~pXSate); 1167b0a7a3cfSSteve Yin return S_OK; 11685fdc4257SSteve Yin } 11695fdc4257SSteve Yin 11705fdc4257SSteve Yin /** 11715fdc4257SSteve Yin * Delete one state into the current state set for the current COM object from UNO. 11725fdc4257SSteve Yin * @param pXSate, the state used to set the name of the current object. 11735fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11745fdc4257SSteve Yin */ 11755fdc4257SSteve Yin STDMETHODIMP CMAccessible::IncreaseState(DWORD pXSate) 11765fdc4257SSteve Yin { 1177b0a7a3cfSSteve Yin m_dState |= pXSate; 1178b0a7a3cfSSteve Yin return S_OK; 11795fdc4257SSteve Yin } 11805fdc4257SSteve Yin 11815fdc4257SSteve Yin /** 11825fdc4257SSteve Yin * Set state into the current state set for the current COM object from UNO. 11835fdc4257SSteve Yin * @param pXSate, the state used to set the name of the current object. 11845fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11855fdc4257SSteve Yin */ 11865fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetState(DWORD pXSate) 11875fdc4257SSteve Yin { 1188b0a7a3cfSSteve Yin m_dState = pXSate; 1189b0a7a3cfSSteve Yin return S_OK; 11905fdc4257SSteve Yin } 11915fdc4257SSteve Yin 11925fdc4257SSteve Yin 11935fdc4257SSteve Yin 11945fdc4257SSteve Yin /** 11955fdc4257SSteve Yin * Set the accessible description of the current COM object self from UNO. 11965fdc4257SSteve Yin * @param pszDescription, the name used to set the description of the current object. 11975fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11985fdc4257SSteve Yin */ 11995fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccDescription(const OLECHAR __RPC_FAR *pszDescription) 12005fdc4257SSteve Yin { 12015fdc4257SSteve Yin 1202b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1203b0a7a3cfSSteve Yin ISDESTROY() 1204b0a7a3cfSSteve Yin // #CHECK# 1205b0a7a3cfSSteve Yin if(pszDescription == NULL) 1206b0a7a3cfSSteve Yin { 1207b0a7a3cfSSteve Yin return E_INVALIDARG; 1208b0a7a3cfSSteve Yin } 12095fdc4257SSteve Yin 1210b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(m_pszDescription); 1211b0a7a3cfSSteve Yin m_pszDescription = SysAllocString(pszDescription); 12125fdc4257SSteve Yin 1213b0a7a3cfSSteve Yin if(m_pszDescription==NULL) 1214b0a7a3cfSSteve Yin return E_FAIL; 1215b0a7a3cfSSteve Yin return S_OK; 1216b0a7a3cfSSteve Yin 1217b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 12185fdc4257SSteve Yin } 12195fdc4257SSteve Yin 12205fdc4257SSteve Yin /** 12215fdc4257SSteve Yin * Set the accessible value of the current COM object self from UNO. 12225fdc4257SSteve Yin * @param pszAccValue, the name used to set the value of the current object. 12235fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 12245fdc4257SSteve Yin */ 12255fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccValue(const OLECHAR __RPC_FAR *pszAccValue) 12265fdc4257SSteve Yin { 12275fdc4257SSteve Yin 1228b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1229b0a7a3cfSSteve Yin ISDESTROY() 1230b0a7a3cfSSteve Yin // #CHECK# 1231b0a7a3cfSSteve Yin if(pszAccValue == NULL) 1232b0a7a3cfSSteve Yin { 1233b0a7a3cfSSteve Yin return E_INVALIDARG; 1234b0a7a3cfSSteve Yin } 1235b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(m_pszValue); 1236b0a7a3cfSSteve Yin m_pszValue = SysAllocString(pszAccValue); 1237b0a7a3cfSSteve Yin if(m_pszValue==NULL) 1238b0a7a3cfSSteve Yin return E_FAIL; 1239b0a7a3cfSSteve Yin return S_OK; 1240b0a7a3cfSSteve Yin 1241b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 12425fdc4257SSteve Yin } 12435fdc4257SSteve Yin 12445fdc4257SSteve Yin /** 12455fdc4257SSteve Yin * Set the HWND value of the current COM object self from UNO. It should set the parent IAccessible 12465fdc4257SSteve Yin * Object through the method AccessibleObjectFromWindow(...). 12475fdc4257SSteve Yin * @param hwnd, the HWND used to set the value of the current object. 12485fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 12495fdc4257SSteve Yin */ 12505fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccWindowHandle(HWND hwnd) 12515fdc4257SSteve Yin { 12525fdc4257SSteve Yin 1253b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1254b0a7a3cfSSteve Yin ISDESTROY() 1255b0a7a3cfSSteve Yin m_hwnd = hwnd; 1256b0a7a3cfSSteve Yin return S_OK; 1257b0a7a3cfSSteve Yin 1258b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 12595fdc4257SSteve Yin } 12605fdc4257SSteve Yin 12615fdc4257SSteve Yin /** 12625fdc4257SSteve Yin * Set accessible focus by specifying child ID 12635fdc4257SSteve Yin * @param dChildID, the child id identifies the focus child. 12645fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 12655fdc4257SSteve Yin */ 12665fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccFocus(long dChildID) 12675fdc4257SSteve Yin { 12685fdc4257SSteve Yin 1269b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1270b0a7a3cfSSteve Yin ISDESTROY() 1271b0a7a3cfSSteve Yin 1272b0a7a3cfSSteve Yin if(dChildID==CHILDID_SELF) 1273b0a7a3cfSSteve Yin { 1274b0a7a3cfSSteve Yin if(m_pIParent) 1275b0a7a3cfSSteve Yin { 1276b0a7a3cfSSteve Yin m_pIParent->Put_XAccFocus(m_dChildID); 1277b0a7a3cfSSteve Yin } 1278b0a7a3cfSSteve Yin } 1279b0a7a3cfSSteve Yin else 1280b0a7a3cfSSteve Yin { 1281b0a7a3cfSSteve Yin m_dFocusChildID = dChildID; 1282b0a7a3cfSSteve Yin //traverse all ancestors to set the focused child ID so that when the get_accFocus is called on 1283b0a7a3cfSSteve Yin //any of the ancestors, this id can be used to get the IAccessible of focused object. 1284b0a7a3cfSSteve Yin if(m_pIParent) 1285b0a7a3cfSSteve Yin { 1286b0a7a3cfSSteve Yin m_pIParent->Put_XAccFocus(dChildID); 1287b0a7a3cfSSteve Yin } 1288b0a7a3cfSSteve Yin } 1289b0a7a3cfSSteve Yin return S_OK; 1290b0a7a3cfSSteve Yin 1291b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 12925fdc4257SSteve Yin } 12935fdc4257SSteve Yin 12945fdc4257SSteve Yin /** 1295b0a7a3cfSSteve Yin *Set accessible object location for the current COM object 1296b0a7a3cfSSteve Yin * @param sLocation, the location of the current object. 1297b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1298b0a7a3cfSSteve Yin */ 12995fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccLocation(const Location sLocation) 13005fdc4257SSteve Yin { 1301b0a7a3cfSSteve Yin 1302b0a7a3cfSSteve Yin this->m_sLocation = sLocation; 1303b0a7a3cfSSteve Yin return S_OK; 13045fdc4257SSteve Yin } 13055fdc4257SSteve Yin 13065fdc4257SSteve Yin /** 1307b0a7a3cfSSteve Yin * Set accessible parent object for the current COM object if 1308b0a7a3cfSSteve Yin * the current object is a child of some COM object 1309b0a7a3cfSSteve Yin * @param pIParent, the parent of the current object. 1310b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1311b0a7a3cfSSteve Yin */ 13125fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccParent(IMAccessible __RPC_FAR *pIParent) 13135fdc4257SSteve Yin { 1314b0a7a3cfSSteve Yin this->m_pIParent = pIParent; 13155fdc4257SSteve Yin 1316b0a7a3cfSSteve Yin if(pIParent) 1317b0a7a3cfSSteve Yin m_pIParent->AddRef(); 13185fdc4257SSteve Yin 1319b0a7a3cfSSteve Yin return S_OK; 13205fdc4257SSteve Yin } 13215fdc4257SSteve Yin 13225fdc4257SSteve Yin /** 1323b0a7a3cfSSteve Yin * Set unique child id to COM 1324b0a7a3cfSSteve Yin * @param dChildID, the id of the current object. 1325b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1326b0a7a3cfSSteve Yin */ 13275fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccChildID(long dChildID) 13285fdc4257SSteve Yin { 1329b0a7a3cfSSteve Yin 1330b0a7a3cfSSteve Yin this->m_dChildID = dChildID; 1331b0a7a3cfSSteve Yin return S_OK; 13325fdc4257SSteve Yin } 13335fdc4257SSteve Yin 13345fdc4257SSteve Yin /** 1335b0a7a3cfSSteve Yin * Set AccObjectManagerAgent object pointer to COM 1336b0a7a3cfSSteve Yin * @param pAgent, the AccObjectManagerAgent point. 1337b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1338b0a7a3cfSSteve Yin */ 13395fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccAgent(long pAgent) 13405fdc4257SSteve Yin { 1341b0a7a3cfSSteve Yin g_pAgent = (AccObjectManagerAgent*)pAgent; 1342b0a7a3cfSSteve Yin return S_OK; 13435fdc4257SSteve Yin } 13445fdc4257SSteve Yin 13455fdc4257SSteve Yin /** 1346b0a7a3cfSSteve Yin * When a UNO control disposing, it disposes its listeners, 1347b0a7a3cfSSteve Yin * then notify AccObject in bridge management, then notify 1348b0a7a3cfSSteve Yin * COM that the XAccessible is invalid,so set pUNOInterface as NULL 1349b0a7a3cfSSteve Yin * @param isDestroy, true is it need to be destroyed. 1350b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1351b0a7a3cfSSteve Yin */ 13525fdc4257SSteve Yin STDMETHODIMP CMAccessible::NotifyDestroy(BOOL isDestroy) 13535fdc4257SSteve Yin { 1354b0a7a3cfSSteve Yin 1355b0a7a3cfSSteve Yin m_isDestroy = isDestroy; 1356b0a7a3cfSSteve Yin pUNOInterface = NULL; 1357b0a7a3cfSSteve Yin return S_OK; 13585fdc4257SSteve Yin } 13595fdc4257SSteve Yin 13605fdc4257SSteve Yin /** 1361b0a7a3cfSSteve Yin *private methods that help implement public functions 1362b0a7a3cfSSteve Yin */ 13635fdc4257SSteve Yin 13645fdc4257SSteve Yin /** 1365b0a7a3cfSSteve Yin * Return child interface pointer by child ID,note: need to call AddRef() 1366b0a7a3cfSSteve Yin * @param lChildID, specify child index,which AT(such as Inspect32) gives. 1367b0a7a3cfSSteve Yin * @return IMAccessible*, pointer to the corresponding child object. 1368b0a7a3cfSSteve Yin */ 13695fdc4257SSteve Yin IMAccessible* CMAccessible::GetChildInterface(long dChildID)//for test 13705fdc4257SSteve Yin { 1371b0a7a3cfSSteve Yin 1372b0a7a3cfSSteve Yin long dChildIndex = 0; 1373b0a7a3cfSSteve Yin if(dChildID<0) 1374b0a7a3cfSSteve Yin { 1375b0a7a3cfSSteve Yin if(g_pAgent) 1376b0a7a3cfSSteve Yin { 1377b0a7a3cfSSteve Yin IMAccessible* pIMAcc = NULL; 1378b0a7a3cfSSteve Yin g_pAgent->GetIAccessibleFromResID(dChildID,&pIMAcc); 1379b0a7a3cfSSteve Yin return pIMAcc; 1380b0a7a3cfSSteve Yin } 1381b0a7a3cfSSteve Yin return NULL; 1382b0a7a3cfSSteve Yin } 1383b0a7a3cfSSteve Yin else 1384b0a7a3cfSSteve Yin { 1385b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext(); 1386b0a7a3cfSSteve Yin if( !pRContext.is() ) 1387b0a7a3cfSSteve Yin return NULL; 1388b0a7a3cfSSteve Yin 1389b0a7a3cfSSteve Yin if(dChildID<1 || dChildID>pRContext->getAccessibleChildCount()) 1390b0a7a3cfSSteve Yin return NULL; 1391b0a7a3cfSSteve Yin 1392b0a7a3cfSSteve Yin IAccessible* pChild = NULL; 1393b0a7a3cfSSteve Yin Reference< XAccessible > pXChild = pRContext->getAccessibleChild(dChildID-1); 1394b0a7a3cfSSteve Yin BOOL isGet = get_IAccessibleFromXAccessible((long)pXChild.get(),&pChild); 1395b0a7a3cfSSteve Yin 1396b0a7a3cfSSteve Yin if(!isGet) 1397b0a7a3cfSSteve Yin { 1398b0a7a3cfSSteve Yin g_pAgent->InsertAccObj(pXChild.get(),pUNOInterface,(long)m_hwnd); 1399b0a7a3cfSSteve Yin isGet = get_IAccessibleFromXAccessible((long)pXChild.get(),&pChild); 1400b0a7a3cfSSteve Yin } 1401b0a7a3cfSSteve Yin 1402b0a7a3cfSSteve Yin if(isGet) 1403b0a7a3cfSSteve Yin { 1404b0a7a3cfSSteve Yin IMAccessible* pIMAcc = (IMAccessible*)pChild; 1405b0a7a3cfSSteve Yin return pIMAcc; 1406b0a7a3cfSSteve Yin } 1407b0a7a3cfSSteve Yin } 1408b0a7a3cfSSteve Yin 1409b0a7a3cfSSteve Yin return NULL; 14105fdc4257SSteve Yin } 14115fdc4257SSteve Yin 14125fdc4257SSteve Yin /** 1413b0a7a3cfSSteve Yin * For List, tree and table,these roles belong to manage_decendant in UNO, 1414b0a7a3cfSSteve Yin * need to process specifically when navigate 1415b0a7a3cfSSteve Yin * @return BOOL, if it is decendantmanager, return true. 1416b0a7a3cfSSteve Yin */ 14175fdc4257SSteve Yin BOOL CMAccessible::IsDecendantManage() 14185fdc4257SSteve Yin { 1419b0a7a3cfSSteve Yin 1420b0a7a3cfSSteve Yin return (m_iRole==ROLE_SYSTEM_LIST)||(m_iRole==ROLE_SYSTEM_OUTLINE)||(m_iRole==ROLE_SYSTEM_TABLE); 14215fdc4257SSteve Yin } 14225fdc4257SSteve Yin 14235fdc4257SSteve Yin /** 1424b0a7a3cfSSteve Yin * for decendantmanager circumstance,provide child interface when navigate 1425b0a7a3cfSSteve Yin * @param varCur, the current child. 1426b0a7a3cfSSteve Yin * @param flags, the navigation direction. 1427b0a7a3cfSSteve Yin * @return IMAccessible*, the child of the end up node. 1428b0a7a3cfSSteve Yin */ 14295fdc4257SSteve Yin IMAccessible* CMAccessible::GetNavigateChildForDM(VARIANT varCur, short flags) 14305fdc4257SSteve Yin { 1431b0a7a3cfSSteve Yin 1432b0a7a3cfSSteve Yin XAccessibleContext* pXContext = GetContextByXAcc(pUNOInterface); 1433b0a7a3cfSSteve Yin if(pXContext==NULL) 1434b0a7a3cfSSteve Yin { 1435b0a7a3cfSSteve Yin return NULL; 1436b0a7a3cfSSteve Yin } 1437b0a7a3cfSSteve Yin 1438b0a7a3cfSSteve Yin int count = pXContext->getAccessibleChildCount(); 1439b0a7a3cfSSteve Yin if(count<1) 1440b0a7a3cfSSteve Yin { 1441b0a7a3cfSSteve Yin return NULL; 1442b0a7a3cfSSteve Yin } 1443b0a7a3cfSSteve Yin 1444b0a7a3cfSSteve Yin IMAccessible* pCurChild = NULL; 1445b0a7a3cfSSteve Yin XAccessible* pChildXAcc = NULL; 1446b0a7a3cfSSteve Yin Reference<XAccessible> pRChildXAcc; 1447b0a7a3cfSSteve Yin XAccessibleContext* pChildContext = NULL; 1448b0a7a3cfSSteve Yin int index = 0,delta=0; 1449b0a7a3cfSSteve Yin switch(flags) 1450b0a7a3cfSSteve Yin { 1451b0a7a3cfSSteve Yin case DM_FIRSTCHILD: 1452b0a7a3cfSSteve Yin pRChildXAcc = pXContext->getAccessibleChild(0); 1453b0a7a3cfSSteve Yin break; 1454b0a7a3cfSSteve Yin case DM_LASTCHILD: 1455b0a7a3cfSSteve Yin pRChildXAcc = pXContext->getAccessibleChild(count-1); 1456b0a7a3cfSSteve Yin break; 1457b0a7a3cfSSteve Yin case DM_NEXTCHILD: 1458b0a7a3cfSSteve Yin case DM_PREVCHILD: 1459b0a7a3cfSSteve Yin pCurChild = GetChildInterface(varCur.lVal); 1460b0a7a3cfSSteve Yin if(pCurChild==NULL) 1461b0a7a3cfSSteve Yin { 1462b0a7a3cfSSteve Yin return NULL; 1463b0a7a3cfSSteve Yin } 1464b0a7a3cfSSteve Yin pCurChild->GetUNOInterface((long*)&pChildXAcc); 1465b0a7a3cfSSteve Yin if(pChildXAcc==NULL) 1466b0a7a3cfSSteve Yin { 1467b0a7a3cfSSteve Yin return NULL; 1468b0a7a3cfSSteve Yin } 1469b0a7a3cfSSteve Yin pChildContext = GetContextByXAcc(pChildXAcc); 1470b0a7a3cfSSteve Yin if(pChildContext == NULL) 1471b0a7a3cfSSteve Yin { 1472b0a7a3cfSSteve Yin return NULL; 1473b0a7a3cfSSteve Yin } 1474b0a7a3cfSSteve Yin delta = (flags==DM_NEXTCHILD)?1:-1; 1475b0a7a3cfSSteve Yin //currently, getAccessibleIndexInParent is error in UNO for 1476b0a7a3cfSSteve Yin //some kind of List,such as ValueSet, the index will be less 1 than 1477b0a7a3cfSSteve Yin //what should be, need to fix UNO code 1478b0a7a3cfSSteve Yin index = pChildContext->getAccessibleIndexInParent()+delta; 1479b0a7a3cfSSteve Yin if((index>=0)&&(index<=count-1)) 1480b0a7a3cfSSteve Yin { 1481b0a7a3cfSSteve Yin pRChildXAcc = pXContext->getAccessibleChild(index); 1482b0a7a3cfSSteve Yin } 1483b0a7a3cfSSteve Yin break; 1484b0a7a3cfSSteve Yin default: 1485b0a7a3cfSSteve Yin break; 1486b0a7a3cfSSteve Yin } 1487b0a7a3cfSSteve Yin 1488b0a7a3cfSSteve Yin if(!pRChildXAcc.is()) 1489b0a7a3cfSSteve Yin { 1490b0a7a3cfSSteve Yin return NULL; 1491b0a7a3cfSSteve Yin } 1492b0a7a3cfSSteve Yin pChildXAcc = pRChildXAcc.get(); 1493b0a7a3cfSSteve Yin g_pAgent->InsertAccObj(pChildXAcc,pUNOInterface); 1494b0a7a3cfSSteve Yin return g_pAgent->GetIMAccByXAcc(pChildXAcc); 14955fdc4257SSteve Yin } 14965fdc4257SSteve Yin 14975fdc4257SSteve Yin /** 1498b0a7a3cfSSteve Yin *the following 4 private methods are for accNavigate implementation 1499b0a7a3cfSSteve Yin */ 15005fdc4257SSteve Yin 15015fdc4257SSteve Yin /** 1502b0a7a3cfSSteve Yin * Return first child for parent container, process differently according 1503b0a7a3cfSSteve Yin * to whether it is decendant manage 1504b0a7a3cfSSteve Yin * @param varStart, the start child id of this navigation action. 1505b0a7a3cfSSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 1506b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1507b0a7a3cfSSteve Yin */ 15085fdc4257SSteve Yin HRESULT CMAccessible::GetFirstChild(VARIANT varStart,VARIANT* pvarEndUpAt) 15095fdc4257SSteve Yin { 1510b0a7a3cfSSteve Yin 1511b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1512b0a7a3cfSSteve Yin ISDESTROY() 1513b0a7a3cfSSteve Yin // #CHECK# 1514b0a7a3cfSSteve Yin if(pvarEndUpAt == NULL) 1515b0a7a3cfSSteve Yin { 1516b0a7a3cfSSteve Yin return E_INVALIDARG; 1517b0a7a3cfSSteve Yin } 1518b0a7a3cfSSteve Yin if(varStart.vt != VT_I4) 1519b0a7a3cfSSteve Yin { 1520b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1521b0a7a3cfSSteve Yin return E_INVALIDARG; 1522b0a7a3cfSSteve Yin } 1523b0a7a3cfSSteve Yin 1524b0a7a3cfSSteve Yin pvarEndUpAt->pdispVal = GetNavigateChildForDM(varStart, DM_FIRSTCHILD); 1525b0a7a3cfSSteve Yin if(pvarEndUpAt->pdispVal) 1526b0a7a3cfSSteve Yin { 1527b0a7a3cfSSteve Yin pvarEndUpAt->pdispVal->AddRef(); 1528b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_DISPATCH; 1529b0a7a3cfSSteve Yin return S_OK; 1530b0a7a3cfSSteve Yin } 1531b0a7a3cfSSteve Yin 1532b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1533b0a7a3cfSSteve Yin return E_FAIL; 1534b0a7a3cfSSteve Yin 1535b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 15365fdc4257SSteve Yin } 15375fdc4257SSteve Yin 15385fdc4257SSteve Yin /** 1539b0a7a3cfSSteve Yin * Return last child for parent container, process differently according 1540b0a7a3cfSSteve Yin * to whether it is decendant manage 1541b0a7a3cfSSteve Yin * @param varStart, the start child id of this navigation action. 1542b0a7a3cfSSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 1543b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1544b0a7a3cfSSteve Yin */ 15455fdc4257SSteve Yin HRESULT CMAccessible::GetLastChild(VARIANT varStart,VARIANT* pvarEndUpAt) 15465fdc4257SSteve Yin { 1547b0a7a3cfSSteve Yin 1548b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1549b0a7a3cfSSteve Yin ISDESTROY() 1550b0a7a3cfSSteve Yin // #CHECK# 1551b0a7a3cfSSteve Yin if(pvarEndUpAt == NULL) 1552b0a7a3cfSSteve Yin { 1553b0a7a3cfSSteve Yin return E_INVALIDARG; 1554b0a7a3cfSSteve Yin } 1555b0a7a3cfSSteve Yin if(varStart.vt != VT_I4) 1556b0a7a3cfSSteve Yin { 1557b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1558b0a7a3cfSSteve Yin return E_INVALIDARG; 1559b0a7a3cfSSteve Yin } 1560b0a7a3cfSSteve Yin 1561b0a7a3cfSSteve Yin pvarEndUpAt->pdispVal = GetNavigateChildForDM(varStart, DM_LASTCHILD); 1562b0a7a3cfSSteve Yin if(pvarEndUpAt->pdispVal) 1563b0a7a3cfSSteve Yin { 1564b0a7a3cfSSteve Yin pvarEndUpAt->pdispVal->AddRef(); 1565b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_DISPATCH; 1566b0a7a3cfSSteve Yin return S_OK; 1567b0a7a3cfSSteve Yin } 1568b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1569b0a7a3cfSSteve Yin return E_FAIL; 1570b0a7a3cfSSteve Yin 1571b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 15725fdc4257SSteve Yin } 15735fdc4257SSteve Yin 15745fdc4257SSteve Yin /** 1575b0a7a3cfSSteve Yin * The method GetNextSibling is general, whatever it is decendant manage or not 1576b0a7a3cfSSteve Yin * Get the next sibling object. 1577b0a7a3cfSSteve Yin * @param varStart, the start child id of this navigation action. 1578b0a7a3cfSSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 1579b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1580b0a7a3cfSSteve Yin */ 15815fdc4257SSteve Yin HRESULT CMAccessible::GetNextSibling(VARIANT varStart,VARIANT* pvarEndUpAt) 15825fdc4257SSteve Yin { 1583b0a7a3cfSSteve Yin 1584b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1585b0a7a3cfSSteve Yin ISDESTROY() 1586b0a7a3cfSSteve Yin if(varStart.vt != VT_I4) 1587b0a7a3cfSSteve Yin { 1588b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1589b0a7a3cfSSteve Yin return E_INVALIDARG; 1590b0a7a3cfSSteve Yin } 1591b0a7a3cfSSteve Yin 1592b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface); 1593b0a7a3cfSSteve Yin if(pRContext.is()) 1594b0a7a3cfSSteve Yin { 1595b0a7a3cfSSteve Yin varStart.iVal = sal_Int16(pRContext->getAccessibleIndexInParent() + 2); 1596b0a7a3cfSSteve Yin if(m_pIParent) 1597b0a7a3cfSSteve Yin if( m_pIParent->get_accChild(varStart,&pvarEndUpAt->pdispVal) == S_OK) 1598b0a7a3cfSSteve Yin { 1599b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_DISPATCH; 1600b0a7a3cfSSteve Yin return S_OK; 1601b0a7a3cfSSteve Yin } 1602b0a7a3cfSSteve Yin } 1603b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1604b0a7a3cfSSteve Yin return E_FAIL; 1605b0a7a3cfSSteve Yin 1606b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 16075fdc4257SSteve Yin } 16085fdc4257SSteve Yin 16095fdc4257SSteve Yin /** 1610b0a7a3cfSSteve Yin *the method GetPreSibling is general, whatever it is decendant manage or not 1611b0a7a3cfSSteve Yin * @param varStart, the start child id of this navigation action. 1612b0a7a3cfSSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 1613b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1614b0a7a3cfSSteve Yin */ 16155fdc4257SSteve Yin HRESULT CMAccessible::GetPreSibling(VARIANT varStart,VARIANT* pvarEndUpAt) 16165fdc4257SSteve Yin { 1617b0a7a3cfSSteve Yin 1618b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1619b0a7a3cfSSteve Yin ISDESTROY() 1620b0a7a3cfSSteve Yin // #CHECK# 1621b0a7a3cfSSteve Yin if(pvarEndUpAt == NULL) 1622b0a7a3cfSSteve Yin { 1623b0a7a3cfSSteve Yin return E_INVALIDARG; 1624b0a7a3cfSSteve Yin } 1625b0a7a3cfSSteve Yin if(varStart.vt != VT_I4) 1626b0a7a3cfSSteve Yin { 1627b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1628b0a7a3cfSSteve Yin return E_INVALIDARG; 1629b0a7a3cfSSteve Yin } 1630b0a7a3cfSSteve Yin 1631b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface); 1632b0a7a3cfSSteve Yin if(pRContext.is()) 1633b0a7a3cfSSteve Yin { 1634b0a7a3cfSSteve Yin varStart.iVal = sal_Int16(pRContext->getAccessibleIndexInParent()); 1635b0a7a3cfSSteve Yin if(m_pIParent && varStart.iVal > 0) 1636b0a7a3cfSSteve Yin if( m_pIParent->get_accChild(varStart,&pvarEndUpAt->pdispVal) == S_OK) 1637b0a7a3cfSSteve Yin { 1638b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_DISPATCH; 1639b0a7a3cfSSteve Yin return S_OK; 1640b0a7a3cfSSteve Yin } 1641b0a7a3cfSSteve Yin } 1642b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1643b0a7a3cfSSteve Yin return E_FAIL; 1644b0a7a3cfSSteve Yin 1645b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 16465fdc4257SSteve Yin } 16475fdc4257SSteve Yin 16485fdc4257SSteve Yin /** 1649b0a7a3cfSSteve Yin * For IAccessible2 implementation methods 1650b0a7a3cfSSteve Yin */ 16515fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_nRelations( long __RPC_FAR *nRelations) 16525fdc4257SSteve Yin { 1653b0a7a3cfSSteve Yin 16545fdc4257SSteve Yin CHECK_ENABLE_INF 1655b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 16565fdc4257SSteve Yin 1657b0a7a3cfSSteve Yin // #CHECK# 1658b0a7a3cfSSteve Yin if(nRelations == NULL) 1659b0a7a3cfSSteve Yin { 1660b0a7a3cfSSteve Yin return E_INVALIDARG; 1661b0a7a3cfSSteve Yin } 16625fdc4257SSteve Yin 1663b0a7a3cfSSteve Yin *nRelations = 0; 16645fdc4257SSteve Yin 1665b0a7a3cfSSteve Yin if( !pRContext.is() ) 1666b0a7a3cfSSteve Yin return E_FAIL; 1667b0a7a3cfSSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet(); 1668b0a7a3cfSSteve Yin if(!pRrelationSet.is()) 1669b0a7a3cfSSteve Yin { 1670b0a7a3cfSSteve Yin *nRelations = 0; 1671b0a7a3cfSSteve Yin return S_OK; 1672b0a7a3cfSSteve Yin } 16735fdc4257SSteve Yin 1674b0a7a3cfSSteve Yin *nRelations = pRrelationSet->getRelationCount(); 1675b0a7a3cfSSteve Yin return S_OK; 16765fdc4257SSteve Yin 1677b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 16785fdc4257SSteve Yin } 16795fdc4257SSteve Yin 16805fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_relation( long relationIndex, IAccessibleRelation __RPC_FAR *__RPC_FAR *relation) 16815fdc4257SSteve Yin { 1682b0a7a3cfSSteve Yin 16835fdc4257SSteve Yin CHECK_ENABLE_INF 1684b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1685b0a7a3cfSSteve Yin ISDESTROY() 1686b0a7a3cfSSteve Yin // #CHECK# 1687b0a7a3cfSSteve Yin if(relation == NULL) 1688b0a7a3cfSSteve Yin { 1689b0a7a3cfSSteve Yin return E_INVALIDARG; 1690b0a7a3cfSSteve Yin } 16915fdc4257SSteve Yin 1692b0a7a3cfSSteve Yin if( !pRContext.is() ) 1693b0a7a3cfSSteve Yin return E_FAIL; 16945fdc4257SSteve Yin 16955fdc4257SSteve Yin 1696b0a7a3cfSSteve Yin long nMax = 0; 1697b0a7a3cfSSteve Yin long nReal = 0; 1698b0a7a3cfSSteve Yin get_nRelations(&nMax); 16995fdc4257SSteve Yin 1700b0a7a3cfSSteve Yin *relation = (IAccessibleRelation*)::CoTaskMemAlloc(sizeof(IAccessibleRelation)); 17015fdc4257SSteve Yin 1702b0a7a3cfSSteve Yin // #CHECK Memory Allocation# 1703b0a7a3cfSSteve Yin if(*relation == NULL) 1704b0a7a3cfSSteve Yin { 1705b0a7a3cfSSteve Yin return E_FAIL; 1706b0a7a3cfSSteve Yin } 17075fdc4257SSteve Yin 1708b0a7a3cfSSteve Yin if( relationIndex < nMax ) 1709b0a7a3cfSSteve Yin { 17105fdc4257SSteve Yin 17115fdc4257SSteve Yin 1712b0a7a3cfSSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet(); 1713b0a7a3cfSSteve Yin if(!pRrelationSet.is()) 1714b0a7a3cfSSteve Yin { 17155fdc4257SSteve Yin 1716b0a7a3cfSSteve Yin return E_FAIL; 1717b0a7a3cfSSteve Yin } 17185fdc4257SSteve Yin 1719b0a7a3cfSSteve Yin IAccessibleRelation* pRelation = NULL; 1720b0a7a3cfSSteve Yin ActivateActContext(); 1721b0a7a3cfSSteve Yin HRESULT hr = CoCreateInstance( CLSID_AccRelation, NULL, CLSCTX_SERVER , 1722b0a7a3cfSSteve Yin IID_IAccessibleRelation, 1723b0a7a3cfSSteve Yin (void **)&pRelation); 1724b0a7a3cfSSteve Yin DeactivateActContext(); 1725b0a7a3cfSSteve Yin if(SUCCEEDED(hr)) 1726b0a7a3cfSSteve Yin { 1727b0a7a3cfSSteve Yin IUNOXWrapper* wrapper = NULL; 1728b0a7a3cfSSteve Yin hr = pRelation->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper); 1729b0a7a3cfSSteve Yin if(SUCCEEDED(hr)) 1730b0a7a3cfSSteve Yin { 1731b0a7a3cfSSteve Yin AccessibleRelation accRelation = pRrelationSet->getRelation(relationIndex); 1732b0a7a3cfSSteve Yin wrapper->put_XSubInterface((long)&accRelation); 1733b0a7a3cfSSteve Yin wrapper->Release(); 1734b0a7a3cfSSteve Yin *relation = pRelation; 1735b0a7a3cfSSteve Yin return S_OK; 1736b0a7a3cfSSteve Yin } 17375fdc4257SSteve Yin 1738b0a7a3cfSSteve Yin } 1739b0a7a3cfSSteve Yin } 17405fdc4257SSteve Yin 1741b0a7a3cfSSteve Yin return E_FAIL; 17425fdc4257SSteve Yin 1743b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 17445fdc4257SSteve Yin } 17455fdc4257SSteve Yin 17465fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_relations( long, IAccessibleRelation __RPC_FAR *__RPC_FAR *relation, long __RPC_FAR *nRelations) 17475fdc4257SSteve Yin { 1748b0a7a3cfSSteve Yin 17495fdc4257SSteve Yin CHECK_ENABLE_INF 1750b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1751b0a7a3cfSSteve Yin 1752b0a7a3cfSSteve Yin // #CHECK# 1753b0a7a3cfSSteve Yin if(relation == NULL || nRelations == NULL) 1754b0a7a3cfSSteve Yin { 1755b0a7a3cfSSteve Yin return E_INVALIDARG; 1756b0a7a3cfSSteve Yin } 1757b0a7a3cfSSteve Yin // #CHECK XInterface# 1758b0a7a3cfSSteve Yin 1759b0a7a3cfSSteve Yin if( !pRContext.is() ) 1760b0a7a3cfSSteve Yin return E_FAIL; 1761b0a7a3cfSSteve Yin 1762b0a7a3cfSSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet(); 1763b0a7a3cfSSteve Yin if(!pRrelationSet.is()) 1764b0a7a3cfSSteve Yin { 1765b0a7a3cfSSteve Yin *nRelations = 0; 1766b0a7a3cfSSteve Yin return S_OK; 1767b0a7a3cfSSteve Yin } 1768b0a7a3cfSSteve Yin 1769b0a7a3cfSSteve Yin long nCount = pRrelationSet->getRelationCount(); 1770b0a7a3cfSSteve Yin 1771b0a7a3cfSSteve Yin *relation = (IAccessibleRelation*)::CoTaskMemAlloc(nCount*sizeof(IAccessibleRelation)); 1772b0a7a3cfSSteve Yin 1773b0a7a3cfSSteve Yin // #CHECK Memory Allocation# 1774b0a7a3cfSSteve Yin if(*relation == NULL) 1775b0a7a3cfSSteve Yin { 1776b0a7a3cfSSteve Yin return E_FAIL; 1777b0a7a3cfSSteve Yin } 1778b0a7a3cfSSteve Yin 1779b0a7a3cfSSteve Yin for(int i=0; i<nCount ; i++) 1780b0a7a3cfSSteve Yin { 1781b0a7a3cfSSteve Yin IAccessibleRelation* pRelation = NULL; 1782b0a7a3cfSSteve Yin ActivateActContext(); 1783b0a7a3cfSSteve Yin HRESULT hr = CoCreateInstance( CLSID_AccRelation, NULL, CLSCTX_SERVER , 1784b0a7a3cfSSteve Yin IID_IAccessibleRelation, 1785b0a7a3cfSSteve Yin (void **)&pRelation); 1786b0a7a3cfSSteve Yin DeactivateActContext(); 1787b0a7a3cfSSteve Yin if(SUCCEEDED(hr)) 1788b0a7a3cfSSteve Yin { 1789b0a7a3cfSSteve Yin IUNOXWrapper* wrapper = NULL; 1790b0a7a3cfSSteve Yin hr = pRelation->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper); 1791b0a7a3cfSSteve Yin if(SUCCEEDED(hr)) 1792b0a7a3cfSSteve Yin { 1793b0a7a3cfSSteve Yin AccessibleRelation accRelation = pRrelationSet->getRelation(i); 1794b0a7a3cfSSteve Yin wrapper->put_XSubInterface((long)&accRelation); 1795b0a7a3cfSSteve Yin wrapper->Release(); 1796b0a7a3cfSSteve Yin } 1797b0a7a3cfSSteve Yin (relation)[i] = pRelation; 1798b0a7a3cfSSteve Yin } 1799b0a7a3cfSSteve Yin } 1800b0a7a3cfSSteve Yin 1801b0a7a3cfSSteve Yin *nRelations = nCount; 1802b0a7a3cfSSteve Yin return S_OK; 1803b0a7a3cfSSteve Yin 1804b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 18055fdc4257SSteve Yin } 18065fdc4257SSteve Yin 18075fdc4257SSteve Yin STDMETHODIMP CMAccessible::role(long __RPC_FAR *role) 18085fdc4257SSteve Yin { 1809b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 18105fdc4257SSteve Yin 1811b0a7a3cfSSteve Yin (*role) = m_iRole; 18125fdc4257SSteve Yin 1813b0a7a3cfSSteve Yin return S_OK; 18145fdc4257SSteve Yin 1815b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 18165fdc4257SSteve Yin } 18175fdc4257SSteve Yin 18185fdc4257SSteve Yin 18195fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_nActions(long __RPC_FAR *nActions) 18205fdc4257SSteve Yin { 1821b0a7a3cfSSteve Yin 1822b0a7a3cfSSteve Yin try 1823b0a7a3cfSSteve Yin { 1824b0a7a3cfSSteve Yin ISDESTROY() 1825b0a7a3cfSSteve Yin // #CHECK# 1826b0a7a3cfSSteve Yin if(nActions == NULL) 1827b0a7a3cfSSteve Yin { 1828b0a7a3cfSSteve Yin return E_INVALIDARG; 1829b0a7a3cfSSteve Yin } 1830b0a7a3cfSSteve Yin *nActions = 0L; 1831b0a7a3cfSSteve Yin IAccessibleAction* pAcc = NULL; 1832b0a7a3cfSSteve Yin HRESULT hr = QueryInterface(IID_IAccessibleAction, (void**)&pAcc); 1833b0a7a3cfSSteve Yin if( hr == S_OK ) 1834b0a7a3cfSSteve Yin { 1835b0a7a3cfSSteve Yin pAcc->nActions(nActions); 1836b0a7a3cfSSteve Yin pAcc->Release(); 1837b0a7a3cfSSteve Yin } 1838b0a7a3cfSSteve Yin 1839b0a7a3cfSSteve Yin return S_OK; 1840b0a7a3cfSSteve Yin } 1841b0a7a3cfSSteve Yin catch(...) 1842b0a7a3cfSSteve Yin { 1843b0a7a3cfSSteve Yin *nActions = 0L; 1844b0a7a3cfSSteve Yin return S_OK; 1845b0a7a3cfSSteve Yin } 18465fdc4257SSteve Yin } 18475fdc4257SSteve Yin 18485fdc4257SSteve Yin 18495fdc4257SSteve Yin STDMETHODIMP CMAccessible:: scrollToPoint(enum IA2CoordinateType, long, long) 18505fdc4257SSteve Yin { 1851b0a7a3cfSSteve Yin 1852b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1853b0a7a3cfSSteve Yin ISDESTROY() 1854b0a7a3cfSSteve Yin return E_NOTIMPL; 1855b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 18565fdc4257SSteve Yin 18575fdc4257SSteve Yin } 18585fdc4257SSteve Yin STDMETHODIMP CMAccessible:: scrollTo(enum IA2ScrollType) 18595fdc4257SSteve Yin { 18605fdc4257SSteve Yin 1861b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1862b0a7a3cfSSteve Yin ISDESTROY() 1863b0a7a3cfSSteve Yin 1864b0a7a3cfSSteve Yin return E_NOTIMPL; 18655fdc4257SSteve Yin 1866b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 18675fdc4257SSteve Yin } 18685fdc4257SSteve Yin 18695fdc4257SSteve Yin static XAccessible* getTheParentOfMember(XAccessible* pXAcc) 18705fdc4257SSteve Yin { 1871b0a7a3cfSSteve Yin // #CHECK# 1872b0a7a3cfSSteve Yin if(pXAcc == NULL) 1873b0a7a3cfSSteve Yin { 1874b0a7a3cfSSteve Yin return NULL; 1875b0a7a3cfSSteve Yin } 1876b0a7a3cfSSteve Yin Reference<XAccessibleContext> pRContext = pXAcc->getAccessibleContext(); 1877b0a7a3cfSSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet(); 1878b0a7a3cfSSteve Yin long nRelations = pRrelationSet->getRelationCount(); 1879b0a7a3cfSSteve Yin for(int i=0 ; i<nRelations ; i++) 1880b0a7a3cfSSteve Yin { 1881b0a7a3cfSSteve Yin AccessibleRelation accRelation = pRrelationSet->getRelation(i); 1882b0a7a3cfSSteve Yin if(accRelation.RelationType == 7) 1883b0a7a3cfSSteve Yin { 1884b0a7a3cfSSteve Yin Sequence< Reference< XInterface > > xTargets = accRelation.TargetSet; 1885b0a7a3cfSSteve Yin return (XAccessible*)xTargets[0].get(); 1886b0a7a3cfSSteve Yin } 1887b0a7a3cfSSteve Yin } 1888b0a7a3cfSSteve Yin return NULL; 18895fdc4257SSteve Yin } 18905fdc4257SSteve Yin 18915fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_groupPosition(long __RPC_FAR *groupLevel,long __RPC_FAR *similarItemsInGroup,long __RPC_FAR *positionInGroup) 18925fdc4257SSteve Yin { 1893b0a7a3cfSSteve Yin 18945fdc4257SSteve Yin CHECK_ENABLE_INF 1895b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1896b0a7a3cfSSteve Yin ISDESTROY() 1897b0a7a3cfSSteve Yin // #CHECK# 1898b0a7a3cfSSteve Yin if(groupLevel == NULL || similarItemsInGroup == NULL || positionInGroup == NULL) 1899b0a7a3cfSSteve Yin { 1900b0a7a3cfSSteve Yin return E_INVALIDARG; 1901b0a7a3cfSSteve Yin } 1902b0a7a3cfSSteve Yin 1903b0a7a3cfSSteve Yin Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext(); 1904b0a7a3cfSSteve Yin if(!pRContext.is()) 1905b0a7a3cfSSteve Yin return E_FAIL; 1906b0a7a3cfSSteve Yin long Role = pRContext->getAccessibleRole(); 1907b0a7a3cfSSteve Yin 1908b0a7a3cfSSteve Yin *groupLevel = 0; 1909b0a7a3cfSSteve Yin *similarItemsInGroup = 0; 1910b0a7a3cfSSteve Yin *positionInGroup = 0; 1911b0a7a3cfSSteve Yin 1912b0a7a3cfSSteve Yin if (Role != AccessibleRole::DOCUMENT) 1913b0a7a3cfSSteve Yin { 1914b0a7a3cfSSteve Yin Reference< XAccessibleGroupPosition > xGroupPosition( pRContext, UNO_QUERY ); 1915b0a7a3cfSSteve Yin if ( xGroupPosition.is() ) 1916b0a7a3cfSSteve Yin { 1917b0a7a3cfSSteve Yin Sequence< sal_Int32 > rSeq = xGroupPosition->getGroupPosition( makeAny( pRContext ) ); 1918b0a7a3cfSSteve Yin sal_Int32* pSeq = rSeq.getArray(); 1919b0a7a3cfSSteve Yin if ( pSeq ) 1920b0a7a3cfSSteve Yin { 1921b0a7a3cfSSteve Yin *groupLevel = pSeq[0]; 1922b0a7a3cfSSteve Yin *similarItemsInGroup = pSeq[1]; 1923b0a7a3cfSSteve Yin *positionInGroup = pSeq[2]; 1924b0a7a3cfSSteve Yin return S_OK; 1925b0a7a3cfSSteve Yin } 1926b0a7a3cfSSteve Yin return S_OK; 1927b0a7a3cfSSteve Yin } 1928b0a7a3cfSSteve Yin } 1929b0a7a3cfSSteve Yin 1930b0a7a3cfSSteve Yin Reference< XAccessible> pParentAcc = pRContext->getAccessibleParent(); 1931b0a7a3cfSSteve Yin if( !pParentAcc.is() ) 1932b0a7a3cfSSteve Yin { 1933b0a7a3cfSSteve Yin return S_OK; 1934b0a7a3cfSSteve Yin } 1935b0a7a3cfSSteve Yin 1936b0a7a3cfSSteve Yin Reference<XAccessibleContext> pRParentContext = pParentAcc->getAccessibleContext(); 1937b0a7a3cfSSteve Yin 1938b0a7a3cfSSteve Yin int level = 0; 1939b0a7a3cfSSteve Yin int index = 0; 1940b0a7a3cfSSteve Yin int number = 0; 1941b0a7a3cfSSteve Yin 1942b0a7a3cfSSteve Yin if( Role == RADIO_BUTTON ) 1943b0a7a3cfSSteve Yin { 1944b0a7a3cfSSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet(); 1945b0a7a3cfSSteve Yin long nRel = pRrelationSet->getRelationCount(); 1946b0a7a3cfSSteve Yin for(int i=0 ; i<nRel ; i++) 1947b0a7a3cfSSteve Yin { 1948b0a7a3cfSSteve Yin AccessibleRelation accRelation = pRrelationSet->getRelation(i); 1949b0a7a3cfSSteve Yin if(accRelation.RelationType == 7) 1950b0a7a3cfSSteve Yin { 1951b0a7a3cfSSteve Yin Sequence< Reference< XInterface > > xTargets = accRelation.TargetSet; 1952b0a7a3cfSSteve Yin int nCount = xTargets.getLength(); 1953b0a7a3cfSSteve Yin 1954b0a7a3cfSSteve Yin Reference<XInterface> pRAcc = xTargets[0]; 1955b0a7a3cfSSteve Yin for(int j=0; j<pRParentContext->getAccessibleChildCount(); j++) 1956b0a7a3cfSSteve Yin { 1957b0a7a3cfSSteve Yin if( getTheParentOfMember(pRParentContext->getAccessibleChild(j).get()) 1958b0a7a3cfSSteve Yin == (XAccessible*)pRAcc.get() && 1959b0a7a3cfSSteve Yin pRParentContext->getAccessibleChild(j)->getAccessibleContext()->getAccessibleRole() == RADIO_BUTTON) 1960b0a7a3cfSSteve Yin number++; 1961b0a7a3cfSSteve Yin if(pRParentContext->getAccessibleChild(j).get() == pUNOInterface) 1962b0a7a3cfSSteve Yin index = number; 1963b0a7a3cfSSteve Yin } 1964b0a7a3cfSSteve Yin } 1965b0a7a3cfSSteve Yin } 1966b0a7a3cfSSteve Yin *groupLevel = 1; 1967b0a7a3cfSSteve Yin *similarItemsInGroup = number; 1968b0a7a3cfSSteve Yin *positionInGroup = index; 1969b0a7a3cfSSteve Yin return S_OK; 1970b0a7a3cfSSteve Yin } 1971b0a7a3cfSSteve Yin 1972b0a7a3cfSSteve Yin else if ( COMBO_BOX == Role ) 1973b0a7a3cfSSteve Yin { 1974b0a7a3cfSSteve Yin *groupLevel = 1; 1975b0a7a3cfSSteve Yin *similarItemsInGroup = 0; 1976b0a7a3cfSSteve Yin *positionInGroup = -1; 1977b0a7a3cfSSteve Yin 1978b0a7a3cfSSteve Yin long nCount = pRContext->getAccessibleChildCount(); 1979b0a7a3cfSSteve Yin if( 2 != nCount) 1980b0a7a3cfSSteve Yin { 1981b0a7a3cfSSteve Yin return S_OK; 1982b0a7a3cfSSteve Yin } 1983b0a7a3cfSSteve Yin Reference<XAccessible> xList=pRContext->getAccessibleChild(1); 1984b0a7a3cfSSteve Yin if (!xList.is()) 1985b0a7a3cfSSteve Yin { 1986b0a7a3cfSSteve Yin return S_OK; 1987b0a7a3cfSSteve Yin } 1988b0a7a3cfSSteve Yin Reference<XAccessibleContext> xListContext(xList,UNO_QUERY); 1989b0a7a3cfSSteve Yin if (!xListContext.is()) 1990b0a7a3cfSSteve Yin { 1991b0a7a3cfSSteve Yin return S_OK; 1992b0a7a3cfSSteve Yin } 1993b0a7a3cfSSteve Yin Reference<XAccessibleSelection> xListSel(xList,UNO_QUERY); 1994b0a7a3cfSSteve Yin if (!xListSel.is()) 1995b0a7a3cfSSteve Yin { 1996b0a7a3cfSSteve Yin return S_OK; 1997b0a7a3cfSSteve Yin } 1998b0a7a3cfSSteve Yin *similarItemsInGroup = xListContext->getAccessibleChildCount(); 1999b0a7a3cfSSteve Yin if (*similarItemsInGroup > 0 ) 2000b0a7a3cfSSteve Yin { 2001b0a7a3cfSSteve Yin try 2002b0a7a3cfSSteve Yin { 2003b0a7a3cfSSteve Yin Reference<XAccessible> xChild = xListSel->getSelectedAccessibleChild(0); 2004b0a7a3cfSSteve Yin if (xChild.is()) 2005b0a7a3cfSSteve Yin { 2006b0a7a3cfSSteve Yin Reference<XAccessibleContext> xChildContext(xChild,UNO_QUERY); 2007b0a7a3cfSSteve Yin if (xChildContext.is()) 2008b0a7a3cfSSteve Yin { 2009b0a7a3cfSSteve Yin *positionInGroup=xChildContext->getAccessibleIndexInParent() + 1 ; 2010b0a7a3cfSSteve Yin return S_OK; 2011b0a7a3cfSSteve Yin } 2012b0a7a3cfSSteve Yin } 2013b0a7a3cfSSteve Yin } 2014b0a7a3cfSSteve Yin catch(...) 2015b0a7a3cfSSteve Yin {} 2016b0a7a3cfSSteve Yin } 2017b0a7a3cfSSteve Yin return S_OK; 2018b0a7a3cfSSteve Yin } 2019b0a7a3cfSSteve Yin else if ( PAGE_TAB == Role ) 2020b0a7a3cfSSteve Yin { 2021b0a7a3cfSSteve Yin *groupLevel = 1; 2022b0a7a3cfSSteve Yin *similarItemsInGroup = pRParentContext->getAccessibleChildCount(); 2023b0a7a3cfSSteve Yin 2024b0a7a3cfSSteve Yin if (*similarItemsInGroup > 0 ) 2025b0a7a3cfSSteve Yin { 2026b0a7a3cfSSteve Yin *positionInGroup=pRContext->getAccessibleIndexInParent() + 1 ; 2027b0a7a3cfSSteve Yin } 2028b0a7a3cfSSteve Yin else 2029b0a7a3cfSSteve Yin { 2030b0a7a3cfSSteve Yin *positionInGroup = -1; 2031b0a7a3cfSSteve Yin } 2032b0a7a3cfSSteve Yin return S_OK; 2033b0a7a3cfSSteve Yin } 2034b0a7a3cfSSteve Yin 2035b0a7a3cfSSteve Yin 2036b0a7a3cfSSteve Yin BOOL isFound = FALSE; 2037b0a7a3cfSSteve Yin while( pParentAcc.is() && !isFound) 2038b0a7a3cfSSteve Yin { 2039b0a7a3cfSSteve Yin level++; 2040b0a7a3cfSSteve Yin pRParentContext = pParentAcc->getAccessibleContext(); 2041b0a7a3cfSSteve Yin Role = pRParentContext->getAccessibleRole(); 2042b0a7a3cfSSteve Yin if( (Role == TREE) || (Role == LIST) ) 2043b0a7a3cfSSteve Yin isFound = TRUE; 2044b0a7a3cfSSteve Yin pParentAcc = pRParentContext->getAccessibleParent(); 2045b0a7a3cfSSteve Yin } 2046b0a7a3cfSSteve Yin 2047b0a7a3cfSSteve Yin if( isFound ) 2048b0a7a3cfSSteve Yin { 2049b0a7a3cfSSteve Yin Reference< XAccessible> pTempAcc = pRContext->getAccessibleParent(); 2050b0a7a3cfSSteve Yin pRParentContext = pTempAcc->getAccessibleContext(); 2051b0a7a3cfSSteve Yin *groupLevel = level; 2052b0a7a3cfSSteve Yin *similarItemsInGroup = pRParentContext->getAccessibleChildCount(); 2053b0a7a3cfSSteve Yin *positionInGroup = pRContext->getAccessibleIndexInParent() + 1; 2054b0a7a3cfSSteve Yin } 2055b0a7a3cfSSteve Yin else 2056b0a7a3cfSSteve Yin { 2057b0a7a3cfSSteve Yin *groupLevel = 0; 2058b0a7a3cfSSteve Yin *similarItemsInGroup = 0; 2059b0a7a3cfSSteve Yin *positionInGroup = 0; 2060b0a7a3cfSSteve Yin } 2061b0a7a3cfSSteve Yin return S_OK; 2062b0a7a3cfSSteve Yin 2063b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 20645fdc4257SSteve Yin } 20655fdc4257SSteve Yin 20665fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_extendedStates( long, BSTR __RPC_FAR *__RPC_FAR *, long __RPC_FAR *) 20675fdc4257SSteve Yin { 2068b0a7a3cfSSteve Yin 20695fdc4257SSteve Yin CHECK_ENABLE_INF 2070b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2071b0a7a3cfSSteve Yin ISDESTROY() 20725fdc4257SSteve Yin 2073b0a7a3cfSSteve Yin return E_NOTIMPL; 20745fdc4257SSteve Yin 2075b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 20765fdc4257SSteve Yin } 20775fdc4257SSteve Yin 20785fdc4257SSteve Yin 20795fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_uniqueID(long __RPC_FAR *uniqueID) 20805fdc4257SSteve Yin { 20815fdc4257SSteve Yin 2082b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2083b0a7a3cfSSteve Yin ISDESTROY() 2084b0a7a3cfSSteve Yin // #CHECK# 2085b0a7a3cfSSteve Yin if(uniqueID == NULL) 2086b0a7a3cfSSteve Yin { 2087b0a7a3cfSSteve Yin return E_INVALIDARG; 2088b0a7a3cfSSteve Yin } 2089b0a7a3cfSSteve Yin *uniqueID = m_dChildID; 2090b0a7a3cfSSteve Yin return S_OK; 2091b0a7a3cfSSteve Yin 2092b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 20935fdc4257SSteve Yin } 20945fdc4257SSteve Yin 20955fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_windowHandle(HWND __RPC_FAR *windowHandle) 20965fdc4257SSteve Yin { 2097b0a7a3cfSSteve Yin 2098b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2099b0a7a3cfSSteve Yin ISDESTROY() 2100b0a7a3cfSSteve Yin // #CHECK# 2101b0a7a3cfSSteve Yin if(windowHandle == NULL) 2102b0a7a3cfSSteve Yin { 2103b0a7a3cfSSteve Yin return E_INVALIDARG; 2104b0a7a3cfSSteve Yin } 2105b0a7a3cfSSteve Yin 2106b0a7a3cfSSteve Yin HWND nHwnd = m_hwnd; 2107b0a7a3cfSSteve Yin IAccessible* pParent = m_pIParent; 2108b0a7a3cfSSteve Yin CMAccessible* pChild = this; 2109b0a7a3cfSSteve Yin while((nHwnd==0) && pParent) 2110b0a7a3cfSSteve Yin { 2111b0a7a3cfSSteve Yin pChild = (CMAccessible*)pParent; 2112b0a7a3cfSSteve Yin if(pChild) 2113b0a7a3cfSSteve Yin { 2114b0a7a3cfSSteve Yin pParent = (IAccessible*)pChild->m_pIParent; 2115b0a7a3cfSSteve Yin nHwnd = (HWND)pChild->m_hwnd; 2116b0a7a3cfSSteve Yin } 2117b0a7a3cfSSteve Yin else 2118b0a7a3cfSSteve Yin pParent = NULL; 2119b0a7a3cfSSteve Yin } 2120b0a7a3cfSSteve Yin 2121b0a7a3cfSSteve Yin *windowHandle = nHwnd; 2122b0a7a3cfSSteve Yin return S_OK; 2123b0a7a3cfSSteve Yin 2124b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 21255fdc4257SSteve Yin } 21265fdc4257SSteve Yin 21275fdc4257SSteve Yin /** 2128b0a7a3cfSSteve Yin * Get XAccessibleContext directly from UNO by the stored XAccessible pointer 2129b0a7a3cfSSteve Yin * @param pXAcc, UNO XAccessible object point. 2130b0a7a3cfSSteve Yin * @return XAccessibleContext*, the context of the pXAcc. 2131b0a7a3cfSSteve Yin */ 21325fdc4257SSteve Yin XAccessibleContext* CMAccessible::GetContextByXAcc( XAccessible* pXAcc ) 21335fdc4257SSteve Yin { 2134b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext; 2135b0a7a3cfSSteve Yin if( pXAcc == NULL) 2136b0a7a3cfSSteve Yin return NULL; 21375fdc4257SSteve Yin 2138b0a7a3cfSSteve Yin pRContext = pXAcc->getAccessibleContext(); 2139b0a7a3cfSSteve Yin if( !pRContext.is() ) 2140b0a7a3cfSSteve Yin return NULL; 2141b0a7a3cfSSteve Yin return pRContext.get(); 21425fdc4257SSteve Yin } 21435fdc4257SSteve Yin 21445fdc4257SSteve Yin /** 2145b0a7a3cfSSteve Yin * Return the member variable m_pXAccessibleSelection, instead of 2146b0a7a3cfSSteve Yin * get XAccessibleSelection according to XAccessibleContext because if so,it will 2147b0a7a3cfSSteve Yin * depend on the UNO implementation code,so when COM is created, put XAccessibleSelection 2148b0a7a3cfSSteve Yin * by bridge management system 2149b0a7a3cfSSteve Yin * @return XAccessibleSelection*, the selection of the current object. 2150b0a7a3cfSSteve Yin */ 21515fdc4257SSteve Yin Reference< XAccessibleSelection > CMAccessible::GetSelection() 21525fdc4257SSteve Yin { 2153b0a7a3cfSSteve Yin if( pUNOInterface == NULL ) 2154b0a7a3cfSSteve Yin return NULL; 2155b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext(); 2156b0a7a3cfSSteve Yin if(pRContext.is()) 2157b0a7a3cfSSteve Yin { 2158b0a7a3cfSSteve Yin Reference< XAccessibleSelection > pRSelection(pRContext,UNO_QUERY); 2159b0a7a3cfSSteve Yin return pRSelection; 2160b0a7a3cfSSteve Yin } 2161b0a7a3cfSSteve Yin return NULL; 21625fdc4257SSteve Yin } 21635fdc4257SSteve Yin 21645fdc4257SSteve Yin /** 2165b0a7a3cfSSteve Yin * Select one XAccessible item, for accSelect implementation 2166b0a7a3cfSSteve Yin * @param pItem, the item should be selected. 2167b0a7a3cfSSteve Yin * @return S_OK if successful. 2168b0a7a3cfSSteve Yin */ 21695fdc4257SSteve Yin HRESULT CMAccessible::SelectChild(XAccessible* pItem) 21705fdc4257SSteve Yin { 21715fdc4257SSteve Yin 2172b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2173b0a7a3cfSSteve Yin ISDESTROY() 2174b0a7a3cfSSteve Yin XAccessibleContext* pParentContext = GetContextByXAcc( pUNOInterface ); 2175b0a7a3cfSSteve Yin XAccessibleContext* pContext = GetContextByXAcc( pItem ); 2176b0a7a3cfSSteve Yin if( pParentContext == NULL || pContext == NULL ) 2177b0a7a3cfSSteve Yin return E_FAIL; 2178b0a7a3cfSSteve Yin 2179b0a7a3cfSSteve Yin Reference< XAccessibleSelection > pRSelection = GetSelection(); 2180b0a7a3cfSSteve Yin if( !pRSelection.is() ) 2181b0a7a3cfSSteve Yin return E_FAIL; 2182b0a7a3cfSSteve Yin long Index = pContext->getAccessibleIndexInParent(); 2183b0a7a3cfSSteve Yin pRSelection->selectAccessibleChild( Index ); 2184b0a7a3cfSSteve Yin return S_OK; 21855fdc4257SSteve Yin 2186b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 21875fdc4257SSteve Yin } 21885fdc4257SSteve Yin 21895fdc4257SSteve Yin /** 2190b0a7a3cfSSteve Yin * Deselect one XAccessible item, for accSelect implimentation 2191b0a7a3cfSSteve Yin * @param pItem, the item should be deselected. 2192b0a7a3cfSSteve Yin * @return S_OK if successful. 2193b0a7a3cfSSteve Yin */ 21945fdc4257SSteve Yin HRESULT CMAccessible::DeSelectChild(XAccessible* pItem) 21955fdc4257SSteve Yin { 21965fdc4257SSteve Yin 2197b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2198b0a7a3cfSSteve Yin ISDESTROY() 2199b0a7a3cfSSteve Yin XAccessibleContext* pParentContext = GetContextByXAcc( pUNOInterface ); 2200b0a7a3cfSSteve Yin ; 2201b0a7a3cfSSteve Yin XAccessibleContext* pContext = GetContextByXAcc( pItem ); 2202b0a7a3cfSSteve Yin if( pParentContext == NULL || pContext == NULL ) 2203b0a7a3cfSSteve Yin return E_INVALIDARG; 2204b0a7a3cfSSteve Yin 2205b0a7a3cfSSteve Yin Reference< XAccessibleSelection > pRSelection = GetSelection(); 2206b0a7a3cfSSteve Yin if( !pRSelection.is() ) 2207b0a7a3cfSSteve Yin return E_FAIL; 2208b0a7a3cfSSteve Yin long Index = pContext->getAccessibleIndexInParent(); 2209b0a7a3cfSSteve Yin pRSelection->deselectAccessibleChild( Index ); 22105fdc4257SSteve Yin 2211b0a7a3cfSSteve Yin return S_OK; 22125fdc4257SSteve Yin 2213b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 22145fdc4257SSteve Yin } 22155fdc4257SSteve Yin 22165fdc4257SSteve Yin /** 2217b0a7a3cfSSteve Yin * Select multiple XAccessible items,for implementation of accSelect 2218b0a7a3cfSSteve Yin * @param pItem, the items should be selected. 2219b0a7a3cfSSteve Yin * @param size, the size of the items. 2220b0a7a3cfSSteve Yin * @return S_OK if successful. 2221b0a7a3cfSSteve Yin */ 22225fdc4257SSteve Yin HRESULT CMAccessible::SelectMutipleChidren( XAccessible** pItem,int size ) 22235fdc4257SSteve Yin { 22245fdc4257SSteve Yin 2225b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2226b0a7a3cfSSteve Yin ISDESTROY() 2227b0a7a3cfSSteve Yin // #CHECK# 2228b0a7a3cfSSteve Yin if(pItem == NULL) 2229b0a7a3cfSSteve Yin { 2230b0a7a3cfSSteve Yin return E_INVALIDARG; 2231b0a7a3cfSSteve Yin } 2232b0a7a3cfSSteve Yin for(int index = 0;index < size;index++) 2233b0a7a3cfSSteve Yin { 2234b0a7a3cfSSteve Yin SelectChild( pItem[index] ); 2235b0a7a3cfSSteve Yin } 2236b0a7a3cfSSteve Yin return S_OK; 2237b0a7a3cfSSteve Yin 2238b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 22395fdc4257SSteve Yin } 22405fdc4257SSteve Yin 22415fdc4257SSteve Yin /** 2242b0a7a3cfSSteve Yin * Deselect multiple XAccessible items,for implementation of accSelect 2243b0a7a3cfSSteve Yin * @param pItem, the items should be selected. 2244b0a7a3cfSSteve Yin * @param size, the size of the items. 2245b0a7a3cfSSteve Yin * @return S_OK if successful. 2246b0a7a3cfSSteve Yin */ 22475fdc4257SSteve Yin HRESULT CMAccessible::DeSelectMutipleChildren( XAccessible** pItem,int size ) 22485fdc4257SSteve Yin { 22495fdc4257SSteve Yin 2250b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2251b0a7a3cfSSteve Yin ISDESTROY() 2252b0a7a3cfSSteve Yin // #CHECK# 2253b0a7a3cfSSteve Yin if(pItem == NULL) 2254b0a7a3cfSSteve Yin { 2255b0a7a3cfSSteve Yin return E_INVALIDARG; 2256b0a7a3cfSSteve Yin } 2257b0a7a3cfSSteve Yin for(int index = 0;index < size;index++) 2258b0a7a3cfSSteve Yin { 2259b0a7a3cfSSteve Yin DeSelectChild( pItem[index] ); 2260b0a7a3cfSSteve Yin } 2261b0a7a3cfSSteve Yin return S_OK; 2262b0a7a3cfSSteve Yin 2263b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 22645fdc4257SSteve Yin } 22655fdc4257SSteve Yin 22665fdc4257SSteve Yin /** 2267b0a7a3cfSSteve Yin * When COM is created, UNO set XAccessible pointer to it 2268b0a7a3cfSSteve Yin * in order to COM can operate UNO information 2269b0a7a3cfSSteve Yin * @param pXAcc, the XAccessible object of current object. 2270b0a7a3cfSSteve Yin * @return S_OK if successful. 2271b0a7a3cfSSteve Yin */ 22725fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetXAccessible(long pXAcc) 22735fdc4257SSteve Yin { 2274b0a7a3cfSSteve Yin pUNOInterface = (XAccessible*)pXAcc; 2275b0a7a3cfSSteve Yin pRef = pUNOInterface; 2276b0a7a3cfSSteve Yin m_pEnumVar->PutSelection(/*XAccessibleSelection*/(long)pUNOInterface); 22775fdc4257SSteve Yin 2278b0a7a3cfSSteve Yin pRContext = pUNOInterface->getAccessibleContext(); 2279b0a7a3cfSSteve Yin pRContextInterface = (XAccessibleContext*)pRContext.is(); 22805fdc4257SSteve Yin 2281b0a7a3cfSSteve Yin return S_OK; 22825fdc4257SSteve Yin } 22835fdc4257SSteve Yin 22845fdc4257SSteve Yin /** 2285b0a7a3cfSSteve Yin * accSelect method has many optional flags, needs to process comprehensively 2286b0a7a3cfSSteve Yin * Mozilla and Microsoft do not implement SELFLAG_EXTENDSELECTION flag. 2287b0a7a3cfSSteve Yin * The implementation of this flag is a little trouble-shooting,so we also 2288b0a7a3cfSSteve Yin * do not implement it now 2289b0a7a3cfSSteve Yin * @param flagsSelect, the selection flag of the select action. 2290b0a7a3cfSSteve Yin * @param varChild, the child object pointer of current action. 2291b0a7a3cfSSteve Yin * @return S_OK if successful. 2292b0a7a3cfSSteve Yin */ 22935fdc4257SSteve Yin STDMETHODIMP CMAccessible::accSelect(long flagsSelect, VARIANT varChild) 22945fdc4257SSteve Yin { 2295b0a7a3cfSSteve Yin 22965fdc4257SSteve Yin CHECK_ENABLE_INF 2297b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2298b0a7a3cfSSteve Yin ISDESTROY() 2299b0a7a3cfSSteve Yin if( (flagsSelect&SELFLAG_ADDSELECTION) && 2300b0a7a3cfSSteve Yin (SELFLAG_REMOVESELECTION&flagsSelect) ) 2301b0a7a3cfSSteve Yin return E_INVALIDARG; 2302b0a7a3cfSSteve Yin 2303b0a7a3cfSSteve Yin if ( (flagsSelect&SELFLAG_TAKESELECTION) && 2304b0a7a3cfSSteve Yin ( 2305b0a7a3cfSSteve Yin (flagsSelect&SELFLAG_ADDSELECTION) || 2306b0a7a3cfSSteve Yin (flagsSelect&SELFLAG_REMOVESELECTION) || 2307b0a7a3cfSSteve Yin (flagsSelect&SELFLAG_EXTENDSELECTION ) 2308b0a7a3cfSSteve Yin ) 2309b0a7a3cfSSteve Yin ) 2310b0a7a3cfSSteve Yin return E_INVALIDARG; 2311b0a7a3cfSSteve Yin 2312b0a7a3cfSSteve Yin if ( varChild.vt != VT_I4 ) 2313b0a7a3cfSSteve Yin return E_INVALIDARG; 2314b0a7a3cfSSteve Yin 2315b0a7a3cfSSteve Yin IMAccessible* pSelectAcc; 2316b0a7a3cfSSteve Yin if( varChild.lVal == CHILDID_SELF ) 2317b0a7a3cfSSteve Yin { 2318b0a7a3cfSSteve Yin pSelectAcc = this; 2319b0a7a3cfSSteve Yin pSelectAcc->AddRef(); 2320b0a7a3cfSSteve Yin } 2321b0a7a3cfSSteve Yin else 2322b0a7a3cfSSteve Yin { 2323b0a7a3cfSSteve Yin pSelectAcc = GetChildInterface(varChild.lVal); 2324b0a7a3cfSSteve Yin } 2325b0a7a3cfSSteve Yin 2326b0a7a3cfSSteve Yin if( pSelectAcc == NULL ) 2327b0a7a3cfSSteve Yin return E_INVALIDARG; 2328b0a7a3cfSSteve Yin 2329b0a7a3cfSSteve Yin if( flagsSelect&SELFLAG_TAKEFOCUS ) 2330b0a7a3cfSSteve Yin { 2331b0a7a3cfSSteve Yin long pTempUNO = 0; 2332b0a7a3cfSSteve Yin pSelectAcc->GetUNOInterface( &pTempUNO); 2333b0a7a3cfSSteve Yin 2334b0a7a3cfSSteve Yin if( pTempUNO == NULL ) 2335b0a7a3cfSSteve Yin return NULL; 2336b0a7a3cfSSteve Yin 2337b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = ( (XAccessible*)pTempUNO)->getAccessibleContext(); 2338b0a7a3cfSSteve Yin Reference< XAccessibleComponent > pRComponent(pRContext,UNO_QUERY); 2339b0a7a3cfSSteve Yin Reference< XAccessible > pRParentXAcc = pRContext->getAccessibleParent(); 2340b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRParentContext = pRParentXAcc->getAccessibleContext(); 2341b0a7a3cfSSteve Yin Reference< XAccessibleComponent > pRParentComponent(pRParentContext,UNO_QUERY); 2342b0a7a3cfSSteve Yin Reference< XAccessibleSelection > pRParentSelection(pRParentContext,UNO_QUERY); 2343b0a7a3cfSSteve Yin 2344b0a7a3cfSSteve Yin 2345b0a7a3cfSSteve Yin pRComponent->grabFocus(); 2346b0a7a3cfSSteve Yin 2347b0a7a3cfSSteve Yin if( flagsSelect & SELFLAG_TAKESELECTION ) 2348b0a7a3cfSSteve Yin { 2349b0a7a3cfSSteve Yin pRParentSelection->clearAccessibleSelection(); 2350b0a7a3cfSSteve Yin pRParentSelection->selectAccessibleChild( pRContext->getAccessibleIndexInParent() ); 2351b0a7a3cfSSteve Yin } 2352b0a7a3cfSSteve Yin 2353b0a7a3cfSSteve Yin if( flagsSelect & SELFLAG_ADDSELECTION ) 2354b0a7a3cfSSteve Yin { 2355b0a7a3cfSSteve Yin pRParentSelection->selectAccessibleChild( pRContext->getAccessibleIndexInParent() ); 2356b0a7a3cfSSteve Yin } 2357b0a7a3cfSSteve Yin 2358b0a7a3cfSSteve Yin if( flagsSelect & SELFLAG_REMOVESELECTION ) 2359b0a7a3cfSSteve Yin { 2360b0a7a3cfSSteve Yin pRParentSelection->deselectAccessibleChild( pRContext->getAccessibleIndexInParent() ); 2361b0a7a3cfSSteve Yin } 2362b0a7a3cfSSteve Yin 2363b0a7a3cfSSteve Yin if( flagsSelect & SELFLAG_EXTENDSELECTION ) 2364b0a7a3cfSSteve Yin { 2365b0a7a3cfSSteve Yin long indexInParrent = pRContext->getAccessibleIndexInParent(); 2366b0a7a3cfSSteve Yin 2367b0a7a3cfSSteve Yin if( pRParentSelection->isAccessibleChildSelected( indexInParrent + 1 ) || 2368b0a7a3cfSSteve Yin pRParentSelection->isAccessibleChildSelected( indexInParrent - 1 ) ) 2369b0a7a3cfSSteve Yin { 2370b0a7a3cfSSteve Yin pRParentSelection->selectAccessibleChild( indexInParrent ); 2371b0a7a3cfSSteve Yin } 2372b0a7a3cfSSteve Yin } 2373b0a7a3cfSSteve Yin 2374b0a7a3cfSSteve Yin } 2375b0a7a3cfSSteve Yin 2376b0a7a3cfSSteve Yin pSelectAcc->Release(); 2377b0a7a3cfSSteve Yin return S_OK; 2378b0a7a3cfSSteve Yin 2379b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 23805fdc4257SSteve Yin } 23815fdc4257SSteve Yin 23825fdc4257SSteve Yin /** 2383b0a7a3cfSSteve Yin * Return XAccessible interface pointer when needed 2384b0a7a3cfSSteve Yin * @param pXAcc, [in, out] the Uno interface of the current object. 2385b0a7a3cfSSteve Yin * @return S_OK if successful. 2386b0a7a3cfSSteve Yin */ 23875fdc4257SSteve Yin STDMETHODIMP CMAccessible::GetUNOInterface(long* pXAcc) 23885fdc4257SSteve Yin { 2389b0a7a3cfSSteve Yin // #CHECK# 2390b0a7a3cfSSteve Yin if(pXAcc == NULL) 2391b0a7a3cfSSteve Yin return E_INVALIDARG; 23925fdc4257SSteve Yin 2393b0a7a3cfSSteve Yin *pXAcc = (long)pUNOInterface; 2394b0a7a3cfSSteve Yin return S_OK; 23955fdc4257SSteve Yin } 23965fdc4257SSteve Yin 23975fdc4257SSteve Yin /** 2398b0a7a3cfSSteve Yin * Helper method for Implementation of get_accDefaultAction 2399b0a7a3cfSSteve Yin * @param pAction, the default action point of the current object. 2400b0a7a3cfSSteve Yin * @return S_OK if successful. 2401b0a7a3cfSSteve Yin */ 24025fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetDefaultAction(long pAction) 24035fdc4257SSteve Yin { 2404b0a7a3cfSSteve Yin m_pXAction = (XAccessibleAction*)pAction; 2405b0a7a3cfSSteve Yin return S_OK; 24065fdc4257SSteve Yin } 24075fdc4257SSteve Yin 24085fdc4257SSteve Yin /** 2409b0a7a3cfSSteve Yin * This method is called when AT open some UI elements initially 2410b0a7a3cfSSteve Yin * the UI element takes the default action defined here 2411b0a7a3cfSSteve Yin * @param varChild, the child id of the defaultaction. 2412b0a7a3cfSSteve Yin * @param pszDefaultAction,[in/out] the description of the current action. 2413b0a7a3cfSSteve Yin * @return S_OK if successful. 2414b0a7a3cfSSteve Yin */ 24155fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CMAccessible::get_accDefaultAction(VARIANT varChild, BSTR *pszDefaultAction) 24165fdc4257SSteve Yin { 2417b0a7a3cfSSteve Yin 2418b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2419b0a7a3cfSSteve Yin ISDESTROY() 2420b0a7a3cfSSteve Yin // #CHECK# 2421b0a7a3cfSSteve Yin if(pszDefaultAction == NULL) 2422b0a7a3cfSSteve Yin { 2423b0a7a3cfSSteve Yin return E_INVALIDARG; 2424b0a7a3cfSSteve Yin } 2425b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 2426b0a7a3cfSSteve Yin { 2427b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 2428b0a7a3cfSSteve Yin { 2429b0a7a3cfSSteve Yin if( m_pXAction == NULL ) 2430b0a7a3cfSSteve Yin return DISP_E_MEMBERNOTFOUND; 2431b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(*pszDefaultAction); 2432b0a7a3cfSSteve Yin *pszDefaultAction = SysAllocString(m_pszActionDescription); 2433b0a7a3cfSSteve Yin return S_OK; 2434b0a7a3cfSSteve Yin } 2435b0a7a3cfSSteve Yin 2436b0a7a3cfSSteve Yin long lVal = varChild.lVal; 2437b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 2438b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 2439b0a7a3cfSSteve Yin if(!pChild) 2440b0a7a3cfSSteve Yin return E_FAIL; 2441b0a7a3cfSSteve Yin return pChild->get_accDefaultAction(varChild,pszDefaultAction); 2442b0a7a3cfSSteve Yin } 2443b0a7a3cfSSteve Yin return S_FALSE; 2444b0a7a3cfSSteve Yin 2445b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 24465fdc4257SSteve Yin } 24475fdc4257SSteve Yin 24485fdc4257SSteve Yin /** 2449b0a7a3cfSSteve Yin * AT call this method to operate application 2450b0a7a3cfSSteve Yin * @param varChild, the child id of the action object. 2451b0a7a3cfSSteve Yin * @return S_OK if successful. 2452b0a7a3cfSSteve Yin */ 24535fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CMAccessible::accDoDefaultAction(VARIANT varChild) 24545fdc4257SSteve Yin { 2455b0a7a3cfSSteve Yin 2456b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2457b0a7a3cfSSteve Yin ISDESTROY() 2458b0a7a3cfSSteve Yin if( varChild.vt != VT_I4 ) 2459b0a7a3cfSSteve Yin return E_INVALIDARG; 2460b0a7a3cfSSteve Yin if( m_pXAction == NULL ) 2461b0a7a3cfSSteve Yin return E_FAIL; 2462b0a7a3cfSSteve Yin if( m_pXAction->getAccessibleActionCount() == 0 ) 2463b0a7a3cfSSteve Yin return E_FAIL; 2464b0a7a3cfSSteve Yin 2465b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 2466b0a7a3cfSSteve Yin { 2467b0a7a3cfSSteve Yin if(m_pXAction->getAccessibleActionCount() > 0) 2468b0a7a3cfSSteve Yin m_pXAction->doAccessibleAction(0); 2469b0a7a3cfSSteve Yin return S_OK; 2470b0a7a3cfSSteve Yin } 2471b0a7a3cfSSteve Yin 2472b0a7a3cfSSteve Yin long lVal = varChild.lVal; 2473b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 2474b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 2475b0a7a3cfSSteve Yin if(!pChild) 2476b0a7a3cfSSteve Yin return E_FAIL; 2477b0a7a3cfSSteve Yin return pChild->accDoDefaultAction( varChild ); 2478b0a7a3cfSSteve Yin 2479b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 24805fdc4257SSteve Yin } 24815fdc4257SSteve Yin 24825fdc4257SSteve Yin /** 2483b0a7a3cfSSteve Yin * UNO set description information for action to COM. 2484b0a7a3cfSSteve Yin * @param szAction, the action description of the current object. 2485b0a7a3cfSSteve Yin * @return S_OK if successful. 2486b0a7a3cfSSteve Yin */ 24875fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_ActionDescription( const OLECHAR* szAction) 24885fdc4257SSteve Yin { 24895fdc4257SSteve Yin 2490b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2491b0a7a3cfSSteve Yin ISDESTROY() 2492b0a7a3cfSSteve Yin // #CHECK# 2493b0a7a3cfSSteve Yin if(szAction == NULL) 2494b0a7a3cfSSteve Yin { 2495b0a7a3cfSSteve Yin return E_INVALIDARG; 2496b0a7a3cfSSteve Yin } 2497b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(m_pszActionDescription ); 2498b0a7a3cfSSteve Yin m_pszActionDescription = SysAllocString( szAction ); 2499b0a7a3cfSSteve Yin return S_OK; 2500b0a7a3cfSSteve Yin 2501b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 25025fdc4257SSteve Yin } 25035fdc4257SSteve Yin 25045fdc4257SSteve Yin BOOL CMAccessible::GetXInterfaceFromXAccessible(XAccessible* pXAcc, XInterface** ppXI, int index) 25055fdc4257SSteve Yin { 2506b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext; 2507b0a7a3cfSSteve Yin 2508b0a7a3cfSSteve Yin switch(index) 2509b0a7a3cfSSteve Yin { 2510b0a7a3cfSSteve Yin case XI_COMPONENT: 2511b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleComponent) 2512b0a7a3cfSSteve Yin break; 2513b0a7a3cfSSteve Yin case XI_TEXT: 2514b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleText) 2515b0a7a3cfSSteve Yin break; 2516b0a7a3cfSSteve Yin case XI_EDITABLETEXT: 2517b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleEditableText) 2518b0a7a3cfSSteve Yin break; 2519b0a7a3cfSSteve Yin case XI_TABLE: 2520b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleTable) 2521b0a7a3cfSSteve Yin break; 2522b0a7a3cfSSteve Yin case XI_SELECTION: 2523b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleSelection) 2524b0a7a3cfSSteve Yin break; 2525b0a7a3cfSSteve Yin case XI_EXTENDEDCOMP: 2526b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleExtendedComponent) 2527b0a7a3cfSSteve Yin break; 2528b0a7a3cfSSteve Yin case XI_KEYBINDING: 2529b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleKeyBinding) 2530b0a7a3cfSSteve Yin break; 2531b0a7a3cfSSteve Yin case XI_ACTION: 2532b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleAction) 2533b0a7a3cfSSteve Yin break; 2534b0a7a3cfSSteve Yin case XI_VALUE: 2535b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleValue) 2536b0a7a3cfSSteve Yin break; 2537b0a7a3cfSSteve Yin case XI_HYPERTEXT: 2538b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleHypertext) 2539b0a7a3cfSSteve Yin break; 2540b0a7a3cfSSteve Yin case XI_HYPERLINK: 2541b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleHyperlink) 2542b0a7a3cfSSteve Yin break; 2543b0a7a3cfSSteve Yin case XI_IMAGE: 2544b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleImage) 2545b0a7a3cfSSteve Yin break; 2546b0a7a3cfSSteve Yin default: 2547b0a7a3cfSSteve Yin break; 2548b0a7a3cfSSteve Yin } 2549b0a7a3cfSSteve Yin 2550b0a7a3cfSSteve Yin return FALSE; 25515fdc4257SSteve Yin } 25525fdc4257SSteve Yin 25535fdc4257SSteve Yin HRESULT WINAPI CMAccessible::SmartQI(void* pv, REFIID iid, void** ppvObject) 25545fdc4257SSteve Yin { 2555b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2556b0a7a3cfSSteve Yin ISDESTROY() 2557b0a7a3cfSSteve Yin if( ImplIsEqualGUID(iid,IID_IAccIdentity) || 2558b0a7a3cfSSteve Yin ImplIsEqualGUID(iid,IID_IStdMarshalInfo) || 2559b0a7a3cfSSteve Yin ImplIsEqualGUID(iid,IID_IMarshal) || 2560b0a7a3cfSSteve Yin ImplIsEqualGUID(iid,IID_IExternalConnection)|| 2561b0a7a3cfSSteve Yin ImplIsEqualGUID(iid,IID_IOleWindow)) 2562b0a7a3cfSSteve Yin return E_FAIL; 2563b0a7a3cfSSteve Yin 2564b0a7a3cfSSteve Yin 2565b0a7a3cfSSteve Yin _UNO_AGGMAP_ENTRY* pMap = _GetAggEntries(); 2566b0a7a3cfSSteve Yin while(pMap && pMap->piid) 2567b0a7a3cfSSteve Yin { 2568b0a7a3cfSSteve Yin if(ImplIsEqualGUID(iid, *pMap->piid)) 2569b0a7a3cfSSteve Yin { 2570b0a7a3cfSSteve Yin XInterface* pXI = NULL; 2571b0a7a3cfSSteve Yin BOOL bFound = GetXInterfaceFromXAccessible(pUNOInterface,&pXI,pMap->XIFIndex); 2572b0a7a3cfSSteve Yin if(!bFound) 2573b0a7a3cfSSteve Yin { 2574b0a7a3cfSSteve Yin return E_FAIL; 2575b0a7a3cfSSteve Yin } 2576b0a7a3cfSSteve Yin 2577b0a7a3cfSSteve Yin XGUIDToComObjHash::iterator pIndTemp = m_containedObjects.find( iid ); 2578b0a7a3cfSSteve Yin if ( pIndTemp != m_containedObjects.end() ) 2579b0a7a3cfSSteve Yin { 2580b0a7a3cfSSteve Yin return pIndTemp->second.p->QueryInterface( iid, ppvObject ); 2581b0a7a3cfSSteve Yin } 2582b0a7a3cfSSteve Yin else 2583b0a7a3cfSSteve Yin { 2584b0a7a3cfSSteve Yin ActivateActContext(); 2585b0a7a3cfSSteve Yin HRESULT hr = pMap->pfnCreateInstance(pv, iid, ppvObject); 2586b0a7a3cfSSteve Yin DeactivateActContext(); 2587b0a7a3cfSSteve Yin if(hr == S_OK) 2588b0a7a3cfSSteve Yin { 2589b0a7a3cfSSteve Yin m_containedObjects.insert(XGUIDToComObjHash::value_type(*pMap->piid,(IUnknown*)*ppvObject)); 2590b0a7a3cfSSteve Yin IUNOXWrapper* wrapper = NULL; 2591b0a7a3cfSSteve Yin ((IUnknown*)*ppvObject)->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper); 2592b0a7a3cfSSteve Yin if(wrapper) 2593b0a7a3cfSSteve Yin { 2594b0a7a3cfSSteve Yin wrapper->put_XInterface((long)pUNOInterface); 2595b0a7a3cfSSteve Yin wrapper->Release(); 2596b0a7a3cfSSteve Yin } 2597b0a7a3cfSSteve Yin return S_OK; 2598b0a7a3cfSSteve Yin } 2599b0a7a3cfSSteve Yin } 2600b0a7a3cfSSteve Yin return E_FAIL; 2601b0a7a3cfSSteve Yin } 2602b0a7a3cfSSteve Yin pMap++; 2603b0a7a3cfSSteve Yin } 2604b0a7a3cfSSteve Yin return E_FAIL; 2605b0a7a3cfSSteve Yin 2606b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 26075fdc4257SSteve Yin } 26085fdc4257SSteve Yin 26095fdc4257SSteve Yin BOOL CMAccessible::get_IAccessibleFromXAccessible(long pXAcc, IAccessible **ppIA) 26105fdc4257SSteve Yin { 26115fdc4257SSteve Yin 2612b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2613b0a7a3cfSSteve Yin 2614b0a7a3cfSSteve Yin // #CHECK# 2615b0a7a3cfSSteve Yin if(ppIA == NULL) 2616b0a7a3cfSSteve Yin { 2617b0a7a3cfSSteve Yin return E_INVALIDARG; 2618b0a7a3cfSSteve Yin } 2619b0a7a3cfSSteve Yin BOOL isGet = FALSE; 2620b0a7a3cfSSteve Yin if(g_pAgent) 2621b0a7a3cfSSteve Yin isGet = g_pAgent->GetIAccessibleFromXAccessible((XAccessible*)pXAcc,ppIA); 2622b0a7a3cfSSteve Yin 2623b0a7a3cfSSteve Yin if(isGet) 2624b0a7a3cfSSteve Yin return TRUE; 2625b0a7a3cfSSteve Yin else 2626b0a7a3cfSSteve Yin return FALSE; 26275fdc4257SSteve Yin 2628b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 26295fdc4257SSteve Yin } 26305fdc4257SSteve Yin 26315fdc4257SSteve Yin void CMAccessible::get_OLECHARFromAny(Any& pAny, OLECHAR* pChar) 26325fdc4257SSteve Yin { 2633b0a7a3cfSSteve Yin // #CHECK# 2634b0a7a3cfSSteve Yin if(pChar == NULL) 2635b0a7a3cfSSteve Yin return; 2636b0a7a3cfSSteve Yin 2637b0a7a3cfSSteve Yin switch(pAny.getValueTypeClass()) 2638b0a7a3cfSSteve Yin { 2639b0a7a3cfSSteve Yin case TypeClass_CHAR: 2640b0a7a3cfSSteve Yin { 2641b0a7a3cfSSteve Yin sal_Int8 val; 2642b0a7a3cfSSteve Yin pAny >>= val; 2643b0a7a3cfSSteve Yin swprintf( pChar, L"%d", val); 2644b0a7a3cfSSteve Yin break; 2645b0a7a3cfSSteve Yin } 2646b0a7a3cfSSteve Yin case TypeClass_BOOLEAN: 2647b0a7a3cfSSteve Yin { 2648b0a7a3cfSSteve Yin sal_Bool val; 2649b0a7a3cfSSteve Yin pAny >>= val; 2650b0a7a3cfSSteve Yin swprintf( pChar, L"%d", val); 2651b0a7a3cfSSteve Yin break; 2652b0a7a3cfSSteve Yin } 2653b0a7a3cfSSteve Yin case TypeClass_BYTE: 2654b0a7a3cfSSteve Yin { 2655b0a7a3cfSSteve Yin sal_Int8 val; 2656b0a7a3cfSSteve Yin pAny >>= val; 2657b0a7a3cfSSteve Yin swprintf( pChar, L"%d", val); 2658b0a7a3cfSSteve Yin break; 2659b0a7a3cfSSteve Yin } 2660b0a7a3cfSSteve Yin case TypeClass_SHORT: 2661b0a7a3cfSSteve Yin { 2662b0a7a3cfSSteve Yin SHORT val; 2663b0a7a3cfSSteve Yin pAny >>= val; 2664b0a7a3cfSSteve Yin swprintf( pChar, L"%d", val); 2665b0a7a3cfSSteve Yin break; 2666b0a7a3cfSSteve Yin } 2667b0a7a3cfSSteve Yin case TypeClass_UNSIGNED_SHORT: 2668b0a7a3cfSSteve Yin { 2669b0a7a3cfSSteve Yin USHORT val; 2670b0a7a3cfSSteve Yin pAny >>= val; 2671b0a7a3cfSSteve Yin swprintf( pChar, L"%d", val); 2672b0a7a3cfSSteve Yin break; 2673b0a7a3cfSSteve Yin } 2674b0a7a3cfSSteve Yin case TypeClass_LONG: 2675b0a7a3cfSSteve Yin { 2676b0a7a3cfSSteve Yin LONG val; 2677b0a7a3cfSSteve Yin pAny >>= val; 2678b0a7a3cfSSteve Yin swprintf( pChar, L"%ld", val); 2679b0a7a3cfSSteve Yin break; 2680b0a7a3cfSSteve Yin } 2681b0a7a3cfSSteve Yin case TypeClass_UNSIGNED_LONG: 2682b0a7a3cfSSteve Yin { 2683b0a7a3cfSSteve Yin ULONG val; 2684b0a7a3cfSSteve Yin pAny >>= val; 2685b0a7a3cfSSteve Yin swprintf( pChar, L"%ld", val); 2686b0a7a3cfSSteve Yin break; 2687b0a7a3cfSSteve Yin } 2688b0a7a3cfSSteve Yin case TypeClass_FLOAT: 2689b0a7a3cfSSteve Yin { 2690b0a7a3cfSSteve Yin FLOAT val; 2691b0a7a3cfSSteve Yin pAny >>= val; 2692b0a7a3cfSSteve Yin swprintf( pChar, L"%.3f", val); 2693b0a7a3cfSSteve Yin break; 2694b0a7a3cfSSteve Yin } 2695b0a7a3cfSSteve Yin case TypeClass_DOUBLE: 2696b0a7a3cfSSteve Yin { 2697b0a7a3cfSSteve Yin DOUBLE val; 2698b0a7a3cfSSteve Yin pAny >>= val; 2699b0a7a3cfSSteve Yin swprintf( pChar, L"%.6lf", val); 2700b0a7a3cfSSteve Yin break; 2701b0a7a3cfSSteve Yin } 2702b0a7a3cfSSteve Yin case TypeClass_STRING: 2703b0a7a3cfSSteve Yin { 2704b0a7a3cfSSteve Yin ::rtl::OUString val; 2705b0a7a3cfSSteve Yin pAny >>= val; 2706b0a7a3cfSSteve Yin wcscpy(pChar, val.getStr()); 2707b0a7a3cfSSteve Yin break; 2708b0a7a3cfSSteve Yin } 2709b0a7a3cfSSteve Yin case TypeClass_SEQUENCE: 2710b0a7a3cfSSteve Yin { 2711b0a7a3cfSSteve Yin if(pAny.getValueType() == getCppuType( (Sequence< ::rtl::OUString > *)0 ) ) 2712b0a7a3cfSSteve Yin { 2713b0a7a3cfSSteve Yin Sequence < ::rtl::OUString > val; 2714b0a7a3cfSSteve Yin pAny >>= val; 2715b0a7a3cfSSteve Yin 2716b0a7a3cfSSteve Yin ::rtl::OUString pString; 2717b0a7a3cfSSteve Yin 2718b0a7a3cfSSteve Yin int count = val.getLength(); 2719b0a7a3cfSSteve Yin 2720b0a7a3cfSSteve Yin for( int iIndex = 0;iIndex < count;iIndex++ ) 2721b0a7a3cfSSteve Yin { 2722b0a7a3cfSSteve Yin pString += val[iIndex]; 2723b0a7a3cfSSteve Yin } 2724b0a7a3cfSSteve Yin wcscpy(pChar, pString.getStr()); 2725b0a7a3cfSSteve Yin } 2726b0a7a3cfSSteve Yin else if (pAny.getValueType() == getCppuType( (Sequence< ::com::sun::star::style::TabStop >* )0 ) ) 2727b0a7a3cfSSteve Yin { 2728b0a7a3cfSSteve Yin Sequence < ::com::sun::star::style::TabStop > val; 2729b0a7a3cfSSteve Yin pAny >>= val; 2730b0a7a3cfSSteve Yin int count = val.getLength(); 2731b0a7a3cfSSteve Yin 2732b0a7a3cfSSteve Yin for( int iIndex = 0;iIndex < count;iIndex++ ) 2733b0a7a3cfSSteve Yin { 2734b0a7a3cfSSteve Yin OLECHAR pAttrs[512] = {NULL}; 2735b0a7a3cfSSteve Yin 2736b0a7a3cfSSteve Yin OLECHAR pAttrsPosition[512] = {NULL}; 2737b0a7a3cfSSteve Yin OLECHAR pAttrsDescimalChar[512] = {NULL}; 2738b0a7a3cfSSteve Yin OLECHAR pAttrsFillChar[512] = {NULL}; 2739b0a7a3cfSSteve Yin 2740b0a7a3cfSSteve Yin ::com::sun::star::style::TabStop sigleVal = val[iIndex]; 2741b0a7a3cfSSteve Yin 2742b0a7a3cfSSteve Yin swprintf( pAttrsPosition, L"Position=%ld,TabAlign=%ld", 2743b0a7a3cfSSteve Yin sigleVal.Position, sigleVal.Alignment); 2744b0a7a3cfSSteve Yin 2745b0a7a3cfSSteve Yin if(sigleVal.DecimalChar==';' || sigleVal.DecimalChar == ':' || sigleVal.DecimalChar == ',' || 2746b0a7a3cfSSteve Yin sigleVal.DecimalChar == '=' || sigleVal.DecimalChar == '\\') 2747b0a7a3cfSSteve Yin swprintf( pAttrsDescimalChar, L"DecimalChar=\\%c",sigleVal.DecimalChar); 2748b0a7a3cfSSteve Yin else 2749b0a7a3cfSSteve Yin swprintf( pAttrsDescimalChar, L"DecimalChar=%c",sigleVal.DecimalChar); 2750b0a7a3cfSSteve Yin 2751b0a7a3cfSSteve Yin if(sigleVal.FillChar==';' || sigleVal.FillChar == ':' || sigleVal.FillChar == ',' || 2752b0a7a3cfSSteve Yin sigleVal.FillChar == '=' || sigleVal.FillChar == '\\') 2753b0a7a3cfSSteve Yin swprintf( pAttrsFillChar, L"FillChar=\\%c",sigleVal.FillChar); 2754b0a7a3cfSSteve Yin else 2755b0a7a3cfSSteve Yin swprintf( pAttrsFillChar, L"FillChar=%c",sigleVal.FillChar); 2756b0a7a3cfSSteve Yin 2757b0a7a3cfSSteve Yin swprintf( pAttrs, L"%s,%s,%s,",pAttrsPosition,pAttrsDescimalChar,pAttrsFillChar); 2758b0a7a3cfSSteve Yin 2759b0a7a3cfSSteve Yin wcscat(pChar,pAttrs); 2760b0a7a3cfSSteve Yin } 2761b0a7a3cfSSteve Yin } 2762b0a7a3cfSSteve Yin break; 2763b0a7a3cfSSteve Yin } 2764b0a7a3cfSSteve Yin case TypeClass_ENUM: 2765b0a7a3cfSSteve Yin { 2766b0a7a3cfSSteve Yin if (pAny.getValueType() == getCppuType( (::com::sun::star::awt::FontSlant* )0 ) ) 2767b0a7a3cfSSteve Yin { 2768b0a7a3cfSSteve Yin com::sun::star::awt::FontSlant val; 2769b0a7a3cfSSteve Yin pAny >>= val; 2770b0a7a3cfSSteve Yin swprintf( pChar, L"%d", val); 2771b0a7a3cfSSteve Yin } 2772b0a7a3cfSSteve Yin } 2773b0a7a3cfSSteve Yin case TypeClass_STRUCT: 2774b0a7a3cfSSteve Yin { 2775b0a7a3cfSSteve Yin if (pAny.getValueType() == getCppuType( (::com::sun::star::style::LineSpacing* )0 ) ) 2776b0a7a3cfSSteve Yin { 2777b0a7a3cfSSteve Yin com::sun::star::style::LineSpacing val; 2778b0a7a3cfSSteve Yin pAny >>= val; 2779b0a7a3cfSSteve Yin swprintf( pChar, L"Mode=%ld,Height=%ld,", val.Mode, val.Height); 2780b0a7a3cfSSteve Yin } 2781b0a7a3cfSSteve Yin else if (pAny.getValueType() == getCppuType( (com::sun::star::accessibility::TextSegment *)0 ) ) 2782b0a7a3cfSSteve Yin { 2783b0a7a3cfSSteve Yin com::sun::star::accessibility::TextSegment val; 2784b0a7a3cfSSteve Yin pAny >>= val; 2785b0a7a3cfSSteve Yin ::rtl::OUString realVal(val.SegmentText); 2786b0a7a3cfSSteve Yin wcscpy(pChar, realVal.getStr()); 2787b0a7a3cfSSteve Yin } 2788b0a7a3cfSSteve Yin break; 2789b0a7a3cfSSteve Yin } 2790b0a7a3cfSSteve Yin case TypeClass_VOID: 2791b0a7a3cfSSteve Yin case TypeClass_HYPER: 2792b0a7a3cfSSteve Yin case TypeClass_UNSIGNED_HYPER: 2793b0a7a3cfSSteve Yin case TypeClass_TYPE: 2794b0a7a3cfSSteve Yin case TypeClass_ANY: 2795b0a7a3cfSSteve Yin case TypeClass_TYPEDEF: 2796b0a7a3cfSSteve Yin case TypeClass_UNION: 2797b0a7a3cfSSteve Yin case TypeClass_EXCEPTION: 2798b0a7a3cfSSteve Yin case TypeClass_ARRAY: 2799b0a7a3cfSSteve Yin case TypeClass_INTERFACE: 2800b0a7a3cfSSteve Yin case TypeClass_SERVICE: 2801b0a7a3cfSSteve Yin case TypeClass_MODULE: 2802b0a7a3cfSSteve Yin case TypeClass_INTERFACE_METHOD: 2803b0a7a3cfSSteve Yin case TypeClass_INTERFACE_ATTRIBUTE: 2804b0a7a3cfSSteve Yin case TypeClass_UNKNOWN: 2805b0a7a3cfSSteve Yin case TypeClass_PROPERTY: 2806b0a7a3cfSSteve Yin case TypeClass_CONSTANT: 2807b0a7a3cfSSteve Yin case TypeClass_CONSTANTS: 2808b0a7a3cfSSteve Yin case TypeClass_SINGLETON: 2809b0a7a3cfSSteve Yin case TypeClass_MAKE_FIXED_SIZE: 2810b0a7a3cfSSteve Yin break; 2811b0a7a3cfSSteve Yin default: 2812b0a7a3cfSSteve Yin break; 2813b0a7a3cfSSteve Yin } 28145fdc4257SSteve Yin } 28155fdc4257SSteve Yin 28165fdc4257SSteve Yin void CMAccessible::get_OLECHAR4Numbering(const Any& pAny, short numberingLevel,const OUString& numberingPrefix,OLECHAR* pChar) 28175fdc4257SSteve Yin { 2818b0a7a3cfSSteve Yin if(pChar == NULL) 2819b0a7a3cfSSteve Yin return; 2820b0a7a3cfSSteve Yin Reference< ::com::sun::star::container::XIndexReplace > pXIndex; 2821b0a7a3cfSSteve Yin if((pAny>>=pXIndex) && (numberingLevel !=-1))//numbering level is -1,means invalid value 2822b0a7a3cfSSteve Yin { 2823b0a7a3cfSSteve Yin Any aAny = pXIndex->getByIndex(numberingLevel); 2824b0a7a3cfSSteve Yin Sequence< ::com::sun::star::beans::PropertyValue > aProps; 2825b0a7a3cfSSteve Yin aAny >>= aProps; 2826b0a7a3cfSSteve Yin const ::com::sun::star::beans::PropertyValue* pPropArray = aProps.getConstArray(); 2827b0a7a3cfSSteve Yin sal_Int32 nCount = aProps.getLength(); 2828b0a7a3cfSSteve Yin swprintf(pChar,L"Numbering:NumberingLevel=%d,",numberingLevel); 2829b0a7a3cfSSteve Yin for( sal_Int32 i=0; i<nCount; i++ ) 2830b0a7a3cfSSteve Yin { 2831b0a7a3cfSSteve Yin ::com::sun::star::beans::PropertyValue rProp = pPropArray[i]; 2832b0a7a3cfSSteve Yin if( (rProp.Name.compareTo(OUString::createFromAscii("BulletChar"))==0)|| 2833b0a7a3cfSSteve Yin (rProp.Name.compareTo(OUString::createFromAscii("GraphicURL"))==0)|| 2834b0a7a3cfSSteve Yin (rProp.Name.compareTo(OUString::createFromAscii("NumberingType"))==0)) 2835b0a7a3cfSSteve Yin { 2836b0a7a3cfSSteve Yin OLECHAR propStr[512] = {NULL}; 2837b0a7a3cfSSteve Yin swprintf(propStr,L"%s=",rProp.Name.getStr()); 2838b0a7a3cfSSteve Yin OLECHAR pTemp[256] = {NULL}; 2839b0a7a3cfSSteve Yin CMAccessible::get_OLECHARFromAny(rProp.Value,pTemp); 2840b0a7a3cfSSteve Yin if(rProp.Name.compareTo(OUString::createFromAscii("GraphicURL"))==0) 2841b0a7a3cfSSteve Yin { 2842b0a7a3cfSSteve Yin OLECHAR* pOccur = wcschr(pTemp,':'); 2843b0a7a3cfSSteve Yin if(pOccur) 2844b0a7a3cfSSteve Yin *pOccur = '.'; 2845b0a7a3cfSSteve Yin } 2846b0a7a3cfSSteve Yin wcscat(propStr,pTemp); 2847b0a7a3cfSSteve Yin wcscat(pChar,propStr); 2848b0a7a3cfSSteve Yin wcscat(pChar,L","); 2849b0a7a3cfSSteve Yin 2850b0a7a3cfSSteve Yin if(rProp.Name.compareTo(OUString::createFromAscii("NumberingType"))==0) 2851b0a7a3cfSSteve Yin { 2852b0a7a3cfSSteve Yin if(numberingPrefix.getLength()!=0) 2853b0a7a3cfSSteve Yin { 2854b0a7a3cfSSteve Yin swprintf(pTemp,L"NumberingPrefix=%s,",numberingPrefix.getStr()); 2855b0a7a3cfSSteve Yin wcscat(pChar,pTemp); 2856b0a7a3cfSSteve Yin } 2857b0a7a3cfSSteve Yin } 2858b0a7a3cfSSteve Yin } 2859b0a7a3cfSSteve Yin } 2860b0a7a3cfSSteve Yin } 2861b0a7a3cfSSteve Yin 2862b0a7a3cfSSteve Yin //Because now have three types numbering level: 2863b0a7a3cfSSteve Yin //1.real numbering list,numbering level>=0 and numbering Rule !=NULL; 2864b0a7a3cfSSteve Yin //2.common paragraph, numbering level >=0, and numbering Rule == NULL; 2865b0a7a3cfSSteve Yin //3.TOC paragraph, numbering level >0, and numbering Rule ==NULL; 2866b0a7a3cfSSteve Yin // IAText:numberinglevel base on 0, but TOC's level base on 1, 2867b0a7a3cfSSteve Yin // so NumberingLevel value will be decreased 1 in bridge code. 2868b0a7a3cfSSteve Yin else if(numberingLevel >0) 2869b0a7a3cfSSteve Yin { 2870b0a7a3cfSSteve Yin swprintf(pChar,L"Numbering:NumberingLevel=%d,NumberingType=4,NumberingPrefix=,",numberingLevel-1); 2871b0a7a3cfSSteve Yin } 2872b0a7a3cfSSteve Yin else 2873b0a7a3cfSSteve Yin { 2874b0a7a3cfSSteve Yin swprintf(pChar,L"Numbering:"); 2875b0a7a3cfSSteve Yin } 28765fdc4257SSteve Yin } 28775fdc4257SSteve Yin 28785fdc4257SSteve Yin void CMAccessible::ConvertAnyToVariant(const ::com::sun::star::uno::Any &rAnyVal, VARIANT *pvData) 28795fdc4257SSteve Yin { 2880b0a7a3cfSSteve Yin if(rAnyVal.hasValue()) 2881b0a7a3cfSSteve Yin { 2882b0a7a3cfSSteve Yin // Clear VARIANT variable. 2883b0a7a3cfSSteve Yin VariantClear(pvData); 2884b0a7a3cfSSteve Yin 2885b0a7a3cfSSteve Yin // Set value according to value type. 2886b0a7a3cfSSteve Yin switch(rAnyVal.getValueTypeClass()) 2887b0a7a3cfSSteve Yin { 2888b0a7a3cfSSteve Yin case TypeClass_CHAR: 2889b0a7a3cfSSteve Yin pvData->vt = VT_UI1; 2890b0a7a3cfSSteve Yin memcpy(&pvData->bVal, rAnyVal.getValue(), sizeof(sal_Char)); 2891b0a7a3cfSSteve Yin break; 2892b0a7a3cfSSteve Yin 2893b0a7a3cfSSteve Yin case TypeClass_BOOLEAN: 2894b0a7a3cfSSteve Yin pvData->vt = VT_BOOL; 2895b0a7a3cfSSteve Yin memcpy(&pvData->boolVal, rAnyVal.getValue(), sizeof(sal_Bool)); 2896b0a7a3cfSSteve Yin break; 2897b0a7a3cfSSteve Yin 2898b0a7a3cfSSteve Yin case TypeClass_BYTE: 2899b0a7a3cfSSteve Yin pvData->vt = VT_UI1; 2900b0a7a3cfSSteve Yin memcpy(&pvData->bVal, rAnyVal.getValue(), sizeof(sal_Int8)); 2901b0a7a3cfSSteve Yin break; 2902b0a7a3cfSSteve Yin 2903b0a7a3cfSSteve Yin case TypeClass_SHORT: 2904b0a7a3cfSSteve Yin pvData->vt = VT_I2; 2905b0a7a3cfSSteve Yin memcpy(&pvData->iVal, rAnyVal.getValue(), sizeof(sal_Int16)); 2906b0a7a3cfSSteve Yin break; 2907b0a7a3cfSSteve Yin 2908b0a7a3cfSSteve Yin case TypeClass_UNSIGNED_SHORT: 2909b0a7a3cfSSteve Yin pvData->vt = VT_I2; 2910b0a7a3cfSSteve Yin memcpy(&pvData->iVal, rAnyVal.getValue(), sizeof(sal_uInt16)); 2911b0a7a3cfSSteve Yin break; 2912b0a7a3cfSSteve Yin 2913b0a7a3cfSSteve Yin case TypeClass_LONG: 2914b0a7a3cfSSteve Yin pvData->vt = VT_I4; 2915b0a7a3cfSSteve Yin memcpy(&pvData->lVal, rAnyVal.getValue(), sizeof(sal_Int32)); 2916b0a7a3cfSSteve Yin break; 2917b0a7a3cfSSteve Yin 2918b0a7a3cfSSteve Yin case TypeClass_UNSIGNED_LONG: 2919b0a7a3cfSSteve Yin pvData->vt = VT_I4; 2920b0a7a3cfSSteve Yin memcpy(&pvData->lVal, rAnyVal.getValue(), sizeof(sal_uInt32)); 2921b0a7a3cfSSteve Yin break; 2922b0a7a3cfSSteve Yin 2923b0a7a3cfSSteve Yin case TypeClass_FLOAT: 2924b0a7a3cfSSteve Yin pvData->vt = VT_R4; 2925b0a7a3cfSSteve Yin memcpy(&pvData->fltVal, rAnyVal.getValue(), sizeof(float)); 2926b0a7a3cfSSteve Yin break; 2927b0a7a3cfSSteve Yin 2928b0a7a3cfSSteve Yin case TypeClass_DOUBLE: 2929b0a7a3cfSSteve Yin pvData->vt = VT_R8; 2930b0a7a3cfSSteve Yin memcpy(&pvData->dblVal, rAnyVal.getValue(), sizeof(double)); 2931b0a7a3cfSSteve Yin break; 2932b0a7a3cfSSteve Yin 2933b0a7a3cfSSteve Yin case TypeClass_STRING: 2934b0a7a3cfSSteve Yin { 2935b0a7a3cfSSteve Yin pvData->vt = VT_BSTR; 2936b0a7a3cfSSteve Yin ::rtl::OUString val; 2937b0a7a3cfSSteve Yin rAnyVal >>= val; 2938b0a7a3cfSSteve Yin pvData->bstrVal = SysAllocString((OLECHAR *)val.getStr()); 2939b0a7a3cfSSteve Yin break; 2940b0a7a3cfSSteve Yin } 2941b0a7a3cfSSteve Yin 2942b0a7a3cfSSteve Yin case TypeClass_VOID: 2943b0a7a3cfSSteve Yin case TypeClass_HYPER: 2944b0a7a3cfSSteve Yin case TypeClass_UNSIGNED_HYPER: 2945b0a7a3cfSSteve Yin case TypeClass_TYPE: 2946b0a7a3cfSSteve Yin case TypeClass_ANY: 2947b0a7a3cfSSteve Yin case TypeClass_ENUM: 2948b0a7a3cfSSteve Yin case TypeClass_TYPEDEF: 2949b0a7a3cfSSteve Yin case TypeClass_STRUCT: 2950b0a7a3cfSSteve Yin case TypeClass_UNION: 2951b0a7a3cfSSteve Yin case TypeClass_EXCEPTION: 2952b0a7a3cfSSteve Yin case TypeClass_SEQUENCE: 2953b0a7a3cfSSteve Yin case TypeClass_ARRAY: 2954b0a7a3cfSSteve Yin case TypeClass_INTERFACE: 2955b0a7a3cfSSteve Yin { 2956b0a7a3cfSSteve Yin Reference< XAccessible > pXAcc; 2957b0a7a3cfSSteve Yin if(rAnyVal >>= pXAcc) 2958b0a7a3cfSSteve Yin { 2959b0a7a3cfSSteve Yin if(pXAcc.is()) 2960b0a7a3cfSSteve Yin { 2961b0a7a3cfSSteve Yin IAccessible* pIAcc = NULL; 2962b0a7a3cfSSteve Yin get_IAccessibleFromXAccessible((long)pXAcc.get(), &pIAcc); 2963b0a7a3cfSSteve Yin if(pIAcc == NULL) 2964b0a7a3cfSSteve Yin { 2965b0a7a3cfSSteve Yin Reference< XAccessibleContext > pXAccContext = pXAcc->getAccessibleContext(); 2966b0a7a3cfSSteve Yin g_pAgent->InsertAccObj(pXAcc.get(),pXAccContext->getAccessibleParent().get()); 2967b0a7a3cfSSteve Yin get_IAccessibleFromXAccessible((long)pXAcc.get(), &pIAcc); 2968b0a7a3cfSSteve Yin } 2969b0a7a3cfSSteve Yin if(pIAcc) 2970b0a7a3cfSSteve Yin { 2971b0a7a3cfSSteve Yin pIAcc->AddRef(); 2972b0a7a3cfSSteve Yin 2973b0a7a3cfSSteve Yin pvData->vt = VT_UNKNOWN; 2974b0a7a3cfSSteve Yin pvData->pdispVal = (IAccessible2*)pIAcc; 2975b0a7a3cfSSteve Yin break; 2976b0a7a3cfSSteve Yin } 2977b0a7a3cfSSteve Yin } 2978b0a7a3cfSSteve Yin } 2979b0a7a3cfSSteve Yin } 2980b0a7a3cfSSteve Yin case TypeClass_SERVICE: 2981b0a7a3cfSSteve Yin case TypeClass_MODULE: 2982b0a7a3cfSSteve Yin case TypeClass_INTERFACE_METHOD: 2983b0a7a3cfSSteve Yin case TypeClass_INTERFACE_ATTRIBUTE: 2984b0a7a3cfSSteve Yin case TypeClass_UNKNOWN: 2985b0a7a3cfSSteve Yin case TypeClass_PROPERTY: 2986b0a7a3cfSSteve Yin case TypeClass_CONSTANT: 2987b0a7a3cfSSteve Yin case TypeClass_CONSTANTS: 2988b0a7a3cfSSteve Yin case TypeClass_SINGLETON: 2989b0a7a3cfSSteve Yin case TypeClass_MAKE_FIXED_SIZE: 2990b0a7a3cfSSteve Yin // Output the type string, if there is other uno value type. 2991b0a7a3cfSSteve Yin pvData->vt = VT_BSTR; 2992b0a7a3cfSSteve Yin pvData->bstrVal = SysAllocString(rAnyVal.getValueTypeName().getStr()); 2993b0a7a3cfSSteve Yin break; 2994b0a7a3cfSSteve Yin 2995b0a7a3cfSSteve Yin default: 2996b0a7a3cfSSteve Yin break; 2997b0a7a3cfSSteve Yin } 2998b0a7a3cfSSteve Yin } 2999b0a7a3cfSSteve Yin else 3000b0a7a3cfSSteve Yin { 3001b0a7a3cfSSteve Yin VariantClear(pvData); 3002b0a7a3cfSSteve Yin } 30035fdc4257SSteve Yin } 30045fdc4257SSteve Yin 30055fdc4257SSteve Yin STDMETHODIMP CMAccessible::Get_XAccChildID(long* childID) 30065fdc4257SSteve Yin { 3007b0a7a3cfSSteve Yin // #CHECK# 3008b0a7a3cfSSteve Yin if(childID == NULL) 3009b0a7a3cfSSteve Yin { 3010b0a7a3cfSSteve Yin return E_FAIL; 3011b0a7a3cfSSteve Yin } 3012b0a7a3cfSSteve Yin *childID = m_dChildID; 3013b0a7a3cfSSteve Yin return S_OK; 30145fdc4257SSteve Yin } 30155fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_states(AccessibleStates __RPC_FAR *states ) 30165fdc4257SSteve Yin { 3017b0a7a3cfSSteve Yin 30185fdc4257SSteve Yin CHECK_ENABLE_INF 3019b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3020b0a7a3cfSSteve Yin ISDESTROY() 3021b0a7a3cfSSteve Yin // #CHECK XInterface# 3022b0a7a3cfSSteve Yin if( !pRContext.is() ) 3023b0a7a3cfSSteve Yin return E_FAIL; 3024b0a7a3cfSSteve Yin 3025b0a7a3cfSSteve Yin Reference<XAccessibleStateSet> pRStateSet = pRContext.get()->getAccessibleStateSet(); 3026b0a7a3cfSSteve Yin if(!pRStateSet.is()) 3027b0a7a3cfSSteve Yin { 3028b0a7a3cfSSteve Yin return S_OK; 3029b0a7a3cfSSteve Yin } 3030b0a7a3cfSSteve Yin Sequence<short> pStates = pRStateSet->getStates(); 3031b0a7a3cfSSteve Yin 3032b0a7a3cfSSteve Yin 3033b0a7a3cfSSteve Yin long count = pStates.getLength() ; 3034b0a7a3cfSSteve Yin *states = 0x0; 3035b0a7a3cfSSteve Yin for( int i = 0; i < count; i++ ) 3036b0a7a3cfSSteve Yin { 3037b0a7a3cfSSteve Yin for( int j = 0; j < sizeof(UNO_STATES) / sizeof(UNO_STATES[0]); j++ ) 3038b0a7a3cfSSteve Yin { 3039b0a7a3cfSSteve Yin if( pStates[i] == UNO_STATES[j] ) 3040b0a7a3cfSSteve Yin { 3041b0a7a3cfSSteve Yin *states |= IA2_STATES[j]; 3042b0a7a3cfSSteve Yin break; 3043b0a7a3cfSSteve Yin } 3044b0a7a3cfSSteve Yin } 3045b0a7a3cfSSteve Yin } 3046b0a7a3cfSSteve Yin return S_OK; 3047b0a7a3cfSSteve Yin 3048b0a7a3cfSSteve Yin 3049b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 30505fdc4257SSteve Yin } 30515fdc4257SSteve Yin 30525fdc4257SSteve Yin // return the UNO roles 30535fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_extendedRole( BSTR __RPC_FAR * ) 30545fdc4257SSteve Yin { 3055b0a7a3cfSSteve Yin 30565fdc4257SSteve Yin CHECK_ENABLE_INF 3057b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3058b0a7a3cfSSteve Yin ISDESTROY() 30595fdc4257SSteve Yin 3060b0a7a3cfSSteve Yin return E_NOTIMPL; 30615fdc4257SSteve Yin 3062b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 30635fdc4257SSteve Yin } 30645fdc4257SSteve Yin 30655fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_localizedExtendedRole( BSTR __RPC_FAR * ) 30665fdc4257SSteve Yin { 30675fdc4257SSteve Yin 3068b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3069b0a7a3cfSSteve Yin ISDESTROY() 3070b0a7a3cfSSteve Yin return E_NOTIMPL; 3071b0a7a3cfSSteve Yin 3072b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 30735fdc4257SSteve Yin } 30745fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_nExtendedStates( long __RPC_FAR * ) 30755fdc4257SSteve Yin { 3076b0a7a3cfSSteve Yin 30775fdc4257SSteve Yin CHECK_ENABLE_INF 3078b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3079b0a7a3cfSSteve Yin ISDESTROY() 30805fdc4257SSteve Yin 3081b0a7a3cfSSteve Yin return E_NOTIMPL; 30825fdc4257SSteve Yin 3083b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 30845fdc4257SSteve Yin } 30855fdc4257SSteve Yin 30865fdc4257SSteve Yin 30875fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_localizedExtendedStates( long, BSTR __RPC_FAR *__RPC_FAR *, long __RPC_FAR *) 30885fdc4257SSteve Yin { 30895fdc4257SSteve Yin 3090b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3091b0a7a3cfSSteve Yin ISDESTROY() 3092b0a7a3cfSSteve Yin return E_NOTIMPL; 3093b0a7a3cfSSteve Yin 3094b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 30955fdc4257SSteve Yin } 30965fdc4257SSteve Yin 30975fdc4257SSteve Yin 30985fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_indexInParent( long __RPC_FAR *accParentIndex) 30995fdc4257SSteve Yin { 3100b0a7a3cfSSteve Yin 31015fdc4257SSteve Yin CHECK_ENABLE_INF 3102b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3103b0a7a3cfSSteve Yin ISDESTROY() 3104b0a7a3cfSSteve Yin // #CHECK# 3105b0a7a3cfSSteve Yin if(accParentIndex == NULL) 3106b0a7a3cfSSteve Yin return E_INVALIDARG; 31075fdc4257SSteve Yin 3108b0a7a3cfSSteve Yin // #CHECK XInterface# 3109b0a7a3cfSSteve Yin if( !pRContext.is() ) 3110b0a7a3cfSSteve Yin return E_FAIL; 31115fdc4257SSteve Yin 3112b0a7a3cfSSteve Yin *accParentIndex = pRContext.get()->getAccessibleIndexInParent(); 3113b0a7a3cfSSteve Yin return S_OK; 31145fdc4257SSteve Yin 31155fdc4257SSteve Yin 3116b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 31175fdc4257SSteve Yin } 31185fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_locale( IA2Locale __RPC_FAR *locale ) 31195fdc4257SSteve Yin { 3120b0a7a3cfSSteve Yin 31215fdc4257SSteve Yin CHECK_ENABLE_INF 3122b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3123b0a7a3cfSSteve Yin ISDESTROY() 3124b0a7a3cfSSteve Yin if(locale == NULL) 3125b0a7a3cfSSteve Yin return E_INVALIDARG; 3126b0a7a3cfSSteve Yin // #CHECK XInterface# 31275fdc4257SSteve Yin 3128b0a7a3cfSSteve Yin if( !pRContext.is() ) 3129b0a7a3cfSSteve Yin return E_FAIL; 31305fdc4257SSteve Yin 3131b0a7a3cfSSteve Yin ::com::sun::star::lang::Locale unoLoc = pRContext.get()->getLocale(); 3132b0a7a3cfSSteve Yin locale->language = SysAllocString((OLECHAR*)unoLoc.Language.getStr()); 3133b0a7a3cfSSteve Yin locale->country = SysAllocString((OLECHAR*)unoLoc.Country.getStr()); 3134b0a7a3cfSSteve Yin locale->variant = SysAllocString((OLECHAR*)unoLoc.Variant.getStr()); 31355fdc4257SSteve Yin 3136b0a7a3cfSSteve Yin return S_OK; 31375fdc4257SSteve Yin 3138b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 31395fdc4257SSteve Yin } 31405fdc4257SSteve Yin 31415fdc4257SSteve Yin DWORD GetMSAAStateFromUNO(short xState) 31425fdc4257SSteve Yin { 3143b0a7a3cfSSteve Yin DWORD IState = STATE_SYSTEM_UNAVAILABLE; 3144b0a7a3cfSSteve Yin switch( xState ) 3145b0a7a3cfSSteve Yin { 3146b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::BUSY: 3147b0a7a3cfSSteve Yin IState = STATE_SYSTEM_BUSY; 3148b0a7a3cfSSteve Yin break; 3149b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::CHECKED: 3150b0a7a3cfSSteve Yin IState = STATE_SYSTEM_CHECKED; 3151b0a7a3cfSSteve Yin break; 3152b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::DEFUNC: 3153b0a7a3cfSSteve Yin IState = STATE_SYSTEM_UNAVAILABLE; 3154b0a7a3cfSSteve Yin break; 3155b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::EXPANDED: 3156b0a7a3cfSSteve Yin IState = STATE_SYSTEM_EXPANDED; 3157b0a7a3cfSSteve Yin break; 3158b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::FOCUSABLE: 3159b0a7a3cfSSteve Yin IState = STATE_SYSTEM_FOCUSABLE; 3160b0a7a3cfSSteve Yin break; 3161b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::FOCUSED: 3162b0a7a3cfSSteve Yin IState = STATE_SYSTEM_FOCUSED; 3163b0a7a3cfSSteve Yin break; 3164b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::INDETERMINATE: 3165b0a7a3cfSSteve Yin IState = STATE_SYSTEM_MIXED; 3166b0a7a3cfSSteve Yin break; 3167b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::MULTI_SELECTABLE: 3168b0a7a3cfSSteve Yin IState = STATE_SYSTEM_MULTISELECTABLE; 3169b0a7a3cfSSteve Yin break; 3170b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::PRESSED: 3171b0a7a3cfSSteve Yin IState = STATE_SYSTEM_PRESSED; 3172b0a7a3cfSSteve Yin break; 3173b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::RESIZABLE: 3174b0a7a3cfSSteve Yin IState = STATE_SYSTEM_SIZEABLE; 3175b0a7a3cfSSteve Yin break; 3176b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::SELECTABLE: 3177b0a7a3cfSSteve Yin IState = STATE_SYSTEM_SELECTABLE; 3178b0a7a3cfSSteve Yin break; 3179b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::SELECTED: 3180b0a7a3cfSSteve Yin IState = STATE_SYSTEM_SELECTED; 3181b0a7a3cfSSteve Yin break; 3182b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::ARMED: 3183b0a7a3cfSSteve Yin IState = STATE_SYSTEM_FOCUSED; 3184b0a7a3cfSSteve Yin break; 3185b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::EXPANDABLE: 3186b0a7a3cfSSteve Yin IState = STATE_SYSTEM_COLLAPSED; 3187b0a7a3cfSSteve Yin break; 3188b0a7a3cfSSteve Yin default: 3189b0a7a3cfSSteve Yin break; 3190b0a7a3cfSSteve Yin } 3191b0a7a3cfSSteve Yin return IState; 31925fdc4257SSteve Yin } 31935fdc4257SSteve Yin 31945fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_appName( BSTR __RPC_FAR *name) 31955fdc4257SSteve Yin { 31965fdc4257SSteve Yin 3197b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3198b0a7a3cfSSteve Yin ISDESTROY() 3199b0a7a3cfSSteve Yin if(name == NULL) 3200b0a7a3cfSSteve Yin return E_INVALIDARG; 3201b0a7a3cfSSteve Yin 3202b0a7a3cfSSteve Yin *name = SysAllocString(OLESTR("Hannover")); 3203b0a7a3cfSSteve Yin return S_OK; 3204b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 32055fdc4257SSteve Yin } 32065fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_appVersion(BSTR __RPC_FAR *version) 32075fdc4257SSteve Yin { 3208b0a7a3cfSSteve Yin 3209b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3210b0a7a3cfSSteve Yin ISDESTROY() 3211b0a7a3cfSSteve Yin if(version == NULL) 3212b0a7a3cfSSteve Yin return E_INVALIDARG; 3213b0a7a3cfSSteve Yin *version=SysAllocString(OLESTR("3.0")); 3214b0a7a3cfSSteve Yin return S_OK; 3215b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 32165fdc4257SSteve Yin } 32175fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_toolkitName(BSTR __RPC_FAR *name) 32185fdc4257SSteve Yin { 3219b0a7a3cfSSteve Yin 3220b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3221b0a7a3cfSSteve Yin ISDESTROY() 3222b0a7a3cfSSteve Yin if(name == NULL) 3223b0a7a3cfSSteve Yin return E_INVALIDARG; 3224b0a7a3cfSSteve Yin *name = SysAllocString(OLESTR(" ")); 3225b0a7a3cfSSteve Yin return S_OK; 3226b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 32275fdc4257SSteve Yin } 32285fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_toolkitVersion(BSTR __RPC_FAR *version) 32295fdc4257SSteve Yin { 3230b0a7a3cfSSteve Yin 3231b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3232b0a7a3cfSSteve Yin ISDESTROY() 3233b0a7a3cfSSteve Yin if(version == NULL) 3234b0a7a3cfSSteve Yin return E_INVALIDARG; 3235b0a7a3cfSSteve Yin *version = SysAllocString(OLESTR(" ")); 3236b0a7a3cfSSteve Yin return S_OK; 3237b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 32385fdc4257SSteve Yin } 32395fdc4257SSteve Yin 32405fdc4257SSteve Yin 32415fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_attributes(/*[out]*/ BSTR *pAttr) 32425fdc4257SSteve Yin { 32435fdc4257SSteve Yin CHECK_ENABLE_INF 3244b0a7a3cfSSteve Yin Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext(); 3245b0a7a3cfSSteve Yin if( !pRContext.is() ) 3246b0a7a3cfSSteve Yin { 3247b0a7a3cfSSteve Yin return E_FAIL; 3248b0a7a3cfSSteve Yin } 3249b0a7a3cfSSteve Yin Reference<XAccessibleExtendedAttributes> pRXI(pRContext,UNO_QUERY); 3250b0a7a3cfSSteve Yin if( !pRXI.is() ) 3251b0a7a3cfSSteve Yin return E_FAIL; 3252b0a7a3cfSSteve Yin else 3253b0a7a3cfSSteve Yin { 3254b0a7a3cfSSteve Yin com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleExtendedAttributes> pRXAttr; 3255b0a7a3cfSSteve Yin pRXAttr = pRXI.get(); 3256b0a7a3cfSSteve Yin ::com::sun::star::uno::Any anyVal = pRXAttr->getExtendedAttributes(); 3257b0a7a3cfSSteve Yin 3258b0a7a3cfSSteve Yin ::rtl::OUString val; 3259b0a7a3cfSSteve Yin anyVal >>= val; 3260b0a7a3cfSSteve Yin 3261b0a7a3cfSSteve Yin if(*pAttr) 3262b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(*pAttr); 3263b0a7a3cfSSteve Yin *pAttr = SysAllocString((OLECHAR *)val.getStr()); 3264b0a7a3cfSSteve Yin 3265b0a7a3cfSSteve Yin return S_OK; 3266b0a7a3cfSSteve Yin } 32675fdc4257SSteve Yin } 32685fdc4257SSteve Yin 3269