xref: /trunk/main/svx/source/sdr/contact/viewcontactofsdrpage.cxx (revision c938ccda3ac505248a9f1ba389738d0de385daba)
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     {
59         ViewContactOfPageSubObject::ViewContactOfPageSubObject(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
60         :   mrParentViewContactOfSdrPage(rParentViewContactOfSdrPage)
61         {
62         }
63 
64         ViewContactOfPageSubObject::~ViewContactOfPageSubObject()
65         {
66         }
67 
68         ViewContact* ViewContactOfPageSubObject::GetParentContact() const
69         {
70             return &mrParentViewContactOfSdrPage;
71         }
72 
73         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     {
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 
94         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 initialization
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 
107         ViewContactOfPageBackground::ViewContactOfPageBackground(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
108         :   ViewContactOfPageSubObject(rParentViewContactOfSdrPage)
109         {
110         }
111 
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     {
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 
132         drawinglayer::primitive2d::Primitive2DSequence ViewContactOfPageShadow::createViewIndependentPrimitive2DSequence() const
133         {
134             static bool bUseOldPageShadow(true);
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 initialization
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 
189         ViewContactOfPageShadow::ViewContactOfPageShadow(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
190         :   ViewContactOfPageSubObject(rParentViewContactOfSdrPage)
191         {
192         }
193 
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     {
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 
214         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 visualization for the MPBGO, if exists. This needs to be suppressed
220             // when a SdrPage which uses a MasterPage creates its 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 drawinglayer::primitive2d::Primitive2DReference xReference(
255                             drawinglayer::primitive2d::createPolyPolygonFillPrimitive(
256                                 basegfx::B2DPolyPolygon(aInnerPolgon),
257                                 aFill,
258                                 drawinglayer::attribute::FillGradientAttribute()));
259 
260                         xRetval = drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1);
261                     }
262                 }
263             }
264 
265             return xRetval;
266         }
267 
268         ViewContactOfMasterPage::ViewContactOfMasterPage(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
269         :   ViewContactOfPageSubObject(rParentViewContactOfSdrPage)
270         {
271         }
272 
273         ViewContactOfMasterPage::~ViewContactOfMasterPage()
274         {
275         }
276     } // end of namespace contact
277 } // end of namespace sdr
278 
279 //////////////////////////////////////////////////////////////////////////////
280 
281 namespace sdr
282 {
283     namespace contact
284     {
285         ViewObjectContact& ViewContactOfPageFill::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
286         {
287             ViewObjectContact* pRetval = new ViewObjectContactOfPageFill(rObjectContact, *this);
288             DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
289 
290             return *pRetval;
291         }
292 
293         drawinglayer::primitive2d::Primitive2DSequence ViewContactOfPageFill::createViewIndependentPrimitive2DSequence() const
294         {
295             const SdrPage& rPage = getPage();
296             const basegfx::B2DRange aPageFillRange(0.0, 0.0, (double)rPage.GetWdt(), (double)rPage.GetHgt());
297             const basegfx::B2DPolygon aPageFillPolygon(basegfx::tools::createPolygonFromRect(aPageFillRange));
298 
299             // We have only the page information, not the view information. Use the
300             // svtools::DOCCOLOR color for initialization
301             const svtools::ColorConfig aColorConfig;
302             const Color aPageFillColor(aColorConfig.GetColorValue(svtools::DOCCOLOR).nColor);
303 
304             // create and add primitive
305             const basegfx::BColor aRGBColor(aPageFillColor.getBColor());
306             const drawinglayer::primitive2d::Primitive2DReference xReference(new drawinglayer::primitive2d::PolyPolygonColorPrimitive2D(basegfx::B2DPolyPolygon(aPageFillPolygon), aRGBColor));
307 
308             return drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1);
309         }
310 
311         ViewContactOfPageFill::ViewContactOfPageFill(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
312         :   ViewContactOfPageSubObject(rParentViewContactOfSdrPage)
313         {
314         }
315 
316         ViewContactOfPageFill::~ViewContactOfPageFill()
317         {
318         }
319     } // end of namespace contact
320 } // end of namespace sdr
321 
322 //////////////////////////////////////////////////////////////////////////////
323 
324 namespace sdr
325 {
326     namespace contact
327     {
328         ViewObjectContact& ViewContactOfOuterPageBorder::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
329         {
330             ViewObjectContact* pRetval = new ViewObjectContactOfOuterPageBorder(rObjectContact, *this);
331             DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
332 
333             return *pRetval;
334         }
335 
336         drawinglayer::primitive2d::Primitive2DSequence ViewContactOfOuterPageBorder::createViewIndependentPrimitive2DSequence() const
337         {
338             drawinglayer::primitive2d::Primitive2DSequence xRetval;
339             const SdrPage& rPage = getPage();
340             const basegfx::B2DRange aPageBorderRange(0.0, 0.0, (double)rPage.GetWdt(), (double)rPage.GetHgt());
341 
342             // Changed to 0x000000 as in Writer, before svtools::FONTCOLOR was used.
343             // Added old case as fallback for HighContrast.
344             basegfx::BColor aRGBBorderColor(0x00 / (double)0xff, 0x00 / (double)0xff, 0x00 / (double)0xff);
345 
346             if(Application::GetSettings().GetStyleSettings().GetHighContrastMode())
347             {
348                 const svtools::ColorConfig aColorConfig;
349                 const Color aBorderColor(aColorConfig.GetColorValue(svtools::FONTCOLOR).nColor);
350 
351                 aRGBBorderColor = aBorderColor.getBColor();
352             }
353 
354             if(rPage.getPageBorderOnlyLeftRight())
355             {
356                 // #i93597# for Report Designer, the page border shall be only displayed right and left,
357                 // but not top and bottom. Create simplified geometry.
358                 basegfx::B2DPolygon aLeft, aRight;
359 
360                 aLeft.append(basegfx::B2DPoint(aPageBorderRange.getMinX(), aPageBorderRange.getMinY()));
361                 aLeft.append(basegfx::B2DPoint(aPageBorderRange.getMinX(), aPageBorderRange.getMaxY()));
362 
363                 aRight.append(basegfx::B2DPoint(aPageBorderRange.getMaxX(), aPageBorderRange.getMinY()));
364                 aRight.append(basegfx::B2DPoint(aPageBorderRange.getMaxX(), aPageBorderRange.getMaxY()));
365 
366                 xRetval.realloc(2);
367                 xRetval[0] = drawinglayer::primitive2d::Primitive2DReference(new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aLeft, aRGBBorderColor));
368                 xRetval[1] = drawinglayer::primitive2d::Primitive2DReference(new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aRight, aRGBBorderColor));
369             }
370             else
371             {
372                 xRetval.realloc(1);
373                 const basegfx::B2DPolygon aPageBorderPolygon(basegfx::tools::createPolygonFromRect(aPageBorderRange));
374                 xRetval[0] = drawinglayer::primitive2d::Primitive2DReference(new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aPageBorderPolygon, aRGBBorderColor));
375             }
376 
377             return xRetval;
378         }
379 
380         ViewContactOfOuterPageBorder::ViewContactOfOuterPageBorder(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
381         :   ViewContactOfPageSubObject(rParentViewContactOfSdrPage)
382         {
383         }
384 
385         ViewContactOfOuterPageBorder::~ViewContactOfOuterPageBorder()
386         {
387         }
388     } // end of namespace contact
389 } // end of namespace sdr
390 
391 //////////////////////////////////////////////////////////////////////////////
392 
393 namespace sdr
394 {
395     namespace contact
396     {
397         ViewObjectContact& ViewContactOfInnerPageBorder::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
398         {
399             ViewObjectContact* pRetval = new ViewObjectContactOfInnerPageBorder(rObjectContact, *this);
400             DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
401 
402             return *pRetval;
403         }
404 
405         drawinglayer::primitive2d::Primitive2DSequence ViewContactOfInnerPageBorder::createViewIndependentPrimitive2DSequence() const
406         {
407             const SdrPage& rPage = getPage();
408             const basegfx::B2DRange aPageBorderRange(
409                 (double)rPage.GetLftBorder(), (double)rPage.GetUppBorder(),
410                 (double)(rPage.GetWdt() - rPage.GetRgtBorder()), (double)(rPage.GetHgt() - rPage.GetLwrBorder()));
411             const basegfx::B2DPolygon aPageBorderPolygon(basegfx::tools::createPolygonFromRect(aPageBorderRange));
412 
413             // We have only the page information, not the view information. Use the
414             // svtools::FONTCOLOR or svtools::DOCBOUNDARIES color for initialization
415             const svtools::ColorConfig aColorConfig;
416             Color aBorderColor;
417 
418             if(Application::GetSettings().GetStyleSettings().GetHighContrastMode())
419             {
420                 aBorderColor = aColorConfig.GetColorValue(svtools::FONTCOLOR).nColor;
421             }
422             else
423             {
424                 aBorderColor = aColorConfig.GetColorValue(svtools::DOCBOUNDARIES).nColor;
425             }
426 
427             // create page outer border primitive
428             const basegfx::BColor aRGBBorderColor(aBorderColor.getBColor());
429             const drawinglayer::primitive2d::Primitive2DReference xReference(new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aPageBorderPolygon, aRGBBorderColor));
430 
431             return drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1);
432         }
433 
434         ViewContactOfInnerPageBorder::ViewContactOfInnerPageBorder(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
435         :   ViewContactOfPageSubObject(rParentViewContactOfSdrPage)
436         {
437         }
438 
439         ViewContactOfInnerPageBorder::~ViewContactOfInnerPageBorder()
440         {
441         }
442     } // end of namespace contact
443 } // end of namespace sdr
444 
445 //////////////////////////////////////////////////////////////////////////////
446 
447 namespace sdr
448 {
449     namespace contact
450     {
451         ViewObjectContact& ViewContactOfPageHierarchy::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
452         {
453             ViewObjectContact* pRetval = new ViewObjectContactOfPageHierarchy(rObjectContact, *this);
454             DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
455 
456             return *pRetval;
457         }
458 
459         drawinglayer::primitive2d::Primitive2DSequence ViewContactOfPageHierarchy::createViewIndependentPrimitive2DSequence() const
460         {
461             // collect sub-hierarchy
462             drawinglayer::primitive2d::Primitive2DSequence xRetval;
463             const sal_uInt32 nObjectCount(GetObjectCount());
464 
465             // collect all sub-primitives
466             for(sal_uInt32 a(0); a < nObjectCount; a++)
467             {
468                 const ViewContact& rCandidate(GetViewContact(a));
469                 const drawinglayer::primitive2d::Primitive2DSequence aCandSeq(rCandidate.getViewIndependentPrimitive2DSequence());
470 
471                 drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, aCandSeq);
472             }
473 
474             return xRetval;
475         }
476 
477         ViewContactOfPageHierarchy::ViewContactOfPageHierarchy(ViewContactOfSdrPage& rParentViewContactOfSdrPage)
478         :   ViewContactOfPageSubObject(rParentViewContactOfSdrPage)
479         {
480         }
481 
482         ViewContactOfPageHierarchy::~ViewContactOfPageHierarchy()
483         {
484         }
485 
486         sal_uInt32 ViewContactOfPageHierarchy::GetObjectCount() const
487         {
488             return getPage().GetObjCount();
489         }
490 
491         ViewContact& ViewContactOfPageHierarchy::GetViewContact(sal_uInt32 nIndex) const
492         {
493             SdrObject* pObj = getPage().GetObj(nIndex);
494             DBG_ASSERT(pObj, "ViewContactOfPageHierarchy::GetViewContact: Corrupt SdrObjList (!)");
495             return pObj->GetViewContact();
496         }
497     } // end of namespace contact
498 } // end of namespace sdr
499 
500 //////////////////////////////////////////////////////////////////////////////
501 
502 namespace sdr
503 {
504     namespace contact
505     {
506         ViewObjectContact& ViewContactOfGrid::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
507         {
508             ViewObjectContact* pRetval = new ViewObjectContactOfPageGrid(rObjectContact, *this);
509             DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
510 
511             return *pRetval;
512         }
513 
514         drawinglayer::primitive2d::Primitive2DSequence ViewContactOfGrid::createViewIndependentPrimitive2DSequence() const
515         {
516             // We have only the page information, not the view information and thus no grid settings. Create empty
517             // default. For the view-dependent implementation, see ViewObjectContactOfPageGrid::createPrimitive2DSequence
518             return drawinglayer::primitive2d::Primitive2DSequence();
519         }
520 
521         ViewContactOfGrid::ViewContactOfGrid(ViewContactOfSdrPage& rParentViewContactOfSdrPage, bool bFront)
522         :   ViewContactOfPageSubObject(rParentViewContactOfSdrPage),
523             mbFront(bFront)
524         {
525         }
526 
527         ViewContactOfGrid::~ViewContactOfGrid()
528         {
529         }
530     } // end of namespace contact
531 } // end of namespace sdr
532 
533 //////////////////////////////////////////////////////////////////////////////
534 
535 namespace sdr
536 {
537     namespace contact
538     {
539         ViewObjectContact& ViewContactOfHelplines::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
540         {
541             ViewObjectContact* pRetval = new ViewObjectContactOfPageHelplines(rObjectContact, *this);
542             DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
543 
544             return *pRetval;
545         }
546 
547         drawinglayer::primitive2d::Primitive2DSequence ViewContactOfHelplines::createViewIndependentPrimitive2DSequence() const
548         {
549             // We have only the page information, not the view information and thus no helplines. Create empty
550             // default. For the view-dependent implementation, see ViewObjectContactOfPageHelplines::createPrimitive2DSequence
551             return drawinglayer::primitive2d::Primitive2DSequence();
552         }
553 
554         ViewContactOfHelplines::ViewContactOfHelplines(ViewContactOfSdrPage& rParentViewContactOfSdrPage, bool bFront)
555         :   ViewContactOfPageSubObject(rParentViewContactOfSdrPage),
556             mbFront(bFront)
557         {
558         }
559 
560         ViewContactOfHelplines::~ViewContactOfHelplines()
561         {
562         }
563     } // end of namespace contact
564 } // end of namespace sdr
565 
566 //////////////////////////////////////////////////////////////////////////////
567 
568 namespace sdr
569 {
570     namespace contact
571     {
572         // Create a Object-Specific ViewObjectContact, set ViewContact and
573         // ObjectContact. Always needs to return something.
574         ViewObjectContact& ViewContactOfSdrPage::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
575         {
576             ViewObjectContact* pRetval = new ViewObjectContactOfSdrPage(rObjectContact, *this);
577             DBG_ASSERT(pRetval, "ViewContact::CreateObjectSpecificViewObjectContact() failed (!)");
578 
579             return *pRetval;
580         }
581 
582         ViewContactOfSdrPage::ViewContactOfSdrPage(SdrPage& rPage)
583         :   ViewContact(),
584             mrPage(rPage),
585             maViewContactOfPageBackground(*this),
586             maViewContactOfPageShadow(*this),
587             maViewContactOfPageFill(*this),
588             maViewContactOfMasterPage(*this),
589             maViewContactOfOuterPageBorder(*this),
590             maViewContactOfInnerPageBorder(*this),
591             maViewContactOfGridBack(*this, false),
592             maViewContactOfHelplinesBack(*this, false),
593             maViewContactOfPageHierarchy(*this),
594             maViewContactOfGridFront(*this, true),
595             maViewContactOfHelplinesFront(*this, true)
596         {
597         }
598 
599         ViewContactOfSdrPage::~ViewContactOfSdrPage()
600         {
601         }
602 
603         // Access to possible sub-hierarchy
604         sal_uInt32 ViewContactOfSdrPage::GetObjectCount() const
605         {
606             // Fixed count of content. It contains PageBackground (Wiese), PageShadow, PageFill,
607             // then - depending on if the page has a MasterPage - either MasterPage Hierarchy
608             // or MPBGO. Also OuterPageBorder, InnerPageBorder and two pairs of Grid and Helplines
609             // (for front and back) which internally are visible or not depending on the current
610             // front/back setting for those.
611             return 11;
612         }
613 
614         ViewContact& ViewContactOfSdrPage::GetViewContact(sal_uInt32 nIndex) const
615         {
616             switch(nIndex)
617             {
618                 case 0: return (ViewContact&)maViewContactOfPageBackground;
619                 case 1: return (ViewContact&)maViewContactOfPageShadow;
620                 case 2: return (ViewContact&)maViewContactOfPageFill;
621                 case 3:
622                 {
623                     const SdrPage& rPage = GetSdrPage();
624 
625                     if(rPage.TRG_HasMasterPage())
626                     {
627                         return rPage.TRG_GetMasterPageDescriptorViewContact();
628                     }
629                     else
630                     {
631                         return (ViewContact&)maViewContactOfMasterPage;
632                     }
633                 }
634                 case 4: return (ViewContact&)maViewContactOfOuterPageBorder;
635                 case 5: return (ViewContact&)maViewContactOfInnerPageBorder;
636                 case 6: return (ViewContact&)maViewContactOfGridBack;
637                 case 7: return (ViewContact&)maViewContactOfHelplinesBack;
638                 case 8: return (ViewContact&)maViewContactOfPageHierarchy;
639                 case 9: return (ViewContact&)maViewContactOfGridFront;
640                 default: return (ViewContact&)maViewContactOfHelplinesFront;
641             }
642         }
643 
644         // React on changes of the object of this ViewContact
645         void ViewContactOfSdrPage::ActionChanged()
646         {
647             // call parent
648             ViewContact::ActionChanged();
649 
650             // apply to local viewContacts, they all rely on page information. Exception
651             // is the sub hierarchy; this will not be influenced by the change
652             maViewContactOfPageBackground.ActionChanged();
653             maViewContactOfPageShadow.ActionChanged();
654             maViewContactOfPageFill.ActionChanged();
655 
656             const SdrPage& rPage = GetSdrPage();
657 
658             if(rPage.TRG_HasMasterPage())
659             {
660                 rPage.TRG_GetMasterPageDescriptorViewContact().ActionChanged();
661             }
662             else if(rPage.IsMasterPage())
663             {
664                 maViewContactOfMasterPage.ActionChanged();
665             }
666 
667             maViewContactOfOuterPageBorder.ActionChanged();
668             maViewContactOfInnerPageBorder.ActionChanged();
669             maViewContactOfGridBack.ActionChanged();
670             maViewContactOfHelplinesBack.ActionChanged();
671             maViewContactOfGridFront.ActionChanged();
672             maViewContactOfHelplinesFront.ActionChanged();
673         }
674 
675         // overload for accessing the SdrPage
676         SdrPage* ViewContactOfSdrPage::TryToGetSdrPage() const
677         {
678             return &GetSdrPage();
679         }
680 
681         drawinglayer::primitive2d::Primitive2DSequence ViewContactOfSdrPage::createViewIndependentPrimitive2DSequence() const
682         {
683             drawinglayer::primitive2d::Primitive2DSequence xRetval;
684 
685             // collect all sub-sequences including sub hierarchy.
686             drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfPageBackground.getViewIndependentPrimitive2DSequence());
687             drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfPageShadow.getViewIndependentPrimitive2DSequence());
688             drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfPageFill.getViewIndependentPrimitive2DSequence());
689 
690             const SdrPage& rPage = GetSdrPage();
691 
692             if(rPage.TRG_HasMasterPage())
693             {
694                 drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval,
695                     rPage.TRG_GetMasterPageDescriptorViewContact().getViewIndependentPrimitive2DSequence());
696             }
697             else if(rPage.IsMasterPage())
698             {
699                 drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval,
700                     maViewContactOfMasterPage.getViewIndependentPrimitive2DSequence());
701             }
702 
703             drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfOuterPageBorder.getViewIndependentPrimitive2DSequence());
704             drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfInnerPageBorder.getViewIndependentPrimitive2DSequence());
705             drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfPageHierarchy.getViewIndependentPrimitive2DSequence());
706 
707             // Only add front versions of grid and helplines since no visibility test is done,
708             // so adding the back incarnations is not necessary. This makes the Front
709             // visualization the default when no visibility tests are done.
710             //
711             // Since we have no view here, no grid and helpline definitions are available currently. The used
712             // methods at ViewContactOfHelplines and ViewContactOfGrid return only empty sequences and
713             // do not need to be called ATM. This may change later if grid or helpline info gets
714             // model data (it should not). Keeping the lines commented to hold this hint.
715             //
716             // drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfGridFront.getViewIndependentPrimitive2DSequence());
717             // drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xRetval, maViewContactOfHelplinesFront.getViewIndependentPrimitive2DSequence());
718 
719             return xRetval;
720         }
721     } // end of namespace contact
722 } // end of namespace sdr
723 
724 //////////////////////////////////////////////////////////////////////////////
725 // eof
726