xref: /trunk/main/svx/source/sdr/contact/viewobjectcontactofsdrpage.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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/sdr/contact/viewobjectcontactofsdrpage.hxx>
32 #include <svx/sdr/contact/displayinfo.hxx>
33 #include <svx/sdr/contact/viewcontactofsdrpage.hxx>
34 #include <svx/svdview.hxx>
35 #include <svx/svdpage.hxx>
36 #include <svx/sdr/contact/objectcontact.hxx>
37 #include <drawinglayer/primitive2d/backgroundcolorprimitive2d.hxx>
38 #include <basegfx/polygon/b2dpolygontools.hxx>
39 #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
40 #include <drawinglayer/primitive2d/gridprimitive2d.hxx>
41 #include <drawinglayer/primitive2d/helplineprimitive2d.hxx>
42 #include <basegfx/polygon/b2dpolygon.hxx>
43 #include <svx/sdr/primitive2d/sdrprimitivetools.hxx>
44 
45 //////////////////////////////////////////////////////////////////////////////
46 
47 using namespace com::sun::star;
48 
49 //////////////////////////////////////////////////////////////////////////////
50 
51 namespace sdr
52 {
53     namespace contact
54     {
55         const SdrPage& ViewObjectContactOfPageSubObject::getPage() const
56         {
57             return static_cast< ViewContactOfPageSubObject& >(GetViewContact()).getPage();
58         }
59 
60         ViewObjectContactOfPageSubObject::ViewObjectContactOfPageSubObject(ObjectContact& rObjectContact, ViewContact& rViewContact)
61         :   ViewObjectContact(rObjectContact, rViewContact)
62         {
63         }
64 
65         ViewObjectContactOfPageSubObject::~ViewObjectContactOfPageSubObject()
66         {
67         }
68 
69         bool ViewObjectContactOfPageSubObject::isPrimitiveVisible(const DisplayInfo& rDisplayInfo) const
70         {
71             if(rDisplayInfo.GetSubContentActive())
72             {
73                 return false;
74             }
75 
76             if(rDisplayInfo.GetControlLayerProcessingActive())
77             {
78                 return false;
79             }
80 
81             if(!rDisplayInfo.GetPageProcessingActive())
82             {
83                 return false;
84             }
85 
86             if(GetObjectContact().isOutputToPrinter())
87             {
88                 return false;
89             }
90 
91             if(!GetObjectContact().TryToGetSdrPageView())
92             {
93                 return false;
94             }
95 
96             return true;
97         }
98 
99         bool ViewObjectContactOfPageSubObject::isPrimitiveGhosted(const DisplayInfo& /*rDisplayInfo*/) const
100         {
101             // suppress ghosted for page parts
102             return false;
103         }
104     } // end of namespace contact
105 } // end of namespace sdr
106 
107 //////////////////////////////////////////////////////////////////////////////
108 
109 namespace sdr
110 {
111     namespace contact
112     {
113         ViewObjectContactOfPageBackground::ViewObjectContactOfPageBackground(ObjectContact& rObjectContact, ViewContact& rViewContact)
114         :   ViewObjectContactOfPageSubObject(rObjectContact, rViewContact)
115         {
116         }
117 
118         ViewObjectContactOfPageBackground::~ViewObjectContactOfPageBackground()
119         {
120         }
121 
122         bool ViewObjectContactOfPageBackground::isPrimitiveVisible(const DisplayInfo& rDisplayInfo) const
123         {
124             if(!ViewObjectContactOfPageSubObject::isPrimitiveVisible(rDisplayInfo))
125             {
126                 return false;
127             }
128 
129             // no page background for preview renderers
130             if(GetObjectContact().IsPreviewRenderer())
131             {
132                 return false;
133             }
134 
135             return true;
136         }
137 
138         drawinglayer::primitive2d::Primitive2DSequence ViewObjectContactOfPageBackground::createPrimitive2DSequence(const DisplayInfo& /*rDisplayInfo*/) const
139         {
140             // Initialize background. Dependent of IsPageVisible, use ApplicationBackgroundColor or ApplicationDocumentColor. Most
141             // old renderers for export (html, pdf, gallery, ...) set the page to not visible (SetPageVisible(false)). They expect the
142             // given OutputDevice to be initialized with the ApplicationDocumentColor then.
143             const SdrPageView* pPageView = GetObjectContact().TryToGetSdrPageView();
144             drawinglayer::primitive2d::Primitive2DSequence xRetval;
145 
146             if(pPageView)
147             {
148                 const SdrView& rView = pPageView->GetView();
149                 Color aInitColor;
150 
151                 if(rView.IsPageVisible())
152                 {
153                     aInitColor = pPageView->GetApplicationBackgroundColor();
154                 }
155                 else
156                 {
157                     aInitColor = pPageView->GetApplicationDocumentColor();
158 
159                     if(Color(COL_AUTO) == aInitColor)
160                     {
161                         const svtools::ColorConfig aColorConfig;
162                         aInitColor = aColorConfig.GetColorValue(svtools::DOCCOLOR).nColor;
163                     }
164                 }
165 
166                 // init background with InitColor
167                 xRetval.realloc(1);
168                 const basegfx::BColor aRGBColor(aInitColor.getBColor());
169                 xRetval[0] = drawinglayer::primitive2d::Primitive2DReference(new drawinglayer::primitive2d::BackgroundColorPrimitive2D(aRGBColor));
170             }
171 
172             return xRetval;
173         }
174     } // end of namespace contact
175 } // end of namespace sdr
176 
177 //////////////////////////////////////////////////////////////////////////////
178 
179 namespace sdr
180 {
181     namespace contact
182     {
183         ViewObjectContactOfMasterPage::ViewObjectContactOfMasterPage(ObjectContact& rObjectContact, ViewContact& rViewContact)
184         :   ViewObjectContactOfPageSubObject(rObjectContact, rViewContact)
185         {
186         }
187 
188         ViewObjectContactOfMasterPage::~ViewObjectContactOfMasterPage()
189         {
190         }
191 
192         bool ViewObjectContactOfMasterPage::isPrimitiveVisible(const DisplayInfo& rDisplayInfo) const
193         {
194             if(!ViewObjectContactOfPageSubObject::isPrimitiveVisible(rDisplayInfo))
195             {
196                 return false;
197             }
198 
199             // this object is only used for MasterPages. When not the MasterPage is
200             // displayed as a page, but another page is using it as sub-object, the
201             // geometry needs to be hidden
202             if(rDisplayInfo.GetSubContentActive())
203             {
204                 return false;
205             }
206 
207             return true;
208         }
209     } // end of namespace contact
210 } // end of namespace sdr
211 
212 //////////////////////////////////////////////////////////////////////////////
213 
214 namespace sdr
215 {
216     namespace contact
217     {
218         ViewObjectContactOfPageFill::ViewObjectContactOfPageFill(ObjectContact& rObjectContact, ViewContact& rViewContact)
219         :   ViewObjectContactOfPageSubObject(rObjectContact, rViewContact)
220         {
221         }
222 
223         ViewObjectContactOfPageFill::~ViewObjectContactOfPageFill()
224         {
225         }
226 
227         bool ViewObjectContactOfPageFill::isPrimitiveVisible(const DisplayInfo& rDisplayInfo) const
228         {
229             if(!ViewObjectContactOfPageSubObject::isPrimitiveVisible(rDisplayInfo))
230             {
231                 return false;
232             }
233 
234             SdrPageView* pSdrPageView = GetObjectContact().TryToGetSdrPageView();
235 
236             if(!pSdrPageView)
237             {
238                 return false;
239             }
240 
241             if(!pSdrPageView->GetView().IsPageVisible())
242             {
243                 return false;
244             }
245 
246             return true;
247         }
248 
249         drawinglayer::primitive2d::Primitive2DSequence ViewObjectContactOfPageFill::createPrimitive2DSequence(const DisplayInfo& /*rDisplayInfo*/) const
250         {
251             const SdrPageView* pPageView = GetObjectContact().TryToGetSdrPageView();
252             drawinglayer::primitive2d::Primitive2DSequence xRetval;
253 
254             if(pPageView)
255             {
256                 const SdrPage& rPage = getPage();
257 
258                 const basegfx::B2DRange aPageFillRange(0.0, 0.0, (double)rPage.GetWdt(), (double)rPage.GetHgt());
259                 const basegfx::B2DPolygon aPageFillPolygon(basegfx::tools::createPolygonFromRect(aPageFillRange));
260                 Color aPageFillColor;
261 
262                 if(pPageView->GetApplicationDocumentColor() != COL_AUTO)
263                 {
264                     aPageFillColor = pPageView->GetApplicationDocumentColor();
265                 }
266                 else
267                 {
268                     const svtools::ColorConfig aColorConfig;
269                     aPageFillColor = aColorConfig.GetColorValue(svtools::DOCCOLOR).nColor;
270                 }
271 
272                 // create and add primitive
273                 xRetval.realloc(1);
274                 const basegfx::BColor aRGBColor(aPageFillColor.getBColor());
275                 xRetval[0] = drawinglayer::primitive2d::Primitive2DReference(new drawinglayer::primitive2d::PolyPolygonColorPrimitive2D(basegfx::B2DPolyPolygon(aPageFillPolygon), aRGBColor));
276             }
277 
278             return xRetval;
279         }
280     } // end of namespace contact
281 } // end of namespace sdr
282 
283 //////////////////////////////////////////////////////////////////////////////
284 
285 namespace sdr
286 {
287     namespace contact
288     {
289         ViewObjectContactOfPageShadow::ViewObjectContactOfPageShadow(ObjectContact& rObjectContact, ViewContact& rViewContact)
290         :   ViewObjectContactOfPageSubObject(rObjectContact, rViewContact)
291         {
292         }
293 
294         ViewObjectContactOfPageShadow::~ViewObjectContactOfPageShadow()
295         {
296         }
297 
298         bool ViewObjectContactOfPageShadow::isPrimitiveVisible(const DisplayInfo& rDisplayInfo) const
299         {
300             if(!ViewObjectContactOfPageSubObject::isPrimitiveVisible(rDisplayInfo))
301             {
302                 return false;
303             }
304 
305             SdrPageView* pSdrPageView = GetObjectContact().TryToGetSdrPageView();
306 
307             if(!pSdrPageView)
308             {
309                 return false;
310             }
311 
312             if(!pSdrPageView->GetView().IsPageVisible())
313             {
314                 return false;
315             }
316 
317             // no page shadow for preview renderers
318             if(GetObjectContact().IsPreviewRenderer())
319             {
320                 return false;
321             }
322 
323             // no page shadow for high contrast mode
324             if(GetObjectContact().isDrawModeHighContrast())
325             {
326                 return false;
327             }
328 
329             return true;
330         }
331     } // end of namespace contact
332 } // end of namespace sdr
333 
334 //////////////////////////////////////////////////////////////////////////////
335 
336 namespace sdr
337 {
338     namespace contact
339     {
340         ViewObjectContactOfOuterPageBorder::ViewObjectContactOfOuterPageBorder(ObjectContact& rObjectContact, ViewContact& rViewContact)
341         :   ViewObjectContactOfPageSubObject(rObjectContact, rViewContact)
342         {
343         }
344 
345         ViewObjectContactOfOuterPageBorder::~ViewObjectContactOfOuterPageBorder()
346         {
347         }
348 
349         bool ViewObjectContactOfOuterPageBorder::isPrimitiveVisible(const DisplayInfo& rDisplayInfo) const
350         {
351             if(!ViewObjectContactOfPageSubObject::isPrimitiveVisible(rDisplayInfo))
352             {
353                 return false;
354             }
355 
356             SdrPageView* pSdrPageView = GetObjectContact().TryToGetSdrPageView();
357 
358             if(!pSdrPageView)
359             {
360                 return false;
361             }
362 
363             const SdrView& rView = pSdrPageView->GetView();
364 
365             if(!rView.IsPageVisible() && rView.IsPageBorderVisible())
366             {
367                 return false;
368             }
369 
370             return true;
371         }
372     } // end of namespace contact
373 } // end of namespace sdr
374 
375 //////////////////////////////////////////////////////////////////////////////
376 
377 namespace sdr
378 {
379     namespace contact
380     {
381         ViewObjectContactOfInnerPageBorder::ViewObjectContactOfInnerPageBorder(ObjectContact& rObjectContact, ViewContact& rViewContact)
382         :   ViewObjectContactOfPageSubObject(rObjectContact, rViewContact)
383         {
384         }
385 
386         ViewObjectContactOfInnerPageBorder::~ViewObjectContactOfInnerPageBorder()
387         {
388         }
389 
390         bool ViewObjectContactOfInnerPageBorder::isPrimitiveVisible(const DisplayInfo& rDisplayInfo) const
391         {
392             if(!ViewObjectContactOfPageSubObject::isPrimitiveVisible(rDisplayInfo))
393             {
394                 return false;
395             }
396 
397             SdrPageView* pSdrPageView = GetObjectContact().TryToGetSdrPageView();
398 
399             if(!pSdrPageView)
400             {
401                 return false;
402             }
403 
404             if(!pSdrPageView->GetView().IsBordVisible())
405             {
406                 return false;
407             }
408 
409             const SdrPage& rPage = getPage();
410 
411             if(!rPage.GetLftBorder() && !rPage.GetUppBorder() && !rPage.GetRgtBorder() && !rPage.GetLwrBorder())
412             {
413                 return false;
414             }
415 
416             // no inner page border for preview renderers
417             if(GetObjectContact().IsPreviewRenderer())
418             {
419                 return false;
420             }
421 
422             return true;
423         }
424     } // end of namespace contact
425 } // end of namespace sdr
426 
427 //////////////////////////////////////////////////////////////////////////////
428 
429 namespace sdr
430 {
431     namespace contact
432     {
433         ViewObjectContactOfPageHierarchy::ViewObjectContactOfPageHierarchy(ObjectContact& rObjectContact, ViewContact& rViewContact)
434         :   ViewObjectContactOfPageSubObject(rObjectContact, rViewContact)
435         {
436         }
437 
438         ViewObjectContactOfPageHierarchy::~ViewObjectContactOfPageHierarchy()
439         {
440         }
441 
442         drawinglayer::primitive2d::Primitive2DSequence ViewObjectContactOfPageHierarchy::getPrimitive2DSequenceHierarchy(DisplayInfo& rDisplayInfo) const
443         {
444             drawinglayer::primitive2d::Primitive2DSequence xRetval;
445 
446             // process local sub-hierarchy
447             const sal_uInt32 nSubHierarchyCount(GetViewContact().GetObjectCount());
448 
449             if(nSubHierarchyCount)
450             {
451                 xRetval = getPrimitive2DSequenceSubHierarchy(rDisplayInfo);
452 
453                 if(xRetval.hasElements())
454                 {
455                     // get ranges
456                     const drawinglayer::geometry::ViewInformation2D& rViewInformation2D(GetObjectContact().getViewInformation2D());
457                     const basegfx::B2DRange aObjectRange(drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence(xRetval, rViewInformation2D));
458                     const basegfx::B2DRange aViewRange(rViewInformation2D.getViewport());
459 
460                     // check geometrical visibility
461                     if(!aViewRange.isEmpty() && !aViewRange.overlaps(aObjectRange))
462                     {
463                         // not visible, release
464                         xRetval.realloc(0);
465                     }
466                 }
467             }
468 
469             return xRetval;
470         }
471     } // end of namespace contact
472 } // end of namespace sdr
473 
474 //////////////////////////////////////////////////////////////////////////////
475 
476 namespace sdr
477 {
478     namespace contact
479     {
480         ViewObjectContactOfPageGrid::ViewObjectContactOfPageGrid(ObjectContact& rObjectContact, ViewContact& rViewContact)
481         :   ViewObjectContactOfPageSubObject(rObjectContact, rViewContact)
482         {
483         }
484 
485         ViewObjectContactOfPageGrid::~ViewObjectContactOfPageGrid()
486         {
487         }
488 
489         bool ViewObjectContactOfPageGrid::isPrimitiveVisible(const DisplayInfo& rDisplayInfo) const
490         {
491             if(!ViewObjectContactOfPageSubObject::isPrimitiveVisible(rDisplayInfo))
492             {
493                 return false;
494             }
495 
496             SdrPageView* pSdrPageView = GetObjectContact().TryToGetSdrPageView();
497 
498             if(!pSdrPageView)
499             {
500                 return false;
501             }
502 
503             const SdrView& rView = pSdrPageView->GetView();
504 
505             if(!rView.IsGridVisible())
506             {
507                 return false;
508             }
509 
510             // no page grid for preview renderers
511             if(GetObjectContact().IsPreviewRenderer())
512             {
513                 return false;
514             }
515 
516             if(static_cast< ViewContactOfGrid& >(GetViewContact()).getFront() != (bool)rView.IsGridFront())
517             {
518                 return false;
519             }
520 
521             return true;
522         }
523 
524         drawinglayer::primitive2d::Primitive2DSequence ViewObjectContactOfPageGrid::createPrimitive2DSequence(const DisplayInfo& /*rDisplayInfo*/) const
525         {
526             const SdrPageView* pPageView = GetObjectContact().TryToGetSdrPageView();
527             drawinglayer::primitive2d::Primitive2DSequence xRetval;
528 
529             if(pPageView)
530             {
531                 const SdrView& rView = pPageView->GetView();
532                 const SdrPage& rPage = getPage();
533                 const Color aGridColor(rView.GetGridColor());
534                 const basegfx::BColor aRGBGridColor(aGridColor.getBColor());
535 
536                 basegfx::B2DHomMatrix aGridMatrix;
537                 aGridMatrix.set(0, 0, (double)(rPage.GetWdt() - (rPage.GetRgtBorder() + rPage.GetLftBorder())));
538                 aGridMatrix.set(1, 1, (double)(rPage.GetHgt() - (rPage.GetLwrBorder() + rPage.GetUppBorder())));
539                 aGridMatrix.set(0, 2, (double)rPage.GetLftBorder());
540                 aGridMatrix.set(1, 2, (double)rPage.GetUppBorder());
541 
542                 const Size aRaw(rView.GetGridCoarse());
543                 const Size aFine(rView.GetGridFine());
544                 const double fWidthX(aRaw.getWidth());
545                 const double fWidthY(aRaw.getHeight());
546                 const sal_uInt32 nSubdivisionsX(aFine.getWidth() ? aRaw.getWidth() / aFine.getWidth() : 0L);
547                 const sal_uInt32 nSubdivisionsY(aFine.getHeight() ? aRaw.getHeight() / aFine.getHeight() : 0L);
548 
549                 xRetval.realloc(1);
550                 xRetval[0] = drawinglayer::primitive2d::Primitive2DReference(new drawinglayer::primitive2d::GridPrimitive2D(
551                     aGridMatrix, fWidthX, fWidthY, 10.0, 3.0, nSubdivisionsX, nSubdivisionsY, aRGBGridColor,
552                     drawinglayer::primitive2d::createDefaultCross_3x3(aRGBGridColor)));
553             }
554 
555             return xRetval;
556         }
557     } // end of namespace contact
558 } // end of namespace sdr
559 
560 //////////////////////////////////////////////////////////////////////////////
561 
562 namespace sdr
563 {
564     namespace contact
565     {
566         ViewObjectContactOfPageHelplines::ViewObjectContactOfPageHelplines(ObjectContact& rObjectContact, ViewContact& rViewContact)
567         :   ViewObjectContactOfPageSubObject(rObjectContact, rViewContact)
568         {
569         }
570 
571         ViewObjectContactOfPageHelplines::~ViewObjectContactOfPageHelplines()
572         {
573         }
574 
575         bool ViewObjectContactOfPageHelplines::isPrimitiveVisible(const DisplayInfo& rDisplayInfo) const
576         {
577             if(!ViewObjectContactOfPageSubObject::isPrimitiveVisible(rDisplayInfo))
578             {
579                 return false;
580             }
581 
582             SdrPageView* pSdrPageView = GetObjectContact().TryToGetSdrPageView();
583 
584             if(!pSdrPageView)
585             {
586                 return false;
587             }
588 
589             const SdrView& rView = pSdrPageView->GetView();
590 
591             if(!rView.IsHlplVisible())
592             {
593                 return false;
594             }
595 
596             // no helplines for preview renderers
597             if(GetObjectContact().IsPreviewRenderer())
598             {
599                 return false;
600             }
601 
602             if(static_cast< ViewContactOfHelplines& >(GetViewContact()).getFront() != (bool)rView.IsHlplFront())
603             {
604                 return false;
605             }
606 
607             return true;
608         }
609 
610         drawinglayer::primitive2d::Primitive2DSequence ViewObjectContactOfPageHelplines::createPrimitive2DSequence(const DisplayInfo& /*rDisplayInfo*/) const
611         {
612             drawinglayer::primitive2d::Primitive2DSequence xRetval;
613             const SdrPageView* pPageView = GetObjectContact().TryToGetSdrPageView();
614 
615             if(pPageView)
616             {
617                 const SdrHelpLineList& rHelpLineList = pPageView->GetHelpLines();
618                 const sal_uInt32 nCount(rHelpLineList.GetCount());
619 
620                 if(nCount)
621                 {
622                     const basegfx::BColor aRGBColorA(1.0, 1.0, 1.0);
623                     const basegfx::BColor aRGBColorB(0.0, 0.0, 0.0);
624                     xRetval.realloc(nCount);
625 
626                     for(sal_uInt32 a(0L); a < nCount; a++)
627                     {
628                         const SdrHelpLine& rHelpLine = rHelpLineList[(sal_uInt16)a];
629                         const basegfx::B2DPoint aPosition((double)rHelpLine.GetPos().X(), (double)rHelpLine.GetPos().Y());
630                         const double fDiscreteDashLength(4.0);
631 
632                         switch(rHelpLine.GetKind())
633                         {
634                             default : // SDRHELPLINE_POINT
635                             {
636                                 xRetval[a] = drawinglayer::primitive2d::Primitive2DReference(new drawinglayer::primitive2d::HelplinePrimitive2D(
637                                     aPosition, basegfx::B2DVector(1.0, 0.0), drawinglayer::primitive2d::HELPLINESTYLE2D_POINT,
638                                     aRGBColorA, aRGBColorB, fDiscreteDashLength));
639                                 break;
640                             }
641                             case SDRHELPLINE_VERTICAL :
642                             {
643                                 xRetval[a] = drawinglayer::primitive2d::Primitive2DReference(new drawinglayer::primitive2d::HelplinePrimitive2D(
644                                     aPosition, basegfx::B2DVector(0.0, 1.0), drawinglayer::primitive2d::HELPLINESTYLE2D_LINE,
645                                     aRGBColorA, aRGBColorB, fDiscreteDashLength));
646                                 break;
647                             }
648                             case SDRHELPLINE_HORIZONTAL :
649                             {
650                                 xRetval[a] = drawinglayer::primitive2d::Primitive2DReference(new drawinglayer::primitive2d::HelplinePrimitive2D(
651                                     aPosition, basegfx::B2DVector(1.0, 0.0), drawinglayer::primitive2d::HELPLINESTYLE2D_LINE,
652                                     aRGBColorA, aRGBColorB, fDiscreteDashLength));
653                                 break;
654                             }
655                         }
656                     }
657                 }
658             }
659 
660             return xRetval;
661         }
662     } // end of namespace contact
663 } // end of namespace sdr
664 
665 //////////////////////////////////////////////////////////////////////////////
666 
667 namespace sdr
668 {
669     namespace contact
670     {
671         ViewObjectContactOfSdrPage::ViewObjectContactOfSdrPage(ObjectContact& rObjectContact, ViewContact& rViewContact)
672         :   ViewObjectContact(rObjectContact, rViewContact)
673         {
674         }
675 
676         ViewObjectContactOfSdrPage::~ViewObjectContactOfSdrPage()
677         {
678         }
679 
680         drawinglayer::primitive2d::Primitive2DSequence ViewObjectContactOfSdrPage::getPrimitive2DSequenceHierarchy(DisplayInfo& rDisplayInfo) const
681         {
682             drawinglayer::primitive2d::Primitive2DSequence xRetval;
683 
684             // process local sub-hierarchy
685             const sal_uInt32 nSubHierarchyCount(GetViewContact().GetObjectCount());
686 
687             if(nSubHierarchyCount)
688             {
689                 const sal_Bool bDoGhostedDisplaying(
690                     GetObjectContact().DoVisualizeEnteredGroup()
691                     && !GetObjectContact().isOutputToPrinter()
692                     && GetObjectContact().getActiveViewContact() == &GetViewContact());
693 
694                 if(bDoGhostedDisplaying)
695                 {
696                     rDisplayInfo.ClearGhostedDrawMode();
697                 }
698 
699                 // create object hierarchy
700                 xRetval = getPrimitive2DSequenceSubHierarchy(rDisplayInfo);
701 
702                 if(xRetval.hasElements())
703                 {
704                     // get ranges
705                     const drawinglayer::geometry::ViewInformation2D& rViewInformation2D(GetObjectContact().getViewInformation2D());
706                     const basegfx::B2DRange aObjectRange(drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence(xRetval, rViewInformation2D));
707                     const basegfx::B2DRange aViewRange(rViewInformation2D.getViewport());
708 
709                     // check geometrical visibility
710                     if(!aViewRange.isEmpty() && !aViewRange.overlaps(aObjectRange))
711                     {
712                         // not visible, release
713                         xRetval.realloc(0);
714                     }
715                 }
716 
717                 if(bDoGhostedDisplaying)
718                 {
719                     rDisplayInfo.SetGhostedDrawMode();
720                 }
721             }
722 
723             return xRetval;
724         }
725     } // end of namespace contact
726 } // end of namespace sdr
727 
728 //////////////////////////////////////////////////////////////////////////////
729 // eof
730