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

Generated by: LCOV version 1.10