xref: /aoo42x/main/svx/source/svdraw/svdviter.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svx.hxx"
30 
31 #include "svx/svdviter.hxx"
32 #include <svx/svdobj.hxx>
33 #include <svx/svdpage.hxx>
34 #include <svx/svdmodel.hxx>
35 #include <svx/svdview.hxx>
36 #include <svx/svdpagv.hxx>
37 #include <svx/svdsob.hxx>
38 #include <svl/brdcst.hxx>
39 #include <svx/sdrpaintwindow.hxx>
40 
41 ////////////////////////////////////////////////////////////////////////////////////////////////////
42 
43 void SdrViewIter::ImpInitVars()
44 {
45 	mnListenerNum = 0L;
46 	mnPageViewNum = 0L;
47 	mnOutDevNum = 0L;
48 	mpAktView = 0L;
49 }
50 
51 ////////////////////////////////////////////////////////////////////////////////////////////////////
52 
53 SdrViewIter::SdrViewIter(const SdrModel* pModel)
54 {
55 	mpModel = pModel;
56 	mpPage = 0L;
57 	mpObject = 0L;
58 	ImpInitVars();
59 }
60 
61 ////////////////////////////////////////////////////////////////////////////////////////////////////
62 
63 SdrViewIter::SdrViewIter(const SdrPage* pPage, sal_Bool bNoMasterPage)
64 {
65 	mpPage = pPage;
66 	mpModel = (pPage) ? pPage->GetModel() : 0L;
67 	mpObject = 0L;
68 	mbNoMasterPage = bNoMasterPage;
69 	ImpInitVars();
70 }
71 
72 ////////////////////////////////////////////////////////////////////////////////////////////////////
73 
74 SdrViewIter::SdrViewIter(const SdrObject* pObject, sal_Bool bNoMasterPage)
75 {
76 	mpObject = pObject;
77 	mpModel = (pObject) ? pObject->GetModel() : 0L;
78 	mpPage = (pObject) ? pObject->GetPage() : 0L;
79 	mbNoMasterPage = bNoMasterPage;
80 
81 	if(!mpModel || !mpPage)
82 	{
83 		mpModel = 0L;
84 		mpPage = 0L;
85 	}
86 
87 	ImpInitVars();
88 }
89 
90 ////////////////////////////////////////////////////////////////////////////////////////////////////
91 
92 sal_Bool SdrViewIter::ImpCheckPageView(SdrPageView* pPV) const
93 {
94 	if(mpPage)
95 	{
96 		sal_Bool bMaster(mpPage->IsMasterPage());
97 		SdrPage* pPg = pPV->GetPage();
98 
99 		if(pPg == mpPage)
100 		{
101 			if(mpObject)
102 			{
103 				// Objekt gewuenscht? Na dann erstmal sehen, ob
104 				// das Obj in dieser PageView auch sichtbar ist.
105 				SetOfByte aObjLay;
106 				mpObject->getMergedHierarchyLayerSet(aObjLay);
107 				aObjLay &= pPV->GetVisibleLayers();
108 				return !aObjLay.IsEmpty();
109 			}
110 			else
111 			{
112 				return sal_True;
113 			}
114 		}
115 		else
116 		{
117 			if(!mbNoMasterPage && bMaster && (!mpObject || !mpObject->IsNotVisibleAsMaster()))
118 			{
119 				if(pPg->TRG_HasMasterPage())
120 				{
121 					SdrPage& rMasterPage = pPg->TRG_GetMasterPage();
122 
123 					if(&rMasterPage == mpPage)
124 					{
125 						// Aha, die gewuenschte Page ist also MasterPage in dieser PageView
126 						if(mpObject)
127 						{
128 							// Objekt gewuenscht? Na dann erstmal sehen, ob
129 							// das Obj in dieser PageView auch sichtbar ist.
130 							SetOfByte aObjLay;
131 							mpObject->getMergedHierarchyLayerSet(aObjLay);
132 							aObjLay &= pPV->GetVisibleLayers();
133 							aObjLay &= pPg->TRG_GetMasterPageVisibleLayers();
134 
135 							if(!aObjLay.IsEmpty())
136 							{
137 								return sal_True;
138 							} // ansonsten die naechste MasterPage der Page ansehen...
139 						}
140 						else
141 						{
142 							return sal_True;
143 						}
144 					}
145 				}
146 			}
147 
148 			// MasterPage nicht erlaubt oder keine passende gefunden
149 			return sal_False;
150 		}
151 	}
152 	else
153 	{
154 		return sal_True;
155 	}
156 }
157 
158 ////////////////////////////////////////////////////////////////////////////////////////////////////
159 
160 SdrView* SdrViewIter::ImpFindView()
161 {
162 	if(mpModel)
163 	{
164 		sal_uInt32 nLsAnz(mpModel->GetListenerCount());
165 
166 		while(mnListenerNum < nLsAnz)
167 		{
168 			SfxListener* pLs = mpModel->GetListener((sal_uInt16)mnListenerNum);
169 			mpAktView = PTR_CAST(SdrView, pLs);
170 
171 			if(mpAktView)
172 			{
173 				if(mpPage)
174 				{
175 					SdrPageView* pPV = mpAktView->GetSdrPageView();
176 
177 					if(pPV)
178 					{
179 						if(ImpCheckPageView(pPV))
180 						{
181 							return mpAktView;
182 						}
183 					}
184 				}
185 				else
186 				{
187 					return mpAktView;
188 				}
189 			}
190 
191 			mnListenerNum++;
192 		}
193 	}
194 
195 	mpAktView = 0L;
196 	return mpAktView;
197 }
198 
199 ////////////////////////////////////////////////////////////////////////////////////////////////////
200 
201 SdrPageView* SdrViewIter::ImpFindPageView()
202 {
203 	if(mpModel)
204 	{
205 		while(mpAktView)
206 		{
207 			SdrPageView* pPV = mpAktView->GetSdrPageView();
208 
209 			if(pPV)
210 			{
211 				if(mpPage)
212 				{
213 					if(ImpCheckPageView(pPV))
214 					{
215 						return pPV;
216 					}
217 				}
218 				else
219 				{
220 					return pPV;
221 				}
222 
223 				mnPageViewNum++;
224 			}
225 
226 			mnListenerNum++;
227 			ImpFindView();
228 		}
229 	}
230 
231 	return 0L;
232 }
233 
234 ////////////////////////////////////////////////////////////////////////////////////////////////////
235 
236 OutputDevice* SdrViewIter::ImpFindOutDev()
237 {
238 	while(mpAktView)
239 	{
240 		const sal_uInt32 nOutDevAnz(mpAktView->PaintWindowCount());
241 
242 		if(mnOutDevNum < nOutDevAnz)
243 		{
244 			SdrPaintWindow* pPaintWindow = mpAktView->GetPaintWindow(mnOutDevNum);
245 			return &pPaintWindow->GetOutputDevice();
246 		}
247 
248 		mnListenerNum++;
249 		ImpFindView();
250 	}
251 
252 	return 0L;
253 }
254 
255 ////////////////////////////////////////////////////////////////////////////////////////////////////
256 
257 Window* SdrViewIter::ImpFindWindow()
258 {
259 	while(mpAktView)
260 	{
261 		const sal_uInt32 nOutDevAnz(mpAktView->PaintWindowCount());
262 
263 		while(mnOutDevNum < nOutDevAnz)
264 		{
265 			SdrPaintWindow* pPaintWindow = mpAktView->GetPaintWindow(mnOutDevNum);
266 			OutputDevice& rOutDev = pPaintWindow->GetOutputDevice();
267 
268 			if(OUTDEV_WINDOW == rOutDev.GetOutDevType())
269 			{
270 				return (Window*)(&rOutDev);
271 			}
272 
273 			mnOutDevNum++;
274 		}
275 
276 		mnListenerNum++;
277 		ImpFindView();
278 	}
279 
280 	return 0L;
281 }
282 
283 ////////////////////////////////////////////////////////////////////////////////////////////////////
284 
285 SdrView* SdrViewIter::FirstView()
286 {
287 	ImpInitVars();
288 	return ImpFindView();
289 }
290 
291 ////////////////////////////////////////////////////////////////////////////////////////////////////
292 
293 SdrView* SdrViewIter::NextView()
294 {
295 	mnListenerNum++;
296 	return ImpFindView();
297 }
298 
299 ////////////////////////////////////////////////////////////////////////////////////////////////////
300 
301 SdrPageView* SdrViewIter::FirstPageView()
302 {
303 	ImpInitVars();
304 	ImpFindView();
305 	return ImpFindPageView();
306 }
307 
308 ////////////////////////////////////////////////////////////////////////////////////////////////////
309 
310 SdrPageView* SdrViewIter::NextPageView()
311 {
312 	mnPageViewNum++;
313 	return ImpFindPageView();
314 }
315 
316 ////////////////////////////////////////////////////////////////////////////////////////////////////
317 
318 OutputDevice* SdrViewIter::FirstOutDev()
319 {
320 	ImpInitVars();
321 	ImpFindView();
322 	return ImpFindOutDev();
323 }
324 
325 ////////////////////////////////////////////////////////////////////////////////////////////////////
326 
327 OutputDevice* SdrViewIter::NextOutDev()
328 {
329 	mnOutDevNum++;
330 	return ImpFindOutDev();
331 }
332 
333 ////////////////////////////////////////////////////////////////////////////////////////////////////
334 
335 Window* SdrViewIter::FirstWindow()
336 {
337 	ImpInitVars();
338 	ImpFindView();
339 	return ImpFindWindow();
340 }
341 
342 ////////////////////////////////////////////////////////////////////////////////////////////////////
343 
344 Window* SdrViewIter::NextWindow()
345 {
346 	mnOutDevNum++;
347 	return ImpFindWindow();
348 }
349 
350 ////////////////////////////////////////////////////////////////////////////////////////////////////
351 
352