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 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_svx.hxx" 26 27 #include "svx/svdviter.hxx" 28 #include <svx/svdobj.hxx> 29 #include <svx/svdpage.hxx> 30 #include <svx/svdmodel.hxx> 31 #include <svx/svdview.hxx> 32 #include <svx/svdpagv.hxx> 33 #include <svx/svdsob.hxx> 34 #include <svl/brdcst.hxx> 35 #include <svx/sdrpaintwindow.hxx> 36 37 //////////////////////////////////////////////////////////////////////////////////////////////////// 38 39 void SdrViewIter::ImpInitVars() 40 { 41 mnListenerNum = 0L; 42 mnPageViewNum = 0L; 43 mnOutDevNum = 0L; 44 mpAktView = 0L; 45 } 46 47 //////////////////////////////////////////////////////////////////////////////////////////////////// 48 49 SdrViewIter::SdrViewIter(const SdrModel* pModel) 50 { 51 mpModel = pModel; 52 mpPage = 0L; 53 mpObject = 0L; 54 ImpInitVars(); 55 } 56 57 //////////////////////////////////////////////////////////////////////////////////////////////////// 58 59 SdrViewIter::SdrViewIter(const SdrPage* pPage, sal_Bool bNoMasterPage) 60 { 61 mpPage = pPage; 62 mpModel = (pPage) ? pPage->GetModel() : 0L; 63 mpObject = 0L; 64 mbNoMasterPage = bNoMasterPage; 65 ImpInitVars(); 66 } 67 68 //////////////////////////////////////////////////////////////////////////////////////////////////// 69 70 SdrViewIter::SdrViewIter(const SdrObject* pObject, sal_Bool bNoMasterPage) 71 { 72 mpObject = pObject; 73 mpModel = (pObject) ? pObject->GetModel() : 0L; 74 mpPage = (pObject) ? pObject->GetPage() : 0L; 75 mbNoMasterPage = bNoMasterPage; 76 77 if(!mpModel || !mpPage) 78 { 79 mpModel = 0L; 80 mpPage = 0L; 81 } 82 83 ImpInitVars(); 84 } 85 86 //////////////////////////////////////////////////////////////////////////////////////////////////// 87 88 sal_Bool SdrViewIter::ImpCheckPageView(SdrPageView* pPV) const 89 { 90 if(mpPage) 91 { 92 sal_Bool bMaster(mpPage->IsMasterPage()); 93 SdrPage* pPg = pPV->GetPage(); 94 95 if(pPg == mpPage) 96 { 97 if(mpObject) 98 { 99 // Objekt gewuenscht? Na dann erstmal sehen, ob 100 // das Obj in dieser PageView auch sichtbar ist. 101 SetOfByte aObjLay; 102 mpObject->getMergedHierarchyLayerSet(aObjLay); 103 aObjLay &= pPV->GetVisibleLayers(); 104 return !aObjLay.IsEmpty(); 105 } 106 else 107 { 108 return sal_True; 109 } 110 } 111 else 112 { 113 if(!mbNoMasterPage && bMaster && (!mpObject || !mpObject->IsNotVisibleAsMaster())) 114 { 115 if(pPg->TRG_HasMasterPage()) 116 { 117 SdrPage& rMasterPage = pPg->TRG_GetMasterPage(); 118 119 if(&rMasterPage == mpPage) 120 { 121 // Aha, die gewuenschte Page ist also MasterPage in dieser PageView 122 if(mpObject) 123 { 124 // Objekt gewuenscht? Na dann erstmal sehen, ob 125 // das Obj in dieser PageView auch sichtbar ist. 126 SetOfByte aObjLay; 127 mpObject->getMergedHierarchyLayerSet(aObjLay); 128 aObjLay &= pPV->GetVisibleLayers(); 129 aObjLay &= pPg->TRG_GetMasterPageVisibleLayers(); 130 131 if(!aObjLay.IsEmpty()) 132 { 133 return sal_True; 134 } // ansonsten die naechste MasterPage der Page ansehen... 135 } 136 else 137 { 138 return sal_True; 139 } 140 } 141 } 142 } 143 144 // MasterPage nicht erlaubt oder keine passende gefunden 145 return sal_False; 146 } 147 } 148 else 149 { 150 return sal_True; 151 } 152 } 153 154 //////////////////////////////////////////////////////////////////////////////////////////////////// 155 156 SdrView* SdrViewIter::ImpFindView() 157 { 158 if(mpModel) 159 { 160 sal_uInt32 nLsAnz(mpModel->GetListenerCount()); 161 162 while(mnListenerNum < nLsAnz) 163 { 164 SfxListener* pLs = mpModel->GetListener((sal_uInt16)mnListenerNum); 165 mpAktView = PTR_CAST(SdrView, pLs); 166 167 if(mpAktView) 168 { 169 if(mpPage) 170 { 171 SdrPageView* pPV = mpAktView->GetSdrPageView(); 172 173 if(pPV) 174 { 175 if(ImpCheckPageView(pPV)) 176 { 177 return mpAktView; 178 } 179 } 180 } 181 else 182 { 183 return mpAktView; 184 } 185 } 186 187 mnListenerNum++; 188 } 189 } 190 191 mpAktView = 0L; 192 return mpAktView; 193 } 194 195 //////////////////////////////////////////////////////////////////////////////////////////////////// 196 197 SdrPageView* SdrViewIter::ImpFindPageView() 198 { 199 if(mpModel) 200 { 201 while(mpAktView) 202 { 203 SdrPageView* pPV = mpAktView->GetSdrPageView(); 204 205 if(pPV) 206 { 207 if(mpPage) 208 { 209 if(ImpCheckPageView(pPV)) 210 { 211 return pPV; 212 } 213 } 214 else 215 { 216 return pPV; 217 } 218 219 mnPageViewNum++; 220 } 221 222 mnListenerNum++; 223 ImpFindView(); 224 } 225 } 226 227 return 0L; 228 } 229 230 //////////////////////////////////////////////////////////////////////////////////////////////////// 231 232 OutputDevice* SdrViewIter::ImpFindOutDev() 233 { 234 while(mpAktView) 235 { 236 const sal_uInt32 nOutDevAnz(mpAktView->PaintWindowCount()); 237 238 if(mnOutDevNum < nOutDevAnz) 239 { 240 SdrPaintWindow* pPaintWindow = mpAktView->GetPaintWindow(mnOutDevNum); 241 return &pPaintWindow->GetOutputDevice(); 242 } 243 244 mnListenerNum++; 245 ImpFindView(); 246 } 247 248 return 0L; 249 } 250 251 //////////////////////////////////////////////////////////////////////////////////////////////////// 252 253 Window* SdrViewIter::ImpFindWindow() 254 { 255 while(mpAktView) 256 { 257 const sal_uInt32 nOutDevAnz(mpAktView->PaintWindowCount()); 258 259 while(mnOutDevNum < nOutDevAnz) 260 { 261 SdrPaintWindow* pPaintWindow = mpAktView->GetPaintWindow(mnOutDevNum); 262 OutputDevice& rOutDev = pPaintWindow->GetOutputDevice(); 263 264 if(OUTDEV_WINDOW == rOutDev.GetOutDevType()) 265 { 266 return (Window*)(&rOutDev); 267 } 268 269 mnOutDevNum++; 270 } 271 272 mnListenerNum++; 273 ImpFindView(); 274 } 275 276 return 0L; 277 } 278 279 //////////////////////////////////////////////////////////////////////////////////////////////////// 280 281 SdrView* SdrViewIter::FirstView() 282 { 283 ImpInitVars(); 284 return ImpFindView(); 285 } 286 287 //////////////////////////////////////////////////////////////////////////////////////////////////// 288 289 SdrView* SdrViewIter::NextView() 290 { 291 mnListenerNum++; 292 return ImpFindView(); 293 } 294 295 //////////////////////////////////////////////////////////////////////////////////////////////////// 296 297 SdrPageView* SdrViewIter::FirstPageView() 298 { 299 ImpInitVars(); 300 ImpFindView(); 301 return ImpFindPageView(); 302 } 303 304 //////////////////////////////////////////////////////////////////////////////////////////////////// 305 306 SdrPageView* SdrViewIter::NextPageView() 307 { 308 mnPageViewNum++; 309 return ImpFindPageView(); 310 } 311 312 //////////////////////////////////////////////////////////////////////////////////////////////////// 313 314 OutputDevice* SdrViewIter::FirstOutDev() 315 { 316 ImpInitVars(); 317 ImpFindView(); 318 return ImpFindOutDev(); 319 } 320 321 //////////////////////////////////////////////////////////////////////////////////////////////////// 322 323 OutputDevice* SdrViewIter::NextOutDev() 324 { 325 mnOutDevNum++; 326 return ImpFindOutDev(); 327 } 328 329 //////////////////////////////////////////////////////////////////////////////////////////////////// 330 331 Window* SdrViewIter::FirstWindow() 332 { 333 ImpInitVars(); 334 ImpFindView(); 335 return ImpFindWindow(); 336 } 337 338 //////////////////////////////////////////////////////////////////////////////////////////////////// 339 340 Window* SdrViewIter::NextWindow() 341 { 342 mnOutDevNum++; 343 return ImpFindWindow(); 344 } 345 346 //////////////////////////////////////////////////////////////////////////////////////////////////// 347 348