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 #include <svx/sdr/contact/viewcontactofsdrpage.hxx>
27 #include <svx/sdr/contact/viewobjectcontact.hxx>
28 #include <svx/svdpage.hxx>
29 #include <svx/sdr/contact/displayinfo.hxx>
30 #include <svx/sdr/contact/viewobjectcontactofsdrpage.hxx>
31 #include <basegfx/polygon/b2dpolygontools.hxx>
32 #include <basegfx/matrix/b2dhommatrix.hxx>
33 #include <svx/svdpagv.hxx>
34 #include <svx/svdview.hxx>
35 #include <vcl/svapp.hxx>
36 #include <svx/sdr/contact/objectcontact.hxx>
37 #include <drawinglayer/primitive2d/backgroundcolorprimitive2d.hxx>
38 #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
39 #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
40 #include <basegfx/polygon/b2dpolygon.hxx>
41 #include <svx/sdr/primitive2d/sdrattributecreator.hxx>
42 #include <svx/sdr/primitive2d/sdrdecompositiontools.hxx>
43 #include <vcl/lazydelete.hxx>
44 #include <svx/svdstr.hrc>
45 #include <svx/svdglob.hxx>
46 #include <drawinglayer/primitive2d/discreteshadowprimitive2d.hxx>
47 #include <drawinglayer/attribute/sdrfillattribute.hxx>
48 
49 //////////////////////////////////////////////////////////////////////////////
50 
51 #define PAPER_SHADOW(SIZE) (SIZE >> 8)
52 
53 //////////////////////////////////////////////////////////////////////////////
54 
55 namespace sdr
56 {
57 	namespace contact
58 	{
ViewContactOfPageSubObject(ViewContactOfSdrPage & rParentViewContactOfSdrPage)59 		ViewContactOfPageSubObject::ViewContactOfPageSubObject(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
60 		:	mrParentViewContactOfSdrPage(rParentViewContactOfSdrPage)
61 		{
62 		}
63 
~ViewContactOfPageSubObject()64 		ViewContactOfPageSubObject::~ViewContactOfPageSubObject()
65 		{
66 		}
67 
GetParentContact() const68 		ViewContact* ViewContactOfPageSubObject::GetParentContact() const
69 		{
70 			return &mrParentViewContactOfSdrPage;
71 		}
72 
getPage() const73 		const SdrPage& ViewContactOfPageSubObject::getPage() const
74 		{
75 			return mrParentViewContactOfSdrPage.GetSdrPage();
76 		}
77 	} // end of namespace contact
78 } // end of namespace sdr
79 
80 //////////////////////////////////////////////////////////////////////////////
81 
82 namespace sdr
83 {
84 	namespace contact
85 	{
CreateObjectSpecificViewObjectContact(ObjectContact & rObjectContact)86 		ViewObjectContact& ViewContactOfPageBackground::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
87 		{
88 			ViewObjectContact* pRetval = new ViewObjectContactOfPageBackground(rObjectContact, *this);
89 			DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
90 
91 			return *pRetval;
92 		}
93 
createViewIndependentPrimitive2DSequence() const94 		drawinglayer::primitive2d::Primitive2DSequence ViewContactOfPageBackground::createViewIndependentPrimitive2DSequence() const
95 		{
96 			// We have only the page information, not the view information. Use the
97 			// svtools::DOCCOLOR color for initialisation
98 			const svtools::ColorConfig aColorConfig;
99 			const Color aInitColor(aColorConfig.GetColorValue(svtools::DOCCOLOR).nColor);
100 			const basegfx::BColor aRGBColor(aInitColor.getBColor());
101 			const drawinglayer::primitive2d::Primitive2DReference xReference(
102                 new drawinglayer::primitive2d::BackgroundColorPrimitive2D(aRGBColor));
103 
104             return drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1);
105 		}
106 
ViewContactOfPageBackground(ViewContactOfSdrPage & rParentViewContactOfSdrPage)107 		ViewContactOfPageBackground::ViewContactOfPageBackground(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
108 		:	ViewContactOfPageSubObject(rParentViewContactOfSdrPage)
109 		{
110 		}
111 
~ViewContactOfPageBackground()112 		ViewContactOfPageBackground::~ViewContactOfPageBackground()
113 		{
114 		}
115 	} // end of namespace contact
116 } // end of namespace sdr
117 
118 //////////////////////////////////////////////////////////////////////////////
119 
120 namespace sdr
121 {
122 	namespace contact
123 	{
CreateObjectSpecificViewObjectContact(ObjectContact & rObjectContact)124 		ViewObjectContact& ViewContactOfPageShadow::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
125 		{
126 			ViewObjectContact* pRetval = new ViewObjectContactOfPageShadow(rObjectContact, *this);
127 			DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
128 
129 			return *pRetval;
130 		}
131 
createViewIndependentPrimitive2DSequence() const132 		drawinglayer::primitive2d::Primitive2DSequence ViewContactOfPageShadow::createViewIndependentPrimitive2DSequence() const
133 		{
134             static bool bUseOldPageShadow(false);
135 		    const SdrPage& rPage = getPage();
136 		    basegfx::B2DHomMatrix aPageMatrix;
137 		    aPageMatrix.set(0, 0, (double)rPage.GetWdt());
138 		    aPageMatrix.set(1, 1, (double)rPage.GetHgt());
139 
140             if(bUseOldPageShadow)
141             {
142 			    // create page shadow polygon
143 			    const double fPageBorderFactor(1.0 / 256.0);
144 			    basegfx::B2DPolygon aPageShadowPolygon;
145 			    aPageShadowPolygon.append(basegfx::B2DPoint(1.0, fPageBorderFactor));
146 			    aPageShadowPolygon.append(basegfx::B2DPoint(1.0 + fPageBorderFactor, fPageBorderFactor));
147 			    aPageShadowPolygon.append(basegfx::B2DPoint(1.0 + fPageBorderFactor, 1.0 + fPageBorderFactor));
148 			    aPageShadowPolygon.append(basegfx::B2DPoint(fPageBorderFactor, 1.0 + fPageBorderFactor));
149 			    aPageShadowPolygon.append(basegfx::B2DPoint(fPageBorderFactor, 1.0));
150 			    aPageShadowPolygon.append(basegfx::B2DPoint(1.0, 1.0));
151 			    aPageShadowPolygon.setClosed(true);
152 			    aPageShadowPolygon.transform(aPageMatrix);
153 
154 			    // We have only the page information, not the view information. Use the
155 			    // svtools::FONTCOLOR color for initialisation
156 			    const svtools::ColorConfig aColorConfig;
157 			    const Color aShadowColor(aColorConfig.GetColorValue(svtools::FONTCOLOR).nColor);
158 			    const basegfx::BColor aRGBShadowColor(aShadowColor.getBColor());
159 			    const drawinglayer::primitive2d::Primitive2DReference xReference(
160                     new drawinglayer::primitive2d::PolyPolygonColorPrimitive2D(
161                         basegfx::B2DPolyPolygon(aPageShadowPolygon),
162                         aRGBShadowColor));
163 
164                 return drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1);
165             }
166             else
167             {
168                 static vcl::DeleteOnDeinit< drawinglayer::primitive2d::DiscreteShadow > aDiscreteShadow(
169                     new drawinglayer::primitive2d::DiscreteShadow(
170                         BitmapEx(
171                             ResId(
172                                 SIP_SA_PAGESHADOW35X35,
173                                 *ImpGetResMgr()))));
174 
175                 if(aDiscreteShadow.get())
176                 {
177                     const drawinglayer::primitive2d::Primitive2DReference xReference(
178                         new drawinglayer::primitive2d::DiscreteShadowPrimitive2D(
179                             aPageMatrix,
180                             *aDiscreteShadow.get()));
181 
182                     return drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1);
183                 }
184 
185                 return drawinglayer::primitive2d::Primitive2DSequence();
186             }
187 		}
188 
ViewContactOfPageShadow(ViewContactOfSdrPage & rParentViewContactOfSdrPage)189 		ViewContactOfPageShadow::ViewContactOfPageShadow(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
190 		:	ViewContactOfPageSubObject(rParentViewContactOfSdrPage)
191 		{
192 		}
193 
~ViewContactOfPageShadow()194 		ViewContactOfPageShadow::~ViewContactOfPageShadow()
195 		{
196 		}
197 	} // end of namespace contact
198 } // end of namespace sdr
199 
200 //////////////////////////////////////////////////////////////////////////////
201 
202 namespace sdr
203 {
204 	namespace contact
205 	{
CreateObjectSpecificViewObjectContact(ObjectContact & rObjectContact)206 		ViewObjectContact& ViewContactOfMasterPage::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
207 		{
208 			ViewObjectContact* pRetval = new ViewObjectContactOfMasterPage(rObjectContact, *this);
209 			DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
210 
211 			return *pRetval;
212 		}
213 
createViewIndependentPrimitive2DSequence() const214 		drawinglayer::primitive2d::Primitive2DSequence ViewContactOfMasterPage::createViewIndependentPrimitive2DSequence() const
215 		{
216 			drawinglayer::primitive2d::Primitive2DSequence xRetval;
217 
218 			// this class is used when the page is a MasterPage and is responsible to
219 			// create a visualisation for the MPBGO, if exists. This needs to be suppressed
220 			// when a SdrPage which uses a MasterPage creates it's output. Suppression
221 			// is done in the corresponding VOC since DisplayInfo data is needed
222 			const SdrPage& rPage = getPage();
223 
224 			if(rPage.IsMasterPage())
225 			{
226                 if(0 == rPage.GetPageNum())
227                 {
228                     // #i98063#
229                     // filter MasterPage 0 since it's the HandoutPage. Thus, it's a
230                     // MasterPage, but has no MPBGO, so there is nothing to do here.
231                 }
232                 else
233                 {
234                     drawinglayer::attribute::SdrFillAttribute aFill;
235 
236                     // #i110846# Suppress SdrPage FillStyle for MasterPages without StyleSheets,
237                     // else the PoolDefault (XFILL_COLOR and Blue8) will be used. Normally, all
238                     // MasterPages should have a StyleSheet excactly for this reason, but historically
239                     // e.g. the Notes MasterPage has no StyleSheet set (and there maybe others).
240                     if(rPage.getSdrPageProperties().GetStyleSheet())
241                     {
242                         // create page fill attributes with correct properties
243 				        aFill = drawinglayer::primitive2d::createNewSdrFillAttribute(
244                             rPage.getSdrPageProperties().GetItemSet());
245                     }
246 
247 				    if(!aFill.isDefault())
248 				    {
249 					    // direct model data is the page size, get and use it
250 					    const basegfx::B2DRange aInnerRange(
251 						    rPage.GetLftBorder(), rPage.GetUppBorder(),
252 						    rPage.GetWdt() - rPage.GetRgtBorder(), rPage.GetHgt() - rPage.GetLwrBorder());
253 					    const basegfx::B2DPolygon aInnerPolgon(basegfx::tools::createPolygonFromRect(aInnerRange));
254 					    const basegfx::B2DHomMatrix aEmptyTransform;
255 					    const drawinglayer::primitive2d::Primitive2DReference xReference(
256 							drawinglayer::primitive2d::createPolyPolygonFillPrimitive(
257 								basegfx::B2DPolyPolygon(aInnerPolgon),
258 								aEmptyTransform,
259 								aFill,
260 								drawinglayer::attribute::FillGradientAttribute()));
261 
262 					    xRetval = drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1);
263 				    }
264                 }
265 			}
266 
267 			return xRetval;
268 		}
269 
ViewContactOfMasterPage(ViewContactOfSdrPage & rParentViewContactOfSdrPage)270 		ViewContactOfMasterPage::ViewContactOfMasterPage(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
271 		:	ViewContactOfPageSubObject(rParentViewContactOfSdrPage)
272 		{
273 		}
274 
~ViewContactOfMasterPage()275 		ViewContactOfMasterPage::~ViewContactOfMasterPage()
276 		{
277 		}
278 	} // end of namespace contact
279 } // end of namespace sdr
280 
281 //////////////////////////////////////////////////////////////////////////////
282 
283 namespace sdr
284 {
285 	namespace contact
286 	{
CreateObjectSpecificViewObjectContact(ObjectContact & rObjectContact)287 		ViewObjectContact& ViewContactOfPageFill::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
288 		{
289 			ViewObjectContact* pRetval = new ViewObjectContactOfPageFill(rObjectContact, *this);
290 			DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
291 
292 			return *pRetval;
293 		}
294 
createViewIndependentPrimitive2DSequence() const295 		drawinglayer::primitive2d::Primitive2DSequence ViewContactOfPageFill::createViewIndependentPrimitive2DSequence() const
296 		{
297 			const SdrPage& rPage = getPage();
298 			const basegfx::B2DRange aPageFillRange(0.0, 0.0, (double)rPage.GetWdt(), (double)rPage.GetHgt());
299 			const basegfx::B2DPolygon aPageFillPolygon(basegfx::tools::createPolygonFromRect(aPageFillRange));
300 
301 			// We have only the page information, not the view information. Use the
302 			// svtools::DOCCOLOR color for initialisation
303 			const svtools::ColorConfig aColorConfig;
304 			const Color aPageFillColor(aColorConfig.GetColorValue(svtools::DOCCOLOR).nColor);
305 
306 			// create and add primitive
307 			const basegfx::BColor aRGBColor(aPageFillColor.getBColor());
308 			const drawinglayer::primitive2d::Primitive2DReference xReference(new drawinglayer::primitive2d::PolyPolygonColorPrimitive2D(basegfx::B2DPolyPolygon(aPageFillPolygon), aRGBColor));
309 
310             return drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1);
311 		}
312 
ViewContactOfPageFill(ViewContactOfSdrPage & rParentViewContactOfSdrPage)313 		ViewContactOfPageFill::ViewContactOfPageFill(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
314 		:	ViewContactOfPageSubObject(rParentViewContactOfSdrPage)
315 		{
316 		}
317 
~ViewContactOfPageFill()318 		ViewContactOfPageFill::~ViewContactOfPageFill()
319 		{
320 		}
321 	} // end of namespace contact
322 } // end of namespace sdr
323 
324 //////////////////////////////////////////////////////////////////////////////
325 
326 namespace sdr
327 {
328 	namespace contact
329 	{
CreateObjectSpecificViewObjectContact(ObjectContact & rObjectContact)330 		ViewObjectContact& ViewContactOfOuterPageBorder::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
331 		{
332 			ViewObjectContact* pRetval = new ViewObjectContactOfOuterPageBorder(rObjectContact, *this);
333 			DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
334 
335 			return *pRetval;
336 		}
337 
createViewIndependentPrimitive2DSequence() const338 		drawinglayer::primitive2d::Primitive2DSequence ViewContactOfOuterPageBorder::createViewIndependentPrimitive2DSequence() const
339 		{
340             drawinglayer::primitive2d::Primitive2DSequence xRetval;
341 			const SdrPage& rPage = getPage();
342 			const basegfx::B2DRange aPageBorderRange(0.0, 0.0, (double)rPage.GetWdt(), (double)rPage.GetHgt());
343 
344             // Changed to 0x949599 for renaissance, before svtools::FONTCOLOR was used.
345             // Added old case as fallback for HighContrast.
346 			basegfx::BColor aRGBBorderColor(0x94 / (double)0xff, 0x95 / (double)0xff, 0x99 / (double)0xff);
347 
348 			if(Application::GetSettings().GetStyleSettings().GetHighContrastMode())
349 			{
350     			const svtools::ColorConfig aColorConfig;
351 				const Color aBorderColor(aColorConfig.GetColorValue(svtools::FONTCOLOR).nColor);
352 
353                 aRGBBorderColor = aBorderColor.getBColor();
354 			}
355 
356             if(rPage.getPageBorderOnlyLeftRight())
357             {
358                 // #i93597# for Report Designer, the page border shall be only displayed right and left,
359                 // but not top and bottom. Create simplified geometry.
360                 basegfx::B2DPolygon aLeft, aRight;
361 
362                 aLeft.append(basegfx::B2DPoint(aPageBorderRange.getMinX(), aPageBorderRange.getMinY()));
363                 aLeft.append(basegfx::B2DPoint(aPageBorderRange.getMinX(), aPageBorderRange.getMaxY()));
364 
365                 aRight.append(basegfx::B2DPoint(aPageBorderRange.getMaxX(), aPageBorderRange.getMinY()));
366                 aRight.append(basegfx::B2DPoint(aPageBorderRange.getMaxX(), aPageBorderRange.getMaxY()));
367 
368                 xRetval.realloc(2);
369                 xRetval[0] = drawinglayer::primitive2d::Primitive2DReference(new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aLeft, aRGBBorderColor));
370                 xRetval[1] = drawinglayer::primitive2d::Primitive2DReference(new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aRight, aRGBBorderColor));
371             }
372             else
373             {
374                 xRetval.realloc(1);
375                 const basegfx::B2DPolygon aPageBorderPolygon(basegfx::tools::createPolygonFromRect(aPageBorderRange));
376                 xRetval[0] = drawinglayer::primitive2d::Primitive2DReference(new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aPageBorderPolygon, aRGBBorderColor));
377             }
378 
379             return xRetval;
380 		}
381 
ViewContactOfOuterPageBorder(ViewContactOfSdrPage & rParentViewContactOfSdrPage)382 		ViewContactOfOuterPageBorder::ViewContactOfOuterPageBorder(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
383 		:	ViewContactOfPageSubObject(rParentViewContactOfSdrPage)
384 		{
385 		}
386 
~ViewContactOfOuterPageBorder()387 		ViewContactOfOuterPageBorder::~ViewContactOfOuterPageBorder()
388 		{
389 		}
390 	} // end of namespace contact
391 } // end of namespace sdr
392 
393 //////////////////////////////////////////////////////////////////////////////
394 
395 namespace sdr
396 {
397 	namespace contact
398 	{
CreateObjectSpecificViewObjectContact(ObjectContact & rObjectContact)399 		ViewObjectContact& ViewContactOfInnerPageBorder::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
400 		{
401 			ViewObjectContact* pRetval = new ViewObjectContactOfInnerPageBorder(rObjectContact, *this);
402 			DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
403 
404 			return *pRetval;
405 		}
406 
createViewIndependentPrimitive2DSequence() const407 		drawinglayer::primitive2d::Primitive2DSequence ViewContactOfInnerPageBorder::createViewIndependentPrimitive2DSequence() const
408 		{
409 			const SdrPage& rPage = getPage();
410 			const basegfx::B2DRange aPageBorderRange(
411 				(double)rPage.GetLftBorder(), (double)rPage.GetUppBorder(),
412 				(double)(rPage.GetWdt() - rPage.GetRgtBorder()), (double)(rPage.GetHgt() - rPage.GetLwrBorder()));
413 			const basegfx::B2DPolygon aPageBorderPolygon(basegfx::tools::createPolygonFromRect(aPageBorderRange));
414 
415 			// We have only the page information, not the view information. Use the
416 			// svtools::FONTCOLOR or svtools::DOCBOUNDARIES color for initialisation
417 			const svtools::ColorConfig aColorConfig;
418 			Color aBorderColor;
419 
420 			if(Application::GetSettings().GetStyleSettings().GetHighContrastMode())
421 			{
422 				aBorderColor = aColorConfig.GetColorValue(svtools::FONTCOLOR).nColor;
423 			}
424 			else
425 			{
426 				aBorderColor = aColorConfig.GetColorValue(svtools::DOCBOUNDARIES).nColor;
427 			}
428 
429 			// create page outer border primitive
430 			const basegfx::BColor aRGBBorderColor(aBorderColor.getBColor());
431 			const drawinglayer::primitive2d::Primitive2DReference xReference(new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aPageBorderPolygon, aRGBBorderColor));
432 
433             return drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1);
434 		}
435 
ViewContactOfInnerPageBorder(ViewContactOfSdrPage & rParentViewContactOfSdrPage)436 		ViewContactOfInnerPageBorder::ViewContactOfInnerPageBorder(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
437 		:	ViewContactOfPageSubObject(rParentViewContactOfSdrPage)
438 		{
439 		}
440 
~ViewContactOfInnerPageBorder()441 		ViewContactOfInnerPageBorder::~ViewContactOfInnerPageBorder()
442 		{
443 		}
444 	} // end of namespace contact
445 } // end of namespace sdr
446 
447 //////////////////////////////////////////////////////////////////////////////
448 
449 namespace sdr
450 {
451 	namespace contact
452 	{
CreateObjectSpecificViewObjectContact(ObjectContact & rObjectContact)453 		ViewObjectContact& ViewContactOfPageHierarchy::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
454 		{
455 			ViewObjectContact* pRetval = new ViewObjectContactOfPageHierarchy(rObjectContact, *this);
456 			DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
457 
458 			return *pRetval;
459 		}
460 
createViewIndependentPrimitive2DSequence() const461 		drawinglayer::primitive2d::Primitive2DSequence ViewContactOfPageHierarchy::createViewIndependentPrimitive2DSequence() const
462 		{
463 			// collect sub-hierarchy
464 			drawinglayer::primitive2d::Primitive2DSequence xRetval;
465 			const sal_uInt32 nObjectCount(GetObjectCount());
466 
467 			// collect all sub-primitives
468 			for(sal_uInt32 a(0); a < nObjectCount; a++)
469 			{
470 				const ViewContact& rCandidate(GetViewContact(a));
471 				const drawinglayer::primitive2d::Primitive2DSequence aCandSeq(rCandidate.getViewIndependentPrimitive2DSequence());
472 
473 				drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, aCandSeq);
474 			}
475 
476 			return xRetval;
477 		}
478 
ViewContactOfPageHierarchy(ViewContactOfSdrPage & rParentViewContactOfSdrPage)479 		ViewContactOfPageHierarchy::ViewContactOfPageHierarchy(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
480 		:	ViewContactOfPageSubObject(rParentViewContactOfSdrPage)
481 		{
482 		}
483 
~ViewContactOfPageHierarchy()484 		ViewContactOfPageHierarchy::~ViewContactOfPageHierarchy()
485 		{
486 		}
487 
GetObjectCount() const488 		sal_uInt32 ViewContactOfPageHierarchy::GetObjectCount() const
489 		{
490 			return getPage().GetObjCount();
491 		}
492 
GetViewContact(sal_uInt32 nIndex) const493 		ViewContact& ViewContactOfPageHierarchy::GetViewContact(sal_uInt32 nIndex) const
494 		{
495 			SdrObject* pObj = getPage().GetObj(nIndex);
496 			DBG_ASSERT(pObj, "ViewContactOfPageHierarchy::GetViewContact: Corrupt SdrObjList (!)");
497 			return pObj->GetViewContact();
498 		}
499 	} // end of namespace contact
500 } // end of namespace sdr
501 
502 //////////////////////////////////////////////////////////////////////////////
503 
504 namespace sdr
505 {
506 	namespace contact
507 	{
CreateObjectSpecificViewObjectContact(ObjectContact & rObjectContact)508 		ViewObjectContact& ViewContactOfGrid::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
509 		{
510 			ViewObjectContact* pRetval = new ViewObjectContactOfPageGrid(rObjectContact, *this);
511 			DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
512 
513 			return *pRetval;
514 		}
515 
createViewIndependentPrimitive2DSequence() const516 		drawinglayer::primitive2d::Primitive2DSequence ViewContactOfGrid::createViewIndependentPrimitive2DSequence() const
517 		{
518 			// We have only the page information, not the view information and thus no grid settings. Create empty
519 			// default. For the view-dependent implementation, see ViewObjectContactOfPageGrid::createPrimitive2DSequence
520             return drawinglayer::primitive2d::Primitive2DSequence();
521 		}
522 
ViewContactOfGrid(ViewContactOfSdrPage & rParentViewContactOfSdrPage,bool bFront)523 		ViewContactOfGrid::ViewContactOfGrid(ViewContactOfSdrPage& rParentViewContactOfSdrPage, bool bFront)
524 		:	ViewContactOfPageSubObject(rParentViewContactOfSdrPage),
525 			mbFront(bFront)
526 		{
527 		}
528 
~ViewContactOfGrid()529 		ViewContactOfGrid::~ViewContactOfGrid()
530 		{
531 		}
532 	} // end of namespace contact
533 } // end of namespace sdr
534 
535 //////////////////////////////////////////////////////////////////////////////
536 
537 namespace sdr
538 {
539 	namespace contact
540 	{
CreateObjectSpecificViewObjectContact(ObjectContact & rObjectContact)541 		ViewObjectContact& ViewContactOfHelplines::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
542 		{
543 			ViewObjectContact* pRetval = new ViewObjectContactOfPageHelplines(rObjectContact, *this);
544 			DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
545 
546 			return *pRetval;
547 		}
548 
createViewIndependentPrimitive2DSequence() const549 		drawinglayer::primitive2d::Primitive2DSequence ViewContactOfHelplines::createViewIndependentPrimitive2DSequence() const
550 		{
551 			// We have only the page information, not the view information and thus no helplines. Create empty
552 			// default. For the view-dependent implementation, see ViewObjectContactOfPageHelplines::createPrimitive2DSequence
553             return drawinglayer::primitive2d::Primitive2DSequence();
554 		}
555 
ViewContactOfHelplines(ViewContactOfSdrPage & rParentViewContactOfSdrPage,bool bFront)556 		ViewContactOfHelplines::ViewContactOfHelplines(ViewContactOfSdrPage& rParentViewContactOfSdrPage, bool bFront)
557 		:	ViewContactOfPageSubObject(rParentViewContactOfSdrPage),
558 			mbFront(bFront)
559 		{
560 		}
561 
~ViewContactOfHelplines()562 		ViewContactOfHelplines::~ViewContactOfHelplines()
563 		{
564 		}
565 	} // end of namespace contact
566 } // end of namespace sdr
567 
568 //////////////////////////////////////////////////////////////////////////////
569 
570 namespace sdr
571 {
572 	namespace contact
573 	{
574 		// Create a Object-Specific ViewObjectContact, set ViewContact and
575 		// ObjectContact. Always needs to return something.
CreateObjectSpecificViewObjectContact(ObjectContact & rObjectContact)576 		ViewObjectContact& ViewContactOfSdrPage::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
577 		{
578 			ViewObjectContact* pRetval = new ViewObjectContactOfSdrPage(rObjectContact, *this);
579 			DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
580 
581 			return *pRetval;
582 		}
583 
ViewContactOfSdrPage(SdrPage & rPage)584 		ViewContactOfSdrPage::ViewContactOfSdrPage(SdrPage& rPage)
585 		:	ViewContact(),
586 			mrPage(rPage),
587 			maViewContactOfPageBackground(*this),
588 			maViewContactOfPageShadow(*this),
589 			maViewContactOfPageFill(*this),
590 			maViewContactOfMasterPage(*this),
591 			maViewContactOfOuterPageBorder(*this),
592 			maViewContactOfInnerPageBorder(*this),
593 			maViewContactOfGridBack(*this, false),
594 			maViewContactOfHelplinesBack(*this, false),
595 			maViewContactOfPageHierarchy(*this),
596 			maViewContactOfGridFront(*this, true),
597 			maViewContactOfHelplinesFront(*this, true)
598 		{
599 		}
600 
~ViewContactOfSdrPage()601 		ViewContactOfSdrPage::~ViewContactOfSdrPage()
602 		{
603 		}
604 
605 		// Access to possible sub-hierarchy
GetObjectCount() const606 		sal_uInt32 ViewContactOfSdrPage::GetObjectCount() const
607 		{
608 			// Fixed count of content. It contains PageBackground (Wiese), PageShadow, PageFill,
609 			// then - depending on if the page has a MasterPage - either MasterPage Hierarchy
610 			// or MPBGO. Also OuterPageBorder, InnerPageBorder and two pairs of Grid and Helplines
611 			// (for front and back) which internally are visible or not depending on the current
612 			// front/back setting for those.
613 			return 11;
614 		}
615 
GetViewContact(sal_uInt32 nIndex) const616 		ViewContact& ViewContactOfSdrPage::GetViewContact(sal_uInt32 nIndex) const
617 		{
618 			switch(nIndex)
619 			{
620 				case 0: return (ViewContact&)maViewContactOfPageBackground;
621 				case 1: return (ViewContact&)maViewContactOfPageShadow;
622 				case 2: return (ViewContact&)maViewContactOfPageFill;
623 				case 3:
624 				{
625 					const SdrPage& rPage = GetSdrPage();
626 
627 					if(rPage.TRG_HasMasterPage())
628 					{
629 						return rPage.TRG_GetMasterPageDescriptorViewContact();
630 					}
631 					else
632 					{
633 						return (ViewContact&)maViewContactOfMasterPage;
634 					}
635 				}
636 				case 4: return (ViewContact&)maViewContactOfOuterPageBorder;
637 				case 5: return (ViewContact&)maViewContactOfInnerPageBorder;
638 				case 6: return (ViewContact&)maViewContactOfGridBack;
639 				case 7: return (ViewContact&)maViewContactOfHelplinesBack;
640 				case 8: return (ViewContact&)maViewContactOfPageHierarchy;
641 				case 9: return (ViewContact&)maViewContactOfGridFront;
642 				default: return (ViewContact&)maViewContactOfHelplinesFront;
643 			}
644 		}
645 
646 		// React on changes of the object of this ViewContact
ActionChanged()647 		void ViewContactOfSdrPage::ActionChanged()
648 		{
649 			// call parent
650 			ViewContact::ActionChanged();
651 
652 			// apply to local viewContacts, they all rely on page information. Exception
653 			// is the sub hierarchy; this will not be influenced by the change
654 			maViewContactOfPageBackground.ActionChanged();
655 			maViewContactOfPageShadow.ActionChanged();
656 			maViewContactOfPageFill.ActionChanged();
657 
658 			const SdrPage& rPage = GetSdrPage();
659 
660 			if(rPage.TRG_HasMasterPage())
661 			{
662 				rPage.TRG_GetMasterPageDescriptorViewContact().ActionChanged();
663 			}
664 			else if(rPage.IsMasterPage())
665 			{
666 				maViewContactOfMasterPage.ActionChanged();
667 			}
668 
669 			maViewContactOfOuterPageBorder.ActionChanged();
670 			maViewContactOfInnerPageBorder.ActionChanged();
671 			maViewContactOfGridBack.ActionChanged();
672 			maViewContactOfHelplinesBack.ActionChanged();
673 			maViewContactOfGridFront.ActionChanged();
674 			maViewContactOfHelplinesFront.ActionChanged();
675 		}
676 
677 		// overload for acessing the SdrPage
TryToGetSdrPage() const678 		SdrPage* ViewContactOfSdrPage::TryToGetSdrPage() const
679 		{
680 			return &GetSdrPage();
681 		}
682 
createViewIndependentPrimitive2DSequence() const683 		drawinglayer::primitive2d::Primitive2DSequence ViewContactOfSdrPage::createViewIndependentPrimitive2DSequence() const
684 		{
685 			drawinglayer::primitive2d::Primitive2DSequence xRetval;
686 
687 			// collect all sub-sequences including sub hierarchy.
688 			drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfPageBackground.getViewIndependentPrimitive2DSequence());
689 			drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfPageShadow.getViewIndependentPrimitive2DSequence());
690 			drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfPageFill.getViewIndependentPrimitive2DSequence());
691 
692 			const SdrPage& rPage = GetSdrPage();
693 
694 			if(rPage.TRG_HasMasterPage())
695 			{
696 				drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval,
697 					rPage.TRG_GetMasterPageDescriptorViewContact().getViewIndependentPrimitive2DSequence());
698 			}
699 			else if(rPage.IsMasterPage())
700 			{
701 				drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval,
702 					maViewContactOfMasterPage.getViewIndependentPrimitive2DSequence());
703 			}
704 
705 			drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfOuterPageBorder.getViewIndependentPrimitive2DSequence());
706 			drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfInnerPageBorder.getViewIndependentPrimitive2DSequence());
707 			drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfPageHierarchy.getViewIndependentPrimitive2DSequence());
708 
709 			// Only add front versions of grid and helplines since no visibility test is done,
710 			// so adding the back incarnations is not necessary. This makes the Front
711 			// visualisation the default when no visibility tests are done.
712 			//
713 			// Since we have no view here, no grid and helpline definitions are available currently. The used
714 			// methods at ViewContactOfHelplines and ViewContactOfGrid return only empty sequences and
715 			// do not need to be called ATM. This may change later if grid or helpline info gets
716 			// model data (it should not). Keeping the lines commented to hold this hint.
717 			//
718 			// drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfGridFront.getViewIndependentPrimitive2DSequence());
719 			// drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfHelplinesFront.getViewIndependentPrimitive2DSequence());
720 
721 			return xRetval;
722 		}
723 	} // end of namespace contact
724 } // end of namespace sdr
725 
726 //////////////////////////////////////////////////////////////////////////////
727 // eof
728