1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_editeng.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Any.hxx>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Reference.hxx>
29*b1cdbd2cSJim Jagielski #include <comphelper/accessiblekeybindinghelper.hxx>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include "AccessibleHyperlink.hxx"
32*b1cdbd2cSJim Jagielski #include "editeng/unoedprx.hxx"
33*b1cdbd2cSJim Jagielski #include <editeng/flditem.hxx>
34*b1cdbd2cSJim Jagielski #include <vcl/keycodes.hxx>
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
40*b1cdbd2cSJim Jagielski //
41*b1cdbd2cSJim Jagielski // AccessibleHyperlink implementation
42*b1cdbd2cSJim Jagielski //
43*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski namespace accessibility
46*b1cdbd2cSJim Jagielski {
47*b1cdbd2cSJim Jagielski 
AccessibleHyperlink(SvxAccessibleTextAdapter & r,SvxFieldItem * p,sal_uInt16 nP,sal_uInt16 nR,sal_Int32 nStt,sal_Int32 nEnd,const::rtl::OUString & rD)48*b1cdbd2cSJim Jagielski     AccessibleHyperlink::AccessibleHyperlink( SvxAccessibleTextAdapter& r, SvxFieldItem* p, sal_uInt16 nP, sal_uInt16 nR, sal_Int32 nStt, sal_Int32 nEnd, const ::rtl::OUString& rD )
49*b1cdbd2cSJim Jagielski     : rTA( r )
50*b1cdbd2cSJim Jagielski     {
51*b1cdbd2cSJim Jagielski         pFld = p;
52*b1cdbd2cSJim Jagielski         nPara = nP;
53*b1cdbd2cSJim Jagielski         nRealIdx = nR;
54*b1cdbd2cSJim Jagielski         nStartIdx = nStt;
55*b1cdbd2cSJim Jagielski         nEndIdx = nEnd;
56*b1cdbd2cSJim Jagielski         aDescription = rD;
57*b1cdbd2cSJim Jagielski     }
58*b1cdbd2cSJim Jagielski 
~AccessibleHyperlink()59*b1cdbd2cSJim Jagielski     AccessibleHyperlink::~AccessibleHyperlink()
60*b1cdbd2cSJim Jagielski     {
61*b1cdbd2cSJim Jagielski         delete pFld;
62*b1cdbd2cSJim Jagielski     }
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski     // XAccessibleAction
getAccessibleActionCount()65*b1cdbd2cSJim Jagielski     sal_Int32 SAL_CALL AccessibleHyperlink::getAccessibleActionCount() throw (uno::RuntimeException)
66*b1cdbd2cSJim Jagielski     {
67*b1cdbd2cSJim Jagielski     	 return isValid() ? 1 : 0;
68*b1cdbd2cSJim Jagielski     }
69*b1cdbd2cSJim Jagielski 
doAccessibleAction(sal_Int32 nIndex)70*b1cdbd2cSJim Jagielski     sal_Bool SAL_CALL AccessibleHyperlink::doAccessibleAction( sal_Int32 nIndex  ) throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
71*b1cdbd2cSJim Jagielski     {
72*b1cdbd2cSJim Jagielski     	sal_Bool bRet = sal_False;
73*b1cdbd2cSJim Jagielski     	if ( isValid() && ( nIndex == 0 ) )
74*b1cdbd2cSJim Jagielski     	{
75*b1cdbd2cSJim Jagielski     	    rTA.FieldClicked( *pFld, nPara, nRealIdx );
76*b1cdbd2cSJim Jagielski     	    bRet = sal_True;
77*b1cdbd2cSJim Jagielski     	}
78*b1cdbd2cSJim Jagielski     	return bRet;
79*b1cdbd2cSJim Jagielski     }
80*b1cdbd2cSJim Jagielski 
getAccessibleActionDescription(sal_Int32 nIndex)81*b1cdbd2cSJim Jagielski     ::rtl::OUString  SAL_CALL AccessibleHyperlink::getAccessibleActionDescription( sal_Int32 nIndex ) throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
82*b1cdbd2cSJim Jagielski     {
83*b1cdbd2cSJim Jagielski     	::rtl::OUString aDesc;
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski     	if ( isValid() && ( nIndex == 0 ) )
86*b1cdbd2cSJim Jagielski     	    aDesc = aDescription;
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski     	return aDesc;
89*b1cdbd2cSJim Jagielski     }
90*b1cdbd2cSJim Jagielski 
getAccessibleActionKeyBinding(sal_Int32 nIndex)91*b1cdbd2cSJim Jagielski     uno::Reference< ::com::sun::star::accessibility::XAccessibleKeyBinding > SAL_CALL AccessibleHyperlink::getAccessibleActionKeyBinding( sal_Int32 nIndex ) throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
92*b1cdbd2cSJim Jagielski     {
93*b1cdbd2cSJim Jagielski     	uno::Reference< ::com::sun::star::accessibility::XAccessibleKeyBinding > xKeyBinding;
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski     	if( isValid() && ( nIndex == 0 ) )
96*b1cdbd2cSJim Jagielski     	{
97*b1cdbd2cSJim Jagielski     		::comphelper::OAccessibleKeyBindingHelper* pKeyBindingHelper = new ::comphelper::OAccessibleKeyBindingHelper();
98*b1cdbd2cSJim Jagielski     		xKeyBinding = pKeyBindingHelper;
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski             awt::KeyStroke aKeyStroke;
101*b1cdbd2cSJim Jagielski     		aKeyStroke.Modifiers = 0;
102*b1cdbd2cSJim Jagielski     		aKeyStroke.KeyCode = KEY_RETURN;
103*b1cdbd2cSJim Jagielski     		aKeyStroke.KeyChar = 0;
104*b1cdbd2cSJim Jagielski     		aKeyStroke.KeyFunc = 0;
105*b1cdbd2cSJim Jagielski     		pKeyBindingHelper->AddKeyBinding( aKeyStroke );
106*b1cdbd2cSJim Jagielski     	}
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski     	return xKeyBinding;
109*b1cdbd2cSJim Jagielski     }
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski     // XAccessibleHyperlink
getAccessibleActionAnchor(sal_Int32)112*b1cdbd2cSJim Jagielski     uno::Any SAL_CALL AccessibleHyperlink::getAccessibleActionAnchor( sal_Int32 /*nIndex*/ ) throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
113*b1cdbd2cSJim Jagielski     {
114*b1cdbd2cSJim Jagielski     	return uno::Any();
115*b1cdbd2cSJim Jagielski     }
116*b1cdbd2cSJim Jagielski 
getAccessibleActionObject(sal_Int32)117*b1cdbd2cSJim Jagielski     uno::Any SAL_CALL AccessibleHyperlink::getAccessibleActionObject( sal_Int32 /*nIndex*/ ) throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
118*b1cdbd2cSJim Jagielski     {
119*b1cdbd2cSJim Jagielski     	return uno::Any();
120*b1cdbd2cSJim Jagielski     }
121*b1cdbd2cSJim Jagielski 
getStartIndex()122*b1cdbd2cSJim Jagielski     sal_Int32 SAL_CALL AccessibleHyperlink::getStartIndex() throw (uno::RuntimeException)
123*b1cdbd2cSJim Jagielski     {
124*b1cdbd2cSJim Jagielski     	return nStartIdx;
125*b1cdbd2cSJim Jagielski     }
126*b1cdbd2cSJim Jagielski 
getEndIndex()127*b1cdbd2cSJim Jagielski     sal_Int32 SAL_CALL AccessibleHyperlink::getEndIndex() throw (uno::RuntimeException)
128*b1cdbd2cSJim Jagielski     {
129*b1cdbd2cSJim Jagielski     	return nEndIdx;
130*b1cdbd2cSJim Jagielski     }
131*b1cdbd2cSJim Jagielski 
isValid()132*b1cdbd2cSJim Jagielski     sal_Bool SAL_CALL AccessibleHyperlink::isValid(  ) throw (uno::RuntimeException)
133*b1cdbd2cSJim Jagielski     {
134*b1cdbd2cSJim Jagielski     	return rTA.IsValid();
135*b1cdbd2cSJim Jagielski     }
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski }  // end of namespace accessibility
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski // MT IA2: Accessiblehyperlink.hxx from IA2 CWS - meanwhile we also introduced one in DEV300 (above)
142*b1cdbd2cSJim Jagielski // Keeping this for reference - we probably should get support for image maps in our implementation...
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski /*
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski class SVX_DLLPUBLIC SvxAccessibleHyperlink :
148*b1cdbd2cSJim Jagielski 		public ::cppu::WeakImplHelper1<
149*b1cdbd2cSJim Jagielski 		::com::sun::star::accessibility::XAccessibleHyperlink >
150*b1cdbd2cSJim Jagielski {
151*b1cdbd2cSJim Jagielski 	SvxURLField* mpField;
152*b1cdbd2cSJim Jagielski 	sal_Int32 nStartIdx;
153*b1cdbd2cSJim Jagielski 	sal_Int32 nEndIdx;
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 	ImageMap* mpImageMap;
156*b1cdbd2cSJim Jagielski 	SdrObject* m_pShape;
157*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >  shapeParent;
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski public:
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 	SvxAccessibleHyperlink(){};
162*b1cdbd2cSJim Jagielski 	//SvxAccessibleHyperlink(::rtl::OUString name, const Imagemap* pImageMap);
163*b1cdbd2cSJim Jagielski 	SvxAccessibleHyperlink(const SvxURLField* p, sal_Int32 nStt, sal_Int32 nEnd);
164*b1cdbd2cSJim Jagielski 	SvxAccessibleHyperlink(SdrObject* p, ::accessibility::AccessibleShape* pAcc);
165*b1cdbd2cSJim Jagielski 	virtual ~SvxAccessibleHyperlink();
166*b1cdbd2cSJim Jagielski 	//void setImageMap(ImageMap* pMap);
167*b1cdbd2cSJim Jagielski 	//void setXAccessibleImage(::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > parent);
168*b1cdbd2cSJim Jagielski 	::rtl::OUString GetHyperlinkURL(sal_Int32 nIndex) throw (::com::sun::star::lang::IndexOutOfBoundsException);
169*b1cdbd2cSJim Jagielski 	sal_Bool IsValidHyperlink();
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski 	// XAccessibleAction
172*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL getAccessibleActionCount()
173*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException);
174*b1cdbd2cSJim Jagielski     virtual sal_Bool SAL_CALL doAccessibleAction( sal_Int32 nIndex )
175*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::lang::IndexOutOfBoundsException,
176*b1cdbd2cSJim Jagielski 				::com::sun::star::uno::RuntimeException);
177*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getAccessibleActionDescription(
178*b1cdbd2cSJim Jagielski 				sal_Int32 nIndex )
179*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::lang::IndexOutOfBoundsException,
180*b1cdbd2cSJim Jagielski 				::com::sun::star::uno::RuntimeException);
181*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Reference<
182*b1cdbd2cSJim Jagielski 			::com::sun::star::accessibility::XAccessibleKeyBinding > SAL_CALL
183*b1cdbd2cSJim Jagielski 		   	getAccessibleActionKeyBinding( sal_Int32 nIndex )
184*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::lang::IndexOutOfBoundsException,
185*b1cdbd2cSJim Jagielski 				::com::sun::star::uno::RuntimeException);
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 	// XAccessibleHyperlink
188*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Any SAL_CALL getAccessibleActionAnchor(
189*b1cdbd2cSJim Jagielski 				sal_Int32 nIndex )
190*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::lang::IndexOutOfBoundsException,
191*b1cdbd2cSJim Jagielski 				::com::sun::star::uno::RuntimeException);
192*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Any SAL_CALL getAccessibleActionObject(
193*b1cdbd2cSJim Jagielski 			sal_Int32 nIndex )
194*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::lang::IndexOutOfBoundsException,
195*b1cdbd2cSJim Jagielski 				::com::sun::star::uno::RuntimeException);
196*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL getStartIndex()
197*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException);
198*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL getEndIndex()
199*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException);
200*b1cdbd2cSJim Jagielski     virtual sal_Bool SAL_CALL isValid(  )
201*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException);
202*b1cdbd2cSJim Jagielski };
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski SvxAccessibleHyperlink::SvxAccessibleHyperlink( const SvxURLField *p,
206*b1cdbd2cSJim Jagielski 										  sal_Int32 nStt, sal_Int32 nEnd ) :
207*b1cdbd2cSJim Jagielski 	nStartIdx( nStt ),
208*b1cdbd2cSJim Jagielski 	nEndIdx( nEnd ),
209*b1cdbd2cSJim Jagielski 	m_pShape(NULL),
210*b1cdbd2cSJim Jagielski 	shapeParent(NULL)
211*b1cdbd2cSJim Jagielski {
212*b1cdbd2cSJim Jagielski 	if(p)
213*b1cdbd2cSJim Jagielski 		mpField = (SvxURLField*)p->Clone();
214*b1cdbd2cSJim Jagielski 	else
215*b1cdbd2cSJim Jagielski 		mpField = NULL;
216*b1cdbd2cSJim Jagielski }
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski SvxAccessibleHyperlink::SvxAccessibleHyperlink(SdrObject* p,
219*b1cdbd2cSJim Jagielski 											::accessibility::AccessibleShape* pAcc) :
220*b1cdbd2cSJim Jagielski 	nStartIdx( -1 ),
221*b1cdbd2cSJim Jagielski 	nEndIdx( -1 ),
222*b1cdbd2cSJim Jagielski 	mpField(NULL),
223*b1cdbd2cSJim Jagielski 	m_pShape(p)
224*b1cdbd2cSJim Jagielski {
225*b1cdbd2cSJim Jagielski 	mpImageMap = m_pShape->GetModel()->GetImageMapForObject(m_pShape);
226*b1cdbd2cSJim Jagielski 	shapeParent = dynamic_cast< XAccessible* >(pAcc);
227*b1cdbd2cSJim Jagielski }
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski SvxAccessibleHyperlink::~SvxAccessibleHyperlink()
230*b1cdbd2cSJim Jagielski {
231*b1cdbd2cSJim Jagielski 	if(mpField)
232*b1cdbd2cSJim Jagielski 		delete mpField;
233*b1cdbd2cSJim Jagielski }
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski ::rtl::OUString SvxAccessibleHyperlink::GetHyperlinkURL(sal_Int32 nIndex) throw (::com::sun::star::lang::IndexOutOfBoundsException)
236*b1cdbd2cSJim Jagielski {
237*b1cdbd2cSJim Jagielski 	if( mpField )
238*b1cdbd2cSJim Jagielski 	{
239*b1cdbd2cSJim Jagielski 		if (nIndex != 0)
240*b1cdbd2cSJim Jagielski 	        throw ::com::sun::star::lang::IndexOutOfBoundsException();
241*b1cdbd2cSJim Jagielski 		return ::rtl::OUString( mpField->GetURL() );
242*b1cdbd2cSJim Jagielski 	}
243*b1cdbd2cSJim Jagielski 	else if (mpImageMap)
244*b1cdbd2cSJim Jagielski 	{
245*b1cdbd2cSJim Jagielski 		if (nIndex < 0 || nIndex >=mpImageMap->GetIMapObjectCount())
246*b1cdbd2cSJim Jagielski 			throw IndexOutOfBoundsException();
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski 		IMapObject* pMapObj = mpImageMap->GetIMapObject(sal_uInt16(nIndex));
249*b1cdbd2cSJim Jagielski 		if (pMapObj->GetURL().Len())
250*b1cdbd2cSJim Jagielski 			return ::rtl::OUString( pMapObj->GetURL() );
251*b1cdbd2cSJim Jagielski 	}
252*b1cdbd2cSJim Jagielski 	else
253*b1cdbd2cSJim Jagielski 	{
254*b1cdbd2cSJim Jagielski 		if (nIndex != 0)
255*b1cdbd2cSJim Jagielski 	        throw ::com::sun::star::lang::IndexOutOfBoundsException();
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski 		SdrUnoObj* pUnoCtrl = dynamic_cast< SdrUnoObj* >( m_pShape );
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski 		if(pUnoCtrl)
260*b1cdbd2cSJim Jagielski 		{
261*b1cdbd2cSJim Jagielski 			try
262*b1cdbd2cSJim Jagielski 			{
263*b1cdbd2cSJim Jagielski 				uno::Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel(), uno::UNO_QUERY_THROW );
264*b1cdbd2cSJim Jagielski 				uno::Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY_THROW );
265*b1cdbd2cSJim Jagielski 				uno::Reference< beans::XPropertySetInfo > xPropInfo( xPropSet->getPropertySetInfo(), uno::UNO_QUERY_THROW );
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski 				form::FormButtonType eButtonType = form::FormButtonType_URL;
268*b1cdbd2cSJim Jagielski 				const ::rtl::OUString sButtonType( RTL_CONSTASCII_USTRINGPARAM( "ButtonType" ) );
269*b1cdbd2cSJim Jagielski 				if(xPropInfo->hasPropertyByName( sButtonType ) && (xPropSet->getPropertyValue( sButtonType ) >>= eButtonType ) )
270*b1cdbd2cSJim Jagielski 				{
271*b1cdbd2cSJim Jagielski 					::rtl::OUString aString;
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski 					// URL
274*b1cdbd2cSJim Jagielski 					const ::rtl::OUString sTargetURL(RTL_CONSTASCII_USTRINGPARAM( "TargetURL" ));
275*b1cdbd2cSJim Jagielski 					if(xPropInfo->hasPropertyByName(sTargetURL))
276*b1cdbd2cSJim Jagielski 					{
277*b1cdbd2cSJim Jagielski 						if( xPropSet->getPropertyValue(sTargetURL) >>= aString )
278*b1cdbd2cSJim Jagielski 							return aString;
279*b1cdbd2cSJim Jagielski 					}
280*b1cdbd2cSJim Jagielski 				}
281*b1cdbd2cSJim Jagielski 			}
282*b1cdbd2cSJim Jagielski 			catch( uno::Exception& )
283*b1cdbd2cSJim Jagielski 			{
284*b1cdbd2cSJim Jagielski 			}
285*b1cdbd2cSJim Jagielski 		}
286*b1cdbd2cSJim Jagielski 		// If hyperlink can't be got from sdrobject, query the corresponding document to retrieve the link info
287*b1cdbd2cSJim Jagielski 		uno::Reference< XAccessibleGroupPosition > xGroupPosition (shapeParent, uno::UNO_QUERY);
288*b1cdbd2cSJim Jagielski 		if (xGroupPosition.is())
289*b1cdbd2cSJim Jagielski 			return xGroupPosition->getObjectLink( uno::makeAny( shapeParent ) );
290*b1cdbd2cSJim Jagielski 	}
291*b1cdbd2cSJim Jagielski 	return ::rtl::OUString();
292*b1cdbd2cSJim Jagielski }
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski // Just check whether the first hyperlink is valid
295*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleHyperlink::IsValidHyperlink()
296*b1cdbd2cSJim Jagielski {
297*b1cdbd2cSJim Jagielski 	::rtl::OUString url = GetHyperlinkURL(0);
298*b1cdbd2cSJim Jagielski 	if (url.getLength() > 0)
299*b1cdbd2cSJim Jagielski 		return sal_True;
300*b1cdbd2cSJim Jagielski 	else
301*b1cdbd2cSJim Jagielski 		return sal_False;
302*b1cdbd2cSJim Jagielski }
303*b1cdbd2cSJim Jagielski // XAccessibleAction
304*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL SvxAccessibleHyperlink::getAccessibleActionCount()
305*b1cdbd2cSJim Jagielski 		throw (RuntimeException)
306*b1cdbd2cSJim Jagielski {
307*b1cdbd2cSJim Jagielski 	if (mpImageMap)
308*b1cdbd2cSJim Jagielski 		return mpImageMap->GetIMapObjectCount();
309*b1cdbd2cSJim Jagielski 	else
310*b1cdbd2cSJim Jagielski 		return 1;	// only shape link or url field
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski 	//return mpField ? 1 : (mpImageMap ? mpImageMap->GetIMapObjectCount() : 0);
313*b1cdbd2cSJim Jagielski }
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL SvxAccessibleHyperlink::doAccessibleAction( sal_Int32 nIndex )
316*b1cdbd2cSJim Jagielski 		throw (IndexOutOfBoundsException, RuntimeException)
317*b1cdbd2cSJim Jagielski {
318*b1cdbd2cSJim Jagielski 	vos::OGuard aGuard(Application::GetSolarMutex());
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski 	OUString url = GetHyperlinkURL(nIndex);
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 	if( url.getLength() > 0 )
325*b1cdbd2cSJim Jagielski 	{
326*b1cdbd2cSJim Jagielski 		SfxStringItem aStrItem(SID_FILE_NAME, url);
327*b1cdbd2cSJim Jagielski 		const SfxObjectShell* pDocSh = SfxObjectShell::Current();
328*b1cdbd2cSJim Jagielski 		if( pDocSh )
329*b1cdbd2cSJim Jagielski 		{
330*b1cdbd2cSJim Jagielski 			SfxMedium* pSfxMedium = pDocSh->GetMedium();
331*b1cdbd2cSJim Jagielski 			if( pSfxMedium)
332*b1cdbd2cSJim Jagielski 			{
333*b1cdbd2cSJim Jagielski 				SfxStringItem aReferer(SID_REFERER, pSfxMedium->GetName());
334*b1cdbd2cSJim Jagielski 				SfxBoolItem aBrowseItem( SID_BROWSE, TRUE );
335*b1cdbd2cSJim Jagielski 				SfxViewFrame* pFrame = SfxViewFrame::Current();
336*b1cdbd2cSJim Jagielski 				if( pFrame )
337*b1cdbd2cSJim Jagielski 				{
338*b1cdbd2cSJim Jagielski 					pFrame->GetDispatcher()->Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD,
339*b1cdbd2cSJim Jagielski 						    	&aStrItem, &aBrowseItem, &aReferer, 0L);
340*b1cdbd2cSJim Jagielski 					bRet = sal_True;
341*b1cdbd2cSJim Jagielski 				}
342*b1cdbd2cSJim Jagielski 			}
343*b1cdbd2cSJim Jagielski 		}
344*b1cdbd2cSJim Jagielski 	}
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski 	return bRet;
347*b1cdbd2cSJim Jagielski }
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski OUString SAL_CALL SvxAccessibleHyperlink::getAccessibleActionDescription(
350*b1cdbd2cSJim Jagielski 		sal_Int32 nIndex )
351*b1cdbd2cSJim Jagielski 		throw (IndexOutOfBoundsException, RuntimeException)
352*b1cdbd2cSJim Jagielski {
353*b1cdbd2cSJim Jagielski 	return GetHyperlinkURL(nIndex);
354*b1cdbd2cSJim Jagielski }
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< XAccessibleKeyBinding > SAL_CALL
357*b1cdbd2cSJim Jagielski 	SvxAccessibleHyperlink::getAccessibleActionKeyBinding( sal_Int32 )
358*b1cdbd2cSJim Jagielski 	throw (IndexOutOfBoundsException, RuntimeException)
359*b1cdbd2cSJim Jagielski {
360*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Reference< XAccessibleKeyBinding > xKeyBinding;
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski 	if( mpField || m_pShape)
363*b1cdbd2cSJim Jagielski 	{
364*b1cdbd2cSJim Jagielski 		::comphelper::OAccessibleKeyBindingHelper* pKeyBindingHelper =
365*b1cdbd2cSJim Jagielski 		   	new ::comphelper::OAccessibleKeyBindingHelper();
366*b1cdbd2cSJim Jagielski 		xKeyBinding = pKeyBindingHelper;
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski 		::com::sun::star::awt::KeyStroke aKeyStroke;
369*b1cdbd2cSJim Jagielski 		aKeyStroke.Modifiers = 0;
370*b1cdbd2cSJim Jagielski 		aKeyStroke.KeyCode = KEY_RETURN;
371*b1cdbd2cSJim Jagielski 		aKeyStroke.KeyChar = 0;
372*b1cdbd2cSJim Jagielski 		aKeyStroke.KeyFunc = 0;
373*b1cdbd2cSJim Jagielski 		pKeyBindingHelper->AddKeyBinding( aKeyStroke );
374*b1cdbd2cSJim Jagielski 	}
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski 	return xKeyBinding;
377*b1cdbd2cSJim Jagielski }
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski // XAccessibleHyperlink
380*b1cdbd2cSJim Jagielski Any SAL_CALL SvxAccessibleHyperlink::getAccessibleActionAnchor(
381*b1cdbd2cSJim Jagielski 		sal_Int32 nIndex )
382*b1cdbd2cSJim Jagielski 		throw (IndexOutOfBoundsException, RuntimeException)
383*b1cdbd2cSJim Jagielski {
384*b1cdbd2cSJim Jagielski 	Any aRet;
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski 	::rtl::OUString retText;
387*b1cdbd2cSJim Jagielski 	if(mpField && nIndex == 0)
388*b1cdbd2cSJim Jagielski 	{
389*b1cdbd2cSJim Jagielski 		retText = mpField->GetRepresentation();
390*b1cdbd2cSJim Jagielski 		aRet <<= retText;
391*b1cdbd2cSJim Jagielski 		return aRet;
392*b1cdbd2cSJim Jagielski 	}
393*b1cdbd2cSJim Jagielski 	else if(mpImageMap)
394*b1cdbd2cSJim Jagielski 	{
395*b1cdbd2cSJim Jagielski 		IMapObject* pMapObj = mpImageMap->GetIMapObject(sal_uInt16(nIndex));
396*b1cdbd2cSJim Jagielski 		if(pMapObj && pMapObj->GetURL().Len())
397*b1cdbd2cSJim Jagielski 			aRet <<= shapeParent;
398*b1cdbd2cSJim Jagielski 			return aRet;
399*b1cdbd2cSJim Jagielski 	}
400*b1cdbd2cSJim Jagielski 	else if (nIndex == 0)
401*b1cdbd2cSJim Jagielski 	{
402*b1cdbd2cSJim Jagielski 		aRet <<= shapeParent;
403*b1cdbd2cSJim Jagielski 		return aRet;
404*b1cdbd2cSJim Jagielski 	}
405*b1cdbd2cSJim Jagielski 	return aRet;
406*b1cdbd2cSJim Jagielski }
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski Any SAL_CALL SvxAccessibleHyperlink::getAccessibleActionObject(
409*b1cdbd2cSJim Jagielski 			sal_Int32 nIndex )
410*b1cdbd2cSJim Jagielski 	throw (IndexOutOfBoundsException, RuntimeException)
411*b1cdbd2cSJim Jagielski {
412*b1cdbd2cSJim Jagielski 	::rtl::OUString retText = GetHyperlinkURL(nIndex);
413*b1cdbd2cSJim Jagielski 	Any aRet;
414*b1cdbd2cSJim Jagielski 	aRet <<= retText;
415*b1cdbd2cSJim Jagielski 	return aRet;
416*b1cdbd2cSJim Jagielski }
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL SvxAccessibleHyperlink::getStartIndex()
419*b1cdbd2cSJim Jagielski 		throw (RuntimeException)
420*b1cdbd2cSJim Jagielski {
421*b1cdbd2cSJim Jagielski 	return nStartIdx;
422*b1cdbd2cSJim Jagielski }
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL SvxAccessibleHyperlink::getEndIndex()
425*b1cdbd2cSJim Jagielski 		throw (RuntimeException)
426*b1cdbd2cSJim Jagielski {
427*b1cdbd2cSJim Jagielski 	return nEndIdx;
428*b1cdbd2cSJim Jagielski }
429*b1cdbd2cSJim Jagielski 
430*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL SvxAccessibleHyperlink::isValid(  )
431*b1cdbd2cSJim Jagielski 		throw (RuntimeException)
432*b1cdbd2cSJim Jagielski {
433*b1cdbd2cSJim Jagielski 	vos::OGuard aGuard(Application::GetSolarMutex());
434*b1cdbd2cSJim Jagielski 	//return mpField ? sal_True: ( mpImageMap ? sal_True : sal_False );
435*b1cdbd2cSJim Jagielski 	if (mpField || m_pShape)
436*b1cdbd2cSJim Jagielski 		return sal_True;
437*b1cdbd2cSJim Jagielski 	else
438*b1cdbd2cSJim Jagielski 		return sal_False;
439*b1cdbd2cSJim Jagielski }
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski */
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski 
445