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