13a700b0aSSteve Yin /************************************************************** 2*b0a7a3cfSSteve Yin * 3*b0a7a3cfSSteve Yin * Licensed to the Apache Software Foundation (ASF) under one 4*b0a7a3cfSSteve Yin * or more contributor license agreements. See the NOTICE file 5*b0a7a3cfSSteve Yin * distributed with this work for additional information 6*b0a7a3cfSSteve Yin * regarding copyright ownership. The ASF licenses this file 7*b0a7a3cfSSteve Yin * to you under the Apache License, Version 2.0 (the 8*b0a7a3cfSSteve Yin * "License"); you may not use this file except in compliance 9*b0a7a3cfSSteve Yin * with the License. You may obtain a copy of the License at 10*b0a7a3cfSSteve Yin * 11*b0a7a3cfSSteve Yin * http://www.apache.org/licenses/LICENSE-2.0 12*b0a7a3cfSSteve Yin * 13*b0a7a3cfSSteve Yin * Unless required by applicable law or agreed to in writing, 14*b0a7a3cfSSteve Yin * software distributed under the License is distributed on an 15*b0a7a3cfSSteve Yin * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b0a7a3cfSSteve Yin * KIND, either express or implied. See the License for the 17*b0a7a3cfSSteve Yin * specific language governing permissions and limitations 18*b0a7a3cfSSteve Yin * under the License. 19*b0a7a3cfSSteve Yin * 20*b0a7a3cfSSteve 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 48*b0a7a3cfSSteve 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[] = 55*b0a7a3cfSSteve Yin { 56*b0a7a3cfSSteve Yin IA2_STATE_ACTIVE, // = 0x1; 57*b0a7a3cfSSteve Yin IA2_STATE_ARMED, // = 0x2; 58*b0a7a3cfSSteve Yin IA2_STATE_DEFUNCT, // = 0x4; 59*b0a7a3cfSSteve Yin IA2_STATE_EDITABLE, // = 0x8; 60*b0a7a3cfSSteve Yin IA2_STATE_HORIZONTAL, // = 0x10; 61*b0a7a3cfSSteve Yin IA2_STATE_ICONIFIED, // = 0x20; 62*b0a7a3cfSSteve Yin IA2_STATE_INVALID_ENTRY, // = 0x80; 63*b0a7a3cfSSteve Yin IA2_STATE_MANAGES_DESCENDANTS, // = 0x100; 64*b0a7a3cfSSteve Yin IA2_STATE_MODAL, // = 0x200; 65*b0a7a3cfSSteve Yin IA2_STATE_MULTI_LINE, // = 0x400; 66*b0a7a3cfSSteve Yin IA2_STATE_OPAQUE, // = 0x800; 67*b0a7a3cfSSteve Yin IA2_STATE_REQUIRED, // = 0x2000; 68*b0a7a3cfSSteve Yin IA2_STATE_SELECTABLE_TEXT, // = 0x3000; 69*b0a7a3cfSSteve Yin IA2_STATE_SINGLE_LINE, // = 0x4000; 70*b0a7a3cfSSteve Yin IA2_STATE_STALE, // = 0x8000; 71*b0a7a3cfSSteve Yin IA2_STATE_SUPPORTS_AUTOCOMPLETION, // = 0x10000; 72*b0a7a3cfSSteve Yin IA2_STATE_TRANSIENT, //= 0x20000; 73*b0a7a3cfSSteve Yin IA2_STATE_VERTICAL // = 0x40000; 74*b0a7a3cfSSteve Yin }; 755fdc4257SSteve Yin /* 76*b0a7a3cfSSteve Yin 775fdc4257SSteve Yin <=== map ===> 78*b0a7a3cfSSteve Yin 795fdc4257SSteve Yin */ 805fdc4257SSteve Yin short UNO_STATES[] = 81*b0a7a3cfSSteve Yin { 82*b0a7a3cfSSteve Yin ACTIVE, // = (sal_Int16)1; 83*b0a7a3cfSSteve Yin ARMED, // = (sal_Int16)2; 84*b0a7a3cfSSteve Yin DEFUNC, // = (sal_Int16)5; 85*b0a7a3cfSSteve Yin EDITABLE, // = (sal_Int16)6; 86*b0a7a3cfSSteve Yin HORIZONTAL, // = (sal_Int16)12; 87*b0a7a3cfSSteve Yin ICONIFIED, // = (sal_Int16)13; 88*b0a7a3cfSSteve Yin -1, //IA2_STATE_INVALID_ENTRY 89*b0a7a3cfSSteve Yin MANAGES_DESCENDANTS, // = (sal_Int16)15; 90*b0a7a3cfSSteve Yin MODAL, // = (sal_Int16)16; 91*b0a7a3cfSSteve Yin MULTI_LINE, // = (sal_Int16)17; 92*b0a7a3cfSSteve Yin OPAQUE, // = (sal_Int16)19; 93*b0a7a3cfSSteve Yin -1, //IA2_STATE_REQUIRED 94*b0a7a3cfSSteve Yin -1, //IA2_STATE_SELECTABLE_TEXT 95*b0a7a3cfSSteve Yin SINGLE_LINE, // = (sal_Int16)26; 96*b0a7a3cfSSteve Yin STALE, // = (sal_Int16)27; 97*b0a7a3cfSSteve Yin -1, //IA2_STATE_SUPPORTS_AUTOCOMPLETION 98*b0a7a3cfSSteve Yin TRANSIENT, //IA2_STATE_TRANSIENT 99*b0a7a3cfSSteve Yin VERTICAL // = (sal_Int16)29; 100*b0a7a3cfSSteve Yin }; 1015fdc4257SSteve Yin 1025fdc4257SSteve Yin // <=== map ===> 1035fdc4257SSteve Yin 1045fdc4257SSteve Yin BSTR IA2_STATES_NAME[] = 105*b0a7a3cfSSteve Yin { 106*b0a7a3cfSSteve Yin _T("Active"), 107*b0a7a3cfSSteve Yin _T("Armed"), 108*b0a7a3cfSSteve Yin _T("Defunct"), 109*b0a7a3cfSSteve Yin _T("Editable"), 110*b0a7a3cfSSteve Yin _T("Horizontal"), 111*b0a7a3cfSSteve Yin _T("Iconified"), 112*b0a7a3cfSSteve Yin _T("Invalid Entry"), 113*b0a7a3cfSSteve Yin _T("Manages Decendents"), 114*b0a7a3cfSSteve Yin _T("Modal"), 115*b0a7a3cfSSteve Yin _T("Multi Line"), 116*b0a7a3cfSSteve Yin _T("Opaque"), 117*b0a7a3cfSSteve Yin _T("Required"), 118*b0a7a3cfSSteve Yin _T("Selectable Text"), 119*b0a7a3cfSSteve Yin _T("Single Line"), 120*b0a7a3cfSSteve Yin _T("Stale"), 121*b0a7a3cfSSteve Yin _T("Supports Autocompletion"), 122*b0a7a3cfSSteve Yin _T("Transient"), 123*b0a7a3cfSSteve Yin _T("Vertical") 124*b0a7a3cfSSteve 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[] = 130*b0a7a3cfSSteve Yin { 131*b0a7a3cfSSteve Yin _T("INVALID"), // INVALID ( 0 ) 132*b0a7a3cfSSteve Yin _T("ACTIVE"), // ACTIVE ( 1 ) 133*b0a7a3cfSSteve Yin _T("ARMED"), // ARMED ( 2 ) 134*b0a7a3cfSSteve Yin _T("BUSY"), // BUSY ( 3 ) 135*b0a7a3cfSSteve Yin _T("CHECKED"), // CHECKED ( 4 ) 136*b0a7a3cfSSteve Yin _T("DEFUNC"), // DEFUNC ( 5 ) 137*b0a7a3cfSSteve Yin _T("EDITABLE"), // EDITABLE ( 6 ) 138*b0a7a3cfSSteve Yin _T("ENABLED"), // ENABLED ( 7 ) 139*b0a7a3cfSSteve Yin _T("EXPANDABLE"), // EXPANDABLE ( 8 ) 140*b0a7a3cfSSteve Yin _T("EXPANDED"), // EXPANDED ( 9 ) 141*b0a7a3cfSSteve Yin _T("FOCUSABLE"), // FOCUSABLE ( 10 ) 142*b0a7a3cfSSteve Yin _T("FOCUSED"), // FOCUSED ( 11 ) 143*b0a7a3cfSSteve Yin _T("HORIZONTAL"), // HORIZONTAL ( 12 ) 144*b0a7a3cfSSteve Yin _T("ICONIFIED"), // ICONIFIED ( 13 ) 145*b0a7a3cfSSteve Yin _T("INDETERMINATE"), // INDETERMINATE ( 14 ) 146*b0a7a3cfSSteve Yin _T("MANAGES_DESCENDANTS"),// MANAGES_DESCENDANTS ( 15 ) 147*b0a7a3cfSSteve Yin _T("MODAL"), // MODAL ( 16 ) 148*b0a7a3cfSSteve Yin _T("MULTI_LINE"), // MULTI_LINE ( 17 ) 149*b0a7a3cfSSteve Yin _T("MULTI_SELECTABLE"), // MULTI_SELECTABLE ( 18 ) 150*b0a7a3cfSSteve Yin _T("OPAQUE"), // OPAQUE ( 19 ) 151*b0a7a3cfSSteve Yin _T("PRESSED"), // PRESSED ( 20 ) 152*b0a7a3cfSSteve Yin _T("RESIZABLE"), // RESIZABLE ( 21 ) 153*b0a7a3cfSSteve Yin _T("SELECTABLE"), // SELECTABLE ( 22 ) 154*b0a7a3cfSSteve Yin _T("SELECTED"), // SELECTED ( 23 ) 155*b0a7a3cfSSteve Yin _T("SENSITIVE"), // SENSITIVE ( 24 ) 156*b0a7a3cfSSteve Yin _T("SHOWING"), // SHOWING ( 25 ) 157*b0a7a3cfSSteve Yin _T("SINGLE_LINE"), // SINGLE_LINE ( 26 ) 158*b0a7a3cfSSteve Yin _T("STALE"), // STALE ( 27 ) 159*b0a7a3cfSSteve Yin _T("TRANSIENT"), // TRANSIENT ( 28 ) 160*b0a7a3cfSSteve Yin _T("VERTICAL"), // VERTICAL ( 29 ) 161*b0a7a3cfSSteve Yin _T("VISIBLE"), // VISIBLE ( 30 ) 162*b0a7a3cfSSteve Yin _T("MOVEABLE"), // MOVEABLE ( 31 ) 163*b0a7a3cfSSteve Yin _T("OFFSCREEN"), // OFFSCREEN ( 32 ) 164*b0a7a3cfSSteve Yin _T("COLLAPSE"), // COLLAPSE ( 33 ) 165*b0a7a3cfSSteve Yin _T("DEFAULT") // DEFAULT ( 34 ) 166*b0a7a3cfSSteve 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) \ 176*b0a7a3cfSSteve Yin return FALSE; \ 1775fdc4257SSteve Yin pRContext = pXAcc->getAccessibleContext(); \ 1785fdc4257SSteve Yin if( !pRContext.is() ) \ 179*b0a7a3cfSSteve Yin { \ 180*b0a7a3cfSSteve Yin return FALSE; \ 181*b0a7a3cfSSteve Yin } \ 1825fdc4257SSteve Yin Reference<X##ainterface> pRXI(pRContext,UNO_QUERY);\ 1835fdc4257SSteve Yin if( !pRXI.is() ) \ 184*b0a7a3cfSSteve Yin { \ 185*b0a7a3cfSSteve Yin return FALSE; \ 186*b0a7a3cfSSteve Yin } \ 1875fdc4257SSteve Yin *ppXI = (XInterface*)pRXI.get(); \ 1885fdc4257SSteve Yin return TRUE; \ 1895fdc4257SSteve Yin } 1905fdc4257SSteve Yin 1915fdc4257SSteve Yin #define ISDESTROY() \ 1925fdc4257SSteve Yin if(m_isDestroy) \ 193*b0a7a3cfSSteve Yin return S_FALSE; 1945fdc4257SSteve Yin 1955fdc4257SSteve Yin 1965fdc4257SSteve Yin AccObjectManagerAgent* CMAccessible::g_pAgent = NULL; 1975fdc4257SSteve Yin 1985fdc4257SSteve Yin CMAccessible::CMAccessible(): 199*b0a7a3cfSSteve Yin m_iRole(0x00), 200*b0a7a3cfSSteve Yin m_dState(0x00), 201*b0a7a3cfSSteve Yin m_dChildID(0x00), 202*b0a7a3cfSSteve Yin m_dFocusChildID(UACC_NO_FOCUS), 203*b0a7a3cfSSteve Yin m_hwnd(NULL), 204*b0a7a3cfSSteve Yin m_pIParent(NULL), 205*b0a7a3cfSSteve Yin m_pszName(NULL), 206*b0a7a3cfSSteve Yin m_pszValue(NULL), 207*b0a7a3cfSSteve Yin m_pszDescription(NULL), 208*b0a7a3cfSSteve Yin m_isDestroy(FALSE), 209*b0a7a3cfSSteve Yin m_pszActionDescription(NULL), 210*b0a7a3cfSSteve Yin m_pXAction(NULL), 211*b0a7a3cfSSteve Yin m_bRequiresSave(FALSE), 212*b0a7a3cfSSteve Yin pUNOInterface(NULL) 213*b0a7a3cfSSteve Yin { 214*b0a7a3cfSSteve Yin m_sLocation.m_dLeft=0; 215*b0a7a3cfSSteve Yin m_sLocation.m_dTop = 0; 216*b0a7a3cfSSteve Yin m_sLocation.m_dWidth=0; 217*b0a7a3cfSSteve Yin m_sLocation.m_dHeight=0; 218*b0a7a3cfSSteve Yin CEnumVariant::Create(&m_pEnumVar); 2195fdc4257SSteve Yin } 2205fdc4257SSteve Yin 2215fdc4257SSteve Yin CMAccessible::~CMAccessible() 2225fdc4257SSteve Yin { 223*b0a7a3cfSSteve Yin if(m_pszName!=NULL) 224*b0a7a3cfSSteve Yin { 225*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(m_pszName); 226*b0a7a3cfSSteve Yin m_pszName=NULL; 227*b0a7a3cfSSteve Yin } 228*b0a7a3cfSSteve Yin if(m_pszValue!=NULL) 229*b0a7a3cfSSteve Yin { 230*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(m_pszValue); 231*b0a7a3cfSSteve Yin m_pszValue=NULL; 232*b0a7a3cfSSteve Yin } 233*b0a7a3cfSSteve Yin if(m_pszDescription!=NULL) 234*b0a7a3cfSSteve Yin { 235*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(m_pszDescription); 236*b0a7a3cfSSteve Yin m_pszDescription=NULL; 237*b0a7a3cfSSteve Yin } 238*b0a7a3cfSSteve Yin 239*b0a7a3cfSSteve Yin if(m_pszActionDescription!=NULL) 240*b0a7a3cfSSteve Yin { 241*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(m_pszActionDescription); 242*b0a7a3cfSSteve Yin m_pszActionDescription=NULL; 243*b0a7a3cfSSteve Yin } 244*b0a7a3cfSSteve Yin 245*b0a7a3cfSSteve Yin if(m_pIParent) 246*b0a7a3cfSSteve Yin { 247*b0a7a3cfSSteve Yin m_pIParent->Release(); 248*b0a7a3cfSSteve Yin m_pIParent=NULL; 249*b0a7a3cfSSteve Yin } 250*b0a7a3cfSSteve Yin pRef = NULL; 251*b0a7a3cfSSteve Yin m_pEnumVar->Release(); 252*b0a7a3cfSSteve Yin m_containedObjects.clear(); 253*b0a7a3cfSSteve Yin pRContext = NULL; 2545fdc4257SSteve Yin } 2555fdc4257SSteve Yin 2565fdc4257SSteve Yin /** 2575fdc4257SSteve Yin * Returns the Parent IAccessible interface pointer to AT. 2585fdc4257SSteve Yin * It should add reference, and the client should release the component. 2595fdc4257SSteve Yin * It should return E_FAIL when the parent point is null. 2605fdc4257SSteve Yin * @param ppdispParent [in,out] used to return the parent interface point. 2615fdc4257SSteve Yin * when the point is null, should return null. 2625fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if the m_pIParent is NULL. 2635fdc4257SSteve Yin */ 2645fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accParent(IDispatch **ppdispParent) 2655fdc4257SSteve Yin { 266*b0a7a3cfSSteve Yin 2675fdc4257SSteve Yin CHECK_ENABLE_INF 268*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 269*b0a7a3cfSSteve Yin ISDESTROY() 270*b0a7a3cfSSteve Yin // #CHECK# 271*b0a7a3cfSSteve Yin if(ppdispParent == NULL) 272*b0a7a3cfSSteve Yin { 273*b0a7a3cfSSteve Yin return E_INVALIDARG; 274*b0a7a3cfSSteve Yin } 275*b0a7a3cfSSteve Yin 276*b0a7a3cfSSteve Yin if(m_pIParent) 277*b0a7a3cfSSteve Yin { 278*b0a7a3cfSSteve Yin *ppdispParent = m_pIParent; 279*b0a7a3cfSSteve Yin (*ppdispParent)->AddRef(); 280*b0a7a3cfSSteve Yin return S_OK; 281*b0a7a3cfSSteve Yin } 282*b0a7a3cfSSteve Yin else if(m_hwnd) 283*b0a7a3cfSSteve Yin { 284*b0a7a3cfSSteve Yin HRESULT hr = AccessibleObjectFromWindow(m_hwnd, OBJID_WINDOW, IID_IAccessible, (void**)ppdispParent); 285*b0a7a3cfSSteve Yin if( ! SUCCEEDED( hr ) || ! ppdispParent ) 286*b0a7a3cfSSteve Yin { 287*b0a7a3cfSSteve Yin return S_FALSE; 288*b0a7a3cfSSteve Yin } 289*b0a7a3cfSSteve Yin return S_OK; 290*b0a7a3cfSSteve Yin } 291*b0a7a3cfSSteve Yin return S_FALSE; 292*b0a7a3cfSSteve Yin 293*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 2945fdc4257SSteve Yin } 2955fdc4257SSteve Yin 2965fdc4257SSteve Yin /** 2975fdc4257SSteve Yin * Returns child count of current COM object. 2985fdc4257SSteve Yin * @param pcountChildren [in,out] used to return the children count. 2995fdc4257SSteve Yin * @return S_OK if successful. 3005fdc4257SSteve Yin */ 3015fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accChildCount(long *pcountChildren) 3025fdc4257SSteve Yin { 303*b0a7a3cfSSteve Yin 3045fdc4257SSteve Yin CHECK_ENABLE_INF 305*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 306*b0a7a3cfSSteve Yin ISDESTROY() 307*b0a7a3cfSSteve Yin // #CHECK# 308*b0a7a3cfSSteve Yin if(pcountChildren == NULL) 309*b0a7a3cfSSteve Yin { 310*b0a7a3cfSSteve Yin return E_INVALIDARG; 311*b0a7a3cfSSteve Yin } 3125fdc4257SSteve Yin 313*b0a7a3cfSSteve Yin if(!pUNOInterface) 314*b0a7a3cfSSteve Yin return S_FALSE; 3155fdc4257SSteve Yin 316*b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext(); 317*b0a7a3cfSSteve Yin if( pRContext.is() ) 318*b0a7a3cfSSteve Yin { 319*b0a7a3cfSSteve Yin *pcountChildren = pRContext->getAccessibleChildCount(); 320*b0a7a3cfSSteve Yin } 3215fdc4257SSteve Yin 322*b0a7a3cfSSteve Yin return S_OK; 3235fdc4257SSteve Yin 324*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 3255fdc4257SSteve Yin } 3265fdc4257SSteve Yin 3275fdc4257SSteve Yin /** 3285fdc4257SSteve Yin * Returns child interface pointer for AT according to input child ID. 3295fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 3305fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 3315fdc4257SSteve Yin * @param ppdispChild, [in,out] use to return the child interface point. 3325fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 3335fdc4257SSteve Yin */ 3345fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accChild(VARIANT varChild, IDispatch **ppdispChild) 3355fdc4257SSteve Yin { 336*b0a7a3cfSSteve Yin 3375fdc4257SSteve Yin CHECK_ENABLE_INF 338*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 339*b0a7a3cfSSteve Yin ISDESTROY() 340*b0a7a3cfSSteve Yin // #CHECK# 341*b0a7a3cfSSteve Yin if(ppdispChild == NULL) 342*b0a7a3cfSSteve Yin { 343*b0a7a3cfSSteve Yin return E_INVALIDARG; 344*b0a7a3cfSSteve Yin } 345*b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 346*b0a7a3cfSSteve Yin { 347*b0a7a3cfSSteve Yin //get child interface pointer due to child ID 348*b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 349*b0a7a3cfSSteve Yin { 350*b0a7a3cfSSteve Yin AddRef(); 351*b0a7a3cfSSteve Yin *ppdispChild = this; 352*b0a7a3cfSSteve Yin return S_OK; 353*b0a7a3cfSSteve Yin } 354*b0a7a3cfSSteve Yin *ppdispChild = GetChildInterface(varChild.lVal); 355*b0a7a3cfSSteve Yin (*ppdispChild)->AddRef(); 356*b0a7a3cfSSteve Yin return (*ppdispChild)?S_OK:S_FALSE; 357*b0a7a3cfSSteve Yin } 358*b0a7a3cfSSteve Yin return S_FALSE; 359*b0a7a3cfSSteve Yin 360*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 3615fdc4257SSteve Yin } 3625fdc4257SSteve Yin 3635fdc4257SSteve Yin /** 3645fdc4257SSteve Yin * Returns the accessible name of the current COM object self or its one child to AT. 3655fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 3665fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 3675fdc4257SSteve Yin * @param pszName, [in,out] use to return the name of the proper object. 3685fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 3695fdc4257SSteve Yin */ 3705fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accName(VARIANT varChild, BSTR *pszName) 3715fdc4257SSteve Yin { 372*b0a7a3cfSSteve Yin 3735fdc4257SSteve Yin CHECK_ENABLE_INF 374*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 375*b0a7a3cfSSteve Yin ISDESTROY() 376*b0a7a3cfSSteve Yin // #CHECK# 377*b0a7a3cfSSteve Yin if(pszName == NULL) 378*b0a7a3cfSSteve Yin { 379*b0a7a3cfSSteve Yin return E_INVALIDARG; 380*b0a7a3cfSSteve Yin } 381*b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 382*b0a7a3cfSSteve Yin { 383*b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 384*b0a7a3cfSSteve Yin { 385*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(*pszName); 386*b0a7a3cfSSteve Yin *pszName = SysAllocString(m_pszName); 387*b0a7a3cfSSteve Yin return S_OK; 388*b0a7a3cfSSteve Yin } 389*b0a7a3cfSSteve Yin 390*b0a7a3cfSSteve Yin long lVal = varChild.lVal; 391*b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 392*b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 393*b0a7a3cfSSteve Yin if(!pChild) 394*b0a7a3cfSSteve Yin return E_FAIL; 395*b0a7a3cfSSteve Yin return pChild->get_accName(varChild,pszName); 396*b0a7a3cfSSteve Yin } 397*b0a7a3cfSSteve Yin return S_FALSE; 398*b0a7a3cfSSteve Yin 399*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 4005fdc4257SSteve Yin } 4015fdc4257SSteve Yin 4025fdc4257SSteve Yin /** 4035fdc4257SSteve Yin * Returns the accessible value of the current COM object self or its one child to AT. 4045fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 4055fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 4065fdc4257SSteve Yin * @param pszValue, [in,out] use to return the value of the proper object. 4075fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 4085fdc4257SSteve Yin */ 4095fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accValue(VARIANT varChild, BSTR *pszValue) 4105fdc4257SSteve Yin { 411*b0a7a3cfSSteve Yin 4125fdc4257SSteve Yin CHECK_ENABLE_INF 413*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 414*b0a7a3cfSSteve Yin ISDESTROY() 415*b0a7a3cfSSteve Yin // #CHECK# 416*b0a7a3cfSSteve Yin if( pszValue == NULL ) 417*b0a7a3cfSSteve Yin { 418*b0a7a3cfSSteve Yin return E_INVALIDARG; 419*b0a7a3cfSSteve Yin } 420*b0a7a3cfSSteve Yin if( varChild.vt==VT_I4 ) 421*b0a7a3cfSSteve Yin { 422*b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 423*b0a7a3cfSSteve Yin { 424*b0a7a3cfSSteve Yin if(m_dState & STATE_SYSTEM_PROTECTED) 425*b0a7a3cfSSteve Yin return E_ACCESSDENIED; 426*b0a7a3cfSSteve Yin 427*b0a7a3cfSSteve Yin if ( m_pszValue !=NULL && wcslen(m_pszValue) == 0 ) 428*b0a7a3cfSSteve Yin return S_OK; 429*b0a7a3cfSSteve Yin 430*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(*pszValue); 431*b0a7a3cfSSteve Yin *pszValue = SysAllocString(m_pszValue); 432*b0a7a3cfSSteve Yin return S_OK; 433*b0a7a3cfSSteve Yin } 434*b0a7a3cfSSteve Yin 435*b0a7a3cfSSteve Yin long lVal = varChild.lVal; 436*b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 437*b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 438*b0a7a3cfSSteve Yin if(!pChild) 439*b0a7a3cfSSteve Yin return E_FAIL; 440*b0a7a3cfSSteve Yin return pChild->get_accValue(varChild,pszValue); 441*b0a7a3cfSSteve Yin } 442*b0a7a3cfSSteve Yin return S_FALSE; 443*b0a7a3cfSSteve Yin 444*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 4455fdc4257SSteve Yin } 4465fdc4257SSteve Yin 4475fdc4257SSteve Yin /** 4485fdc4257SSteve Yin * Returns the accessible description of the current COM object self or its one child to AT. 4495fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 4505fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 4515fdc4257SSteve Yin * @param pszDescription, [in,out] use to return the description of the proper object. 4525fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 4535fdc4257SSteve Yin */ 4545fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accDescription(VARIANT varChild, BSTR *pszDescription) 4555fdc4257SSteve Yin { 456*b0a7a3cfSSteve Yin 4575fdc4257SSteve Yin CHECK_ENABLE_INF 458*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 459*b0a7a3cfSSteve Yin ISDESTROY() 460*b0a7a3cfSSteve Yin // #CHECK# 461*b0a7a3cfSSteve Yin if(pszDescription == NULL) 462*b0a7a3cfSSteve Yin { 463*b0a7a3cfSSteve Yin return E_INVALIDARG; 464*b0a7a3cfSSteve Yin } 465*b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 466*b0a7a3cfSSteve Yin { 467*b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 468*b0a7a3cfSSteve Yin { 469*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(*pszDescription); 470*b0a7a3cfSSteve Yin *pszDescription = SysAllocString(m_pszDescription); 471*b0a7a3cfSSteve Yin return S_OK; 472*b0a7a3cfSSteve Yin } 473*b0a7a3cfSSteve Yin 474*b0a7a3cfSSteve Yin long lVal = varChild.lVal; 475*b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 476*b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 477*b0a7a3cfSSteve Yin if(!pChild) 478*b0a7a3cfSSteve Yin return E_FAIL; 479*b0a7a3cfSSteve Yin return pChild->get_accDescription(varChild,pszDescription); 480*b0a7a3cfSSteve Yin } 481*b0a7a3cfSSteve Yin return S_FALSE; 482*b0a7a3cfSSteve Yin 483*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 4845fdc4257SSteve Yin } 4855fdc4257SSteve Yin 4865fdc4257SSteve Yin /** 4875fdc4257SSteve Yin * Returns the accessible role of the current COM object self or its one child to AT. 4885fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 4895fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 4905fdc4257SSteve Yin * @param pvarRole, [in,out] use to return the role of the proper object. 4915fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 4925fdc4257SSteve Yin */ 4935fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accRole(VARIANT varChild, VARIANT *pvarRole) 4945fdc4257SSteve Yin { 495*b0a7a3cfSSteve Yin 4965fdc4257SSteve Yin CHECK_ENABLE_INF 497*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 498*b0a7a3cfSSteve Yin ISDESTROY() 499*b0a7a3cfSSteve Yin // #CHECK# 500*b0a7a3cfSSteve Yin if(pvarRole == NULL) 501*b0a7a3cfSSteve Yin { 502*b0a7a3cfSSteve Yin return E_INVALIDARG; 503*b0a7a3cfSSteve Yin } 504*b0a7a3cfSSteve Yin if(varChild.vt == VT_I4) 505*b0a7a3cfSSteve Yin { 506*b0a7a3cfSSteve Yin 507*b0a7a3cfSSteve Yin if(varChild.lVal == CHILDID_SELF) 508*b0a7a3cfSSteve Yin { 509*b0a7a3cfSSteve Yin if( m_iRole < IA2_ROLE_CAPTION ) 510*b0a7a3cfSSteve Yin { 511*b0a7a3cfSSteve Yin VariantInit(pvarRole); 512*b0a7a3cfSSteve Yin pvarRole->vt = VT_I4; 513*b0a7a3cfSSteve Yin pvarRole->lVal = m_iRole; 514*b0a7a3cfSSteve Yin } 515*b0a7a3cfSSteve Yin else 516*b0a7a3cfSSteve Yin { 517*b0a7a3cfSSteve Yin VariantInit(pvarRole); 518*b0a7a3cfSSteve Yin pvarRole->vt = VT_I4; 519*b0a7a3cfSSteve Yin pvarRole->lVal = ROLE_SYSTEM_CLIENT; 520*b0a7a3cfSSteve Yin } 521*b0a7a3cfSSteve Yin return S_OK; 522*b0a7a3cfSSteve Yin } 523*b0a7a3cfSSteve Yin 524*b0a7a3cfSSteve Yin 525*b0a7a3cfSSteve Yin long lVal = varChild.lVal; 526*b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 527*b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 528*b0a7a3cfSSteve Yin if(!pChild) 529*b0a7a3cfSSteve Yin return E_FAIL; 530*b0a7a3cfSSteve Yin return pChild->get_accRole(varChild,pvarRole); 531*b0a7a3cfSSteve Yin } 532*b0a7a3cfSSteve Yin return S_FALSE; 533*b0a7a3cfSSteve Yin 534*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 5355fdc4257SSteve Yin } 5365fdc4257SSteve Yin 5375fdc4257SSteve Yin /** 5385fdc4257SSteve Yin * Returns the accessible state of the current COM object self or its one child to AT. 5395fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 5405fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 5415fdc4257SSteve Yin * @param pvarState, [in,out] use to return the state of the proper object. 5425fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 5435fdc4257SSteve Yin */ 5445fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accState(VARIANT varChild, VARIANT *pvarState) 5455fdc4257SSteve Yin { 546*b0a7a3cfSSteve Yin 5475fdc4257SSteve Yin CHECK_ENABLE_INF 548*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 549*b0a7a3cfSSteve Yin ISDESTROY() 550*b0a7a3cfSSteve Yin // #CHECK# 551*b0a7a3cfSSteve Yin if(pvarState == NULL) 552*b0a7a3cfSSteve Yin { 553*b0a7a3cfSSteve Yin return E_INVALIDARG; 554*b0a7a3cfSSteve Yin } 555*b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 556*b0a7a3cfSSteve Yin { 557*b0a7a3cfSSteve Yin if(varChild.lVal == CHILDID_SELF) 558*b0a7a3cfSSteve Yin { 559*b0a7a3cfSSteve Yin if(pUNOInterface) 560*b0a7a3cfSSteve Yin { 561*b0a7a3cfSSteve Yin Reference< XAccessibleContext > pContext = pUNOInterface->getAccessibleContext(); 562*b0a7a3cfSSteve Yin if(pContext.is()) 563*b0a7a3cfSSteve Yin { 564*b0a7a3cfSSteve Yin // add the STATE_SYSTEM_LINKED state 565*b0a7a3cfSSteve Yin Reference< XAccessibleHypertext > pRHypertext(pContext,UNO_QUERY); 566*b0a7a3cfSSteve Yin if(pRHypertext.is()) 567*b0a7a3cfSSteve Yin { 568*b0a7a3cfSSteve Yin if( pRHypertext->getHyperLinkCount() > 0 ) 569*b0a7a3cfSSteve Yin m_dState |= STATE_SYSTEM_LINKED; 570*b0a7a3cfSSteve Yin else 571*b0a7a3cfSSteve Yin m_dState &= ~STATE_SYSTEM_LINKED; 572*b0a7a3cfSSteve Yin } 573*b0a7a3cfSSteve Yin else 574*b0a7a3cfSSteve Yin m_dState &= ~STATE_SYSTEM_LINKED; 575*b0a7a3cfSSteve Yin } 576*b0a7a3cfSSteve Yin } 577*b0a7a3cfSSteve Yin 578*b0a7a3cfSSteve Yin VariantInit(pvarState); 579*b0a7a3cfSSteve Yin pvarState->vt = VT_I4; 580*b0a7a3cfSSteve Yin pvarState->lVal = m_dState; 581*b0a7a3cfSSteve Yin return S_OK; 582*b0a7a3cfSSteve Yin } 583*b0a7a3cfSSteve Yin 584*b0a7a3cfSSteve Yin long lVal = varChild.lVal; 585*b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 586*b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 587*b0a7a3cfSSteve Yin if(!pChild) 588*b0a7a3cfSSteve Yin return E_FAIL; 589*b0a7a3cfSSteve Yin return pChild->get_accState(varChild,pvarState); 590*b0a7a3cfSSteve Yin } 591*b0a7a3cfSSteve Yin return S_FALSE; 592*b0a7a3cfSSteve Yin 593*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 5945fdc4257SSteve Yin } 5955fdc4257SSteve Yin 5965fdc4257SSteve Yin /** 5975fdc4257SSteve Yin * Returns the accessible helpString of the current COM object self or its one child to AT. 5985fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 5995fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 6005fdc4257SSteve Yin * @param pszHelp, [in,out] use to return the helpString of the proper object. 6015fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 6025fdc4257SSteve Yin */ 6035fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accHelp(VARIANT, BSTR *) 6045fdc4257SSteve Yin { 605*b0a7a3cfSSteve Yin return E_NOTIMPL; 6065fdc4257SSteve Yin } 6075fdc4257SSteve Yin 6085fdc4257SSteve Yin /** 6095fdc4257SSteve Yin * Returns the accessible HelpTopic of the current COM object self or its one child to AT. 6105fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 6115fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 6125fdc4257SSteve Yin * @param pszHelpFile, [in,out] use to return the HelpTopic of the proper object. 6135fdc4257SSteve Yin * @param pidTopic, use to return the HelpTopic ID of the proper object. 6145fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 6155fdc4257SSteve Yin * Not implemented yet 6165fdc4257SSteve Yin */ 6175fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accHelpTopic(BSTR *, VARIANT, long *) 6185fdc4257SSteve Yin { 619*b0a7a3cfSSteve Yin return E_NOTIMPL; 6205fdc4257SSteve Yin } 6215fdc4257SSteve Yin 6225fdc4257SSteve Yin static void GetMnemonicChar( const ::rtl::OUString& aStr, WCHAR* wStr) 6235fdc4257SSteve Yin { 624*b0a7a3cfSSteve Yin int nLen = aStr.pData->length; 625*b0a7a3cfSSteve Yin int i = 0; 626*b0a7a3cfSSteve Yin WCHAR* text = aStr.pData->buffer; 6275fdc4257SSteve Yin 628*b0a7a3cfSSteve Yin while ( i < nLen ) 629*b0a7a3cfSSteve Yin { 630*b0a7a3cfSSteve Yin if ( text[i] == L'~' ) 631*b0a7a3cfSSteve Yin if ( text[i+1] != L'~' ) 632*b0a7a3cfSSteve Yin { 633*b0a7a3cfSSteve Yin wStr[0] = text[i+1]; 634*b0a7a3cfSSteve Yin break; 635*b0a7a3cfSSteve Yin } 636*b0a7a3cfSSteve Yin i++; 637*b0a7a3cfSSteve Yin } 6385fdc4257SSteve Yin } 6395fdc4257SSteve Yin 6405fdc4257SSteve Yin /** 6415fdc4257SSteve Yin * Returns the accessible keyboard shortcut of the current COM object self or its one child to AT. 6425fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 6435fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 6445fdc4257SSteve Yin * @param pszKeyboardShortcut, [in,out] use to return the kbshortcut of the proper object. 6455fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 6465fdc4257SSteve Yin */ 6475fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accKeyboardShortcut(VARIANT varChild, BSTR *pszKeyboardShortcut) 6485fdc4257SSteve Yin { 649*b0a7a3cfSSteve Yin 6505fdc4257SSteve Yin CHECK_ENABLE_INF 651*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 652*b0a7a3cfSSteve Yin 653*b0a7a3cfSSteve Yin ISDESTROY() 654*b0a7a3cfSSteve Yin // #CHECK# 655*b0a7a3cfSSteve Yin if(pszKeyboardShortcut == NULL) 656*b0a7a3cfSSteve Yin { 657*b0a7a3cfSSteve Yin return E_INVALIDARG; 658*b0a7a3cfSSteve Yin } 659*b0a7a3cfSSteve Yin 660*b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 661*b0a7a3cfSSteve Yin { 662*b0a7a3cfSSteve Yin if(varChild.lVal == CHILDID_SELF) 663*b0a7a3cfSSteve Yin { 664*b0a7a3cfSSteve Yin if( pUNOInterface ) 665*b0a7a3cfSSteve Yin { 666*b0a7a3cfSSteve Yin Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext(); 667*b0a7a3cfSSteve Yin if( !pRContext.is() ) 668*b0a7a3cfSSteve Yin return S_FALSE; 669*b0a7a3cfSSteve Yin 670*b0a7a3cfSSteve Yin Reference<XAccessibleAction> pRXI(pRContext,UNO_QUERY); 671*b0a7a3cfSSteve Yin 672*b0a7a3cfSSteve Yin OLECHAR wString[64]={0}; 673*b0a7a3cfSSteve Yin 674*b0a7a3cfSSteve Yin if( pRXI.is() && pRXI->getAccessibleActionCount() >= 1) 675*b0a7a3cfSSteve Yin { 676*b0a7a3cfSSteve Yin Reference< XAccessibleKeyBinding > binding = pRXI->getAccessibleActionKeyBinding(0); 677*b0a7a3cfSSteve Yin if( binding.is() ) 678*b0a7a3cfSSteve Yin { 679*b0a7a3cfSSteve Yin long nCount = binding->getAccessibleKeyBindingCount(); 680*b0a7a3cfSSteve Yin if(nCount >= 1) 681*b0a7a3cfSSteve Yin { 682*b0a7a3cfSSteve Yin CAccAction::GetkeyBindingStrByXkeyBinding( binding->getAccessibleKeyBinding(0),wString ); 683*b0a7a3cfSSteve Yin } 684*b0a7a3cfSSteve Yin } 685*b0a7a3cfSSteve Yin } 686*b0a7a3cfSSteve Yin if(wString[0] == 0) 687*b0a7a3cfSSteve Yin { 688*b0a7a3cfSSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet(); 689*b0a7a3cfSSteve Yin if(!pRrelationSet.is()) 6905fdc4257SSteve Yin { 691*b0a7a3cfSSteve Yin return S_FALSE; 6925fdc4257SSteve Yin } 6935fdc4257SSteve Yin 694*b0a7a3cfSSteve Yin long nRelCount = pRrelationSet->getRelationCount(); 695*b0a7a3cfSSteve Yin 696*b0a7a3cfSSteve Yin // Modified by Steve Yin, for SODC_1552 697*b0a7a3cfSSteve Yin if( /*nRelCount <= 0 &&*/ m_iRole == ROLE_SYSTEM_TEXT ) 698*b0a7a3cfSSteve Yin { 699*b0a7a3cfSSteve Yin VARIANT varParentRole; 700*b0a7a3cfSSteve Yin VariantInit( &varParentRole ); 7015fdc4257SSteve Yin 702*b0a7a3cfSSteve Yin m_pIParent->get_accRole(varChild, &varParentRole); 7035fdc4257SSteve Yin 704*b0a7a3cfSSteve Yin if( m_pIParent && varParentRole.lVal == ROLE_SYSTEM_COMBOBOX ) // edit in comoboBox 705*b0a7a3cfSSteve Yin { 706*b0a7a3cfSSteve Yin m_pIParent->get_accKeyboardShortcut(varChild, pszKeyboardShortcut); 707*b0a7a3cfSSteve Yin return S_OK; 708*b0a7a3cfSSteve Yin } 709*b0a7a3cfSSteve Yin } 710*b0a7a3cfSSteve Yin 711*b0a7a3cfSSteve Yin AccessibleRelation *paccRelation = NULL; 712*b0a7a3cfSSteve Yin AccessibleRelation accRelation; 713*b0a7a3cfSSteve Yin for(int i=0; i<nRelCount ; i++) 714*b0a7a3cfSSteve Yin { 715*b0a7a3cfSSteve Yin if( pRrelationSet->getRelation(i).RelationType == 6 ) 716*b0a7a3cfSSteve Yin { 717*b0a7a3cfSSteve Yin accRelation = pRrelationSet->getRelation(i); 718*b0a7a3cfSSteve Yin paccRelation = &accRelation; 719*b0a7a3cfSSteve Yin } 720*b0a7a3cfSSteve Yin } 7215fdc4257SSteve Yin 722*b0a7a3cfSSteve Yin if(paccRelation == NULL) 723*b0a7a3cfSSteve Yin return S_FALSE; 7245fdc4257SSteve Yin 725*b0a7a3cfSSteve Yin Sequence< Reference< XInterface > > xTargets = paccRelation->TargetSet; 726*b0a7a3cfSSteve Yin Reference<XInterface> pRAcc = xTargets[0]; 7275fdc4257SSteve Yin 728*b0a7a3cfSSteve Yin XAccessible* pXAcc = (XAccessible*)pRAcc.get(); 729*b0a7a3cfSSteve Yin 730*b0a7a3cfSSteve Yin Reference<XAccessibleContext> pRLebelContext = pXAcc->getAccessibleContext(); 731*b0a7a3cfSSteve Yin if(!pRLebelContext.is()) 732*b0a7a3cfSSteve Yin return S_FALSE; 733*b0a7a3cfSSteve Yin 734*b0a7a3cfSSteve Yin pRrelationSet = pRLebelContext->getAccessibleRelationSet(); 735*b0a7a3cfSSteve Yin nRelCount = pRrelationSet->getRelationCount(); 736*b0a7a3cfSSteve Yin 737*b0a7a3cfSSteve Yin paccRelation = NULL; 738*b0a7a3cfSSteve Yin for(int j=0; j<nRelCount ; j++) 739*b0a7a3cfSSteve Yin { 740*b0a7a3cfSSteve Yin if( pRrelationSet->getRelation(j).RelationType == 5 ) 741*b0a7a3cfSSteve Yin { 742*b0a7a3cfSSteve Yin accRelation = pRrelationSet->getRelation(j); 743*b0a7a3cfSSteve Yin paccRelation = &accRelation; 744*b0a7a3cfSSteve Yin } 745*b0a7a3cfSSteve Yin } 746*b0a7a3cfSSteve Yin 747*b0a7a3cfSSteve Yin if(paccRelation) 748*b0a7a3cfSSteve Yin { 749*b0a7a3cfSSteve Yin xTargets = paccRelation->TargetSet; 750*b0a7a3cfSSteve Yin pRAcc = xTargets[0]; 751*b0a7a3cfSSteve Yin if(pUNOInterface != (XAccessible*)pRAcc.get()) 752*b0a7a3cfSSteve Yin return S_FALSE; 753*b0a7a3cfSSteve Yin } 754*b0a7a3cfSSteve Yin 755*b0a7a3cfSSteve Yin Reference<XAccessibleExtendedComponent> pRXIE(pRLebelContext,UNO_QUERY); 756*b0a7a3cfSSteve Yin if(!pRXIE.is()) 757*b0a7a3cfSSteve Yin return S_FALSE; 758*b0a7a3cfSSteve Yin 759*b0a7a3cfSSteve Yin ::rtl::OUString ouStr = pRXIE->getTitledBorderText(); 760*b0a7a3cfSSteve Yin WCHAR key[2] = {NULL}; 761*b0a7a3cfSSteve Yin GetMnemonicChar(ouStr, key); 762*b0a7a3cfSSteve Yin if(key[0] != 0) 7635fdc4257SSteve Yin { 764*b0a7a3cfSSteve Yin wcscat(wString, L"Alt+"); 765*b0a7a3cfSSteve Yin wcscat(wString, key); 7665fdc4257SSteve Yin } 767*b0a7a3cfSSteve Yin else 768*b0a7a3cfSSteve Yin return S_FALSE; 769*b0a7a3cfSSteve Yin } 770*b0a7a3cfSSteve Yin 771*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(*pszKeyboardShortcut); 772*b0a7a3cfSSteve Yin *pszKeyboardShortcut = SysAllocString(wString); 773*b0a7a3cfSSteve Yin 774*b0a7a3cfSSteve Yin return S_OK; 775*b0a7a3cfSSteve Yin } 776*b0a7a3cfSSteve Yin else 777*b0a7a3cfSSteve Yin { 778*b0a7a3cfSSteve Yin return S_FALSE; 779*b0a7a3cfSSteve Yin } 780*b0a7a3cfSSteve Yin } 781*b0a7a3cfSSteve Yin 782*b0a7a3cfSSteve Yin long lVal = varChild.lVal; 783*b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 784*b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 785*b0a7a3cfSSteve Yin if(!pChild) 786*b0a7a3cfSSteve Yin return E_FAIL; 787*b0a7a3cfSSteve Yin 788*b0a7a3cfSSteve Yin return pChild->get_accKeyboardShortcut(varChild,pszKeyboardShortcut); 789*b0a7a3cfSSteve Yin } 790*b0a7a3cfSSteve Yin return S_FALSE; 791*b0a7a3cfSSteve Yin 792*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 7935fdc4257SSteve Yin } 7945fdc4257SSteve Yin 7955fdc4257SSteve Yin /** 7965fdc4257SSteve Yin * Returns the current focused child to AT. 7975fdc4257SSteve Yin * @param pvarChild, [in,out] vt member of pvarChild must be VT_I4,and lVal member stores the child ID, 7985fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 7995fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 8005fdc4257SSteve Yin */ 8015fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accFocus(VARIANT *pvarChild) 8025fdc4257SSteve Yin { 8035fdc4257SSteve Yin 804*b0a7a3cfSSteve Yin CHECK_ENABLE_INF 805*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 806*b0a7a3cfSSteve Yin ISDESTROY() 807*b0a7a3cfSSteve Yin // #CHECK# 808*b0a7a3cfSSteve Yin if(pvarChild == NULL) 809*b0a7a3cfSSteve Yin { 810*b0a7a3cfSSteve Yin return E_INVALIDARG; 811*b0a7a3cfSSteve Yin } 812*b0a7a3cfSSteve Yin if( m_dFocusChildID==UACC_NO_FOCUS ) 813*b0a7a3cfSSteve Yin { 814*b0a7a3cfSSteve Yin pvarChild->vt = VT_EMPTY;//no focus on the object and its children 815*b0a7a3cfSSteve Yin return S_OK; 816*b0a7a3cfSSteve Yin } 817*b0a7a3cfSSteve Yin //if the descendant of current object has focus indicated by m_dFocusChildID, return the IDispatch of this focused object 818*b0a7a3cfSSteve Yin else 819*b0a7a3cfSSteve Yin { 820*b0a7a3cfSSteve Yin IMAccessible* pIMAcc = NULL; 821*b0a7a3cfSSteve Yin g_pAgent->GetIAccessibleFromResID(m_dFocusChildID,&pIMAcc); 822*b0a7a3cfSSteve Yin pIMAcc->AddRef(); 823*b0a7a3cfSSteve Yin pvarChild->vt = VT_DISPATCH; 824*b0a7a3cfSSteve Yin pvarChild->pdispVal = pIMAcc; 825*b0a7a3cfSSteve Yin 826*b0a7a3cfSSteve Yin } 827*b0a7a3cfSSteve Yin return S_OK; 828*b0a7a3cfSSteve Yin 829*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 8305fdc4257SSteve Yin } 8315fdc4257SSteve Yin 8325fdc4257SSteve Yin /** 8335fdc4257SSteve Yin * Returns the selection of the current COM object to AT. 8345fdc4257SSteve Yin * @param pvarChildren,[in,out] 8355fdc4257SSteve Yin * if selection num is 0,return VT_EMPTY for vt, 8365fdc4257SSteve Yin * if selection num is 1,return VT_I4 for vt,and child index for lVal 8375fdc4257SSteve Yin * if selection num >1,return VT_UNKNOWN for vt, and IEnumVariant* for punkVal 8385fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 8395fdc4257SSteve Yin */ 8405fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accSelection(VARIANT *pvarChildren) 8415fdc4257SSteve Yin { 842*b0a7a3cfSSteve Yin 8435fdc4257SSteve Yin CHECK_ENABLE_INF 844*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 845*b0a7a3cfSSteve Yin ISDESTROY() 846*b0a7a3cfSSteve Yin // #CHECK# 847*b0a7a3cfSSteve Yin if(pvarChildren == NULL) 848*b0a7a3cfSSteve Yin { 849*b0a7a3cfSSteve Yin return E_INVALIDARG; 850*b0a7a3cfSSteve Yin } 851*b0a7a3cfSSteve Yin switch(m_pEnumVar->GetCountOfElements()) 852*b0a7a3cfSSteve Yin { 853*b0a7a3cfSSteve Yin case 0: 854*b0a7a3cfSSteve Yin pvarChildren->vt = VT_EMPTY; 855*b0a7a3cfSSteve Yin break; 856*b0a7a3cfSSteve Yin case 1: 857*b0a7a3cfSSteve Yin VARIANT varTmp[1]; 858*b0a7a3cfSSteve Yin ULONG count; 859*b0a7a3cfSSteve Yin VariantInit(&varTmp[0]); 860*b0a7a3cfSSteve Yin m_pEnumVar->Next(1,varTmp,&count); 861*b0a7a3cfSSteve Yin if(count!=1) 862*b0a7a3cfSSteve Yin return S_FALSE; 863*b0a7a3cfSSteve Yin pvarChildren->vt = VT_I4; 864*b0a7a3cfSSteve Yin pvarChildren->lVal = varTmp[0].lVal; 865*b0a7a3cfSSteve Yin VariantClear(&varTmp[0]); 866*b0a7a3cfSSteve Yin m_pEnumVar->Reset(); 867*b0a7a3cfSSteve Yin break; 868*b0a7a3cfSSteve Yin default: 869*b0a7a3cfSSteve Yin pvarChildren->vt = VT_UNKNOWN; 870*b0a7a3cfSSteve Yin m_pEnumVar->AddRef(); 871*b0a7a3cfSSteve Yin pvarChildren->punkVal = m_pEnumVar; 872*b0a7a3cfSSteve Yin break; 873*b0a7a3cfSSteve Yin } 874*b0a7a3cfSSteve Yin return S_OK; 875*b0a7a3cfSSteve Yin 876*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 8775fdc4257SSteve Yin } 8785fdc4257SSteve Yin 8795fdc4257SSteve Yin /** 8805fdc4257SSteve Yin * Returns the location of the current COM object self or its one child to AT. 8815fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 8825fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 8835fdc4257SSteve Yin * @param pxLeft, [in,out] use to return the x-coordination of the proper object. 8845fdc4257SSteve Yin * @param pyTop, [in,out] use to return the y-coordination of the proper object. 8855fdc4257SSteve Yin * @param pcxWidth, [in,out] use to return the x-coordination width of the proper object. 8865fdc4257SSteve Yin * @param pcyHeight, [in,out] use to return the y-coordination height of the proper object. 8875fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 8885fdc4257SSteve Yin */ 8895fdc4257SSteve Yin STDMETHODIMP CMAccessible::accLocation(long *pxLeft, long *pyTop, long *pcxWidth, long *pcyHeight, VARIANT varChild) 8905fdc4257SSteve Yin { 891*b0a7a3cfSSteve Yin 8925fdc4257SSteve Yin CHECK_ENABLE_INF 893*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 894*b0a7a3cfSSteve Yin ISDESTROY() 895*b0a7a3cfSSteve Yin // #CHECK# 896*b0a7a3cfSSteve Yin if(pxLeft == NULL || pyTop == NULL || pcxWidth == NULL || pcyHeight == NULL) 897*b0a7a3cfSSteve Yin { 898*b0a7a3cfSSteve Yin return E_INVALIDARG; 899*b0a7a3cfSSteve Yin } 900*b0a7a3cfSSteve Yin 901*b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 902*b0a7a3cfSSteve Yin { 903*b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 904*b0a7a3cfSSteve Yin { 905*b0a7a3cfSSteve Yin 906*b0a7a3cfSSteve Yin if(pUNOInterface) 907*b0a7a3cfSSteve Yin { 908*b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext(); 909*b0a7a3cfSSteve Yin if( !pRContext.is() ) 910*b0a7a3cfSSteve Yin return S_FALSE; 911*b0a7a3cfSSteve Yin Reference< XAccessibleComponent > pRComponent(pRContext,UNO_QUERY); 912*b0a7a3cfSSteve Yin if( !pRComponent.is() ) 913*b0a7a3cfSSteve Yin return S_FALSE; 914*b0a7a3cfSSteve Yin 915*b0a7a3cfSSteve Yin ::com::sun::star::awt::Point pCPoint = pRComponent->getLocationOnScreen(); 916*b0a7a3cfSSteve Yin ::com::sun::star::awt::Size pCSize = pRComponent->getSize(); 917*b0a7a3cfSSteve Yin *pxLeft = pCPoint.X; 918*b0a7a3cfSSteve Yin *pyTop = pCPoint.Y; 919*b0a7a3cfSSteve Yin *pcxWidth = pCSize.Width; 920*b0a7a3cfSSteve Yin *pcyHeight = pCSize.Height; 921*b0a7a3cfSSteve Yin return S_OK; 922*b0a7a3cfSSteve Yin } 923*b0a7a3cfSSteve Yin else 924*b0a7a3cfSSteve Yin { 925*b0a7a3cfSSteve Yin *pxLeft = m_sLocation.m_dLeft; 926*b0a7a3cfSSteve Yin *pyTop = m_sLocation.m_dTop; 927*b0a7a3cfSSteve Yin *pcxWidth = m_sLocation.m_dWidth; 928*b0a7a3cfSSteve Yin *pcyHeight = m_sLocation.m_dHeight; 929*b0a7a3cfSSteve Yin return S_OK; 930*b0a7a3cfSSteve Yin } 931*b0a7a3cfSSteve Yin } 932*b0a7a3cfSSteve Yin 933*b0a7a3cfSSteve Yin } 934*b0a7a3cfSSteve Yin return S_FALSE; 935*b0a7a3cfSSteve Yin 936*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 9375fdc4257SSteve Yin } 9385fdc4257SSteve Yin 9395fdc4257SSteve Yin /** 9405fdc4257SSteve Yin * Returns the current focused child to AT. 9415fdc4257SSteve Yin * @param navDir, the direction flag of the navigation. 9425fdc4257SSteve Yin * @param varStart, the start child id of this navigation action. 9435fdc4257SSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 9445fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 9455fdc4257SSteve Yin */ 9465fdc4257SSteve Yin STDMETHODIMP CMAccessible::accNavigate(long navDir, VARIANT varStart, VARIANT *pvarEndUpAt) 9475fdc4257SSteve Yin { 948*b0a7a3cfSSteve Yin 9495fdc4257SSteve Yin CHECK_ENABLE_INF 950*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 951*b0a7a3cfSSteve Yin ISDESTROY() 952*b0a7a3cfSSteve Yin // #CHECK# 953*b0a7a3cfSSteve Yin if(pvarEndUpAt == NULL) 954*b0a7a3cfSSteve Yin { 955*b0a7a3cfSSteve Yin return E_INVALIDARG; 956*b0a7a3cfSSteve Yin } 957*b0a7a3cfSSteve Yin HRESULT ret = E_FAIL; 958*b0a7a3cfSSteve Yin switch (navDir) 959*b0a7a3cfSSteve Yin { 960*b0a7a3cfSSteve Yin case NAVDIR_FIRSTCHILD: 961*b0a7a3cfSSteve Yin ret = GetFirstChild(varStart,pvarEndUpAt); 962*b0a7a3cfSSteve Yin break; 963*b0a7a3cfSSteve Yin case NAVDIR_LASTCHILD: 964*b0a7a3cfSSteve Yin ret = GetLastChild(varStart,pvarEndUpAt); 965*b0a7a3cfSSteve Yin break; 966*b0a7a3cfSSteve Yin case NAVDIR_NEXT: 967*b0a7a3cfSSteve Yin ret = GetNextSibling(varStart,pvarEndUpAt); 968*b0a7a3cfSSteve Yin break; 969*b0a7a3cfSSteve Yin case NAVDIR_PREVIOUS: 970*b0a7a3cfSSteve Yin ret = GetPreSibling(varStart,pvarEndUpAt); 971*b0a7a3cfSSteve Yin break; 972*b0a7a3cfSSteve Yin case NAVDIR_DOWN://do not implement temporarily 973*b0a7a3cfSSteve Yin break; 974*b0a7a3cfSSteve Yin case NAVDIR_UP://do not implement temporarily 975*b0a7a3cfSSteve Yin break; 976*b0a7a3cfSSteve Yin case NAVDIR_LEFT://do not implement temporarily 977*b0a7a3cfSSteve Yin break; 978*b0a7a3cfSSteve Yin case NAVDIR_RIGHT://do not implement temporarily 979*b0a7a3cfSSteve Yin break; 980*b0a7a3cfSSteve Yin default: 981*b0a7a3cfSSteve Yin break; 982*b0a7a3cfSSteve Yin }; 983*b0a7a3cfSSteve Yin return ret; 984*b0a7a3cfSSteve Yin 985*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 9865fdc4257SSteve Yin } 9875fdc4257SSteve Yin 9885fdc4257SSteve Yin STDMETHODIMP CMAccessible::accHitTest(long xLeft, long yTop, VARIANT *pvarChild) 9895fdc4257SSteve Yin { 990*b0a7a3cfSSteve Yin 9915fdc4257SSteve Yin CHECK_ENABLE_INF 992*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 993*b0a7a3cfSSteve Yin ISDESTROY() 994*b0a7a3cfSSteve Yin // #CHECK# 995*b0a7a3cfSSteve Yin if(pvarChild == NULL) 996*b0a7a3cfSSteve Yin { 997*b0a7a3cfSSteve Yin return E_INVALIDARG; 998*b0a7a3cfSSteve Yin } 999*b0a7a3cfSSteve Yin long x, y, w, h; 1000*b0a7a3cfSSteve Yin VARIANT varSelf; 1001*b0a7a3cfSSteve Yin VariantInit(&varSelf); 1002*b0a7a3cfSSteve Yin varSelf.vt = VT_I4; 1003*b0a7a3cfSSteve Yin varSelf.lVal = CHILDID_SELF; 1004*b0a7a3cfSSteve Yin accLocation(&x,&y,&w,&h,varSelf); 1005*b0a7a3cfSSteve Yin if( (x < xLeft && (x + w) >xLeft) && (y < yTop && (y + h) >yTop) ) 1006*b0a7a3cfSSteve Yin { 1007*b0a7a3cfSSteve Yin int i, nCount; 1008*b0a7a3cfSSteve Yin pvarChild->vt = VT_EMPTY; 1009*b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface); 1010*b0a7a3cfSSteve Yin nCount = pRContext->getAccessibleChildCount(); 1011*b0a7a3cfSSteve Yin if(nCount > 256) 1012*b0a7a3cfSSteve Yin return E_FAIL; 1013*b0a7a3cfSSteve Yin IMAccessible* child = NULL; 1014*b0a7a3cfSSteve Yin for( i = 0; i<nCount; i++) 1015*b0a7a3cfSSteve Yin { 1016*b0a7a3cfSSteve Yin 1017*b0a7a3cfSSteve Yin child = GetChildInterface(i + 1); 1018*b0a7a3cfSSteve Yin if(child && child->accHitTest(xLeft,yTop,pvarChild) == S_OK) 1019*b0a7a3cfSSteve Yin break; 1020*b0a7a3cfSSteve Yin } 1021*b0a7a3cfSSteve Yin 1022*b0a7a3cfSSteve Yin if(pvarChild->vt == VT_DISPATCH) 1023*b0a7a3cfSSteve Yin return S_OK; 1024*b0a7a3cfSSteve Yin 1025*b0a7a3cfSSteve Yin if( i < nCount) 1026*b0a7a3cfSSteve Yin { 1027*b0a7a3cfSSteve Yin pvarChild->vt = VT_DISPATCH; 1028*b0a7a3cfSSteve Yin pvarChild->pdispVal = child; 1029*b0a7a3cfSSteve Yin child->AddRef(); 1030*b0a7a3cfSSteve Yin } 1031*b0a7a3cfSSteve Yin else 1032*b0a7a3cfSSteve Yin { 1033*b0a7a3cfSSteve Yin pvarChild->vt = VT_I4; 1034*b0a7a3cfSSteve Yin pvarChild->lVal = CHILDID_SELF; 1035*b0a7a3cfSSteve Yin } 1036*b0a7a3cfSSteve Yin return S_OK; 1037*b0a7a3cfSSteve Yin } 1038*b0a7a3cfSSteve Yin return S_FALSE; 1039*b0a7a3cfSSteve Yin 1040*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 10415fdc4257SSteve Yin } 10425fdc4257SSteve Yin 10435fdc4257SSteve Yin /** 10445fdc4257SSteve Yin * Get The other Interface from CMAccessible. 10455fdc4257SSteve Yin * @param guidService, must be IID_IAccessible here. 10465fdc4257SSteve Yin * @param riid, the IID interface . 10475fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 10485fdc4257SSteve Yin */ 10495fdc4257SSteve Yin STDMETHODIMP CMAccessible::QueryService(REFGUID guidService, REFIID riid, void** ppvObject) 10505fdc4257SSteve Yin { 1051*b0a7a3cfSSteve Yin if( InlineIsEqualGUID(guidService, IID_IAccessible) ) 1052*b0a7a3cfSSteve Yin return QueryInterface(riid, ppvObject); 1053*b0a7a3cfSSteve Yin return S_FALSE; 10545fdc4257SSteve Yin } 10555fdc4257SSteve Yin 10565fdc4257SSteve Yin /** 10575fdc4257SSteve Yin * Set the accessible name of the current COM object self or its one child from UNO. 10585fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 10595fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 10605fdc4257SSteve Yin * @param szName, the name used to set the name of the proper object. 10615fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 10625fdc4257SSteve Yin */ 10635fdc4257SSteve Yin STDMETHODIMP CMAccessible::put_accName(VARIANT varChild, BSTR szName) 10645fdc4257SSteve Yin { 1065*b0a7a3cfSSteve Yin 1066*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1067*b0a7a3cfSSteve Yin ISDESTROY() 1068*b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 1069*b0a7a3cfSSteve Yin { 1070*b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 1071*b0a7a3cfSSteve Yin { 1072*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(m_pszName); 1073*b0a7a3cfSSteve Yin m_pszName=SysAllocString(szName); 1074*b0a7a3cfSSteve Yin return S_OK; 1075*b0a7a3cfSSteve Yin } 1076*b0a7a3cfSSteve Yin 1077*b0a7a3cfSSteve Yin long lVal = varChild.lVal; 1078*b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 1079*b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 1080*b0a7a3cfSSteve Yin if(!pChild) 1081*b0a7a3cfSSteve Yin return E_FAIL; 1082*b0a7a3cfSSteve Yin return pChild->put_accName(varChild,szName); 1083*b0a7a3cfSSteve Yin } 1084*b0a7a3cfSSteve Yin return E_FAIL; 1085*b0a7a3cfSSteve Yin 1086*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 10875fdc4257SSteve Yin } 10885fdc4257SSteve Yin 10895fdc4257SSteve Yin /** 10905fdc4257SSteve Yin * Set the accessible value of the current COM object self or its one child from UNO. 10915fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 10925fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 10935fdc4257SSteve Yin * @param szValue, the value used to set the value of the proper object. 10945fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 10955fdc4257SSteve Yin */ 10965fdc4257SSteve Yin STDMETHODIMP CMAccessible::put_accValue(VARIANT varChild, BSTR szValue) 10975fdc4257SSteve Yin { 1098*b0a7a3cfSSteve Yin 1099*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1100*b0a7a3cfSSteve Yin ISDESTROY() 1101*b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 1102*b0a7a3cfSSteve Yin { 1103*b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 1104*b0a7a3cfSSteve Yin { 1105*b0a7a3cfSSteve Yin SysAllocString(m_pszValue); 1106*b0a7a3cfSSteve Yin m_pszValue=SysAllocString(szValue); 1107*b0a7a3cfSSteve Yin return S_OK; 1108*b0a7a3cfSSteve Yin } 1109*b0a7a3cfSSteve Yin 1110*b0a7a3cfSSteve Yin long lVal = varChild.lVal; 1111*b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 1112*b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 1113*b0a7a3cfSSteve Yin if(!pChild) 1114*b0a7a3cfSSteve Yin return E_FAIL; 1115*b0a7a3cfSSteve Yin return pChild->put_accValue(varChild,szValue); 1116*b0a7a3cfSSteve Yin } 1117*b0a7a3cfSSteve Yin return E_FAIL; 1118*b0a7a3cfSSteve Yin 1119*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 11205fdc4257SSteve Yin } 11215fdc4257SSteve Yin 11225fdc4257SSteve Yin /** 11235fdc4257SSteve Yin * Set the accessible name of the current COM object self from UNO. 11245fdc4257SSteve Yin * @param pszName, the name value used to set the name of the current object. 11255fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11265fdc4257SSteve Yin */ 11275fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccName(const OLECHAR __RPC_FAR *pszName) 11285fdc4257SSteve Yin { 11295fdc4257SSteve Yin 1130*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1131*b0a7a3cfSSteve Yin ISDESTROY() 1132*b0a7a3cfSSteve Yin // #CHECK# 1133*b0a7a3cfSSteve Yin if(pszName == NULL) 1134*b0a7a3cfSSteve Yin { 1135*b0a7a3cfSSteve Yin return E_INVALIDARG; 1136*b0a7a3cfSSteve Yin } 1137*b0a7a3cfSSteve Yin 1138*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(m_pszName);//?? 1139*b0a7a3cfSSteve Yin m_pszName = SysAllocString(pszName); 1140*b0a7a3cfSSteve Yin if(m_pszName==NULL) 1141*b0a7a3cfSSteve Yin return E_FAIL; 1142*b0a7a3cfSSteve Yin return S_OK; 11435fdc4257SSteve Yin 1144*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 11455fdc4257SSteve Yin } 11465fdc4257SSteve Yin 11475fdc4257SSteve Yin /** 11485fdc4257SSteve Yin * Set the accessible role of the current COM object self from UNO. 11495fdc4257SSteve Yin * @param pRole, the role value used to set the role of the current object. 11505fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11515fdc4257SSteve Yin */ 11525fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccRole(unsigned short pRole) 11535fdc4257SSteve Yin { 1154*b0a7a3cfSSteve Yin m_iRole = pRole; 1155*b0a7a3cfSSteve Yin return S_OK; 11565fdc4257SSteve Yin } 11575fdc4257SSteve Yin 11585fdc4257SSteve Yin /** 11595fdc4257SSteve Yin * Add one state into the current state set for the current COM object from UNO. 11605fdc4257SSteve Yin * @param pXSate, the state used to set the name of the current object. 11615fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11625fdc4257SSteve Yin */ 11635fdc4257SSteve Yin STDMETHODIMP CMAccessible::DecreaseState(DWORD pXSate) 11645fdc4257SSteve Yin { 1165*b0a7a3cfSSteve Yin m_dState &= (~pXSate); 1166*b0a7a3cfSSteve Yin return S_OK; 11675fdc4257SSteve Yin } 11685fdc4257SSteve Yin 11695fdc4257SSteve Yin /** 11705fdc4257SSteve Yin * Delete one state into the current state set for the current COM object from UNO. 11715fdc4257SSteve Yin * @param pXSate, the state used to set the name of the current object. 11725fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11735fdc4257SSteve Yin */ 11745fdc4257SSteve Yin STDMETHODIMP CMAccessible::IncreaseState(DWORD pXSate) 11755fdc4257SSteve Yin { 1176*b0a7a3cfSSteve Yin m_dState |= pXSate; 1177*b0a7a3cfSSteve Yin return S_OK; 11785fdc4257SSteve Yin } 11795fdc4257SSteve Yin 11805fdc4257SSteve Yin /** 11815fdc4257SSteve Yin * Set state into the current state set for the current COM object from UNO. 11825fdc4257SSteve Yin * @param pXSate, the state used to set the name of the current object. 11835fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11845fdc4257SSteve Yin */ 11855fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetState(DWORD pXSate) 11865fdc4257SSteve Yin { 1187*b0a7a3cfSSteve Yin m_dState = pXSate; 1188*b0a7a3cfSSteve Yin return S_OK; 11895fdc4257SSteve Yin } 11905fdc4257SSteve Yin 11915fdc4257SSteve Yin 11925fdc4257SSteve Yin 11935fdc4257SSteve Yin /** 11945fdc4257SSteve Yin * Set the accessible description of the current COM object self from UNO. 11955fdc4257SSteve Yin * @param pszDescription, the name used to set the description of the current object. 11965fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11975fdc4257SSteve Yin */ 11985fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccDescription(const OLECHAR __RPC_FAR *pszDescription) 11995fdc4257SSteve Yin { 12005fdc4257SSteve Yin 1201*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1202*b0a7a3cfSSteve Yin ISDESTROY() 1203*b0a7a3cfSSteve Yin // #CHECK# 1204*b0a7a3cfSSteve Yin if(pszDescription == NULL) 1205*b0a7a3cfSSteve Yin { 1206*b0a7a3cfSSteve Yin return E_INVALIDARG; 1207*b0a7a3cfSSteve Yin } 12085fdc4257SSteve Yin 1209*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(m_pszDescription); 1210*b0a7a3cfSSteve Yin m_pszDescription = SysAllocString(pszDescription); 12115fdc4257SSteve Yin 1212*b0a7a3cfSSteve Yin if(m_pszDescription==NULL) 1213*b0a7a3cfSSteve Yin return E_FAIL; 1214*b0a7a3cfSSteve Yin return S_OK; 1215*b0a7a3cfSSteve Yin 1216*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 12175fdc4257SSteve Yin } 12185fdc4257SSteve Yin 12195fdc4257SSteve Yin /** 12205fdc4257SSteve Yin * Set the accessible value of the current COM object self from UNO. 12215fdc4257SSteve Yin * @param pszAccValue, the name used to set the value of the current object. 12225fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 12235fdc4257SSteve Yin */ 12245fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccValue(const OLECHAR __RPC_FAR *pszAccValue) 12255fdc4257SSteve Yin { 12265fdc4257SSteve Yin 1227*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1228*b0a7a3cfSSteve Yin ISDESTROY() 1229*b0a7a3cfSSteve Yin // #CHECK# 1230*b0a7a3cfSSteve Yin if(pszAccValue == NULL) 1231*b0a7a3cfSSteve Yin { 1232*b0a7a3cfSSteve Yin return E_INVALIDARG; 1233*b0a7a3cfSSteve Yin } 1234*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(m_pszValue); 1235*b0a7a3cfSSteve Yin m_pszValue = SysAllocString(pszAccValue); 1236*b0a7a3cfSSteve Yin if(m_pszValue==NULL) 1237*b0a7a3cfSSteve Yin return E_FAIL; 1238*b0a7a3cfSSteve Yin return S_OK; 1239*b0a7a3cfSSteve Yin 1240*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 12415fdc4257SSteve Yin } 12425fdc4257SSteve Yin 12435fdc4257SSteve Yin /** 12445fdc4257SSteve Yin * Set the HWND value of the current COM object self from UNO. It should set the parent IAccessible 12455fdc4257SSteve Yin * Object through the method AccessibleObjectFromWindow(...). 12465fdc4257SSteve Yin * @param hwnd, the HWND used to set the value of the current object. 12475fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 12485fdc4257SSteve Yin */ 12495fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccWindowHandle(HWND hwnd) 12505fdc4257SSteve Yin { 12515fdc4257SSteve Yin 1252*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1253*b0a7a3cfSSteve Yin ISDESTROY() 1254*b0a7a3cfSSteve Yin m_hwnd = hwnd; 1255*b0a7a3cfSSteve Yin return S_OK; 1256*b0a7a3cfSSteve Yin 1257*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 12585fdc4257SSteve Yin } 12595fdc4257SSteve Yin 12605fdc4257SSteve Yin /** 12615fdc4257SSteve Yin * Set accessible focus by specifying child ID 12625fdc4257SSteve Yin * @param dChildID, the child id identifies the focus child. 12635fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 12645fdc4257SSteve Yin */ 12655fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccFocus(long dChildID) 12665fdc4257SSteve Yin { 12675fdc4257SSteve Yin 1268*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1269*b0a7a3cfSSteve Yin ISDESTROY() 1270*b0a7a3cfSSteve Yin 1271*b0a7a3cfSSteve Yin if(dChildID==CHILDID_SELF) 1272*b0a7a3cfSSteve Yin { 1273*b0a7a3cfSSteve Yin if(m_pIParent) 1274*b0a7a3cfSSteve Yin { 1275*b0a7a3cfSSteve Yin m_pIParent->Put_XAccFocus(m_dChildID); 1276*b0a7a3cfSSteve Yin } 1277*b0a7a3cfSSteve Yin } 1278*b0a7a3cfSSteve Yin else 1279*b0a7a3cfSSteve Yin { 1280*b0a7a3cfSSteve Yin m_dFocusChildID = dChildID; 1281*b0a7a3cfSSteve Yin //traverse all ancestors to set the focused child ID so that when the get_accFocus is called on 1282*b0a7a3cfSSteve Yin //any of the ancestors, this id can be used to get the IAccessible of focused object. 1283*b0a7a3cfSSteve Yin if(m_pIParent) 1284*b0a7a3cfSSteve Yin { 1285*b0a7a3cfSSteve Yin m_pIParent->Put_XAccFocus(dChildID); 1286*b0a7a3cfSSteve Yin } 1287*b0a7a3cfSSteve Yin } 1288*b0a7a3cfSSteve Yin return S_OK; 1289*b0a7a3cfSSteve Yin 1290*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 12915fdc4257SSteve Yin } 12925fdc4257SSteve Yin 12935fdc4257SSteve Yin /** 1294*b0a7a3cfSSteve Yin *Set accessible object location for the current COM object 1295*b0a7a3cfSSteve Yin * @param sLocation, the location of the current object. 1296*b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1297*b0a7a3cfSSteve Yin */ 12985fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccLocation(const Location sLocation) 12995fdc4257SSteve Yin { 1300*b0a7a3cfSSteve Yin 1301*b0a7a3cfSSteve Yin this->m_sLocation = sLocation; 1302*b0a7a3cfSSteve Yin return S_OK; 13035fdc4257SSteve Yin } 13045fdc4257SSteve Yin 13055fdc4257SSteve Yin /** 1306*b0a7a3cfSSteve Yin * Set accessible parent object for the current COM object if 1307*b0a7a3cfSSteve Yin * the current object is a child of some COM object 1308*b0a7a3cfSSteve Yin * @param pIParent, the parent of the current object. 1309*b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1310*b0a7a3cfSSteve Yin */ 13115fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccParent(IMAccessible __RPC_FAR *pIParent) 13125fdc4257SSteve Yin { 1313*b0a7a3cfSSteve Yin this->m_pIParent = pIParent; 13145fdc4257SSteve Yin 1315*b0a7a3cfSSteve Yin if(pIParent) 1316*b0a7a3cfSSteve Yin m_pIParent->AddRef(); 13175fdc4257SSteve Yin 1318*b0a7a3cfSSteve Yin return S_OK; 13195fdc4257SSteve Yin } 13205fdc4257SSteve Yin 13215fdc4257SSteve Yin /** 1322*b0a7a3cfSSteve Yin * Set unique child id to COM 1323*b0a7a3cfSSteve Yin * @param dChildID, the id of the current object. 1324*b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1325*b0a7a3cfSSteve Yin */ 13265fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccChildID(long dChildID) 13275fdc4257SSteve Yin { 1328*b0a7a3cfSSteve Yin 1329*b0a7a3cfSSteve Yin this->m_dChildID = dChildID; 1330*b0a7a3cfSSteve Yin return S_OK; 13315fdc4257SSteve Yin } 13325fdc4257SSteve Yin 13335fdc4257SSteve Yin /** 1334*b0a7a3cfSSteve Yin * Set AccObjectManagerAgent object pointer to COM 1335*b0a7a3cfSSteve Yin * @param pAgent, the AccObjectManagerAgent point. 1336*b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1337*b0a7a3cfSSteve Yin */ 13385fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccAgent(long pAgent) 13395fdc4257SSteve Yin { 1340*b0a7a3cfSSteve Yin g_pAgent = (AccObjectManagerAgent*)pAgent; 1341*b0a7a3cfSSteve Yin return S_OK; 13425fdc4257SSteve Yin } 13435fdc4257SSteve Yin 13445fdc4257SSteve Yin /** 1345*b0a7a3cfSSteve Yin * When a UNO control disposing, it disposes its listeners, 1346*b0a7a3cfSSteve Yin * then notify AccObject in bridge management, then notify 1347*b0a7a3cfSSteve Yin * COM that the XAccessible is invalid,so set pUNOInterface as NULL 1348*b0a7a3cfSSteve Yin * @param isDestroy, true is it need to be destroyed. 1349*b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1350*b0a7a3cfSSteve Yin */ 13515fdc4257SSteve Yin STDMETHODIMP CMAccessible::NotifyDestroy(BOOL isDestroy) 13525fdc4257SSteve Yin { 1353*b0a7a3cfSSteve Yin 1354*b0a7a3cfSSteve Yin m_isDestroy = isDestroy; 1355*b0a7a3cfSSteve Yin pUNOInterface = NULL; 1356*b0a7a3cfSSteve Yin return S_OK; 13575fdc4257SSteve Yin } 13585fdc4257SSteve Yin 13595fdc4257SSteve Yin /** 1360*b0a7a3cfSSteve Yin *private methods that help implement public functions 1361*b0a7a3cfSSteve Yin */ 13625fdc4257SSteve Yin 13635fdc4257SSteve Yin /** 1364*b0a7a3cfSSteve Yin * Return child interface pointer by child ID,note: need to call AddRef() 1365*b0a7a3cfSSteve Yin * @param lChildID, specify child index,which AT(such as Inspect32) gives. 1366*b0a7a3cfSSteve Yin * @return IMAccessible*, pointer to the corresponding child object. 1367*b0a7a3cfSSteve Yin */ 13685fdc4257SSteve Yin IMAccessible* CMAccessible::GetChildInterface(long dChildID)//for test 13695fdc4257SSteve Yin { 1370*b0a7a3cfSSteve Yin 1371*b0a7a3cfSSteve Yin long dChildIndex = 0; 1372*b0a7a3cfSSteve Yin if(dChildID<0) 1373*b0a7a3cfSSteve Yin { 1374*b0a7a3cfSSteve Yin if(g_pAgent) 1375*b0a7a3cfSSteve Yin { 1376*b0a7a3cfSSteve Yin IMAccessible* pIMAcc = NULL; 1377*b0a7a3cfSSteve Yin g_pAgent->GetIAccessibleFromResID(dChildID,&pIMAcc); 1378*b0a7a3cfSSteve Yin return pIMAcc; 1379*b0a7a3cfSSteve Yin } 1380*b0a7a3cfSSteve Yin return NULL; 1381*b0a7a3cfSSteve Yin } 1382*b0a7a3cfSSteve Yin else 1383*b0a7a3cfSSteve Yin { 1384*b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext(); 1385*b0a7a3cfSSteve Yin if( !pRContext.is() ) 1386*b0a7a3cfSSteve Yin return NULL; 1387*b0a7a3cfSSteve Yin 1388*b0a7a3cfSSteve Yin if(dChildID<1 || dChildID>pRContext->getAccessibleChildCount()) 1389*b0a7a3cfSSteve Yin return NULL; 1390*b0a7a3cfSSteve Yin 1391*b0a7a3cfSSteve Yin IAccessible* pChild = NULL; 1392*b0a7a3cfSSteve Yin Reference< XAccessible > pXChild = pRContext->getAccessibleChild(dChildID-1); 1393*b0a7a3cfSSteve Yin BOOL isGet = get_IAccessibleFromXAccessible((long)pXChild.get(),&pChild); 1394*b0a7a3cfSSteve Yin 1395*b0a7a3cfSSteve Yin if(!isGet) 1396*b0a7a3cfSSteve Yin { 1397*b0a7a3cfSSteve Yin g_pAgent->InsertAccObj(pXChild.get(),pUNOInterface,(long)m_hwnd); 1398*b0a7a3cfSSteve Yin isGet = get_IAccessibleFromXAccessible((long)pXChild.get(),&pChild); 1399*b0a7a3cfSSteve Yin } 1400*b0a7a3cfSSteve Yin 1401*b0a7a3cfSSteve Yin if(isGet) 1402*b0a7a3cfSSteve Yin { 1403*b0a7a3cfSSteve Yin IMAccessible* pIMAcc = (IMAccessible*)pChild; 1404*b0a7a3cfSSteve Yin return pIMAcc; 1405*b0a7a3cfSSteve Yin } 1406*b0a7a3cfSSteve Yin } 1407*b0a7a3cfSSteve Yin 1408*b0a7a3cfSSteve Yin return NULL; 14095fdc4257SSteve Yin } 14105fdc4257SSteve Yin 14115fdc4257SSteve Yin /** 1412*b0a7a3cfSSteve Yin * For List, tree and table,these roles belong to manage_decendant in UNO, 1413*b0a7a3cfSSteve Yin * need to process specifically when navigate 1414*b0a7a3cfSSteve Yin * @return BOOL, if it is decendantmanager, return true. 1415*b0a7a3cfSSteve Yin */ 14165fdc4257SSteve Yin BOOL CMAccessible::IsDecendantManage() 14175fdc4257SSteve Yin { 1418*b0a7a3cfSSteve Yin 1419*b0a7a3cfSSteve Yin return (m_iRole==ROLE_SYSTEM_LIST)||(m_iRole==ROLE_SYSTEM_OUTLINE)||(m_iRole==ROLE_SYSTEM_TABLE); 14205fdc4257SSteve Yin } 14215fdc4257SSteve Yin 14225fdc4257SSteve Yin /** 1423*b0a7a3cfSSteve Yin * for decendantmanager circumstance,provide child interface when navigate 1424*b0a7a3cfSSteve Yin * @param varCur, the current child. 1425*b0a7a3cfSSteve Yin * @param flags, the navigation direction. 1426*b0a7a3cfSSteve Yin * @return IMAccessible*, the child of the end up node. 1427*b0a7a3cfSSteve Yin */ 14285fdc4257SSteve Yin IMAccessible* CMAccessible::GetNavigateChildForDM(VARIANT varCur, short flags) 14295fdc4257SSteve Yin { 1430*b0a7a3cfSSteve Yin 1431*b0a7a3cfSSteve Yin XAccessibleContext* pXContext = GetContextByXAcc(pUNOInterface); 1432*b0a7a3cfSSteve Yin if(pXContext==NULL) 1433*b0a7a3cfSSteve Yin { 1434*b0a7a3cfSSteve Yin return NULL; 1435*b0a7a3cfSSteve Yin } 1436*b0a7a3cfSSteve Yin 1437*b0a7a3cfSSteve Yin int count = pXContext->getAccessibleChildCount(); 1438*b0a7a3cfSSteve Yin if(count<1) 1439*b0a7a3cfSSteve Yin { 1440*b0a7a3cfSSteve Yin return NULL; 1441*b0a7a3cfSSteve Yin } 1442*b0a7a3cfSSteve Yin 1443*b0a7a3cfSSteve Yin IMAccessible* pCurChild = NULL; 1444*b0a7a3cfSSteve Yin XAccessible* pChildXAcc = NULL; 1445*b0a7a3cfSSteve Yin Reference<XAccessible> pRChildXAcc; 1446*b0a7a3cfSSteve Yin XAccessibleContext* pChildContext = NULL; 1447*b0a7a3cfSSteve Yin int index = 0,delta=0; 1448*b0a7a3cfSSteve Yin switch(flags) 1449*b0a7a3cfSSteve Yin { 1450*b0a7a3cfSSteve Yin case DM_FIRSTCHILD: 1451*b0a7a3cfSSteve Yin pRChildXAcc = pXContext->getAccessibleChild(0); 1452*b0a7a3cfSSteve Yin break; 1453*b0a7a3cfSSteve Yin case DM_LASTCHILD: 1454*b0a7a3cfSSteve Yin pRChildXAcc = pXContext->getAccessibleChild(count-1); 1455*b0a7a3cfSSteve Yin break; 1456*b0a7a3cfSSteve Yin case DM_NEXTCHILD: 1457*b0a7a3cfSSteve Yin case DM_PREVCHILD: 1458*b0a7a3cfSSteve Yin pCurChild = GetChildInterface(varCur.lVal); 1459*b0a7a3cfSSteve Yin if(pCurChild==NULL) 1460*b0a7a3cfSSteve Yin { 1461*b0a7a3cfSSteve Yin return NULL; 1462*b0a7a3cfSSteve Yin } 1463*b0a7a3cfSSteve Yin pCurChild->GetUNOInterface((long*)&pChildXAcc); 1464*b0a7a3cfSSteve Yin if(pChildXAcc==NULL) 1465*b0a7a3cfSSteve Yin { 1466*b0a7a3cfSSteve Yin return NULL; 1467*b0a7a3cfSSteve Yin } 1468*b0a7a3cfSSteve Yin pChildContext = GetContextByXAcc(pChildXAcc); 1469*b0a7a3cfSSteve Yin if(pChildContext == NULL) 1470*b0a7a3cfSSteve Yin { 1471*b0a7a3cfSSteve Yin return NULL; 1472*b0a7a3cfSSteve Yin } 1473*b0a7a3cfSSteve Yin delta = (flags==DM_NEXTCHILD)?1:-1; 1474*b0a7a3cfSSteve Yin //currently, getAccessibleIndexInParent is error in UNO for 1475*b0a7a3cfSSteve Yin //some kind of List,such as ValueSet, the index will be less 1 than 1476*b0a7a3cfSSteve Yin //what should be, need to fix UNO code 1477*b0a7a3cfSSteve Yin index = pChildContext->getAccessibleIndexInParent()+delta; 1478*b0a7a3cfSSteve Yin if((index>=0)&&(index<=count-1)) 1479*b0a7a3cfSSteve Yin { 1480*b0a7a3cfSSteve Yin pRChildXAcc = pXContext->getAccessibleChild(index); 1481*b0a7a3cfSSteve Yin } 1482*b0a7a3cfSSteve Yin break; 1483*b0a7a3cfSSteve Yin default: 1484*b0a7a3cfSSteve Yin break; 1485*b0a7a3cfSSteve Yin } 1486*b0a7a3cfSSteve Yin 1487*b0a7a3cfSSteve Yin if(!pRChildXAcc.is()) 1488*b0a7a3cfSSteve Yin { 1489*b0a7a3cfSSteve Yin return NULL; 1490*b0a7a3cfSSteve Yin } 1491*b0a7a3cfSSteve Yin pChildXAcc = pRChildXAcc.get(); 1492*b0a7a3cfSSteve Yin g_pAgent->InsertAccObj(pChildXAcc,pUNOInterface); 1493*b0a7a3cfSSteve Yin return g_pAgent->GetIMAccByXAcc(pChildXAcc); 14945fdc4257SSteve Yin } 14955fdc4257SSteve Yin 14965fdc4257SSteve Yin /** 1497*b0a7a3cfSSteve Yin *the following 4 private methods are for accNavigate implementation 1498*b0a7a3cfSSteve Yin */ 14995fdc4257SSteve Yin 15005fdc4257SSteve Yin /** 1501*b0a7a3cfSSteve Yin * Return first child for parent container, process differently according 1502*b0a7a3cfSSteve Yin * to whether it is decendant manage 1503*b0a7a3cfSSteve Yin * @param varStart, the start child id of this navigation action. 1504*b0a7a3cfSSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 1505*b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1506*b0a7a3cfSSteve Yin */ 15075fdc4257SSteve Yin HRESULT CMAccessible::GetFirstChild(VARIANT varStart,VARIANT* pvarEndUpAt) 15085fdc4257SSteve Yin { 1509*b0a7a3cfSSteve Yin 1510*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1511*b0a7a3cfSSteve Yin ISDESTROY() 1512*b0a7a3cfSSteve Yin // #CHECK# 1513*b0a7a3cfSSteve Yin if(pvarEndUpAt == NULL) 1514*b0a7a3cfSSteve Yin { 1515*b0a7a3cfSSteve Yin return E_INVALIDARG; 1516*b0a7a3cfSSteve Yin } 1517*b0a7a3cfSSteve Yin if(varStart.vt != VT_I4) 1518*b0a7a3cfSSteve Yin { 1519*b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1520*b0a7a3cfSSteve Yin return E_INVALIDARG; 1521*b0a7a3cfSSteve Yin } 1522*b0a7a3cfSSteve Yin 1523*b0a7a3cfSSteve Yin pvarEndUpAt->pdispVal = GetNavigateChildForDM(varStart, DM_FIRSTCHILD); 1524*b0a7a3cfSSteve Yin if(pvarEndUpAt->pdispVal) 1525*b0a7a3cfSSteve Yin { 1526*b0a7a3cfSSteve Yin pvarEndUpAt->pdispVal->AddRef(); 1527*b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_DISPATCH; 1528*b0a7a3cfSSteve Yin return S_OK; 1529*b0a7a3cfSSteve Yin } 1530*b0a7a3cfSSteve Yin 1531*b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1532*b0a7a3cfSSteve Yin return E_FAIL; 1533*b0a7a3cfSSteve Yin 1534*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 15355fdc4257SSteve Yin } 15365fdc4257SSteve Yin 15375fdc4257SSteve Yin /** 1538*b0a7a3cfSSteve Yin * Return last child for parent container, process differently according 1539*b0a7a3cfSSteve Yin * to whether it is decendant manage 1540*b0a7a3cfSSteve Yin * @param varStart, the start child id of this navigation action. 1541*b0a7a3cfSSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 1542*b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1543*b0a7a3cfSSteve Yin */ 15445fdc4257SSteve Yin HRESULT CMAccessible::GetLastChild(VARIANT varStart,VARIANT* pvarEndUpAt) 15455fdc4257SSteve Yin { 1546*b0a7a3cfSSteve Yin 1547*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1548*b0a7a3cfSSteve Yin ISDESTROY() 1549*b0a7a3cfSSteve Yin // #CHECK# 1550*b0a7a3cfSSteve Yin if(pvarEndUpAt == NULL) 1551*b0a7a3cfSSteve Yin { 1552*b0a7a3cfSSteve Yin return E_INVALIDARG; 1553*b0a7a3cfSSteve Yin } 1554*b0a7a3cfSSteve Yin if(varStart.vt != VT_I4) 1555*b0a7a3cfSSteve Yin { 1556*b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1557*b0a7a3cfSSteve Yin return E_INVALIDARG; 1558*b0a7a3cfSSteve Yin } 1559*b0a7a3cfSSteve Yin 1560*b0a7a3cfSSteve Yin pvarEndUpAt->pdispVal = GetNavigateChildForDM(varStart, DM_LASTCHILD); 1561*b0a7a3cfSSteve Yin if(pvarEndUpAt->pdispVal) 1562*b0a7a3cfSSteve Yin { 1563*b0a7a3cfSSteve Yin pvarEndUpAt->pdispVal->AddRef(); 1564*b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_DISPATCH; 1565*b0a7a3cfSSteve Yin return S_OK; 1566*b0a7a3cfSSteve Yin } 1567*b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1568*b0a7a3cfSSteve Yin return E_FAIL; 1569*b0a7a3cfSSteve Yin 1570*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 15715fdc4257SSteve Yin } 15725fdc4257SSteve Yin 15735fdc4257SSteve Yin /** 1574*b0a7a3cfSSteve Yin * The method GetNextSibling is general, whatever it is decendant manage or not 1575*b0a7a3cfSSteve Yin * Get the next sibling object. 1576*b0a7a3cfSSteve Yin * @param varStart, the start child id of this navigation action. 1577*b0a7a3cfSSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 1578*b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1579*b0a7a3cfSSteve Yin */ 15805fdc4257SSteve Yin HRESULT CMAccessible::GetNextSibling(VARIANT varStart,VARIANT* pvarEndUpAt) 15815fdc4257SSteve Yin { 1582*b0a7a3cfSSteve Yin 1583*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1584*b0a7a3cfSSteve Yin ISDESTROY() 1585*b0a7a3cfSSteve Yin if(varStart.vt != VT_I4) 1586*b0a7a3cfSSteve Yin { 1587*b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1588*b0a7a3cfSSteve Yin return E_INVALIDARG; 1589*b0a7a3cfSSteve Yin } 1590*b0a7a3cfSSteve Yin 1591*b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface); 1592*b0a7a3cfSSteve Yin if(pRContext.is()) 1593*b0a7a3cfSSteve Yin { 1594*b0a7a3cfSSteve Yin varStart.iVal = sal_Int16(pRContext->getAccessibleIndexInParent() + 2); 1595*b0a7a3cfSSteve Yin if(m_pIParent) 1596*b0a7a3cfSSteve Yin if( m_pIParent->get_accChild(varStart,&pvarEndUpAt->pdispVal) == S_OK) 1597*b0a7a3cfSSteve Yin { 1598*b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_DISPATCH; 1599*b0a7a3cfSSteve Yin return S_OK; 1600*b0a7a3cfSSteve Yin } 1601*b0a7a3cfSSteve Yin } 1602*b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1603*b0a7a3cfSSteve Yin return E_FAIL; 1604*b0a7a3cfSSteve Yin 1605*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 16065fdc4257SSteve Yin } 16075fdc4257SSteve Yin 16085fdc4257SSteve Yin /** 1609*b0a7a3cfSSteve Yin *the method GetPreSibling is general, whatever it is decendant manage or not 1610*b0a7a3cfSSteve Yin * @param varStart, the start child id of this navigation action. 1611*b0a7a3cfSSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 1612*b0a7a3cfSSteve Yin * @return S_OK if successful and E_FAIL if failure. 1613*b0a7a3cfSSteve Yin */ 16145fdc4257SSteve Yin HRESULT CMAccessible::GetPreSibling(VARIANT varStart,VARIANT* pvarEndUpAt) 16155fdc4257SSteve Yin { 1616*b0a7a3cfSSteve Yin 1617*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1618*b0a7a3cfSSteve Yin ISDESTROY() 1619*b0a7a3cfSSteve Yin // #CHECK# 1620*b0a7a3cfSSteve Yin if(pvarEndUpAt == NULL) 1621*b0a7a3cfSSteve Yin { 1622*b0a7a3cfSSteve Yin return E_INVALIDARG; 1623*b0a7a3cfSSteve Yin } 1624*b0a7a3cfSSteve Yin if(varStart.vt != VT_I4) 1625*b0a7a3cfSSteve Yin { 1626*b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1627*b0a7a3cfSSteve Yin return E_INVALIDARG; 1628*b0a7a3cfSSteve Yin } 1629*b0a7a3cfSSteve Yin 1630*b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface); 1631*b0a7a3cfSSteve Yin if(pRContext.is()) 1632*b0a7a3cfSSteve Yin { 1633*b0a7a3cfSSteve Yin varStart.iVal = sal_Int16(pRContext->getAccessibleIndexInParent()); 1634*b0a7a3cfSSteve Yin if(m_pIParent && varStart.iVal > 0) 1635*b0a7a3cfSSteve Yin if( m_pIParent->get_accChild(varStart,&pvarEndUpAt->pdispVal) == S_OK) 1636*b0a7a3cfSSteve Yin { 1637*b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_DISPATCH; 1638*b0a7a3cfSSteve Yin return S_OK; 1639*b0a7a3cfSSteve Yin } 1640*b0a7a3cfSSteve Yin } 1641*b0a7a3cfSSteve Yin pvarEndUpAt->vt = VT_EMPTY; 1642*b0a7a3cfSSteve Yin return E_FAIL; 1643*b0a7a3cfSSteve Yin 1644*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 16455fdc4257SSteve Yin } 16465fdc4257SSteve Yin 16475fdc4257SSteve Yin /** 1648*b0a7a3cfSSteve Yin * For IAccessible2 implementation methods 1649*b0a7a3cfSSteve Yin */ 16505fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_nRelations( long __RPC_FAR *nRelations) 16515fdc4257SSteve Yin { 1652*b0a7a3cfSSteve Yin 16535fdc4257SSteve Yin CHECK_ENABLE_INF 1654*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 16555fdc4257SSteve Yin 1656*b0a7a3cfSSteve Yin // #CHECK# 1657*b0a7a3cfSSteve Yin if(nRelations == NULL) 1658*b0a7a3cfSSteve Yin { 1659*b0a7a3cfSSteve Yin return E_INVALIDARG; 1660*b0a7a3cfSSteve Yin } 16615fdc4257SSteve Yin 1662*b0a7a3cfSSteve Yin *nRelations = 0; 16635fdc4257SSteve Yin 1664*b0a7a3cfSSteve Yin if( !pRContext.is() ) 1665*b0a7a3cfSSteve Yin return E_FAIL; 1666*b0a7a3cfSSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet(); 1667*b0a7a3cfSSteve Yin if(!pRrelationSet.is()) 1668*b0a7a3cfSSteve Yin { 1669*b0a7a3cfSSteve Yin *nRelations = 0; 1670*b0a7a3cfSSteve Yin return S_OK; 1671*b0a7a3cfSSteve Yin } 16725fdc4257SSteve Yin 1673*b0a7a3cfSSteve Yin *nRelations = pRrelationSet->getRelationCount(); 1674*b0a7a3cfSSteve Yin return S_OK; 16755fdc4257SSteve Yin 1676*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 16775fdc4257SSteve Yin } 16785fdc4257SSteve Yin 16795fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_relation( long relationIndex, IAccessibleRelation __RPC_FAR *__RPC_FAR *relation) 16805fdc4257SSteve Yin { 1681*b0a7a3cfSSteve Yin 16825fdc4257SSteve Yin CHECK_ENABLE_INF 1683*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1684*b0a7a3cfSSteve Yin ISDESTROY() 1685*b0a7a3cfSSteve Yin // #CHECK# 1686*b0a7a3cfSSteve Yin if(relation == NULL) 1687*b0a7a3cfSSteve Yin { 1688*b0a7a3cfSSteve Yin return E_INVALIDARG; 1689*b0a7a3cfSSteve Yin } 16905fdc4257SSteve Yin 1691*b0a7a3cfSSteve Yin if( !pRContext.is() ) 1692*b0a7a3cfSSteve Yin return E_FAIL; 16935fdc4257SSteve Yin 16945fdc4257SSteve Yin 1695*b0a7a3cfSSteve Yin long nMax = 0; 1696*b0a7a3cfSSteve Yin long nReal = 0; 1697*b0a7a3cfSSteve Yin get_nRelations(&nMax); 16985fdc4257SSteve Yin 1699*b0a7a3cfSSteve Yin *relation = (IAccessibleRelation*)::CoTaskMemAlloc(sizeof(IAccessibleRelation)); 17005fdc4257SSteve Yin 1701*b0a7a3cfSSteve Yin // #CHECK Memory Allocation# 1702*b0a7a3cfSSteve Yin if(*relation == NULL) 1703*b0a7a3cfSSteve Yin { 1704*b0a7a3cfSSteve Yin return E_FAIL; 1705*b0a7a3cfSSteve Yin } 17065fdc4257SSteve Yin 1707*b0a7a3cfSSteve Yin if( relationIndex < nMax ) 1708*b0a7a3cfSSteve Yin { 17095fdc4257SSteve Yin 17105fdc4257SSteve Yin 1711*b0a7a3cfSSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet(); 1712*b0a7a3cfSSteve Yin if(!pRrelationSet.is()) 1713*b0a7a3cfSSteve Yin { 17145fdc4257SSteve Yin 1715*b0a7a3cfSSteve Yin return E_FAIL; 1716*b0a7a3cfSSteve Yin } 17175fdc4257SSteve Yin 1718*b0a7a3cfSSteve Yin IAccessibleRelation* pRelation = NULL; 1719*b0a7a3cfSSteve Yin ActivateActContext(); 1720*b0a7a3cfSSteve Yin HRESULT hr = CoCreateInstance( CLSID_AccRelation, NULL, CLSCTX_SERVER , 1721*b0a7a3cfSSteve Yin IID_IAccessibleRelation, 1722*b0a7a3cfSSteve Yin (void **)&pRelation); 1723*b0a7a3cfSSteve Yin DeactivateActContext(); 1724*b0a7a3cfSSteve Yin if(SUCCEEDED(hr)) 1725*b0a7a3cfSSteve Yin { 1726*b0a7a3cfSSteve Yin IUNOXWrapper* wrapper = NULL; 1727*b0a7a3cfSSteve Yin hr = pRelation->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper); 1728*b0a7a3cfSSteve Yin if(SUCCEEDED(hr)) 1729*b0a7a3cfSSteve Yin { 1730*b0a7a3cfSSteve Yin AccessibleRelation accRelation = pRrelationSet->getRelation(relationIndex); 1731*b0a7a3cfSSteve Yin wrapper->put_XSubInterface((long)&accRelation); 1732*b0a7a3cfSSteve Yin wrapper->Release(); 1733*b0a7a3cfSSteve Yin *relation = pRelation; 1734*b0a7a3cfSSteve Yin return S_OK; 1735*b0a7a3cfSSteve Yin } 17365fdc4257SSteve Yin 1737*b0a7a3cfSSteve Yin } 1738*b0a7a3cfSSteve Yin } 17395fdc4257SSteve Yin 1740*b0a7a3cfSSteve Yin return E_FAIL; 17415fdc4257SSteve Yin 1742*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 17435fdc4257SSteve Yin } 17445fdc4257SSteve Yin 17455fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_relations( long, IAccessibleRelation __RPC_FAR *__RPC_FAR *relation, long __RPC_FAR *nRelations) 17465fdc4257SSteve Yin { 1747*b0a7a3cfSSteve Yin 17485fdc4257SSteve Yin CHECK_ENABLE_INF 1749*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1750*b0a7a3cfSSteve Yin 1751*b0a7a3cfSSteve Yin // #CHECK# 1752*b0a7a3cfSSteve Yin if(relation == NULL || nRelations == NULL) 1753*b0a7a3cfSSteve Yin { 1754*b0a7a3cfSSteve Yin return E_INVALIDARG; 1755*b0a7a3cfSSteve Yin } 1756*b0a7a3cfSSteve Yin // #CHECK XInterface# 1757*b0a7a3cfSSteve Yin 1758*b0a7a3cfSSteve Yin if( !pRContext.is() ) 1759*b0a7a3cfSSteve Yin return E_FAIL; 1760*b0a7a3cfSSteve Yin 1761*b0a7a3cfSSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet(); 1762*b0a7a3cfSSteve Yin if(!pRrelationSet.is()) 1763*b0a7a3cfSSteve Yin { 1764*b0a7a3cfSSteve Yin *nRelations = 0; 1765*b0a7a3cfSSteve Yin return S_OK; 1766*b0a7a3cfSSteve Yin } 1767*b0a7a3cfSSteve Yin 1768*b0a7a3cfSSteve Yin long nCount = pRrelationSet->getRelationCount(); 1769*b0a7a3cfSSteve Yin 1770*b0a7a3cfSSteve Yin *relation = (IAccessibleRelation*)::CoTaskMemAlloc(nCount*sizeof(IAccessibleRelation)); 1771*b0a7a3cfSSteve Yin 1772*b0a7a3cfSSteve Yin // #CHECK Memory Allocation# 1773*b0a7a3cfSSteve Yin if(*relation == NULL) 1774*b0a7a3cfSSteve Yin { 1775*b0a7a3cfSSteve Yin return E_FAIL; 1776*b0a7a3cfSSteve Yin } 1777*b0a7a3cfSSteve Yin 1778*b0a7a3cfSSteve Yin for(int i=0; i<nCount ; i++) 1779*b0a7a3cfSSteve Yin { 1780*b0a7a3cfSSteve Yin IAccessibleRelation* pRelation = NULL; 1781*b0a7a3cfSSteve Yin ActivateActContext(); 1782*b0a7a3cfSSteve Yin HRESULT hr = CoCreateInstance( CLSID_AccRelation, NULL, CLSCTX_SERVER , 1783*b0a7a3cfSSteve Yin IID_IAccessibleRelation, 1784*b0a7a3cfSSteve Yin (void **)&pRelation); 1785*b0a7a3cfSSteve Yin DeactivateActContext(); 1786*b0a7a3cfSSteve Yin if(SUCCEEDED(hr)) 1787*b0a7a3cfSSteve Yin { 1788*b0a7a3cfSSteve Yin IUNOXWrapper* wrapper = NULL; 1789*b0a7a3cfSSteve Yin hr = pRelation->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper); 1790*b0a7a3cfSSteve Yin if(SUCCEEDED(hr)) 1791*b0a7a3cfSSteve Yin { 1792*b0a7a3cfSSteve Yin AccessibleRelation accRelation = pRrelationSet->getRelation(i); 1793*b0a7a3cfSSteve Yin wrapper->put_XSubInterface((long)&accRelation); 1794*b0a7a3cfSSteve Yin wrapper->Release(); 1795*b0a7a3cfSSteve Yin } 1796*b0a7a3cfSSteve Yin (relation)[i] = pRelation; 1797*b0a7a3cfSSteve Yin } 1798*b0a7a3cfSSteve Yin } 1799*b0a7a3cfSSteve Yin 1800*b0a7a3cfSSteve Yin *nRelations = nCount; 1801*b0a7a3cfSSteve Yin return S_OK; 1802*b0a7a3cfSSteve Yin 1803*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 18045fdc4257SSteve Yin } 18055fdc4257SSteve Yin 18065fdc4257SSteve Yin STDMETHODIMP CMAccessible::role(long __RPC_FAR *role) 18075fdc4257SSteve Yin { 1808*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 18095fdc4257SSteve Yin 1810*b0a7a3cfSSteve Yin (*role) = m_iRole; 18115fdc4257SSteve Yin 1812*b0a7a3cfSSteve Yin return S_OK; 18135fdc4257SSteve Yin 1814*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 18155fdc4257SSteve Yin } 18165fdc4257SSteve Yin 18175fdc4257SSteve Yin 18185fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_nActions(long __RPC_FAR *nActions) 18195fdc4257SSteve Yin { 1820*b0a7a3cfSSteve Yin 1821*b0a7a3cfSSteve Yin try 1822*b0a7a3cfSSteve Yin { 1823*b0a7a3cfSSteve Yin ISDESTROY() 1824*b0a7a3cfSSteve Yin // #CHECK# 1825*b0a7a3cfSSteve Yin if(nActions == NULL) 1826*b0a7a3cfSSteve Yin { 1827*b0a7a3cfSSteve Yin return E_INVALIDARG; 1828*b0a7a3cfSSteve Yin } 1829*b0a7a3cfSSteve Yin *nActions = 0L; 1830*b0a7a3cfSSteve Yin IAccessibleAction* pAcc = NULL; 1831*b0a7a3cfSSteve Yin HRESULT hr = QueryInterface(IID_IAccessibleAction, (void**)&pAcc); 1832*b0a7a3cfSSteve Yin if( hr == S_OK ) 1833*b0a7a3cfSSteve Yin { 1834*b0a7a3cfSSteve Yin pAcc->nActions(nActions); 1835*b0a7a3cfSSteve Yin pAcc->Release(); 1836*b0a7a3cfSSteve Yin } 1837*b0a7a3cfSSteve Yin 1838*b0a7a3cfSSteve Yin return S_OK; 1839*b0a7a3cfSSteve Yin } 1840*b0a7a3cfSSteve Yin catch(...) 1841*b0a7a3cfSSteve Yin { 1842*b0a7a3cfSSteve Yin *nActions = 0L; 1843*b0a7a3cfSSteve Yin return S_OK; 1844*b0a7a3cfSSteve Yin } 18455fdc4257SSteve Yin } 18465fdc4257SSteve Yin 18475fdc4257SSteve Yin 18485fdc4257SSteve Yin STDMETHODIMP CMAccessible:: scrollToPoint(enum IA2CoordinateType, long, long) 18495fdc4257SSteve Yin { 1850*b0a7a3cfSSteve Yin 1851*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1852*b0a7a3cfSSteve Yin ISDESTROY() 1853*b0a7a3cfSSteve Yin return E_NOTIMPL; 1854*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 18555fdc4257SSteve Yin 18565fdc4257SSteve Yin } 18575fdc4257SSteve Yin STDMETHODIMP CMAccessible:: scrollTo(enum IA2ScrollType) 18585fdc4257SSteve Yin { 18595fdc4257SSteve Yin 1860*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1861*b0a7a3cfSSteve Yin ISDESTROY() 1862*b0a7a3cfSSteve Yin 1863*b0a7a3cfSSteve Yin return E_NOTIMPL; 18645fdc4257SSteve Yin 1865*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 18665fdc4257SSteve Yin } 18675fdc4257SSteve Yin 18685fdc4257SSteve Yin static XAccessible* getTheParentOfMember(XAccessible* pXAcc) 18695fdc4257SSteve Yin { 1870*b0a7a3cfSSteve Yin // #CHECK# 1871*b0a7a3cfSSteve Yin if(pXAcc == NULL) 1872*b0a7a3cfSSteve Yin { 1873*b0a7a3cfSSteve Yin return NULL; 1874*b0a7a3cfSSteve Yin } 1875*b0a7a3cfSSteve Yin Reference<XAccessibleContext> pRContext = pXAcc->getAccessibleContext(); 1876*b0a7a3cfSSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet(); 1877*b0a7a3cfSSteve Yin long nRelations = pRrelationSet->getRelationCount(); 1878*b0a7a3cfSSteve Yin for(int i=0 ; i<nRelations ; i++) 1879*b0a7a3cfSSteve Yin { 1880*b0a7a3cfSSteve Yin AccessibleRelation accRelation = pRrelationSet->getRelation(i); 1881*b0a7a3cfSSteve Yin if(accRelation.RelationType == 7) 1882*b0a7a3cfSSteve Yin { 1883*b0a7a3cfSSteve Yin Sequence< Reference< XInterface > > xTargets = accRelation.TargetSet; 1884*b0a7a3cfSSteve Yin return (XAccessible*)xTargets[0].get(); 1885*b0a7a3cfSSteve Yin } 1886*b0a7a3cfSSteve Yin } 1887*b0a7a3cfSSteve Yin return NULL; 18885fdc4257SSteve Yin } 18895fdc4257SSteve Yin 18905fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_groupPosition(long __RPC_FAR *groupLevel,long __RPC_FAR *similarItemsInGroup,long __RPC_FAR *positionInGroup) 18915fdc4257SSteve Yin { 1892*b0a7a3cfSSteve Yin 18935fdc4257SSteve Yin CHECK_ENABLE_INF 1894*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 1895*b0a7a3cfSSteve Yin ISDESTROY() 1896*b0a7a3cfSSteve Yin // #CHECK# 1897*b0a7a3cfSSteve Yin if(groupLevel == NULL || similarItemsInGroup == NULL || positionInGroup == NULL) 1898*b0a7a3cfSSteve Yin { 1899*b0a7a3cfSSteve Yin return E_INVALIDARG; 1900*b0a7a3cfSSteve Yin } 1901*b0a7a3cfSSteve Yin 1902*b0a7a3cfSSteve Yin Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext(); 1903*b0a7a3cfSSteve Yin if(!pRContext.is()) 1904*b0a7a3cfSSteve Yin return E_FAIL; 1905*b0a7a3cfSSteve Yin long Role = pRContext->getAccessibleRole(); 1906*b0a7a3cfSSteve Yin 1907*b0a7a3cfSSteve Yin *groupLevel = 0; 1908*b0a7a3cfSSteve Yin *similarItemsInGroup = 0; 1909*b0a7a3cfSSteve Yin *positionInGroup = 0; 1910*b0a7a3cfSSteve Yin 1911*b0a7a3cfSSteve Yin if (Role != AccessibleRole::DOCUMENT) 1912*b0a7a3cfSSteve Yin { 1913*b0a7a3cfSSteve Yin Reference< XAccessibleGroupPosition > xGroupPosition( pRContext, UNO_QUERY ); 1914*b0a7a3cfSSteve Yin if ( xGroupPosition.is() ) 1915*b0a7a3cfSSteve Yin { 1916*b0a7a3cfSSteve Yin Sequence< sal_Int32 > rSeq = xGroupPosition->getGroupPosition( makeAny( pRContext ) ); 1917*b0a7a3cfSSteve Yin sal_Int32* pSeq = rSeq.getArray(); 1918*b0a7a3cfSSteve Yin if ( pSeq ) 1919*b0a7a3cfSSteve Yin { 1920*b0a7a3cfSSteve Yin *groupLevel = pSeq[0]; 1921*b0a7a3cfSSteve Yin *similarItemsInGroup = pSeq[1]; 1922*b0a7a3cfSSteve Yin *positionInGroup = pSeq[2]; 1923*b0a7a3cfSSteve Yin return S_OK; 1924*b0a7a3cfSSteve Yin } 1925*b0a7a3cfSSteve Yin return S_OK; 1926*b0a7a3cfSSteve Yin } 1927*b0a7a3cfSSteve Yin } 1928*b0a7a3cfSSteve Yin 1929*b0a7a3cfSSteve Yin Reference< XAccessible> pParentAcc = pRContext->getAccessibleParent(); 1930*b0a7a3cfSSteve Yin if( !pParentAcc.is() ) 1931*b0a7a3cfSSteve Yin { 1932*b0a7a3cfSSteve Yin return S_OK; 1933*b0a7a3cfSSteve Yin } 1934*b0a7a3cfSSteve Yin 1935*b0a7a3cfSSteve Yin Reference<XAccessibleContext> pRParentContext = pParentAcc->getAccessibleContext(); 1936*b0a7a3cfSSteve Yin 1937*b0a7a3cfSSteve Yin int level = 0; 1938*b0a7a3cfSSteve Yin int index = 0; 1939*b0a7a3cfSSteve Yin int number = 0; 1940*b0a7a3cfSSteve Yin 1941*b0a7a3cfSSteve Yin if( Role == RADIO_BUTTON ) 1942*b0a7a3cfSSteve Yin { 1943*b0a7a3cfSSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet(); 1944*b0a7a3cfSSteve Yin long nRel = pRrelationSet->getRelationCount(); 1945*b0a7a3cfSSteve Yin for(int i=0 ; i<nRel ; i++) 1946*b0a7a3cfSSteve Yin { 1947*b0a7a3cfSSteve Yin AccessibleRelation accRelation = pRrelationSet->getRelation(i); 1948*b0a7a3cfSSteve Yin if(accRelation.RelationType == 7) 1949*b0a7a3cfSSteve Yin { 1950*b0a7a3cfSSteve Yin Sequence< Reference< XInterface > > xTargets = accRelation.TargetSet; 1951*b0a7a3cfSSteve Yin int nCount = xTargets.getLength(); 1952*b0a7a3cfSSteve Yin 1953*b0a7a3cfSSteve Yin Reference<XInterface> pRAcc = xTargets[0]; 1954*b0a7a3cfSSteve Yin for(int j=0; j<pRParentContext->getAccessibleChildCount(); j++) 1955*b0a7a3cfSSteve Yin { 1956*b0a7a3cfSSteve Yin if( getTheParentOfMember(pRParentContext->getAccessibleChild(j).get()) 1957*b0a7a3cfSSteve Yin == (XAccessible*)pRAcc.get() && 1958*b0a7a3cfSSteve Yin pRParentContext->getAccessibleChild(j)->getAccessibleContext()->getAccessibleRole() == RADIO_BUTTON) 1959*b0a7a3cfSSteve Yin number++; 1960*b0a7a3cfSSteve Yin if(pRParentContext->getAccessibleChild(j).get() == pUNOInterface) 1961*b0a7a3cfSSteve Yin index = number; 1962*b0a7a3cfSSteve Yin } 1963*b0a7a3cfSSteve Yin } 1964*b0a7a3cfSSteve Yin } 1965*b0a7a3cfSSteve Yin *groupLevel = 1; 1966*b0a7a3cfSSteve Yin *similarItemsInGroup = number; 1967*b0a7a3cfSSteve Yin *positionInGroup = index; 1968*b0a7a3cfSSteve Yin return S_OK; 1969*b0a7a3cfSSteve Yin } 1970*b0a7a3cfSSteve Yin 1971*b0a7a3cfSSteve Yin else if ( COMBO_BOX == Role ) 1972*b0a7a3cfSSteve Yin { 1973*b0a7a3cfSSteve Yin *groupLevel = 1; 1974*b0a7a3cfSSteve Yin *similarItemsInGroup = 0; 1975*b0a7a3cfSSteve Yin *positionInGroup = -1; 1976*b0a7a3cfSSteve Yin 1977*b0a7a3cfSSteve Yin long nCount = pRContext->getAccessibleChildCount(); 1978*b0a7a3cfSSteve Yin if( 2 != nCount) 1979*b0a7a3cfSSteve Yin { 1980*b0a7a3cfSSteve Yin return S_OK; 1981*b0a7a3cfSSteve Yin } 1982*b0a7a3cfSSteve Yin Reference<XAccessible> xList=pRContext->getAccessibleChild(1); 1983*b0a7a3cfSSteve Yin if (!xList.is()) 1984*b0a7a3cfSSteve Yin { 1985*b0a7a3cfSSteve Yin return S_OK; 1986*b0a7a3cfSSteve Yin } 1987*b0a7a3cfSSteve Yin Reference<XAccessibleContext> xListContext(xList,UNO_QUERY); 1988*b0a7a3cfSSteve Yin if (!xListContext.is()) 1989*b0a7a3cfSSteve Yin { 1990*b0a7a3cfSSteve Yin return S_OK; 1991*b0a7a3cfSSteve Yin } 1992*b0a7a3cfSSteve Yin Reference<XAccessibleSelection> xListSel(xList,UNO_QUERY); 1993*b0a7a3cfSSteve Yin if (!xListSel.is()) 1994*b0a7a3cfSSteve Yin { 1995*b0a7a3cfSSteve Yin return S_OK; 1996*b0a7a3cfSSteve Yin } 1997*b0a7a3cfSSteve Yin *similarItemsInGroup = xListContext->getAccessibleChildCount(); 1998*b0a7a3cfSSteve Yin if (*similarItemsInGroup > 0 ) 1999*b0a7a3cfSSteve Yin { 2000*b0a7a3cfSSteve Yin try 2001*b0a7a3cfSSteve Yin { 2002*b0a7a3cfSSteve Yin Reference<XAccessible> xChild = xListSel->getSelectedAccessibleChild(0); 2003*b0a7a3cfSSteve Yin if (xChild.is()) 2004*b0a7a3cfSSteve Yin { 2005*b0a7a3cfSSteve Yin Reference<XAccessibleContext> xChildContext(xChild,UNO_QUERY); 2006*b0a7a3cfSSteve Yin if (xChildContext.is()) 2007*b0a7a3cfSSteve Yin { 2008*b0a7a3cfSSteve Yin *positionInGroup=xChildContext->getAccessibleIndexInParent() + 1 ; 2009*b0a7a3cfSSteve Yin return S_OK; 2010*b0a7a3cfSSteve Yin } 2011*b0a7a3cfSSteve Yin } 2012*b0a7a3cfSSteve Yin } 2013*b0a7a3cfSSteve Yin catch(...) 2014*b0a7a3cfSSteve Yin {} 2015*b0a7a3cfSSteve Yin } 2016*b0a7a3cfSSteve Yin return S_OK; 2017*b0a7a3cfSSteve Yin } 2018*b0a7a3cfSSteve Yin else if ( PAGE_TAB == Role ) 2019*b0a7a3cfSSteve Yin { 2020*b0a7a3cfSSteve Yin *groupLevel = 1; 2021*b0a7a3cfSSteve Yin *similarItemsInGroup = pRParentContext->getAccessibleChildCount(); 2022*b0a7a3cfSSteve Yin 2023*b0a7a3cfSSteve Yin if (*similarItemsInGroup > 0 ) 2024*b0a7a3cfSSteve Yin { 2025*b0a7a3cfSSteve Yin *positionInGroup=pRContext->getAccessibleIndexInParent() + 1 ; 2026*b0a7a3cfSSteve Yin } 2027*b0a7a3cfSSteve Yin else 2028*b0a7a3cfSSteve Yin { 2029*b0a7a3cfSSteve Yin *positionInGroup = -1; 2030*b0a7a3cfSSteve Yin } 2031*b0a7a3cfSSteve Yin return S_OK; 2032*b0a7a3cfSSteve Yin } 2033*b0a7a3cfSSteve Yin 2034*b0a7a3cfSSteve Yin 2035*b0a7a3cfSSteve Yin BOOL isFound = FALSE; 2036*b0a7a3cfSSteve Yin while( pParentAcc.is() && !isFound) 2037*b0a7a3cfSSteve Yin { 2038*b0a7a3cfSSteve Yin level++; 2039*b0a7a3cfSSteve Yin pRParentContext = pParentAcc->getAccessibleContext(); 2040*b0a7a3cfSSteve Yin Role = pRParentContext->getAccessibleRole(); 2041*b0a7a3cfSSteve Yin if( (Role == TREE) || (Role == LIST) ) 2042*b0a7a3cfSSteve Yin isFound = TRUE; 2043*b0a7a3cfSSteve Yin pParentAcc = pRParentContext->getAccessibleParent(); 2044*b0a7a3cfSSteve Yin } 2045*b0a7a3cfSSteve Yin 2046*b0a7a3cfSSteve Yin if( isFound ) 2047*b0a7a3cfSSteve Yin { 2048*b0a7a3cfSSteve Yin Reference< XAccessible> pTempAcc = pRContext->getAccessibleParent(); 2049*b0a7a3cfSSteve Yin pRParentContext = pTempAcc->getAccessibleContext(); 2050*b0a7a3cfSSteve Yin *groupLevel = level; 2051*b0a7a3cfSSteve Yin *similarItemsInGroup = pRParentContext->getAccessibleChildCount(); 2052*b0a7a3cfSSteve Yin *positionInGroup = pRContext->getAccessibleIndexInParent() + 1; 2053*b0a7a3cfSSteve Yin } 2054*b0a7a3cfSSteve Yin else 2055*b0a7a3cfSSteve Yin { 2056*b0a7a3cfSSteve Yin *groupLevel = 0; 2057*b0a7a3cfSSteve Yin *similarItemsInGroup = 0; 2058*b0a7a3cfSSteve Yin *positionInGroup = 0; 2059*b0a7a3cfSSteve Yin } 2060*b0a7a3cfSSteve Yin return S_OK; 2061*b0a7a3cfSSteve Yin 2062*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 20635fdc4257SSteve Yin } 20645fdc4257SSteve Yin 20655fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_extendedStates( long, BSTR __RPC_FAR *__RPC_FAR *, long __RPC_FAR *) 20665fdc4257SSteve Yin { 2067*b0a7a3cfSSteve Yin 20685fdc4257SSteve Yin CHECK_ENABLE_INF 2069*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2070*b0a7a3cfSSteve Yin ISDESTROY() 20715fdc4257SSteve Yin 2072*b0a7a3cfSSteve Yin return E_NOTIMPL; 20735fdc4257SSteve Yin 2074*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 20755fdc4257SSteve Yin } 20765fdc4257SSteve Yin 20775fdc4257SSteve Yin 20785fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_uniqueID(long __RPC_FAR *uniqueID) 20795fdc4257SSteve Yin { 20805fdc4257SSteve Yin 2081*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2082*b0a7a3cfSSteve Yin ISDESTROY() 2083*b0a7a3cfSSteve Yin // #CHECK# 2084*b0a7a3cfSSteve Yin if(uniqueID == NULL) 2085*b0a7a3cfSSteve Yin { 2086*b0a7a3cfSSteve Yin return E_INVALIDARG; 2087*b0a7a3cfSSteve Yin } 2088*b0a7a3cfSSteve Yin *uniqueID = m_dChildID; 2089*b0a7a3cfSSteve Yin return S_OK; 2090*b0a7a3cfSSteve Yin 2091*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 20925fdc4257SSteve Yin } 20935fdc4257SSteve Yin 20945fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_windowHandle(HWND __RPC_FAR *windowHandle) 20955fdc4257SSteve Yin { 2096*b0a7a3cfSSteve Yin 2097*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2098*b0a7a3cfSSteve Yin ISDESTROY() 2099*b0a7a3cfSSteve Yin // #CHECK# 2100*b0a7a3cfSSteve Yin if(windowHandle == NULL) 2101*b0a7a3cfSSteve Yin { 2102*b0a7a3cfSSteve Yin return E_INVALIDARG; 2103*b0a7a3cfSSteve Yin } 2104*b0a7a3cfSSteve Yin 2105*b0a7a3cfSSteve Yin HWND nHwnd = m_hwnd; 2106*b0a7a3cfSSteve Yin IAccessible* pParent = m_pIParent; 2107*b0a7a3cfSSteve Yin CMAccessible* pChild = this; 2108*b0a7a3cfSSteve Yin while((nHwnd==0) && pParent) 2109*b0a7a3cfSSteve Yin { 2110*b0a7a3cfSSteve Yin pChild = (CMAccessible*)pParent; 2111*b0a7a3cfSSteve Yin if(pChild) 2112*b0a7a3cfSSteve Yin { 2113*b0a7a3cfSSteve Yin pParent = (IAccessible*)pChild->m_pIParent; 2114*b0a7a3cfSSteve Yin nHwnd = (HWND)pChild->m_hwnd; 2115*b0a7a3cfSSteve Yin } 2116*b0a7a3cfSSteve Yin else 2117*b0a7a3cfSSteve Yin pParent = NULL; 2118*b0a7a3cfSSteve Yin } 2119*b0a7a3cfSSteve Yin 2120*b0a7a3cfSSteve Yin *windowHandle = nHwnd; 2121*b0a7a3cfSSteve Yin return S_OK; 2122*b0a7a3cfSSteve Yin 2123*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 21245fdc4257SSteve Yin } 21255fdc4257SSteve Yin 21265fdc4257SSteve Yin /** 2127*b0a7a3cfSSteve Yin * Get XAccessibleContext directly from UNO by the stored XAccessible pointer 2128*b0a7a3cfSSteve Yin * @param pXAcc, UNO XAccessible object point. 2129*b0a7a3cfSSteve Yin * @return XAccessibleContext*, the context of the pXAcc. 2130*b0a7a3cfSSteve Yin */ 21315fdc4257SSteve Yin XAccessibleContext* CMAccessible::GetContextByXAcc( XAccessible* pXAcc ) 21325fdc4257SSteve Yin { 2133*b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext; 2134*b0a7a3cfSSteve Yin if( pXAcc == NULL) 2135*b0a7a3cfSSteve Yin return NULL; 21365fdc4257SSteve Yin 2137*b0a7a3cfSSteve Yin pRContext = pXAcc->getAccessibleContext(); 2138*b0a7a3cfSSteve Yin if( !pRContext.is() ) 2139*b0a7a3cfSSteve Yin return NULL; 2140*b0a7a3cfSSteve Yin return pRContext.get(); 21415fdc4257SSteve Yin } 21425fdc4257SSteve Yin 21435fdc4257SSteve Yin /** 2144*b0a7a3cfSSteve Yin * Return the member variable m_pXAccessibleSelection, instead of 2145*b0a7a3cfSSteve Yin * get XAccessibleSelection according to XAccessibleContext because if so,it will 2146*b0a7a3cfSSteve Yin * depend on the UNO implementation code,so when COM is created, put XAccessibleSelection 2147*b0a7a3cfSSteve Yin * by bridge management system 2148*b0a7a3cfSSteve Yin * @return XAccessibleSelection*, the selection of the current object. 2149*b0a7a3cfSSteve Yin */ 21505fdc4257SSteve Yin Reference< XAccessibleSelection > CMAccessible::GetSelection() 21515fdc4257SSteve Yin { 2152*b0a7a3cfSSteve Yin if( pUNOInterface == NULL ) 2153*b0a7a3cfSSteve Yin return NULL; 2154*b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext(); 2155*b0a7a3cfSSteve Yin if(pRContext.is()) 2156*b0a7a3cfSSteve Yin { 2157*b0a7a3cfSSteve Yin Reference< XAccessibleSelection > pRSelection(pRContext,UNO_QUERY); 2158*b0a7a3cfSSteve Yin return pRSelection; 2159*b0a7a3cfSSteve Yin } 2160*b0a7a3cfSSteve Yin return NULL; 21615fdc4257SSteve Yin } 21625fdc4257SSteve Yin 21635fdc4257SSteve Yin /** 2164*b0a7a3cfSSteve Yin * Select one XAccessible item, for accSelect implementation 2165*b0a7a3cfSSteve Yin * @param pItem, the item should be selected. 2166*b0a7a3cfSSteve Yin * @return S_OK if successful. 2167*b0a7a3cfSSteve Yin */ 21685fdc4257SSteve Yin HRESULT CMAccessible::SelectChild(XAccessible* pItem) 21695fdc4257SSteve Yin { 21705fdc4257SSteve Yin 2171*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2172*b0a7a3cfSSteve Yin ISDESTROY() 2173*b0a7a3cfSSteve Yin XAccessibleContext* pParentContext = GetContextByXAcc( pUNOInterface ); 2174*b0a7a3cfSSteve Yin XAccessibleContext* pContext = GetContextByXAcc( pItem ); 2175*b0a7a3cfSSteve Yin if( pParentContext == NULL || pContext == NULL ) 2176*b0a7a3cfSSteve Yin return E_FAIL; 2177*b0a7a3cfSSteve Yin 2178*b0a7a3cfSSteve Yin Reference< XAccessibleSelection > pRSelection = GetSelection(); 2179*b0a7a3cfSSteve Yin if( !pRSelection.is() ) 2180*b0a7a3cfSSteve Yin return E_FAIL; 2181*b0a7a3cfSSteve Yin long Index = pContext->getAccessibleIndexInParent(); 2182*b0a7a3cfSSteve Yin pRSelection->selectAccessibleChild( Index ); 2183*b0a7a3cfSSteve Yin return S_OK; 21845fdc4257SSteve Yin 2185*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 21865fdc4257SSteve Yin } 21875fdc4257SSteve Yin 21885fdc4257SSteve Yin /** 2189*b0a7a3cfSSteve Yin * Deselect one XAccessible item, for accSelect implimentation 2190*b0a7a3cfSSteve Yin * @param pItem, the item should be deselected. 2191*b0a7a3cfSSteve Yin * @return S_OK if successful. 2192*b0a7a3cfSSteve Yin */ 21935fdc4257SSteve Yin HRESULT CMAccessible::DeSelectChild(XAccessible* pItem) 21945fdc4257SSteve Yin { 21955fdc4257SSteve Yin 2196*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2197*b0a7a3cfSSteve Yin ISDESTROY() 2198*b0a7a3cfSSteve Yin XAccessibleContext* pParentContext = GetContextByXAcc( pUNOInterface ); 2199*b0a7a3cfSSteve Yin ; 2200*b0a7a3cfSSteve Yin XAccessibleContext* pContext = GetContextByXAcc( pItem ); 2201*b0a7a3cfSSteve Yin if( pParentContext == NULL || pContext == NULL ) 2202*b0a7a3cfSSteve Yin return E_INVALIDARG; 2203*b0a7a3cfSSteve Yin 2204*b0a7a3cfSSteve Yin Reference< XAccessibleSelection > pRSelection = GetSelection(); 2205*b0a7a3cfSSteve Yin if( !pRSelection.is() ) 2206*b0a7a3cfSSteve Yin return E_FAIL; 2207*b0a7a3cfSSteve Yin long Index = pContext->getAccessibleIndexInParent(); 2208*b0a7a3cfSSteve Yin pRSelection->deselectAccessibleChild( Index ); 22095fdc4257SSteve Yin 2210*b0a7a3cfSSteve Yin return S_OK; 22115fdc4257SSteve Yin 2212*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 22135fdc4257SSteve Yin } 22145fdc4257SSteve Yin 22155fdc4257SSteve Yin /** 2216*b0a7a3cfSSteve Yin * Select multiple XAccessible items,for implementation of accSelect 2217*b0a7a3cfSSteve Yin * @param pItem, the items should be selected. 2218*b0a7a3cfSSteve Yin * @param size, the size of the items. 2219*b0a7a3cfSSteve Yin * @return S_OK if successful. 2220*b0a7a3cfSSteve Yin */ 22215fdc4257SSteve Yin HRESULT CMAccessible::SelectMutipleChidren( XAccessible** pItem,int size ) 22225fdc4257SSteve Yin { 22235fdc4257SSteve Yin 2224*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2225*b0a7a3cfSSteve Yin ISDESTROY() 2226*b0a7a3cfSSteve Yin // #CHECK# 2227*b0a7a3cfSSteve Yin if(pItem == NULL) 2228*b0a7a3cfSSteve Yin { 2229*b0a7a3cfSSteve Yin return E_INVALIDARG; 2230*b0a7a3cfSSteve Yin } 2231*b0a7a3cfSSteve Yin for(int index = 0;index < size;index++) 2232*b0a7a3cfSSteve Yin { 2233*b0a7a3cfSSteve Yin SelectChild( pItem[index] ); 2234*b0a7a3cfSSteve Yin } 2235*b0a7a3cfSSteve Yin return S_OK; 2236*b0a7a3cfSSteve Yin 2237*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 22385fdc4257SSteve Yin } 22395fdc4257SSteve Yin 22405fdc4257SSteve Yin /** 2241*b0a7a3cfSSteve Yin * Deselect multiple XAccessible items,for implementation of accSelect 2242*b0a7a3cfSSteve Yin * @param pItem, the items should be selected. 2243*b0a7a3cfSSteve Yin * @param size, the size of the items. 2244*b0a7a3cfSSteve Yin * @return S_OK if successful. 2245*b0a7a3cfSSteve Yin */ 22465fdc4257SSteve Yin HRESULT CMAccessible::DeSelectMutipleChildren( XAccessible** pItem,int size ) 22475fdc4257SSteve Yin { 22485fdc4257SSteve Yin 2249*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2250*b0a7a3cfSSteve Yin ISDESTROY() 2251*b0a7a3cfSSteve Yin // #CHECK# 2252*b0a7a3cfSSteve Yin if(pItem == NULL) 2253*b0a7a3cfSSteve Yin { 2254*b0a7a3cfSSteve Yin return E_INVALIDARG; 2255*b0a7a3cfSSteve Yin } 2256*b0a7a3cfSSteve Yin for(int index = 0;index < size;index++) 2257*b0a7a3cfSSteve Yin { 2258*b0a7a3cfSSteve Yin DeSelectChild( pItem[index] ); 2259*b0a7a3cfSSteve Yin } 2260*b0a7a3cfSSteve Yin return S_OK; 2261*b0a7a3cfSSteve Yin 2262*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 22635fdc4257SSteve Yin } 22645fdc4257SSteve Yin 22655fdc4257SSteve Yin /** 2266*b0a7a3cfSSteve Yin * When COM is created, UNO set XAccessible pointer to it 2267*b0a7a3cfSSteve Yin * in order to COM can operate UNO information 2268*b0a7a3cfSSteve Yin * @param pXAcc, the XAccessible object of current object. 2269*b0a7a3cfSSteve Yin * @return S_OK if successful. 2270*b0a7a3cfSSteve Yin */ 22715fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetXAccessible(long pXAcc) 22725fdc4257SSteve Yin { 2273*b0a7a3cfSSteve Yin pUNOInterface = (XAccessible*)pXAcc; 2274*b0a7a3cfSSteve Yin pRef = pUNOInterface; 2275*b0a7a3cfSSteve Yin m_pEnumVar->PutSelection(/*XAccessibleSelection*/(long)pUNOInterface); 22765fdc4257SSteve Yin 2277*b0a7a3cfSSteve Yin pRContext = pUNOInterface->getAccessibleContext(); 2278*b0a7a3cfSSteve Yin pRContextInterface = (XAccessibleContext*)pRContext.is(); 22795fdc4257SSteve Yin 2280*b0a7a3cfSSteve Yin return S_OK; 22815fdc4257SSteve Yin } 22825fdc4257SSteve Yin 22835fdc4257SSteve Yin /** 2284*b0a7a3cfSSteve Yin * accSelect method has many optional flags, needs to process comprehensively 2285*b0a7a3cfSSteve Yin * Mozilla and Microsoft do not implement SELFLAG_EXTENDSELECTION flag. 2286*b0a7a3cfSSteve Yin * The implementation of this flag is a little trouble-shooting,so we also 2287*b0a7a3cfSSteve Yin * do not implement it now 2288*b0a7a3cfSSteve Yin * @param flagsSelect, the selection flag of the select action. 2289*b0a7a3cfSSteve Yin * @param varChild, the child object pointer of current action. 2290*b0a7a3cfSSteve Yin * @return S_OK if successful. 2291*b0a7a3cfSSteve Yin */ 22925fdc4257SSteve Yin STDMETHODIMP CMAccessible::accSelect(long flagsSelect, VARIANT varChild) 22935fdc4257SSteve Yin { 2294*b0a7a3cfSSteve Yin 22955fdc4257SSteve Yin CHECK_ENABLE_INF 2296*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2297*b0a7a3cfSSteve Yin ISDESTROY() 2298*b0a7a3cfSSteve Yin if( (flagsSelect&SELFLAG_ADDSELECTION) && 2299*b0a7a3cfSSteve Yin (SELFLAG_REMOVESELECTION&flagsSelect) ) 2300*b0a7a3cfSSteve Yin return E_INVALIDARG; 2301*b0a7a3cfSSteve Yin 2302*b0a7a3cfSSteve Yin if ( (flagsSelect&SELFLAG_TAKESELECTION) && 2303*b0a7a3cfSSteve Yin ( 2304*b0a7a3cfSSteve Yin (flagsSelect&SELFLAG_ADDSELECTION) || 2305*b0a7a3cfSSteve Yin (flagsSelect&SELFLAG_REMOVESELECTION) || 2306*b0a7a3cfSSteve Yin (flagsSelect&SELFLAG_EXTENDSELECTION ) 2307*b0a7a3cfSSteve Yin ) 2308*b0a7a3cfSSteve Yin ) 2309*b0a7a3cfSSteve Yin return E_INVALIDARG; 2310*b0a7a3cfSSteve Yin 2311*b0a7a3cfSSteve Yin if ( varChild.vt != VT_I4 ) 2312*b0a7a3cfSSteve Yin return E_INVALIDARG; 2313*b0a7a3cfSSteve Yin 2314*b0a7a3cfSSteve Yin IMAccessible* pSelectAcc; 2315*b0a7a3cfSSteve Yin if( varChild.lVal == CHILDID_SELF ) 2316*b0a7a3cfSSteve Yin { 2317*b0a7a3cfSSteve Yin pSelectAcc = this; 2318*b0a7a3cfSSteve Yin pSelectAcc->AddRef(); 2319*b0a7a3cfSSteve Yin } 2320*b0a7a3cfSSteve Yin else 2321*b0a7a3cfSSteve Yin { 2322*b0a7a3cfSSteve Yin pSelectAcc = GetChildInterface(varChild.lVal); 2323*b0a7a3cfSSteve Yin } 2324*b0a7a3cfSSteve Yin 2325*b0a7a3cfSSteve Yin if( pSelectAcc == NULL ) 2326*b0a7a3cfSSteve Yin return E_INVALIDARG; 2327*b0a7a3cfSSteve Yin 2328*b0a7a3cfSSteve Yin if( flagsSelect&SELFLAG_TAKEFOCUS ) 2329*b0a7a3cfSSteve Yin { 2330*b0a7a3cfSSteve Yin long pTempUNO = 0; 2331*b0a7a3cfSSteve Yin pSelectAcc->GetUNOInterface( &pTempUNO); 2332*b0a7a3cfSSteve Yin 2333*b0a7a3cfSSteve Yin if( pTempUNO == NULL ) 2334*b0a7a3cfSSteve Yin return NULL; 2335*b0a7a3cfSSteve Yin 2336*b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext = ( (XAccessible*)pTempUNO)->getAccessibleContext(); 2337*b0a7a3cfSSteve Yin Reference< XAccessibleComponent > pRComponent(pRContext,UNO_QUERY); 2338*b0a7a3cfSSteve Yin Reference< XAccessible > pRParentXAcc = pRContext->getAccessibleParent(); 2339*b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRParentContext = pRParentXAcc->getAccessibleContext(); 2340*b0a7a3cfSSteve Yin Reference< XAccessibleComponent > pRParentComponent(pRParentContext,UNO_QUERY); 2341*b0a7a3cfSSteve Yin Reference< XAccessibleSelection > pRParentSelection(pRParentContext,UNO_QUERY); 2342*b0a7a3cfSSteve Yin 2343*b0a7a3cfSSteve Yin 2344*b0a7a3cfSSteve Yin pRComponent->grabFocus(); 2345*b0a7a3cfSSteve Yin 2346*b0a7a3cfSSteve Yin if( flagsSelect & SELFLAG_TAKESELECTION ) 2347*b0a7a3cfSSteve Yin { 2348*b0a7a3cfSSteve Yin pRParentSelection->clearAccessibleSelection(); 2349*b0a7a3cfSSteve Yin pRParentSelection->selectAccessibleChild( pRContext->getAccessibleIndexInParent() ); 2350*b0a7a3cfSSteve Yin } 2351*b0a7a3cfSSteve Yin 2352*b0a7a3cfSSteve Yin if( flagsSelect & SELFLAG_ADDSELECTION ) 2353*b0a7a3cfSSteve Yin { 2354*b0a7a3cfSSteve Yin pRParentSelection->selectAccessibleChild( pRContext->getAccessibleIndexInParent() ); 2355*b0a7a3cfSSteve Yin } 2356*b0a7a3cfSSteve Yin 2357*b0a7a3cfSSteve Yin if( flagsSelect & SELFLAG_REMOVESELECTION ) 2358*b0a7a3cfSSteve Yin { 2359*b0a7a3cfSSteve Yin pRParentSelection->deselectAccessibleChild( pRContext->getAccessibleIndexInParent() ); 2360*b0a7a3cfSSteve Yin } 2361*b0a7a3cfSSteve Yin 2362*b0a7a3cfSSteve Yin if( flagsSelect & SELFLAG_EXTENDSELECTION ) 2363*b0a7a3cfSSteve Yin { 2364*b0a7a3cfSSteve Yin long indexInParrent = pRContext->getAccessibleIndexInParent(); 2365*b0a7a3cfSSteve Yin 2366*b0a7a3cfSSteve Yin if( pRParentSelection->isAccessibleChildSelected( indexInParrent + 1 ) || 2367*b0a7a3cfSSteve Yin pRParentSelection->isAccessibleChildSelected( indexInParrent - 1 ) ) 2368*b0a7a3cfSSteve Yin { 2369*b0a7a3cfSSteve Yin pRParentSelection->selectAccessibleChild( indexInParrent ); 2370*b0a7a3cfSSteve Yin } 2371*b0a7a3cfSSteve Yin } 2372*b0a7a3cfSSteve Yin 2373*b0a7a3cfSSteve Yin } 2374*b0a7a3cfSSteve Yin 2375*b0a7a3cfSSteve Yin pSelectAcc->Release(); 2376*b0a7a3cfSSteve Yin return S_OK; 2377*b0a7a3cfSSteve Yin 2378*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 23795fdc4257SSteve Yin } 23805fdc4257SSteve Yin 23815fdc4257SSteve Yin /** 2382*b0a7a3cfSSteve Yin * Return XAccessible interface pointer when needed 2383*b0a7a3cfSSteve Yin * @param pXAcc, [in, out] the Uno interface of the current object. 2384*b0a7a3cfSSteve Yin * @return S_OK if successful. 2385*b0a7a3cfSSteve Yin */ 23865fdc4257SSteve Yin STDMETHODIMP CMAccessible::GetUNOInterface(long* pXAcc) 23875fdc4257SSteve Yin { 2388*b0a7a3cfSSteve Yin // #CHECK# 2389*b0a7a3cfSSteve Yin if(pXAcc == NULL) 2390*b0a7a3cfSSteve Yin return E_INVALIDARG; 23915fdc4257SSteve Yin 2392*b0a7a3cfSSteve Yin *pXAcc = (long)pUNOInterface; 2393*b0a7a3cfSSteve Yin return S_OK; 23945fdc4257SSteve Yin } 23955fdc4257SSteve Yin 23965fdc4257SSteve Yin /** 2397*b0a7a3cfSSteve Yin * Helper method for Implementation of get_accDefaultAction 2398*b0a7a3cfSSteve Yin * @param pAction, the default action point of the current object. 2399*b0a7a3cfSSteve Yin * @return S_OK if successful. 2400*b0a7a3cfSSteve Yin */ 24015fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetDefaultAction(long pAction) 24025fdc4257SSteve Yin { 2403*b0a7a3cfSSteve Yin m_pXAction = (XAccessibleAction*)pAction; 2404*b0a7a3cfSSteve Yin return S_OK; 24055fdc4257SSteve Yin } 24065fdc4257SSteve Yin 24075fdc4257SSteve Yin /** 2408*b0a7a3cfSSteve Yin * This method is called when AT open some UI elements initially 2409*b0a7a3cfSSteve Yin * the UI element takes the default action defined here 2410*b0a7a3cfSSteve Yin * @param varChild, the child id of the defaultaction. 2411*b0a7a3cfSSteve Yin * @param pszDefaultAction,[in/out] the description of the current action. 2412*b0a7a3cfSSteve Yin * @return S_OK if successful. 2413*b0a7a3cfSSteve Yin */ 24145fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CMAccessible::get_accDefaultAction(VARIANT varChild, BSTR *pszDefaultAction) 24155fdc4257SSteve Yin { 2416*b0a7a3cfSSteve Yin 2417*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2418*b0a7a3cfSSteve Yin ISDESTROY() 2419*b0a7a3cfSSteve Yin // #CHECK# 2420*b0a7a3cfSSteve Yin if(pszDefaultAction == NULL) 2421*b0a7a3cfSSteve Yin { 2422*b0a7a3cfSSteve Yin return E_INVALIDARG; 2423*b0a7a3cfSSteve Yin } 2424*b0a7a3cfSSteve Yin if(varChild.vt==VT_I4) 2425*b0a7a3cfSSteve Yin { 2426*b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 2427*b0a7a3cfSSteve Yin { 2428*b0a7a3cfSSteve Yin if( m_pXAction == NULL ) 2429*b0a7a3cfSSteve Yin return DISP_E_MEMBERNOTFOUND; 2430*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(*pszDefaultAction); 2431*b0a7a3cfSSteve Yin *pszDefaultAction = SysAllocString(m_pszActionDescription); 2432*b0a7a3cfSSteve Yin return S_OK; 2433*b0a7a3cfSSteve Yin } 2434*b0a7a3cfSSteve Yin 2435*b0a7a3cfSSteve Yin long lVal = varChild.lVal; 2436*b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 2437*b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 2438*b0a7a3cfSSteve Yin if(!pChild) 2439*b0a7a3cfSSteve Yin return E_FAIL; 2440*b0a7a3cfSSteve Yin return pChild->get_accDefaultAction(varChild,pszDefaultAction); 2441*b0a7a3cfSSteve Yin } 2442*b0a7a3cfSSteve Yin return S_FALSE; 2443*b0a7a3cfSSteve Yin 2444*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 24455fdc4257SSteve Yin } 24465fdc4257SSteve Yin 24475fdc4257SSteve Yin /** 2448*b0a7a3cfSSteve Yin * AT call this method to operate application 2449*b0a7a3cfSSteve Yin * @param varChild, the child id of the action object. 2450*b0a7a3cfSSteve Yin * @return S_OK if successful. 2451*b0a7a3cfSSteve Yin */ 24525fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CMAccessible::accDoDefaultAction(VARIANT varChild) 24535fdc4257SSteve Yin { 2454*b0a7a3cfSSteve Yin 2455*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2456*b0a7a3cfSSteve Yin ISDESTROY() 2457*b0a7a3cfSSteve Yin if( varChild.vt != VT_I4 ) 2458*b0a7a3cfSSteve Yin return E_INVALIDARG; 2459*b0a7a3cfSSteve Yin if( m_pXAction == NULL ) 2460*b0a7a3cfSSteve Yin return E_FAIL; 2461*b0a7a3cfSSteve Yin if( m_pXAction->getAccessibleActionCount() == 0 ) 2462*b0a7a3cfSSteve Yin return E_FAIL; 2463*b0a7a3cfSSteve Yin 2464*b0a7a3cfSSteve Yin if(varChild.lVal==CHILDID_SELF) 2465*b0a7a3cfSSteve Yin { 2466*b0a7a3cfSSteve Yin if(m_pXAction->getAccessibleActionCount() > 0) 2467*b0a7a3cfSSteve Yin m_pXAction->doAccessibleAction(0); 2468*b0a7a3cfSSteve Yin return S_OK; 2469*b0a7a3cfSSteve Yin } 2470*b0a7a3cfSSteve Yin 2471*b0a7a3cfSSteve Yin long lVal = varChild.lVal; 2472*b0a7a3cfSSteve Yin varChild.lVal = CHILDID_SELF; 2473*b0a7a3cfSSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 2474*b0a7a3cfSSteve Yin if(!pChild) 2475*b0a7a3cfSSteve Yin return E_FAIL; 2476*b0a7a3cfSSteve Yin return pChild->accDoDefaultAction( varChild ); 2477*b0a7a3cfSSteve Yin 2478*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 24795fdc4257SSteve Yin } 24805fdc4257SSteve Yin 24815fdc4257SSteve Yin /** 2482*b0a7a3cfSSteve Yin * UNO set description information for action to COM. 2483*b0a7a3cfSSteve Yin * @param szAction, the action description of the current object. 2484*b0a7a3cfSSteve Yin * @return S_OK if successful. 2485*b0a7a3cfSSteve Yin */ 24865fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_ActionDescription( const OLECHAR* szAction) 24875fdc4257SSteve Yin { 24885fdc4257SSteve Yin 2489*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2490*b0a7a3cfSSteve Yin ISDESTROY() 2491*b0a7a3cfSSteve Yin // #CHECK# 2492*b0a7a3cfSSteve Yin if(szAction == NULL) 2493*b0a7a3cfSSteve Yin { 2494*b0a7a3cfSSteve Yin return E_INVALIDARG; 2495*b0a7a3cfSSteve Yin } 2496*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(m_pszActionDescription ); 2497*b0a7a3cfSSteve Yin m_pszActionDescription = SysAllocString( szAction ); 2498*b0a7a3cfSSteve Yin return S_OK; 2499*b0a7a3cfSSteve Yin 2500*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 25015fdc4257SSteve Yin } 25025fdc4257SSteve Yin 25035fdc4257SSteve Yin BOOL CMAccessible::GetXInterfaceFromXAccessible(XAccessible* pXAcc, XInterface** ppXI, int index) 25045fdc4257SSteve Yin { 2505*b0a7a3cfSSteve Yin Reference< XAccessibleContext > pRContext; 2506*b0a7a3cfSSteve Yin 2507*b0a7a3cfSSteve Yin switch(index) 2508*b0a7a3cfSSteve Yin { 2509*b0a7a3cfSSteve Yin case XI_COMPONENT: 2510*b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleComponent) 2511*b0a7a3cfSSteve Yin break; 2512*b0a7a3cfSSteve Yin case XI_TEXT: 2513*b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleText) 2514*b0a7a3cfSSteve Yin break; 2515*b0a7a3cfSSteve Yin case XI_EDITABLETEXT: 2516*b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleEditableText) 2517*b0a7a3cfSSteve Yin break; 2518*b0a7a3cfSSteve Yin case XI_TABLE: 2519*b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleTable) 2520*b0a7a3cfSSteve Yin break; 2521*b0a7a3cfSSteve Yin case XI_SELECTION: 2522*b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleSelection) 2523*b0a7a3cfSSteve Yin break; 2524*b0a7a3cfSSteve Yin case XI_EXTENDEDCOMP: 2525*b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleExtendedComponent) 2526*b0a7a3cfSSteve Yin break; 2527*b0a7a3cfSSteve Yin case XI_KEYBINDING: 2528*b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleKeyBinding) 2529*b0a7a3cfSSteve Yin break; 2530*b0a7a3cfSSteve Yin case XI_ACTION: 2531*b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleAction) 2532*b0a7a3cfSSteve Yin break; 2533*b0a7a3cfSSteve Yin case XI_VALUE: 2534*b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleValue) 2535*b0a7a3cfSSteve Yin break; 2536*b0a7a3cfSSteve Yin case XI_HYPERTEXT: 2537*b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleHypertext) 2538*b0a7a3cfSSteve Yin break; 2539*b0a7a3cfSSteve Yin case XI_HYPERLINK: 2540*b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleHyperlink) 2541*b0a7a3cfSSteve Yin break; 2542*b0a7a3cfSSteve Yin case XI_IMAGE: 2543*b0a7a3cfSSteve Yin QUERYXINTERFACE(AccessibleImage) 2544*b0a7a3cfSSteve Yin break; 2545*b0a7a3cfSSteve Yin default: 2546*b0a7a3cfSSteve Yin break; 2547*b0a7a3cfSSteve Yin } 2548*b0a7a3cfSSteve Yin 2549*b0a7a3cfSSteve Yin return FALSE; 25505fdc4257SSteve Yin } 25515fdc4257SSteve Yin 25525fdc4257SSteve Yin HRESULT WINAPI CMAccessible::SmartQI(void* pv, REFIID iid, void** ppvObject) 25535fdc4257SSteve Yin { 2554*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2555*b0a7a3cfSSteve Yin ISDESTROY() 2556*b0a7a3cfSSteve Yin if( ImplIsEqualGUID(iid,IID_IAccIdentity) || 2557*b0a7a3cfSSteve Yin ImplIsEqualGUID(iid,IID_IStdMarshalInfo) || 2558*b0a7a3cfSSteve Yin ImplIsEqualGUID(iid,IID_IMarshal) || 2559*b0a7a3cfSSteve Yin ImplIsEqualGUID(iid,IID_IExternalConnection)|| 2560*b0a7a3cfSSteve Yin ImplIsEqualGUID(iid,IID_IOleWindow)) 2561*b0a7a3cfSSteve Yin return E_FAIL; 2562*b0a7a3cfSSteve Yin 2563*b0a7a3cfSSteve Yin 2564*b0a7a3cfSSteve Yin _UNO_AGGMAP_ENTRY* pMap = _GetAggEntries(); 2565*b0a7a3cfSSteve Yin while(pMap && pMap->piid) 2566*b0a7a3cfSSteve Yin { 2567*b0a7a3cfSSteve Yin if(ImplIsEqualGUID(iid, *pMap->piid)) 2568*b0a7a3cfSSteve Yin { 2569*b0a7a3cfSSteve Yin XInterface* pXI = NULL; 2570*b0a7a3cfSSteve Yin BOOL bFound = GetXInterfaceFromXAccessible(pUNOInterface,&pXI,pMap->XIFIndex); 2571*b0a7a3cfSSteve Yin if(!bFound) 2572*b0a7a3cfSSteve Yin { 2573*b0a7a3cfSSteve Yin return E_FAIL; 2574*b0a7a3cfSSteve Yin } 2575*b0a7a3cfSSteve Yin 2576*b0a7a3cfSSteve Yin XGUIDToComObjHash::iterator pIndTemp = m_containedObjects.find( iid ); 2577*b0a7a3cfSSteve Yin if ( pIndTemp != m_containedObjects.end() ) 2578*b0a7a3cfSSteve Yin { 2579*b0a7a3cfSSteve Yin return pIndTemp->second.p->QueryInterface( iid, ppvObject ); 2580*b0a7a3cfSSteve Yin } 2581*b0a7a3cfSSteve Yin else 2582*b0a7a3cfSSteve Yin { 2583*b0a7a3cfSSteve Yin ActivateActContext(); 2584*b0a7a3cfSSteve Yin HRESULT hr = pMap->pfnCreateInstance(pv, iid, ppvObject); 2585*b0a7a3cfSSteve Yin DeactivateActContext(); 2586*b0a7a3cfSSteve Yin if(hr == S_OK) 2587*b0a7a3cfSSteve Yin { 2588*b0a7a3cfSSteve Yin m_containedObjects.insert(XGUIDToComObjHash::value_type(*pMap->piid,(IUnknown*)*ppvObject)); 2589*b0a7a3cfSSteve Yin IUNOXWrapper* wrapper = NULL; 2590*b0a7a3cfSSteve Yin ((IUnknown*)*ppvObject)->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper); 2591*b0a7a3cfSSteve Yin if(wrapper) 2592*b0a7a3cfSSteve Yin { 2593*b0a7a3cfSSteve Yin wrapper->put_XInterface((long)pUNOInterface); 2594*b0a7a3cfSSteve Yin wrapper->Release(); 2595*b0a7a3cfSSteve Yin } 2596*b0a7a3cfSSteve Yin return S_OK; 2597*b0a7a3cfSSteve Yin } 2598*b0a7a3cfSSteve Yin } 2599*b0a7a3cfSSteve Yin return E_FAIL; 2600*b0a7a3cfSSteve Yin } 2601*b0a7a3cfSSteve Yin pMap++; 2602*b0a7a3cfSSteve Yin } 2603*b0a7a3cfSSteve Yin return E_FAIL; 2604*b0a7a3cfSSteve Yin 2605*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 26065fdc4257SSteve Yin } 26075fdc4257SSteve Yin 26085fdc4257SSteve Yin BOOL CMAccessible::get_IAccessibleFromXAccessible(long pXAcc, IAccessible **ppIA) 26095fdc4257SSteve Yin { 26105fdc4257SSteve Yin 2611*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 2612*b0a7a3cfSSteve Yin 2613*b0a7a3cfSSteve Yin // #CHECK# 2614*b0a7a3cfSSteve Yin if(ppIA == NULL) 2615*b0a7a3cfSSteve Yin { 2616*b0a7a3cfSSteve Yin return E_INVALIDARG; 2617*b0a7a3cfSSteve Yin } 2618*b0a7a3cfSSteve Yin BOOL isGet = FALSE; 2619*b0a7a3cfSSteve Yin if(g_pAgent) 2620*b0a7a3cfSSteve Yin isGet = g_pAgent->GetIAccessibleFromXAccessible((XAccessible*)pXAcc,ppIA); 2621*b0a7a3cfSSteve Yin 2622*b0a7a3cfSSteve Yin if(isGet) 2623*b0a7a3cfSSteve Yin return TRUE; 2624*b0a7a3cfSSteve Yin else 2625*b0a7a3cfSSteve Yin return FALSE; 26265fdc4257SSteve Yin 2627*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 26285fdc4257SSteve Yin } 26295fdc4257SSteve Yin 26305fdc4257SSteve Yin void CMAccessible::get_OLECHARFromAny(Any& pAny, OLECHAR* pChar) 26315fdc4257SSteve Yin { 2632*b0a7a3cfSSteve Yin // #CHECK# 2633*b0a7a3cfSSteve Yin if(pChar == NULL) 2634*b0a7a3cfSSteve Yin return; 2635*b0a7a3cfSSteve Yin 2636*b0a7a3cfSSteve Yin switch(pAny.getValueTypeClass()) 2637*b0a7a3cfSSteve Yin { 2638*b0a7a3cfSSteve Yin case TypeClass_CHAR: 2639*b0a7a3cfSSteve Yin { 2640*b0a7a3cfSSteve Yin sal_Int8 val; 2641*b0a7a3cfSSteve Yin pAny >>= val; 2642*b0a7a3cfSSteve Yin swprintf( pChar, L"%d", val); 2643*b0a7a3cfSSteve Yin break; 2644*b0a7a3cfSSteve Yin } 2645*b0a7a3cfSSteve Yin case TypeClass_BOOLEAN: 2646*b0a7a3cfSSteve Yin { 2647*b0a7a3cfSSteve Yin sal_Bool val; 2648*b0a7a3cfSSteve Yin pAny >>= val; 2649*b0a7a3cfSSteve Yin swprintf( pChar, L"%d", val); 2650*b0a7a3cfSSteve Yin break; 2651*b0a7a3cfSSteve Yin } 2652*b0a7a3cfSSteve Yin case TypeClass_BYTE: 2653*b0a7a3cfSSteve Yin { 2654*b0a7a3cfSSteve Yin sal_Int8 val; 2655*b0a7a3cfSSteve Yin pAny >>= val; 2656*b0a7a3cfSSteve Yin swprintf( pChar, L"%d", val); 2657*b0a7a3cfSSteve Yin break; 2658*b0a7a3cfSSteve Yin } 2659*b0a7a3cfSSteve Yin case TypeClass_SHORT: 2660*b0a7a3cfSSteve Yin { 2661*b0a7a3cfSSteve Yin SHORT val; 2662*b0a7a3cfSSteve Yin pAny >>= val; 2663*b0a7a3cfSSteve Yin swprintf( pChar, L"%d", val); 2664*b0a7a3cfSSteve Yin break; 2665*b0a7a3cfSSteve Yin } 2666*b0a7a3cfSSteve Yin case TypeClass_UNSIGNED_SHORT: 2667*b0a7a3cfSSteve Yin { 2668*b0a7a3cfSSteve Yin USHORT val; 2669*b0a7a3cfSSteve Yin pAny >>= val; 2670*b0a7a3cfSSteve Yin swprintf( pChar, L"%d", val); 2671*b0a7a3cfSSteve Yin break; 2672*b0a7a3cfSSteve Yin } 2673*b0a7a3cfSSteve Yin case TypeClass_LONG: 2674*b0a7a3cfSSteve Yin { 2675*b0a7a3cfSSteve Yin LONG val; 2676*b0a7a3cfSSteve Yin pAny >>= val; 2677*b0a7a3cfSSteve Yin swprintf( pChar, L"%ld", val); 2678*b0a7a3cfSSteve Yin break; 2679*b0a7a3cfSSteve Yin } 2680*b0a7a3cfSSteve Yin case TypeClass_UNSIGNED_LONG: 2681*b0a7a3cfSSteve Yin { 2682*b0a7a3cfSSteve Yin ULONG val; 2683*b0a7a3cfSSteve Yin pAny >>= val; 2684*b0a7a3cfSSteve Yin swprintf( pChar, L"%ld", val); 2685*b0a7a3cfSSteve Yin break; 2686*b0a7a3cfSSteve Yin } 2687*b0a7a3cfSSteve Yin case TypeClass_FLOAT: 2688*b0a7a3cfSSteve Yin { 2689*b0a7a3cfSSteve Yin FLOAT val; 2690*b0a7a3cfSSteve Yin pAny >>= val; 2691*b0a7a3cfSSteve Yin swprintf( pChar, L"%.3f", val); 2692*b0a7a3cfSSteve Yin break; 2693*b0a7a3cfSSteve Yin } 2694*b0a7a3cfSSteve Yin case TypeClass_DOUBLE: 2695*b0a7a3cfSSteve Yin { 2696*b0a7a3cfSSteve Yin DOUBLE val; 2697*b0a7a3cfSSteve Yin pAny >>= val; 2698*b0a7a3cfSSteve Yin swprintf( pChar, L"%.6lf", val); 2699*b0a7a3cfSSteve Yin break; 2700*b0a7a3cfSSteve Yin } 2701*b0a7a3cfSSteve Yin case TypeClass_STRING: 2702*b0a7a3cfSSteve Yin { 2703*b0a7a3cfSSteve Yin ::rtl::OUString val; 2704*b0a7a3cfSSteve Yin pAny >>= val; 2705*b0a7a3cfSSteve Yin wcscpy(pChar, val.getStr()); 2706*b0a7a3cfSSteve Yin break; 2707*b0a7a3cfSSteve Yin } 2708*b0a7a3cfSSteve Yin case TypeClass_SEQUENCE: 2709*b0a7a3cfSSteve Yin { 2710*b0a7a3cfSSteve Yin if(pAny.getValueType() == getCppuType( (Sequence< ::rtl::OUString > *)0 ) ) 2711*b0a7a3cfSSteve Yin { 2712*b0a7a3cfSSteve Yin Sequence < ::rtl::OUString > val; 2713*b0a7a3cfSSteve Yin pAny >>= val; 2714*b0a7a3cfSSteve Yin 2715*b0a7a3cfSSteve Yin ::rtl::OUString pString; 2716*b0a7a3cfSSteve Yin 2717*b0a7a3cfSSteve Yin int count = val.getLength(); 2718*b0a7a3cfSSteve Yin 2719*b0a7a3cfSSteve Yin for( int iIndex = 0;iIndex < count;iIndex++ ) 2720*b0a7a3cfSSteve Yin { 2721*b0a7a3cfSSteve Yin pString += val[iIndex]; 2722*b0a7a3cfSSteve Yin } 2723*b0a7a3cfSSteve Yin wcscpy(pChar, pString.getStr()); 2724*b0a7a3cfSSteve Yin } 2725*b0a7a3cfSSteve Yin else if (pAny.getValueType() == getCppuType( (Sequence< ::com::sun::star::style::TabStop >* )0 ) ) 2726*b0a7a3cfSSteve Yin { 2727*b0a7a3cfSSteve Yin Sequence < ::com::sun::star::style::TabStop > val; 2728*b0a7a3cfSSteve Yin pAny >>= val; 2729*b0a7a3cfSSteve Yin int count = val.getLength(); 2730*b0a7a3cfSSteve Yin 2731*b0a7a3cfSSteve Yin for( int iIndex = 0;iIndex < count;iIndex++ ) 2732*b0a7a3cfSSteve Yin { 2733*b0a7a3cfSSteve Yin OLECHAR pAttrs[512] = {NULL}; 2734*b0a7a3cfSSteve Yin 2735*b0a7a3cfSSteve Yin OLECHAR pAttrsPosition[512] = {NULL}; 2736*b0a7a3cfSSteve Yin OLECHAR pAttrsDescimalChar[512] = {NULL}; 2737*b0a7a3cfSSteve Yin OLECHAR pAttrsFillChar[512] = {NULL}; 2738*b0a7a3cfSSteve Yin 2739*b0a7a3cfSSteve Yin ::com::sun::star::style::TabStop sigleVal = val[iIndex]; 2740*b0a7a3cfSSteve Yin 2741*b0a7a3cfSSteve Yin swprintf( pAttrsPosition, L"Position=%ld,TabAlign=%ld", 2742*b0a7a3cfSSteve Yin sigleVal.Position, sigleVal.Alignment); 2743*b0a7a3cfSSteve Yin 2744*b0a7a3cfSSteve Yin if(sigleVal.DecimalChar==';' || sigleVal.DecimalChar == ':' || sigleVal.DecimalChar == ',' || 2745*b0a7a3cfSSteve Yin sigleVal.DecimalChar == '=' || sigleVal.DecimalChar == '\\') 2746*b0a7a3cfSSteve Yin swprintf( pAttrsDescimalChar, L"DecimalChar=\\%c",sigleVal.DecimalChar); 2747*b0a7a3cfSSteve Yin else 2748*b0a7a3cfSSteve Yin swprintf( pAttrsDescimalChar, L"DecimalChar=%c",sigleVal.DecimalChar); 2749*b0a7a3cfSSteve Yin 2750*b0a7a3cfSSteve Yin if(sigleVal.FillChar==';' || sigleVal.FillChar == ':' || sigleVal.FillChar == ',' || 2751*b0a7a3cfSSteve Yin sigleVal.FillChar == '=' || sigleVal.FillChar == '\\') 2752*b0a7a3cfSSteve Yin swprintf( pAttrsFillChar, L"FillChar=\\%c",sigleVal.FillChar); 2753*b0a7a3cfSSteve Yin else 2754*b0a7a3cfSSteve Yin swprintf( pAttrsFillChar, L"FillChar=%c",sigleVal.FillChar); 2755*b0a7a3cfSSteve Yin 2756*b0a7a3cfSSteve Yin swprintf( pAttrs, L"%s,%s,%s,",pAttrsPosition,pAttrsDescimalChar,pAttrsFillChar); 2757*b0a7a3cfSSteve Yin 2758*b0a7a3cfSSteve Yin wcscat(pChar,pAttrs); 2759*b0a7a3cfSSteve Yin } 2760*b0a7a3cfSSteve Yin } 2761*b0a7a3cfSSteve Yin break; 2762*b0a7a3cfSSteve Yin } 2763*b0a7a3cfSSteve Yin case TypeClass_ENUM: 2764*b0a7a3cfSSteve Yin { 2765*b0a7a3cfSSteve Yin if (pAny.getValueType() == getCppuType( (::com::sun::star::awt::FontSlant* )0 ) ) 2766*b0a7a3cfSSteve Yin { 2767*b0a7a3cfSSteve Yin com::sun::star::awt::FontSlant val; 2768*b0a7a3cfSSteve Yin pAny >>= val; 2769*b0a7a3cfSSteve Yin swprintf( pChar, L"%d", val); 2770*b0a7a3cfSSteve Yin } 2771*b0a7a3cfSSteve Yin } 2772*b0a7a3cfSSteve Yin case TypeClass_STRUCT: 2773*b0a7a3cfSSteve Yin { 2774*b0a7a3cfSSteve Yin if (pAny.getValueType() == getCppuType( (::com::sun::star::style::LineSpacing* )0 ) ) 2775*b0a7a3cfSSteve Yin { 2776*b0a7a3cfSSteve Yin com::sun::star::style::LineSpacing val; 2777*b0a7a3cfSSteve Yin pAny >>= val; 2778*b0a7a3cfSSteve Yin swprintf( pChar, L"Mode=%ld,Height=%ld,", val.Mode, val.Height); 2779*b0a7a3cfSSteve Yin } 2780*b0a7a3cfSSteve Yin else if (pAny.getValueType() == getCppuType( (com::sun::star::accessibility::TextSegment *)0 ) ) 2781*b0a7a3cfSSteve Yin { 2782*b0a7a3cfSSteve Yin com::sun::star::accessibility::TextSegment val; 2783*b0a7a3cfSSteve Yin pAny >>= val; 2784*b0a7a3cfSSteve Yin ::rtl::OUString realVal(val.SegmentText); 2785*b0a7a3cfSSteve Yin wcscpy(pChar, realVal.getStr()); 2786*b0a7a3cfSSteve Yin } 2787*b0a7a3cfSSteve Yin break; 2788*b0a7a3cfSSteve Yin } 2789*b0a7a3cfSSteve Yin case TypeClass_VOID: 2790*b0a7a3cfSSteve Yin case TypeClass_HYPER: 2791*b0a7a3cfSSteve Yin case TypeClass_UNSIGNED_HYPER: 2792*b0a7a3cfSSteve Yin case TypeClass_TYPE: 2793*b0a7a3cfSSteve Yin case TypeClass_ANY: 2794*b0a7a3cfSSteve Yin case TypeClass_TYPEDEF: 2795*b0a7a3cfSSteve Yin case TypeClass_UNION: 2796*b0a7a3cfSSteve Yin case TypeClass_EXCEPTION: 2797*b0a7a3cfSSteve Yin case TypeClass_ARRAY: 2798*b0a7a3cfSSteve Yin case TypeClass_INTERFACE: 2799*b0a7a3cfSSteve Yin case TypeClass_SERVICE: 2800*b0a7a3cfSSteve Yin case TypeClass_MODULE: 2801*b0a7a3cfSSteve Yin case TypeClass_INTERFACE_METHOD: 2802*b0a7a3cfSSteve Yin case TypeClass_INTERFACE_ATTRIBUTE: 2803*b0a7a3cfSSteve Yin case TypeClass_UNKNOWN: 2804*b0a7a3cfSSteve Yin case TypeClass_PROPERTY: 2805*b0a7a3cfSSteve Yin case TypeClass_CONSTANT: 2806*b0a7a3cfSSteve Yin case TypeClass_CONSTANTS: 2807*b0a7a3cfSSteve Yin case TypeClass_SINGLETON: 2808*b0a7a3cfSSteve Yin case TypeClass_MAKE_FIXED_SIZE: 2809*b0a7a3cfSSteve Yin break; 2810*b0a7a3cfSSteve Yin default: 2811*b0a7a3cfSSteve Yin break; 2812*b0a7a3cfSSteve Yin } 28135fdc4257SSteve Yin } 28145fdc4257SSteve Yin 28155fdc4257SSteve Yin void CMAccessible::get_OLECHAR4Numbering(const Any& pAny, short numberingLevel,const OUString& numberingPrefix,OLECHAR* pChar) 28165fdc4257SSteve Yin { 2817*b0a7a3cfSSteve Yin if(pChar == NULL) 2818*b0a7a3cfSSteve Yin return; 2819*b0a7a3cfSSteve Yin Reference< ::com::sun::star::container::XIndexReplace > pXIndex; 2820*b0a7a3cfSSteve Yin if((pAny>>=pXIndex) && (numberingLevel !=-1))//numbering level is -1,means invalid value 2821*b0a7a3cfSSteve Yin { 2822*b0a7a3cfSSteve Yin Any aAny = pXIndex->getByIndex(numberingLevel); 2823*b0a7a3cfSSteve Yin Sequence< ::com::sun::star::beans::PropertyValue > aProps; 2824*b0a7a3cfSSteve Yin aAny >>= aProps; 2825*b0a7a3cfSSteve Yin const ::com::sun::star::beans::PropertyValue* pPropArray = aProps.getConstArray(); 2826*b0a7a3cfSSteve Yin sal_Int32 nCount = aProps.getLength(); 2827*b0a7a3cfSSteve Yin swprintf(pChar,L"Numbering:NumberingLevel=%d,",numberingLevel); 2828*b0a7a3cfSSteve Yin for( sal_Int32 i=0; i<nCount; i++ ) 2829*b0a7a3cfSSteve Yin { 2830*b0a7a3cfSSteve Yin ::com::sun::star::beans::PropertyValue rProp = pPropArray[i]; 2831*b0a7a3cfSSteve Yin if( (rProp.Name.compareTo(OUString::createFromAscii("BulletChar"))==0)|| 2832*b0a7a3cfSSteve Yin (rProp.Name.compareTo(OUString::createFromAscii("GraphicURL"))==0)|| 2833*b0a7a3cfSSteve Yin (rProp.Name.compareTo(OUString::createFromAscii("NumberingType"))==0)) 2834*b0a7a3cfSSteve Yin { 2835*b0a7a3cfSSteve Yin OLECHAR propStr[512] = {NULL}; 2836*b0a7a3cfSSteve Yin swprintf(propStr,L"%s=",rProp.Name.getStr()); 2837*b0a7a3cfSSteve Yin OLECHAR pTemp[256] = {NULL}; 2838*b0a7a3cfSSteve Yin CMAccessible::get_OLECHARFromAny(rProp.Value,pTemp); 2839*b0a7a3cfSSteve Yin if(rProp.Name.compareTo(OUString::createFromAscii("GraphicURL"))==0) 2840*b0a7a3cfSSteve Yin { 2841*b0a7a3cfSSteve Yin OLECHAR* pOccur = wcschr(pTemp,':'); 2842*b0a7a3cfSSteve Yin if(pOccur) 2843*b0a7a3cfSSteve Yin *pOccur = '.'; 2844*b0a7a3cfSSteve Yin } 2845*b0a7a3cfSSteve Yin wcscat(propStr,pTemp); 2846*b0a7a3cfSSteve Yin wcscat(pChar,propStr); 2847*b0a7a3cfSSteve Yin wcscat(pChar,L","); 2848*b0a7a3cfSSteve Yin 2849*b0a7a3cfSSteve Yin if(rProp.Name.compareTo(OUString::createFromAscii("NumberingType"))==0) 2850*b0a7a3cfSSteve Yin { 2851*b0a7a3cfSSteve Yin if(numberingPrefix.getLength()!=0) 2852*b0a7a3cfSSteve Yin { 2853*b0a7a3cfSSteve Yin swprintf(pTemp,L"NumberingPrefix=%s,",numberingPrefix.getStr()); 2854*b0a7a3cfSSteve Yin wcscat(pChar,pTemp); 2855*b0a7a3cfSSteve Yin } 2856*b0a7a3cfSSteve Yin } 2857*b0a7a3cfSSteve Yin } 2858*b0a7a3cfSSteve Yin } 2859*b0a7a3cfSSteve Yin } 2860*b0a7a3cfSSteve Yin 2861*b0a7a3cfSSteve Yin //Because now have three types numbering level: 2862*b0a7a3cfSSteve Yin //1.real numbering list,numbering level>=0 and numbering Rule !=NULL; 2863*b0a7a3cfSSteve Yin //2.common paragraph, numbering level >=0, and numbering Rule == NULL; 2864*b0a7a3cfSSteve Yin //3.TOC paragraph, numbering level >0, and numbering Rule ==NULL; 2865*b0a7a3cfSSteve Yin // IAText:numberinglevel base on 0, but TOC's level base on 1, 2866*b0a7a3cfSSteve Yin // so NumberingLevel value will be decreased 1 in bridge code. 2867*b0a7a3cfSSteve Yin else if(numberingLevel >0) 2868*b0a7a3cfSSteve Yin { 2869*b0a7a3cfSSteve Yin swprintf(pChar,L"Numbering:NumberingLevel=%d,NumberingType=4,NumberingPrefix=,",numberingLevel-1); 2870*b0a7a3cfSSteve Yin } 2871*b0a7a3cfSSteve Yin else 2872*b0a7a3cfSSteve Yin { 2873*b0a7a3cfSSteve Yin swprintf(pChar,L"Numbering:"); 2874*b0a7a3cfSSteve Yin } 28755fdc4257SSteve Yin } 28765fdc4257SSteve Yin 28775fdc4257SSteve Yin void CMAccessible::ConvertAnyToVariant(const ::com::sun::star::uno::Any &rAnyVal, VARIANT *pvData) 28785fdc4257SSteve Yin { 2879*b0a7a3cfSSteve Yin if(rAnyVal.hasValue()) 2880*b0a7a3cfSSteve Yin { 2881*b0a7a3cfSSteve Yin // Clear VARIANT variable. 2882*b0a7a3cfSSteve Yin VariantClear(pvData); 2883*b0a7a3cfSSteve Yin 2884*b0a7a3cfSSteve Yin // Set value according to value type. 2885*b0a7a3cfSSteve Yin switch(rAnyVal.getValueTypeClass()) 2886*b0a7a3cfSSteve Yin { 2887*b0a7a3cfSSteve Yin case TypeClass_CHAR: 2888*b0a7a3cfSSteve Yin pvData->vt = VT_UI1; 2889*b0a7a3cfSSteve Yin memcpy(&pvData->bVal, rAnyVal.getValue(), sizeof(sal_Char)); 2890*b0a7a3cfSSteve Yin break; 2891*b0a7a3cfSSteve Yin 2892*b0a7a3cfSSteve Yin case TypeClass_BOOLEAN: 2893*b0a7a3cfSSteve Yin pvData->vt = VT_BOOL; 2894*b0a7a3cfSSteve Yin memcpy(&pvData->boolVal, rAnyVal.getValue(), sizeof(sal_Bool)); 2895*b0a7a3cfSSteve Yin break; 2896*b0a7a3cfSSteve Yin 2897*b0a7a3cfSSteve Yin case TypeClass_BYTE: 2898*b0a7a3cfSSteve Yin pvData->vt = VT_UI1; 2899*b0a7a3cfSSteve Yin memcpy(&pvData->bVal, rAnyVal.getValue(), sizeof(sal_Int8)); 2900*b0a7a3cfSSteve Yin break; 2901*b0a7a3cfSSteve Yin 2902*b0a7a3cfSSteve Yin case TypeClass_SHORT: 2903*b0a7a3cfSSteve Yin pvData->vt = VT_I2; 2904*b0a7a3cfSSteve Yin memcpy(&pvData->iVal, rAnyVal.getValue(), sizeof(sal_Int16)); 2905*b0a7a3cfSSteve Yin break; 2906*b0a7a3cfSSteve Yin 2907*b0a7a3cfSSteve Yin case TypeClass_UNSIGNED_SHORT: 2908*b0a7a3cfSSteve Yin pvData->vt = VT_I2; 2909*b0a7a3cfSSteve Yin memcpy(&pvData->iVal, rAnyVal.getValue(), sizeof(sal_uInt16)); 2910*b0a7a3cfSSteve Yin break; 2911*b0a7a3cfSSteve Yin 2912*b0a7a3cfSSteve Yin case TypeClass_LONG: 2913*b0a7a3cfSSteve Yin pvData->vt = VT_I4; 2914*b0a7a3cfSSteve Yin memcpy(&pvData->lVal, rAnyVal.getValue(), sizeof(sal_Int32)); 2915*b0a7a3cfSSteve Yin break; 2916*b0a7a3cfSSteve Yin 2917*b0a7a3cfSSteve Yin case TypeClass_UNSIGNED_LONG: 2918*b0a7a3cfSSteve Yin pvData->vt = VT_I4; 2919*b0a7a3cfSSteve Yin memcpy(&pvData->lVal, rAnyVal.getValue(), sizeof(sal_uInt32)); 2920*b0a7a3cfSSteve Yin break; 2921*b0a7a3cfSSteve Yin 2922*b0a7a3cfSSteve Yin case TypeClass_FLOAT: 2923*b0a7a3cfSSteve Yin pvData->vt = VT_R4; 2924*b0a7a3cfSSteve Yin memcpy(&pvData->fltVal, rAnyVal.getValue(), sizeof(float)); 2925*b0a7a3cfSSteve Yin break; 2926*b0a7a3cfSSteve Yin 2927*b0a7a3cfSSteve Yin case TypeClass_DOUBLE: 2928*b0a7a3cfSSteve Yin pvData->vt = VT_R8; 2929*b0a7a3cfSSteve Yin memcpy(&pvData->dblVal, rAnyVal.getValue(), sizeof(double)); 2930*b0a7a3cfSSteve Yin break; 2931*b0a7a3cfSSteve Yin 2932*b0a7a3cfSSteve Yin case TypeClass_STRING: 2933*b0a7a3cfSSteve Yin { 2934*b0a7a3cfSSteve Yin pvData->vt = VT_BSTR; 2935*b0a7a3cfSSteve Yin ::rtl::OUString val; 2936*b0a7a3cfSSteve Yin rAnyVal >>= val; 2937*b0a7a3cfSSteve Yin pvData->bstrVal = SysAllocString((OLECHAR *)val.getStr()); 2938*b0a7a3cfSSteve Yin break; 2939*b0a7a3cfSSteve Yin } 2940*b0a7a3cfSSteve Yin 2941*b0a7a3cfSSteve Yin case TypeClass_VOID: 2942*b0a7a3cfSSteve Yin case TypeClass_HYPER: 2943*b0a7a3cfSSteve Yin case TypeClass_UNSIGNED_HYPER: 2944*b0a7a3cfSSteve Yin case TypeClass_TYPE: 2945*b0a7a3cfSSteve Yin case TypeClass_ANY: 2946*b0a7a3cfSSteve Yin case TypeClass_ENUM: 2947*b0a7a3cfSSteve Yin case TypeClass_TYPEDEF: 2948*b0a7a3cfSSteve Yin case TypeClass_STRUCT: 2949*b0a7a3cfSSteve Yin case TypeClass_UNION: 2950*b0a7a3cfSSteve Yin case TypeClass_EXCEPTION: 2951*b0a7a3cfSSteve Yin case TypeClass_SEQUENCE: 2952*b0a7a3cfSSteve Yin case TypeClass_ARRAY: 2953*b0a7a3cfSSteve Yin case TypeClass_INTERFACE: 2954*b0a7a3cfSSteve Yin { 2955*b0a7a3cfSSteve Yin Reference< XAccessible > pXAcc; 2956*b0a7a3cfSSteve Yin if(rAnyVal >>= pXAcc) 2957*b0a7a3cfSSteve Yin { 2958*b0a7a3cfSSteve Yin if(pXAcc.is()) 2959*b0a7a3cfSSteve Yin { 2960*b0a7a3cfSSteve Yin IAccessible* pIAcc = NULL; 2961*b0a7a3cfSSteve Yin get_IAccessibleFromXAccessible((long)pXAcc.get(), &pIAcc); 2962*b0a7a3cfSSteve Yin if(pIAcc == NULL) 2963*b0a7a3cfSSteve Yin { 2964*b0a7a3cfSSteve Yin Reference< XAccessibleContext > pXAccContext = pXAcc->getAccessibleContext(); 2965*b0a7a3cfSSteve Yin g_pAgent->InsertAccObj(pXAcc.get(),pXAccContext->getAccessibleParent().get()); 2966*b0a7a3cfSSteve Yin get_IAccessibleFromXAccessible((long)pXAcc.get(), &pIAcc); 2967*b0a7a3cfSSteve Yin } 2968*b0a7a3cfSSteve Yin if(pIAcc) 2969*b0a7a3cfSSteve Yin { 2970*b0a7a3cfSSteve Yin pIAcc->AddRef(); 2971*b0a7a3cfSSteve Yin 2972*b0a7a3cfSSteve Yin pvData->vt = VT_UNKNOWN; 2973*b0a7a3cfSSteve Yin pvData->pdispVal = (IAccessible2*)pIAcc; 2974*b0a7a3cfSSteve Yin break; 2975*b0a7a3cfSSteve Yin } 2976*b0a7a3cfSSteve Yin } 2977*b0a7a3cfSSteve Yin } 2978*b0a7a3cfSSteve Yin } 2979*b0a7a3cfSSteve Yin case TypeClass_SERVICE: 2980*b0a7a3cfSSteve Yin case TypeClass_MODULE: 2981*b0a7a3cfSSteve Yin case TypeClass_INTERFACE_METHOD: 2982*b0a7a3cfSSteve Yin case TypeClass_INTERFACE_ATTRIBUTE: 2983*b0a7a3cfSSteve Yin case TypeClass_UNKNOWN: 2984*b0a7a3cfSSteve Yin case TypeClass_PROPERTY: 2985*b0a7a3cfSSteve Yin case TypeClass_CONSTANT: 2986*b0a7a3cfSSteve Yin case TypeClass_CONSTANTS: 2987*b0a7a3cfSSteve Yin case TypeClass_SINGLETON: 2988*b0a7a3cfSSteve Yin case TypeClass_MAKE_FIXED_SIZE: 2989*b0a7a3cfSSteve Yin // Output the type string, if there is other uno value type. 2990*b0a7a3cfSSteve Yin pvData->vt = VT_BSTR; 2991*b0a7a3cfSSteve Yin pvData->bstrVal = SysAllocString(rAnyVal.getValueTypeName().getStr()); 2992*b0a7a3cfSSteve Yin break; 2993*b0a7a3cfSSteve Yin 2994*b0a7a3cfSSteve Yin default: 2995*b0a7a3cfSSteve Yin break; 2996*b0a7a3cfSSteve Yin } 2997*b0a7a3cfSSteve Yin } 2998*b0a7a3cfSSteve Yin else 2999*b0a7a3cfSSteve Yin { 3000*b0a7a3cfSSteve Yin VariantClear(pvData); 3001*b0a7a3cfSSteve Yin } 30025fdc4257SSteve Yin } 30035fdc4257SSteve Yin 30045fdc4257SSteve Yin STDMETHODIMP CMAccessible::Get_XAccChildID(long* childID) 30055fdc4257SSteve Yin { 3006*b0a7a3cfSSteve Yin // #CHECK# 3007*b0a7a3cfSSteve Yin if(childID == NULL) 3008*b0a7a3cfSSteve Yin { 3009*b0a7a3cfSSteve Yin return E_FAIL; 3010*b0a7a3cfSSteve Yin } 3011*b0a7a3cfSSteve Yin *childID = m_dChildID; 3012*b0a7a3cfSSteve Yin return S_OK; 30135fdc4257SSteve Yin } 30145fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_states(AccessibleStates __RPC_FAR *states ) 30155fdc4257SSteve Yin { 3016*b0a7a3cfSSteve Yin 30175fdc4257SSteve Yin CHECK_ENABLE_INF 3018*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3019*b0a7a3cfSSteve Yin ISDESTROY() 3020*b0a7a3cfSSteve Yin // #CHECK XInterface# 3021*b0a7a3cfSSteve Yin if( !pRContext.is() ) 3022*b0a7a3cfSSteve Yin return E_FAIL; 3023*b0a7a3cfSSteve Yin 3024*b0a7a3cfSSteve Yin Reference<XAccessibleStateSet> pRStateSet = pRContext.get()->getAccessibleStateSet(); 3025*b0a7a3cfSSteve Yin if(!pRStateSet.is()) 3026*b0a7a3cfSSteve Yin { 3027*b0a7a3cfSSteve Yin return S_OK; 3028*b0a7a3cfSSteve Yin } 3029*b0a7a3cfSSteve Yin Sequence<short> pStates = pRStateSet->getStates(); 3030*b0a7a3cfSSteve Yin 3031*b0a7a3cfSSteve Yin 3032*b0a7a3cfSSteve Yin long count = pStates.getLength() ; 3033*b0a7a3cfSSteve Yin *states = 0x0; 3034*b0a7a3cfSSteve Yin for( int i = 0; i < count; i++ ) 3035*b0a7a3cfSSteve Yin { 3036*b0a7a3cfSSteve Yin for( int j = 0; j < sizeof(UNO_STATES) / sizeof(UNO_STATES[0]); j++ ) 3037*b0a7a3cfSSteve Yin { 3038*b0a7a3cfSSteve Yin if( pStates[i] == UNO_STATES[j] ) 3039*b0a7a3cfSSteve Yin { 3040*b0a7a3cfSSteve Yin *states |= IA2_STATES[j]; 3041*b0a7a3cfSSteve Yin break; 3042*b0a7a3cfSSteve Yin } 3043*b0a7a3cfSSteve Yin } 3044*b0a7a3cfSSteve Yin } 3045*b0a7a3cfSSteve Yin return S_OK; 3046*b0a7a3cfSSteve Yin 3047*b0a7a3cfSSteve Yin 3048*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 30495fdc4257SSteve Yin } 30505fdc4257SSteve Yin 30515fdc4257SSteve Yin // return the UNO roles 30525fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_extendedRole( BSTR __RPC_FAR * ) 30535fdc4257SSteve Yin { 3054*b0a7a3cfSSteve Yin 30555fdc4257SSteve Yin CHECK_ENABLE_INF 3056*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3057*b0a7a3cfSSteve Yin ISDESTROY() 30585fdc4257SSteve Yin 3059*b0a7a3cfSSteve Yin return E_NOTIMPL; 30605fdc4257SSteve Yin 3061*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 30625fdc4257SSteve Yin } 30635fdc4257SSteve Yin 30645fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_localizedExtendedRole( BSTR __RPC_FAR * ) 30655fdc4257SSteve Yin { 30665fdc4257SSteve Yin 3067*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3068*b0a7a3cfSSteve Yin ISDESTROY() 3069*b0a7a3cfSSteve Yin return E_NOTIMPL; 3070*b0a7a3cfSSteve Yin 3071*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 30725fdc4257SSteve Yin } 30735fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_nExtendedStates( long __RPC_FAR * ) 30745fdc4257SSteve Yin { 3075*b0a7a3cfSSteve Yin 30765fdc4257SSteve Yin CHECK_ENABLE_INF 3077*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3078*b0a7a3cfSSteve Yin ISDESTROY() 30795fdc4257SSteve Yin 3080*b0a7a3cfSSteve Yin return E_NOTIMPL; 30815fdc4257SSteve Yin 3082*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 30835fdc4257SSteve Yin } 30845fdc4257SSteve Yin 30855fdc4257SSteve Yin 30865fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_localizedExtendedStates( long, BSTR __RPC_FAR *__RPC_FAR *, long __RPC_FAR *) 30875fdc4257SSteve Yin { 30885fdc4257SSteve Yin 3089*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3090*b0a7a3cfSSteve Yin ISDESTROY() 3091*b0a7a3cfSSteve Yin return E_NOTIMPL; 3092*b0a7a3cfSSteve Yin 3093*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 30945fdc4257SSteve Yin } 30955fdc4257SSteve Yin 30965fdc4257SSteve Yin 30975fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_indexInParent( long __RPC_FAR *accParentIndex) 30985fdc4257SSteve Yin { 3099*b0a7a3cfSSteve Yin 31005fdc4257SSteve Yin CHECK_ENABLE_INF 3101*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3102*b0a7a3cfSSteve Yin ISDESTROY() 3103*b0a7a3cfSSteve Yin // #CHECK# 3104*b0a7a3cfSSteve Yin if(accParentIndex == NULL) 3105*b0a7a3cfSSteve Yin return E_INVALIDARG; 31065fdc4257SSteve Yin 3107*b0a7a3cfSSteve Yin // #CHECK XInterface# 3108*b0a7a3cfSSteve Yin if( !pRContext.is() ) 3109*b0a7a3cfSSteve Yin return E_FAIL; 31105fdc4257SSteve Yin 3111*b0a7a3cfSSteve Yin *accParentIndex = pRContext.get()->getAccessibleIndexInParent(); 3112*b0a7a3cfSSteve Yin return S_OK; 31135fdc4257SSteve Yin 31145fdc4257SSteve Yin 3115*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 31165fdc4257SSteve Yin } 31175fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_locale( IA2Locale __RPC_FAR *locale ) 31185fdc4257SSteve Yin { 3119*b0a7a3cfSSteve Yin 31205fdc4257SSteve Yin CHECK_ENABLE_INF 3121*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3122*b0a7a3cfSSteve Yin ISDESTROY() 3123*b0a7a3cfSSteve Yin if(locale == NULL) 3124*b0a7a3cfSSteve Yin return E_INVALIDARG; 3125*b0a7a3cfSSteve Yin // #CHECK XInterface# 31265fdc4257SSteve Yin 3127*b0a7a3cfSSteve Yin if( !pRContext.is() ) 3128*b0a7a3cfSSteve Yin return E_FAIL; 31295fdc4257SSteve Yin 3130*b0a7a3cfSSteve Yin ::com::sun::star::lang::Locale unoLoc = pRContext.get()->getLocale(); 3131*b0a7a3cfSSteve Yin locale->language = SysAllocString((OLECHAR*)unoLoc.Language.getStr()); 3132*b0a7a3cfSSteve Yin locale->country = SysAllocString((OLECHAR*)unoLoc.Country.getStr()); 3133*b0a7a3cfSSteve Yin locale->variant = SysAllocString((OLECHAR*)unoLoc.Variant.getStr()); 31345fdc4257SSteve Yin 3135*b0a7a3cfSSteve Yin return S_OK; 31365fdc4257SSteve Yin 3137*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 31385fdc4257SSteve Yin } 31395fdc4257SSteve Yin 31405fdc4257SSteve Yin DWORD GetMSAAStateFromUNO(short xState) 31415fdc4257SSteve Yin { 3142*b0a7a3cfSSteve Yin DWORD IState = STATE_SYSTEM_UNAVAILABLE; 3143*b0a7a3cfSSteve Yin switch( xState ) 3144*b0a7a3cfSSteve Yin { 3145*b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::BUSY: 3146*b0a7a3cfSSteve Yin IState = STATE_SYSTEM_BUSY; 3147*b0a7a3cfSSteve Yin break; 3148*b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::CHECKED: 3149*b0a7a3cfSSteve Yin IState = STATE_SYSTEM_CHECKED; 3150*b0a7a3cfSSteve Yin break; 3151*b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::DEFUNC: 3152*b0a7a3cfSSteve Yin IState = STATE_SYSTEM_UNAVAILABLE; 3153*b0a7a3cfSSteve Yin break; 3154*b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::EXPANDED: 3155*b0a7a3cfSSteve Yin IState = STATE_SYSTEM_EXPANDED; 3156*b0a7a3cfSSteve Yin break; 3157*b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::FOCUSABLE: 3158*b0a7a3cfSSteve Yin IState = STATE_SYSTEM_FOCUSABLE; 3159*b0a7a3cfSSteve Yin break; 3160*b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::FOCUSED: 3161*b0a7a3cfSSteve Yin IState = STATE_SYSTEM_FOCUSED; 3162*b0a7a3cfSSteve Yin break; 3163*b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::INDETERMINATE: 3164*b0a7a3cfSSteve Yin IState = STATE_SYSTEM_MIXED; 3165*b0a7a3cfSSteve Yin break; 3166*b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::MULTI_SELECTABLE: 3167*b0a7a3cfSSteve Yin IState = STATE_SYSTEM_MULTISELECTABLE; 3168*b0a7a3cfSSteve Yin break; 3169*b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::PRESSED: 3170*b0a7a3cfSSteve Yin IState = STATE_SYSTEM_PRESSED; 3171*b0a7a3cfSSteve Yin break; 3172*b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::RESIZABLE: 3173*b0a7a3cfSSteve Yin IState = STATE_SYSTEM_SIZEABLE; 3174*b0a7a3cfSSteve Yin break; 3175*b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::SELECTABLE: 3176*b0a7a3cfSSteve Yin IState = STATE_SYSTEM_SELECTABLE; 3177*b0a7a3cfSSteve Yin break; 3178*b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::SELECTED: 3179*b0a7a3cfSSteve Yin IState = STATE_SYSTEM_SELECTED; 3180*b0a7a3cfSSteve Yin break; 3181*b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::ARMED: 3182*b0a7a3cfSSteve Yin IState = STATE_SYSTEM_FOCUSED; 3183*b0a7a3cfSSteve Yin break; 3184*b0a7a3cfSSteve Yin case /*AccessibleStateType::*/AccessibleStateType::EXPANDABLE: 3185*b0a7a3cfSSteve Yin IState = STATE_SYSTEM_COLLAPSED; 3186*b0a7a3cfSSteve Yin break; 3187*b0a7a3cfSSteve Yin default: 3188*b0a7a3cfSSteve Yin break; 3189*b0a7a3cfSSteve Yin } 3190*b0a7a3cfSSteve Yin return IState; 31915fdc4257SSteve Yin } 31925fdc4257SSteve Yin 31935fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_appName( BSTR __RPC_FAR *name) 31945fdc4257SSteve Yin { 31955fdc4257SSteve Yin 3196*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3197*b0a7a3cfSSteve Yin ISDESTROY() 3198*b0a7a3cfSSteve Yin if(name == NULL) 3199*b0a7a3cfSSteve Yin return E_INVALIDARG; 3200*b0a7a3cfSSteve Yin 3201*b0a7a3cfSSteve Yin *name = SysAllocString(OLESTR("Hannover")); 3202*b0a7a3cfSSteve Yin return S_OK; 3203*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 32045fdc4257SSteve Yin } 32055fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_appVersion(BSTR __RPC_FAR *version) 32065fdc4257SSteve Yin { 3207*b0a7a3cfSSteve Yin 3208*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3209*b0a7a3cfSSteve Yin ISDESTROY() 3210*b0a7a3cfSSteve Yin if(version == NULL) 3211*b0a7a3cfSSteve Yin return E_INVALIDARG; 3212*b0a7a3cfSSteve Yin *version=SysAllocString(OLESTR("3.0")); 3213*b0a7a3cfSSteve Yin return S_OK; 3214*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 32155fdc4257SSteve Yin } 32165fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_toolkitName(BSTR __RPC_FAR *name) 32175fdc4257SSteve Yin { 3218*b0a7a3cfSSteve Yin 3219*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3220*b0a7a3cfSSteve Yin ISDESTROY() 3221*b0a7a3cfSSteve Yin if(name == NULL) 3222*b0a7a3cfSSteve Yin return E_INVALIDARG; 3223*b0a7a3cfSSteve Yin *name = SysAllocString(OLESTR(" ")); 3224*b0a7a3cfSSteve Yin return S_OK; 3225*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 32265fdc4257SSteve Yin } 32275fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_toolkitVersion(BSTR __RPC_FAR *version) 32285fdc4257SSteve Yin { 3229*b0a7a3cfSSteve Yin 3230*b0a7a3cfSSteve Yin ENTER_PROTECTED_BLOCK 3231*b0a7a3cfSSteve Yin ISDESTROY() 3232*b0a7a3cfSSteve Yin if(version == NULL) 3233*b0a7a3cfSSteve Yin return E_INVALIDARG; 3234*b0a7a3cfSSteve Yin *version = SysAllocString(OLESTR(" ")); 3235*b0a7a3cfSSteve Yin return S_OK; 3236*b0a7a3cfSSteve Yin LEAVE_PROTECTED_BLOCK 32375fdc4257SSteve Yin } 32385fdc4257SSteve Yin 32395fdc4257SSteve Yin 32405fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_attributes(/*[out]*/ BSTR *pAttr) 32415fdc4257SSteve Yin { 32425fdc4257SSteve Yin CHECK_ENABLE_INF 3243*b0a7a3cfSSteve Yin Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext(); 3244*b0a7a3cfSSteve Yin if( !pRContext.is() ) 3245*b0a7a3cfSSteve Yin { 3246*b0a7a3cfSSteve Yin return E_FAIL; 3247*b0a7a3cfSSteve Yin } 3248*b0a7a3cfSSteve Yin Reference<XAccessibleExtendedAttributes> pRXI(pRContext,UNO_QUERY); 3249*b0a7a3cfSSteve Yin if( !pRXI.is() ) 3250*b0a7a3cfSSteve Yin return E_FAIL; 3251*b0a7a3cfSSteve Yin else 3252*b0a7a3cfSSteve Yin { 3253*b0a7a3cfSSteve Yin com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleExtendedAttributes> pRXAttr; 3254*b0a7a3cfSSteve Yin pRXAttr = pRXI.get(); 3255*b0a7a3cfSSteve Yin ::com::sun::star::uno::Any anyVal = pRXAttr->getExtendedAttributes(); 3256*b0a7a3cfSSteve Yin 3257*b0a7a3cfSSteve Yin ::rtl::OUString val; 3258*b0a7a3cfSSteve Yin anyVal >>= val; 3259*b0a7a3cfSSteve Yin 3260*b0a7a3cfSSteve Yin if(*pAttr) 3261*b0a7a3cfSSteve Yin SAFE_SYSFREESTRING(*pAttr); 3262*b0a7a3cfSSteve Yin *pAttr = SysAllocString((OLECHAR *)val.getStr()); 3263*b0a7a3cfSSteve Yin 3264*b0a7a3cfSSteve Yin return S_OK; 3265*b0a7a3cfSSteve Yin } 32665fdc4257SSteve Yin } 32675fdc4257SSteve Yin 3268