LCOV - code coverage report
Current view: top level - sc/source/ui/Accessibility - AccessiblePreviewHeaderCell.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 164 188 87.2 %
Date: 2014-11-03 Functions: 28 31 90.3 %
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 <sal/config.h>
      21             : 
      22             : #include <memory>
      23             : #include <utility>
      24             : 
      25             : /* Somehow, under same circumstances, MSVC creates object code for 2
      26             :  * inlined functions. Nobody here uses them, so simply define them away
      27             :  * so that there be no dupplicate symbols anymore.
      28             : 
      29             :  * The symbols "extents" and "indices" come from boost::multi_array.
      30             :  */
      31             : 
      32             : #ifdef indices
      33             : #undef indices
      34             : #endif
      35             : #define indices dummy2_indices
      36             : 
      37             : #ifdef extents
      38             : #undef extents
      39             : #endif
      40             : #define extents dummy2_extents
      41             : 
      42             : #include "scitems.hxx"
      43             : #include <editeng/eeitem.hxx>
      44             : #include <tools/gen.hxx>
      45             : #include "AccessibleText.hxx"
      46             : #include "editsrc.hxx"
      47             : #include <svx/AccessibleTextHelper.hxx>
      48             : #include "AccessiblePreviewHeaderCell.hxx"
      49             : #include "AccessibilityHints.hxx"
      50             : #include "prevwsh.hxx"
      51             : #include "miscuno.hxx"
      52             : #include "prevloc.hxx"
      53             : #include "scresid.hxx"
      54             : #include "sc.hrc"
      55             : 
      56             : #include <com/sun/star/accessibility/AccessibleRole.hpp>
      57             : #include <com/sun/star/accessibility/AccessibleStateType.hpp>
      58             : 
      59             : #include <vcl/window.hxx>
      60             : #include <vcl/svapp.hxx>
      61             : #include <svl/smplhint.hxx>
      62             : #include <unotools/accessiblestatesethelper.hxx>
      63             : #include <comphelper/sequence.hxx>
      64             : #include <comphelper/servicehelper.hxx>
      65             : #include <toolkit/helper/convert.hxx>
      66             : 
      67             : #ifdef indices
      68             : #undef indices
      69             : #endif
      70             : 
      71             : #ifdef extents
      72             : #undef extents
      73             : #endif
      74             : 
      75             : using namespace ::com::sun::star;
      76             : using namespace ::com::sun::star::accessibility;
      77             : 
      78             : //=====  internal  ============================================================
      79             : 
      80          18 : ScAccessiblePreviewHeaderCell::ScAccessiblePreviewHeaderCell( const ::com::sun::star::uno::Reference<
      81             :                                 ::com::sun::star::accessibility::XAccessible>& rxParent,
      82             :                             ScPreviewShell* pViewShell,
      83             :                             const ScAddress& rCellPos, bool bIsColHdr, bool bIsRowHdr,
      84             :                             sal_Int32 nIndex ) :
      85             :     ScAccessibleContextBase( rxParent, AccessibleRole::TABLE_CELL ),
      86             :     mpViewShell( pViewShell ),
      87             :     mpTextHelper( NULL ),
      88             :     mnIndex( nIndex ),
      89             :     maCellPos( rCellPos ),
      90             :     mbColumnHeader( bIsColHdr ),
      91             :     mbRowHeader( bIsRowHdr ),
      92          18 :     mpTableInfo( NULL )
      93             : {
      94          18 :     if (mpViewShell)
      95          18 :         mpViewShell->AddAccessibilityObject(*this);
      96          18 : }
      97             : 
      98           6 : ScAccessiblePreviewHeaderCell::~ScAccessiblePreviewHeaderCell()
      99             : {
     100           2 :     if (mpViewShell)
     101           0 :         mpViewShell->RemoveAccessibilityObject(*this);
     102           4 : }
     103             : 
     104          18 : void SAL_CALL ScAccessiblePreviewHeaderCell::disposing()
     105             : {
     106          18 :     SolarMutexGuard aGuard;
     107          18 :     if (mpViewShell)
     108             :     {
     109          18 :         mpViewShell->RemoveAccessibilityObject(*this);
     110          18 :         mpViewShell = NULL;
     111             :     }
     112             : 
     113          18 :        if (mpTableInfo)
     114          14 :         DELETEZ (mpTableInfo);
     115             : 
     116          18 :     ScAccessibleContextBase::disposing();
     117          18 : }
     118             : 
     119             : //=====  SfxListener  =====================================================
     120             : 
     121          18 : void ScAccessiblePreviewHeaderCell::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
     122             : {
     123          18 :     const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
     124          18 :     if (pSimpleHint)
     125             :     {
     126           0 :         sal_uLong nId = pSimpleHint->GetId();
     127           0 :         if (nId == SC_HINT_ACC_VISAREACHANGED)
     128             :         {
     129           0 :             if (mpTextHelper)
     130           0 :                 mpTextHelper->UpdateChildren();
     131             :         }
     132           0 :         else if ( nId == SFX_HINT_DATACHANGED )
     133             :         {
     134             :             //  column / row layout may change with any document change,
     135             :             //  so it must be invalidated
     136           0 :             DELETEZ( mpTableInfo );
     137             :         }
     138             :     }
     139             : 
     140          18 :     ScAccessibleContextBase::Notify(rBC, rHint);
     141          18 : }
     142             : 
     143             : //=====  XInterface  =====================================================
     144             : 
     145          78 : uno::Any SAL_CALL ScAccessiblePreviewHeaderCell::queryInterface( uno::Type const & rType )
     146             :     throw (uno::RuntimeException, std::exception)
     147             : {
     148          78 :     uno::Any aAny (ScAccessiblePreviewHeaderCellImpl::queryInterface(rType));
     149          78 :     return aAny.hasValue() ? aAny : ScAccessibleContextBase::queryInterface(rType);
     150             : }
     151             : 
     152         516 : void SAL_CALL ScAccessiblePreviewHeaderCell::acquire()
     153             :     throw ()
     154             : {
     155         516 :     ScAccessibleContextBase::acquire();
     156         516 : }
     157             : 
     158         500 : void SAL_CALL ScAccessiblePreviewHeaderCell::release()
     159             :     throw ()
     160             : {
     161         500 :     ScAccessibleContextBase::release();
     162         500 : }
     163             : 
     164             : //=====  XAccessibleValue  ================================================
     165             : 
     166           2 : uno::Any SAL_CALL ScAccessiblePreviewHeaderCell::getCurrentValue() throw (uno::RuntimeException, std::exception)
     167             : {
     168           2 :      SolarMutexGuard aGuard;
     169           2 :     IsObjectValid();
     170             : 
     171           2 :     double fValue(0.0);
     172           2 :     if (mbColumnHeader)
     173           2 :         fValue = maCellPos.Col();
     174             :     else
     175           0 :         fValue = maCellPos.Row();
     176             : 
     177           2 :     uno::Any aAny;
     178           2 :     aAny <<= fValue;
     179           2 :     return aAny;
     180             : }
     181             : 
     182           2 : sal_Bool SAL_CALL ScAccessiblePreviewHeaderCell::setCurrentValue( const uno::Any& /* aNumber */ )
     183             :                                                                 throw (uno::RuntimeException, std::exception)
     184             : {
     185             :     //  it is not possible to set a value
     186           2 :     return false;
     187             : }
     188             : 
     189           2 : uno::Any SAL_CALL ScAccessiblePreviewHeaderCell::getMaximumValue() throw (uno::RuntimeException, std::exception)
     190             : {
     191           2 :      SolarMutexGuard aGuard;
     192           2 :     IsObjectValid();
     193             : 
     194           2 :     double fValue(0.0);
     195           2 :     if (mbColumnHeader)
     196           2 :         fValue = MAXCOL;
     197             :     else
     198           0 :         fValue = MAXROW;
     199           2 :     uno::Any aAny;
     200           2 :     aAny <<= fValue;
     201           2 :     return aAny;
     202             : }
     203             : 
     204           2 : uno::Any SAL_CALL ScAccessiblePreviewHeaderCell::getMinimumValue() throw (uno::RuntimeException, std::exception)
     205             : {
     206           2 :     double fValue(0.0);
     207           2 :     uno::Any aAny;
     208           2 :     aAny <<= fValue;
     209           2 :     return aAny;
     210             : }
     211             : 
     212             : //=====  XAccessibleComponent  ============================================
     213             : 
     214           4 : uno::Reference< XAccessible > SAL_CALL ScAccessiblePreviewHeaderCell::getAccessibleAtPoint( const awt::Point& rPoint )
     215             :                                 throw (uno::RuntimeException, std::exception)
     216             : {
     217           4 :     uno::Reference<XAccessible> xRet;
     218           4 :     if (containsPoint(rPoint))
     219             :     {
     220           2 :          SolarMutexGuard aGuard;
     221           2 :         IsObjectValid();
     222             : 
     223           2 :         if(!mpTextHelper)
     224           0 :             CreateTextHelper();
     225             : 
     226           2 :         xRet = mpTextHelper->GetAt(rPoint);
     227             :     }
     228             : 
     229           4 :     return xRet;
     230             : }
     231             : 
     232           2 : void SAL_CALL ScAccessiblePreviewHeaderCell::grabFocus() throw (uno::RuntimeException, std::exception)
     233             : {
     234           2 :      SolarMutexGuard aGuard;
     235           2 :     IsObjectValid();
     236           2 :     if (getAccessibleParent().is())
     237             :     {
     238           2 :         uno::Reference<XAccessibleComponent> xAccessibleComponent(getAccessibleParent()->getAccessibleContext(), uno::UNO_QUERY);
     239           2 :         if (xAccessibleComponent.is())
     240           2 :             xAccessibleComponent->grabFocus();
     241           2 :     }
     242           2 : }
     243             : 
     244             : //=====  XAccessibleContext  ==============================================
     245             : 
     246          40 : sal_Int32 SAL_CALL ScAccessiblePreviewHeaderCell::getAccessibleChildCount() throw(uno::RuntimeException, std::exception)
     247             : {
     248          40 :     SolarMutexGuard aGuard;
     249          40 :     IsObjectValid();
     250          40 :     if (!mpTextHelper)
     251          16 :         CreateTextHelper();
     252          40 :     return mpTextHelper->GetChildCount();
     253             : }
     254             : 
     255          16 : uno::Reference< XAccessible > SAL_CALL ScAccessiblePreviewHeaderCell::getAccessibleChild(sal_Int32 nIndex)
     256             :                             throw (uno::RuntimeException, lang::IndexOutOfBoundsException, std::exception)
     257             : {
     258          16 :     SolarMutexGuard aGuard;
     259          16 :     IsObjectValid();
     260          16 :     if (!mpTextHelper)
     261           0 :         CreateTextHelper();
     262          16 :     return mpTextHelper->GetChild(nIndex);
     263             : }
     264             : 
     265           2 : sal_Int32 SAL_CALL ScAccessiblePreviewHeaderCell::getAccessibleIndexInParent() throw (uno::RuntimeException, std::exception)
     266             : {
     267           2 :     return mnIndex;
     268             : }
     269             : 
     270          30 : uno::Reference<XAccessibleStateSet> SAL_CALL ScAccessiblePreviewHeaderCell::getAccessibleStateSet()
     271             :                             throw(uno::RuntimeException, std::exception)
     272             : {
     273          30 :     SolarMutexGuard aGuard;
     274             : 
     275          60 :     uno::Reference<XAccessibleStateSet> xParentStates;
     276          30 :     if (getAccessibleParent().is())
     277             :     {
     278          30 :         uno::Reference<XAccessibleContext> xParentContext = getAccessibleParent()->getAccessibleContext();
     279          30 :         xParentStates = xParentContext->getAccessibleStateSet();
     280             :     }
     281          30 :     utl::AccessibleStateSetHelper* pStateSet = new utl::AccessibleStateSetHelper();
     282          30 :     if (IsDefunc(xParentStates))
     283           0 :         pStateSet->AddState(AccessibleStateType::DEFUNC);
     284             :     else
     285             :     {
     286          30 :         pStateSet->AddState(AccessibleStateType::ENABLED);
     287          30 :         pStateSet->AddState(AccessibleStateType::MULTI_LINE);
     288          30 :         if (isShowing())
     289           0 :             pStateSet->AddState(AccessibleStateType::SHOWING);
     290          30 :         pStateSet->AddState(AccessibleStateType::TRANSIENT);
     291          30 :         if (isVisible())
     292          30 :             pStateSet->AddState(AccessibleStateType::VISIBLE);
     293             :     }
     294          60 :     return pStateSet;
     295             : }
     296             : 
     297             : //=====  XServiceInfo  ====================================================
     298             : 
     299           6 : OUString SAL_CALL ScAccessiblePreviewHeaderCell::getImplementationName() throw(uno::RuntimeException, std::exception)
     300             : {
     301           6 :     return OUString("ScAccessiblePreviewHeaderCell");
     302             : }
     303             : 
     304           0 : uno::Sequence<OUString> SAL_CALL ScAccessiblePreviewHeaderCell::getSupportedServiceNames()
     305             :                                                     throw(uno::RuntimeException, std::exception)
     306             : {
     307           0 :     uno::Sequence< OUString > aSequence = ScAccessibleContextBase::getSupportedServiceNames();
     308           0 :     sal_Int32 nOldSize(aSequence.getLength());
     309           0 :     aSequence.realloc(nOldSize + 1);
     310             : 
     311           0 :     aSequence[nOldSize] = "com.sun.star.table.AccessibleCellView";
     312             : 
     313           0 :     return aSequence;
     314             : }
     315             : 
     316             : //=====  XTypeProvider  =======================================================
     317             : 
     318           0 : uno::Sequence< uno::Type > SAL_CALL ScAccessiblePreviewHeaderCell::getTypes()
     319             :         throw (uno::RuntimeException, std::exception)
     320             : {
     321           0 :     return comphelper::concatSequences(ScAccessiblePreviewHeaderCellImpl::getTypes(), ScAccessibleContextBase::getTypes());
     322             : }
     323             : 
     324             : uno::Sequence<sal_Int8> SAL_CALL
     325           0 :     ScAccessiblePreviewHeaderCell::getImplementationId(void)
     326             :     throw (uno::RuntimeException, std::exception)
     327             : {
     328           0 :     return css::uno::Sequence<sal_Int8>();
     329             : }
     330             : 
     331             : //====  internal  =========================================================
     332             : 
     333           2 : Rectangle ScAccessiblePreviewHeaderCell::GetBoundingBoxOnScreen() const throw (uno::RuntimeException, std::exception)
     334             : {
     335           2 :     Rectangle aCellRect;
     336             : 
     337           2 :     FillTableInfo();
     338             : 
     339           2 :     if (mpTableInfo)
     340             :     {
     341           2 :         const ScPreviewColRowInfo& rColInfo = mpTableInfo->GetColInfo()[maCellPos.Col()];
     342           2 :         const ScPreviewColRowInfo& rRowInfo = mpTableInfo->GetRowInfo()[maCellPos.Row()];
     343             : 
     344           2 :         aCellRect = Rectangle( rColInfo.nPixelStart, rRowInfo.nPixelStart, rColInfo.nPixelEnd, rRowInfo.nPixelEnd );
     345             :     }
     346             : 
     347           2 :     if (mpViewShell)
     348             :     {
     349           2 :         vcl::Window* pWindow = mpViewShell->GetWindow();
     350           2 :         if (pWindow)
     351             :         {
     352           2 :             Rectangle aRect = pWindow->GetWindowExtentsRelative(NULL);
     353           2 :             aCellRect.setX(aCellRect.getX() + aRect.getX());
     354           2 :             aCellRect.setY(aCellRect.getY() + aRect.getY());
     355             :         }
     356             :     }
     357           2 :     return aCellRect;
     358             : }
     359             : 
     360         156 : Rectangle ScAccessiblePreviewHeaderCell::GetBoundingBox() const throw (uno::RuntimeException, std::exception)
     361             : {
     362         156 :     FillTableInfo();
     363             : 
     364         156 :     if (mpTableInfo)
     365             :     {
     366         156 :         const ScPreviewColRowInfo& rColInfo = mpTableInfo->GetColInfo()[maCellPos.Col()];
     367         156 :         const ScPreviewColRowInfo& rRowInfo = mpTableInfo->GetRowInfo()[maCellPos.Row()];
     368             : 
     369         156 :         Rectangle aCellRect( rColInfo.nPixelStart, rRowInfo.nPixelStart, rColInfo.nPixelEnd, rRowInfo.nPixelEnd );
     370         156 :         uno::Reference<XAccessible> xAccParent = const_cast<ScAccessiblePreviewHeaderCell*>(this)->getAccessibleParent();
     371         156 :         if (xAccParent.is())
     372             :         {
     373         156 :             uno::Reference<XAccessibleContext> xAccParentContext = xAccParent->getAccessibleContext();
     374         312 :             uno::Reference<XAccessibleComponent> xAccParentComp (xAccParentContext, uno::UNO_QUERY);
     375         156 :             if (xAccParentComp.is())
     376             :             {
     377         156 :                 Rectangle aParentRect (VCLRectangle(xAccParentComp->getBounds()));
     378         156 :                 aCellRect.setX(aCellRect.getX() - aParentRect.getX());
     379         156 :                 aCellRect.setY(aCellRect.getY() - aParentRect.getY());
     380         156 :             }
     381             :         }
     382         156 :         return aCellRect;
     383             :     }
     384           0 :     return Rectangle();
     385             : }
     386             : 
     387          32 : OUString SAL_CALL ScAccessiblePreviewHeaderCell::createAccessibleDescription() throw(uno::RuntimeException)
     388             : {
     389          32 :     OUString sDescription = OUString(ScResId(STR_ACC_HEADERCELL_DESCR));
     390          32 :     return sDescription;
     391             : }
     392             : 
     393          40 : OUString SAL_CALL ScAccessiblePreviewHeaderCell::createAccessibleName() throw(uno::RuntimeException, std::exception)
     394             : {
     395          40 :     OUString sName = OUString(ScResId(STR_ACC_HEADERCELL_NAME));
     396             : 
     397          40 :     if ( mbColumnHeader )
     398             :     {
     399          36 :         if ( mbRowHeader )
     400             :         {
     401             :             //! name for corner cell?
     402             : 
     403             : //          sName = "Column/Row Header";
     404             :         }
     405             :         else
     406             :         {
     407             :             // name of column header
     408           4 :             sName += ScColToAlpha( maCellPos.Col() );
     409             :         }
     410             :     }
     411             :     else
     412             :     {
     413             :         // name of row header
     414           4 :         sName += OUString::number(  ( maCellPos.Row() + 1 ) );
     415             :     }
     416             : 
     417          40 :     return sName;
     418             : }
     419             : 
     420          30 : bool ScAccessiblePreviewHeaderCell::IsDefunc( const uno::Reference<XAccessibleStateSet>& rxParentStates )
     421             : {
     422         120 :     return ScAccessibleContextBase::IsDefunc() || (mpViewShell == NULL) || !getAccessibleParent().is() ||
     423         120 :         (rxParentStates.is() && rxParentStates->contains(AccessibleStateType::DEFUNC));
     424             : }
     425             : 
     426          16 : void ScAccessiblePreviewHeaderCell::CreateTextHelper()
     427             : {
     428          16 :     if (!mpTextHelper)
     429             :     {
     430             :         ::std::unique_ptr < ScAccessibleTextData > pAccessiblePreviewHeaderCellTextData
     431          16 :             (new ScAccessiblePreviewHeaderCellTextData(mpViewShell, OUString(getAccessibleName()), maCellPos, mbColumnHeader, mbRowHeader));
     432          32 :         ::std::unique_ptr< SvxEditSource > pEditSource (new ScAccessibilityEditSource(std::move(pAccessiblePreviewHeaderCellTextData)));
     433             : 
     434          16 :         mpTextHelper = new ::accessibility::AccessibleTextHelper(std::move(pEditSource));
     435          32 :         mpTextHelper->SetEventSource(this);
     436             :     }
     437          16 : }
     438             : 
     439         158 : void ScAccessiblePreviewHeaderCell::FillTableInfo() const
     440             : {
     441         158 :     if ( mpViewShell && !mpTableInfo )
     442             :     {
     443          14 :         Size aOutputSize;
     444          14 :         vcl::Window* pWindow = mpViewShell->GetWindow();
     445          14 :         if ( pWindow )
     446          14 :             aOutputSize = pWindow->GetOutputSizePixel();
     447          14 :         Point aPoint;
     448          14 :         Rectangle aVisRect( aPoint, aOutputSize );
     449             : 
     450          14 :         mpTableInfo = new ScPreviewTableInfo;
     451          14 :         mpViewShell->GetLocationData().GetTableInfo( aVisRect, *mpTableInfo );
     452             :     }
     453         386 : }
     454             : 
     455             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10