13a700b0aSSteve Yin /************************************************************** 25fdc4257SSteve Yin * 33a700b0aSSteve Yin * Licensed to the Apache Software Foundation (ASF) under one 43a700b0aSSteve Yin * or more contributor license agreements. See the NOTICE file 53a700b0aSSteve Yin * distributed with this work for additional information 63a700b0aSSteve Yin * regarding copyright ownership. The ASF licenses this file 73a700b0aSSteve Yin * to you under the Apache License, Version 2.0 (the 83a700b0aSSteve Yin * "License"); you may not use this file except in compliance 93a700b0aSSteve Yin * with the License. You may obtain a copy of the License at 105fdc4257SSteve Yin * 113a700b0aSSteve Yin * http://www.apache.org/licenses/LICENSE-2.0 125fdc4257SSteve Yin * 133a700b0aSSteve Yin * Unless required by applicable law or agreed to in writing, 143a700b0aSSteve Yin * software distributed under the License is distributed on an 153a700b0aSSteve Yin * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 163a700b0aSSteve Yin * KIND, either express or implied. See the License for the 173a700b0aSSteve Yin * specific language governing permissions and limitations 183a700b0aSSteve Yin * under the License. 195fdc4257SSteve Yin * 203a700b0aSSteve Yin *************************************************************/ 215fdc4257SSteve Yin 225fdc4257SSteve Yin #include "stdafx.h" 235fdc4257SSteve Yin #include "UAccCOM2.h" 245fdc4257SSteve Yin #include "MAccessible.h" 255fdc4257SSteve Yin 265fdc4257SSteve Yin #include <algorithm> 275fdc4257SSteve Yin #include "AccAction.h" 285fdc4257SSteve Yin 295fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleText.hpp> 305fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleEditableText.hpp> 315fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleImage.hpp> 325fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleTable.hpp> 335fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleExtendedComponent.hpp> 345fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleAction.hpp> 355fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleKeyBinding.hpp> 365fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleHyperText.hpp> 375fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleHyperlink.hpp> 385fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleRelationSet.hpp> 395fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleStateType.hpp> 405fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleRole.hpp> 415fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleGroupPosition.hpp> 425fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleValue.hpp> 435fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleExtendedAttributes.hpp> 445fdc4257SSteve Yin #include <com/sun/star/style/LineSpacing.hpp> 455fdc4257SSteve Yin #include <com/sun/star/style/TabStop.hpp> 465fdc4257SSteve Yin #include <com/sun/star/container/XIndexReplace.hpp> 475fdc4257SSteve Yin 48b0a7a3cfSSteve Yin #include "act.hxx" 493a700b0aSSteve Yin 505fdc4257SSteve Yin using namespace com::sun::star::accessibility::AccessibleStateType; 515fdc4257SSteve Yin 525fdc4257SSteve Yin // IA2 states mapping, and name 535fdc4257SSteve Yin // maintenance the consistency, change one array, change the three all 545fdc4257SSteve Yin long IA2_STATES[] = 555fdc4257SSteve Yin { 565fdc4257SSteve Yin IA2_STATE_ACTIVE, // = 0x1; 575fdc4257SSteve Yin IA2_STATE_ARMED, // = 0x2; 585fdc4257SSteve Yin IA2_STATE_DEFUNCT, // = 0x4; 595fdc4257SSteve Yin IA2_STATE_EDITABLE, // = 0x8; 605fdc4257SSteve Yin IA2_STATE_HORIZONTAL, // = 0x10; 615fdc4257SSteve Yin IA2_STATE_ICONIFIED, // = 0x20; 625fdc4257SSteve Yin IA2_STATE_INVALID_ENTRY, // = 0x80; 635fdc4257SSteve Yin IA2_STATE_MANAGES_DESCENDANTS, // = 0x100; 645fdc4257SSteve Yin IA2_STATE_MODAL, // = 0x200; 655fdc4257SSteve Yin IA2_STATE_MULTI_LINE, // = 0x400; 665fdc4257SSteve Yin IA2_STATE_OPAQUE, // = 0x800; 675fdc4257SSteve Yin IA2_STATE_REQUIRED, // = 0x2000; 685fdc4257SSteve Yin IA2_STATE_SELECTABLE_TEXT, // = 0x3000; 695fdc4257SSteve Yin IA2_STATE_SINGLE_LINE, // = 0x4000; 705fdc4257SSteve Yin IA2_STATE_STALE, // = 0x8000; 715fdc4257SSteve Yin IA2_STATE_SUPPORTS_AUTOCOMPLETION, // = 0x10000; 725fdc4257SSteve Yin IA2_STATE_TRANSIENT, //= 0x20000; 735fdc4257SSteve Yin IA2_STATE_VERTICAL // = 0x40000; 745fdc4257SSteve Yin }; 755fdc4257SSteve Yin /* 765fdc4257SSteve Yin 775fdc4257SSteve Yin <=== map ===> 785fdc4257SSteve Yin 795fdc4257SSteve Yin */ 805fdc4257SSteve Yin short UNO_STATES[] = 815fdc4257SSteve Yin { 825fdc4257SSteve Yin ACTIVE, // = (sal_Int16)1; 835fdc4257SSteve Yin ARMED, // = (sal_Int16)2; 845fdc4257SSteve Yin DEFUNC, // = (sal_Int16)5; 855fdc4257SSteve Yin EDITABLE, // = (sal_Int16)6; 865fdc4257SSteve Yin HORIZONTAL, // = (sal_Int16)12; 875fdc4257SSteve Yin ICONIFIED, // = (sal_Int16)13; 885fdc4257SSteve Yin -1, //IA2_STATE_INVALID_ENTRY 895fdc4257SSteve Yin MANAGES_DESCENDANTS, // = (sal_Int16)15; 905fdc4257SSteve Yin MODAL, // = (sal_Int16)16; 915fdc4257SSteve Yin MULTI_LINE, // = (sal_Int16)17; 925fdc4257SSteve Yin OPAQUE, // = (sal_Int16)19; 935fdc4257SSteve Yin -1, //IA2_STATE_REQUIRED 945fdc4257SSteve Yin -1, //IA2_STATE_SELECTABLE_TEXT 955fdc4257SSteve Yin SINGLE_LINE, // = (sal_Int16)26; 965fdc4257SSteve Yin STALE, // = (sal_Int16)27; 975fdc4257SSteve Yin -1, //IA2_STATE_SUPPORTS_AUTOCOMPLETION 985fdc4257SSteve Yin TRANSIENT, //IA2_STATE_TRANSIENT 995fdc4257SSteve Yin VERTICAL // = (sal_Int16)29; 1005fdc4257SSteve Yin }; 1015fdc4257SSteve Yin 1025fdc4257SSteve Yin // <=== map ===> 1035fdc4257SSteve Yin 1045fdc4257SSteve Yin BSTR IA2_STATES_NAME[] = 1055fdc4257SSteve Yin { 1065fdc4257SSteve Yin _T("Active"), 1075fdc4257SSteve Yin _T("Armed"), 1085fdc4257SSteve Yin _T("Defunct"), 1095fdc4257SSteve Yin _T("Editable"), 1105fdc4257SSteve Yin _T("Horizontal"), 1115fdc4257SSteve Yin _T("Iconified"), 1125fdc4257SSteve Yin _T("Invalid Entry"), 11386e1cf34SPedro Giffuni _T("Manages Descendants"), 1145fdc4257SSteve Yin _T("Modal"), 1155fdc4257SSteve Yin _T("Multi Line"), 1165fdc4257SSteve Yin _T("Opaque"), 1175fdc4257SSteve Yin _T("Required"), 1185fdc4257SSteve Yin _T("Selectable Text"), 1195fdc4257SSteve Yin _T("Single Line"), 1205fdc4257SSteve Yin _T("Stale"), 1215fdc4257SSteve Yin _T("Supports Autocompletion"), 1225fdc4257SSteve Yin _T("Transient"), 1235fdc4257SSteve Yin _T("Vertical") 1245fdc4257SSteve 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[] = 1305fdc4257SSteve Yin { 1315fdc4257SSteve Yin _T("INVALID"), // INVALID ( 0 ) 1325fdc4257SSteve Yin _T("ACTIVE"), // ACTIVE ( 1 ) 1335fdc4257SSteve Yin _T("ARMED"), // ARMED ( 2 ) 1345fdc4257SSteve Yin _T("BUSY"), // BUSY ( 3 ) 1355fdc4257SSteve Yin _T("CHECKED"), // CHECKED ( 4 ) 1365fdc4257SSteve Yin _T("DEFUNC"), // DEFUNC ( 5 ) 1375fdc4257SSteve Yin _T("EDITABLE"), // EDITABLE ( 6 ) 1385fdc4257SSteve Yin _T("ENABLED"), // ENABLED ( 7 ) 1395fdc4257SSteve Yin _T("EXPANDABLE"), // EXPANDABLE ( 8 ) 1405fdc4257SSteve Yin _T("EXPANDED"), // EXPANDED ( 9 ) 1415fdc4257SSteve Yin _T("FOCUSABLE"), // FOCUSABLE ( 10 ) 1425fdc4257SSteve Yin _T("FOCUSED"), // FOCUSED ( 11 ) 1435fdc4257SSteve Yin _T("HORIZONTAL"), // HORIZONTAL ( 12 ) 1445fdc4257SSteve Yin _T("ICONIFIED"), // ICONIFIED ( 13 ) 1455fdc4257SSteve Yin _T("INDETERMINATE"), // INDETERMINATE ( 14 ) 1465fdc4257SSteve Yin _T("MANAGES_DESCENDANTS"),// MANAGES_DESCENDANTS ( 15 ) 1475fdc4257SSteve Yin _T("MODAL"), // MODAL ( 16 ) 1485fdc4257SSteve Yin _T("MULTI_LINE"), // MULTI_LINE ( 17 ) 1495fdc4257SSteve Yin _T("MULTI_SELECTABLE"), // MULTI_SELECTABLE ( 18 ) 1505fdc4257SSteve Yin _T("OPAQUE"), // OPAQUE ( 19 ) 1515fdc4257SSteve Yin _T("PRESSED"), // PRESSED ( 20 ) 1525fdc4257SSteve Yin _T("RESIZABLE"), // RESIZABLE ( 21 ) 1535fdc4257SSteve Yin _T("SELECTABLE"), // SELECTABLE ( 22 ) 1545fdc4257SSteve Yin _T("SELECTED"), // SELECTED ( 23 ) 1555fdc4257SSteve Yin _T("SENSITIVE"), // SENSITIVE ( 24 ) 1565fdc4257SSteve Yin _T("SHOWING"), // SHOWING ( 25 ) 1575fdc4257SSteve Yin _T("SINGLE_LINE"), // SINGLE_LINE ( 26 ) 1585fdc4257SSteve Yin _T("STALE"), // STALE ( 27 ) 1595fdc4257SSteve Yin _T("TRANSIENT"), // TRANSIENT ( 28 ) 1605fdc4257SSteve Yin _T("VERTICAL"), // VERTICAL ( 29 ) 1615fdc4257SSteve Yin _T("VISIBLE"), // VISIBLE ( 30 ) 1625fdc4257SSteve Yin _T("MOVEABLE"), // MOVEABLE ( 31 ) 1635fdc4257SSteve Yin _T("OFFSCREEN"), // OFFSCREEN ( 32 ) 1645fdc4257SSteve Yin _T("COLLAPSE"), // COLLAPSE ( 33 ) 1655fdc4257SSteve Yin _T("DEFAULT") // DEFAULT ( 34 ) 1665fdc4257SSteve 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) \ 1765fdc4257SSteve Yin return FALSE; \ 1775fdc4257SSteve Yin pRContext = pXAcc->getAccessibleContext(); \ 1785fdc4257SSteve Yin if( !pRContext.is() ) \ 1795fdc4257SSteve Yin { \ 1805fdc4257SSteve Yin return FALSE; \ 1815fdc4257SSteve Yin } \ 1825fdc4257SSteve Yin Reference<X##ainterface> pRXI(pRContext,UNO_QUERY);\ 1835fdc4257SSteve Yin if( !pRXI.is() ) \ 1845fdc4257SSteve Yin { \ 1855fdc4257SSteve Yin return FALSE; \ 1865fdc4257SSteve Yin } \ 1875fdc4257SSteve Yin *ppXI = (XInterface*)pRXI.get(); \ 1885fdc4257SSteve Yin return TRUE; \ 1895fdc4257SSteve Yin } 1905fdc4257SSteve Yin 1915fdc4257SSteve Yin #define ISDESTROY() \ 1925fdc4257SSteve Yin if(m_isDestroy) \ 1935fdc4257SSteve Yin return S_FALSE; 1945fdc4257SSteve Yin 1955fdc4257SSteve Yin 1965fdc4257SSteve Yin AccObjectManagerAgent* CMAccessible::g_pAgent = NULL; 1975fdc4257SSteve Yin 1985fdc4257SSteve Yin CMAccessible::CMAccessible(): 1995fdc4257SSteve Yin m_iRole(0x00), 2005fdc4257SSteve Yin m_dState(0x00), 2015fdc4257SSteve Yin m_dChildID(0x00), 2025fdc4257SSteve Yin m_dFocusChildID(UACC_NO_FOCUS), 2035fdc4257SSteve Yin m_hwnd(NULL), 2045fdc4257SSteve Yin m_pIParent(NULL), 2055fdc4257SSteve Yin m_pszName(NULL), 2065fdc4257SSteve Yin m_pszValue(NULL), 2075fdc4257SSteve Yin m_pszDescription(NULL), 2085fdc4257SSteve Yin m_isDestroy(FALSE), 2095fdc4257SSteve Yin m_pszActionDescription(NULL), 2105fdc4257SSteve Yin m_pXAction(NULL), 2115fdc4257SSteve Yin m_bRequiresSave(FALSE), 2125fdc4257SSteve Yin pUNOInterface(NULL) 2135fdc4257SSteve Yin { 2145fdc4257SSteve Yin m_sLocation.m_dLeft=0; 2155fdc4257SSteve Yin m_sLocation.m_dTop = 0; 2165fdc4257SSteve Yin m_sLocation.m_dWidth=0; 2175fdc4257SSteve Yin m_sLocation.m_dHeight=0; 2185fdc4257SSteve Yin CEnumVariant::Create(&m_pEnumVar); 219693722acSSteve Yin m_containedObjects.clear(); 2205fdc4257SSteve Yin } 2215fdc4257SSteve Yin 2225fdc4257SSteve Yin CMAccessible::~CMAccessible() 2235fdc4257SSteve Yin { 2245fdc4257SSteve Yin if(m_pszName!=NULL) 2255fdc4257SSteve Yin { 2265fdc4257SSteve Yin SAFE_SYSFREESTRING(m_pszName); 2275fdc4257SSteve Yin m_pszName=NULL; 2285fdc4257SSteve Yin } 2295fdc4257SSteve Yin if(m_pszValue!=NULL) 2305fdc4257SSteve Yin { 2315fdc4257SSteve Yin SAFE_SYSFREESTRING(m_pszValue); 2325fdc4257SSteve Yin m_pszValue=NULL; 2335fdc4257SSteve Yin } 2345fdc4257SSteve Yin if(m_pszDescription!=NULL) 2355fdc4257SSteve Yin { 2365fdc4257SSteve Yin SAFE_SYSFREESTRING(m_pszDescription); 2375fdc4257SSteve Yin m_pszDescription=NULL; 2385fdc4257SSteve Yin } 2395fdc4257SSteve Yin 2405fdc4257SSteve Yin if(m_pszActionDescription!=NULL) 2415fdc4257SSteve Yin { 2425fdc4257SSteve Yin SAFE_SYSFREESTRING(m_pszActionDescription); 2435fdc4257SSteve Yin m_pszActionDescription=NULL; 2445fdc4257SSteve Yin } 2455fdc4257SSteve Yin 2465fdc4257SSteve Yin if(m_pIParent) 2475fdc4257SSteve Yin { 2485fdc4257SSteve Yin m_pIParent->Release(); 2495fdc4257SSteve Yin m_pIParent=NULL; 2505fdc4257SSteve Yin } 2515fdc4257SSteve Yin pRef = NULL; 2525fdc4257SSteve Yin m_pEnumVar->Release(); 2535fdc4257SSteve Yin m_containedObjects.clear(); 2545fdc4257SSteve Yin pRContext = NULL; 2555fdc4257SSteve Yin } 2565fdc4257SSteve Yin 2575fdc4257SSteve Yin /** 2585fdc4257SSteve Yin * Returns the Parent IAccessible interface pointer to AT. 2595fdc4257SSteve Yin * It should add reference, and the client should release the component. 2605fdc4257SSteve Yin * It should return E_FAIL when the parent point is null. 2615fdc4257SSteve Yin * @param ppdispParent [in,out] used to return the parent interface point. 2625fdc4257SSteve Yin * when the point is null, should return null. 2635fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if the m_pIParent is NULL. 2645fdc4257SSteve Yin */ 2655fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accParent(IDispatch **ppdispParent) 2665fdc4257SSteve Yin { 2675fdc4257SSteve Yin 2685fdc4257SSteve Yin CHECK_ENABLE_INF 2695fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 2705fdc4257SSteve Yin ISDESTROY() 2715fdc4257SSteve Yin // #CHECK# 2725fdc4257SSteve Yin if(ppdispParent == NULL) 2735fdc4257SSteve Yin { 2745fdc4257SSteve Yin return E_INVALIDARG; 2755fdc4257SSteve Yin } 2765fdc4257SSteve Yin 2775fdc4257SSteve Yin if(m_pIParent) 2785fdc4257SSteve Yin { 2795fdc4257SSteve Yin *ppdispParent = m_pIParent; 2805fdc4257SSteve Yin (*ppdispParent)->AddRef(); 2815fdc4257SSteve Yin return S_OK; 2825fdc4257SSteve Yin } 2835fdc4257SSteve Yin else if(m_hwnd) 2845fdc4257SSteve Yin { 2855fdc4257SSteve Yin HRESULT hr = AccessibleObjectFromWindow(m_hwnd, OBJID_WINDOW, IID_IAccessible, (void**)ppdispParent); 2865fdc4257SSteve Yin if( ! SUCCEEDED( hr ) || ! ppdispParent ) 2875fdc4257SSteve Yin { 2885fdc4257SSteve Yin return S_FALSE; 2895fdc4257SSteve Yin } 2905fdc4257SSteve Yin return S_OK; 2915fdc4257SSteve Yin } 2925fdc4257SSteve Yin return S_FALSE; 2935fdc4257SSteve Yin 2945fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 2955fdc4257SSteve Yin } 2965fdc4257SSteve Yin 2975fdc4257SSteve Yin /** 2985fdc4257SSteve Yin * Returns child count of current COM object. 2995fdc4257SSteve Yin * @param pcountChildren [in,out] used to return the children count. 3005fdc4257SSteve Yin * @return S_OK if successful. 3015fdc4257SSteve Yin */ 3025fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accChildCount(long *pcountChildren) 3035fdc4257SSteve Yin { 3045fdc4257SSteve Yin 3055fdc4257SSteve Yin CHECK_ENABLE_INF 3065fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 3075fdc4257SSteve Yin ISDESTROY() 3085fdc4257SSteve Yin // #CHECK# 3095fdc4257SSteve Yin if(pcountChildren == NULL) 3105fdc4257SSteve Yin { 3115fdc4257SSteve Yin return E_INVALIDARG; 3125fdc4257SSteve Yin } 3135fdc4257SSteve Yin 3145fdc4257SSteve Yin if(!pUNOInterface) 3155fdc4257SSteve Yin return S_FALSE; 3165fdc4257SSteve Yin 3175fdc4257SSteve Yin Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext(); 3185fdc4257SSteve Yin if( pRContext.is() ) 3195fdc4257SSteve Yin { 3205fdc4257SSteve Yin *pcountChildren = pRContext->getAccessibleChildCount(); 3215fdc4257SSteve Yin } 3225fdc4257SSteve Yin 3235fdc4257SSteve Yin return S_OK; 3245fdc4257SSteve Yin 3255fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 3265fdc4257SSteve Yin } 3275fdc4257SSteve Yin 3285fdc4257SSteve Yin /** 3295fdc4257SSteve Yin * Returns child interface pointer for AT according to input child ID. 3305fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 3315fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 3325fdc4257SSteve Yin * @param ppdispChild, [in,out] use to return the child interface point. 3335fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 3345fdc4257SSteve Yin */ 3355fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accChild(VARIANT varChild, IDispatch **ppdispChild) 3365fdc4257SSteve Yin { 3375fdc4257SSteve Yin 3385fdc4257SSteve Yin CHECK_ENABLE_INF 3395fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 3405fdc4257SSteve Yin ISDESTROY() 3415fdc4257SSteve Yin // #CHECK# 3425fdc4257SSteve Yin if(ppdispChild == NULL) 3435fdc4257SSteve Yin { 3445fdc4257SSteve Yin return E_INVALIDARG; 3455fdc4257SSteve Yin } 3465fdc4257SSteve Yin if(varChild.vt==VT_I4) 3475fdc4257SSteve Yin { 3485fdc4257SSteve Yin //get child interface pointer due to child ID 3495fdc4257SSteve Yin if(varChild.lVal==CHILDID_SELF) 3505fdc4257SSteve Yin { 3515fdc4257SSteve Yin AddRef(); 3525fdc4257SSteve Yin *ppdispChild = this; 3535fdc4257SSteve Yin return S_OK; 3545fdc4257SSteve Yin } 3555fdc4257SSteve Yin *ppdispChild = GetChildInterface(varChild.lVal); 3565b933a9eSSteve Yin if((*ppdispChild) == NULL) 3575b933a9eSSteve Yin return E_FAIL; 3585fdc4257SSteve Yin (*ppdispChild)->AddRef(); 3595b933a9eSSteve Yin return S_OK; 3605fdc4257SSteve Yin } 3615fdc4257SSteve Yin return S_FALSE; 3625fdc4257SSteve Yin 3635fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 3645fdc4257SSteve Yin } 3655fdc4257SSteve Yin 3665fdc4257SSteve Yin /** 3675fdc4257SSteve Yin * Returns the accessible name of the current COM object self or its one child to AT. 3685fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 3695fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 3705fdc4257SSteve Yin * @param pszName, [in,out] use to return the name of the proper object. 3715fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 3725fdc4257SSteve Yin */ 3735fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accName(VARIANT varChild, BSTR *pszName) 3745fdc4257SSteve Yin { 3755fdc4257SSteve Yin 3765fdc4257SSteve Yin CHECK_ENABLE_INF 3775fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 3785fdc4257SSteve Yin ISDESTROY() 3795fdc4257SSteve Yin // #CHECK# 3805fdc4257SSteve Yin if(pszName == NULL) 3815fdc4257SSteve Yin { 3825fdc4257SSteve Yin return E_INVALIDARG; 3835fdc4257SSteve Yin } 3845fdc4257SSteve Yin if(varChild.vt==VT_I4) 3855fdc4257SSteve Yin { 3865fdc4257SSteve Yin if(varChild.lVal==CHILDID_SELF) 3875fdc4257SSteve Yin { 3885fdc4257SSteve Yin SAFE_SYSFREESTRING(*pszName); 3895fdc4257SSteve Yin *pszName = SysAllocString(m_pszName); 3905fdc4257SSteve Yin return S_OK; 3915fdc4257SSteve Yin } 3925fdc4257SSteve Yin 3935fdc4257SSteve Yin long lVal = varChild.lVal; 3945fdc4257SSteve Yin varChild.lVal = CHILDID_SELF; 3955fdc4257SSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 3965fdc4257SSteve Yin if(!pChild) 3975fdc4257SSteve Yin return E_FAIL; 3985fdc4257SSteve Yin return pChild->get_accName(varChild,pszName); 3995fdc4257SSteve Yin } 4005fdc4257SSteve Yin return S_FALSE; 4015fdc4257SSteve Yin 4025fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 4035fdc4257SSteve Yin } 4045fdc4257SSteve Yin 4055fdc4257SSteve Yin /** 4065fdc4257SSteve Yin * Returns the accessible value of the current COM object self or its one child to AT. 4075fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 4085fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 4095fdc4257SSteve Yin * @param pszValue, [in,out] use to return the value of the proper object. 4105fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 4115fdc4257SSteve Yin */ 4125fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accValue(VARIANT varChild, BSTR *pszValue) 4135fdc4257SSteve Yin { 4145fdc4257SSteve Yin 4155fdc4257SSteve Yin CHECK_ENABLE_INF 4165fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 4175fdc4257SSteve Yin ISDESTROY() 4185fdc4257SSteve Yin // #CHECK# 4195fdc4257SSteve Yin if( pszValue == NULL ) 4205fdc4257SSteve Yin { 4215fdc4257SSteve Yin return E_INVALIDARG; 4225fdc4257SSteve Yin } 4235fdc4257SSteve Yin if( varChild.vt==VT_I4 ) 4245fdc4257SSteve Yin { 4255fdc4257SSteve Yin if(varChild.lVal==CHILDID_SELF) 4265fdc4257SSteve Yin { 4275fdc4257SSteve Yin if(m_dState & STATE_SYSTEM_PROTECTED) 4285fdc4257SSteve Yin return E_ACCESSDENIED; 4295fdc4257SSteve Yin 4305fdc4257SSteve Yin if ( m_pszValue !=NULL && wcslen(m_pszValue) == 0 ) 4315fdc4257SSteve Yin return S_OK; 4325fdc4257SSteve Yin 4335fdc4257SSteve Yin SAFE_SYSFREESTRING(*pszValue); 4345fdc4257SSteve Yin *pszValue = SysAllocString(m_pszValue); 4355fdc4257SSteve Yin return S_OK; 4365fdc4257SSteve Yin } 4375fdc4257SSteve Yin 4385fdc4257SSteve Yin long lVal = varChild.lVal; 4395fdc4257SSteve Yin varChild.lVal = CHILDID_SELF; 4405fdc4257SSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 4415fdc4257SSteve Yin if(!pChild) 4425fdc4257SSteve Yin return E_FAIL; 4435fdc4257SSteve Yin return pChild->get_accValue(varChild,pszValue); 4445fdc4257SSteve Yin } 4455fdc4257SSteve Yin return S_FALSE; 4465fdc4257SSteve Yin 4475fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 4485fdc4257SSteve Yin } 4495fdc4257SSteve Yin 4505fdc4257SSteve Yin /** 4515fdc4257SSteve Yin * Returns the accessible description of the current COM object self or its one child to AT. 4525fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 4535fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 4545fdc4257SSteve Yin * @param pszDescription, [in,out] use to return the description of the proper object. 4555fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 4565fdc4257SSteve Yin */ 4575fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accDescription(VARIANT varChild, BSTR *pszDescription) 4585fdc4257SSteve Yin { 4595fdc4257SSteve Yin 4605fdc4257SSteve Yin CHECK_ENABLE_INF 4615fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 4625fdc4257SSteve Yin ISDESTROY() 4635fdc4257SSteve Yin // #CHECK# 4645fdc4257SSteve Yin if(pszDescription == NULL) 4655fdc4257SSteve Yin { 4665fdc4257SSteve Yin return E_INVALIDARG; 4675fdc4257SSteve Yin } 4685fdc4257SSteve Yin if(varChild.vt==VT_I4) 4695fdc4257SSteve Yin { 4705fdc4257SSteve Yin if(varChild.lVal==CHILDID_SELF) 4715fdc4257SSteve Yin { 4725fdc4257SSteve Yin SAFE_SYSFREESTRING(*pszDescription); 4735fdc4257SSteve Yin *pszDescription = SysAllocString(m_pszDescription); 4745fdc4257SSteve Yin return S_OK; 4755fdc4257SSteve Yin } 4765fdc4257SSteve Yin 4775fdc4257SSteve Yin long lVal = varChild.lVal; 4785fdc4257SSteve Yin varChild.lVal = CHILDID_SELF; 4795fdc4257SSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 4805fdc4257SSteve Yin if(!pChild) 4815fdc4257SSteve Yin return E_FAIL; 4825fdc4257SSteve Yin return pChild->get_accDescription(varChild,pszDescription); 4835fdc4257SSteve Yin } 4845fdc4257SSteve Yin return S_FALSE; 4855fdc4257SSteve Yin 4865fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 4875fdc4257SSteve Yin } 4885fdc4257SSteve Yin 4895fdc4257SSteve Yin /** 4905fdc4257SSteve Yin * Returns the accessible role of the current COM object self or its one child to AT. 4915fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 4925fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 4935fdc4257SSteve Yin * @param pvarRole, [in,out] use to return the role of the proper object. 4945fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 4955fdc4257SSteve Yin */ 4965fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accRole(VARIANT varChild, VARIANT *pvarRole) 4975fdc4257SSteve Yin { 4985fdc4257SSteve Yin 4995fdc4257SSteve Yin CHECK_ENABLE_INF 5005fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 5015fdc4257SSteve Yin ISDESTROY() 5025fdc4257SSteve Yin // #CHECK# 5035fdc4257SSteve Yin if(pvarRole == NULL) 5045fdc4257SSteve Yin { 5055fdc4257SSteve Yin return E_INVALIDARG; 5065fdc4257SSteve Yin } 5075fdc4257SSteve Yin if(varChild.vt == VT_I4) 5085fdc4257SSteve Yin { 5095fdc4257SSteve Yin 5105fdc4257SSteve Yin if(varChild.lVal == CHILDID_SELF) 5115fdc4257SSteve Yin { 5125fdc4257SSteve Yin if( m_iRole < IA2_ROLE_CAPTION ) 5135fdc4257SSteve Yin { 5145fdc4257SSteve Yin VariantInit(pvarRole); 5155fdc4257SSteve Yin pvarRole->vt = VT_I4; 5165fdc4257SSteve Yin pvarRole->lVal = m_iRole; 5175fdc4257SSteve Yin } 5185fdc4257SSteve Yin else 5195fdc4257SSteve Yin { 5205fdc4257SSteve Yin VariantInit(pvarRole); 5215fdc4257SSteve Yin pvarRole->vt = VT_I4; 5225fdc4257SSteve Yin pvarRole->lVal = ROLE_SYSTEM_CLIENT; 5235fdc4257SSteve Yin } 5245fdc4257SSteve Yin return S_OK; 5255fdc4257SSteve Yin } 5265fdc4257SSteve Yin 5275fdc4257SSteve Yin 5285fdc4257SSteve Yin long lVal = varChild.lVal; 5295fdc4257SSteve Yin varChild.lVal = CHILDID_SELF; 5305fdc4257SSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 5315fdc4257SSteve Yin if(!pChild) 5325fdc4257SSteve Yin return E_FAIL; 5335fdc4257SSteve Yin return pChild->get_accRole(varChild,pvarRole); 5345fdc4257SSteve Yin } 5355fdc4257SSteve Yin return S_FALSE; 5365fdc4257SSteve Yin 5375fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 5385fdc4257SSteve Yin } 5395fdc4257SSteve Yin 5405fdc4257SSteve Yin /** 5415fdc4257SSteve Yin * Returns the accessible state of the current COM object self or its one child to AT. 5425fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 5435fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 5445fdc4257SSteve Yin * @param pvarState, [in,out] use to return the state of the proper object. 5455fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 5465fdc4257SSteve Yin */ 5475fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accState(VARIANT varChild, VARIANT *pvarState) 5485fdc4257SSteve Yin { 5495fdc4257SSteve Yin 5505fdc4257SSteve Yin CHECK_ENABLE_INF 5515fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 5525fdc4257SSteve Yin ISDESTROY() 5535fdc4257SSteve Yin // #CHECK# 5545fdc4257SSteve Yin if(pvarState == NULL) 5555fdc4257SSteve Yin { 5565fdc4257SSteve Yin return E_INVALIDARG; 5575fdc4257SSteve Yin } 5585fdc4257SSteve Yin if(varChild.vt==VT_I4) 5595fdc4257SSteve Yin { 5605fdc4257SSteve Yin if(varChild.lVal == CHILDID_SELF) 5615fdc4257SSteve Yin { 5625fdc4257SSteve Yin if(pUNOInterface) 5635fdc4257SSteve Yin { 5645fdc4257SSteve Yin Reference< XAccessibleContext > pContext = pUNOInterface->getAccessibleContext(); 5655fdc4257SSteve Yin if(pContext.is()) 5665fdc4257SSteve Yin { 5675fdc4257SSteve Yin // add the STATE_SYSTEM_LINKED state 5685fdc4257SSteve Yin Reference< XAccessibleHypertext > pRHypertext(pContext,UNO_QUERY); 5695fdc4257SSteve Yin if(pRHypertext.is()) 5705fdc4257SSteve Yin { 5715fdc4257SSteve Yin if( pRHypertext->getHyperLinkCount() > 0 ) 5725fdc4257SSteve Yin m_dState |= STATE_SYSTEM_LINKED; 5735fdc4257SSteve Yin else 5745fdc4257SSteve Yin m_dState &= ~STATE_SYSTEM_LINKED; 5755fdc4257SSteve Yin } 5765fdc4257SSteve Yin else 5775fdc4257SSteve Yin m_dState &= ~STATE_SYSTEM_LINKED; 5785fdc4257SSteve Yin } 5795fdc4257SSteve Yin } 5805fdc4257SSteve Yin 5815fdc4257SSteve Yin VariantInit(pvarState); 5825fdc4257SSteve Yin pvarState->vt = VT_I4; 5835fdc4257SSteve Yin pvarState->lVal = m_dState; 5845fdc4257SSteve Yin return S_OK; 5855fdc4257SSteve Yin } 5865fdc4257SSteve Yin 5875fdc4257SSteve Yin long lVal = varChild.lVal; 5885fdc4257SSteve Yin varChild.lVal = CHILDID_SELF; 5895fdc4257SSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 5905fdc4257SSteve Yin if(!pChild) 5915fdc4257SSteve Yin return E_FAIL; 5925fdc4257SSteve Yin return pChild->get_accState(varChild,pvarState); 5935fdc4257SSteve Yin } 5945fdc4257SSteve Yin return S_FALSE; 5955fdc4257SSteve Yin 5965fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 5975fdc4257SSteve Yin } 5985fdc4257SSteve Yin 5995fdc4257SSteve Yin /** 6005fdc4257SSteve Yin * Returns the accessible helpString of the current COM object self or its one child to AT. 6015fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 6025fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 6035fdc4257SSteve Yin * @param pszHelp, [in,out] use to return the helpString of the proper object. 6045fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 6055fdc4257SSteve Yin */ 6065fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accHelp(VARIANT, BSTR *) 6075fdc4257SSteve Yin { 6085fdc4257SSteve Yin return E_NOTIMPL; 6095fdc4257SSteve Yin } 6105fdc4257SSteve Yin 6115fdc4257SSteve Yin /** 6125fdc4257SSteve Yin * Returns the accessible HelpTopic of the current COM object self or its one child to AT. 6135fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 6145fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 6155fdc4257SSteve Yin * @param pszHelpFile, [in,out] use to return the HelpTopic of the proper object. 6165fdc4257SSteve Yin * @param pidTopic, use to return the HelpTopic ID of the proper object. 6175fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 6185fdc4257SSteve Yin * Not implemented yet 6195fdc4257SSteve Yin */ 6205fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accHelpTopic(BSTR *, VARIANT, long *) 6215fdc4257SSteve Yin { 6225fdc4257SSteve Yin return E_NOTIMPL; 6235fdc4257SSteve Yin } 6245fdc4257SSteve Yin 6255fdc4257SSteve Yin static void GetMnemonicChar( const ::rtl::OUString& aStr, WCHAR* wStr) 6265fdc4257SSteve Yin { 6275fdc4257SSteve Yin int nLen = aStr.pData->length; 6285fdc4257SSteve Yin int i = 0; 6295fdc4257SSteve Yin WCHAR* text = aStr.pData->buffer; 6305fdc4257SSteve Yin 6315fdc4257SSteve Yin while ( i < nLen ) 6325fdc4257SSteve Yin { 6335fdc4257SSteve Yin if ( text[i] == L'~' ) 6345fdc4257SSteve Yin if ( text[i+1] != L'~' ) 6355fdc4257SSteve Yin { 6365fdc4257SSteve Yin wStr[0] = text[i+1]; 6375fdc4257SSteve Yin break; 6385fdc4257SSteve Yin } 6395fdc4257SSteve Yin i++; 6405fdc4257SSteve Yin } 6415fdc4257SSteve Yin } 6425fdc4257SSteve Yin 6435fdc4257SSteve Yin /** 6445fdc4257SSteve Yin * Returns the accessible keyboard shortcut of the current COM object self or its one child to AT. 6455fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 6465fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 6475fdc4257SSteve Yin * @param pszKeyboardShortcut, [in,out] use to return the kbshortcut of the proper object. 6485fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 6495fdc4257SSteve Yin */ 6505fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accKeyboardShortcut(VARIANT varChild, BSTR *pszKeyboardShortcut) 6515fdc4257SSteve Yin { 6525fdc4257SSteve Yin 6535fdc4257SSteve Yin CHECK_ENABLE_INF 6545fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 6555fdc4257SSteve Yin 6565fdc4257SSteve Yin ISDESTROY() 6575fdc4257SSteve Yin // #CHECK# 6585fdc4257SSteve Yin if(pszKeyboardShortcut == NULL) 6595fdc4257SSteve Yin { 6605fdc4257SSteve Yin return E_INVALIDARG; 6615fdc4257SSteve Yin } 6625fdc4257SSteve Yin 6635fdc4257SSteve Yin if(varChild.vt==VT_I4) 6645fdc4257SSteve Yin { 6655fdc4257SSteve Yin if(varChild.lVal == CHILDID_SELF) 6665fdc4257SSteve Yin { 6675fdc4257SSteve Yin if( pUNOInterface ) 6685fdc4257SSteve Yin { 6695fdc4257SSteve Yin Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext(); 6705fdc4257SSteve Yin if( !pRContext.is() ) 6715fdc4257SSteve Yin return S_FALSE; 6725fdc4257SSteve Yin 6735fdc4257SSteve Yin Reference<XAccessibleAction> pRXI(pRContext,UNO_QUERY); 6745fdc4257SSteve Yin 6755fdc4257SSteve Yin OLECHAR wString[64]={0}; 6765fdc4257SSteve Yin 6775fdc4257SSteve Yin if( pRXI.is() && pRXI->getAccessibleActionCount() >= 1) 6785fdc4257SSteve Yin { 6795fdc4257SSteve Yin Reference< XAccessibleKeyBinding > binding = pRXI->getAccessibleActionKeyBinding(0); 6805fdc4257SSteve Yin if( binding.is() ) 6815fdc4257SSteve Yin { 6825fdc4257SSteve Yin long nCount = binding->getAccessibleKeyBindingCount(); 6835fdc4257SSteve Yin if(nCount >= 1) 6845fdc4257SSteve Yin { 6855fdc4257SSteve Yin CAccAction::GetkeyBindingStrByXkeyBinding( binding->getAccessibleKeyBinding(0),wString ); 6865fdc4257SSteve Yin } 6875fdc4257SSteve Yin } 6885fdc4257SSteve Yin } 6895fdc4257SSteve Yin if(wString[0] == 0) 6905fdc4257SSteve Yin { 6915fdc4257SSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet(); 6925fdc4257SSteve Yin if(!pRrelationSet.is()) 6935fdc4257SSteve Yin { 6945fdc4257SSteve Yin return S_FALSE; 6955fdc4257SSteve Yin } 6965fdc4257SSteve Yin 6975fdc4257SSteve Yin long nRelCount = pRrelationSet->getRelationCount(); 6985fdc4257SSteve Yin 6995fdc4257SSteve Yin // Modified by Steve Yin, for SODC_1552 7005fdc4257SSteve Yin if( /*nRelCount <= 0 &&*/ m_iRole == ROLE_SYSTEM_TEXT ) 7015fdc4257SSteve Yin { 7025fdc4257SSteve Yin VARIANT varParentRole; 7035fdc4257SSteve Yin VariantInit( &varParentRole ); 7045fdc4257SSteve Yin 7055fdc4257SSteve Yin m_pIParent->get_accRole(varChild, &varParentRole); 7065fdc4257SSteve Yin 707*d4e90fa5SJohn Bampton if( m_pIParent && varParentRole.lVal == ROLE_SYSTEM_COMBOBOX ) // edit in comboBox 7085fdc4257SSteve Yin { 7095fdc4257SSteve Yin m_pIParent->get_accKeyboardShortcut(varChild, pszKeyboardShortcut); 7105fdc4257SSteve Yin return S_OK; 7115fdc4257SSteve Yin } 7125fdc4257SSteve Yin } 7135fdc4257SSteve Yin 7145fdc4257SSteve Yin AccessibleRelation *paccRelation = NULL; 7155fdc4257SSteve Yin AccessibleRelation accRelation; 7165fdc4257SSteve Yin for(int i=0; i<nRelCount ; i++) 7175fdc4257SSteve Yin { 7185fdc4257SSteve Yin if( pRrelationSet->getRelation(i).RelationType == 6 ) 7195fdc4257SSteve Yin { 7205fdc4257SSteve Yin accRelation = pRrelationSet->getRelation(i); 7215fdc4257SSteve Yin paccRelation = &accRelation; 7225fdc4257SSteve Yin } 7235fdc4257SSteve Yin } 7245fdc4257SSteve Yin 7255fdc4257SSteve Yin if(paccRelation == NULL) 7265fdc4257SSteve Yin return S_FALSE; 7275fdc4257SSteve Yin 7285fdc4257SSteve Yin Sequence< Reference< XInterface > > xTargets = paccRelation->TargetSet; 7295fdc4257SSteve Yin Reference<XInterface> pRAcc = xTargets[0]; 7305fdc4257SSteve Yin 7315fdc4257SSteve Yin XAccessible* pXAcc = (XAccessible*)pRAcc.get(); 7325fdc4257SSteve Yin 7335fdc4257SSteve Yin Reference<XAccessibleContext> pRLebelContext = pXAcc->getAccessibleContext(); 7345fdc4257SSteve Yin if(!pRLebelContext.is()) 7355fdc4257SSteve Yin return S_FALSE; 7365fdc4257SSteve Yin 7375fdc4257SSteve Yin pRrelationSet = pRLebelContext->getAccessibleRelationSet(); 7385fdc4257SSteve Yin nRelCount = pRrelationSet->getRelationCount(); 7395fdc4257SSteve Yin 7405fdc4257SSteve Yin paccRelation = NULL; 7415fdc4257SSteve Yin for(int j=0; j<nRelCount ; j++) 7425fdc4257SSteve Yin { 7435fdc4257SSteve Yin if( pRrelationSet->getRelation(j).RelationType == 5 ) 7445fdc4257SSteve Yin { 7455fdc4257SSteve Yin accRelation = pRrelationSet->getRelation(j); 7465fdc4257SSteve Yin paccRelation = &accRelation; 7475fdc4257SSteve Yin } 7485fdc4257SSteve Yin } 7495fdc4257SSteve Yin 7505fdc4257SSteve Yin if(paccRelation) 7515fdc4257SSteve Yin { 7525fdc4257SSteve Yin xTargets = paccRelation->TargetSet; 7535fdc4257SSteve Yin pRAcc = xTargets[0]; 7545fdc4257SSteve Yin if(pUNOInterface != (XAccessible*)pRAcc.get()) 7555fdc4257SSteve Yin return S_FALSE; 7565fdc4257SSteve Yin } 7575fdc4257SSteve Yin 7585fdc4257SSteve Yin Reference<XAccessibleExtendedComponent> pRXIE(pRLebelContext,UNO_QUERY); 7595fdc4257SSteve Yin if(!pRXIE.is()) 7605fdc4257SSteve Yin return S_FALSE; 7615fdc4257SSteve Yin 7625fdc4257SSteve Yin ::rtl::OUString ouStr = pRXIE->getTitledBorderText(); 7635fdc4257SSteve Yin WCHAR key[2] = {NULL}; 7645fdc4257SSteve Yin GetMnemonicChar(ouStr, key); 7655fdc4257SSteve Yin if(key[0] != 0) 7665fdc4257SSteve Yin { 7675fdc4257SSteve Yin wcscat(wString, L"Alt+"); 7685fdc4257SSteve Yin wcscat(wString, key); 7695fdc4257SSteve Yin } 7705fdc4257SSteve Yin else 7715fdc4257SSteve Yin return S_FALSE; 7725fdc4257SSteve Yin } 7735fdc4257SSteve Yin 7745fdc4257SSteve Yin SAFE_SYSFREESTRING(*pszKeyboardShortcut); 7755fdc4257SSteve Yin *pszKeyboardShortcut = SysAllocString(wString); 7765fdc4257SSteve Yin 7775fdc4257SSteve Yin return S_OK; 7785fdc4257SSteve Yin } 7795fdc4257SSteve Yin else 7805fdc4257SSteve Yin { 7815fdc4257SSteve Yin return S_FALSE; 7825fdc4257SSteve Yin } 7835fdc4257SSteve Yin } 7845fdc4257SSteve Yin 7855fdc4257SSteve Yin long lVal = varChild.lVal; 7865fdc4257SSteve Yin varChild.lVal = CHILDID_SELF; 7875fdc4257SSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 7885fdc4257SSteve Yin if(!pChild) 7895fdc4257SSteve Yin return E_FAIL; 7905fdc4257SSteve Yin 7915fdc4257SSteve Yin return pChild->get_accKeyboardShortcut(varChild,pszKeyboardShortcut); 7925fdc4257SSteve Yin } 7935fdc4257SSteve Yin return S_FALSE; 7945fdc4257SSteve Yin 7955fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 7965fdc4257SSteve Yin } 7975fdc4257SSteve Yin 7985fdc4257SSteve Yin /** 7995fdc4257SSteve Yin * Returns the current focused child to AT. 8005fdc4257SSteve Yin * @param pvarChild, [in,out] vt member of pvarChild must be VT_I4,and lVal member stores the child ID, 8015fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 8025fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 8035fdc4257SSteve Yin */ 8045fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accFocus(VARIANT *pvarChild) 8055fdc4257SSteve Yin { 8065fdc4257SSteve Yin 8075fdc4257SSteve Yin CHECK_ENABLE_INF 8085fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 8095fdc4257SSteve Yin ISDESTROY() 8105fdc4257SSteve Yin // #CHECK# 8115fdc4257SSteve Yin if(pvarChild == NULL) 8125fdc4257SSteve Yin { 8135fdc4257SSteve Yin return E_INVALIDARG; 8145fdc4257SSteve Yin } 8155fdc4257SSteve Yin if( m_dFocusChildID==UACC_NO_FOCUS ) 8165fdc4257SSteve Yin { 8175fdc4257SSteve Yin pvarChild->vt = VT_EMPTY;//no focus on the object and its children 8185fdc4257SSteve Yin return S_OK; 8195fdc4257SSteve Yin } 8205fdc4257SSteve Yin //if the descendant of current object has focus indicated by m_dFocusChildID, return the IDispatch of this focused object 8215fdc4257SSteve Yin else 8225fdc4257SSteve Yin { 8235fdc4257SSteve Yin IMAccessible* pIMAcc = NULL; 8245fdc4257SSteve Yin g_pAgent->GetIAccessibleFromResID(m_dFocusChildID,&pIMAcc); 8255fdc4257SSteve Yin pIMAcc->AddRef(); 8265fdc4257SSteve Yin pvarChild->vt = VT_DISPATCH; 8275fdc4257SSteve Yin pvarChild->pdispVal = pIMAcc; 8285fdc4257SSteve Yin 8295fdc4257SSteve Yin } 8305fdc4257SSteve Yin return S_OK; 8315fdc4257SSteve Yin 8325fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 8335fdc4257SSteve Yin } 8345fdc4257SSteve Yin 8355fdc4257SSteve Yin /** 8365fdc4257SSteve Yin * Returns the selection of the current COM object to AT. 8375fdc4257SSteve Yin * @param pvarChildren,[in,out] 8385fdc4257SSteve Yin * if selection num is 0,return VT_EMPTY for vt, 8395fdc4257SSteve Yin * if selection num is 1,return VT_I4 for vt,and child index for lVal 8405fdc4257SSteve Yin * if selection num >1,return VT_UNKNOWN for vt, and IEnumVariant* for punkVal 8415fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 8425fdc4257SSteve Yin */ 8435fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accSelection(VARIANT *pvarChildren) 8445fdc4257SSteve Yin { 8455fdc4257SSteve Yin 8465fdc4257SSteve Yin CHECK_ENABLE_INF 8475fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 8485fdc4257SSteve Yin ISDESTROY() 8495fdc4257SSteve Yin // #CHECK# 8505fdc4257SSteve Yin if(pvarChildren == NULL) 8515fdc4257SSteve Yin { 8525fdc4257SSteve Yin return E_INVALIDARG; 8535fdc4257SSteve Yin } 8545fdc4257SSteve Yin switch(m_pEnumVar->GetCountOfElements()) 8555fdc4257SSteve Yin { 8565fdc4257SSteve Yin case 0: 8575fdc4257SSteve Yin pvarChildren->vt = VT_EMPTY; 8585fdc4257SSteve Yin break; 8595fdc4257SSteve Yin case 1: 8605fdc4257SSteve Yin VARIANT varTmp[1]; 8615fdc4257SSteve Yin ULONG count; 8625fdc4257SSteve Yin VariantInit(&varTmp[0]); 8635fdc4257SSteve Yin m_pEnumVar->Next(1,varTmp,&count); 8645fdc4257SSteve Yin if(count!=1) 8655fdc4257SSteve Yin return S_FALSE; 8665fdc4257SSteve Yin pvarChildren->vt = VT_I4; 8675fdc4257SSteve Yin pvarChildren->lVal = varTmp[0].lVal; 8685fdc4257SSteve Yin VariantClear(&varTmp[0]); 8695fdc4257SSteve Yin m_pEnumVar->Reset(); 8705fdc4257SSteve Yin break; 8715fdc4257SSteve Yin default: 8725fdc4257SSteve Yin pvarChildren->vt = VT_UNKNOWN; 8735fdc4257SSteve Yin m_pEnumVar->AddRef(); 8745fdc4257SSteve Yin pvarChildren->punkVal = m_pEnumVar; 8755fdc4257SSteve Yin break; 8765fdc4257SSteve Yin } 8775fdc4257SSteve Yin return S_OK; 8785fdc4257SSteve Yin 8795fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 8805fdc4257SSteve Yin } 8815fdc4257SSteve Yin 8825fdc4257SSteve Yin /** 8835fdc4257SSteve Yin * Returns the location of the current COM object self or its one child to AT. 8845fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 8855fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 8865fdc4257SSteve Yin * @param pxLeft, [in,out] use to return the x-coordination of the proper object. 8875fdc4257SSteve Yin * @param pyTop, [in,out] use to return the y-coordination of the proper object. 8885fdc4257SSteve Yin * @param pcxWidth, [in,out] use to return the x-coordination width of the proper object. 8895fdc4257SSteve Yin * @param pcyHeight, [in,out] use to return the y-coordination height of the proper object. 8905fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 8915fdc4257SSteve Yin */ 8925fdc4257SSteve Yin STDMETHODIMP CMAccessible::accLocation(long *pxLeft, long *pyTop, long *pcxWidth, long *pcyHeight, VARIANT varChild) 8935fdc4257SSteve Yin { 8945fdc4257SSteve Yin 8955fdc4257SSteve Yin CHECK_ENABLE_INF 8965fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 8975fdc4257SSteve Yin ISDESTROY() 8985fdc4257SSteve Yin // #CHECK# 8995fdc4257SSteve Yin if(pxLeft == NULL || pyTop == NULL || pcxWidth == NULL || pcyHeight == NULL) 9005fdc4257SSteve Yin { 9015fdc4257SSteve Yin return E_INVALIDARG; 9025fdc4257SSteve Yin } 9035fdc4257SSteve Yin 9045fdc4257SSteve Yin if(varChild.vt==VT_I4) 9055fdc4257SSteve Yin { 9065fdc4257SSteve Yin if(varChild.lVal==CHILDID_SELF) 9075fdc4257SSteve Yin { 9085fdc4257SSteve Yin 9095fdc4257SSteve Yin if(pUNOInterface) 9105fdc4257SSteve Yin { 9115fdc4257SSteve Yin Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext(); 9125fdc4257SSteve Yin if( !pRContext.is() ) 9135fdc4257SSteve Yin return S_FALSE; 9145fdc4257SSteve Yin Reference< XAccessibleComponent > pRComponent(pRContext,UNO_QUERY); 9155fdc4257SSteve Yin if( !pRComponent.is() ) 9165fdc4257SSteve Yin return S_FALSE; 9175fdc4257SSteve Yin 9185fdc4257SSteve Yin ::com::sun::star::awt::Point pCPoint = pRComponent->getLocationOnScreen(); 9195fdc4257SSteve Yin ::com::sun::star::awt::Size pCSize = pRComponent->getSize(); 9205fdc4257SSteve Yin *pxLeft = pCPoint.X; 9215fdc4257SSteve Yin *pyTop = pCPoint.Y; 9225fdc4257SSteve Yin *pcxWidth = pCSize.Width; 9235fdc4257SSteve Yin *pcyHeight = pCSize.Height; 9245fdc4257SSteve Yin return S_OK; 9255fdc4257SSteve Yin } 9265fdc4257SSteve Yin else 9275fdc4257SSteve Yin { 9285fdc4257SSteve Yin *pxLeft = m_sLocation.m_dLeft; 9295fdc4257SSteve Yin *pyTop = m_sLocation.m_dTop; 9305fdc4257SSteve Yin *pcxWidth = m_sLocation.m_dWidth; 9315fdc4257SSteve Yin *pcyHeight = m_sLocation.m_dHeight; 9325fdc4257SSteve Yin return S_OK; 9335fdc4257SSteve Yin } 9345fdc4257SSteve Yin } 9355fdc4257SSteve Yin 9365fdc4257SSteve Yin } 9375fdc4257SSteve Yin return S_FALSE; 9385fdc4257SSteve Yin 9395fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 9405fdc4257SSteve Yin } 9415fdc4257SSteve Yin 9425fdc4257SSteve Yin /** 9435fdc4257SSteve Yin * Returns the current focused child to AT. 9445fdc4257SSteve Yin * @param navDir, the direction flag of the navigation. 9455fdc4257SSteve Yin * @param varStart, the start child id of this navigation action. 9465fdc4257SSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 9475fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 9485fdc4257SSteve Yin */ 9495fdc4257SSteve Yin STDMETHODIMP CMAccessible::accNavigate(long navDir, VARIANT varStart, VARIANT *pvarEndUpAt) 9505fdc4257SSteve Yin { 9515fdc4257SSteve Yin 9525fdc4257SSteve Yin CHECK_ENABLE_INF 9535fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 9545fdc4257SSteve Yin ISDESTROY() 9555fdc4257SSteve Yin // #CHECK# 9565fdc4257SSteve Yin if(pvarEndUpAt == NULL) 9575fdc4257SSteve Yin { 9585fdc4257SSteve Yin return E_INVALIDARG; 9595fdc4257SSteve Yin } 9605fdc4257SSteve Yin HRESULT ret = E_FAIL; 9615fdc4257SSteve Yin switch (navDir) 9625fdc4257SSteve Yin { 9635fdc4257SSteve Yin case NAVDIR_FIRSTCHILD: 9645fdc4257SSteve Yin ret = GetFirstChild(varStart,pvarEndUpAt); 9655fdc4257SSteve Yin break; 9665fdc4257SSteve Yin case NAVDIR_LASTCHILD: 9675fdc4257SSteve Yin ret = GetLastChild(varStart,pvarEndUpAt); 9685fdc4257SSteve Yin break; 9695fdc4257SSteve Yin case NAVDIR_NEXT: 9705fdc4257SSteve Yin ret = GetNextSibling(varStart,pvarEndUpAt); 9715fdc4257SSteve Yin break; 9725fdc4257SSteve Yin case NAVDIR_PREVIOUS: 9735fdc4257SSteve Yin ret = GetPreSibling(varStart,pvarEndUpAt); 9745fdc4257SSteve Yin break; 9755fdc4257SSteve Yin case NAVDIR_DOWN://do not implement temporarily 9765fdc4257SSteve Yin break; 9775fdc4257SSteve Yin case NAVDIR_UP://do not implement temporarily 9785fdc4257SSteve Yin break; 9795fdc4257SSteve Yin case NAVDIR_LEFT://do not implement temporarily 9805fdc4257SSteve Yin break; 9815fdc4257SSteve Yin case NAVDIR_RIGHT://do not implement temporarily 9825fdc4257SSteve Yin break; 9835fdc4257SSteve Yin default: 9845fdc4257SSteve Yin break; 9855fdc4257SSteve Yin }; 9865fdc4257SSteve Yin return ret; 9875fdc4257SSteve Yin 9885fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 9895fdc4257SSteve Yin } 9905fdc4257SSteve Yin 9915fdc4257SSteve Yin STDMETHODIMP CMAccessible::accHitTest(long xLeft, long yTop, VARIANT *pvarChild) 9925fdc4257SSteve Yin { 9935fdc4257SSteve Yin 9945fdc4257SSteve Yin CHECK_ENABLE_INF 9955fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 9965fdc4257SSteve Yin ISDESTROY() 9975fdc4257SSteve Yin // #CHECK# 9985fdc4257SSteve Yin if(pvarChild == NULL) 9995fdc4257SSteve Yin { 10005fdc4257SSteve Yin return E_INVALIDARG; 10015fdc4257SSteve Yin } 10025fdc4257SSteve Yin long x, y, w, h; 10035fdc4257SSteve Yin VARIANT varSelf; 10045fdc4257SSteve Yin VariantInit(&varSelf); 10055fdc4257SSteve Yin varSelf.vt = VT_I4; 10065fdc4257SSteve Yin varSelf.lVal = CHILDID_SELF; 10075fdc4257SSteve Yin accLocation(&x,&y,&w,&h,varSelf); 10085fdc4257SSteve Yin if( (x < xLeft && (x + w) >xLeft) && (y < yTop && (y + h) >yTop) ) 10095fdc4257SSteve Yin { 10105fdc4257SSteve Yin int i, nCount; 10115fdc4257SSteve Yin pvarChild->vt = VT_EMPTY; 10125fdc4257SSteve Yin Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface); 10135fdc4257SSteve Yin nCount = pRContext->getAccessibleChildCount(); 10145fdc4257SSteve Yin if(nCount > 256) 10155fdc4257SSteve Yin return E_FAIL; 10165fdc4257SSteve Yin IMAccessible* child = NULL; 10175fdc4257SSteve Yin for( i = 0; i<nCount; i++) 10185fdc4257SSteve Yin { 10195fdc4257SSteve Yin 10205fdc4257SSteve Yin child = GetChildInterface(i + 1); 10215fdc4257SSteve Yin if(child && child->accHitTest(xLeft,yTop,pvarChild) == S_OK) 10225fdc4257SSteve Yin break; 10235fdc4257SSteve Yin } 10245fdc4257SSteve Yin 10255fdc4257SSteve Yin if(pvarChild->vt == VT_DISPATCH) 10265fdc4257SSteve Yin return S_OK; 10275fdc4257SSteve Yin 10285fdc4257SSteve Yin if( i < nCount) 10295fdc4257SSteve Yin { 10305fdc4257SSteve Yin pvarChild->vt = VT_DISPATCH; 10315fdc4257SSteve Yin pvarChild->pdispVal = child; 10325fdc4257SSteve Yin child->AddRef(); 10335fdc4257SSteve Yin } 10345fdc4257SSteve Yin else 10355fdc4257SSteve Yin { 10365fdc4257SSteve Yin pvarChild->vt = VT_I4; 10375fdc4257SSteve Yin pvarChild->lVal = CHILDID_SELF; 10385fdc4257SSteve Yin } 10395fdc4257SSteve Yin return S_OK; 10405fdc4257SSteve Yin } 10415fdc4257SSteve Yin return S_FALSE; 10425fdc4257SSteve Yin 10435fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 10445fdc4257SSteve Yin } 10455fdc4257SSteve Yin 10465fdc4257SSteve Yin /** 10475fdc4257SSteve Yin * Get The other Interface from CMAccessible. 10485fdc4257SSteve Yin * @param guidService, must be IID_IAccessible here. 10495fdc4257SSteve Yin * @param riid, the IID interface . 10505fdc4257SSteve Yin * @return S_OK if successful and S_FALSE if failure. 10515fdc4257SSteve Yin */ 10525fdc4257SSteve Yin STDMETHODIMP CMAccessible::QueryService(REFGUID guidService, REFIID riid, void** ppvObject) 10535fdc4257SSteve Yin { 10545fdc4257SSteve Yin if( InlineIsEqualGUID(guidService, IID_IAccessible) ) 10555fdc4257SSteve Yin return QueryInterface(riid, ppvObject); 10565fdc4257SSteve Yin return S_FALSE; 10575fdc4257SSteve Yin } 10585fdc4257SSteve Yin 10595fdc4257SSteve Yin /** 10605fdc4257SSteve Yin * Set the accessible name of the current COM object self or its one child from UNO. 10615fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 10625fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 10635fdc4257SSteve Yin * @param szName, the name used to set the name of the proper object. 10645fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 10655fdc4257SSteve Yin */ 10665fdc4257SSteve Yin STDMETHODIMP CMAccessible::put_accName(VARIANT varChild, BSTR szName) 10675fdc4257SSteve Yin { 10685fdc4257SSteve Yin 10695fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 10705fdc4257SSteve Yin ISDESTROY() 10715fdc4257SSteve Yin if(varChild.vt==VT_I4) 10725fdc4257SSteve Yin { 10735fdc4257SSteve Yin if(varChild.lVal==CHILDID_SELF) 10745fdc4257SSteve Yin { 10755fdc4257SSteve Yin SAFE_SYSFREESTRING(m_pszName); 10765fdc4257SSteve Yin m_pszName=SysAllocString(szName); 10775fdc4257SSteve Yin return S_OK; 10785fdc4257SSteve Yin } 10795fdc4257SSteve Yin 10805fdc4257SSteve Yin long lVal = varChild.lVal; 10815fdc4257SSteve Yin varChild.lVal = CHILDID_SELF; 10825fdc4257SSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 10835fdc4257SSteve Yin if(!pChild) 10845fdc4257SSteve Yin return E_FAIL; 10855fdc4257SSteve Yin return pChild->put_accName(varChild,szName); 10865fdc4257SSteve Yin } 10875fdc4257SSteve Yin return E_FAIL; 10885fdc4257SSteve Yin 10895fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 10905fdc4257SSteve Yin } 10915fdc4257SSteve Yin 10925fdc4257SSteve Yin /** 10935fdc4257SSteve Yin * Set the accessible value of the current COM object self or its one child from UNO. 10945fdc4257SSteve Yin * @param varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID, 10955fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self. 10965fdc4257SSteve Yin * @param szValue, the value used to set the value of the proper object. 10975fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 10985fdc4257SSteve Yin */ 10995fdc4257SSteve Yin STDMETHODIMP CMAccessible::put_accValue(VARIANT varChild, BSTR szValue) 11005fdc4257SSteve Yin { 11015fdc4257SSteve Yin 11025fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 11035fdc4257SSteve Yin ISDESTROY() 11045fdc4257SSteve Yin if(varChild.vt==VT_I4) 11055fdc4257SSteve Yin { 11065fdc4257SSteve Yin if(varChild.lVal==CHILDID_SELF) 11075fdc4257SSteve Yin { 11085fdc4257SSteve Yin SysAllocString(m_pszValue); 11095fdc4257SSteve Yin m_pszValue=SysAllocString(szValue); 11105fdc4257SSteve Yin return S_OK; 11115fdc4257SSteve Yin } 11125fdc4257SSteve Yin 11135fdc4257SSteve Yin long lVal = varChild.lVal; 11145fdc4257SSteve Yin varChild.lVal = CHILDID_SELF; 11155fdc4257SSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 11165fdc4257SSteve Yin if(!pChild) 11175fdc4257SSteve Yin return E_FAIL; 11185fdc4257SSteve Yin return pChild->put_accValue(varChild,szValue); 11195fdc4257SSteve Yin } 11205fdc4257SSteve Yin return E_FAIL; 11215fdc4257SSteve Yin 11225fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 11235fdc4257SSteve Yin } 11245fdc4257SSteve Yin 11255fdc4257SSteve Yin /** 11265fdc4257SSteve Yin * Set the accessible name of the current COM object self from UNO. 11275fdc4257SSteve Yin * @param pszName, the name value used to set the name of the current object. 11285fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11295fdc4257SSteve Yin */ 11305fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccName(const OLECHAR __RPC_FAR *pszName) 11315fdc4257SSteve Yin { 11325fdc4257SSteve Yin 11335fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 11345fdc4257SSteve Yin ISDESTROY() 11355fdc4257SSteve Yin // #CHECK# 11365fdc4257SSteve Yin if(pszName == NULL) 11375fdc4257SSteve Yin { 11385fdc4257SSteve Yin return E_INVALIDARG; 11395fdc4257SSteve Yin } 11405fdc4257SSteve Yin 11415fdc4257SSteve Yin SAFE_SYSFREESTRING(m_pszName);//?? 11425fdc4257SSteve Yin m_pszName = SysAllocString(pszName); 11435fdc4257SSteve Yin if(m_pszName==NULL) 11445fdc4257SSteve Yin return E_FAIL; 11455fdc4257SSteve Yin return S_OK; 11465fdc4257SSteve Yin 11475fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 11485fdc4257SSteve Yin } 11495fdc4257SSteve Yin 11505fdc4257SSteve Yin /** 11515fdc4257SSteve Yin * Set the accessible role of the current COM object self from UNO. 11525fdc4257SSteve Yin * @param pRole, the role value used to set the role of the current object. 11535fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11545fdc4257SSteve Yin */ 11555fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccRole(unsigned short pRole) 11565fdc4257SSteve Yin { 11575fdc4257SSteve Yin m_iRole = pRole; 11585fdc4257SSteve Yin return S_OK; 11595fdc4257SSteve Yin } 11605fdc4257SSteve Yin 11615fdc4257SSteve Yin /** 11625fdc4257SSteve Yin * Add one state into the current state set for the current COM object from UNO. 11635fdc4257SSteve Yin * @param pXSate, the state used to set the name of the current object. 11645fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11655fdc4257SSteve Yin */ 11665fdc4257SSteve Yin STDMETHODIMP CMAccessible::DecreaseState(DWORD pXSate) 11675fdc4257SSteve Yin { 11685fdc4257SSteve Yin m_dState &= (~pXSate); 11695fdc4257SSteve Yin return S_OK; 11705fdc4257SSteve Yin } 11715fdc4257SSteve Yin 11725fdc4257SSteve Yin /** 11735fdc4257SSteve Yin * Delete one state into the current state set for the current COM object from UNO. 11745fdc4257SSteve Yin * @param pXSate, the state used to set the name of the current object. 11755fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11765fdc4257SSteve Yin */ 11775fdc4257SSteve Yin STDMETHODIMP CMAccessible::IncreaseState(DWORD pXSate) 11785fdc4257SSteve Yin { 11795fdc4257SSteve Yin m_dState |= pXSate; 11805fdc4257SSteve Yin return S_OK; 11815fdc4257SSteve Yin } 11825fdc4257SSteve Yin 11835fdc4257SSteve Yin /** 11845fdc4257SSteve Yin * Set state into the current state set for the current COM object from UNO. 11855fdc4257SSteve Yin * @param pXSate, the state used to set the name of the current object. 11865fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 11875fdc4257SSteve Yin */ 11885fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetState(DWORD pXSate) 11895fdc4257SSteve Yin { 11905fdc4257SSteve Yin m_dState = pXSate; 11915fdc4257SSteve Yin return S_OK; 11925fdc4257SSteve Yin } 11935fdc4257SSteve Yin 11945fdc4257SSteve Yin 11955fdc4257SSteve Yin 11965fdc4257SSteve Yin /** 11975fdc4257SSteve Yin * Set the accessible description of the current COM object self from UNO. 11985fdc4257SSteve Yin * @param pszDescription, the name used to set the description of the current object. 11995fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 12005fdc4257SSteve Yin */ 12015fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccDescription(const OLECHAR __RPC_FAR *pszDescription) 12025fdc4257SSteve Yin { 12035fdc4257SSteve Yin 12045fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 12055fdc4257SSteve Yin ISDESTROY() 12065fdc4257SSteve Yin // #CHECK# 12075fdc4257SSteve Yin if(pszDescription == NULL) 12085fdc4257SSteve Yin { 12095fdc4257SSteve Yin return E_INVALIDARG; 12105fdc4257SSteve Yin } 12115fdc4257SSteve Yin 12125fdc4257SSteve Yin SAFE_SYSFREESTRING(m_pszDescription); 12135fdc4257SSteve Yin m_pszDescription = SysAllocString(pszDescription); 12145fdc4257SSteve Yin 12155fdc4257SSteve Yin if(m_pszDescription==NULL) 12165fdc4257SSteve Yin return E_FAIL; 12175fdc4257SSteve Yin return S_OK; 12185fdc4257SSteve Yin 12195fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 12205fdc4257SSteve Yin } 12215fdc4257SSteve Yin 12225fdc4257SSteve Yin /** 12235fdc4257SSteve Yin * Set the accessible value of the current COM object self from UNO. 12245fdc4257SSteve Yin * @param pszAccValue, the name used to set the value of the current object. 12255fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 12265fdc4257SSteve Yin */ 12275fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccValue(const OLECHAR __RPC_FAR *pszAccValue) 12285fdc4257SSteve Yin { 12295fdc4257SSteve Yin 12305fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 12315fdc4257SSteve Yin ISDESTROY() 12325fdc4257SSteve Yin // #CHECK# 12335fdc4257SSteve Yin if(pszAccValue == NULL) 12345fdc4257SSteve Yin { 12355fdc4257SSteve Yin return E_INVALIDARG; 12365fdc4257SSteve Yin } 12375fdc4257SSteve Yin SAFE_SYSFREESTRING(m_pszValue); 12385fdc4257SSteve Yin m_pszValue = SysAllocString(pszAccValue); 12395fdc4257SSteve Yin if(m_pszValue==NULL) 12405fdc4257SSteve Yin return E_FAIL; 12415fdc4257SSteve Yin return S_OK; 12425fdc4257SSteve Yin 12435fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 12445fdc4257SSteve Yin } 12455fdc4257SSteve Yin 12465fdc4257SSteve Yin /** 12475fdc4257SSteve Yin * Set the HWND value of the current COM object self from UNO. It should set the parent IAccessible 12485fdc4257SSteve Yin * Object through the method AccessibleObjectFromWindow(...). 12495fdc4257SSteve Yin * @param hwnd, the HWND used to set the value of the current object. 12505fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 12515fdc4257SSteve Yin */ 12525fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccWindowHandle(HWND hwnd) 12535fdc4257SSteve Yin { 12545fdc4257SSteve Yin 12555fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 12565fdc4257SSteve Yin ISDESTROY() 12575fdc4257SSteve Yin m_hwnd = hwnd; 12585fdc4257SSteve Yin return S_OK; 12595fdc4257SSteve Yin 12605fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 12615fdc4257SSteve Yin } 12625fdc4257SSteve Yin 12635fdc4257SSteve Yin /** 12645fdc4257SSteve Yin * Set accessible focus by specifying child ID 12655fdc4257SSteve Yin * @param dChildID, the child id identifies the focus child. 12665fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 12675fdc4257SSteve Yin */ 12685fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccFocus(long dChildID) 12695fdc4257SSteve Yin { 12705fdc4257SSteve Yin 12715fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 12725fdc4257SSteve Yin ISDESTROY() 12735fdc4257SSteve Yin 12745fdc4257SSteve Yin if(dChildID==CHILDID_SELF) 12755fdc4257SSteve Yin { 12765fdc4257SSteve Yin if(m_pIParent) 12775fdc4257SSteve Yin { 12785fdc4257SSteve Yin m_pIParent->Put_XAccFocus(m_dChildID); 12795fdc4257SSteve Yin } 12805fdc4257SSteve Yin } 12815fdc4257SSteve Yin else 12825fdc4257SSteve Yin { 12835fdc4257SSteve Yin m_dFocusChildID = dChildID; 12845fdc4257SSteve Yin //traverse all ancestors to set the focused child ID so that when the get_accFocus is called on 12855fdc4257SSteve Yin //any of the ancestors, this id can be used to get the IAccessible of focused object. 12865fdc4257SSteve Yin if(m_pIParent) 12875fdc4257SSteve Yin { 12885fdc4257SSteve Yin m_pIParent->Put_XAccFocus(dChildID); 12895fdc4257SSteve Yin } 12905fdc4257SSteve Yin } 12915fdc4257SSteve Yin return S_OK; 12925fdc4257SSteve Yin 12935fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 12945fdc4257SSteve Yin } 12955fdc4257SSteve Yin 12965fdc4257SSteve Yin /** 12975fdc4257SSteve Yin *Set accessible object location for the current COM object 12985fdc4257SSteve Yin * @param sLocation, the location of the current object. 12995fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 13005fdc4257SSteve Yin */ 13015fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccLocation(const Location sLocation) 13025fdc4257SSteve Yin { 13035fdc4257SSteve Yin 13045fdc4257SSteve Yin this->m_sLocation = sLocation; 13055fdc4257SSteve Yin return S_OK; 13065fdc4257SSteve Yin } 13075fdc4257SSteve Yin 13085fdc4257SSteve Yin /** 13095fdc4257SSteve Yin * Set accessible parent object for the current COM object if 13105fdc4257SSteve Yin * the current object is a child of some COM object 13115fdc4257SSteve Yin * @param pIParent, the parent of the current object. 13125fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 13135fdc4257SSteve Yin */ 13145fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccParent(IMAccessible __RPC_FAR *pIParent) 13155fdc4257SSteve Yin { 13165fdc4257SSteve Yin this->m_pIParent = pIParent; 13175fdc4257SSteve Yin 13185fdc4257SSteve Yin if(pIParent) 13195fdc4257SSteve Yin m_pIParent->AddRef(); 13205fdc4257SSteve Yin 13215fdc4257SSteve Yin return S_OK; 13225fdc4257SSteve Yin } 13235fdc4257SSteve Yin 13245fdc4257SSteve Yin /** 13255fdc4257SSteve Yin * Set unique child id to COM 13265fdc4257SSteve Yin * @param dChildID, the id of the current object. 13275fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 13285fdc4257SSteve Yin */ 13295fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccChildID(long dChildID) 13305fdc4257SSteve Yin { 13315fdc4257SSteve Yin 13325fdc4257SSteve Yin this->m_dChildID = dChildID; 13335fdc4257SSteve Yin return S_OK; 13345fdc4257SSteve Yin } 13355fdc4257SSteve Yin 13365fdc4257SSteve Yin /** 13375fdc4257SSteve Yin * Set AccObjectManagerAgent object pointer to COM 13385fdc4257SSteve Yin * @param pAgent, the AccObjectManagerAgent point. 13395fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 13405fdc4257SSteve Yin */ 13415fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccAgent(long pAgent) 13425fdc4257SSteve Yin { 13435fdc4257SSteve Yin g_pAgent = (AccObjectManagerAgent*)pAgent; 13445fdc4257SSteve Yin return S_OK; 13455fdc4257SSteve Yin } 13465fdc4257SSteve Yin 13475fdc4257SSteve Yin /** 13485fdc4257SSteve Yin * When a UNO control disposing, it disposes its listeners, 13495fdc4257SSteve Yin * then notify AccObject in bridge management, then notify 13505fdc4257SSteve Yin * COM that the XAccessible is invalid,so set pUNOInterface as NULL 13515fdc4257SSteve Yin * @param isDestroy, true is it need to be destroyed. 13525fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 13535fdc4257SSteve Yin */ 13545fdc4257SSteve Yin STDMETHODIMP CMAccessible::NotifyDestroy(BOOL isDestroy) 13555fdc4257SSteve Yin { 13565fdc4257SSteve Yin 13575fdc4257SSteve Yin m_isDestroy = isDestroy; 13585fdc4257SSteve Yin pUNOInterface = NULL; 13595fdc4257SSteve Yin return S_OK; 13605fdc4257SSteve Yin } 13615fdc4257SSteve Yin 13625fdc4257SSteve Yin /** 13635fdc4257SSteve Yin *private methods that help implement public functions 13645fdc4257SSteve Yin */ 13655fdc4257SSteve Yin 13665fdc4257SSteve Yin /** 13675fdc4257SSteve Yin * Return child interface pointer by child ID,note: need to call AddRef() 13685fdc4257SSteve Yin * @param lChildID, specify child index,which AT(such as Inspect32) gives. 13695fdc4257SSteve Yin * @return IMAccessible*, pointer to the corresponding child object. 13705fdc4257SSteve Yin */ 13715fdc4257SSteve Yin IMAccessible* CMAccessible::GetChildInterface(long dChildID)//for test 13725fdc4257SSteve Yin { 13735fdc4257SSteve Yin 13745fdc4257SSteve Yin long dChildIndex = 0; 13755fdc4257SSteve Yin if(dChildID<0) 13765fdc4257SSteve Yin { 13775fdc4257SSteve Yin if(g_pAgent) 13785fdc4257SSteve Yin { 13795fdc4257SSteve Yin IMAccessible* pIMAcc = NULL; 13805fdc4257SSteve Yin g_pAgent->GetIAccessibleFromResID(dChildID,&pIMAcc); 13815fdc4257SSteve Yin return pIMAcc; 13825fdc4257SSteve Yin } 13835fdc4257SSteve Yin return NULL; 13845fdc4257SSteve Yin } 13855fdc4257SSteve Yin else 13865fdc4257SSteve Yin { 13875fdc4257SSteve Yin Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext(); 13885fdc4257SSteve Yin if( !pRContext.is() ) 13895fdc4257SSteve Yin return NULL; 13905fdc4257SSteve Yin 13915fdc4257SSteve Yin if(dChildID<1 || dChildID>pRContext->getAccessibleChildCount()) 13925fdc4257SSteve Yin return NULL; 13935fdc4257SSteve Yin 13945fdc4257SSteve Yin IAccessible* pChild = NULL; 13955fdc4257SSteve Yin Reference< XAccessible > pXChild = pRContext->getAccessibleChild(dChildID-1); 13965fdc4257SSteve Yin BOOL isGet = get_IAccessibleFromXAccessible((long)pXChild.get(),&pChild); 13975fdc4257SSteve Yin 13985fdc4257SSteve Yin if(!isGet) 13995fdc4257SSteve Yin { 14005fdc4257SSteve Yin g_pAgent->InsertAccObj(pXChild.get(),pUNOInterface,(long)m_hwnd); 14015fdc4257SSteve Yin isGet = get_IAccessibleFromXAccessible((long)pXChild.get(),&pChild); 14025fdc4257SSteve Yin } 14035fdc4257SSteve Yin 14045fdc4257SSteve Yin if(isGet) 14055fdc4257SSteve Yin { 14065fdc4257SSteve Yin IMAccessible* pIMAcc = (IMAccessible*)pChild; 14075fdc4257SSteve Yin return pIMAcc; 14085fdc4257SSteve Yin } 14095fdc4257SSteve Yin } 14105fdc4257SSteve Yin 14115fdc4257SSteve Yin return NULL; 14125fdc4257SSteve Yin } 14135fdc4257SSteve Yin 14145fdc4257SSteve Yin /** 14155fdc4257SSteve Yin * For List, tree and table,these roles belong to manage_decendant in UNO, 14165fdc4257SSteve Yin * need to process specifically when navigate 14175fdc4257SSteve Yin * @return BOOL, if it is decendantmanager, return true. 14185fdc4257SSteve Yin */ 14195fdc4257SSteve Yin BOOL CMAccessible::IsDecendantManage() 14205fdc4257SSteve Yin { 14215fdc4257SSteve Yin 14225fdc4257SSteve Yin return (m_iRole==ROLE_SYSTEM_LIST)||(m_iRole==ROLE_SYSTEM_OUTLINE)||(m_iRole==ROLE_SYSTEM_TABLE); 14235fdc4257SSteve Yin } 14245fdc4257SSteve Yin 14255fdc4257SSteve Yin /** 14265fdc4257SSteve Yin * for decendantmanager circumstance,provide child interface when navigate 14275fdc4257SSteve Yin * @param varCur, the current child. 14285fdc4257SSteve Yin * @param flags, the navigation direction. 14295fdc4257SSteve Yin * @return IMAccessible*, the child of the end up node. 14305fdc4257SSteve Yin */ 14315fdc4257SSteve Yin IMAccessible* CMAccessible::GetNavigateChildForDM(VARIANT varCur, short flags) 14325fdc4257SSteve Yin { 14335fdc4257SSteve Yin 14345fdc4257SSteve Yin XAccessibleContext* pXContext = GetContextByXAcc(pUNOInterface); 14355fdc4257SSteve Yin if(pXContext==NULL) 14365fdc4257SSteve Yin { 14375fdc4257SSteve Yin return NULL; 14385fdc4257SSteve Yin } 14395fdc4257SSteve Yin 14405fdc4257SSteve Yin int count = pXContext->getAccessibleChildCount(); 14415fdc4257SSteve Yin if(count<1) 14425fdc4257SSteve Yin { 14435fdc4257SSteve Yin return NULL; 14445fdc4257SSteve Yin } 14455fdc4257SSteve Yin 14465fdc4257SSteve Yin IMAccessible* pCurChild = NULL; 14475fdc4257SSteve Yin XAccessible* pChildXAcc = NULL; 14485fdc4257SSteve Yin Reference<XAccessible> pRChildXAcc; 14495fdc4257SSteve Yin XAccessibleContext* pChildContext = NULL; 14505fdc4257SSteve Yin int index = 0,delta=0; 14515fdc4257SSteve Yin switch(flags) 14525fdc4257SSteve Yin { 14535fdc4257SSteve Yin case DM_FIRSTCHILD: 14545fdc4257SSteve Yin pRChildXAcc = pXContext->getAccessibleChild(0); 14555fdc4257SSteve Yin break; 14565fdc4257SSteve Yin case DM_LASTCHILD: 14575fdc4257SSteve Yin pRChildXAcc = pXContext->getAccessibleChild(count-1); 14585fdc4257SSteve Yin break; 14595fdc4257SSteve Yin case DM_NEXTCHILD: 14605fdc4257SSteve Yin case DM_PREVCHILD: 14615fdc4257SSteve Yin pCurChild = GetChildInterface(varCur.lVal); 14625fdc4257SSteve Yin if(pCurChild==NULL) 14635fdc4257SSteve Yin { 14645fdc4257SSteve Yin return NULL; 14655fdc4257SSteve Yin } 14665fdc4257SSteve Yin pCurChild->GetUNOInterface((long*)&pChildXAcc); 14675fdc4257SSteve Yin if(pChildXAcc==NULL) 14685fdc4257SSteve Yin { 14695fdc4257SSteve Yin return NULL; 14705fdc4257SSteve Yin } 14715fdc4257SSteve Yin pChildContext = GetContextByXAcc(pChildXAcc); 14725fdc4257SSteve Yin if(pChildContext == NULL) 14735fdc4257SSteve Yin { 14745fdc4257SSteve Yin return NULL; 14755fdc4257SSteve Yin } 14765fdc4257SSteve Yin delta = (flags==DM_NEXTCHILD)?1:-1; 14775fdc4257SSteve Yin //currently, getAccessibleIndexInParent is error in UNO for 14785fdc4257SSteve Yin //some kind of List,such as ValueSet, the index will be less 1 than 14795fdc4257SSteve Yin //what should be, need to fix UNO code 14805fdc4257SSteve Yin index = pChildContext->getAccessibleIndexInParent()+delta; 14815fdc4257SSteve Yin if((index>=0)&&(index<=count-1)) 14825fdc4257SSteve Yin { 14835fdc4257SSteve Yin pRChildXAcc = pXContext->getAccessibleChild(index); 14845fdc4257SSteve Yin } 14855fdc4257SSteve Yin break; 14865fdc4257SSteve Yin default: 14875fdc4257SSteve Yin break; 14885fdc4257SSteve Yin } 14895fdc4257SSteve Yin 14905fdc4257SSteve Yin if(!pRChildXAcc.is()) 14915fdc4257SSteve Yin { 14925fdc4257SSteve Yin return NULL; 14935fdc4257SSteve Yin } 14945fdc4257SSteve Yin pChildXAcc = pRChildXAcc.get(); 14955fdc4257SSteve Yin g_pAgent->InsertAccObj(pChildXAcc,pUNOInterface); 14965fdc4257SSteve Yin return g_pAgent->GetIMAccByXAcc(pChildXAcc); 14975fdc4257SSteve Yin } 14985fdc4257SSteve Yin 14995fdc4257SSteve Yin /** 15005fdc4257SSteve Yin *the following 4 private methods are for accNavigate implementation 15015fdc4257SSteve Yin */ 15025fdc4257SSteve Yin 15035fdc4257SSteve Yin /** 15045fdc4257SSteve Yin * Return first child for parent container, process differently according 150586e1cf34SPedro Giffuni * to whether it is descendant manage 15065fdc4257SSteve Yin * @param varStart, the start child id of this navigation action. 15075fdc4257SSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 15085fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 15095fdc4257SSteve Yin */ 15105fdc4257SSteve Yin HRESULT CMAccessible::GetFirstChild(VARIANT varStart,VARIANT* pvarEndUpAt) 15115fdc4257SSteve Yin { 15125fdc4257SSteve Yin 15135fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 15145fdc4257SSteve Yin ISDESTROY() 15155fdc4257SSteve Yin // #CHECK# 15165fdc4257SSteve Yin if(pvarEndUpAt == NULL) 15175fdc4257SSteve Yin { 15185fdc4257SSteve Yin return E_INVALIDARG; 15195fdc4257SSteve Yin } 15205fdc4257SSteve Yin if(varStart.vt != VT_I4) 15215fdc4257SSteve Yin { 15225fdc4257SSteve Yin pvarEndUpAt->vt = VT_EMPTY; 15235fdc4257SSteve Yin return E_INVALIDARG; 15245fdc4257SSteve Yin } 15255fdc4257SSteve Yin 15265fdc4257SSteve Yin pvarEndUpAt->pdispVal = GetNavigateChildForDM(varStart, DM_FIRSTCHILD); 15275fdc4257SSteve Yin if(pvarEndUpAt->pdispVal) 15285fdc4257SSteve Yin { 15295fdc4257SSteve Yin pvarEndUpAt->pdispVal->AddRef(); 15305fdc4257SSteve Yin pvarEndUpAt->vt = VT_DISPATCH; 15315fdc4257SSteve Yin return S_OK; 15325fdc4257SSteve Yin } 15335fdc4257SSteve Yin 15345fdc4257SSteve Yin pvarEndUpAt->vt = VT_EMPTY; 15355fdc4257SSteve Yin return E_FAIL; 15365fdc4257SSteve Yin 15375fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 15385fdc4257SSteve Yin } 15395fdc4257SSteve Yin 15405fdc4257SSteve Yin /** 15415fdc4257SSteve Yin * Return last child for parent container, process differently according 154286e1cf34SPedro Giffuni * to whether it is descendant manage 15435fdc4257SSteve Yin * @param varStart, the start child id of this navigation action. 15445fdc4257SSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 15455fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 15465fdc4257SSteve Yin */ 15475fdc4257SSteve Yin HRESULT CMAccessible::GetLastChild(VARIANT varStart,VARIANT* pvarEndUpAt) 15485fdc4257SSteve Yin { 15495fdc4257SSteve Yin 15505fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 15515fdc4257SSteve Yin ISDESTROY() 15525fdc4257SSteve Yin // #CHECK# 15535fdc4257SSteve Yin if(pvarEndUpAt == NULL) 15545fdc4257SSteve Yin { 15555fdc4257SSteve Yin return E_INVALIDARG; 15565fdc4257SSteve Yin } 15575fdc4257SSteve Yin if(varStart.vt != VT_I4) 15585fdc4257SSteve Yin { 15595fdc4257SSteve Yin pvarEndUpAt->vt = VT_EMPTY; 15605fdc4257SSteve Yin return E_INVALIDARG; 15615fdc4257SSteve Yin } 15625fdc4257SSteve Yin 15635fdc4257SSteve Yin pvarEndUpAt->pdispVal = GetNavigateChildForDM(varStart, DM_LASTCHILD); 15645fdc4257SSteve Yin if(pvarEndUpAt->pdispVal) 15655fdc4257SSteve Yin { 15665fdc4257SSteve Yin pvarEndUpAt->pdispVal->AddRef(); 15675fdc4257SSteve Yin pvarEndUpAt->vt = VT_DISPATCH; 15685fdc4257SSteve Yin return S_OK; 15695fdc4257SSteve Yin } 15705fdc4257SSteve Yin pvarEndUpAt->vt = VT_EMPTY; 15715fdc4257SSteve Yin return E_FAIL; 15725fdc4257SSteve Yin 15735fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 15745fdc4257SSteve Yin } 15755fdc4257SSteve Yin 15765fdc4257SSteve Yin /** 157786e1cf34SPedro Giffuni * The method GetNextSibling is general, whatever it is descendant manage or not 15785fdc4257SSteve Yin * Get the next sibling object. 15795fdc4257SSteve Yin * @param varStart, the start child id of this navigation action. 15805fdc4257SSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 15815fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 15825fdc4257SSteve Yin */ 15835fdc4257SSteve Yin HRESULT CMAccessible::GetNextSibling(VARIANT varStart,VARIANT* pvarEndUpAt) 15845fdc4257SSteve Yin { 15855fdc4257SSteve Yin 15865fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 15875fdc4257SSteve Yin ISDESTROY() 15885fdc4257SSteve Yin if(varStart.vt != VT_I4) 15895fdc4257SSteve Yin { 15905fdc4257SSteve Yin pvarEndUpAt->vt = VT_EMPTY; 15915fdc4257SSteve Yin return E_INVALIDARG; 15925fdc4257SSteve Yin } 15935fdc4257SSteve Yin 15945fdc4257SSteve Yin Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface); 15955fdc4257SSteve Yin if(pRContext.is()) 15965fdc4257SSteve Yin { 15975fdc4257SSteve Yin varStart.iVal = sal_Int16(pRContext->getAccessibleIndexInParent() + 2); 15985fdc4257SSteve Yin if(m_pIParent) 15995fdc4257SSteve Yin if( m_pIParent->get_accChild(varStart,&pvarEndUpAt->pdispVal) == S_OK) 16005fdc4257SSteve Yin { 16015fdc4257SSteve Yin pvarEndUpAt->vt = VT_DISPATCH; 16025fdc4257SSteve Yin return S_OK; 16035fdc4257SSteve Yin } 16045fdc4257SSteve Yin } 16055fdc4257SSteve Yin pvarEndUpAt->vt = VT_EMPTY; 16065fdc4257SSteve Yin return E_FAIL; 16075fdc4257SSteve Yin 16085fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 16095fdc4257SSteve Yin } 16105fdc4257SSteve Yin 16115fdc4257SSteve Yin /** 161286e1cf34SPedro Giffuni *the method GetPreSibling is general, whatever it is descendant manage or not 16135fdc4257SSteve Yin * @param varStart, the start child id of this navigation action. 16145fdc4257SSteve Yin * @param pvarEndUpAt, [in,out] the end up child of this navigation action. 16155fdc4257SSteve Yin * @return S_OK if successful and E_FAIL if failure. 16165fdc4257SSteve Yin */ 16175fdc4257SSteve Yin HRESULT CMAccessible::GetPreSibling(VARIANT varStart,VARIANT* pvarEndUpAt) 16185fdc4257SSteve Yin { 16195fdc4257SSteve Yin 16205fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 16215fdc4257SSteve Yin ISDESTROY() 16225fdc4257SSteve Yin // #CHECK# 16235fdc4257SSteve Yin if(pvarEndUpAt == NULL) 16245fdc4257SSteve Yin { 16255fdc4257SSteve Yin return E_INVALIDARG; 16265fdc4257SSteve Yin } 16275fdc4257SSteve Yin if(varStart.vt != VT_I4) 16285fdc4257SSteve Yin { 16295fdc4257SSteve Yin pvarEndUpAt->vt = VT_EMPTY; 16305fdc4257SSteve Yin return E_INVALIDARG; 16315fdc4257SSteve Yin } 16325fdc4257SSteve Yin 16335fdc4257SSteve Yin Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface); 16345fdc4257SSteve Yin if(pRContext.is()) 16355fdc4257SSteve Yin { 16365fdc4257SSteve Yin varStart.iVal = sal_Int16(pRContext->getAccessibleIndexInParent()); 16375fdc4257SSteve Yin if(m_pIParent && varStart.iVal > 0) 16385fdc4257SSteve Yin if( m_pIParent->get_accChild(varStart,&pvarEndUpAt->pdispVal) == S_OK) 16395fdc4257SSteve Yin { 16405fdc4257SSteve Yin pvarEndUpAt->vt = VT_DISPATCH; 16415fdc4257SSteve Yin return S_OK; 16425fdc4257SSteve Yin } 16435fdc4257SSteve Yin } 16445fdc4257SSteve Yin pvarEndUpAt->vt = VT_EMPTY; 16455fdc4257SSteve Yin return E_FAIL; 16465fdc4257SSteve Yin 16475fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 16485fdc4257SSteve Yin } 16495fdc4257SSteve Yin 16505fdc4257SSteve Yin /** 16515fdc4257SSteve Yin * For IAccessible2 implementation methods 16525fdc4257SSteve Yin */ 16535fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_nRelations( long __RPC_FAR *nRelations) 16545fdc4257SSteve Yin { 16555fdc4257SSteve Yin 16565fdc4257SSteve Yin CHECK_ENABLE_INF 16575fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 16585b933a9eSSteve Yin ISDESTROY() 16595fdc4257SSteve Yin 16605fdc4257SSteve Yin // #CHECK# 16615fdc4257SSteve Yin if(nRelations == NULL) 16625fdc4257SSteve Yin { 16635fdc4257SSteve Yin return E_INVALIDARG; 16645fdc4257SSteve Yin } 16655fdc4257SSteve Yin 16665fdc4257SSteve Yin *nRelations = 0; 16675fdc4257SSteve Yin 16685fdc4257SSteve Yin if( !pRContext.is() ) 16695fdc4257SSteve Yin return E_FAIL; 16705fdc4257SSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet(); 16715fdc4257SSteve Yin if(!pRrelationSet.is()) 16725fdc4257SSteve Yin { 16735fdc4257SSteve Yin *nRelations = 0; 16745fdc4257SSteve Yin return S_OK; 16755fdc4257SSteve Yin } 16765fdc4257SSteve Yin 16775fdc4257SSteve Yin *nRelations = pRrelationSet->getRelationCount(); 16785fdc4257SSteve Yin return S_OK; 16795fdc4257SSteve Yin 16805fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 16815fdc4257SSteve Yin } 16825fdc4257SSteve Yin 16835fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_relation( long relationIndex, IAccessibleRelation __RPC_FAR *__RPC_FAR *relation) 16845fdc4257SSteve Yin { 16855fdc4257SSteve Yin 16865fdc4257SSteve Yin CHECK_ENABLE_INF 16875fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 16885fdc4257SSteve Yin ISDESTROY() 16895fdc4257SSteve Yin // #CHECK# 16905fdc4257SSteve Yin if(relation == NULL) 16915fdc4257SSteve Yin { 16925fdc4257SSteve Yin return E_INVALIDARG; 16935fdc4257SSteve Yin } 16945fdc4257SSteve Yin 16955fdc4257SSteve Yin if( !pRContext.is() ) 16965fdc4257SSteve Yin return E_FAIL; 16975fdc4257SSteve Yin 16985fdc4257SSteve Yin 16995fdc4257SSteve Yin long nMax = 0; 17005fdc4257SSteve Yin long nReal = 0; 17015fdc4257SSteve Yin get_nRelations(&nMax); 17025fdc4257SSteve Yin 17035fdc4257SSteve Yin *relation = (IAccessibleRelation*)::CoTaskMemAlloc(sizeof(IAccessibleRelation)); 17045fdc4257SSteve Yin 17055fdc4257SSteve Yin // #CHECK Memory Allocation# 17065fdc4257SSteve Yin if(*relation == NULL) 17075fdc4257SSteve Yin { 17085fdc4257SSteve Yin return E_FAIL; 17095fdc4257SSteve Yin } 17105fdc4257SSteve Yin 17115fdc4257SSteve Yin if( relationIndex < nMax ) 17125fdc4257SSteve Yin { 17135fdc4257SSteve Yin 17145fdc4257SSteve Yin 17155fdc4257SSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet(); 17165fdc4257SSteve Yin if(!pRrelationSet.is()) 17175fdc4257SSteve Yin { 17185fdc4257SSteve Yin 17195fdc4257SSteve Yin return E_FAIL; 17205fdc4257SSteve Yin } 17215fdc4257SSteve Yin 17225fdc4257SSteve Yin IAccessibleRelation* pRelation = NULL; 1723b0a7a3cfSSteve Yin ActivateActContext(); 17245fdc4257SSteve Yin HRESULT hr = CoCreateInstance( CLSID_AccRelation, NULL, CLSCTX_SERVER , 17255fdc4257SSteve Yin IID_IAccessibleRelation, 17265fdc4257SSteve Yin (void **)&pRelation); 1727b0a7a3cfSSteve Yin DeactivateActContext(); 17285fdc4257SSteve Yin if(SUCCEEDED(hr)) 17295fdc4257SSteve Yin { 17305fdc4257SSteve Yin IUNOXWrapper* wrapper = NULL; 17315fdc4257SSteve Yin hr = pRelation->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper); 17325fdc4257SSteve Yin if(SUCCEEDED(hr)) 17335fdc4257SSteve Yin { 17345fdc4257SSteve Yin AccessibleRelation accRelation = pRrelationSet->getRelation(relationIndex); 17355fdc4257SSteve Yin wrapper->put_XSubInterface((long)&accRelation); 17365fdc4257SSteve Yin wrapper->Release(); 17375fdc4257SSteve Yin *relation = pRelation; 17385fdc4257SSteve Yin return S_OK; 17395fdc4257SSteve Yin } 17405fdc4257SSteve Yin 17415fdc4257SSteve Yin } 17425fdc4257SSteve Yin } 17435fdc4257SSteve Yin 17445fdc4257SSteve Yin return E_FAIL; 17455fdc4257SSteve Yin 17465fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 17475fdc4257SSteve Yin } 17485fdc4257SSteve Yin 17495fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_relations( long, IAccessibleRelation __RPC_FAR *__RPC_FAR *relation, long __RPC_FAR *nRelations) 17505fdc4257SSteve Yin { 17515fdc4257SSteve Yin 17525fdc4257SSteve Yin CHECK_ENABLE_INF 17535fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 17545b933a9eSSteve Yin ISDESTROY() 17555fdc4257SSteve Yin 17565fdc4257SSteve Yin // #CHECK# 17575fdc4257SSteve Yin if(relation == NULL || nRelations == NULL) 17585fdc4257SSteve Yin { 17595fdc4257SSteve Yin return E_INVALIDARG; 17605fdc4257SSteve Yin } 17615fdc4257SSteve Yin // #CHECK XInterface# 17625fdc4257SSteve Yin 17635fdc4257SSteve Yin if( !pRContext.is() ) 17645fdc4257SSteve Yin return E_FAIL; 17655fdc4257SSteve Yin 17665fdc4257SSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet(); 17675fdc4257SSteve Yin if(!pRrelationSet.is()) 17685fdc4257SSteve Yin { 17695fdc4257SSteve Yin *nRelations = 0; 17705fdc4257SSteve Yin return S_OK; 17715fdc4257SSteve Yin } 17725fdc4257SSteve Yin 17735fdc4257SSteve Yin long nCount = pRrelationSet->getRelationCount(); 17745fdc4257SSteve Yin 17755fdc4257SSteve Yin *relation = (IAccessibleRelation*)::CoTaskMemAlloc(nCount*sizeof(IAccessibleRelation)); 17765fdc4257SSteve Yin 17775fdc4257SSteve Yin // #CHECK Memory Allocation# 17785fdc4257SSteve Yin if(*relation == NULL) 17795fdc4257SSteve Yin { 17805fdc4257SSteve Yin return E_FAIL; 17815fdc4257SSteve Yin } 17825fdc4257SSteve Yin 17835fdc4257SSteve Yin for(int i=0; i<nCount ; i++) 17845fdc4257SSteve Yin { 17855fdc4257SSteve Yin IAccessibleRelation* pRelation = NULL; 1786b0a7a3cfSSteve Yin ActivateActContext(); 17875fdc4257SSteve Yin HRESULT hr = CoCreateInstance( CLSID_AccRelation, NULL, CLSCTX_SERVER , 17885fdc4257SSteve Yin IID_IAccessibleRelation, 17895fdc4257SSteve Yin (void **)&pRelation); 1790b0a7a3cfSSteve Yin DeactivateActContext(); 17915fdc4257SSteve Yin if(SUCCEEDED(hr)) 17925fdc4257SSteve Yin { 17935fdc4257SSteve Yin IUNOXWrapper* wrapper = NULL; 17945fdc4257SSteve Yin hr = pRelation->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper); 17955fdc4257SSteve Yin if(SUCCEEDED(hr)) 17965fdc4257SSteve Yin { 17975fdc4257SSteve Yin AccessibleRelation accRelation = pRrelationSet->getRelation(i); 17985fdc4257SSteve Yin wrapper->put_XSubInterface((long)&accRelation); 17995fdc4257SSteve Yin wrapper->Release(); 18005fdc4257SSteve Yin } 18015fdc4257SSteve Yin (relation)[i] = pRelation; 18025fdc4257SSteve Yin } 18035fdc4257SSteve Yin } 18045fdc4257SSteve Yin 18055fdc4257SSteve Yin *nRelations = nCount; 18065fdc4257SSteve Yin return S_OK; 18075fdc4257SSteve Yin 18085fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 18095fdc4257SSteve Yin } 18105fdc4257SSteve Yin 18115fdc4257SSteve Yin STDMETHODIMP CMAccessible::role(long __RPC_FAR *role) 18125fdc4257SSteve Yin { 18135fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 18145fdc4257SSteve Yin 18155fdc4257SSteve Yin (*role) = m_iRole; 18165fdc4257SSteve Yin 18175fdc4257SSteve Yin return S_OK; 18185fdc4257SSteve Yin 18195fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 18205fdc4257SSteve Yin } 18215fdc4257SSteve Yin 18225fdc4257SSteve Yin 18235fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_nActions(long __RPC_FAR *nActions) 18245fdc4257SSteve Yin { 18255fdc4257SSteve Yin 18265fdc4257SSteve Yin try 18275fdc4257SSteve Yin { 18285fdc4257SSteve Yin ISDESTROY() 18295fdc4257SSteve Yin // #CHECK# 18305fdc4257SSteve Yin if(nActions == NULL) 18315fdc4257SSteve Yin { 18325fdc4257SSteve Yin return E_INVALIDARG; 18335fdc4257SSteve Yin } 18345fdc4257SSteve Yin *nActions = 0L; 18355fdc4257SSteve Yin IAccessibleAction* pAcc = NULL; 18365fdc4257SSteve Yin HRESULT hr = QueryInterface(IID_IAccessibleAction, (void**)&pAcc); 18375fdc4257SSteve Yin if( hr == S_OK ) 18385fdc4257SSteve Yin { 18395fdc4257SSteve Yin pAcc->nActions(nActions); 18405fdc4257SSteve Yin pAcc->Release(); 18415fdc4257SSteve Yin } 18425fdc4257SSteve Yin 18435fdc4257SSteve Yin return S_OK; 18445fdc4257SSteve Yin } 18455fdc4257SSteve Yin catch(...) 18465fdc4257SSteve Yin { 18475fdc4257SSteve Yin *nActions = 0L; 18485fdc4257SSteve Yin return S_OK; 18495fdc4257SSteve Yin } 18505fdc4257SSteve Yin } 18515fdc4257SSteve Yin 18525fdc4257SSteve Yin 18535fdc4257SSteve Yin STDMETHODIMP CMAccessible:: scrollToPoint(enum IA2CoordinateType, long, long) 18545fdc4257SSteve Yin { 18555fdc4257SSteve Yin 18565fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 18575fdc4257SSteve Yin ISDESTROY() 18585fdc4257SSteve Yin return E_NOTIMPL; 18595fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 18605fdc4257SSteve Yin 18615fdc4257SSteve Yin } 18625fdc4257SSteve Yin STDMETHODIMP CMAccessible:: scrollTo(enum IA2ScrollType) 18635fdc4257SSteve Yin { 18645fdc4257SSteve Yin 18655fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 18665fdc4257SSteve Yin ISDESTROY() 18675fdc4257SSteve Yin 18685fdc4257SSteve Yin return E_NOTIMPL; 18695fdc4257SSteve Yin 18705fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 18715fdc4257SSteve Yin } 18725fdc4257SSteve Yin 18735fdc4257SSteve Yin static XAccessible* getTheParentOfMember(XAccessible* pXAcc) 18745fdc4257SSteve Yin { 18755fdc4257SSteve Yin // #CHECK# 18765fdc4257SSteve Yin if(pXAcc == NULL) 18775fdc4257SSteve Yin { 18785fdc4257SSteve Yin return NULL; 18795fdc4257SSteve Yin } 18805fdc4257SSteve Yin Reference<XAccessibleContext> pRContext = pXAcc->getAccessibleContext(); 18815fdc4257SSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet(); 18825fdc4257SSteve Yin long nRelations = pRrelationSet->getRelationCount(); 18835fdc4257SSteve Yin for(int i=0 ; i<nRelations ; i++) 18845fdc4257SSteve Yin { 18855fdc4257SSteve Yin AccessibleRelation accRelation = pRrelationSet->getRelation(i); 18865fdc4257SSteve Yin if(accRelation.RelationType == 7) 18875fdc4257SSteve Yin { 18885fdc4257SSteve Yin Sequence< Reference< XInterface > > xTargets = accRelation.TargetSet; 18895fdc4257SSteve Yin return (XAccessible*)xTargets[0].get(); 18905fdc4257SSteve Yin } 18915fdc4257SSteve Yin } 18925fdc4257SSteve Yin return NULL; 18935fdc4257SSteve Yin } 18945fdc4257SSteve Yin 18955fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_groupPosition(long __RPC_FAR *groupLevel,long __RPC_FAR *similarItemsInGroup,long __RPC_FAR *positionInGroup) 18965fdc4257SSteve Yin { 18975fdc4257SSteve Yin 18985fdc4257SSteve Yin CHECK_ENABLE_INF 18995fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 19005fdc4257SSteve Yin ISDESTROY() 19015fdc4257SSteve Yin // #CHECK# 19025fdc4257SSteve Yin if(groupLevel == NULL || similarItemsInGroup == NULL || positionInGroup == NULL) 19035fdc4257SSteve Yin { 19045fdc4257SSteve Yin return E_INVALIDARG; 19055fdc4257SSteve Yin } 19065fdc4257SSteve Yin 19075fdc4257SSteve Yin Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext(); 19085fdc4257SSteve Yin if(!pRContext.is()) 19095fdc4257SSteve Yin return E_FAIL; 19105fdc4257SSteve Yin long Role = pRContext->getAccessibleRole(); 19115fdc4257SSteve Yin 19125fdc4257SSteve Yin *groupLevel = 0; 19135fdc4257SSteve Yin *similarItemsInGroup = 0; 19145fdc4257SSteve Yin *positionInGroup = 0; 19155fdc4257SSteve Yin 19165fdc4257SSteve Yin if (Role != AccessibleRole::DOCUMENT) 19175fdc4257SSteve Yin { 19185fdc4257SSteve Yin Reference< XAccessibleGroupPosition > xGroupPosition( pRContext, UNO_QUERY ); 19195fdc4257SSteve Yin if ( xGroupPosition.is() ) 19205fdc4257SSteve Yin { 19215fdc4257SSteve Yin Sequence< sal_Int32 > rSeq = xGroupPosition->getGroupPosition( makeAny( pRContext ) ); 19225fdc4257SSteve Yin sal_Int32* pSeq = rSeq.getArray(); 19235fdc4257SSteve Yin if ( pSeq ) 19245fdc4257SSteve Yin { 19255fdc4257SSteve Yin *groupLevel = pSeq[0]; 19265fdc4257SSteve Yin *similarItemsInGroup = pSeq[1]; 19275fdc4257SSteve Yin *positionInGroup = pSeq[2]; 19285fdc4257SSteve Yin return S_OK; 19295fdc4257SSteve Yin } 19305fdc4257SSteve Yin return S_OK; 19315fdc4257SSteve Yin } 19325fdc4257SSteve Yin } 19335fdc4257SSteve Yin 19345fdc4257SSteve Yin Reference< XAccessible> pParentAcc = pRContext->getAccessibleParent(); 19355fdc4257SSteve Yin if( !pParentAcc.is() ) 19365fdc4257SSteve Yin { 19375fdc4257SSteve Yin return S_OK; 19385fdc4257SSteve Yin } 19395fdc4257SSteve Yin 19405fdc4257SSteve Yin Reference<XAccessibleContext> pRParentContext = pParentAcc->getAccessibleContext(); 19415fdc4257SSteve Yin 19425fdc4257SSteve Yin int level = 0; 19435fdc4257SSteve Yin int index = 0; 19445fdc4257SSteve Yin int number = 0; 19455fdc4257SSteve Yin 19465fdc4257SSteve Yin if( Role == RADIO_BUTTON ) 19475fdc4257SSteve Yin { 19485fdc4257SSteve Yin Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet(); 19495fdc4257SSteve Yin long nRel = pRrelationSet->getRelationCount(); 19505fdc4257SSteve Yin for(int i=0 ; i<nRel ; i++) 19515fdc4257SSteve Yin { 19525fdc4257SSteve Yin AccessibleRelation accRelation = pRrelationSet->getRelation(i); 19535fdc4257SSteve Yin if(accRelation.RelationType == 7) 19545fdc4257SSteve Yin { 19555fdc4257SSteve Yin Sequence< Reference< XInterface > > xTargets = accRelation.TargetSet; 19565fdc4257SSteve Yin int nCount = xTargets.getLength(); 19575fdc4257SSteve Yin 19585fdc4257SSteve Yin Reference<XInterface> pRAcc = xTargets[0]; 19595fdc4257SSteve Yin for(int j=0; j<pRParentContext->getAccessibleChildCount(); j++) 19605fdc4257SSteve Yin { 19615fdc4257SSteve Yin if( getTheParentOfMember(pRParentContext->getAccessibleChild(j).get()) 19625fdc4257SSteve Yin == (XAccessible*)pRAcc.get() && 19635fdc4257SSteve Yin pRParentContext->getAccessibleChild(j)->getAccessibleContext()->getAccessibleRole() == RADIO_BUTTON) 19645fdc4257SSteve Yin number++; 19655fdc4257SSteve Yin if(pRParentContext->getAccessibleChild(j).get() == pUNOInterface) 19665fdc4257SSteve Yin index = number; 19675fdc4257SSteve Yin } 19685fdc4257SSteve Yin } 19695fdc4257SSteve Yin } 19705fdc4257SSteve Yin *groupLevel = 1; 19715fdc4257SSteve Yin *similarItemsInGroup = number; 19725fdc4257SSteve Yin *positionInGroup = index; 19735fdc4257SSteve Yin return S_OK; 19745fdc4257SSteve Yin } 19755fdc4257SSteve Yin 19765fdc4257SSteve Yin else if ( COMBO_BOX == Role ) 19775fdc4257SSteve Yin { 19785fdc4257SSteve Yin *groupLevel = 1; 19795fdc4257SSteve Yin *similarItemsInGroup = 0; 19805fdc4257SSteve Yin *positionInGroup = -1; 19815fdc4257SSteve Yin 19825fdc4257SSteve Yin long nCount = pRContext->getAccessibleChildCount(); 19835fdc4257SSteve Yin if( 2 != nCount) 19845fdc4257SSteve Yin { 19855fdc4257SSteve Yin return S_OK; 19865fdc4257SSteve Yin } 19875fdc4257SSteve Yin Reference<XAccessible> xList=pRContext->getAccessibleChild(1); 19885fdc4257SSteve Yin if (!xList.is()) 19895fdc4257SSteve Yin { 19905fdc4257SSteve Yin return S_OK; 19915fdc4257SSteve Yin } 19925fdc4257SSteve Yin Reference<XAccessibleContext> xListContext(xList,UNO_QUERY); 19935fdc4257SSteve Yin if (!xListContext.is()) 19945fdc4257SSteve Yin { 19955fdc4257SSteve Yin return S_OK; 19965fdc4257SSteve Yin } 19975fdc4257SSteve Yin Reference<XAccessibleSelection> xListSel(xList,UNO_QUERY); 19985fdc4257SSteve Yin if (!xListSel.is()) 19995fdc4257SSteve Yin { 20005fdc4257SSteve Yin return S_OK; 20015fdc4257SSteve Yin } 20025fdc4257SSteve Yin *similarItemsInGroup = xListContext->getAccessibleChildCount(); 20035fdc4257SSteve Yin if (*similarItemsInGroup > 0 ) 20045fdc4257SSteve Yin { 20055fdc4257SSteve Yin try 20065fdc4257SSteve Yin { 20075fdc4257SSteve Yin Reference<XAccessible> xChild = xListSel->getSelectedAccessibleChild(0); 20085fdc4257SSteve Yin if (xChild.is()) 20095fdc4257SSteve Yin { 20105fdc4257SSteve Yin Reference<XAccessibleContext> xChildContext(xChild,UNO_QUERY); 20115fdc4257SSteve Yin if (xChildContext.is()) 20125fdc4257SSteve Yin { 20135fdc4257SSteve Yin *positionInGroup=xChildContext->getAccessibleIndexInParent() + 1 ; 20145fdc4257SSteve Yin return S_OK; 20155fdc4257SSteve Yin } 20165fdc4257SSteve Yin } 20175fdc4257SSteve Yin } 20185fdc4257SSteve Yin catch(...) 20195fdc4257SSteve Yin {} 20205fdc4257SSteve Yin } 20215fdc4257SSteve Yin return S_OK; 20225fdc4257SSteve Yin } 20235fdc4257SSteve Yin else if ( PAGE_TAB == Role ) 20245fdc4257SSteve Yin { 20255fdc4257SSteve Yin *groupLevel = 1; 20265fdc4257SSteve Yin *similarItemsInGroup = pRParentContext->getAccessibleChildCount(); 20275fdc4257SSteve Yin 20285fdc4257SSteve Yin if (*similarItemsInGroup > 0 ) 20295fdc4257SSteve Yin { 20305fdc4257SSteve Yin *positionInGroup=pRContext->getAccessibleIndexInParent() + 1 ; 20315fdc4257SSteve Yin } 20325fdc4257SSteve Yin else 20335fdc4257SSteve Yin { 20345fdc4257SSteve Yin *positionInGroup = -1; 20355fdc4257SSteve Yin } 20365fdc4257SSteve Yin return S_OK; 20375fdc4257SSteve Yin } 20385fdc4257SSteve Yin 20395fdc4257SSteve Yin 20405fdc4257SSteve Yin BOOL isFound = FALSE; 20415fdc4257SSteve Yin while( pParentAcc.is() && !isFound) 20425fdc4257SSteve Yin { 20435fdc4257SSteve Yin level++; 20445fdc4257SSteve Yin pRParentContext = pParentAcc->getAccessibleContext(); 20455fdc4257SSteve Yin Role = pRParentContext->getAccessibleRole(); 20465fdc4257SSteve Yin if( (Role == TREE) || (Role == LIST) ) 20475fdc4257SSteve Yin isFound = TRUE; 20485fdc4257SSteve Yin pParentAcc = pRParentContext->getAccessibleParent(); 20495fdc4257SSteve Yin } 20505fdc4257SSteve Yin 20515fdc4257SSteve Yin if( isFound ) 20525fdc4257SSteve Yin { 20535fdc4257SSteve Yin Reference< XAccessible> pTempAcc = pRContext->getAccessibleParent(); 20545fdc4257SSteve Yin pRParentContext = pTempAcc->getAccessibleContext(); 20555fdc4257SSteve Yin *groupLevel = level; 20565fdc4257SSteve Yin *similarItemsInGroup = pRParentContext->getAccessibleChildCount(); 20575fdc4257SSteve Yin *positionInGroup = pRContext->getAccessibleIndexInParent() + 1; 20585fdc4257SSteve Yin } 20595fdc4257SSteve Yin else 20605fdc4257SSteve Yin { 20615fdc4257SSteve Yin *groupLevel = 0; 20625fdc4257SSteve Yin *similarItemsInGroup = 0; 20635fdc4257SSteve Yin *positionInGroup = 0; 20645fdc4257SSteve Yin } 20655fdc4257SSteve Yin return S_OK; 20665fdc4257SSteve Yin 20675fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 20685fdc4257SSteve Yin } 20695fdc4257SSteve Yin 20705fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_extendedStates( long, BSTR __RPC_FAR *__RPC_FAR *, long __RPC_FAR *) 20715fdc4257SSteve Yin { 20725fdc4257SSteve Yin 20735fdc4257SSteve Yin CHECK_ENABLE_INF 20745fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 20755fdc4257SSteve Yin ISDESTROY() 20765fdc4257SSteve Yin 20775fdc4257SSteve Yin return E_NOTIMPL; 20785fdc4257SSteve Yin 20795fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 20805fdc4257SSteve Yin } 20815fdc4257SSteve Yin 20825fdc4257SSteve Yin 20835fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_uniqueID(long __RPC_FAR *uniqueID) 20845fdc4257SSteve Yin { 20855fdc4257SSteve Yin 20865fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 20875fdc4257SSteve Yin ISDESTROY() 20885fdc4257SSteve Yin // #CHECK# 20895fdc4257SSteve Yin if(uniqueID == NULL) 20905fdc4257SSteve Yin { 20915fdc4257SSteve Yin return E_INVALIDARG; 20925fdc4257SSteve Yin } 20935fdc4257SSteve Yin *uniqueID = m_dChildID; 20945fdc4257SSteve Yin return S_OK; 20955fdc4257SSteve Yin 20965fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 20975fdc4257SSteve Yin } 20985fdc4257SSteve Yin 20995fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_windowHandle(HWND __RPC_FAR *windowHandle) 21005fdc4257SSteve Yin { 21015fdc4257SSteve Yin 21025fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 21035fdc4257SSteve Yin ISDESTROY() 21045fdc4257SSteve Yin // #CHECK# 21055fdc4257SSteve Yin if(windowHandle == NULL) 21065fdc4257SSteve Yin { 21075fdc4257SSteve Yin return E_INVALIDARG; 21085fdc4257SSteve Yin } 21095fdc4257SSteve Yin 21105fdc4257SSteve Yin HWND nHwnd = m_hwnd; 21115fdc4257SSteve Yin IAccessible* pParent = m_pIParent; 21125fdc4257SSteve Yin CMAccessible* pChild = this; 21135fdc4257SSteve Yin while((nHwnd==0) && pParent) 21145fdc4257SSteve Yin { 21155fdc4257SSteve Yin pChild = (CMAccessible*)pParent; 21165fdc4257SSteve Yin if(pChild) 21175fdc4257SSteve Yin { 21185fdc4257SSteve Yin pParent = (IAccessible*)pChild->m_pIParent; 21195fdc4257SSteve Yin nHwnd = (HWND)pChild->m_hwnd; 21205fdc4257SSteve Yin } 21215fdc4257SSteve Yin else 21225fdc4257SSteve Yin pParent = NULL; 21235fdc4257SSteve Yin } 21245fdc4257SSteve Yin 21255fdc4257SSteve Yin *windowHandle = nHwnd; 21265fdc4257SSteve Yin return S_OK; 21275fdc4257SSteve Yin 21285fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 21295fdc4257SSteve Yin } 21305fdc4257SSteve Yin 21315fdc4257SSteve Yin /** 21325fdc4257SSteve Yin * Get XAccessibleContext directly from UNO by the stored XAccessible pointer 21335fdc4257SSteve Yin * @param pXAcc, UNO XAccessible object point. 21345fdc4257SSteve Yin * @return XAccessibleContext*, the context of the pXAcc. 21355fdc4257SSteve Yin */ 21365fdc4257SSteve Yin XAccessibleContext* CMAccessible::GetContextByXAcc( XAccessible* pXAcc ) 21375fdc4257SSteve Yin { 21385fdc4257SSteve Yin Reference< XAccessibleContext > pRContext; 21395fdc4257SSteve Yin if( pXAcc == NULL) 21405fdc4257SSteve Yin return NULL; 21415fdc4257SSteve Yin 21425fdc4257SSteve Yin pRContext = pXAcc->getAccessibleContext(); 21435fdc4257SSteve Yin if( !pRContext.is() ) 21445fdc4257SSteve Yin return NULL; 21455fdc4257SSteve Yin return pRContext.get(); 21465fdc4257SSteve Yin } 21475fdc4257SSteve Yin 21485fdc4257SSteve Yin /** 21495fdc4257SSteve Yin * Return the member variable m_pXAccessibleSelection, instead of 21505fdc4257SSteve Yin * get XAccessibleSelection according to XAccessibleContext because if so,it will 21515fdc4257SSteve Yin * depend on the UNO implementation code,so when COM is created, put XAccessibleSelection 21525fdc4257SSteve Yin * by bridge management system 21535fdc4257SSteve Yin * @return XAccessibleSelection*, the selection of the current object. 21545fdc4257SSteve Yin */ 21555fdc4257SSteve Yin Reference< XAccessibleSelection > CMAccessible::GetSelection() 21565fdc4257SSteve Yin { 21575fdc4257SSteve Yin if( pUNOInterface == NULL ) 21585fdc4257SSteve Yin return NULL; 21595fdc4257SSteve Yin Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext(); 21605fdc4257SSteve Yin if(pRContext.is()) 21615fdc4257SSteve Yin { 21625fdc4257SSteve Yin Reference< XAccessibleSelection > pRSelection(pRContext,UNO_QUERY); 21635fdc4257SSteve Yin return pRSelection; 21645fdc4257SSteve Yin } 21655fdc4257SSteve Yin return NULL; 21665fdc4257SSteve Yin } 21675fdc4257SSteve Yin 21685fdc4257SSteve Yin /** 21695fdc4257SSteve Yin * Select one XAccessible item, for accSelect implementation 21705fdc4257SSteve Yin * @param pItem, the item should be selected. 21715fdc4257SSteve Yin * @return S_OK if successful. 21725fdc4257SSteve Yin */ 21735fdc4257SSteve Yin HRESULT CMAccessible::SelectChild(XAccessible* pItem) 21745fdc4257SSteve Yin { 21755fdc4257SSteve Yin 21765fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 21775fdc4257SSteve Yin ISDESTROY() 21785fdc4257SSteve Yin XAccessibleContext* pParentContext = GetContextByXAcc( pUNOInterface ); 21795fdc4257SSteve Yin XAccessibleContext* pContext = GetContextByXAcc( pItem ); 21805fdc4257SSteve Yin if( pParentContext == NULL || pContext == NULL ) 21815fdc4257SSteve Yin return E_FAIL; 21825fdc4257SSteve Yin 21835fdc4257SSteve Yin Reference< XAccessibleSelection > pRSelection = GetSelection(); 21845fdc4257SSteve Yin if( !pRSelection.is() ) 21855fdc4257SSteve Yin return E_FAIL; 21865fdc4257SSteve Yin long Index = pContext->getAccessibleIndexInParent(); 21875fdc4257SSteve Yin pRSelection->selectAccessibleChild( Index ); 21885fdc4257SSteve Yin return S_OK; 21895fdc4257SSteve Yin 21905fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 21915fdc4257SSteve Yin } 21925fdc4257SSteve Yin 21935fdc4257SSteve Yin /** 21945fdc4257SSteve Yin * Deselect one XAccessible item, for accSelect implimentation 21955fdc4257SSteve Yin * @param pItem, the item should be deselected. 21965fdc4257SSteve Yin * @return S_OK if successful. 21975fdc4257SSteve Yin */ 21985fdc4257SSteve Yin HRESULT CMAccessible::DeSelectChild(XAccessible* pItem) 21995fdc4257SSteve Yin { 22005fdc4257SSteve Yin 22015fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 22025fdc4257SSteve Yin ISDESTROY() 22035fdc4257SSteve Yin XAccessibleContext* pParentContext = GetContextByXAcc( pUNOInterface ); 22045fdc4257SSteve Yin ; 22055fdc4257SSteve Yin XAccessibleContext* pContext = GetContextByXAcc( pItem ); 22065fdc4257SSteve Yin if( pParentContext == NULL || pContext == NULL ) 22075fdc4257SSteve Yin return E_INVALIDARG; 22085fdc4257SSteve Yin 22095fdc4257SSteve Yin Reference< XAccessibleSelection > pRSelection = GetSelection(); 22105fdc4257SSteve Yin if( !pRSelection.is() ) 22115fdc4257SSteve Yin return E_FAIL; 22125fdc4257SSteve Yin long Index = pContext->getAccessibleIndexInParent(); 22135fdc4257SSteve Yin pRSelection->deselectAccessibleChild( Index ); 22145fdc4257SSteve Yin 22155fdc4257SSteve Yin return S_OK; 22165fdc4257SSteve Yin 22175fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 22185fdc4257SSteve Yin } 22195fdc4257SSteve Yin 22205fdc4257SSteve Yin /** 22215fdc4257SSteve Yin * Select multiple XAccessible items,for implementation of accSelect 22225fdc4257SSteve Yin * @param pItem, the items should be selected. 22235fdc4257SSteve Yin * @param size, the size of the items. 22245fdc4257SSteve Yin * @return S_OK if successful. 22255fdc4257SSteve Yin */ 222681afc36fSJohn Bampton HRESULT CMAccessible::SelectMultipleChidren( XAccessible** pItem,int size ) 22275fdc4257SSteve Yin { 22285fdc4257SSteve Yin 22295fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 22305fdc4257SSteve Yin ISDESTROY() 22315fdc4257SSteve Yin // #CHECK# 22325fdc4257SSteve Yin if(pItem == NULL) 22335fdc4257SSteve Yin { 22345fdc4257SSteve Yin return E_INVALIDARG; 22355fdc4257SSteve Yin } 22365fdc4257SSteve Yin for(int index = 0;index < size;index++) 22375fdc4257SSteve Yin { 22385fdc4257SSteve Yin SelectChild( pItem[index] ); 22395fdc4257SSteve Yin } 22405fdc4257SSteve Yin return S_OK; 22415fdc4257SSteve Yin 22425fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 22435fdc4257SSteve Yin } 22445fdc4257SSteve Yin 22455fdc4257SSteve Yin /** 22465fdc4257SSteve Yin * Deselect multiple XAccessible items,for implementation of accSelect 22475fdc4257SSteve Yin * @param pItem, the items should be selected. 22485fdc4257SSteve Yin * @param size, the size of the items. 22495fdc4257SSteve Yin * @return S_OK if successful. 22505fdc4257SSteve Yin */ 225181afc36fSJohn Bampton HRESULT CMAccessible::DeSelectMultipleChildren( XAccessible** pItem,int size ) 22525fdc4257SSteve Yin { 22535fdc4257SSteve Yin 22545fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 22555fdc4257SSteve Yin ISDESTROY() 22565fdc4257SSteve Yin // #CHECK# 22575fdc4257SSteve Yin if(pItem == NULL) 22585fdc4257SSteve Yin { 22595fdc4257SSteve Yin return E_INVALIDARG; 22605fdc4257SSteve Yin } 22615fdc4257SSteve Yin for(int index = 0;index < size;index++) 22625fdc4257SSteve Yin { 22635fdc4257SSteve Yin DeSelectChild( pItem[index] ); 22645fdc4257SSteve Yin } 22655fdc4257SSteve Yin return S_OK; 22665fdc4257SSteve Yin 22675fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 22685fdc4257SSteve Yin } 22695fdc4257SSteve Yin 22705fdc4257SSteve Yin /** 22715fdc4257SSteve Yin * When COM is created, UNO set XAccessible pointer to it 22725fdc4257SSteve Yin * in order to COM can operate UNO information 22735fdc4257SSteve Yin * @param pXAcc, the XAccessible object of current object. 22745fdc4257SSteve Yin * @return S_OK if successful. 22755fdc4257SSteve Yin */ 22765fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetXAccessible(long pXAcc) 22775fdc4257SSteve Yin { 22785fdc4257SSteve Yin pUNOInterface = (XAccessible*)pXAcc; 22795fdc4257SSteve Yin pRef = pUNOInterface; 22805fdc4257SSteve Yin m_pEnumVar->PutSelection(/*XAccessibleSelection*/(long)pUNOInterface); 22815fdc4257SSteve Yin 22825fdc4257SSteve Yin pRContext = pUNOInterface->getAccessibleContext(); 22835fdc4257SSteve Yin pRContextInterface = (XAccessibleContext*)pRContext.is(); 22845fdc4257SSteve Yin 22855fdc4257SSteve Yin return S_OK; 22865fdc4257SSteve Yin } 22875fdc4257SSteve Yin 22885fdc4257SSteve Yin /** 22895fdc4257SSteve Yin * accSelect method has many optional flags, needs to process comprehensively 22905fdc4257SSteve Yin * Mozilla and Microsoft do not implement SELFLAG_EXTENDSELECTION flag. 22915fdc4257SSteve Yin * The implementation of this flag is a little trouble-shooting,so we also 22925fdc4257SSteve Yin * do not implement it now 22935fdc4257SSteve Yin * @param flagsSelect, the selection flag of the select action. 22945fdc4257SSteve Yin * @param varChild, the child object pointer of current action. 22955fdc4257SSteve Yin * @return S_OK if successful. 22965fdc4257SSteve Yin */ 22975fdc4257SSteve Yin STDMETHODIMP CMAccessible::accSelect(long flagsSelect, VARIANT varChild) 22985fdc4257SSteve Yin { 22995fdc4257SSteve Yin 23005fdc4257SSteve Yin CHECK_ENABLE_INF 23015fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 23025fdc4257SSteve Yin ISDESTROY() 23035fdc4257SSteve Yin if( (flagsSelect&SELFLAG_ADDSELECTION) && 23045fdc4257SSteve Yin (SELFLAG_REMOVESELECTION&flagsSelect) ) 23055fdc4257SSteve Yin return E_INVALIDARG; 23065fdc4257SSteve Yin 23075fdc4257SSteve Yin if ( (flagsSelect&SELFLAG_TAKESELECTION) && 23085fdc4257SSteve Yin ( 23095fdc4257SSteve Yin (flagsSelect&SELFLAG_ADDSELECTION) || 23105fdc4257SSteve Yin (flagsSelect&SELFLAG_REMOVESELECTION) || 23115fdc4257SSteve Yin (flagsSelect&SELFLAG_EXTENDSELECTION ) 23125fdc4257SSteve Yin ) 23135fdc4257SSteve Yin ) 23145fdc4257SSteve Yin return E_INVALIDARG; 23155fdc4257SSteve Yin 23165fdc4257SSteve Yin if ( varChild.vt != VT_I4 ) 23175fdc4257SSteve Yin return E_INVALIDARG; 23185fdc4257SSteve Yin 23195fdc4257SSteve Yin IMAccessible* pSelectAcc; 23205fdc4257SSteve Yin if( varChild.lVal == CHILDID_SELF ) 23215fdc4257SSteve Yin { 23225fdc4257SSteve Yin pSelectAcc = this; 23235fdc4257SSteve Yin pSelectAcc->AddRef(); 23245fdc4257SSteve Yin } 23255fdc4257SSteve Yin else 23265fdc4257SSteve Yin { 23275fdc4257SSteve Yin pSelectAcc = GetChildInterface(varChild.lVal); 23285fdc4257SSteve Yin } 23295fdc4257SSteve Yin 23305fdc4257SSteve Yin if( pSelectAcc == NULL ) 23315fdc4257SSteve Yin return E_INVALIDARG; 23325fdc4257SSteve Yin 23335fdc4257SSteve Yin if( flagsSelect&SELFLAG_TAKEFOCUS ) 23345fdc4257SSteve Yin { 23355fdc4257SSteve Yin long pTempUNO = 0; 23365fdc4257SSteve Yin pSelectAcc->GetUNOInterface( &pTempUNO); 23375fdc4257SSteve Yin 23385fdc4257SSteve Yin if( pTempUNO == NULL ) 23395fdc4257SSteve Yin return NULL; 23405fdc4257SSteve Yin 23415fdc4257SSteve Yin Reference< XAccessibleContext > pRContext = ( (XAccessible*)pTempUNO)->getAccessibleContext(); 23425fdc4257SSteve Yin Reference< XAccessibleComponent > pRComponent(pRContext,UNO_QUERY); 23435fdc4257SSteve Yin Reference< XAccessible > pRParentXAcc = pRContext->getAccessibleParent(); 23445fdc4257SSteve Yin Reference< XAccessibleContext > pRParentContext = pRParentXAcc->getAccessibleContext(); 23455fdc4257SSteve Yin Reference< XAccessibleComponent > pRParentComponent(pRParentContext,UNO_QUERY); 23465fdc4257SSteve Yin Reference< XAccessibleSelection > pRParentSelection(pRParentContext,UNO_QUERY); 23475fdc4257SSteve Yin 23485fdc4257SSteve Yin 23495fdc4257SSteve Yin pRComponent->grabFocus(); 23505fdc4257SSteve Yin 23515fdc4257SSteve Yin if( flagsSelect & SELFLAG_TAKESELECTION ) 23525fdc4257SSteve Yin { 23535fdc4257SSteve Yin pRParentSelection->clearAccessibleSelection(); 23545fdc4257SSteve Yin pRParentSelection->selectAccessibleChild( pRContext->getAccessibleIndexInParent() ); 23555fdc4257SSteve Yin } 23565fdc4257SSteve Yin 23575fdc4257SSteve Yin if( flagsSelect & SELFLAG_ADDSELECTION ) 23585fdc4257SSteve Yin { 23595fdc4257SSteve Yin pRParentSelection->selectAccessibleChild( pRContext->getAccessibleIndexInParent() ); 23605fdc4257SSteve Yin } 23615fdc4257SSteve Yin 23625fdc4257SSteve Yin if( flagsSelect & SELFLAG_REMOVESELECTION ) 23635fdc4257SSteve Yin { 23645fdc4257SSteve Yin pRParentSelection->deselectAccessibleChild( pRContext->getAccessibleIndexInParent() ); 23655fdc4257SSteve Yin } 23665fdc4257SSteve Yin 23675fdc4257SSteve Yin if( flagsSelect & SELFLAG_EXTENDSELECTION ) 23685fdc4257SSteve Yin { 23695fdc4257SSteve Yin long indexInParrent = pRContext->getAccessibleIndexInParent(); 23705fdc4257SSteve Yin 23715fdc4257SSteve Yin if( pRParentSelection->isAccessibleChildSelected( indexInParrent + 1 ) || 23725fdc4257SSteve Yin pRParentSelection->isAccessibleChildSelected( indexInParrent - 1 ) ) 23735fdc4257SSteve Yin { 23745fdc4257SSteve Yin pRParentSelection->selectAccessibleChild( indexInParrent ); 23755fdc4257SSteve Yin } 23765fdc4257SSteve Yin } 23775fdc4257SSteve Yin 23785fdc4257SSteve Yin } 23795fdc4257SSteve Yin 23805fdc4257SSteve Yin pSelectAcc->Release(); 23815fdc4257SSteve Yin return S_OK; 23825fdc4257SSteve Yin 23835fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 23845fdc4257SSteve Yin } 23855fdc4257SSteve Yin 23865fdc4257SSteve Yin /** 23875fdc4257SSteve Yin * Return XAccessible interface pointer when needed 23885fdc4257SSteve Yin * @param pXAcc, [in, out] the Uno interface of the current object. 23895fdc4257SSteve Yin * @return S_OK if successful. 23905fdc4257SSteve Yin */ 23915fdc4257SSteve Yin STDMETHODIMP CMAccessible::GetUNOInterface(long* pXAcc) 23925fdc4257SSteve Yin { 23935fdc4257SSteve Yin // #CHECK# 23945fdc4257SSteve Yin if(pXAcc == NULL) 23955fdc4257SSteve Yin return E_INVALIDARG; 23965fdc4257SSteve Yin 23975fdc4257SSteve Yin *pXAcc = (long)pUNOInterface; 23985fdc4257SSteve Yin return S_OK; 23995fdc4257SSteve Yin } 24005fdc4257SSteve Yin 24015fdc4257SSteve Yin /** 24025fdc4257SSteve Yin * Helper method for Implementation of get_accDefaultAction 24035fdc4257SSteve Yin * @param pAction, the default action point of the current object. 24045fdc4257SSteve Yin * @return S_OK if successful. 24055fdc4257SSteve Yin */ 24065fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetDefaultAction(long pAction) 24075fdc4257SSteve Yin { 24085fdc4257SSteve Yin m_pXAction = (XAccessibleAction*)pAction; 24095fdc4257SSteve Yin return S_OK; 24105fdc4257SSteve Yin } 24115fdc4257SSteve Yin 24125fdc4257SSteve Yin /** 24135fdc4257SSteve Yin * This method is called when AT open some UI elements initially 24145fdc4257SSteve Yin * the UI element takes the default action defined here 24155fdc4257SSteve Yin * @param varChild, the child id of the defaultaction. 24165fdc4257SSteve Yin * @param pszDefaultAction,[in/out] the description of the current action. 24175fdc4257SSteve Yin * @return S_OK if successful. 24185fdc4257SSteve Yin */ 24195fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CMAccessible::get_accDefaultAction(VARIANT varChild, BSTR *pszDefaultAction) 24205fdc4257SSteve Yin { 24215fdc4257SSteve Yin 24225fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 24235fdc4257SSteve Yin ISDESTROY() 24245fdc4257SSteve Yin // #CHECK# 24255fdc4257SSteve Yin if(pszDefaultAction == NULL) 24265fdc4257SSteve Yin { 24275fdc4257SSteve Yin return E_INVALIDARG; 24285fdc4257SSteve Yin } 24295fdc4257SSteve Yin if(varChild.vt==VT_I4) 24305fdc4257SSteve Yin { 24315fdc4257SSteve Yin if(varChild.lVal==CHILDID_SELF) 24325fdc4257SSteve Yin { 24335fdc4257SSteve Yin if( m_pXAction == NULL ) 24345fdc4257SSteve Yin return DISP_E_MEMBERNOTFOUND; 24355fdc4257SSteve Yin SAFE_SYSFREESTRING(*pszDefaultAction); 24365fdc4257SSteve Yin *pszDefaultAction = SysAllocString(m_pszActionDescription); 24375fdc4257SSteve Yin return S_OK; 24385fdc4257SSteve Yin } 24395fdc4257SSteve Yin 24405fdc4257SSteve Yin long lVal = varChild.lVal; 24415fdc4257SSteve Yin varChild.lVal = CHILDID_SELF; 24425fdc4257SSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 24435fdc4257SSteve Yin if(!pChild) 24445fdc4257SSteve Yin return E_FAIL; 24455fdc4257SSteve Yin return pChild->get_accDefaultAction(varChild,pszDefaultAction); 24465fdc4257SSteve Yin } 24475fdc4257SSteve Yin return S_FALSE; 24485fdc4257SSteve Yin 24495fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 24505fdc4257SSteve Yin } 24515fdc4257SSteve Yin 24525fdc4257SSteve Yin /** 24535fdc4257SSteve Yin * AT call this method to operate application 24545fdc4257SSteve Yin * @param varChild, the child id of the action object. 24555fdc4257SSteve Yin * @return S_OK if successful. 24565fdc4257SSteve Yin */ 24575fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CMAccessible::accDoDefaultAction(VARIANT varChild) 24585fdc4257SSteve Yin { 24595fdc4257SSteve Yin 24605fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 24615fdc4257SSteve Yin ISDESTROY() 24625fdc4257SSteve Yin if( varChild.vt != VT_I4 ) 24635fdc4257SSteve Yin return E_INVALIDARG; 24645fdc4257SSteve Yin if( m_pXAction == NULL ) 24655fdc4257SSteve Yin return E_FAIL; 24665fdc4257SSteve Yin if( m_pXAction->getAccessibleActionCount() == 0 ) 24675fdc4257SSteve Yin return E_FAIL; 24685fdc4257SSteve Yin 24695fdc4257SSteve Yin if(varChild.lVal==CHILDID_SELF) 24705fdc4257SSteve Yin { 24715fdc4257SSteve Yin if(m_pXAction->getAccessibleActionCount() > 0) 24725fdc4257SSteve Yin m_pXAction->doAccessibleAction(0); 24735fdc4257SSteve Yin return S_OK; 24745fdc4257SSteve Yin } 24755fdc4257SSteve Yin 24765fdc4257SSteve Yin long lVal = varChild.lVal; 24775fdc4257SSteve Yin varChild.lVal = CHILDID_SELF; 24785fdc4257SSteve Yin IMAccessible *pChild = this->GetChildInterface(lVal); 24795fdc4257SSteve Yin if(!pChild) 24805fdc4257SSteve Yin return E_FAIL; 24815fdc4257SSteve Yin return pChild->accDoDefaultAction( varChild ); 24825fdc4257SSteve Yin 24835fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 24845fdc4257SSteve Yin } 24855fdc4257SSteve Yin 24865fdc4257SSteve Yin /** 24875fdc4257SSteve Yin * UNO set description information for action to COM. 24885fdc4257SSteve Yin * @param szAction, the action description of the current object. 24895fdc4257SSteve Yin * @return S_OK if successful. 24905fdc4257SSteve Yin */ 24915fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_ActionDescription( const OLECHAR* szAction) 24925fdc4257SSteve Yin { 24935fdc4257SSteve Yin 24945fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 24955fdc4257SSteve Yin ISDESTROY() 24965fdc4257SSteve Yin // #CHECK# 24975fdc4257SSteve Yin if(szAction == NULL) 24985fdc4257SSteve Yin { 24995fdc4257SSteve Yin return E_INVALIDARG; 25005fdc4257SSteve Yin } 25015fdc4257SSteve Yin SAFE_SYSFREESTRING(m_pszActionDescription ); 25025fdc4257SSteve Yin m_pszActionDescription = SysAllocString( szAction ); 25035fdc4257SSteve Yin return S_OK; 25045fdc4257SSteve Yin 25055fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 25065fdc4257SSteve Yin } 25075fdc4257SSteve Yin 25085fdc4257SSteve Yin BOOL CMAccessible::GetXInterfaceFromXAccessible(XAccessible* pXAcc, XInterface** ppXI, int index) 25095fdc4257SSteve Yin { 25105fdc4257SSteve Yin Reference< XAccessibleContext > pRContext; 25115fdc4257SSteve Yin 25125fdc4257SSteve Yin switch(index) 25135fdc4257SSteve Yin { 25145fdc4257SSteve Yin case XI_COMPONENT: 25155fdc4257SSteve Yin QUERYXINTERFACE(AccessibleComponent) 25165fdc4257SSteve Yin break; 25175fdc4257SSteve Yin case XI_TEXT: 25185fdc4257SSteve Yin QUERYXINTERFACE(AccessibleText) 25195fdc4257SSteve Yin break; 25205fdc4257SSteve Yin case XI_EDITABLETEXT: 25215fdc4257SSteve Yin QUERYXINTERFACE(AccessibleEditableText) 25225fdc4257SSteve Yin break; 25235fdc4257SSteve Yin case XI_TABLE: 25245fdc4257SSteve Yin QUERYXINTERFACE(AccessibleTable) 25255fdc4257SSteve Yin break; 25265fdc4257SSteve Yin case XI_SELECTION: 25275fdc4257SSteve Yin QUERYXINTERFACE(AccessibleSelection) 25285fdc4257SSteve Yin break; 25295fdc4257SSteve Yin case XI_EXTENDEDCOMP: 25305fdc4257SSteve Yin QUERYXINTERFACE(AccessibleExtendedComponent) 25315fdc4257SSteve Yin break; 25325fdc4257SSteve Yin case XI_KEYBINDING: 25335fdc4257SSteve Yin QUERYXINTERFACE(AccessibleKeyBinding) 25345fdc4257SSteve Yin break; 25355fdc4257SSteve Yin case XI_ACTION: 25365fdc4257SSteve Yin QUERYXINTERFACE(AccessibleAction) 25375fdc4257SSteve Yin break; 25385fdc4257SSteve Yin case XI_VALUE: 25395fdc4257SSteve Yin QUERYXINTERFACE(AccessibleValue) 25405fdc4257SSteve Yin break; 25415fdc4257SSteve Yin case XI_HYPERTEXT: 25425fdc4257SSteve Yin QUERYXINTERFACE(AccessibleHypertext) 25435fdc4257SSteve Yin break; 25445fdc4257SSteve Yin case XI_HYPERLINK: 25455fdc4257SSteve Yin QUERYXINTERFACE(AccessibleHyperlink) 25465fdc4257SSteve Yin break; 25475fdc4257SSteve Yin case XI_IMAGE: 25485fdc4257SSteve Yin QUERYXINTERFACE(AccessibleImage) 25495fdc4257SSteve Yin break; 25505fdc4257SSteve Yin default: 25515fdc4257SSteve Yin break; 25525fdc4257SSteve Yin } 25535fdc4257SSteve Yin 25545fdc4257SSteve Yin return FALSE; 25555fdc4257SSteve Yin } 25565fdc4257SSteve Yin 25575fdc4257SSteve Yin HRESULT WINAPI CMAccessible::SmartQI(void* pv, REFIID iid, void** ppvObject) 25585fdc4257SSteve Yin { 25595fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 25605fdc4257SSteve Yin ISDESTROY() 25615fdc4257SSteve Yin if( ImplIsEqualGUID(iid,IID_IAccIdentity) || 25625fdc4257SSteve Yin ImplIsEqualGUID(iid,IID_IStdMarshalInfo) || 25635fdc4257SSteve Yin ImplIsEqualGUID(iid,IID_IMarshal) || 25645fdc4257SSteve Yin ImplIsEqualGUID(iid,IID_IExternalConnection)|| 25655fdc4257SSteve Yin ImplIsEqualGUID(iid,IID_IOleWindow)) 25665fdc4257SSteve Yin return E_FAIL; 25675fdc4257SSteve Yin 25685fdc4257SSteve Yin 25695fdc4257SSteve Yin _UNO_AGGMAP_ENTRY* pMap = _GetAggEntries(); 25705fdc4257SSteve Yin while(pMap && pMap->piid) 25715fdc4257SSteve Yin { 25725fdc4257SSteve Yin if(ImplIsEqualGUID(iid, *pMap->piid)) 25735fdc4257SSteve Yin { 25745fdc4257SSteve Yin XInterface* pXI = NULL; 25755fdc4257SSteve Yin BOOL bFound = GetXInterfaceFromXAccessible(pUNOInterface,&pXI,pMap->XIFIndex); 25765fdc4257SSteve Yin if(!bFound) 25775fdc4257SSteve Yin { 25785fdc4257SSteve Yin return E_FAIL; 25795fdc4257SSteve Yin } 25805fdc4257SSteve Yin 25815fdc4257SSteve Yin XGUIDToComObjHash::iterator pIndTemp = m_containedObjects.find( iid ); 25825fdc4257SSteve Yin if ( pIndTemp != m_containedObjects.end() ) 25835fdc4257SSteve Yin { 25845fdc4257SSteve Yin return pIndTemp->second.p->QueryInterface( iid, ppvObject ); 25855fdc4257SSteve Yin } 25865fdc4257SSteve Yin else 25875fdc4257SSteve Yin { 2588b0a7a3cfSSteve Yin ActivateActContext(); 25895fdc4257SSteve Yin HRESULT hr = pMap->pfnCreateInstance(pv, iid, ppvObject); 2590b0a7a3cfSSteve Yin DeactivateActContext(); 25915fdc4257SSteve Yin if(hr == S_OK) 25925fdc4257SSteve Yin { 25935fdc4257SSteve Yin m_containedObjects.insert(XGUIDToComObjHash::value_type(*pMap->piid,(IUnknown*)*ppvObject)); 25945fdc4257SSteve Yin IUNOXWrapper* wrapper = NULL; 25955fdc4257SSteve Yin ((IUnknown*)*ppvObject)->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper); 25965fdc4257SSteve Yin if(wrapper) 25975fdc4257SSteve Yin { 25985fdc4257SSteve Yin wrapper->put_XInterface((long)pUNOInterface); 25995fdc4257SSteve Yin wrapper->Release(); 26005fdc4257SSteve Yin } 26015fdc4257SSteve Yin return S_OK; 26025fdc4257SSteve Yin } 26035fdc4257SSteve Yin } 26045fdc4257SSteve Yin return E_FAIL; 26055fdc4257SSteve Yin } 26065fdc4257SSteve Yin pMap++; 26075fdc4257SSteve Yin } 26085fdc4257SSteve Yin return E_FAIL; 26095fdc4257SSteve Yin 26105fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 26115fdc4257SSteve Yin } 26125fdc4257SSteve Yin 26135fdc4257SSteve Yin BOOL CMAccessible::get_IAccessibleFromXAccessible(long pXAcc, IAccessible **ppIA) 26145fdc4257SSteve Yin { 26155fdc4257SSteve Yin 26165fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 26175fdc4257SSteve Yin 26185fdc4257SSteve Yin // #CHECK# 26195fdc4257SSteve Yin if(ppIA == NULL) 26205fdc4257SSteve Yin { 26215fdc4257SSteve Yin return E_INVALIDARG; 26225fdc4257SSteve Yin } 26235fdc4257SSteve Yin BOOL isGet = FALSE; 26245fdc4257SSteve Yin if(g_pAgent) 26255fdc4257SSteve Yin isGet = g_pAgent->GetIAccessibleFromXAccessible((XAccessible*)pXAcc,ppIA); 26265fdc4257SSteve Yin 26275fdc4257SSteve Yin if(isGet) 26285fdc4257SSteve Yin return TRUE; 26295fdc4257SSteve Yin else 26305fdc4257SSteve Yin return FALSE; 26315fdc4257SSteve Yin 26325fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 26335fdc4257SSteve Yin } 26345fdc4257SSteve Yin 26355fdc4257SSteve Yin void CMAccessible::get_OLECHARFromAny(Any& pAny, OLECHAR* pChar) 26365fdc4257SSteve Yin { 26375fdc4257SSteve Yin // #CHECK# 26385fdc4257SSteve Yin if(pChar == NULL) 26395fdc4257SSteve Yin return; 26405fdc4257SSteve Yin 26415fdc4257SSteve Yin switch(pAny.getValueTypeClass()) 26425fdc4257SSteve Yin { 26435fdc4257SSteve Yin case TypeClass_CHAR: 26445fdc4257SSteve Yin { 26455fdc4257SSteve Yin sal_Int8 val; 26465fdc4257SSteve Yin pAny >>= val; 26475fdc4257SSteve Yin swprintf( pChar, L"%d", val); 26485fdc4257SSteve Yin break; 26495fdc4257SSteve Yin } 26505fdc4257SSteve Yin case TypeClass_BOOLEAN: 26515fdc4257SSteve Yin { 26525fdc4257SSteve Yin sal_Bool val; 26535fdc4257SSteve Yin pAny >>= val; 26545fdc4257SSteve Yin swprintf( pChar, L"%d", val); 26555fdc4257SSteve Yin break; 26565fdc4257SSteve Yin } 26575fdc4257SSteve Yin case TypeClass_BYTE: 26585fdc4257SSteve Yin { 26595fdc4257SSteve Yin sal_Int8 val; 26605fdc4257SSteve Yin pAny >>= val; 26615fdc4257SSteve Yin swprintf( pChar, L"%d", val); 26625fdc4257SSteve Yin break; 26635fdc4257SSteve Yin } 26645fdc4257SSteve Yin case TypeClass_SHORT: 26655fdc4257SSteve Yin { 26665fdc4257SSteve Yin SHORT val; 26675fdc4257SSteve Yin pAny >>= val; 26685fdc4257SSteve Yin swprintf( pChar, L"%d", val); 26695fdc4257SSteve Yin break; 26705fdc4257SSteve Yin } 26715fdc4257SSteve Yin case TypeClass_UNSIGNED_SHORT: 26725fdc4257SSteve Yin { 26735fdc4257SSteve Yin USHORT val; 26745fdc4257SSteve Yin pAny >>= val; 26755fdc4257SSteve Yin swprintf( pChar, L"%d", val); 26765fdc4257SSteve Yin break; 26775fdc4257SSteve Yin } 26785fdc4257SSteve Yin case TypeClass_LONG: 26795fdc4257SSteve Yin { 26805fdc4257SSteve Yin LONG val; 26815fdc4257SSteve Yin pAny >>= val; 26825fdc4257SSteve Yin swprintf( pChar, L"%ld", val); 26835fdc4257SSteve Yin break; 26845fdc4257SSteve Yin } 26855fdc4257SSteve Yin case TypeClass_UNSIGNED_LONG: 26865fdc4257SSteve Yin { 26875fdc4257SSteve Yin ULONG val; 26885fdc4257SSteve Yin pAny >>= val; 26895fdc4257SSteve Yin swprintf( pChar, L"%ld", val); 26905fdc4257SSteve Yin break; 26915fdc4257SSteve Yin } 26925fdc4257SSteve Yin case TypeClass_FLOAT: 26935fdc4257SSteve Yin { 26945fdc4257SSteve Yin FLOAT val; 26955fdc4257SSteve Yin pAny >>= val; 26965fdc4257SSteve Yin swprintf( pChar, L"%.3f", val); 26975fdc4257SSteve Yin break; 26985fdc4257SSteve Yin } 26995fdc4257SSteve Yin case TypeClass_DOUBLE: 27005fdc4257SSteve Yin { 27015fdc4257SSteve Yin DOUBLE val; 27025fdc4257SSteve Yin pAny >>= val; 27035fdc4257SSteve Yin swprintf( pChar, L"%.6lf", val); 27045fdc4257SSteve Yin break; 27055fdc4257SSteve Yin } 27065fdc4257SSteve Yin case TypeClass_STRING: 27075fdc4257SSteve Yin { 27085fdc4257SSteve Yin ::rtl::OUString val; 27095fdc4257SSteve Yin pAny >>= val; 27105fdc4257SSteve Yin wcscpy(pChar, val.getStr()); 27115fdc4257SSteve Yin break; 27125fdc4257SSteve Yin } 27135fdc4257SSteve Yin case TypeClass_SEQUENCE: 27145fdc4257SSteve Yin { 27155fdc4257SSteve Yin if(pAny.getValueType() == getCppuType( (Sequence< ::rtl::OUString > *)0 ) ) 27165fdc4257SSteve Yin { 27175fdc4257SSteve Yin Sequence < ::rtl::OUString > val; 27185fdc4257SSteve Yin pAny >>= val; 27195fdc4257SSteve Yin 27205fdc4257SSteve Yin ::rtl::OUString pString; 27215fdc4257SSteve Yin 27225fdc4257SSteve Yin int count = val.getLength(); 27235fdc4257SSteve Yin 27245fdc4257SSteve Yin for( int iIndex = 0;iIndex < count;iIndex++ ) 27255fdc4257SSteve Yin { 27265fdc4257SSteve Yin pString += val[iIndex]; 27275fdc4257SSteve Yin } 27285fdc4257SSteve Yin wcscpy(pChar, pString.getStr()); 27295fdc4257SSteve Yin } 27305fdc4257SSteve Yin else if (pAny.getValueType() == getCppuType( (Sequence< ::com::sun::star::style::TabStop >* )0 ) ) 27315fdc4257SSteve Yin { 27325fdc4257SSteve Yin Sequence < ::com::sun::star::style::TabStop > val; 27335fdc4257SSteve Yin pAny >>= val; 27345fdc4257SSteve Yin int count = val.getLength(); 27355fdc4257SSteve Yin 27365fdc4257SSteve Yin for( int iIndex = 0;iIndex < count;iIndex++ ) 27375fdc4257SSteve Yin { 27385fdc4257SSteve Yin OLECHAR pAttrs[512] = {NULL}; 27395fdc4257SSteve Yin 27405fdc4257SSteve Yin OLECHAR pAttrsPosition[512] = {NULL}; 27415fdc4257SSteve Yin OLECHAR pAttrsDescimalChar[512] = {NULL}; 27425fdc4257SSteve Yin OLECHAR pAttrsFillChar[512] = {NULL}; 27435fdc4257SSteve Yin 27445fdc4257SSteve Yin ::com::sun::star::style::TabStop sigleVal = val[iIndex]; 27455fdc4257SSteve Yin 27465fdc4257SSteve Yin swprintf( pAttrsPosition, L"Position=%ld,TabAlign=%ld", 27475fdc4257SSteve Yin sigleVal.Position, sigleVal.Alignment); 27485fdc4257SSteve Yin 27495fdc4257SSteve Yin if(sigleVal.DecimalChar==';' || sigleVal.DecimalChar == ':' || sigleVal.DecimalChar == ',' || 27505fdc4257SSteve Yin sigleVal.DecimalChar == '=' || sigleVal.DecimalChar == '\\') 27515fdc4257SSteve Yin swprintf( pAttrsDescimalChar, L"DecimalChar=\\%c",sigleVal.DecimalChar); 27525fdc4257SSteve Yin else 27535fdc4257SSteve Yin swprintf( pAttrsDescimalChar, L"DecimalChar=%c",sigleVal.DecimalChar); 27545fdc4257SSteve Yin 27555fdc4257SSteve Yin if(sigleVal.FillChar==';' || sigleVal.FillChar == ':' || sigleVal.FillChar == ',' || 27565fdc4257SSteve Yin sigleVal.FillChar == '=' || sigleVal.FillChar == '\\') 27575fdc4257SSteve Yin swprintf( pAttrsFillChar, L"FillChar=\\%c",sigleVal.FillChar); 27585fdc4257SSteve Yin else 27595fdc4257SSteve Yin swprintf( pAttrsFillChar, L"FillChar=%c",sigleVal.FillChar); 27605fdc4257SSteve Yin 27615fdc4257SSteve Yin swprintf( pAttrs, L"%s,%s,%s,",pAttrsPosition,pAttrsDescimalChar,pAttrsFillChar); 27625fdc4257SSteve Yin 27635fdc4257SSteve Yin wcscat(pChar,pAttrs); 27645fdc4257SSteve Yin } 27655fdc4257SSteve Yin } 27665fdc4257SSteve Yin break; 27675fdc4257SSteve Yin } 27685fdc4257SSteve Yin case TypeClass_ENUM: 27695fdc4257SSteve Yin { 27705fdc4257SSteve Yin if (pAny.getValueType() == getCppuType( (::com::sun::star::awt::FontSlant* )0 ) ) 27715fdc4257SSteve Yin { 27725fdc4257SSteve Yin com::sun::star::awt::FontSlant val; 27735fdc4257SSteve Yin pAny >>= val; 27745fdc4257SSteve Yin swprintf( pChar, L"%d", val); 27755fdc4257SSteve Yin } 27765fdc4257SSteve Yin } 27775fdc4257SSteve Yin case TypeClass_STRUCT: 27785fdc4257SSteve Yin { 27795fdc4257SSteve Yin if (pAny.getValueType() == getCppuType( (::com::sun::star::style::LineSpacing* )0 ) ) 27805fdc4257SSteve Yin { 27815fdc4257SSteve Yin com::sun::star::style::LineSpacing val; 27825fdc4257SSteve Yin pAny >>= val; 27835fdc4257SSteve Yin swprintf( pChar, L"Mode=%ld,Height=%ld,", val.Mode, val.Height); 27845fdc4257SSteve Yin } 27855fdc4257SSteve Yin else if (pAny.getValueType() == getCppuType( (com::sun::star::accessibility::TextSegment *)0 ) ) 27865fdc4257SSteve Yin { 27875fdc4257SSteve Yin com::sun::star::accessibility::TextSegment val; 27885fdc4257SSteve Yin pAny >>= val; 27895fdc4257SSteve Yin ::rtl::OUString realVal(val.SegmentText); 27905fdc4257SSteve Yin wcscpy(pChar, realVal.getStr()); 27915fdc4257SSteve Yin } 27925fdc4257SSteve Yin break; 27935fdc4257SSteve Yin } 27945fdc4257SSteve Yin case TypeClass_VOID: 27955fdc4257SSteve Yin case TypeClass_HYPER: 27965fdc4257SSteve Yin case TypeClass_UNSIGNED_HYPER: 27975fdc4257SSteve Yin case TypeClass_TYPE: 27985fdc4257SSteve Yin case TypeClass_ANY: 27995fdc4257SSteve Yin case TypeClass_TYPEDEF: 28005fdc4257SSteve Yin case TypeClass_UNION: 28015fdc4257SSteve Yin case TypeClass_EXCEPTION: 28025fdc4257SSteve Yin case TypeClass_ARRAY: 28035fdc4257SSteve Yin case TypeClass_INTERFACE: 28045fdc4257SSteve Yin case TypeClass_SERVICE: 28055fdc4257SSteve Yin case TypeClass_MODULE: 28065fdc4257SSteve Yin case TypeClass_INTERFACE_METHOD: 28075fdc4257SSteve Yin case TypeClass_INTERFACE_ATTRIBUTE: 28085fdc4257SSteve Yin case TypeClass_UNKNOWN: 28095fdc4257SSteve Yin case TypeClass_PROPERTY: 28105fdc4257SSteve Yin case TypeClass_CONSTANT: 28115fdc4257SSteve Yin case TypeClass_CONSTANTS: 28125fdc4257SSteve Yin case TypeClass_SINGLETON: 28135fdc4257SSteve Yin case TypeClass_MAKE_FIXED_SIZE: 28145fdc4257SSteve Yin break; 28155fdc4257SSteve Yin default: 28165fdc4257SSteve Yin break; 28175fdc4257SSteve Yin } 28185fdc4257SSteve Yin } 28195fdc4257SSteve Yin 28205fdc4257SSteve Yin void CMAccessible::get_OLECHAR4Numbering(const Any& pAny, short numberingLevel,const OUString& numberingPrefix,OLECHAR* pChar) 28215fdc4257SSteve Yin { 28225fdc4257SSteve Yin if(pChar == NULL) 28235fdc4257SSteve Yin return; 28245fdc4257SSteve Yin Reference< ::com::sun::star::container::XIndexReplace > pXIndex; 28255fdc4257SSteve Yin if((pAny>>=pXIndex) && (numberingLevel !=-1))//numbering level is -1,means invalid value 28265fdc4257SSteve Yin { 28275fdc4257SSteve Yin Any aAny = pXIndex->getByIndex(numberingLevel); 28285fdc4257SSteve Yin Sequence< ::com::sun::star::beans::PropertyValue > aProps; 28295fdc4257SSteve Yin aAny >>= aProps; 28305fdc4257SSteve Yin const ::com::sun::star::beans::PropertyValue* pPropArray = aProps.getConstArray(); 28315fdc4257SSteve Yin sal_Int32 nCount = aProps.getLength(); 28325fdc4257SSteve Yin swprintf(pChar,L"Numbering:NumberingLevel=%d,",numberingLevel); 28335fdc4257SSteve Yin for( sal_Int32 i=0; i<nCount; i++ ) 28345fdc4257SSteve Yin { 28355fdc4257SSteve Yin ::com::sun::star::beans::PropertyValue rProp = pPropArray[i]; 28365fdc4257SSteve Yin if( (rProp.Name.compareTo(OUString::createFromAscii("BulletChar"))==0)|| 28375fdc4257SSteve Yin (rProp.Name.compareTo(OUString::createFromAscii("GraphicURL"))==0)|| 28385fdc4257SSteve Yin (rProp.Name.compareTo(OUString::createFromAscii("NumberingType"))==0)) 28395fdc4257SSteve Yin { 28405fdc4257SSteve Yin OLECHAR propStr[512] = {NULL}; 28415fdc4257SSteve Yin swprintf(propStr,L"%s=",rProp.Name.getStr()); 28425fdc4257SSteve Yin OLECHAR pTemp[256] = {NULL}; 28435fdc4257SSteve Yin CMAccessible::get_OLECHARFromAny(rProp.Value,pTemp); 28445fdc4257SSteve Yin if(rProp.Name.compareTo(OUString::createFromAscii("GraphicURL"))==0) 28455fdc4257SSteve Yin { 28465fdc4257SSteve Yin OLECHAR* pOccur = wcschr(pTemp,':'); 28475fdc4257SSteve Yin if(pOccur) 28485fdc4257SSteve Yin *pOccur = '.'; 28495fdc4257SSteve Yin } 28505fdc4257SSteve Yin wcscat(propStr,pTemp); 28515fdc4257SSteve Yin wcscat(pChar,propStr); 28525fdc4257SSteve Yin wcscat(pChar,L","); 28535fdc4257SSteve Yin 28545fdc4257SSteve Yin if(rProp.Name.compareTo(OUString::createFromAscii("NumberingType"))==0) 28555fdc4257SSteve Yin { 28565fdc4257SSteve Yin if(numberingPrefix.getLength()!=0) 28575fdc4257SSteve Yin { 28585fdc4257SSteve Yin swprintf(pTemp,L"NumberingPrefix=%s,",numberingPrefix.getStr()); 28595fdc4257SSteve Yin wcscat(pChar,pTemp); 28605fdc4257SSteve Yin } 28615fdc4257SSteve Yin } 28625fdc4257SSteve Yin } 28635fdc4257SSteve Yin } 28645fdc4257SSteve Yin } 28655fdc4257SSteve Yin 28665fdc4257SSteve Yin //Because now have three types numbering level: 28675fdc4257SSteve Yin //1.real numbering list,numbering level>=0 and numbering Rule !=NULL; 28685fdc4257SSteve Yin //2.common paragraph, numbering level >=0, and numbering Rule == NULL; 28695fdc4257SSteve Yin //3.TOC paragraph, numbering level >0, and numbering Rule ==NULL; 28705fdc4257SSteve Yin // IAText:numberinglevel base on 0, but TOC's level base on 1, 28715fdc4257SSteve Yin // so NumberingLevel value will be decreased 1 in bridge code. 28725fdc4257SSteve Yin else if(numberingLevel >0) 28735fdc4257SSteve Yin { 28745fdc4257SSteve Yin swprintf(pChar,L"Numbering:NumberingLevel=%d,NumberingType=4,NumberingPrefix=,",numberingLevel-1); 28755fdc4257SSteve Yin } 28765fdc4257SSteve Yin else 28775fdc4257SSteve Yin { 28785fdc4257SSteve Yin swprintf(pChar,L"Numbering:"); 28795fdc4257SSteve Yin } 28805fdc4257SSteve Yin } 28815fdc4257SSteve Yin 28825fdc4257SSteve Yin void CMAccessible::ConvertAnyToVariant(const ::com::sun::star::uno::Any &rAnyVal, VARIANT *pvData) 28835fdc4257SSteve Yin { 28845fdc4257SSteve Yin if(rAnyVal.hasValue()) 28855fdc4257SSteve Yin { 28865fdc4257SSteve Yin // Clear VARIANT variable. 28875fdc4257SSteve Yin VariantClear(pvData); 28885fdc4257SSteve Yin 28895fdc4257SSteve Yin // Set value according to value type. 28905fdc4257SSteve Yin switch(rAnyVal.getValueTypeClass()) 28915fdc4257SSteve Yin { 28925fdc4257SSteve Yin case TypeClass_CHAR: 28935fdc4257SSteve Yin pvData->vt = VT_UI1; 28945fdc4257SSteve Yin memcpy(&pvData->bVal, rAnyVal.getValue(), sizeof(sal_Char)); 28955fdc4257SSteve Yin break; 28965fdc4257SSteve Yin 28975fdc4257SSteve Yin case TypeClass_BOOLEAN: 28985fdc4257SSteve Yin pvData->vt = VT_BOOL; 28995fdc4257SSteve Yin memcpy(&pvData->boolVal, rAnyVal.getValue(), sizeof(sal_Bool)); 29005fdc4257SSteve Yin break; 29015fdc4257SSteve Yin 29025fdc4257SSteve Yin case TypeClass_BYTE: 29035fdc4257SSteve Yin pvData->vt = VT_UI1; 29045fdc4257SSteve Yin memcpy(&pvData->bVal, rAnyVal.getValue(), sizeof(sal_Int8)); 29055fdc4257SSteve Yin break; 29065fdc4257SSteve Yin 29075fdc4257SSteve Yin case TypeClass_SHORT: 29085fdc4257SSteve Yin pvData->vt = VT_I2; 29095fdc4257SSteve Yin memcpy(&pvData->iVal, rAnyVal.getValue(), sizeof(sal_Int16)); 29105fdc4257SSteve Yin break; 29115fdc4257SSteve Yin 29125fdc4257SSteve Yin case TypeClass_UNSIGNED_SHORT: 29135fdc4257SSteve Yin pvData->vt = VT_I2; 29145fdc4257SSteve Yin memcpy(&pvData->iVal, rAnyVal.getValue(), sizeof(sal_uInt16)); 29155fdc4257SSteve Yin break; 29165fdc4257SSteve Yin 29175fdc4257SSteve Yin case TypeClass_LONG: 29185fdc4257SSteve Yin pvData->vt = VT_I4; 29195fdc4257SSteve Yin memcpy(&pvData->lVal, rAnyVal.getValue(), sizeof(sal_Int32)); 29205fdc4257SSteve Yin break; 29215fdc4257SSteve Yin 29225fdc4257SSteve Yin case TypeClass_UNSIGNED_LONG: 29235fdc4257SSteve Yin pvData->vt = VT_I4; 29245fdc4257SSteve Yin memcpy(&pvData->lVal, rAnyVal.getValue(), sizeof(sal_uInt32)); 29255fdc4257SSteve Yin break; 29265fdc4257SSteve Yin 29275fdc4257SSteve Yin case TypeClass_FLOAT: 29285fdc4257SSteve Yin pvData->vt = VT_R4; 29295fdc4257SSteve Yin memcpy(&pvData->fltVal, rAnyVal.getValue(), sizeof(float)); 29305fdc4257SSteve Yin break; 29315fdc4257SSteve Yin 29325fdc4257SSteve Yin case TypeClass_DOUBLE: 29335fdc4257SSteve Yin pvData->vt = VT_R8; 29345fdc4257SSteve Yin memcpy(&pvData->dblVal, rAnyVal.getValue(), sizeof(double)); 29355fdc4257SSteve Yin break; 29365fdc4257SSteve Yin 29375fdc4257SSteve Yin case TypeClass_STRING: 29385fdc4257SSteve Yin { 29395fdc4257SSteve Yin pvData->vt = VT_BSTR; 29405fdc4257SSteve Yin ::rtl::OUString val; 29415fdc4257SSteve Yin rAnyVal >>= val; 29425fdc4257SSteve Yin pvData->bstrVal = SysAllocString((OLECHAR *)val.getStr()); 29435fdc4257SSteve Yin break; 29445fdc4257SSteve Yin } 29455fdc4257SSteve Yin 29465fdc4257SSteve Yin case TypeClass_VOID: 29475fdc4257SSteve Yin case TypeClass_HYPER: 29485fdc4257SSteve Yin case TypeClass_UNSIGNED_HYPER: 29495fdc4257SSteve Yin case TypeClass_TYPE: 29505fdc4257SSteve Yin case TypeClass_ANY: 29515fdc4257SSteve Yin case TypeClass_ENUM: 29525fdc4257SSteve Yin case TypeClass_TYPEDEF: 29535fdc4257SSteve Yin case TypeClass_STRUCT: 29545fdc4257SSteve Yin case TypeClass_UNION: 29555fdc4257SSteve Yin case TypeClass_EXCEPTION: 29565fdc4257SSteve Yin case TypeClass_SEQUENCE: 29575fdc4257SSteve Yin case TypeClass_ARRAY: 29585fdc4257SSteve Yin case TypeClass_INTERFACE: 29595fdc4257SSteve Yin { 29605fdc4257SSteve Yin Reference< XAccessible > pXAcc; 29615fdc4257SSteve Yin if(rAnyVal >>= pXAcc) 29625fdc4257SSteve Yin { 29635fdc4257SSteve Yin if(pXAcc.is()) 29645fdc4257SSteve Yin { 29655fdc4257SSteve Yin IAccessible* pIAcc = NULL; 29665fdc4257SSteve Yin get_IAccessibleFromXAccessible((long)pXAcc.get(), &pIAcc); 29675fdc4257SSteve Yin if(pIAcc == NULL) 29685fdc4257SSteve Yin { 29695fdc4257SSteve Yin Reference< XAccessibleContext > pXAccContext = pXAcc->getAccessibleContext(); 29705fdc4257SSteve Yin g_pAgent->InsertAccObj(pXAcc.get(),pXAccContext->getAccessibleParent().get()); 29715fdc4257SSteve Yin get_IAccessibleFromXAccessible((long)pXAcc.get(), &pIAcc); 29725fdc4257SSteve Yin } 29735fdc4257SSteve Yin if(pIAcc) 29745fdc4257SSteve Yin { 29755fdc4257SSteve Yin pIAcc->AddRef(); 29765fdc4257SSteve Yin 29775fdc4257SSteve Yin pvData->vt = VT_UNKNOWN; 29785fdc4257SSteve Yin pvData->pdispVal = (IAccessible2*)pIAcc; 29795fdc4257SSteve Yin break; 29805fdc4257SSteve Yin } 29815fdc4257SSteve Yin } 29825fdc4257SSteve Yin } 29835fdc4257SSteve Yin } 29845fdc4257SSteve Yin case TypeClass_SERVICE: 29855fdc4257SSteve Yin case TypeClass_MODULE: 29865fdc4257SSteve Yin case TypeClass_INTERFACE_METHOD: 29875fdc4257SSteve Yin case TypeClass_INTERFACE_ATTRIBUTE: 29885fdc4257SSteve Yin case TypeClass_UNKNOWN: 29895fdc4257SSteve Yin case TypeClass_PROPERTY: 29905fdc4257SSteve Yin case TypeClass_CONSTANT: 29915fdc4257SSteve Yin case TypeClass_CONSTANTS: 29925fdc4257SSteve Yin case TypeClass_SINGLETON: 29935fdc4257SSteve Yin case TypeClass_MAKE_FIXED_SIZE: 29945fdc4257SSteve Yin // Output the type string, if there is other uno value type. 29955fdc4257SSteve Yin pvData->vt = VT_BSTR; 29965fdc4257SSteve Yin pvData->bstrVal = SysAllocString(rAnyVal.getValueTypeName().getStr()); 29975fdc4257SSteve Yin break; 29985fdc4257SSteve Yin 29995fdc4257SSteve Yin default: 30005fdc4257SSteve Yin break; 30015fdc4257SSteve Yin } 30025fdc4257SSteve Yin } 30035fdc4257SSteve Yin else 30045fdc4257SSteve Yin { 30055fdc4257SSteve Yin VariantClear(pvData); 30065fdc4257SSteve Yin } 30075fdc4257SSteve Yin } 30085fdc4257SSteve Yin 30095fdc4257SSteve Yin STDMETHODIMP CMAccessible::Get_XAccChildID(long* childID) 30105fdc4257SSteve Yin { 30115fdc4257SSteve Yin // #CHECK# 30125fdc4257SSteve Yin if(childID == NULL) 30135fdc4257SSteve Yin { 30145fdc4257SSteve Yin return E_FAIL; 30155fdc4257SSteve Yin } 30165fdc4257SSteve Yin *childID = m_dChildID; 30175fdc4257SSteve Yin return S_OK; 30185fdc4257SSteve Yin } 30195fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_states(AccessibleStates __RPC_FAR *states ) 30205fdc4257SSteve Yin { 30215fdc4257SSteve Yin 30225fdc4257SSteve Yin CHECK_ENABLE_INF 30235fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 30245fdc4257SSteve Yin ISDESTROY() 30255fdc4257SSteve Yin // #CHECK XInterface# 30265fdc4257SSteve Yin if( !pRContext.is() ) 30275fdc4257SSteve Yin return E_FAIL; 30285fdc4257SSteve Yin 30295fdc4257SSteve Yin Reference<XAccessibleStateSet> pRStateSet = pRContext.get()->getAccessibleStateSet(); 30305fdc4257SSteve Yin if(!pRStateSet.is()) 30315fdc4257SSteve Yin { 30325fdc4257SSteve Yin return S_OK; 30335fdc4257SSteve Yin } 30345fdc4257SSteve Yin Sequence<short> pStates = pRStateSet->getStates(); 30355fdc4257SSteve Yin 30365fdc4257SSteve Yin 30375fdc4257SSteve Yin long count = pStates.getLength() ; 30385fdc4257SSteve Yin *states = 0x0; 30395fdc4257SSteve Yin for( int i = 0; i < count; i++ ) 30405fdc4257SSteve Yin { 30415fdc4257SSteve Yin for( int j = 0; j < sizeof(UNO_STATES) / sizeof(UNO_STATES[0]); j++ ) 30425fdc4257SSteve Yin { 30435fdc4257SSteve Yin if( pStates[i] == UNO_STATES[j] ) 30445fdc4257SSteve Yin { 30455fdc4257SSteve Yin *states |= IA2_STATES[j]; 30465fdc4257SSteve Yin break; 30475fdc4257SSteve Yin } 30485fdc4257SSteve Yin } 30495fdc4257SSteve Yin } 30505fdc4257SSteve Yin return S_OK; 30515fdc4257SSteve Yin 30525fdc4257SSteve Yin 30535fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 30545fdc4257SSteve Yin } 30555fdc4257SSteve Yin 30565fdc4257SSteve Yin // return the UNO roles 30575fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_extendedRole( BSTR __RPC_FAR * ) 30585fdc4257SSteve Yin { 30595fdc4257SSteve Yin 30605fdc4257SSteve Yin CHECK_ENABLE_INF 30615fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 30625fdc4257SSteve Yin ISDESTROY() 30635fdc4257SSteve Yin 30645fdc4257SSteve Yin return E_NOTIMPL; 30655fdc4257SSteve Yin 30665fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 30675fdc4257SSteve Yin } 30685fdc4257SSteve Yin 30695fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_localizedExtendedRole( BSTR __RPC_FAR * ) 30705fdc4257SSteve Yin { 30715fdc4257SSteve Yin 30725fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 30735fdc4257SSteve Yin ISDESTROY() 30745fdc4257SSteve Yin return E_NOTIMPL; 30755fdc4257SSteve Yin 30765fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 30775fdc4257SSteve Yin } 30785fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_nExtendedStates( long __RPC_FAR * ) 30795fdc4257SSteve Yin { 30805fdc4257SSteve Yin 30815fdc4257SSteve Yin CHECK_ENABLE_INF 30825fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 30835fdc4257SSteve Yin ISDESTROY() 30845fdc4257SSteve Yin 30855fdc4257SSteve Yin return E_NOTIMPL; 30865fdc4257SSteve Yin 30875fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 30885fdc4257SSteve Yin } 30895fdc4257SSteve Yin 30905fdc4257SSteve Yin 30915fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_localizedExtendedStates( long, BSTR __RPC_FAR *__RPC_FAR *, long __RPC_FAR *) 30925fdc4257SSteve Yin { 30935fdc4257SSteve Yin 30945fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 30955fdc4257SSteve Yin ISDESTROY() 30965fdc4257SSteve Yin return E_NOTIMPL; 30975fdc4257SSteve Yin 30985fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 30995fdc4257SSteve Yin } 31005fdc4257SSteve Yin 31015fdc4257SSteve Yin 31025fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_indexInParent( long __RPC_FAR *accParentIndex) 31035fdc4257SSteve Yin { 31045fdc4257SSteve Yin 31055fdc4257SSteve Yin CHECK_ENABLE_INF 31065fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 31075fdc4257SSteve Yin ISDESTROY() 31085fdc4257SSteve Yin // #CHECK# 31095fdc4257SSteve Yin if(accParentIndex == NULL) 31105fdc4257SSteve Yin return E_INVALIDARG; 31115fdc4257SSteve Yin 31125fdc4257SSteve Yin // #CHECK XInterface# 31135fdc4257SSteve Yin if( !pRContext.is() ) 31145fdc4257SSteve Yin return E_FAIL; 31155fdc4257SSteve Yin 31165fdc4257SSteve Yin *accParentIndex = pRContext.get()->getAccessibleIndexInParent(); 31175fdc4257SSteve Yin return S_OK; 31185fdc4257SSteve Yin 31195fdc4257SSteve Yin 31205fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 31215fdc4257SSteve Yin } 31225fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_locale( IA2Locale __RPC_FAR *locale ) 31235fdc4257SSteve Yin { 31245fdc4257SSteve Yin 31255fdc4257SSteve Yin CHECK_ENABLE_INF 31265fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 31275fdc4257SSteve Yin ISDESTROY() 31285fdc4257SSteve Yin if(locale == NULL) 31295fdc4257SSteve Yin return E_INVALIDARG; 31305fdc4257SSteve Yin // #CHECK XInterface# 31315fdc4257SSteve Yin 31325fdc4257SSteve Yin if( !pRContext.is() ) 31335fdc4257SSteve Yin return E_FAIL; 31345fdc4257SSteve Yin 31355fdc4257SSteve Yin ::com::sun::star::lang::Locale unoLoc = pRContext.get()->getLocale(); 31365fdc4257SSteve Yin locale->language = SysAllocString((OLECHAR*)unoLoc.Language.getStr()); 31375fdc4257SSteve Yin locale->country = SysAllocString((OLECHAR*)unoLoc.Country.getStr()); 31385fdc4257SSteve Yin locale->variant = SysAllocString((OLECHAR*)unoLoc.Variant.getStr()); 31395fdc4257SSteve Yin 31405fdc4257SSteve Yin return S_OK; 31415fdc4257SSteve Yin 31425fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 31435fdc4257SSteve Yin } 31445fdc4257SSteve Yin 31455fdc4257SSteve Yin DWORD GetMSAAStateFromUNO(short xState) 31465fdc4257SSteve Yin { 31475fdc4257SSteve Yin DWORD IState = STATE_SYSTEM_UNAVAILABLE; 31485fdc4257SSteve Yin switch( xState ) 31495fdc4257SSteve Yin { 31505fdc4257SSteve Yin case /*AccessibleStateType::*/AccessibleStateType::BUSY: 31515fdc4257SSteve Yin IState = STATE_SYSTEM_BUSY; 31525fdc4257SSteve Yin break; 31535fdc4257SSteve Yin case /*AccessibleStateType::*/AccessibleStateType::CHECKED: 31545fdc4257SSteve Yin IState = STATE_SYSTEM_CHECKED; 31555fdc4257SSteve Yin break; 31565fdc4257SSteve Yin case /*AccessibleStateType::*/AccessibleStateType::DEFUNC: 31575fdc4257SSteve Yin IState = STATE_SYSTEM_UNAVAILABLE; 31585fdc4257SSteve Yin break; 31595fdc4257SSteve Yin case /*AccessibleStateType::*/AccessibleStateType::EXPANDED: 31605fdc4257SSteve Yin IState = STATE_SYSTEM_EXPANDED; 31615fdc4257SSteve Yin break; 31625fdc4257SSteve Yin case /*AccessibleStateType::*/AccessibleStateType::FOCUSABLE: 31635fdc4257SSteve Yin IState = STATE_SYSTEM_FOCUSABLE; 31645fdc4257SSteve Yin break; 31655fdc4257SSteve Yin case /*AccessibleStateType::*/AccessibleStateType::FOCUSED: 31665fdc4257SSteve Yin IState = STATE_SYSTEM_FOCUSED; 31675fdc4257SSteve Yin break; 31685fdc4257SSteve Yin case /*AccessibleStateType::*/AccessibleStateType::INDETERMINATE: 31695fdc4257SSteve Yin IState = STATE_SYSTEM_MIXED; 31705fdc4257SSteve Yin break; 31715fdc4257SSteve Yin case /*AccessibleStateType::*/AccessibleStateType::MULTI_SELECTABLE: 31725fdc4257SSteve Yin IState = STATE_SYSTEM_MULTISELECTABLE; 31735fdc4257SSteve Yin break; 31745fdc4257SSteve Yin case /*AccessibleStateType::*/AccessibleStateType::PRESSED: 31755fdc4257SSteve Yin IState = STATE_SYSTEM_PRESSED; 31765fdc4257SSteve Yin break; 31775fdc4257SSteve Yin case /*AccessibleStateType::*/AccessibleStateType::RESIZABLE: 31785fdc4257SSteve Yin IState = STATE_SYSTEM_SIZEABLE; 31795fdc4257SSteve Yin break; 31805fdc4257SSteve Yin case /*AccessibleStateType::*/AccessibleStateType::SELECTABLE: 31815fdc4257SSteve Yin IState = STATE_SYSTEM_SELECTABLE; 31825fdc4257SSteve Yin break; 31835fdc4257SSteve Yin case /*AccessibleStateType::*/AccessibleStateType::SELECTED: 31845fdc4257SSteve Yin IState = STATE_SYSTEM_SELECTED; 31855fdc4257SSteve Yin break; 31865fdc4257SSteve Yin case /*AccessibleStateType::*/AccessibleStateType::ARMED: 31875fdc4257SSteve Yin IState = STATE_SYSTEM_FOCUSED; 31885fdc4257SSteve Yin break; 31895fdc4257SSteve Yin case /*AccessibleStateType::*/AccessibleStateType::EXPANDABLE: 31905fdc4257SSteve Yin IState = STATE_SYSTEM_COLLAPSED; 31915fdc4257SSteve Yin break; 31925fdc4257SSteve Yin default: 31935fdc4257SSteve Yin break; 31945fdc4257SSteve Yin } 31955fdc4257SSteve Yin return IState; 31965fdc4257SSteve Yin } 31975fdc4257SSteve Yin 31985fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_appName( BSTR __RPC_FAR *name) 31995fdc4257SSteve Yin { 32005fdc4257SSteve Yin 32015fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 32025fdc4257SSteve Yin ISDESTROY() 32035fdc4257SSteve Yin if(name == NULL) 32045fdc4257SSteve Yin return E_INVALIDARG; 32055fdc4257SSteve Yin 32065fdc4257SSteve Yin *name = SysAllocString(OLESTR("Hannover")); 32075fdc4257SSteve Yin return S_OK; 32085fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 32095fdc4257SSteve Yin } 32105fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_appVersion(BSTR __RPC_FAR *version) 32115fdc4257SSteve Yin { 32125fdc4257SSteve Yin 32135fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 32145fdc4257SSteve Yin ISDESTROY() 32155fdc4257SSteve Yin if(version == NULL) 32165fdc4257SSteve Yin return E_INVALIDARG; 32175fdc4257SSteve Yin *version=SysAllocString(OLESTR("3.0")); 32185fdc4257SSteve Yin return S_OK; 32195fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 32205fdc4257SSteve Yin } 32215fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_toolkitName(BSTR __RPC_FAR *name) 32225fdc4257SSteve Yin { 32235fdc4257SSteve Yin 32245fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 32255fdc4257SSteve Yin ISDESTROY() 32265fdc4257SSteve Yin if(name == NULL) 32275fdc4257SSteve Yin return E_INVALIDARG; 32285fdc4257SSteve Yin *name = SysAllocString(OLESTR(" ")); 32295fdc4257SSteve Yin return S_OK; 32305fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 32315fdc4257SSteve Yin } 32325fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_toolkitVersion(BSTR __RPC_FAR *version) 32335fdc4257SSteve Yin { 32345fdc4257SSteve Yin 32355fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 32365fdc4257SSteve Yin ISDESTROY() 32375fdc4257SSteve Yin if(version == NULL) 32385fdc4257SSteve Yin return E_INVALIDARG; 32395fdc4257SSteve Yin *version = SysAllocString(OLESTR(" ")); 32405fdc4257SSteve Yin return S_OK; 32415fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 32425fdc4257SSteve Yin } 32435fdc4257SSteve Yin 32445fdc4257SSteve Yin 32455fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_attributes(/*[out]*/ BSTR *pAttr) 32465fdc4257SSteve Yin { 32475b933a9eSSteve Yin ENTER_PROTECTED_BLOCK 32485b933a9eSSteve Yin ISDESTROY() 32495fdc4257SSteve Yin CHECK_ENABLE_INF 32505fdc4257SSteve Yin Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext(); 32515fdc4257SSteve Yin if( !pRContext.is() ) 32525fdc4257SSteve Yin { 32535fdc4257SSteve Yin return E_FAIL; 32545fdc4257SSteve Yin } 32555fdc4257SSteve Yin Reference<XAccessibleExtendedAttributes> pRXI(pRContext,UNO_QUERY); 32565fdc4257SSteve Yin if( !pRXI.is() ) 32575fdc4257SSteve Yin return E_FAIL; 32585fdc4257SSteve Yin else 32595fdc4257SSteve Yin { 32605fdc4257SSteve Yin com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleExtendedAttributes> pRXAttr; 32615fdc4257SSteve Yin pRXAttr = pRXI.get(); 32625fdc4257SSteve Yin ::com::sun::star::uno::Any anyVal = pRXAttr->getExtendedAttributes(); 32635fdc4257SSteve Yin 32645fdc4257SSteve Yin ::rtl::OUString val; 32655fdc4257SSteve Yin anyVal >>= val; 32665fdc4257SSteve Yin 32675fdc4257SSteve Yin if(*pAttr) 32685fdc4257SSteve Yin SAFE_SYSFREESTRING(*pAttr); 32695fdc4257SSteve Yin *pAttr = SysAllocString((OLECHAR *)val.getStr()); 32705fdc4257SSteve Yin 32715fdc4257SSteve Yin return S_OK; 32725fdc4257SSteve Yin } 32735b933a9eSSteve Yin LEAVE_PROTECTED_BLOCK 32745fdc4257SSteve Yin } 32755fdc4257SSteve Yin 3276