LCOV - code coverage report
Current view: top level - sd/source/ui/view - OutlinerIterator.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 213 352 60.5 %
Date: 2015-06-13 12:38:46 Functions: 38 56 67.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 "OutlinerIterator.hxx"
      21             : #include "OutlinerIteratorImpl.hxx"
      22             : #include <svx/svditer.hxx>
      23             : #include <sfx2/dispatch.hxx>
      24             : #include <sfx2/viewfrm.hxx>
      25             : #include "Outliner.hxx"
      26             : 
      27             : #include "drawdoc.hxx"
      28             : #include "DrawViewShell.hxx"
      29             : #include "drawview.hxx"
      30             : #include "sdpage.hxx"
      31             : #include "FrameView.hxx"
      32             : #include "DrawDocShell.hxx"
      33             : #include "Window.hxx"
      34             : 
      35             : namespace sd { namespace outliner {
      36             : 
      37             : //===== IteratorPosition ======================================================
      38             : 
      39         589 : IteratorPosition::IteratorPosition()
      40             : : mnText(0)
      41             : , mnPageIndex(-1)
      42             : , mePageKind(PK_STANDARD)
      43         589 : , meEditMode(EM_PAGE)
      44             : {
      45         589 : }
      46             : 
      47           3 : IteratorPosition::IteratorPosition (const IteratorPosition& aPosition)
      48             : : mxObject(aPosition.mxObject)
      49             : , mnText(aPosition.mnText)
      50             : , mnPageIndex(aPosition.mnPageIndex)
      51             : , mePageKind(aPosition.mePageKind)
      52           3 : , meEditMode(aPosition.meEditMode)
      53             : {
      54           3 : }
      55             : 
      56         582 : IteratorPosition::~IteratorPosition()
      57             : {
      58         582 : }
      59             : 
      60          81 : IteratorPosition& IteratorPosition::operator= (const IteratorPosition& aPosition)
      61             : {
      62          81 :     mxObject = aPosition.mxObject;
      63          81 :     mnText = aPosition.mnText;
      64          81 :     mnPageIndex = aPosition.mnPageIndex;
      65          81 :     mePageKind = aPosition.mePageKind;
      66          81 :     meEditMode = aPosition.meEditMode;
      67          81 :     return *this;
      68             : }
      69             : 
      70          65 : bool IteratorPosition::operator== (const IteratorPosition& aPosition) const
      71             : {
      72          65 :     return mxObject.get() == aPosition.mxObject.get()
      73           7 :         && mnText == aPosition.mnText
      74           7 :         && mnPageIndex == aPosition.mnPageIndex
      75           5 :         && mePageKind == aPosition.mePageKind
      76          68 :         && meEditMode == aPosition.meEditMode;
      77             : }
      78             : 
      79             : //===== Iterator ==============================================================
      80             : 
      81         521 : Iterator::Iterator()
      82             : {
      83         521 :     mpIterator = NULL;
      84         521 : }
      85             : 
      86           6 : Iterator::Iterator (const Iterator& rIterator)
      87             : {
      88           6 :     mpIterator = rIterator.mpIterator ? rIterator.mpIterator->Clone() : NULL;
      89           6 : }
      90             : 
      91          72 : Iterator::Iterator (IteratorImplBase* pObject)
      92             : {
      93          72 :     mpIterator = pObject;
      94          72 : }
      95             : 
      96         589 : Iterator::~Iterator()
      97             : {
      98         589 :     delete mpIterator;
      99         589 : }
     100             : 
     101          25 : Iterator& Iterator::operator= (const Iterator& rIterator)
     102             : {
     103          25 :     if (this != &rIterator)
     104             :     {
     105          25 :         delete mpIterator;
     106          25 :         if (rIterator.mpIterator != NULL)
     107           9 :             mpIterator = rIterator.mpIterator->Clone();
     108             :         else
     109          16 :             mpIterator = NULL;
     110             :     }
     111          25 :     return *this;
     112             : }
     113             : 
     114          64 : const IteratorPosition& Iterator::operator* () const
     115             : {
     116             :     DBG_ASSERT (mpIterator!=NULL, "::sd::outliner::Iterator::operator* : missing implementation object");
     117          64 :     return mpIterator->GetPosition();
     118             : }
     119             : 
     120          60 : Iterator& Iterator::operator++ ()
     121             : {
     122          60 :     if (mpIterator!=NULL)
     123          60 :         mpIterator->GotoNextText();
     124          60 :     return *this;
     125             : }
     126             : 
     127           0 : Iterator Iterator::operator++ (int)
     128             : {
     129           0 :     Iterator aTmp (*this);
     130           0 :     if (mpIterator!=NULL)
     131           0 :         mpIterator->GotoNextText();
     132           0 :     return aTmp;
     133             : }
     134             : 
     135          69 : bool Iterator::operator== (const Iterator& rIterator)
     136             : {
     137          69 :     if (mpIterator == NULL || rIterator.mpIterator==NULL)
     138           4 :         return mpIterator == rIterator.mpIterator;
     139             :     else
     140          65 :         return *mpIterator == *rIterator.mpIterator;
     141             : }
     142             : 
     143          63 : bool Iterator::operator!= (const Iterator& rIterator)
     144             : {
     145          63 :     return ! operator==(rIterator);
     146             : }
     147             : 
     148           0 : void Iterator::Reverse()
     149             : {
     150           0 :     if (mpIterator != NULL)
     151           0 :         mpIterator->Reverse();
     152           0 : }
     153             : 
     154             : //===== IteratorFactory =======================================================
     155             : 
     156          72 : OutlinerContainer::OutlinerContainer (Outliner* pOutliner)
     157          72 : : mpOutliner(pOutliner)
     158             : {
     159          72 : }
     160             : 
     161           2 : Iterator OutlinerContainer::begin()
     162             : {
     163           2 :     return CreateIterator (BEGIN);
     164             : }
     165             : 
     166          65 : Iterator OutlinerContainer::end()
     167             : {
     168          65 :     return CreateIterator (END);
     169             : }
     170             : 
     171           5 : Iterator OutlinerContainer::current()
     172             : {
     173           5 :     return CreateIterator (CURRENT);
     174             : }
     175             : 
     176          72 : Iterator OutlinerContainer::CreateIterator (IteratorLocation aLocation)
     177             : {
     178             :     // Decide on certain features of the outliner which kind of iterator to
     179             :     // use.
     180          72 :     if (mpOutliner->mbRestrictSearchToSelection)
     181             :         // There is a selection.  Search only in this.
     182             :         return CreateSelectionIterator (
     183             :             mpOutliner->maMarkListCopy,
     184             :             mpOutliner->mpDrawDocument,
     185             :             mpOutliner->mpWeakViewShell.lock(),
     186             :             mpOutliner->mbDirectionIsForward,
     187           0 :             aLocation);
     188             :     else
     189             :         // Search in the whole document.
     190             :         return CreateDocumentIterator (
     191             :             mpOutliner->mpDrawDocument,
     192             :             mpOutliner->mpWeakViewShell.lock(),
     193             :             mpOutliner->mbDirectionIsForward,
     194          72 :             aLocation);
     195             : }
     196             : 
     197           0 : Iterator OutlinerContainer::CreateSelectionIterator (
     198             :     const ::std::vector<SdrObjectWeakRef>& rObjectList,
     199             :     SdDrawDocument* pDocument,
     200             :     const ::boost::shared_ptr<ViewShell>& rpViewShell,
     201             :     bool bDirectionIsForward,
     202             :     IteratorLocation aLocation)
     203             : {
     204             :     OSL_ASSERT(rpViewShell.get());
     205             : 
     206             :     sal_Int32 nObjectIndex;
     207             : 
     208           0 :     if (bDirectionIsForward)
     209           0 :         switch (aLocation)
     210             :         {
     211             :             case CURRENT:
     212             :             case BEGIN:
     213             :             default:
     214           0 :                 nObjectIndex = 0;
     215           0 :                 break;
     216             :             case END:
     217           0 :                 nObjectIndex = rObjectList.size();
     218           0 :                 break;
     219             :         }
     220             :     else
     221           0 :         switch (aLocation)
     222             :         {
     223             :             case CURRENT:
     224             :             case BEGIN:
     225             :             default:
     226           0 :                 nObjectIndex = rObjectList.size()-1;
     227           0 :                 break;
     228             :             case END:
     229           0 :                 nObjectIndex = -1;
     230           0 :                 break;
     231             :         }
     232             : 
     233             :     return Iterator (new SelectionIteratorImpl (
     234           0 :         rObjectList, nObjectIndex, pDocument, rpViewShell, bDirectionIsForward));
     235             : }
     236             : 
     237          72 : Iterator OutlinerContainer::CreateDocumentIterator (
     238             :     SdDrawDocument* pDocument,
     239             :     const ::boost::shared_ptr<ViewShell>& rpViewShell,
     240             :     bool bDirectionIsForward,
     241             :     IteratorLocation aLocation)
     242             : {
     243             :     OSL_ASSERT(rpViewShell.get());
     244             : 
     245             :     PageKind ePageKind;
     246             :     EditMode eEditMode;
     247             : 
     248          72 :     switch (aLocation)
     249             :     {
     250             :         case BEGIN:
     251             :         default:
     252           2 :             if (bDirectionIsForward)
     253             :             {
     254           2 :                 ePageKind = PK_STANDARD;
     255           2 :                 eEditMode = EM_PAGE;
     256             :             }
     257             :             else
     258             :             {
     259           0 :                 ePageKind = PK_HANDOUT;
     260           0 :                 eEditMode = EM_MASTERPAGE;
     261             :             }
     262           2 :             break;
     263             : 
     264             :         case END:
     265          65 :             if (bDirectionIsForward)
     266             :             {
     267          65 :                 ePageKind = PK_HANDOUT;
     268          65 :                 eEditMode = EM_MASTERPAGE;
     269             :             }
     270             :             else
     271             :             {
     272           0 :                 ePageKind = PK_STANDARD;
     273           0 :                 eEditMode = EM_PAGE;
     274             :             }
     275          65 :             break;
     276             : 
     277             :         case CURRENT:
     278             :             const ::boost::shared_ptr<DrawViewShell> pDrawViewShell(
     279           5 :                 ::boost::dynamic_pointer_cast<DrawViewShell>(rpViewShell));
     280           5 :             if (pDrawViewShell.get())
     281             :             {
     282           5 :                 ePageKind = pDrawViewShell->GetPageKind();
     283           5 :                 eEditMode = pDrawViewShell->GetEditMode();
     284             :             }
     285             :             else
     286             :             {
     287           0 :                 ePageKind = PK_STANDARD;
     288           0 :                 eEditMode = EM_PAGE;
     289             :             }
     290           5 :             break;
     291             :     }
     292             : 
     293             :     sal_Int32 nPageIndex = GetPageIndex (pDocument, rpViewShell,
     294          72 :         ePageKind, eEditMode, bDirectionIsForward, aLocation);
     295             : 
     296             :     return Iterator (
     297             :         new DocumentIteratorImpl (nPageIndex, ePageKind, eEditMode,
     298          72 :             pDocument, rpViewShell, bDirectionIsForward));
     299             : }
     300             : 
     301          72 : sal_Int32 OutlinerContainer::GetPageIndex (
     302             :     SdDrawDocument* pDocument,
     303             :     const ::boost::shared_ptr<ViewShell>& rpViewShell,
     304             :     PageKind ePageKind,
     305             :     EditMode eEditMode,
     306             :     bool bDirectionIsForward,
     307             :     IteratorLocation aLocation)
     308             : {
     309             :     OSL_ASSERT(rpViewShell);
     310             : 
     311             :     sal_Int32 nPageIndex;
     312             :     sal_Int32 nPageCount;
     313             : 
     314             :     const ::boost::shared_ptr<DrawViewShell> pDrawViewShell(
     315          72 :         ::boost::dynamic_pointer_cast<DrawViewShell>(rpViewShell));
     316             : 
     317          72 :     switch (eEditMode)
     318             :     {
     319             :         case EM_PAGE:
     320           7 :             nPageCount = pDocument->GetSdPageCount (ePageKind);
     321           7 :             break;
     322             :         case EM_MASTERPAGE:
     323          65 :             nPageCount = pDocument->GetMasterSdPageCount(ePageKind);
     324          65 :             break;
     325             :         default:
     326           0 :             nPageCount = 0;
     327             :     }
     328             : 
     329          72 :     switch (aLocation)
     330             :     {
     331             :         case CURRENT:
     332           5 :             if (pDrawViewShell.get())
     333           5 :                 nPageIndex = pDrawViewShell->GetCurPageId() - 1;
     334             :             else
     335             :             {
     336           0 :                 const SdPage* pPage = rpViewShell->GetActualPage();
     337           0 :                 if (pPage != NULL)
     338           0 :                     nPageIndex = (pPage->GetPageNum()-1)/2;
     339             :                 else
     340           0 :                     nPageIndex = 0;
     341             :             }
     342           5 :             break;
     343             : 
     344             :         case BEGIN:
     345             :         default:
     346           2 :             if (bDirectionIsForward)
     347           2 :                 nPageIndex = 0;
     348             :             else
     349           0 :                 nPageIndex = nPageCount-1;
     350           2 :             break;
     351             : 
     352             :         case END:
     353          65 :             if (bDirectionIsForward)
     354          65 :                 nPageIndex = nPageCount;
     355             :             else
     356           0 :                 nPageIndex = -1;
     357          65 :             break;
     358             :     }
     359             : 
     360          72 :     return nPageIndex;
     361             : }
     362             : 
     363             : //===== IteratorImplBase ====================================================
     364             : 
     365           0 : IteratorImplBase::IteratorImplBase(SdDrawDocument* pDocument,
     366             :     const ::boost::weak_ptr<ViewShell>& rpViewShellWeak,
     367             :     bool bDirectionIsForward)
     368             : :   maPosition()
     369             : ,   mpDocument (pDocument)
     370             : ,   mpViewShellWeak (rpViewShellWeak)
     371           0 : ,   mbDirectionIsForward (bDirectionIsForward)
     372             : {
     373           0 :     ::boost::shared_ptr<DrawViewShell> pDrawViewShell;
     374           0 :     if ( ! mpViewShellWeak.expired())
     375           0 :         pDrawViewShell = ::boost::dynamic_pointer_cast<DrawViewShell>(rpViewShellWeak.lock());
     376             : 
     377           0 :     if (pDrawViewShell.get())
     378             :     {
     379           0 :         maPosition.mePageKind = pDrawViewShell->GetPageKind();
     380           0 :         maPosition.meEditMode = pDrawViewShell->GetEditMode();
     381             :     }
     382             :     else
     383             :     {
     384           0 :         maPosition.mePageKind = PK_STANDARD;
     385           0 :         maPosition.meEditMode = EM_PAGE;
     386           0 :     }
     387           0 : }
     388             : 
     389          87 : IteratorImplBase::IteratorImplBase( SdDrawDocument* pDocument,
     390             :     const ::boost::weak_ptr<ViewShell>& rpViewShellWeak,
     391             :     bool bDirectionIsForward, PageKind ePageKind, EditMode eEditMode)
     392             : : maPosition()
     393             : , mpDocument (pDocument)
     394             : , mpViewShellWeak (rpViewShellWeak)
     395          87 : , mbDirectionIsForward (bDirectionIsForward)
     396             : {
     397          87 :     maPosition.mePageKind = ePageKind;
     398          87 :     maPosition.meEditMode = eEditMode;
     399          87 : }
     400             : 
     401          87 : IteratorImplBase::~IteratorImplBase()
     402          87 : {}
     403             : 
     404          65 : bool IteratorImplBase::operator== (const IteratorImplBase& rIterator) const
     405             : {
     406          65 :     return maPosition == rIterator.maPosition;
     407             : }
     408             : 
     409           0 : bool IteratorImplBase::IsEqual (const IteratorImplBase& rIterator, IteratorType ) const
     410             : {
     411             :     // When this method is executed instead of the ones from derived classes
     412             :     // then the argument is of another type then the object itself.  In this
     413             :     // just compare the position objects.
     414           0 :     return maPosition == rIterator.maPosition;
     415             : }
     416             : 
     417          64 : const IteratorPosition& IteratorImplBase::GetPosition()
     418             : {
     419          64 :     return maPosition;
     420             : }
     421             : 
     422          15 : IteratorImplBase* IteratorImplBase::Clone (IteratorImplBase* pObject) const
     423             : {
     424          15 :     if (pObject != NULL)
     425             :     {
     426          15 :         pObject->maPosition = maPosition;
     427          15 :         pObject->mpDocument = mpDocument;
     428          15 :         pObject->mpViewShellWeak = mpViewShellWeak;
     429          15 :         pObject->mbDirectionIsForward = mbDirectionIsForward;
     430             :     }
     431          15 :     return pObject;
     432             : }
     433             : 
     434           0 : void IteratorImplBase::Reverse()
     435             : {
     436           0 :     mbDirectionIsForward = ! mbDirectionIsForward;
     437           0 : }
     438             : 
     439             : //===== SelectionIteratorImpl ===========================================
     440             : 
     441           0 : SelectionIteratorImpl::SelectionIteratorImpl (
     442             :     const ::std::vector<SdrObjectWeakRef>& rObjectList,
     443             :     sal_Int32 nObjectIndex,
     444             :     SdDrawDocument* pDocument,
     445             :     const ::boost::weak_ptr<ViewShell>& rpViewShellWeak,
     446             :     bool bDirectionIsForward)
     447             :     : IteratorImplBase (pDocument, rpViewShellWeak, bDirectionIsForward),
     448             :       mrObjectList(rObjectList),
     449           0 :       mnObjectIndex(nObjectIndex)
     450             : {
     451           0 : }
     452             : 
     453           0 : SelectionIteratorImpl::~SelectionIteratorImpl()
     454           0 : {}
     455             : 
     456           0 : IteratorImplBase* SelectionIteratorImpl::Clone (IteratorImplBase* pObject) const
     457             : {
     458           0 :     SelectionIteratorImpl* pIterator = static_cast<SelectionIteratorImpl*>(pObject);
     459           0 :     if (pIterator == NULL)
     460             :         pIterator = new SelectionIteratorImpl (
     461           0 :             mrObjectList, mnObjectIndex, mpDocument, mpViewShellWeak, mbDirectionIsForward);
     462           0 :     return pIterator;
     463             : }
     464             : 
     465           0 : void SelectionIteratorImpl::GotoNextText()
     466             : {
     467           0 :     SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mrObjectList.at(mnObjectIndex).get() );
     468           0 :     if (mbDirectionIsForward)
     469             :     {
     470           0 :         if( pTextObj )
     471             :         {
     472           0 :             ++maPosition.mnText;
     473           0 :             if( maPosition.mnText >= pTextObj->getTextCount() )
     474             :             {
     475           0 :                 maPosition.mnText = 0;
     476           0 :                 ++mnObjectIndex;
     477             :             }
     478             :         }
     479             :         else
     480             :         {
     481           0 :             ++mnObjectIndex;
     482             :         }
     483             :     }
     484             :     else
     485             :     {
     486           0 :         if( pTextObj )
     487             :         {
     488           0 :             --maPosition.mnText;
     489           0 :             if( maPosition.mnText < 0 )
     490             :             {
     491           0 :                 maPosition.mnText = -1;
     492           0 :                 --mnObjectIndex;
     493             :             }
     494             :         }
     495             :         else
     496             :         {
     497           0 :             --mnObjectIndex;
     498           0 :             maPosition.mnText = -1;
     499             :         }
     500             : 
     501           0 :         if( (maPosition.mnText == -1) && (mnObjectIndex >= 0) )
     502             :         {
     503           0 :             pTextObj = dynamic_cast< SdrTextObj* >( mrObjectList.at(mnObjectIndex).get() );
     504           0 :             if( pTextObj )
     505           0 :                 maPosition.mnText = pTextObj->getTextCount() - 1;
     506             :         }
     507             : 
     508           0 :         if( maPosition.mnText == -1 )
     509           0 :             maPosition.mnText = 0;
     510             :     }
     511           0 : }
     512             : 
     513           0 : const IteratorPosition& SelectionIteratorImpl::GetPosition()
     514             : {
     515           0 :     maPosition.mxObject = mrObjectList.at(mnObjectIndex);
     516             : 
     517           0 :     return maPosition;
     518             : }
     519             : 
     520           0 : bool SelectionIteratorImpl::operator== (const IteratorImplBase& rIterator) const
     521             : {
     522           0 :     return rIterator.IsEqual (*this, SELECTION);
     523             : }
     524             : 
     525           0 : bool SelectionIteratorImpl::IsEqual (
     526             :     const IteratorImplBase& rIterator,
     527             :     IteratorType aType) const
     528             : {
     529           0 :     if (aType == SELECTION)
     530             :     {
     531             :         const SelectionIteratorImpl* pSelectionIterator =
     532           0 :             static_cast<const SelectionIteratorImpl*>(&rIterator);
     533           0 :         return mpDocument == pSelectionIterator->mpDocument
     534           0 :             && mnObjectIndex == pSelectionIterator->mnObjectIndex;
     535             :     }
     536             :     else
     537           0 :         return false;
     538             : }
     539             : 
     540             : //===== ViewIteratorImpl ================================================
     541             : 
     542           0 : ViewIteratorImpl::ViewIteratorImpl (
     543             :     sal_Int32 nPageIndex,
     544             :     SdDrawDocument* pDocument,
     545             :     const ::boost::weak_ptr<ViewShell>& rpViewShellWeak,
     546             :     bool bDirectionIsForward)
     547             :     : IteratorImplBase (pDocument, rpViewShellWeak, bDirectionIsForward),
     548             :       mbPageChangeOccurred(false),
     549             :       mpPage(NULL),
     550           0 :       mpObjectIterator(NULL)
     551             : {
     552           0 :     SetPage (nPageIndex);
     553           0 : }
     554             : 
     555          87 : ViewIteratorImpl::ViewIteratorImpl (
     556             :     sal_Int32 nPageIndex,
     557             :     SdDrawDocument* pDocument,
     558             :     const ::boost::weak_ptr<ViewShell>& rpViewShellWeak,
     559             :     bool bDirectionIsForward,
     560             :     PageKind ePageKind,
     561             :     EditMode eEditMode)
     562             :     : IteratorImplBase (pDocument, rpViewShellWeak, bDirectionIsForward, ePageKind, eEditMode),
     563             :       mbPageChangeOccurred(false),
     564             :       mpPage(NULL),
     565          87 :       mpObjectIterator(NULL)
     566             : {
     567          87 :     SetPage (nPageIndex);
     568          87 : }
     569             : 
     570          87 : ViewIteratorImpl::~ViewIteratorImpl()
     571             : {
     572          87 : }
     573             : 
     574          15 : IteratorImplBase* ViewIteratorImpl::Clone (IteratorImplBase* pObject) const
     575             : {
     576             : 
     577          15 :     ViewIteratorImpl* pIterator = static_cast<ViewIteratorImpl*>(pObject);
     578          15 :     if (pIterator == NULL)
     579             :         pIterator = new ViewIteratorImpl (
     580           0 :             maPosition.mnPageIndex, mpDocument, mpViewShellWeak, mbDirectionIsForward);
     581             : 
     582          15 :     IteratorImplBase::Clone (pObject);
     583             : 
     584          15 :     if (mpObjectIterator != NULL)
     585             :     {
     586          11 :         pIterator->mpObjectIterator = new SdrObjListIter(*mpPage, IM_DEEPNOGROUPS, !mbDirectionIsForward);
     587             : 
     588             :         // No direct way to set the object iterator to the current object.
     589          11 :         pIterator->maPosition.mxObject.reset(NULL);
     590          65 :         while (pIterator->mpObjectIterator->IsMore() && pIterator->maPosition.mxObject!=maPosition.mxObject)
     591          43 :             pIterator->maPosition.mxObject.reset(pIterator->mpObjectIterator->Next());
     592             :     }
     593             :     else
     594           4 :         pIterator->mpObjectIterator = NULL;
     595             : 
     596          15 :     return pIterator;
     597             : }
     598             : 
     599          60 : void ViewIteratorImpl::GotoNextText()
     600             : {
     601          60 :     SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( maPosition.mxObject.get() );
     602          60 :     if( pTextObj )
     603             :     {
     604          40 :         if (mbDirectionIsForward)
     605             :         {
     606          40 :             ++maPosition.mnText;
     607          40 :             if( maPosition.mnText < pTextObj->getTextCount() )
     608           0 :                 return;
     609             :         }
     610             :         else
     611             :         {
     612           0 :             --maPosition.mnText;
     613           0 :             if( maPosition.mnText >= 0 )
     614           0 :                 return;
     615             :         }
     616             :     }
     617             : 
     618          60 :     if (mpObjectIterator != NULL && mpObjectIterator->IsMore())
     619          42 :         maPosition.mxObject.reset(mpObjectIterator->Next());
     620             :     else
     621          18 :         maPosition.mxObject.reset(NULL);
     622             : 
     623          60 :     if (!maPosition.mxObject.is() )
     624             :     {
     625          18 :         if (mbDirectionIsForward)
     626          18 :             SetPage (maPosition.mnPageIndex+1);
     627             :         else
     628           0 :             SetPage (maPosition.mnPageIndex-1);
     629             : 
     630          18 :         if (mpPage != NULL)
     631           4 :             mpObjectIterator = new SdrObjListIter(*mpPage, IM_DEEPNOGROUPS, !mbDirectionIsForward);
     632          18 :         if (mpObjectIterator!=NULL && mpObjectIterator->IsMore())
     633           4 :             maPosition.mxObject.reset(mpObjectIterator->Next());
     634             :         else
     635          14 :             maPosition.mxObject.reset(NULL);
     636             :     }
     637             : 
     638          60 :     maPosition.mnText = 0;
     639          60 :     if( !mbDirectionIsForward && maPosition.mxObject.is() )
     640             :     {
     641           0 :         pTextObj = dynamic_cast< SdrTextObj* >( maPosition.mxObject.get() );
     642           0 :         if( pTextObj )
     643           0 :             maPosition.mnText = pTextObj->getTextCount() - 1;
     644             :     }
     645             : }
     646             : 
     647         117 : void ViewIteratorImpl::SetPage (sal_Int32 nPageIndex)
     648             : {
     649         117 :     mbPageChangeOccurred = (maPosition.mnPageIndex!=nPageIndex);
     650         117 :     if (mbPageChangeOccurred)
     651             :     {
     652         115 :         maPosition.mnPageIndex = nPageIndex;
     653             : 
     654             :         sal_Int32 nPageCount;
     655         115 :         if (maPosition.meEditMode == EM_PAGE)
     656          24 :             nPageCount = mpDocument->GetSdPageCount(maPosition.mePageKind);
     657             :         else
     658             :             nPageCount = mpDocument->GetMasterSdPageCount(
     659          91 :                 maPosition.mePageKind);
     660             : 
     661             :         // Get page pointer.  Here we have three cases: regular pages,
     662             :         // master pages and invalid page indices.  The later ones are not
     663             :         // errors but the effect of the iterator advancing to the next page
     664             :         // and going past the last one.  This dropping of the rim at the far
     665             :         // side is detected here and has to be reacted to by the caller.
     666         115 :         if (nPageIndex>=0 && nPageIndex < nPageCount)
     667             :         {
     668          64 :             if (maPosition.meEditMode == EM_PAGE)
     669             :                 mpPage = mpDocument->GetSdPage (
     670             :                     (sal_uInt16)nPageIndex,
     671          18 :                     maPosition.mePageKind);
     672             :             else
     673             :                 mpPage = mpDocument->GetMasterSdPage (
     674             :                     (sal_uInt16)nPageIndex,
     675          14 :                     maPosition.mePageKind);
     676             :         }
     677             :         else
     678          83 :             mpPage = NULL;
     679             :     }
     680             : 
     681             :     // Set up object list iterator.
     682         117 :     if (mpPage != NULL)
     683          32 :         mpObjectIterator = new SdrObjListIter(*mpPage, IM_DEEPNOGROUPS, ! mbDirectionIsForward);
     684             :     else
     685          85 :         mpObjectIterator = NULL;
     686             : 
     687             :     // Get object pointer.
     688         117 :     if (mpObjectIterator!=NULL && mpObjectIterator->IsMore())
     689          30 :         maPosition.mxObject.reset( mpObjectIterator->Next() );
     690             :     else
     691          87 :         maPosition.mxObject.reset( NULL );
     692             : 
     693         117 :     maPosition.mnText = 0;
     694         117 :     if( !mbDirectionIsForward && maPosition.mxObject.is() )
     695             :     {
     696           0 :         SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( maPosition.mxObject.get() );
     697           0 :         if( pTextObj )
     698           0 :             maPosition.mnText = pTextObj->getTextCount() - 1;
     699             :     }
     700             : 
     701         117 : }
     702             : 
     703           0 : void ViewIteratorImpl::Reverse()
     704             : {
     705           0 :     IteratorImplBase::Reverse ();
     706             : 
     707             :     // Create reversed object list iterator.
     708           0 :     if (mpObjectIterator != NULL)
     709           0 :         delete mpObjectIterator;
     710           0 :     if (mpPage != NULL)
     711           0 :         mpObjectIterator = new SdrObjListIter(*mpPage, IM_DEEPNOGROUPS, ! mbDirectionIsForward);
     712             :     else
     713           0 :         mpObjectIterator = NULL;
     714             : 
     715             :     // Move iterator to the current object.
     716           0 :     SdrObjectWeakRef xObject = maPosition.mxObject;
     717           0 :     maPosition.mxObject.reset(NULL);
     718             : 
     719           0 :     if (!mpObjectIterator)
     720           0 :         return;
     721             : 
     722           0 :     while (mpObjectIterator->IsMore() && maPosition.mxObject != xObject)
     723           0 :         maPosition.mxObject.reset(mpObjectIterator->Next());
     724             : }
     725             : 
     726             : //===== DocumentIteratorImpl ============================================
     727             : 
     728          87 : DocumentIteratorImpl::DocumentIteratorImpl (
     729             :     sal_Int32 nPageIndex,
     730             :     PageKind ePageKind, EditMode eEditMode,
     731             :     SdDrawDocument* pDocument,
     732             :     const ::boost::weak_ptr<ViewShell>& rpViewShellWeak,
     733             :     bool bDirectionIsForward)
     734             :     : ViewIteratorImpl (nPageIndex, pDocument, rpViewShellWeak, bDirectionIsForward,
     735          87 :         ePageKind, eEditMode)
     736             : {
     737          87 :     if (eEditMode == EM_PAGE)
     738          10 :         mnPageCount = pDocument->GetSdPageCount (ePageKind);
     739             :     else
     740          77 :         mnPageCount = pDocument->GetMasterSdPageCount(ePageKind);
     741          87 : }
     742             : 
     743         174 : DocumentIteratorImpl::~DocumentIteratorImpl()
     744         174 : {}
     745             : 
     746          15 : IteratorImplBase* DocumentIteratorImpl::Clone (IteratorImplBase* pObject) const
     747             : {
     748          15 :     DocumentIteratorImpl* pIterator = static_cast<DocumentIteratorImpl*>(pObject);
     749          15 :     if (pIterator == NULL)
     750             :         pIterator = new DocumentIteratorImpl (
     751             :             maPosition.mnPageIndex, maPosition.mePageKind, maPosition.meEditMode,
     752          15 :             mpDocument, mpViewShellWeak, mbDirectionIsForward);
     753             :     // Finish the cloning.
     754          15 :     return ViewIteratorImpl::Clone (pIterator);
     755             : }
     756             : 
     757          60 : void DocumentIteratorImpl::GotoNextText()
     758             : {
     759          60 :     bool bSetToOnePastLastPage = false;
     760          60 :     bool bViewChanged = false;
     761             : 
     762          60 :     ViewIteratorImpl::GotoNextText();
     763             : 
     764          60 :     if (mbDirectionIsForward)
     765             :     {
     766          60 :         if (maPosition.mnPageIndex >= mnPageCount)
     767             :         {
     768             :             // Switch to master page.
     769          12 :             if (maPosition.meEditMode == EM_PAGE)
     770             :             {
     771           6 :                 maPosition.meEditMode = EM_MASTERPAGE;
     772           6 :                 SetPage (0);
     773             :             }
     774             : 
     775             :             // Switch to next view mode.
     776             :             else
     777             :             {
     778           6 :                 if (maPosition.mePageKind == PK_HANDOUT)
     779             :                     // Not really necessary but makes things more clear.
     780           2 :                     bSetToOnePastLastPage = true;
     781             :                 else
     782             :                 {
     783           4 :                     maPosition.meEditMode = EM_PAGE;
     784           4 :                     if (maPosition.mePageKind == PK_STANDARD)
     785           2 :                         maPosition.mePageKind = PK_NOTES;
     786           2 :                     else if (maPosition.mePageKind == PK_NOTES)
     787           2 :                         maPosition.mePageKind = PK_HANDOUT;
     788           4 :                     SetPage (0);
     789             :                 }
     790             :             }
     791          12 :             bViewChanged = true;
     792             :         }
     793             :     }
     794             :     else
     795           0 :         if (maPosition.mnPageIndex < 0)
     796             :         {
     797             :             // Switch from master pages to draw pages.
     798           0 :             if (maPosition.meEditMode == EM_MASTERPAGE)
     799             :             {
     800           0 :                 maPosition.meEditMode = EM_PAGE;
     801           0 :                 bSetToOnePastLastPage = true;
     802             :             }
     803             : 
     804             :             // Switch to previous view mode.
     805             :             else
     806             :             {
     807           0 :                 if (maPosition.mePageKind == PK_STANDARD)
     808           0 :                     SetPage (-1);
     809             :                 else
     810             :                 {
     811           0 :                     maPosition.meEditMode = EM_MASTERPAGE;
     812           0 :                     if (maPosition.mePageKind == PK_HANDOUT)
     813           0 :                         maPosition.mePageKind = PK_NOTES;
     814           0 :                     else if (maPosition.mePageKind == PK_NOTES)
     815           0 :                         maPosition.mePageKind = PK_STANDARD;
     816           0 :                     bSetToOnePastLastPage = true;
     817             :                 }
     818             :             }
     819           0 :             bViewChanged = true;
     820             :         }
     821             : 
     822          60 :     if (bViewChanged)
     823             :     {
     824             :         // Get new page count;
     825             :         sal_Int32 nPageCount;
     826          12 :         if (maPosition.meEditMode == EM_PAGE)
     827           4 :             nPageCount = mpDocument->GetSdPageCount (maPosition.mePageKind);
     828             :         else
     829           8 :             nPageCount = mpDocument->GetMasterSdPageCount(maPosition.mePageKind);
     830             : 
     831             :         // Now that we know the number of pages we can set the current page index.
     832          12 :         if (bSetToOnePastLastPage)
     833           2 :             SetPage (nPageCount);
     834             :     }
     835          60 : }
     836             : 
     837          66 : } } // end of namespace ::sd::outliner
     838             : 
     839             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11