1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef SD_OUTLINER_ITERATOR_HXX 25 #define SD_OUTLINER_ITERATOR_HXX 26 27 #include <svx/svdobj.hxx> 28 29 #include "pres.hxx" 30 #include "sal/types.h" 31 #include <vector> 32 #include <boost/shared_ptr.hpp> 33 34 class SdDrawDocument; 35 36 namespace sd { 37 38 class ViewShell; 39 class Outliner; 40 class View; 41 42 namespace outliner { 43 44 class IteratorImplBase; 45 class IteratorPosition; 46 47 /** Use this enum to specify the initial location of the object pointed to by 48 a newly created iterator. The values are 49 <ul><li><const>BEGIN</const> for the first object with reference to 50 iteration direction.</li> 51 <li>END for one past the last valid object or, if the iterator is a 52 backward iterator, the object in front of the first valid one.</li> 53 <li>CURRENT for the current object. Because there is only a current 54 page this usually is taken to be the first/last object on the current 55 page.</li></ul> 56 */ 57 enum IteratorLocation {BEGIN,END,CURRENT}; 58 59 /** Use this enum to specify the type of iterator when creating a new 60 iterator: 61 <ul><li>SELECTION for iteration over all objects that belong to the 62 current mark list.</li> 63 <li>SINGLE_VIEW for iteration over all objects in the current view.</li> 64 <li>DOCUMENT for iteratioin over all object in all relevant 65 views.</li></ul> 66 */ 67 enum IteratorType {SELECTION,SINGLE_VIEW,DOCUMENT}; 68 69 70 /** This iterator can be used to iterate over all <type>SdrObject</type> 71 objects of one of three set denoted by the <type>IteratorType</type>: 72 <ul><li>All objects of the current mark list (selection) 73 (type==SELECTION).</li> 74 <li>All objects in the current view (type==SINGLE_VIEW).</li> 75 <li>All objects in all views (type=DOCUMENT).</li></ul> 76 77 <p>Note that the iterator does not change pages or views. It is the 78 task of the user of the iterator to take the information provided by the 79 <type>IteratorPosition</type> as returned by the 80 <member>operator*()</member> method and set view, visible page, and 81 selection/edit mode markers to reflect this position.</p> 82 83 <p>A simple forward iteration from the first to the last object would 84 instantiate the iterator with 85 <code>Iterator(pDocument,pViewShell,true,BEGIN)</code> for some document 86 and view shell. This iterator can then be compared against 87 <code>Iterator(pDocument,pViewShell,true,END)</code>. On equality the 88 iteration should be stoped without evaluating the iterator: The position 89 of an end iterator is not valid.</p> 90 */ 91 class Iterator 92 { 93 public: 94 Iterator (void); 95 96 /** The copy constructor creates a new iterator by copying the 97 implementation object. 98 */ 99 Iterator (const Iterator& rIterator); 100 101 /** Create a new iterator with the implementation object being the 102 provided one. 103 @param pObject 104 A copy of this object will become the implementation object. 105 */ 106 explicit Iterator (IteratorImplBase* pObject); 107 108 ~Iterator (void); 109 110 /** Assign the iterator from the given one. The implementation object 111 of this iterator will be a copy of the given iterator. 112 @param rIterator 113 The iterator which to assign from. 114 */ 115 Iterator& operator= (const Iterator& rIterator); 116 /** Return the current position of the iterator. 117 @return 118 Returns a reference to the current position. Therefore this 119 method is not thread safe. The reason for this behaviour is, of 120 course, to ommit the copying of the returned position. 121 */ 122 const IteratorPosition& operator* () const; 123 /** The prefix increment operator returns the iterator pointing to the 124 next object. When in doubt prefer this operator over the postfix 125 increment operator. 126 @return 127 Returns a reference to this iterator pointing to the next object. 128 */ 129 Iterator& operator++ (); 130 /** The postfix increment operator returns the iterator still pointing 131 to the current object. Only the next call to 132 <member>operator*()</member> will return the next object. When in 133 doubt rather use the prefix increment operator. 134 @param dummy 135 A dummy operator used by the compiler. 136 @return 137 Returns a copy of the iterator as it where before the operator 138 was called. 139 */ 140 Iterator operator++ (int); 141 /** Test equality of two iterators. Two iterators are taken to be equal 142 when they point are of the same type (their implementation objects 143 are instances of the same class) and point to the same object. 144 @param rIterator 145 The iterator to test equality with. 146 @return 147 Returns <TRUE/> when both iterators point to the same object. 148 */ 149 bool operator== (const Iterator& rIterator); 150 /** Test whether two iterators point to different objects. This is just 151 the negation of the result of the equality operator. 152 @param rIterator 153 The iterator to test inequality with. 154 @return 155 Returns <TRUE/> when both iterators point to the different objects. 156 */ 157 bool operator!= (const Iterator& rIterator); 158 /** Reverse the direction of iteration. The position of the iterator is 159 not changed. Thus caling this method twice returns to the old state. 160 */ 161 void Reverse (void); 162 163 private: 164 /// The implementation object to which most of the methods are forwarded. 165 IteratorImplBase* mpIterator; 166 }; 167 168 169 170 171 /** This class wraps the <type>Outliner</type> class and represents it as 172 a container of <type>SdrObject</type> objects. Its main purpose is to 173 provide iterators for certain sub-sets of those objects. These sub-sets 174 are a) the set of the currently selected objects, b) all objects in the 175 current view, and c) all objects in all views. 176 177 <p>The direction of the returned iterators depends on the underlying 178 <type>Outliner</type> object and is usually set in the search 179 dialog.</p> 180 */ 181 class OutlinerContainer 182 { 183 public: 184 /** Create a new wraper object for the given outliner. 185 @param pOutliner 186 The outliner that is represented by the new object as 187 <type>SdrObject</type> container. 188 */ 189 OutlinerContainer (::sd::Outliner* pOutliner); 190 191 /** Return an iterator that points to the first object of one of the 192 sets described above. This takes also into account the direction of 193 iteration. 194 @return 195 The returned iterator points either to the first (forward 196 search) or to the last object (backward search) of the set. 197 */ 198 Iterator begin (void); 199 200 /** Return an iterator that marks the end of the iteration. This takes 201 also into account the direction of iteration. The object pointed to 202 is not valid. 203 @return 204 The returned iterator points either to that object past the last 205 one (forward search) or to the one in front of the first 206 (backward search). 207 */ 208 Iterator end (void); 209 210 /** Return an iterator that points to the current object of one of the 211 sets described above. This takes also into account the direction of 212 iteration. 213 @return 214 The returned iterator points either to the first (forward 215 search) or to the last object (backward search) of the set of 216 selected objects or of the current page if the search set spans 217 more than one page. 218 */ 219 Iterator current (void); 220 221 private: 222 /// The wrapped outliner that is represented as object container. 223 ::sd::Outliner* mpOutliner; 224 225 /** Create an iterator. The object pointed to depends on the search 226 direction retrieved from the outliner object 227 <member>mpOutliner</member> and the given location. 228 @param aLocation 229 This specifies whether the returned iterator points to the 230 first, (one past the) last, or current object. 231 @return 232 Returns an iterator as constructed by 233 <member>CreateSelectionIterator()</member>, 234 */ 235 Iterator CreateIterator (IteratorLocation aLocation); 236 237 /** Create an iterator that iterates over all currently selected 238 <type>SdrObjects</type> objects of the <member>mpOutliner</member> 239 outliner. 240 @param rObjectList 241 List of currently selected objects. This list is necessary 242 so that the selection can be changed without affecting the 243 iterator. 244 @param pDocument 245 The document to which the objects belong. 246 @param pViewShell 247 The view shell which displays the objects. 248 @param bDirectionIsForward 249 The direction of iteration. It defaults to forward. 250 @param aLocation 251 This specifies at which object the iterator points initially. 252 */ 253 Iterator CreateSelectionIterator ( 254 const ::std::vector<SdrObjectWeakRef>& rObjectList, 255 SdDrawDocument* pDocument, 256 const ::boost::shared_ptr<ViewShell>& rpViewShell, 257 bool bDirectionIsForward=true, 258 IteratorLocation aLocation=BEGIN); 259 260 /** Create an iterator that iterates over all <type>SdrObjects</type> 261 objects of the <member>mpOutliner</member> outliner. 262 @param pDocument 263 The document to which the objects belong. 264 @param pViewShell 265 The view shell which displays the objects. 266 @param bDirectionIsForward 267 The direction of iteration. It defaults to forward. 268 @param aLocation 269 This specifies at which object the iterator points initially. 270 */ 271 Iterator CreateDocumentIterator ( 272 SdDrawDocument* pDocument, 273 const ::boost::shared_ptr<ViewShell>& rpViewShell, 274 bool bDirectionIsForward=true, 275 IteratorLocation aLocation=BEGIN); 276 277 /** Return the index of a page that contains an object that a new 278 iterator shall point to. This page index depends primarily on the 279 location, iteration direction, as well as on edit mode and page 280 kind. 281 @param pDocument 282 The document to which the page belongs. 283 @param pViewShell 284 The view shell which displays the page. 285 @param ePageKind 286 Specifies the view the page belongs to. 287 @param eEditMode 288 Specifies whether the page is a master page. 289 @param bDirectionIsForward 290 The direction of iteration. 291 @param aLocation 292 This specifies at which object the iterator points initially. 293 */ 294 sal_Int32 GetPageIndex ( 295 SdDrawDocument* pDocument, 296 const ::boost::shared_ptr<ViewShell>& rpViewShell, 297 PageKind ePageKind, 298 EditMode eEditMode, 299 bool bDirectionIsForward, 300 IteratorLocation aLocation); 301 302 // Do not allow default constructor and copying of outliner containers. 303 OutlinerContainer (const OutlinerContainer&) {}; 304 OutlinerContainer (void) {}; 305 OutlinerContainer& operator= (const OutlinerContainer&) {return *this;}; 306 }; 307 308 309 310 311 /** Data collection specifying a <type>SdrObject</type> and its position in 312 a document and view. 313 */ 314 class IteratorPosition 315 { 316 public: 317 /** Create a new object with all data members set to default values. 318 These values should not be accessed. The only use of the object as 319 it is is as a marker in comparisons. 320 */ 321 IteratorPosition (void); 322 /** Create a new object with all data members set from the given 323 position. 324 @param aPosition 325 The position object from which to take the values that are 326 assigned to the data members of this object. 327 */ 328 IteratorPosition (const IteratorPosition& aPosition); 329 330 /// The destructor is a no-op at the moment. 331 ~IteratorPosition (void); 332 /** Assign the content of the given position to this one. 333 @param aPosition 334 This is the position object from which to take the values of all 335 data members. 336 @return 337 Returns a reference to this object. 338 */ 339 IteratorPosition& operator= (const IteratorPosition& aPosition); 340 /** Compare two positions for equality. 341 @return 342 <TRUE/> is returned only when all data members have the same 343 values in both position objects. 344 */ 345 bool operator== (const IteratorPosition& aPosition) const; 346 347 /// Pointer to the actual <type>SdrObject</type> object. 348 SdrObjectWeakRef mxObject; 349 350 /// Number of the actual SdrText from the current <type>SdrObject</type> 351 sal_Int32 mnText; 352 353 /// The index of a page where the object is located on. 354 sal_Int32 mnPageIndex; 355 /// Page kind of the view. 356 PageKind mePageKind; 357 /// Edit mode of the view. 358 EditMode meEditMode; 359 }; 360 361 362 } } // end of namespace ::sd::outliner 363 364 365 #endif // _SD_OUTLINER_ITERATOR_HXX 366 367