xref: /AOO41X/main/winaccessibility/source/UAccCOM/EnumVariant.cpp (revision 5fdc4257b5e43545f8f7841d9e8303d3a99b1714)
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