1*5fdc4257SSteve Yin /************************************************************************* 2*5fdc4257SSteve Yin * 3*5fdc4257SSteve Yin * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*5fdc4257SSteve Yin * 5*5fdc4257SSteve Yin * Copyright IBM Corporation 2010. 6*5fdc4257SSteve Yin * Copyright 2000, 2010 Oracle and/or its affiliates. 7*5fdc4257SSteve Yin * 8*5fdc4257SSteve Yin * OpenOffice.org - a multi-platform office productivity suite 9*5fdc4257SSteve Yin * 10*5fdc4257SSteve Yin * This file is part of OpenOffice.org. 11*5fdc4257SSteve Yin * 12*5fdc4257SSteve Yin * OpenOffice.org is free software: you can redistribute it and/or modify 13*5fdc4257SSteve Yin * it under the terms of the GNU Lesser General Public License version 3 14*5fdc4257SSteve Yin * only, as published by the Free Software Foundation. 15*5fdc4257SSteve Yin * 16*5fdc4257SSteve Yin * OpenOffice.org is distributed in the hope that it will be useful, 17*5fdc4257SSteve Yin * but WITHOUT ANY WARRANTY; without even the implied warranty of 18*5fdc4257SSteve Yin * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19*5fdc4257SSteve Yin * GNU Lesser General Public License version 3 for more details 20*5fdc4257SSteve Yin * (a copy is included in the LICENSE file that accompanied this code). 21*5fdc4257SSteve Yin * 22*5fdc4257SSteve Yin * You should have received a copy of the GNU Lesser General Public License 23*5fdc4257SSteve Yin * version 3 along with OpenOffice.org. If not, see 24*5fdc4257SSteve Yin * <http://www.openoffice.org/license.html> 25*5fdc4257SSteve Yin * for a copy of the LGPLv3 License. 26*5fdc4257SSteve Yin * 27*5fdc4257SSteve Yin ************************************************************************/ 28*5fdc4257SSteve Yin 29*5fdc4257SSteve Yin #include "stdafx.h" 30*5fdc4257SSteve Yin #include "UAccCOM2.h" 31*5fdc4257SSteve Yin #include "EnumVariant.h" 32*5fdc4257SSteve Yin #include "MAccessible.h" 33*5fdc4257SSteve Yin ///////////////////////////////////////////////////////////////////////////// 34*5fdc4257SSteve Yin // CEnumVariant 35*5fdc4257SSteve Yin 36*5fdc4257SSteve Yin 37*5fdc4257SSteve Yin 38*5fdc4257SSteve Yin /** 39*5fdc4257SSteve Yin * enumarate method,get next element 40*5fdc4257SSteve Yin * @param cElements The number of elements to be returned. 41*5fdc4257SSteve Yin * @param pvar An array of at least size celt in which the elements are to be returned. 42*5fdc4257SSteve Yin * @param pcElementFetched Pointer to the number of elements returned in rgVar, or Null�� 43*5fdc4257SSteve Yin * @return Result. 44*5fdc4257SSteve Yin */ 45*5fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CEnumVariant::Next(ULONG cElements,VARIANT __RPC_FAR *pvar,ULONG __RPC_FAR *pcElementFetched) 46*5fdc4257SSteve Yin { 47*5fdc4257SSteve Yin long l1; 48*5fdc4257SSteve Yin ULONG l2; 49*5fdc4257SSteve Yin 50*5fdc4257SSteve Yin if (pvar == NULL) 51*5fdc4257SSteve Yin return E_INVALIDARG; 52*5fdc4257SSteve Yin 53*5fdc4257SSteve Yin CHECK_ENABLE_INF 54*5fdc4257SSteve Yin if (pcElementFetched != NULL) 55*5fdc4257SSteve Yin *pcElementFetched = 0; 56*5fdc4257SSteve Yin 57*5fdc4257SSteve Yin // Retrieve the next cElements. 58*5fdc4257SSteve Yin for (l1=m_lCurrent, l2=0; l1<m_pXAccessibleSelection->getSelectedAccessibleChildCount() && 59*5fdc4257SSteve Yin l2<cElements; l1++, l2++) 60*5fdc4257SSteve Yin { 61*5fdc4257SSteve Yin Reference< XAccessible > pRXAcc = m_pXAccessibleSelection->getSelectedAccessibleChild(l1); 62*5fdc4257SSteve Yin IAccessible* pChild = NULL; 63*5fdc4257SSteve Yin BOOL isGet = CMAccessible::get_IAccessibleFromXAccessible((long)pRXAcc.get(),&pChild); 64*5fdc4257SSteve Yin if(isGet) 65*5fdc4257SSteve Yin { 66*5fdc4257SSteve Yin pvar[l2].vt = VT_I4; 67*5fdc4257SSteve Yin ((IMAccessible*)pChild)->Get_XAccChildID(&pvar[l2].lVal); 68*5fdc4257SSteve Yin } 69*5fdc4257SSteve Yin else if(pRXAcc.is()) 70*5fdc4257SSteve Yin { 71*5fdc4257SSteve Yin if(CMAccessible::g_pAgent) 72*5fdc4257SSteve Yin CMAccessible::g_pAgent->InsertAccObj(pRXAcc.get(),pUNOInterface,NULL); 73*5fdc4257SSteve Yin BOOL isGet = CMAccessible::get_IAccessibleFromXAccessible((long)pRXAcc.get(),&pChild); 74*5fdc4257SSteve Yin if(isGet) 75*5fdc4257SSteve Yin { 76*5fdc4257SSteve Yin pvar[l2].vt = VT_I4; 77*5fdc4257SSteve Yin ((IMAccessible*)pChild)->Get_XAccChildID(&pvar[l2].lVal); 78*5fdc4257SSteve Yin } 79*5fdc4257SSteve Yin } 80*5fdc4257SSteve Yin } 81*5fdc4257SSteve Yin // Set count of elements retrieved. 82*5fdc4257SSteve Yin if (pcElementFetched != NULL) 83*5fdc4257SSteve Yin *pcElementFetched = l2; 84*5fdc4257SSteve Yin m_lCurrent = l1; 85*5fdc4257SSteve Yin 86*5fdc4257SSteve Yin return (l2 < cElements) ? S_FALSE : NOERROR; 87*5fdc4257SSteve Yin } 88*5fdc4257SSteve Yin 89*5fdc4257SSteve Yin /** 90*5fdc4257SSteve Yin * skip the elements in the given range when enumarate elements 91*5fdc4257SSteve Yin * @param cElements The number of elements to skip. 92*5fdc4257SSteve Yin * @return Result. 93*5fdc4257SSteve Yin */ 94*5fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CEnumVariant::Skip(ULONG cElements) 95*5fdc4257SSteve Yin { 96*5fdc4257SSteve Yin CHECK_ENABLE_INF 97*5fdc4257SSteve Yin m_lCurrent += cElements; 98*5fdc4257SSteve Yin if (m_lCurrent > (long)(m_lLBound+m_pXAccessibleSelection->getSelectedAccessibleChildCount())) 99*5fdc4257SSteve Yin { 100*5fdc4257SSteve Yin m_lCurrent = m_lLBound+m_pXAccessibleSelection->getSelectedAccessibleChildCount(); 101*5fdc4257SSteve Yin return E_FAIL; 102*5fdc4257SSteve Yin } 103*5fdc4257SSteve Yin else 104*5fdc4257SSteve Yin return NOERROR; 105*5fdc4257SSteve Yin } 106*5fdc4257SSteve Yin 107*5fdc4257SSteve Yin 108*5fdc4257SSteve Yin /** 109*5fdc4257SSteve Yin * reset the enumaration position to initial value 110*5fdc4257SSteve Yin * @param 111*5fdc4257SSteve Yin * @return Result. 112*5fdc4257SSteve Yin */ 113*5fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CEnumVariant::Reset( void) 114*5fdc4257SSteve Yin { 115*5fdc4257SSteve Yin m_lCurrent = m_lLBound; 116*5fdc4257SSteve Yin return NOERROR; 117*5fdc4257SSteve Yin } 118*5fdc4257SSteve Yin 119*5fdc4257SSteve Yin 120*5fdc4257SSteve Yin /** 121*5fdc4257SSteve Yin *create a new IEnumVariant object, 122*5fdc4257SSteve Yin *copy current enumaration container and its state to 123*5fdc4257SSteve Yin *the new object 124*5fdc4257SSteve Yin *AT will use the copy object to get elements 125*5fdc4257SSteve Yin * @param ppenum On return, pointer to the location of the clone enumerator�� 126*5fdc4257SSteve Yin * @return Result. 127*5fdc4257SSteve Yin */ 128*5fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CEnumVariant::Clone(IEnumVARIANT __RPC_FAR *__RPC_FAR *ppenum) 129*5fdc4257SSteve Yin { 130*5fdc4257SSteve Yin CEnumVariant * penum = NULL; 131*5fdc4257SSteve Yin HRESULT hr; 132*5fdc4257SSteve Yin if (ppenum == NULL) 133*5fdc4257SSteve Yin return E_INVALIDARG; 134*5fdc4257SSteve Yin 135*5fdc4257SSteve Yin *ppenum = NULL; 136*5fdc4257SSteve Yin 137*5fdc4257SSteve Yin hr = Create(&penum); 138*5fdc4257SSteve Yin if( hr == S_OK ) 139*5fdc4257SSteve Yin { 140*5fdc4257SSteve Yin penum->PutSelection((long)pUNOInterface); 141*5fdc4257SSteve Yin *ppenum = penum; 142*5fdc4257SSteve Yin } 143*5fdc4257SSteve Yin else 144*5fdc4257SSteve Yin { 145*5fdc4257SSteve Yin if (penum) 146*5fdc4257SSteve Yin penum->Release(); 147*5fdc4257SSteve Yin } 148*5fdc4257SSteve Yin return hr; 149*5fdc4257SSteve Yin } 150*5fdc4257SSteve Yin 151*5fdc4257SSteve Yin /** 152*5fdc4257SSteve Yin *Static public method to create a CLSID_EnumVariant com object. 153*5fdc4257SSteve Yin * @param ppenum Pointer to accept com object. 154*5fdc4257SSteve Yin * @return Result. 155*5fdc4257SSteve Yin */ 156*5fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CEnumVariant::Create(CEnumVariant __RPC_FAR *__RPC_FAR *ppenum) 157*5fdc4257SSteve Yin { 158*5fdc4257SSteve Yin if (S_OK != CoCreateInstance(CLSID_EnumVariant,NULL, 159*5fdc4257SSteve Yin CLSCTX_SERVER,IID_IEnumVariant,(void **)ppenum)) 160*5fdc4257SSteve Yin { 161*5fdc4257SSteve Yin return E_FAIL; 162*5fdc4257SSteve Yin } 163*5fdc4257SSteve Yin 164*5fdc4257SSteve Yin return S_OK; 165*5fdc4257SSteve Yin } 166*5fdc4257SSteve Yin 167*5fdc4257SSteve Yin /** 168*5fdc4257SSteve Yin *Return count of elements in current container 169*5fdc4257SSteve Yin * @param. 170*5fdc4257SSteve Yin * @return count of elements in current container. 171*5fdc4257SSteve Yin */ 172*5fdc4257SSteve Yin long CEnumVariant::GetCountOfElements() 173*5fdc4257SSteve Yin { 174*5fdc4257SSteve Yin CHECK_ENABLE_INF_ZERO 175*5fdc4257SSteve Yin 176*5fdc4257SSteve Yin if(m_pXAccessibleSelection.is()) 177*5fdc4257SSteve Yin return m_pXAccessibleSelection->getSelectedAccessibleChildCount(); 178*5fdc4257SSteve Yin return 0; 179*5fdc4257SSteve Yin } 180*5fdc4257SSteve Yin 181*5fdc4257SSteve Yin /** 182*5fdc4257SSteve Yin * Set memeber m_pXAccessibleSelection to NULL and m_lCurrent to m_lLBound. 183*5fdc4257SSteve Yin * @param. 184*5fdc4257SSteve Yin * @return Result 185*5fdc4257SSteve Yin */ 186*5fdc4257SSteve Yin STDMETHODIMP CEnumVariant::ClearEnumeration() 187*5fdc4257SSteve Yin { 188*5fdc4257SSteve Yin pUNOInterface = NULL; 189*5fdc4257SSteve Yin m_pXAccessibleSelection = NULL; 190*5fdc4257SSteve Yin m_lCurrent = m_lLBound; 191*5fdc4257SSteve Yin return S_OK; 192*5fdc4257SSteve Yin } 193*5fdc4257SSteve Yin 194*5fdc4257SSteve Yin /** 195*5fdc4257SSteve Yin *Static method to fetch XAccessibleSelection 196*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 197*5fdc4257SSteve Yin * @return XAccessibleSelection interface. 198*5fdc4257SSteve Yin */ 199*5fdc4257SSteve Yin static Reference<XAccessibleSelection> GetXAccessibleSelection(XAccessible* pXAcc) 200*5fdc4257SSteve Yin { 201*5fdc4257SSteve Yin XAccessibleSelection* pSelection = NULL; 202*5fdc4257SSteve Yin Reference< XAccessibleContext > pRContext; 203*5fdc4257SSteve Yin 204*5fdc4257SSteve Yin if( pXAcc == NULL) 205*5fdc4257SSteve Yin return NULL; 206*5fdc4257SSteve Yin 207*5fdc4257SSteve Yin pRContext = pXAcc->getAccessibleContext(); 208*5fdc4257SSteve Yin if( !pRContext.is() ) 209*5fdc4257SSteve Yin return NULL; 210*5fdc4257SSteve Yin 211*5fdc4257SSteve Yin Reference< XAccessibleSelection > pRSelection(pRContext,UNO_QUERY); 212*5fdc4257SSteve Yin if( !pRSelection.is() ) 213*5fdc4257SSteve Yin return NULL; 214*5fdc4257SSteve Yin 215*5fdc4257SSteve Yin return pRSelection; 216*5fdc4257SSteve Yin } 217*5fdc4257SSteve Yin 218*5fdc4257SSteve Yin /** 219*5fdc4257SSteve Yin * Put valid UNO XAccessible interface. 220*5fdc4257SSteve Yin * @param pXSelection XAccessible interface. 221*5fdc4257SSteve Yin * @return Result.. 222*5fdc4257SSteve Yin */ 223*5fdc4257SSteve Yin STDMETHODIMP CEnumVariant::PutSelection(long pXSelection) 224*5fdc4257SSteve Yin { 225*5fdc4257SSteve Yin pUNOInterface = (XAccessible*)pXSelection; 226*5fdc4257SSteve Yin m_pXAccessibleSelection = GetXAccessibleSelection(pUNOInterface); 227*5fdc4257SSteve Yin return S_OK; 228*5fdc4257SSteve Yin } 229