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 #include "precompiled_sd.hxx" 25 26 #include "model/SlideSorterModel.hxx" 27 #include "model/SlsPageDescriptor.hxx" 28 29 using namespace ::sd::slidesorter; 30 using namespace ::sd::slidesorter::model; 31 32 namespace { 33 34 class PageEnumerationImpl 35 : public Enumeration<SharedPageDescriptor> 36 { 37 public: 38 inline PageEnumerationImpl ( 39 const SlideSorterModel& rModel, 40 const PageEnumeration::PagePredicate& rPredicate); 41 virtual ~PageEnumerationImpl (void); 42 /** Create a copy of the called enumeration object. 43 */ 44 virtual inline ::std::auto_ptr<Enumeration<SharedPageDescriptor> > Clone (void); 45 46 virtual inline bool HasMoreElements (void) const; 47 virtual inline SharedPageDescriptor GetNextElement (void); 48 virtual inline void Rewind (void); 49 50 private: 51 const SlideSorterModel& mrModel; 52 const PageEnumeration::PagePredicate maPredicate; 53 int mnIndex; 54 55 /** This constructor sets the internal page index to the given value. 56 It does not call AdvanceToNextValidElement() to skip elements that 57 do not fullfill Predicate. 58 */ 59 inline PageEnumerationImpl ( 60 const SlideSorterModel& rModel, 61 const PageEnumeration::PagePredicate& rPredicate, 62 int nIndex); 63 64 /** Skip all elements that do not fullfill Predicate starting with the 65 one pointed to by mnIndex. 66 */ 67 inline void AdvanceToNextValidElement (void); 68 69 // Default constructor not implemented. 70 PageEnumerationImpl (void); 71 // Assignment operator not implemented. 72 PageEnumerationImpl& operator= (const PageEnumerationImpl&); 73 }; 74 75 } // end of anonymouse namespace 76 77 78 79 80 namespace sd { namespace slidesorter { namespace model { 81 82 83 PageEnumeration PageEnumeration::Create ( 84 const SlideSorterModel& rModel, 85 const PagePredicate& rPredicate) 86 { 87 return PageEnumeration(::std::auto_ptr<Enumeration<SharedPageDescriptor> >( 88 new PageEnumerationImpl(rModel, rPredicate))); 89 } 90 91 92 93 94 PageEnumeration::PageEnumeration ( 95 ::std::auto_ptr<Enumeration<SharedPageDescriptor> > pImpl) 96 : mpImpl(pImpl) 97 { 98 } 99 100 101 102 103 PageEnumeration::PageEnumeration ( 104 PageEnumeration& rEnumeration, 105 bool bCloneImpl) 106 { 107 108 if( bCloneImpl ) 109 { 110 mpImpl = rEnumeration.mpImpl->Clone(); 111 } 112 else 113 { 114 mpImpl = rEnumeration.mpImpl; 115 } 116 } 117 118 119 120 121 PageEnumeration::PageEnumeration (const PageEnumeration& rEnumeration ) 122 : sd::slidesorter::model::Enumeration<sd::slidesorter::model::SharedPageDescriptor>() 123 { 124 mpImpl = rEnumeration.mpImpl->Clone(); 125 } 126 127 128 129 130 PageEnumeration::~PageEnumeration (void) 131 { 132 } 133 134 135 136 137 PageEnumeration& PageEnumeration::operator= ( 138 const PageEnumeration& rEnumeration) 139 { 140 mpImpl = rEnumeration.mpImpl->Clone(); 141 return *this; 142 } 143 144 145 146 147 ::std::auto_ptr<Enumeration<SharedPageDescriptor> > PageEnumeration::Clone (void) 148 { 149 return ::std::auto_ptr<Enumeration<SharedPageDescriptor> >( 150 new PageEnumeration (*this, true)); 151 } 152 153 154 155 156 bool PageEnumeration::HasMoreElements (void) const 157 { 158 return mpImpl->HasMoreElements(); 159 } 160 161 162 163 SharedPageDescriptor PageEnumeration::GetNextElement (void) 164 { 165 return mpImpl->GetNextElement(); 166 } 167 168 169 170 171 void PageEnumeration::Rewind (void) 172 { 173 return mpImpl->Rewind(); 174 } 175 176 } } } // end of namespace ::sd::slidesorter::model 177 178 179 180 181 namespace { 182 183 PageEnumerationImpl::PageEnumerationImpl ( 184 const SlideSorterModel& rModel, 185 const PageEnumeration::PagePredicate& rPredicate) 186 : mrModel(rModel), 187 maPredicate(rPredicate), 188 mnIndex(0) 189 { 190 Rewind(); 191 } 192 193 194 195 196 PageEnumerationImpl::PageEnumerationImpl ( 197 const SlideSorterModel& rModel, 198 const PageEnumeration::PagePredicate& rPredicate, 199 int nIndex) 200 : mrModel(rModel), 201 maPredicate(rPredicate), 202 mnIndex(nIndex) 203 { 204 } 205 206 207 208 209 PageEnumerationImpl::~PageEnumerationImpl (void) 210 { 211 } 212 213 214 215 216 ::std::auto_ptr<Enumeration<SharedPageDescriptor> > 217 PageEnumerationImpl::Clone (void) 218 { 219 return ::std::auto_ptr<Enumeration<SharedPageDescriptor> >( 220 new PageEnumerationImpl(mrModel,maPredicate,mnIndex)); 221 } 222 223 224 225 226 bool PageEnumerationImpl::HasMoreElements (void) const 227 { 228 return (mnIndex < mrModel.GetPageCount()); 229 } 230 231 232 233 234 SharedPageDescriptor PageEnumerationImpl::GetNextElement (void) 235 { 236 SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(mnIndex)); 237 238 // Go to the following valid element. 239 mnIndex += 1; 240 AdvanceToNextValidElement(); 241 242 return pDescriptor; 243 } 244 245 246 247 248 void PageEnumerationImpl::Rewind (void) 249 { 250 // Go to first valid element. 251 mnIndex = 0; 252 AdvanceToNextValidElement(); 253 } 254 255 256 257 258 259 void PageEnumerationImpl::AdvanceToNextValidElement (void) 260 { 261 while (mnIndex < mrModel.GetPageCount()) 262 { 263 SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(mnIndex)); 264 265 // Test for the predicate being fullfilled. 266 if (pDescriptor.get()!=NULL && maPredicate(pDescriptor)) 267 { 268 // This predicate is valid. 269 break; 270 } 271 else 272 { 273 // Advance to next predicate. 274 mnIndex += 1; 275 } 276 } 277 } 278 279 } // end of anonymous namespace 280 281