1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef SD_OUTLINER_ITERATOR_IMPL_HXX 25*b1cdbd2cSJim Jagielski #define SD_OUTLINER_ITERATOR_IMPL_HXX 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <svx/svdobj.hxx> 28*b1cdbd2cSJim Jagielski #include "OutlinerIterator.hxx" 29*b1cdbd2cSJim Jagielski #include <boost/weak_ptr.hpp> 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski class SdDrawDocument; 32*b1cdbd2cSJim Jagielski class SdPage; 33*b1cdbd2cSJim Jagielski class SdrObjListIter; 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski namespace sd { 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski class ViewShell; 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielski namespace outliner { 40*b1cdbd2cSJim Jagielski 41*b1cdbd2cSJim Jagielski class IteratorImplBase; 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski /** Base class for the polymorphic implementation class of the 44*b1cdbd2cSJim Jagielski <type>Iterator</type> class. The iterators based on this class are 45*b1cdbd2cSJim Jagielski basically uni directional iterators. Their direction can, however, be 46*b1cdbd2cSJim Jagielski reversed at any point of their life time. 47*b1cdbd2cSJim Jagielski */ 48*b1cdbd2cSJim Jagielski class IteratorImplBase 49*b1cdbd2cSJim Jagielski { 50*b1cdbd2cSJim Jagielski public: 51*b1cdbd2cSJim Jagielski /** The constructor stores the given arguments to be used by the derived 52*b1cdbd2cSJim Jagielski classes. 53*b1cdbd2cSJim Jagielski @param pDocument 54*b1cdbd2cSJim Jagielski The document provides the information to be iterated on. 55*b1cdbd2cSJim Jagielski @param pViewShellWeak 56*b1cdbd2cSJim Jagielski Some information has to be taken from the view shell. 57*b1cdbd2cSJim Jagielski @param bDirectionIsForward 58*b1cdbd2cSJim Jagielski This flag defines the iteration direction. When <TRUE/> then 59*b1cdbd2cSJim Jagielski the direction is forwards otherwise it is backwards. 60*b1cdbd2cSJim Jagielski */ 61*b1cdbd2cSJim Jagielski IteratorImplBase (SdDrawDocument* pDocument, 62*b1cdbd2cSJim Jagielski const ::boost::weak_ptr<ViewShell>& rpViewShellWeak, 63*b1cdbd2cSJim Jagielski bool bDirectionIsForward); 64*b1cdbd2cSJim Jagielski IteratorImplBase (SdDrawDocument* pDocument, 65*b1cdbd2cSJim Jagielski const ::boost::weak_ptr<ViewShell>& rpViewShellWeak, 66*b1cdbd2cSJim Jagielski bool bDirectionIsForward, PageKind ePageKind, EditMode eEditMode); 67*b1cdbd2cSJim Jagielski virtual ~IteratorImplBase (void); 68*b1cdbd2cSJim Jagielski 69*b1cdbd2cSJim Jagielski /** Advance to the next text of the current object or to the next object. 70*b1cdbd2cSJim Jagielski This takes the iteration direction into 71*b1cdbd2cSJim Jagielski account. The new object pointed to can be retrieved (among other 72*b1cdbd2cSJim Jagielski information) by calling the <member>GetPosition</member> method. 73*b1cdbd2cSJim Jagielski */ 74*b1cdbd2cSJim Jagielski virtual void GotoNextText (void) = 0; 75*b1cdbd2cSJim Jagielski /** Return an object that describes the current object. 76*b1cdbd2cSJim Jagielski @return 77*b1cdbd2cSJim Jagielski The returned object describes the current object pointed to by 78*b1cdbd2cSJim Jagielski the iterator. See the description of 79*b1cdbd2cSJim Jagielski <type>IteratorPosition</type> for details on the available 80*b1cdbd2cSJim Jagielski information. 81*b1cdbd2cSJim Jagielski */ 82*b1cdbd2cSJim Jagielski virtual const IteratorPosition& GetPosition (void); 83*b1cdbd2cSJim Jagielski /** Create an exact copy of this object. No argument should be 84*b1cdbd2cSJim Jagielski specified when called from the outside. It then creates an object 85*b1cdbd2cSJim Jagielski first and passes that to the inherited <member>Clone()</member> 86*b1cdbd2cSJim Jagielski methods to fill in class specific information. 87*b1cdbd2cSJim Jagielski @return 88*b1cdbd2cSJim Jagielski Returns a copy of this object. When this method is called with 89*b1cdbd2cSJim Jagielski an argument then this value will be returned. 90*b1cdbd2cSJim Jagielski */ 91*b1cdbd2cSJim Jagielski virtual IteratorImplBase* Clone (IteratorImplBase* pObject=NULL) const; 92*b1cdbd2cSJim Jagielski /** Test the equality of the this object and the given iterator. Two 93*b1cdbd2cSJim Jagielski iterators are taken to be equal when they point to the same object. 94*b1cdbd2cSJim Jagielski Iteration direction is not taken into account. 95*b1cdbd2cSJim Jagielski @param rIterator 96*b1cdbd2cSJim Jagielski The iterator to compare to. 97*b1cdbd2cSJim Jagielski @return 98*b1cdbd2cSJim Jagielski When both iterators ar equal <TRUE/> is returned, <FALSE/> otherwise. 99*b1cdbd2cSJim Jagielski */ 100*b1cdbd2cSJim Jagielski virtual bool operator== (const IteratorImplBase& rIterator) const; 101*b1cdbd2cSJim Jagielski /** This method is used by the equality operator. Additionaly to the 102*b1cdbd2cSJim Jagielski iterator it takes a type information which is taken into account on 103*b1cdbd2cSJim Jagielski comparison. It is part of a "multimethod" pattern. 104*b1cdbd2cSJim Jagielski @param rIterator 105*b1cdbd2cSJim Jagielski The iterator to compare to. 106*b1cdbd2cSJim Jagielski @param aType 107*b1cdbd2cSJim Jagielski The type of the iterator. 108*b1cdbd2cSJim Jagielski @return 109*b1cdbd2cSJim Jagielski Returns <TRUE/> when both iterators point to the same object. 110*b1cdbd2cSJim Jagielski */ 111*b1cdbd2cSJim Jagielski virtual bool IsEqual (const IteratorImplBase& rIterator, IteratorType aType) const; 112*b1cdbd2cSJim Jagielski /** Reverse the direction of iteration. The current object stays the same. 113*b1cdbd2cSJim Jagielski */ 114*b1cdbd2cSJim Jagielski virtual void Reverse (void); 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski protected: 117*b1cdbd2cSJim Jagielski /// The current position as returned by <member>GetPosition()</member>. 118*b1cdbd2cSJim Jagielski IteratorPosition maPosition; 119*b1cdbd2cSJim Jagielski /// The document on whose data the iterator operates. 120*b1cdbd2cSJim Jagielski SdDrawDocument* mpDocument; 121*b1cdbd2cSJim Jagielski /// Necessary secondary source of information. 122*b1cdbd2cSJim Jagielski ::boost::weak_ptr<ViewShell> mpViewShellWeak; 123*b1cdbd2cSJim Jagielski /// Specifies the search direction. 124*b1cdbd2cSJim Jagielski bool mbDirectionIsForward; 125*b1cdbd2cSJim Jagielski }; 126*b1cdbd2cSJim Jagielski 127*b1cdbd2cSJim Jagielski 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski /** Iterator all objects that belong to the current mark list 131*b1cdbd2cSJim Jagielski a.k.a. selection. It is assumed that all marked objects belong to the 132*b1cdbd2cSJim Jagielski same page. It is further assumed that the mark list does not change 133*b1cdbd2cSJim Jagielski while an iterator is alive. It is therefore the responsibility of an 134*b1cdbd2cSJim Jagielski iterator's owner to handle the case of a changed mark list. 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski <p>For documentation of the methods please refere to the base class 137*b1cdbd2cSJim Jagielski <type>IteratorImplBase</type>.</p> 138*b1cdbd2cSJim Jagielski */ 139*b1cdbd2cSJim Jagielski class SelectionIteratorImpl 140*b1cdbd2cSJim Jagielski : public IteratorImplBase 141*b1cdbd2cSJim Jagielski { 142*b1cdbd2cSJim Jagielski public: 143*b1cdbd2cSJim Jagielski SelectionIteratorImpl ( 144*b1cdbd2cSJim Jagielski const ::std::vector< SdrObjectWeakRef >& rObjectList, 145*b1cdbd2cSJim Jagielski sal_Int32 nObjectIndex, 146*b1cdbd2cSJim Jagielski SdDrawDocument* pDocument, 147*b1cdbd2cSJim Jagielski const ::boost::weak_ptr<ViewShell>& rpViewShellWeak, 148*b1cdbd2cSJim Jagielski bool bDirectionIsForward); 149*b1cdbd2cSJim Jagielski SelectionIteratorImpl (const SelectionIteratorImpl& rObject); 150*b1cdbd2cSJim Jagielski virtual ~SelectionIteratorImpl (void); 151*b1cdbd2cSJim Jagielski 152*b1cdbd2cSJim Jagielski virtual void GotoNextText (void); 153*b1cdbd2cSJim Jagielski virtual const IteratorPosition& GetPosition (void); 154*b1cdbd2cSJim Jagielski virtual IteratorImplBase* Clone (IteratorImplBase* pObject) const; 155*b1cdbd2cSJim Jagielski virtual bool operator== (const IteratorImplBase& rIterator) const; 156*b1cdbd2cSJim Jagielski 157*b1cdbd2cSJim Jagielski private: 158*b1cdbd2cSJim Jagielski const ::std::vector<SdrObjectWeakRef>& mrObjectList; 159*b1cdbd2cSJim Jagielski sal_Int32 mnObjectIndex; 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielski /** Compare the given iterator with this object. This method handles 162*b1cdbd2cSJim Jagielski only the case that the given iterator is an instance of this class. 163*b1cdbd2cSJim Jagielski @param rIterator 164*b1cdbd2cSJim Jagielski The iterator to compare to. 165*b1cdbd2cSJim Jagielski @param aType 166*b1cdbd2cSJim Jagielski The type of the iterator. 167*b1cdbd2cSJim Jagielski @return 168*b1cdbd2cSJim Jagielski Returns <TRUE/> when both iterators point to the same object. 169*b1cdbd2cSJim Jagielski */ 170*b1cdbd2cSJim Jagielski virtual bool IsEqual (const IteratorImplBase& rIterator, IteratorType aType) const; 171*b1cdbd2cSJim Jagielski 172*b1cdbd2cSJim Jagielski IteratorImplBase& operator= (const IteratorImplBase& rIterator); 173*b1cdbd2cSJim Jagielski }; 174*b1cdbd2cSJim Jagielski 175*b1cdbd2cSJim Jagielski 176*b1cdbd2cSJim Jagielski /** Iterator for iteration over all objects in a single view. On reaching 177*b1cdbd2cSJim Jagielski the last object on the last page (or the first object on the first page) 178*b1cdbd2cSJim Jagielski the view is *not* switched. Further calls to the 179*b1cdbd2cSJim Jagielski <member>GotoNextObject()</member> method will be ignored. 180*b1cdbd2cSJim Jagielski 181*b1cdbd2cSJim Jagielski <p>For documentation of the methods please refere to the base class 182*b1cdbd2cSJim Jagielski <type>IteratorImplBase</type>.</p> 183*b1cdbd2cSJim Jagielski */ 184*b1cdbd2cSJim Jagielski class ViewIteratorImpl : public IteratorImplBase 185*b1cdbd2cSJim Jagielski { 186*b1cdbd2cSJim Jagielski public: 187*b1cdbd2cSJim Jagielski ViewIteratorImpl ( 188*b1cdbd2cSJim Jagielski sal_Int32 nPageIndex, 189*b1cdbd2cSJim Jagielski SdDrawDocument* pDocument, 190*b1cdbd2cSJim Jagielski const ::boost::weak_ptr<ViewShell>& rpViewShellWeak, 191*b1cdbd2cSJim Jagielski bool bDirectionIsForward); 192*b1cdbd2cSJim Jagielski ViewIteratorImpl ( 193*b1cdbd2cSJim Jagielski sal_Int32 nPageIndex, 194*b1cdbd2cSJim Jagielski SdDrawDocument* pDocument, 195*b1cdbd2cSJim Jagielski const ::boost::weak_ptr<ViewShell>& rpViewShellWeak, 196*b1cdbd2cSJim Jagielski bool bDirectionIsForward, 197*b1cdbd2cSJim Jagielski PageKind ePageKind, 198*b1cdbd2cSJim Jagielski EditMode eEditMode); 199*b1cdbd2cSJim Jagielski virtual ~ViewIteratorImpl (void); 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski virtual void GotoNextText (void); 202*b1cdbd2cSJim Jagielski virtual IteratorImplBase* Clone (IteratorImplBase* pObject) const; 203*b1cdbd2cSJim Jagielski virtual void Reverse (void); 204*b1cdbd2cSJim Jagielski 205*b1cdbd2cSJim Jagielski protected: 206*b1cdbd2cSJim Jagielski /// Number of pages in the view that is specified by <member>maPosition</member>. 207*b1cdbd2cSJim Jagielski sal_Int32 mnPageCount; 208*b1cdbd2cSJim Jagielski 209*b1cdbd2cSJim Jagielski /** Initialize this iterator with respect to the given location. After 210*b1cdbd2cSJim Jagielski this call the object looks like newly constructed. 211*b1cdbd2cSJim Jagielski */ 212*b1cdbd2cSJim Jagielski void Init (IteratorLocation aLocation); 213*b1cdbd2cSJim Jagielski 214*b1cdbd2cSJim Jagielski /** Set up page pointer and object list iterator for the specified 215*b1cdbd2cSJim Jagielski page. 216*b1cdbd2cSJim Jagielski @param nPageIndex 217*b1cdbd2cSJim Jagielski Index of the new page. It may lie outside the valid range for 218*b1cdbd2cSJim Jagielski page indices. 219*b1cdbd2cSJim Jagielski */ 220*b1cdbd2cSJim Jagielski void SetPage (sal_Int32 nPageIndex); 221*b1cdbd2cSJim Jagielski 222*b1cdbd2cSJim Jagielski private: 223*b1cdbd2cSJim Jagielski /// Indicates whether a page changed occured on switching to current page. 224*b1cdbd2cSJim Jagielski bool mbPageChangeOccured; 225*b1cdbd2cSJim Jagielski /// Pointer to the page associated with the current page index. May be NULL. 226*b1cdbd2cSJim Jagielski SdPage* mpPage; 227*b1cdbd2cSJim Jagielski /// Iterator of all objects on the current page. 228*b1cdbd2cSJim Jagielski SdrObjListIter* mpObjectIterator; 229*b1cdbd2cSJim Jagielski 230*b1cdbd2cSJim Jagielski // Don't use this operator. operator =(const ViewIteratorImpl &)231*b1cdbd2cSJim Jagielski ViewIteratorImpl& operator= (const ViewIteratorImpl&){return *this;}; 232*b1cdbd2cSJim Jagielski }; 233*b1cdbd2cSJim Jagielski 234*b1cdbd2cSJim Jagielski 235*b1cdbd2cSJim Jagielski 236*b1cdbd2cSJim Jagielski 237*b1cdbd2cSJim Jagielski /** Iterator for iteration over all objects in all views. It automatically 238*b1cdbd2cSJim Jagielski switches views when reaching the end/beginning of a view. 239*b1cdbd2cSJim Jagielski 240*b1cdbd2cSJim Jagielski <p>For documentation of the methods please refere to the base class 241*b1cdbd2cSJim Jagielski <type>IteratorImplBase</type>.</p> 242*b1cdbd2cSJim Jagielski */ 243*b1cdbd2cSJim Jagielski class DocumentIteratorImpl : public ViewIteratorImpl 244*b1cdbd2cSJim Jagielski { 245*b1cdbd2cSJim Jagielski public: 246*b1cdbd2cSJim Jagielski DocumentIteratorImpl ( 247*b1cdbd2cSJim Jagielski sal_Int32 nPageIndex, 248*b1cdbd2cSJim Jagielski PageKind ePageKind, 249*b1cdbd2cSJim Jagielski EditMode eEditMode, 250*b1cdbd2cSJim Jagielski SdDrawDocument* pDocument, 251*b1cdbd2cSJim Jagielski const ::boost::weak_ptr<ViewShell>& rpViewShellWeak, 252*b1cdbd2cSJim Jagielski bool bDirectionIsForward); 253*b1cdbd2cSJim Jagielski virtual ~DocumentIteratorImpl (void); 254*b1cdbd2cSJim Jagielski 255*b1cdbd2cSJim Jagielski virtual void GotoNextText (void); 256*b1cdbd2cSJim Jagielski virtual IteratorImplBase* Clone (IteratorImplBase* pObject) const; 257*b1cdbd2cSJim Jagielski 258*b1cdbd2cSJim Jagielski private: 259*b1cdbd2cSJim Jagielski sal_Int32 mnPageCount; 260*b1cdbd2cSJim Jagielski 261*b1cdbd2cSJim Jagielski // Don't use this operator. operator =(const DocumentIteratorImpl &)262*b1cdbd2cSJim Jagielski DocumentIteratorImpl& operator= (const DocumentIteratorImpl& ){return *this;}; 263*b1cdbd2cSJim Jagielski }; 264*b1cdbd2cSJim Jagielski 265*b1cdbd2cSJim Jagielski 266*b1cdbd2cSJim Jagielski } } // end of namespace ::sd::outliner 267*b1cdbd2cSJim Jagielski 268*b1cdbd2cSJim Jagielski #endif 269