/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright IBM Corporation 2010. * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ #include "stdafx.h" #include "UAccCOM2.h" #include "EnumVariant.h" #include "MAccessible.h" ///////////////////////////////////////////////////////////////////////////// // CEnumVariant /** * enumarate method,get next element * @param cElements The number of elements to be returned. * @param pvar An array of at least size celt in which the elements are to be returned. * @param pcElementFetched Pointer to the number of elements returned in rgVar, or NullĄŁ * @return Result. */ HRESULT STDMETHODCALLTYPE CEnumVariant::Next(ULONG cElements,VARIANT __RPC_FAR *pvar,ULONG __RPC_FAR *pcElementFetched) { long l1; ULONG l2; if (pvar == NULL) return E_INVALIDARG; CHECK_ENABLE_INF if (pcElementFetched != NULL) *pcElementFetched = 0; // Retrieve the next cElements. for (l1=m_lCurrent, l2=0; l1getSelectedAccessibleChildCount() && l2 pRXAcc = m_pXAccessibleSelection->getSelectedAccessibleChild(l1); IAccessible* pChild = NULL; BOOL isGet = CMAccessible::get_IAccessibleFromXAccessible((long)pRXAcc.get(),&pChild); if(isGet) { pvar[l2].vt = VT_I4; ((IMAccessible*)pChild)->Get_XAccChildID(&pvar[l2].lVal); } else if(pRXAcc.is()) { if(CMAccessible::g_pAgent) CMAccessible::g_pAgent->InsertAccObj(pRXAcc.get(),pUNOInterface,NULL); BOOL isGet = CMAccessible::get_IAccessibleFromXAccessible((long)pRXAcc.get(),&pChild); if(isGet) { pvar[l2].vt = VT_I4; ((IMAccessible*)pChild)->Get_XAccChildID(&pvar[l2].lVal); } } } // Set count of elements retrieved. if (pcElementFetched != NULL) *pcElementFetched = l2; m_lCurrent = l1; return (l2 < cElements) ? S_FALSE : NOERROR; } /** * skip the elements in the given range when enumarate elements * @param cElements The number of elements to skip. * @return Result. */ HRESULT STDMETHODCALLTYPE CEnumVariant::Skip(ULONG cElements) { CHECK_ENABLE_INF m_lCurrent += cElements; if (m_lCurrent > (long)(m_lLBound+m_pXAccessibleSelection->getSelectedAccessibleChildCount())) { m_lCurrent = m_lLBound+m_pXAccessibleSelection->getSelectedAccessibleChildCount(); return E_FAIL; } else return NOERROR; } /** * reset the enumaration position to initial value * @param * @return Result. */ HRESULT STDMETHODCALLTYPE CEnumVariant::Reset( void) { m_lCurrent = m_lLBound; return NOERROR; } /** *create a new IEnumVariant object, *copy current enumaration container and its state to *the new object *AT will use the copy object to get elements * @param ppenum On return, pointer to the location of the clone enumeratorĄŁ * @return Result. */ HRESULT STDMETHODCALLTYPE CEnumVariant::Clone(IEnumVARIANT __RPC_FAR *__RPC_FAR *ppenum) { CEnumVariant * penum = NULL; HRESULT hr; if (ppenum == NULL) return E_INVALIDARG; *ppenum = NULL; hr = Create(&penum); if( hr == S_OK ) { penum->PutSelection((long)pUNOInterface); *ppenum = penum; } else { if (penum) penum->Release(); } return hr; } /** *Static public method to create a CLSID_EnumVariant com object. * @param ppenum Pointer to accept com object. * @return Result. */ HRESULT STDMETHODCALLTYPE CEnumVariant::Create(CEnumVariant __RPC_FAR *__RPC_FAR *ppenum) { if (S_OK != CoCreateInstance(CLSID_EnumVariant,NULL, CLSCTX_SERVER,IID_IEnumVariant,(void **)ppenum)) { return E_FAIL; } return S_OK; } /** *Return count of elements in current container * @param. * @return count of elements in current container. */ long CEnumVariant::GetCountOfElements() { CHECK_ENABLE_INF_ZERO if(m_pXAccessibleSelection.is()) return m_pXAccessibleSelection->getSelectedAccessibleChildCount(); return 0; } /** * Set memeber m_pXAccessibleSelection to NULL and m_lCurrent to m_lLBound. * @param. * @return Result */ STDMETHODIMP CEnumVariant::ClearEnumeration() { pUNOInterface = NULL; m_pXAccessibleSelection = NULL; m_lCurrent = m_lLBound; return S_OK; } /** *Static method to fetch XAccessibleSelection * @param pXAcc XAccessible interface. * @return XAccessibleSelection interface. */ static Reference GetXAccessibleSelection(XAccessible* pXAcc) { XAccessibleSelection* pSelection = NULL; Reference< XAccessibleContext > pRContext; if( pXAcc == NULL) return NULL; pRContext = pXAcc->getAccessibleContext(); if( !pRContext.is() ) return NULL; Reference< XAccessibleSelection > pRSelection(pRContext,UNO_QUERY); if( !pRSelection.is() ) return NULL; return pRSelection; } /** * Put valid UNO XAccessible interface. * @param pXSelection XAccessible interface. * @return Result.. */ STDMETHODIMP CEnumVariant::PutSelection(long pXSelection) { pUNOInterface = (XAccessible*)pXSelection; m_pXAccessibleSelection = GetXAccessibleSelection(pUNOInterface); return S_OK; }