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 "AccValue.h"
32*5fdc4257SSteve Yin #include "MAccessible.h"
33*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessible.hpp>
34*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleContext.hpp>
35*5fdc4257SSteve Yin 
36*5fdc4257SSteve Yin using namespace com::sun::star::accessibility;
37*5fdc4257SSteve Yin using namespace com::sun::star::uno;
38*5fdc4257SSteve Yin 
39*5fdc4257SSteve Yin /**
40*5fdc4257SSteve Yin    * Get current value.
41*5fdc4257SSteve Yin    * @param  currentValue Variant that accepts current value.
42*5fdc4257SSteve Yin    * @return Result.
43*5fdc4257SSteve Yin    */
44*5fdc4257SSteve Yin 
45*5fdc4257SSteve Yin STDMETHODIMP CAccValue::get_currentValue(VARIANT * currentValue)
46*5fdc4257SSteve Yin {
47*5fdc4257SSteve Yin 
48*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
49*5fdc4257SSteve Yin 
50*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
51*5fdc4257SSteve Yin 
52*5fdc4257SSteve Yin     if (currentValue == NULL)
53*5fdc4257SSteve Yin         return E_INVALIDARG;
54*5fdc4257SSteve Yin     if ( !pRXVal.is() )
55*5fdc4257SSteve Yin         return E_FAIL;
56*5fdc4257SSteve Yin 
57*5fdc4257SSteve Yin     // Get Any type value from UNO.
58*5fdc4257SSteve Yin     ::com::sun::star::uno::Any	anyVal = GetXInterface()->getCurrentValue();
59*5fdc4257SSteve Yin     // Convert Any to VARIANT.
60*5fdc4257SSteve Yin     CMAccessible::ConvertAnyToVariant(anyVal, currentValue);
61*5fdc4257SSteve Yin 
62*5fdc4257SSteve Yin     return S_OK;
63*5fdc4257SSteve Yin 
64*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
65*5fdc4257SSteve Yin }
66*5fdc4257SSteve Yin 
67*5fdc4257SSteve Yin /**
68*5fdc4257SSteve Yin    * Set current value.
69*5fdc4257SSteve Yin    * @param  Value New value should be set.
70*5fdc4257SSteve Yin    * @param  success If the method is successfully called.
71*5fdc4257SSteve Yin    * @return Result.
72*5fdc4257SSteve Yin    */
73*5fdc4257SSteve Yin STDMETHODIMP CAccValue::setCurrentValue(VARIANT value)
74*5fdc4257SSteve Yin {
75*5fdc4257SSteve Yin 
76*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
77*5fdc4257SSteve Yin 
78*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
79*5fdc4257SSteve Yin 
80*5fdc4257SSteve Yin     if ( !pRXVal.is() )
81*5fdc4257SSteve Yin         return E_FAIL;
82*5fdc4257SSteve Yin 
83*5fdc4257SSteve Yin     HRESULT hRet = S_OK;
84*5fdc4257SSteve Yin     ::com::sun::star::uno::Any anyVal;
85*5fdc4257SSteve Yin 
86*5fdc4257SSteve Yin     // Set value according to value type.
87*5fdc4257SSteve Yin     switch(value.vt)
88*5fdc4257SSteve Yin     {
89*5fdc4257SSteve Yin     case VT_UI1:
90*5fdc4257SSteve Yin         {
91*5fdc4257SSteve Yin             ::com::sun::star::uno::Type		typeInfo(TypeClass_CHAR, (sal_Char *)"char");
92*5fdc4257SSteve Yin             anyVal.setValue(&value.bVal, typeInfo);
93*5fdc4257SSteve Yin         }
94*5fdc4257SSteve Yin         break;
95*5fdc4257SSteve Yin 
96*5fdc4257SSteve Yin     case VT_BOOL:
97*5fdc4257SSteve Yin         {
98*5fdc4257SSteve Yin             ::com::sun::star::uno::Type		typeInfo(TypeClass_BOOLEAN, (sal_Char *)"bool");
99*5fdc4257SSteve Yin             anyVal.setValue(&value.boolVal, typeInfo);
100*5fdc4257SSteve Yin         }
101*5fdc4257SSteve Yin         break;
102*5fdc4257SSteve Yin 
103*5fdc4257SSteve Yin     case VT_I2:
104*5fdc4257SSteve Yin         {
105*5fdc4257SSteve Yin             ::com::sun::star::uno::Type		typeInfo(TypeClass_SHORT, (sal_Char *)"short");
106*5fdc4257SSteve Yin             anyVal.setValue(&value.iVal, typeInfo);
107*5fdc4257SSteve Yin         }
108*5fdc4257SSteve Yin         break;
109*5fdc4257SSteve Yin 
110*5fdc4257SSteve Yin     case VT_I4:
111*5fdc4257SSteve Yin         {
112*5fdc4257SSteve Yin             ::com::sun::star::uno::Type		typeInfo(TypeClass_LONG, (sal_Char *)"long");
113*5fdc4257SSteve Yin             anyVal.setValue(&value.lVal, typeInfo);
114*5fdc4257SSteve Yin         }
115*5fdc4257SSteve Yin         break;
116*5fdc4257SSteve Yin 
117*5fdc4257SSteve Yin     case VT_R4:
118*5fdc4257SSteve Yin         {
119*5fdc4257SSteve Yin             ::com::sun::star::uno::Type		typeInfo(TypeClass_FLOAT, (sal_Char *)"float");
120*5fdc4257SSteve Yin             anyVal.setValue(&value.fltVal, typeInfo);
121*5fdc4257SSteve Yin         }
122*5fdc4257SSteve Yin         break;
123*5fdc4257SSteve Yin 
124*5fdc4257SSteve Yin     case VT_R8:
125*5fdc4257SSteve Yin         {
126*5fdc4257SSteve Yin             ::com::sun::star::uno::Type		typeInfo(TypeClass_DOUBLE, (sal_Char *)"double");
127*5fdc4257SSteve Yin             anyVal.setValue(&value.dblVal, typeInfo);
128*5fdc4257SSteve Yin         }
129*5fdc4257SSteve Yin         break;
130*5fdc4257SSteve Yin 
131*5fdc4257SSteve Yin     default:
132*5fdc4257SSteve Yin         {
133*5fdc4257SSteve Yin             // Unsupport type conversion.
134*5fdc4257SSteve Yin             hRet = E_FAIL;
135*5fdc4257SSteve Yin         }
136*5fdc4257SSteve Yin         break;
137*5fdc4257SSteve Yin     }
138*5fdc4257SSteve Yin 
139*5fdc4257SSteve Yin     if(hRet == S_OK)
140*5fdc4257SSteve Yin     {
141*5fdc4257SSteve Yin         hRet = pRXVal->setCurrentValue(anyVal) ? S_OK : E_FAIL ;
142*5fdc4257SSteve Yin     }
143*5fdc4257SSteve Yin 
144*5fdc4257SSteve Yin     return hRet;
145*5fdc4257SSteve Yin 
146*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
147*5fdc4257SSteve Yin }
148*5fdc4257SSteve Yin 
149*5fdc4257SSteve Yin /**
150*5fdc4257SSteve Yin    * Get maximum value.
151*5fdc4257SSteve Yin    * @param  maximumValue Variant that accepts maximum value.
152*5fdc4257SSteve Yin    * @return Result.
153*5fdc4257SSteve Yin    */
154*5fdc4257SSteve Yin STDMETHODIMP CAccValue::get_maximumValue(VARIANT *maximumValue)
155*5fdc4257SSteve Yin {
156*5fdc4257SSteve Yin 
157*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
158*5fdc4257SSteve Yin 
159*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
160*5fdc4257SSteve Yin 
161*5fdc4257SSteve Yin     if (maximumValue == NULL)
162*5fdc4257SSteve Yin         return E_INVALIDARG;
163*5fdc4257SSteve Yin     if ( !pRXVal.is() )
164*5fdc4257SSteve Yin         return E_FAIL;
165*5fdc4257SSteve Yin 
166*5fdc4257SSteve Yin     // Get Any type value from UNO.
167*5fdc4257SSteve Yin     ::com::sun::star::uno::Any	anyVal = GetXInterface()->getMaximumValue();
168*5fdc4257SSteve Yin     // Convert Any to VARIANT.
169*5fdc4257SSteve Yin     CMAccessible::ConvertAnyToVariant(anyVal, maximumValue);
170*5fdc4257SSteve Yin 
171*5fdc4257SSteve Yin     return S_OK;
172*5fdc4257SSteve Yin 
173*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
174*5fdc4257SSteve Yin }
175*5fdc4257SSteve Yin 
176*5fdc4257SSteve Yin /**
177*5fdc4257SSteve Yin    * Get minimum value.
178*5fdc4257SSteve Yin    * @param  mininumValue Variant that accepts minimum value.
179*5fdc4257SSteve Yin    * @return Result.
180*5fdc4257SSteve Yin    */
181*5fdc4257SSteve Yin STDMETHODIMP CAccValue::get_minimumValue(VARIANT *mininumValue)
182*5fdc4257SSteve Yin {
183*5fdc4257SSteve Yin 
184*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
185*5fdc4257SSteve Yin 
186*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
187*5fdc4257SSteve Yin 
188*5fdc4257SSteve Yin     if (mininumValue == NULL)
189*5fdc4257SSteve Yin         return E_FAIL;
190*5fdc4257SSteve Yin     if ( !pRXVal.is() )
191*5fdc4257SSteve Yin         return E_FAIL;
192*5fdc4257SSteve Yin 
193*5fdc4257SSteve Yin     // Get Any type value from UNO.
194*5fdc4257SSteve Yin     ::com::sun::star::uno::Any	anyVal = GetXInterface()->getMinimumValue();
195*5fdc4257SSteve Yin     // Convert Any to VARIANT.
196*5fdc4257SSteve Yin     CMAccessible::ConvertAnyToVariant(anyVal, mininumValue);
197*5fdc4257SSteve Yin 
198*5fdc4257SSteve Yin     return S_OK;
199*5fdc4257SSteve Yin 
200*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
201*5fdc4257SSteve Yin }
202*5fdc4257SSteve Yin 
203*5fdc4257SSteve Yin /**
204*5fdc4257SSteve Yin    * Put valid UNO interface into com class.
205*5fdc4257SSteve Yin    * @param  pXInterface UNO interface.
206*5fdc4257SSteve Yin    * @return Result.
207*5fdc4257SSteve Yin    */
208*5fdc4257SSteve Yin STDMETHODIMP CAccValue::put_XInterface(long pXInterface)
209*5fdc4257SSteve Yin {
210*5fdc4257SSteve Yin 
211*5fdc4257SSteve Yin 
212*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
213*5fdc4257SSteve Yin 
214*5fdc4257SSteve Yin     CUNOXWrapper::put_XInterface(pXInterface);
215*5fdc4257SSteve Yin     //special query.
216*5fdc4257SSteve Yin     if(pUNOInterface == NULL)
217*5fdc4257SSteve Yin         return E_FAIL;
218*5fdc4257SSteve Yin     Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
219*5fdc4257SSteve Yin     if( !pRContext.is() )
220*5fdc4257SSteve Yin     {
221*5fdc4257SSteve Yin         return E_FAIL;
222*5fdc4257SSteve Yin     }
223*5fdc4257SSteve Yin     Reference<XAccessibleValue> pRXI(pRContext,UNO_QUERY);
224*5fdc4257SSteve Yin     if( !pRXI.is() )
225*5fdc4257SSteve Yin         pRXVal = NULL;
226*5fdc4257SSteve Yin     else
227*5fdc4257SSteve Yin         pRXVal = pRXI.get();
228*5fdc4257SSteve Yin     return S_OK;
229*5fdc4257SSteve Yin 
230*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
231*5fdc4257SSteve Yin }
232