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 "AccHyperLink.h"
32*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessible.hpp>
33*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleAction.hpp>
34*5fdc4257SSteve Yin #include "MAccessible.h"
35*5fdc4257SSteve Yin 
36*5fdc4257SSteve Yin using namespace com::sun::star::accessibility;
37*5fdc4257SSteve Yin using namespace com::sun::star::uno;
38*5fdc4257SSteve Yin using namespace com::sun::star::awt;
39*5fdc4257SSteve Yin 
40*5fdc4257SSteve Yin /**
41*5fdc4257SSteve Yin  * Returns the number of action.
42*5fdc4257SSteve Yin  *
43*5fdc4257SSteve Yin  * @param    nActions    the number of action.
44*5fdc4257SSteve Yin  */
45*5fdc4257SSteve Yin STDMETHODIMP CAccHyperLink::nActions(/*[out,retval]*/long* nActions)
46*5fdc4257SSteve Yin {
47*5fdc4257SSteve Yin 
48*5fdc4257SSteve Yin     return CAccActionBase::nActions(nActions);
49*5fdc4257SSteve Yin }
50*5fdc4257SSteve Yin 
51*5fdc4257SSteve Yin /**
52*5fdc4257SSteve Yin  * Performs specified action on the object.
53*5fdc4257SSteve Yin  *
54*5fdc4257SSteve Yin  * @param    actionIndex    the index of action.
55*5fdc4257SSteve Yin  */
56*5fdc4257SSteve Yin STDMETHODIMP CAccHyperLink::doAction(/* [in] */ long actionIndex)
57*5fdc4257SSteve Yin {
58*5fdc4257SSteve Yin 
59*5fdc4257SSteve Yin     return CAccActionBase::doAction(actionIndex);
60*5fdc4257SSteve Yin }
61*5fdc4257SSteve Yin 
62*5fdc4257SSteve Yin /**
63*5fdc4257SSteve Yin  * Gets description of specified action.
64*5fdc4257SSteve Yin  *
65*5fdc4257SSteve Yin  * @param    actionIndex    the index of action.
66*5fdc4257SSteve Yin  * @param    description    the description string of the specified action.
67*5fdc4257SSteve Yin  */
68*5fdc4257SSteve Yin STDMETHODIMP CAccHyperLink::get_description(long actionIndex,BSTR __RPC_FAR *description)
69*5fdc4257SSteve Yin {
70*5fdc4257SSteve Yin 
71*5fdc4257SSteve Yin     return CAccActionBase::get_description(actionIndex, description);
72*5fdc4257SSteve Yin }
73*5fdc4257SSteve Yin 
74*5fdc4257SSteve Yin STDMETHODIMP CAccHyperLink::get_name( long actionIndex, BSTR __RPC_FAR *name)
75*5fdc4257SSteve Yin {
76*5fdc4257SSteve Yin 
77*5fdc4257SSteve Yin     return CAccActionBase::get_name(actionIndex, name);
78*5fdc4257SSteve Yin }
79*5fdc4257SSteve Yin 
80*5fdc4257SSteve Yin STDMETHODIMP CAccHyperLink::get_localizedName( long actionIndex, BSTR __RPC_FAR *localizedName)
81*5fdc4257SSteve Yin {
82*5fdc4257SSteve Yin 
83*5fdc4257SSteve Yin     return CAccActionBase::get_name(actionIndex, localizedName);
84*5fdc4257SSteve Yin }
85*5fdc4257SSteve Yin 
86*5fdc4257SSteve Yin /**
87*5fdc4257SSteve Yin  * Returns key binding object (if any) associated with specified action
88*5fdc4257SSteve Yin  * key binding is string.
89*5fdc4257SSteve Yin  * e.g. "alt+d" (like IAccessible::get_accKeyboardShortcut).
90*5fdc4257SSteve Yin  *
91*5fdc4257SSteve Yin  * @param    actionIndex    the index of action.
92*5fdc4257SSteve Yin  * @param    nMaxBinding    the max number of key binding.
93*5fdc4257SSteve Yin  * @param    keyBinding     the key binding array.
94*5fdc4257SSteve Yin  * @param    nBinding       the actual number of key binding returned.
95*5fdc4257SSteve Yin  */
96*5fdc4257SSteve Yin STDMETHODIMP CAccHyperLink::get_keyBinding(
97*5fdc4257SSteve Yin     /* [in] */ long actionIndex,
98*5fdc4257SSteve Yin     /* [in] */ long nMaxBinding,
99*5fdc4257SSteve Yin     /* [length_is][length_is][size_is][size_is][out] */ BSTR __RPC_FAR *__RPC_FAR *keyBinding,
100*5fdc4257SSteve Yin     /* [retval][out] */ long __RPC_FAR *nBinding)
101*5fdc4257SSteve Yin {
102*5fdc4257SSteve Yin 
103*5fdc4257SSteve Yin     return CAccActionBase::get_keyBinding(actionIndex, nMaxBinding,	keyBinding, nBinding);
104*5fdc4257SSteve Yin }
105*5fdc4257SSteve Yin 
106*5fdc4257SSteve Yin /**
107*5fdc4257SSteve Yin    * get an object
108*5fdc4257SSteve Yin    * @param
109*5fdc4257SSteve Yin    * @return Result.
110*5fdc4257SSteve Yin */
111*5fdc4257SSteve Yin STDMETHODIMP CAccHyperLink::get_anchor(/* [in] */ long index,
112*5fdc4257SSteve Yin         /* [retval][out] */ VARIANT __RPC_FAR *anchor)
113*5fdc4257SSteve Yin {
114*5fdc4257SSteve Yin 
115*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
116*5fdc4257SSteve Yin 
117*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
118*5fdc4257SSteve Yin 
119*5fdc4257SSteve Yin     // #CHECK#
120*5fdc4257SSteve Yin     if(anchor == NULL)
121*5fdc4257SSteve Yin     {
122*5fdc4257SSteve Yin         return E_INVALIDARG;
123*5fdc4257SSteve Yin     }
124*5fdc4257SSteve Yin     // #CHECK XInterface#
125*5fdc4257SSteve Yin     if(!pRXLink.is())
126*5fdc4257SSteve Yin     {
127*5fdc4257SSteve Yin         return E_FAIL;
128*5fdc4257SSteve Yin     }
129*5fdc4257SSteve Yin     // Get Any type value via pRXLink.
130*5fdc4257SSteve Yin     ::com::sun::star::uno::Any	anyVal = GetXInterface()->getAccessibleActionAnchor(index);
131*5fdc4257SSteve Yin     // Convert Any to VARIANT.
132*5fdc4257SSteve Yin     CMAccessible::ConvertAnyToVariant(anyVal, anchor);
133*5fdc4257SSteve Yin 
134*5fdc4257SSteve Yin     return S_OK;
135*5fdc4257SSteve Yin 
136*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
137*5fdc4257SSteve Yin }
138*5fdc4257SSteve Yin 
139*5fdc4257SSteve Yin /**
140*5fdc4257SSteve Yin    * get an object
141*5fdc4257SSteve Yin    * @param
142*5fdc4257SSteve Yin    * @return Result.
143*5fdc4257SSteve Yin */
144*5fdc4257SSteve Yin STDMETHODIMP CAccHyperLink::get_anchorTarget(/* [in] */ long index,
145*5fdc4257SSteve Yin         /* [retval][out] */ VARIANT __RPC_FAR *anchorTarget)
146*5fdc4257SSteve Yin {
147*5fdc4257SSteve Yin 
148*5fdc4257SSteve Yin 
149*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
150*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
151*5fdc4257SSteve Yin 
152*5fdc4257SSteve Yin     // #CHECK#
153*5fdc4257SSteve Yin     if(anchorTarget == NULL)
154*5fdc4257SSteve Yin     {
155*5fdc4257SSteve Yin         return E_INVALIDARG;
156*5fdc4257SSteve Yin     }
157*5fdc4257SSteve Yin     // #CHECK XInterface#
158*5fdc4257SSteve Yin     if(!pRXLink.is())
159*5fdc4257SSteve Yin     {
160*5fdc4257SSteve Yin         return E_FAIL;
161*5fdc4257SSteve Yin     }
162*5fdc4257SSteve Yin     // Get Any type value via pRXLink.
163*5fdc4257SSteve Yin     ::com::sun::star::uno::Any	anyVal = GetXInterface()->getAccessibleActionObject(index);
164*5fdc4257SSteve Yin     // Convert Any to VARIANT.
165*5fdc4257SSteve Yin     CMAccessible::ConvertAnyToVariant(anyVal, anchorTarget);
166*5fdc4257SSteve Yin 
167*5fdc4257SSteve Yin     return S_OK;
168*5fdc4257SSteve Yin 
169*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
170*5fdc4257SSteve Yin }
171*5fdc4257SSteve Yin 
172*5fdc4257SSteve Yin 
173*5fdc4257SSteve Yin /**
174*5fdc4257SSteve Yin    * Get start index.
175*5fdc4257SSteve Yin    * @param index Variant to get start index.
176*5fdc4257SSteve Yin    * @return Result.
177*5fdc4257SSteve Yin */
178*5fdc4257SSteve Yin STDMETHODIMP CAccHyperLink::get_startIndex(/* [retval][out] */ long __RPC_FAR *index)
179*5fdc4257SSteve Yin {
180*5fdc4257SSteve Yin 
181*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
182*5fdc4257SSteve Yin 
183*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
184*5fdc4257SSteve Yin 
185*5fdc4257SSteve Yin     // #CHECK#
186*5fdc4257SSteve Yin     if(index == NULL)
187*5fdc4257SSteve Yin     {
188*5fdc4257SSteve Yin         return E_INVALIDARG;
189*5fdc4257SSteve Yin     }
190*5fdc4257SSteve Yin     *index = GetXInterface()->getStartIndex();
191*5fdc4257SSteve Yin 
192*5fdc4257SSteve Yin     return S_OK;
193*5fdc4257SSteve Yin 
194*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
195*5fdc4257SSteve Yin }
196*5fdc4257SSteve Yin 
197*5fdc4257SSteve Yin /**
198*5fdc4257SSteve Yin    * Get start index.
199*5fdc4257SSteve Yin    * @param index Variant to get end index.
200*5fdc4257SSteve Yin    * @return Result.
201*5fdc4257SSteve Yin */
202*5fdc4257SSteve Yin STDMETHODIMP CAccHyperLink::get_endIndex(/* [retval][out] */ long __RPC_FAR *index)
203*5fdc4257SSteve Yin {
204*5fdc4257SSteve Yin 
205*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
206*5fdc4257SSteve Yin 
207*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
208*5fdc4257SSteve Yin 
209*5fdc4257SSteve Yin     // #CHECK#
210*5fdc4257SSteve Yin     if(index == NULL)
211*5fdc4257SSteve Yin     {
212*5fdc4257SSteve Yin         return E_INVALIDARG;
213*5fdc4257SSteve Yin     }
214*5fdc4257SSteve Yin     // #CHECK XInterface#
215*5fdc4257SSteve Yin     if(!pRXLink.is())
216*5fdc4257SSteve Yin     {
217*5fdc4257SSteve Yin         return E_FAIL;
218*5fdc4257SSteve Yin     }
219*5fdc4257SSteve Yin     *index = GetXInterface()->getEndIndex();
220*5fdc4257SSteve Yin 
221*5fdc4257SSteve Yin     return S_OK;
222*5fdc4257SSteve Yin 
223*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
224*5fdc4257SSteve Yin }
225*5fdc4257SSteve Yin 
226*5fdc4257SSteve Yin /**
227*5fdc4257SSteve Yin    * Judge if the hyperlink is valid.
228*5fdc4257SSteve Yin    * @param valid Variant to get validity.
229*5fdc4257SSteve Yin    * @return Result.
230*5fdc4257SSteve Yin */
231*5fdc4257SSteve Yin STDMETHODIMP CAccHyperLink::get_valid(/* [retval][out] */ boolean __RPC_FAR *valid)
232*5fdc4257SSteve Yin {
233*5fdc4257SSteve Yin 
234*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
235*5fdc4257SSteve Yin 
236*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
237*5fdc4257SSteve Yin 
238*5fdc4257SSteve Yin     // #CHECK#
239*5fdc4257SSteve Yin     if(valid == NULL)
240*5fdc4257SSteve Yin     {
241*5fdc4257SSteve Yin         return E_INVALIDARG;
242*5fdc4257SSteve Yin     }
243*5fdc4257SSteve Yin     // #CHECK XInterface#
244*5fdc4257SSteve Yin     if(!pRXLink.is())
245*5fdc4257SSteve Yin     {
246*5fdc4257SSteve Yin         return E_FAIL;
247*5fdc4257SSteve Yin     }
248*5fdc4257SSteve Yin     *valid = GetXInterface()->isValid();
249*5fdc4257SSteve Yin 
250*5fdc4257SSteve Yin     return S_OK;
251*5fdc4257SSteve Yin 
252*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
253*5fdc4257SSteve Yin }
254*5fdc4257SSteve Yin 
255*5fdc4257SSteve Yin /**
256*5fdc4257SSteve Yin    * Put UNO interface.
257*5fdc4257SSteve Yin    * @param pXInterface XAccessibleContext interface.
258*5fdc4257SSteve Yin    * @return Result.
259*5fdc4257SSteve Yin */
260*5fdc4257SSteve Yin STDMETHODIMP CAccHyperLink::put_XInterface(long pXInterface)
261*5fdc4257SSteve Yin {
262*5fdc4257SSteve Yin 
263*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
264*5fdc4257SSteve Yin 
265*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
266*5fdc4257SSteve Yin 
267*5fdc4257SSteve Yin     CAccActionBase::put_XInterface(pXInterface);
268*5fdc4257SSteve Yin     //special query.
269*5fdc4257SSteve Yin     if(pUNOInterface != NULL)
270*5fdc4257SSteve Yin     {
271*5fdc4257SSteve Yin         Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
272*5fdc4257SSteve Yin         if( !pRContext.is() )
273*5fdc4257SSteve Yin         {
274*5fdc4257SSteve Yin             return E_FAIL;
275*5fdc4257SSteve Yin         }
276*5fdc4257SSteve Yin         Reference<XAccessibleHyperlink> pRXI(pRContext,UNO_QUERY);
277*5fdc4257SSteve Yin         if( !pRXI.is() )
278*5fdc4257SSteve Yin         {
279*5fdc4257SSteve Yin             pRXLink = NULL;
280*5fdc4257SSteve Yin         }
281*5fdc4257SSteve Yin         else
282*5fdc4257SSteve Yin             pRXLink = pRXI.get();
283*5fdc4257SSteve Yin     }
284*5fdc4257SSteve Yin     return S_OK;
285*5fdc4257SSteve Yin 
286*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
287*5fdc4257SSteve Yin }
288*5fdc4257SSteve Yin 
289*5fdc4257SSteve Yin /**
290*5fdc4257SSteve Yin    * Put UNO interface.
291*5fdc4257SSteve Yin    * @param pXSubInterface XAccessibleHyperlink interface.
292*5fdc4257SSteve Yin    * @return Result.
293*5fdc4257SSteve Yin */
294*5fdc4257SSteve Yin STDMETHODIMP CAccHyperLink::put_XSubInterface(long pXSubInterface)
295*5fdc4257SSteve Yin {
296*5fdc4257SSteve Yin 
297*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
298*5fdc4257SSteve Yin 
299*5fdc4257SSteve Yin     pRXLink = (XAccessibleHyperlink*)pXSubInterface;
300*5fdc4257SSteve Yin     pRXAct = (XAccessibleAction*)pXSubInterface;
301*5fdc4257SSteve Yin 
302*5fdc4257SSteve Yin     return S_OK;
303*5fdc4257SSteve Yin }
304