LCOV - code coverage report
Current view: top level - sw/source/core/access - accnotextframe.cxx (source / functions) Hit Total Coverage
Test: commit 0e63ca4fde4e446f346e35849c756a30ca294aab Lines: 33 153 21.6 %
Date: 2014-04-11 Functions: 5 34 14.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <osl/mutex.hxx>
      21             : #include <vcl/svapp.hxx>
      22             : #include <com/sun/star/accessibility/AccessibleRole.hpp>
      23             : #include <com/sun/star/accessibility/AccessibleStateType.hpp>
      24             : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
      25             : #include <unotools/accessiblestatesethelper.hxx>
      26             : #include <frmfmt.hxx>
      27             : #include <ndnotxt.hxx>
      28             : #include <flyfrm.hxx>
      29             : #include <cntfrm.hxx>
      30             : #include <hints.hxx>
      31             : #include "accnotextframe.hxx"
      32             : #include <fmturl.hxx>
      33             : #include <accnotexthyperlink.hxx>
      34             : #include <svtools/imap.hxx>
      35             : #include <unotools/accessiblerelationsethelper.hxx>
      36             : #include <com/sun/star/accessibility/AccessibleRelationType.hpp>
      37             : #include <com/sun/star/accessibility/XAccessibleRelationSet.hpp>
      38             : #include <doc.hxx>
      39             : 
      40             : using namespace ::com::sun::star;
      41             : using namespace ::com::sun::star::accessibility;
      42             : using utl::AccessibleRelationSetHelper;
      43             : 
      44           2 : const SwNoTxtNode *SwAccessibleNoTextFrame::GetNoTxtNode() const
      45             : {
      46           2 :     const SwNoTxtNode *pNd  = 0;
      47           2 :     const SwFlyFrm *pFlyFrm = static_cast< const SwFlyFrm *>( GetFrm() );
      48           2 :     if( pFlyFrm->Lower() && pFlyFrm->Lower()->IsNoTxtFrm() )
      49             :     {
      50             :         const SwCntntFrm *pCntFrm =
      51           2 :             static_cast<const SwCntntFrm *>( pFlyFrm->Lower() );
      52           2 :         const SwCntntNode* pSwCntntNode = pCntFrm->GetNode();
      53           2 :         if(pSwCntntNode != NULL)
      54             :         {
      55           2 :             pNd = pSwCntntNode->GetNoTxtNode();
      56             :         }
      57             :     }
      58             : 
      59           2 :     return pNd;
      60             : }
      61             : 
      62           1 : SwAccessibleNoTextFrame::SwAccessibleNoTextFrame(
      63             :         SwAccessibleMap* pInitMap,
      64             :         sal_Int16 nInitRole,
      65             :         const SwFlyFrm* pFlyFrm  ) :
      66             :     SwAccessibleFrameBase( pInitMap, nInitRole, pFlyFrm ),
      67           1 :     aDepend( this, const_cast < SwNoTxtNode * >( GetNoTxtNode() ) ),
      68             :     msTitle(),
      69           2 :     msDesc()
      70             : {
      71           1 :     const SwNoTxtNode* pNd = GetNoTxtNode();
      72             :     // #i73249#
      73             :     // consider new attributes Title and Description
      74           1 :     if( pNd )
      75             :     {
      76           1 :         msTitle = pNd->GetTitle();
      77             : 
      78           1 :         msDesc = pNd->GetDescription();
      79           2 :         if ( msDesc.isEmpty() &&
      80           1 :              msTitle != GetName() )
      81             :         {
      82           1 :             msDesc = msTitle;
      83             :         }
      84             :     }
      85           1 : }
      86             : 
      87           1 : SwAccessibleNoTextFrame::~SwAccessibleNoTextFrame()
      88             : {
      89           1 : }
      90             : 
      91           0 : void SwAccessibleNoTextFrame::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
      92             : {
      93           0 :     const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0 ;
      94             :     // #i73249#
      95             :     // suppress handling of RES_NAME_CHANGED in case that attribute Title is
      96             :     // used as the accessible name.
      97           0 :     if ( nWhich != RES_NAME_CHANGED ||
      98           0 :          msTitle.isEmpty() )
      99             :     {
     100           0 :         SwAccessibleFrameBase::Modify( pOld, pNew );
     101           0 :         if (!GetRegisteredIn())
     102           0 :             return; // probably was deleted - avoid doing anything
     103             :     }
     104             : 
     105           0 :     const SwNoTxtNode *pNd = GetNoTxtNode();
     106             :     OSL_ENSURE( pNd == aDepend.GetRegisteredIn(), "invalid frame" );
     107           0 :     switch( nWhich )
     108             :     {
     109             :         // #i73249#
     110             :         case RES_TITLE_CHANGED:
     111             :         {
     112             :             const OUString& sOldTitle(
     113           0 :                         dynamic_cast<const SwStringMsgPoolItem*>(pOld)->GetString() );
     114             :             const OUString& sNewTitle(
     115           0 :                         dynamic_cast<const SwStringMsgPoolItem*>(pNew)->GetString() );
     116           0 :             if ( sOldTitle == sNewTitle )
     117             :             {
     118           0 :                 break;
     119             :             }
     120           0 :             msTitle = sNewTitle;
     121           0 :             AccessibleEventObject aEvent;
     122           0 :             aEvent.EventId = AccessibleEventId::NAME_CHANGED;
     123           0 :             aEvent.OldValue <<= sOldTitle;
     124           0 :             aEvent.NewValue <<= msTitle;
     125           0 :             FireAccessibleEvent( aEvent );
     126             : 
     127           0 :             if ( !pNd->GetDescription().isEmpty() )
     128             :             {
     129           0 :                 break;
     130           0 :             }
     131             :         }
     132             :         // intentional no break here
     133             :         case RES_DESCRIPTION_CHANGED:
     134             :         {
     135           0 :             if ( pNd && GetFrm() )
     136             :             {
     137           0 :                 const OUString sOldDesc( msDesc );
     138             : 
     139           0 :                 const OUString& rDesc = pNd->GetDescription();
     140           0 :                 msDesc = rDesc;
     141           0 :                 if ( msDesc.isEmpty() &&
     142           0 :                      msTitle != GetName() )
     143             :                 {
     144           0 :                     msDesc = msTitle;
     145             :                 }
     146             : 
     147           0 :                 if ( msDesc != sOldDesc )
     148             :                 {
     149           0 :                     AccessibleEventObject aEvent;
     150           0 :                     aEvent.EventId = AccessibleEventId::DESCRIPTION_CHANGED;
     151           0 :                     aEvent.OldValue <<= sOldDesc;
     152           0 :                     aEvent.NewValue <<= msDesc;
     153           0 :                     FireAccessibleEvent( aEvent );
     154           0 :                 }
     155             :             }
     156             :         }
     157           0 :         break;
     158             :     }
     159             : }
     160             : 
     161           1 : void SwAccessibleNoTextFrame::Dispose( sal_Bool bRecursive )
     162             : {
     163           1 :     SolarMutexGuard aGuard;
     164             : 
     165           1 :     if( aDepend.GetRegisteredIn() )
     166           1 :         const_cast < SwModify *>( aDepend.GetRegisteredIn() )->Remove( &aDepend );
     167             : 
     168           1 :     SwAccessibleFrameBase::Dispose( bRecursive );
     169           1 : }
     170             : 
     171             : // #i73249#
     172           0 : OUString SAL_CALL SwAccessibleNoTextFrame::getAccessibleName (void)
     173             :         throw (uno::RuntimeException, std::exception)
     174             : {
     175           0 :     SolarMutexGuard aGuard;
     176             : 
     177           0 :     CHECK_FOR_DEFUNC( XAccessibleContext )
     178             : 
     179           0 :     if ( !msTitle.isEmpty() )
     180             :     {
     181           0 :         return msTitle;
     182             :     }
     183             : 
     184           0 :     return SwAccessibleFrameBase::getAccessibleName();
     185             : }
     186             : 
     187           0 : OUString SAL_CALL SwAccessibleNoTextFrame::getAccessibleDescription (void)
     188             :         throw (uno::RuntimeException, std::exception)
     189             : {
     190           0 :     SolarMutexGuard aGuard;
     191             : 
     192           0 :     CHECK_FOR_DEFUNC( XAccessibleContext )
     193             : 
     194           0 :     return msDesc;
     195             : }
     196             : 
     197             : // XInterface
     198             : 
     199          71 : uno::Any SAL_CALL SwAccessibleNoTextFrame::queryInterface( const uno::Type& aType )
     200             :     throw (uno::RuntimeException, std::exception)
     201             : {
     202          71 :     if( aType ==
     203          71 :         ::getCppuType( static_cast<uno::Reference<XAccessibleImage>*>( NULL ) ) )
     204             :     {
     205           0 :         uno::Reference<XAccessibleImage> xImage = this;
     206           0 :         uno::Any aAny;
     207           0 :         aAny <<= xImage;
     208           0 :         return aAny;
     209             :     }
     210          71 :     else if ( aType == ::getCppuType((uno::Reference<XAccessibleHypertext> *)0) )
     211             :     {
     212           0 :         uno::Reference<XAccessibleHypertext> aAccHypertext = this;
     213           0 :         uno::Any aAny;
     214           0 :         aAny <<= aAccHypertext;
     215           0 :         return aAny;
     216             :     }
     217             :     else
     218          71 :         return SwAccessibleContext::queryInterface( aType );
     219             : }
     220             : 
     221             : // XTypeProvider
     222             : 
     223           0 : uno::Sequence< uno::Type > SAL_CALL SwAccessibleNoTextFrame::getTypes() throw(uno::RuntimeException, std::exception)
     224             : {
     225           0 :     uno::Sequence< uno::Type > aTypes( SwAccessibleFrameBase::getTypes() );
     226             : 
     227           0 :     sal_Int32 nIndex = aTypes.getLength();
     228           0 :     aTypes.realloc( nIndex + 1 );
     229             : 
     230           0 :     uno::Type* pTypes = aTypes.getArray();
     231           0 :     pTypes[nIndex] = ::getCppuType( static_cast< uno::Reference< XAccessibleImage > * >( 0 ) );
     232             : 
     233           0 :     return aTypes;
     234             : }
     235             : 
     236             : /// XAccessibleImage
     237             : /** implementation of the XAccessibleImage methods is a no-brainer, as
     238             :     all relevant information is already accessible through other
     239             :     methods. So we just delegate to those. */
     240             : 
     241           0 : OUString SAL_CALL SwAccessibleNoTextFrame::getAccessibleImageDescription()
     242             :     throw ( uno::RuntimeException, std::exception )
     243             : {
     244           0 :     return getAccessibleDescription();
     245             : }
     246             : 
     247           0 : sal_Int32 SAL_CALL SwAccessibleNoTextFrame::getAccessibleImageHeight(  )
     248             :     throw ( uno::RuntimeException, std::exception )
     249             : {
     250           0 :     return getSize().Height;
     251             : }
     252             : 
     253           0 : sal_Int32 SAL_CALL SwAccessibleNoTextFrame::getAccessibleImageWidth(  )
     254             :     throw ( uno::RuntimeException, std::exception )
     255             : {
     256           0 :     return getSize().Width;
     257             : }
     258             : 
     259             : //=====  XAccesibleText  ==================================================
     260           0 : sal_Int32 SAL_CALL SwAccessibleNoTextFrame::getCaretPosition(  ) throw (::com::sun::star::uno::RuntimeException, std::exception){return 0;}
     261           0 : sal_Bool SAL_CALL SwAccessibleNoTextFrame::setCaretPosition( sal_Int32 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException, std::exception){return 0;}
     262           0 : sal_Unicode SAL_CALL SwAccessibleNoTextFrame::getCharacter( sal_Int32 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException, std::exception){return 0;}
     263           0 : ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL SwAccessibleNoTextFrame::getCharacterAttributes( sal_Int32 , const ::com::sun::star::uno::Sequence< OUString >& ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException, std::exception)
     264             : {
     265           0 :     uno::Sequence<beans::PropertyValue> aValues(0);
     266           0 :     return aValues;
     267             : }
     268           0 : ::com::sun::star::awt::Rectangle SAL_CALL SwAccessibleNoTextFrame::getCharacterBounds( sal_Int32 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException, std::exception)
     269             : {
     270           0 :     return com::sun::star::awt::Rectangle(0, 0, 0, 0 );
     271             : }
     272           0 : sal_Int32 SAL_CALL SwAccessibleNoTextFrame::getCharacterCount(  ) throw (::com::sun::star::uno::RuntimeException, std::exception){return 0;}
     273           0 : sal_Int32 SAL_CALL SwAccessibleNoTextFrame::getIndexAtPoint( const ::com::sun::star::awt::Point& ) throw (::com::sun::star::uno::RuntimeException, std::exception){return 0;}
     274           0 : OUString SAL_CALL SwAccessibleNoTextFrame::getSelectedText(  ) throw (::com::sun::star::uno::RuntimeException, std::exception){return OUString();}
     275           0 : sal_Int32 SAL_CALL SwAccessibleNoTextFrame::getSelectionStart(  ) throw (::com::sun::star::uno::RuntimeException, std::exception){return 0;}
     276           0 : sal_Int32 SAL_CALL SwAccessibleNoTextFrame::getSelectionEnd(  ) throw (::com::sun::star::uno::RuntimeException, std::exception){return 0;}
     277           0 : sal_Bool SAL_CALL SwAccessibleNoTextFrame::setSelection( sal_Int32 , sal_Int32 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException, std::exception){return sal_True;}
     278           0 : OUString SAL_CALL SwAccessibleNoTextFrame::getText(  ) throw (::com::sun::star::uno::RuntimeException, std::exception){return OUString();}
     279           0 : OUString SAL_CALL SwAccessibleNoTextFrame::getTextRange( sal_Int32 , sal_Int32 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException, std::exception){return OUString();}
     280           0 : ::com::sun::star::accessibility::TextSegment SAL_CALL SwAccessibleNoTextFrame::getTextAtIndex( sal_Int32 , sal_Int16 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException, std::exception)
     281             : {
     282           0 :     ::com::sun::star::accessibility::TextSegment aResult;
     283           0 :     return aResult;
     284             : }
     285           0 : ::com::sun::star::accessibility::TextSegment SAL_CALL SwAccessibleNoTextFrame::getTextBeforeIndex( sal_Int32, sal_Int16 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException, std::exception)
     286             : {
     287           0 :     ::com::sun::star::accessibility::TextSegment aResult;
     288           0 :     return aResult;
     289             : }
     290           0 : ::com::sun::star::accessibility::TextSegment SAL_CALL SwAccessibleNoTextFrame::getTextBehindIndex( sal_Int32 , sal_Int16 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException, std::exception)
     291             : {
     292           0 :     ::com::sun::star::accessibility::TextSegment aResult;
     293           0 :     return aResult;
     294             : }
     295             : 
     296           0 : sal_Bool SAL_CALL SwAccessibleNoTextFrame::copyText( sal_Int32, sal_Int32 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException, std::exception){return sal_True;}
     297             : 
     298             : //  XAccessibleHyperText
     299             : 
     300           0 : sal_Int32 SAL_CALL SwAccessibleNoTextFrame::getHyperLinkCount()
     301             : throw (uno::RuntimeException, std::exception)
     302             : {
     303           0 :     SolarMutexGuard aGuard;
     304             : 
     305           0 :     CHECK_FOR_DEFUNC( XAccessibleHypertext );
     306             : 
     307           0 :     sal_Int32 nCount = 0;
     308           0 :     SwFmtURL aURL( ((SwLayoutFrm*)GetFrm())->GetFmt()->GetURL() );
     309             : 
     310           0 :     if(aURL.GetMap() || !aURL.GetURL().isEmpty())
     311           0 :         nCount = 1;
     312             : 
     313           0 :     return nCount;
     314             : }
     315             : 
     316             : uno::Reference< XAccessibleHyperlink > SAL_CALL
     317           0 :     SwAccessibleNoTextFrame::getHyperLink( sal_Int32 nLinkIndex )
     318             :     throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
     319             : {
     320           0 :     SolarMutexGuard aGuard;
     321           0 :     CHECK_FOR_DEFUNC( XAccessibleHypertext );
     322             : 
     323           0 :     uno::Reference< XAccessibleHyperlink > xRet;
     324             : 
     325           0 :     SwFmtURL aURL( ((SwLayoutFrm*)GetFrm())->GetFmt()->GetURL() );
     326             : 
     327           0 :     if( nLinkIndex > 0 )
     328           0 :         throw lang::IndexOutOfBoundsException();
     329             : 
     330           0 :     if( aURL.GetMap() || !aURL.GetURL().isEmpty() )
     331             :     {
     332           0 :         if ( !alink.is() )
     333             :         {
     334           0 :             alink = new SwAccessibleNoTextHyperlink( this, GetFrm() );
     335             :         }
     336             : 
     337           0 :         return alink;
     338             :     }
     339             : 
     340           0 :     return NULL;
     341             : }
     342             : 
     343           0 : sal_Int32 SAL_CALL SwAccessibleNoTextFrame::getHyperLinkIndex( sal_Int32 )
     344             :     throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
     345             : {
     346           0 :     SolarMutexGuard aGuard;
     347             : 
     348           0 :     return 0;
     349             : }
     350             : 
     351           0 : uno::Reference<XAccessibleRelationSet> SAL_CALL SwAccessibleNoTextFrame::getAccessibleRelationSet( )
     352             :     throw ( uno::RuntimeException, std::exception )
     353             : {
     354           0 :     SolarMutexGuard aGuard;
     355             : 
     356           0 :     return new AccessibleRelationSetHelper();
     357             : }
     358             : 
     359             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10