LCOV - code coverage report
Current view: top level - sc/source/ui/Accessibility - AccessiblePageHeaderArea.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 88 127 69.3 %
Date: 2015-06-13 12:38:46 Functions: 15 19 78.9 %
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             : #include <tools/gen.hxx>
      26             : #include "AccessiblePageHeaderArea.hxx"
      27             : #include "AccessibleText.hxx"
      28             : #include "AccessibilityHints.hxx"
      29             : #include "editsrc.hxx"
      30             : #include "prevwsh.hxx"
      31             : #include "prevloc.hxx"
      32             : #include "scresid.hxx"
      33             : #include "sc.hrc"
      34             : 
      35             : #include <com/sun/star/accessibility/AccessibleRole.hpp>
      36             : #include <com/sun/star/accessibility/AccessibleStateType.hpp>
      37             : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
      38             : #include <editeng/editobj.hxx>
      39             : #include <svx/AccessibleTextHelper.hxx>
      40             : #include <comphelper/servicehelper.hxx>
      41             : #include <unotools/accessiblestatesethelper.hxx>
      42             : #include <rtl/ustrbuf.hxx>
      43             : #include <toolkit/helper/convert.hxx>
      44             : #include <vcl/svapp.hxx>
      45             : 
      46             : using namespace ::com::sun::star;
      47             : using namespace ::com::sun::star::accessibility;
      48             : 
      49             :     //=====  internal  ========================================================
      50             : 
      51          13 : ScAccessiblePageHeaderArea::ScAccessiblePageHeaderArea(
      52             :         const uno::Reference<XAccessible>& rxParent,
      53             :         ScPreviewShell* pViewShell,
      54             :         const EditTextObject* pEditObj,
      55             :         bool bHeader,
      56             :         SvxAdjust eAdjust)
      57             :         : ScAccessibleContextBase(rxParent, AccessibleRole::TEXT),
      58          13 :         mpEditObj(pEditObj->Clone()),
      59             :         mpTextHelper(NULL),
      60             :         mpViewShell(pViewShell),
      61             :         mbHeader(bHeader),
      62          26 :         meAdjust(eAdjust)
      63             : {
      64          13 :     if (mpViewShell)
      65          13 :         mpViewShell->AddAccessibilityObject(*this);
      66          13 : }
      67             : 
      68          39 : ScAccessiblePageHeaderArea::~ScAccessiblePageHeaderArea()
      69             : {
      70          13 :     if (!ScAccessibleContextBase::IsDefunc() && !rBHelper.bInDispose)
      71             :     {
      72             :         // increment refcount to prevent double call off dtor
      73           0 :         osl_atomic_increment( &m_refCount );
      74           0 :         dispose();
      75             :     }
      76          26 : }
      77             : 
      78          13 : void SAL_CALL ScAccessiblePageHeaderArea::disposing()
      79             : {
      80          13 :     SolarMutexGuard aGuard;
      81          13 :     if (mpViewShell)
      82             :     {
      83          13 :         mpViewShell->RemoveAccessibilityObject(*this);
      84          13 :         mpViewShell = NULL;
      85             :     }
      86          13 :     if (mpTextHelper)
      87          10 :         DELETEZ(mpTextHelper);
      88          13 :     if (mpEditObj)
      89          13 :         DELETEZ(mpEditObj);
      90             : 
      91          13 :     ScAccessibleContextBase::disposing();
      92          13 : }
      93             : 
      94             : //=====  SfxListener  =====================================================
      95             : 
      96          39 : void ScAccessiblePageHeaderArea::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
      97             : {
      98          39 :     const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
      99          39 :     if (pSimpleHint)
     100             :     {
     101             :         // only notify if child exist, otherwise it is not necessary
     102          26 :         if (pSimpleHint->GetId() == SC_HINT_ACC_VISAREACHANGED)
     103             :         {
     104          10 :             if (mpTextHelper)
     105          10 :                 mpTextHelper->UpdateChildren();
     106             : 
     107          10 :             AccessibleEventObject aEvent;
     108          10 :             aEvent.EventId = AccessibleEventId::VISIBLE_DATA_CHANGED;
     109          10 :             aEvent.Source = uno::Reference< XAccessibleContext >(this);
     110          10 :             CommitChange(aEvent);
     111             :         }
     112             :     }
     113          39 :     ScAccessibleContextBase::Notify(rBC, rHint);
     114          39 : }
     115             :     //=====  XAccessibleComponent  ============================================
     116             : 
     117           0 : uno::Reference< XAccessible > SAL_CALL ScAccessiblePageHeaderArea::getAccessibleAtPoint(
     118             :         const awt::Point& rPoint )
     119             :         throw (uno::RuntimeException, std::exception)
     120             : {
     121           0 :     uno::Reference<XAccessible> xRet;
     122           0 :     if (containsPoint(rPoint))
     123             :     {
     124           0 :          SolarMutexGuard aGuard;
     125           0 :         IsObjectValid();
     126             : 
     127           0 :         if(!mpTextHelper)
     128           0 :             CreateTextHelper();
     129             : 
     130           0 :         xRet = mpTextHelper->GetAt(rPoint);
     131             :     }
     132             : 
     133           0 :     return xRet;
     134             : }
     135             : 
     136             :     //=====  XAccessibleContext  ==============================================
     137             : 
     138             : sal_Int32 SAL_CALL
     139          26 :     ScAccessiblePageHeaderArea::getAccessibleChildCount()
     140             :                     throw (uno::RuntimeException, std::exception)
     141             : {
     142          26 :     SolarMutexGuard aGuard;
     143          26 :     IsObjectValid();
     144          26 :     if (!mpTextHelper)
     145          10 :         CreateTextHelper();
     146          26 :     return mpTextHelper->GetChildCount();
     147             : }
     148             : 
     149             : uno::Reference< XAccessible > SAL_CALL
     150          13 :     ScAccessiblePageHeaderArea::getAccessibleChild(sal_Int32 nIndex)
     151             :         throw (uno::RuntimeException,
     152             :         lang::IndexOutOfBoundsException, std::exception)
     153             : {
     154          13 :     SolarMutexGuard aGuard;
     155          13 :     IsObjectValid();
     156          13 :     if (!mpTextHelper)
     157           0 :         CreateTextHelper();
     158          13 :     return mpTextHelper->GetChild(nIndex);
     159             : }
     160             : 
     161             : uno::Reference<XAccessibleStateSet> SAL_CALL
     162          17 :     ScAccessiblePageHeaderArea::getAccessibleStateSet()
     163             :     throw (uno::RuntimeException, std::exception)
     164             : {
     165          17 :     SolarMutexGuard aGuard;
     166          34 :     uno::Reference<XAccessibleStateSet> xParentStates;
     167          17 :     if (getAccessibleParent().is())
     168             :     {
     169          17 :         uno::Reference<XAccessibleContext> xParentContext = getAccessibleParent()->getAccessibleContext();
     170          17 :         xParentStates = xParentContext->getAccessibleStateSet();
     171             :     }
     172          17 :     utl::AccessibleStateSetHelper* pStateSet = new utl::AccessibleStateSetHelper();
     173          17 :     if (IsDefunc())
     174           0 :         pStateSet->AddState(AccessibleStateType::DEFUNC);
     175             :     else
     176             :     {
     177          17 :         pStateSet->AddState(AccessibleStateType::ENABLED);
     178          17 :         pStateSet->AddState(AccessibleStateType::MULTI_LINE);
     179          17 :         if (isShowing())
     180           0 :             pStateSet->AddState(AccessibleStateType::SHOWING);
     181          17 :         if (isVisible())
     182          17 :             pStateSet->AddState(AccessibleStateType::VISIBLE);
     183             :     }
     184          34 :     return pStateSet;
     185             : }
     186             : 
     187             : // XServiceInfo
     188             : 
     189             : OUString SAL_CALL
     190           3 :        ScAccessiblePageHeaderArea::getImplementationName()
     191             :     throw (uno::RuntimeException, std::exception)
     192             : {
     193           3 :     return OUString("ScAccessiblePageHeaderArea");
     194             : }
     195             : 
     196             : uno::Sequence< OUString> SAL_CALL
     197           0 :        ScAccessiblePageHeaderArea::getSupportedServiceNames()
     198             :     throw (uno::RuntimeException, std::exception)
     199             : {
     200           0 :     uno::Sequence< OUString > aSequence = ScAccessibleContextBase::getSupportedServiceNames();
     201           0 :     sal_Int32 nOldSize(aSequence.getLength());
     202           0 :     aSequence.realloc(nOldSize + 1);
     203             : 
     204           0 :     aSequence[nOldSize] = "com.sun.star.sheet.AccessiblePageHeaderFooterAreasView";
     205             : 
     206           0 :     return aSequence;
     207             : }
     208             : 
     209             : //=====  XTypeProvider  =======================================================
     210             : 
     211             : uno::Sequence<sal_Int8> SAL_CALL
     212           0 :     ScAccessiblePageHeaderArea::getImplementationId()
     213             :     throw (uno::RuntimeException, std::exception)
     214             : {
     215           0 :     return css::uno::Sequence<sal_Int8>();
     216             : }
     217             : 
     218             : //===== internal ==============================================================
     219           6 : OUString SAL_CALL ScAccessiblePageHeaderArea::createAccessibleDescription()
     220             :     throw(uno::RuntimeException)
     221             : {
     222           6 :     OUString sDesc;
     223           6 :     switch (meAdjust)
     224             :     {
     225             :     case SVX_ADJUST_LEFT :
     226           6 :         sDesc = OUString(ScResId(STR_ACC_LEFTAREA_DESCR));
     227           6 :         break;
     228             :     case SVX_ADJUST_RIGHT:
     229           0 :         sDesc = OUString(ScResId(STR_ACC_RIGHTAREA_DESCR));
     230           0 :         break;
     231             :     case SVX_ADJUST_CENTER:
     232           0 :         sDesc = OUString(ScResId(STR_ACC_CENTERAREA_DESCR));
     233           0 :         break;
     234             :     default:
     235             :         OSL_FAIL("wrong adjustment found");
     236             :     }
     237             : 
     238           6 :     return sDesc;
     239             : }
     240             : 
     241           1 : OUString SAL_CALL ScAccessiblePageHeaderArea::createAccessibleName()
     242             :     throw (uno::RuntimeException, std::exception)
     243             : {
     244           1 :     OUString sName;
     245           1 :     switch (meAdjust)
     246             :     {
     247             :     case SVX_ADJUST_LEFT :
     248           1 :         sName = OUString(ScResId(STR_ACC_LEFTAREA_NAME));
     249           1 :         break;
     250             :     case SVX_ADJUST_RIGHT:
     251           0 :         sName = OUString(ScResId(STR_ACC_RIGHTAREA_NAME));
     252           0 :         break;
     253             :     case SVX_ADJUST_CENTER:
     254           0 :         sName = OUString(ScResId(STR_ACC_CENTERAREA_NAME));
     255           0 :         break;
     256             :     default:
     257             :         OSL_FAIL("wrong adjustment found");
     258             :     }
     259             : 
     260           1 :     return sName;
     261             : }
     262             : 
     263           0 : Rectangle ScAccessiblePageHeaderArea::GetBoundingBoxOnScreen() const
     264             :     throw(::com::sun::star::uno::RuntimeException, std::exception)
     265             : {
     266           0 :     Rectangle aRect;
     267           0 :     if (mxParent.is())
     268             :     {
     269           0 :         uno::Reference<XAccessibleContext> xContext = mxParent->getAccessibleContext();
     270           0 :         uno::Reference<XAccessibleComponent> xComp(xContext, uno::UNO_QUERY);
     271           0 :         if (xComp.is())
     272             :         {
     273             :             // has the same size and position on screen like the parent
     274           0 :             aRect = Rectangle(VCLPoint(xComp->getLocationOnScreen()), VCLRectangle(xComp->getBounds()).GetSize());
     275           0 :         }
     276             :     }
     277           0 :     return aRect;
     278             : }
     279             : 
     280          20 : Rectangle ScAccessiblePageHeaderArea::GetBoundingBox() const
     281             :     throw (::com::sun::star::uno::RuntimeException, std::exception)
     282             : {
     283          20 :     Rectangle aRect;
     284          20 :     if (mxParent.is())
     285             :     {
     286          20 :         uno::Reference<XAccessibleContext> xContext = mxParent->getAccessibleContext();
     287          40 :         uno::Reference<XAccessibleComponent> xComp(xContext, uno::UNO_QUERY);
     288          20 :         if (xComp.is())
     289             :         {
     290             :             // has the same size and position on screen like the parent and so the pos is (0, 0)
     291          20 :             Rectangle aNewRect(Point(0, 0), VCLRectangle(xComp->getBounds()).GetSize());
     292          20 :             aRect = aNewRect;
     293          20 :         }
     294             :     }
     295             : 
     296          20 :     return aRect;
     297             : }
     298             : 
     299          10 : void ScAccessiblePageHeaderArea::CreateTextHelper()
     300             : {
     301          10 :     if (!mpTextHelper)
     302             :     {
     303             :         ::std::unique_ptr < ScAccessibleTextData > pAccessibleHeaderTextData
     304          10 :             (new ScAccessibleHeaderTextData(mpViewShell, mpEditObj, mbHeader, meAdjust));
     305          20 :         ::std::unique_ptr< SvxEditSource > pEditSource (new ScAccessibilityEditSource(std::move(pAccessibleHeaderTextData)));
     306             : 
     307          10 :         mpTextHelper = new ::accessibility::AccessibleTextHelper(std::move(pEditSource));
     308          20 :         mpTextHelper->SetEventSource(this);
     309             :     }
     310         166 : }
     311             : 
     312             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11