xref: /AOO41X/main/svx/source/sdr/contact/viewcontactofvirtobj.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_svx.hxx"
30*cdf0e10cSrcweir #include <svx/sdr/contact/viewcontactofvirtobj.hxx>
31*cdf0e10cSrcweir #include <svx/svdovirt.hxx>
32*cdf0e10cSrcweir #include <svx/sdr/contact/displayinfo.hxx>
33*cdf0e10cSrcweir #include <basegfx/matrix/b2dhommatrix.hxx>
34*cdf0e10cSrcweir #include <drawinglayer/primitive2d/transformprimitive2d.hxx>
35*cdf0e10cSrcweir #include <vcl/outdev.hxx>
36*cdf0e10cSrcweir #include <drawinglayer/primitive2d/sdrdecompositiontools2d.hxx>
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir namespace sdr
41*cdf0e10cSrcweir {
42*cdf0e10cSrcweir 	namespace contact
43*cdf0e10cSrcweir 	{
44*cdf0e10cSrcweir         SdrVirtObj& ViewContactOfVirtObj::GetVirtObj() const
45*cdf0e10cSrcweir 		{
46*cdf0e10cSrcweir 			return (SdrVirtObj&)mrObject;
47*cdf0e10cSrcweir 		}
48*cdf0e10cSrcweir 
49*cdf0e10cSrcweir         ViewContactOfVirtObj::ViewContactOfVirtObj(SdrVirtObj& rObj)
50*cdf0e10cSrcweir 		:	ViewContactOfSdrObj(rObj)
51*cdf0e10cSrcweir 		{
52*cdf0e10cSrcweir 		}
53*cdf0e10cSrcweir 
54*cdf0e10cSrcweir 		ViewContactOfVirtObj::~ViewContactOfVirtObj()
55*cdf0e10cSrcweir 		{
56*cdf0e10cSrcweir 		}
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir         // Access to possible sub-hierarchy
59*cdf0e10cSrcweir 		sal_uInt32 ViewContactOfVirtObj::GetObjectCount() const
60*cdf0e10cSrcweir 		{
61*cdf0e10cSrcweir             // Here, SdrVirtObj's need to return 0L to show that they have no
62*cdf0e10cSrcweir             // sub-hierarchy, even when they are group objects. This is necessary
63*cdf0e10cSrcweir             // to avoid that the same VOCs will be added to the draw hierarchy
64*cdf0e10cSrcweir             // twice which leads to problems.
65*cdf0e10cSrcweir 			//
66*cdf0e10cSrcweir             // This solution is only a first solution to get things running. Later
67*cdf0e10cSrcweir             // this needs to be replaced with creating real VOCs for the objects
68*cdf0e10cSrcweir             // referenced by virtual objects to avoid the 'trick' of setting the
69*cdf0e10cSrcweir             // offset for painting at the destination OutputDevive.
70*cdf0e10cSrcweir 			//
71*cdf0e10cSrcweir 			// As can be seen, with primitives, the problem will be solved using
72*cdf0e10cSrcweir 			// a transformPrimitive, so this solution can stay with primitives.
73*cdf0e10cSrcweir             return 0L;
74*cdf0e10cSrcweir 		}
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir 		drawinglayer::primitive2d::Primitive2DSequence ViewContactOfVirtObj::createViewIndependentPrimitive2DSequence() const
77*cdf0e10cSrcweir 		{
78*cdf0e10cSrcweir 			// create displacement transformation if we have content
79*cdf0e10cSrcweir 			basegfx::B2DHomMatrix aObjectMatrix;
80*cdf0e10cSrcweir 			Point aAnchor(GetVirtObj().GetAnchorPos());
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir 			if(aAnchor.X() || aAnchor.Y())
83*cdf0e10cSrcweir 			{
84*cdf0e10cSrcweir 				aObjectMatrix.set(0, 2, aAnchor.X());
85*cdf0e10cSrcweir 				aObjectMatrix.set(1, 2, aAnchor.Y());
86*cdf0e10cSrcweir 			}
87*cdf0e10cSrcweir 
88*cdf0e10cSrcweir 			// use method from referenced object to get the Primitive2DSequence
89*cdf0e10cSrcweir 			const drawinglayer::primitive2d::Primitive2DSequence xSequenceVirtual(
90*cdf0e10cSrcweir 				GetVirtObj().GetReferencedObj().GetViewContact().getViewIndependentPrimitive2DSequence());
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir 			if(xSequenceVirtual.hasElements())
93*cdf0e10cSrcweir 			{
94*cdf0e10cSrcweir 				// create transform primitive
95*cdf0e10cSrcweir 				const drawinglayer::primitive2d::Primitive2DReference xReference(
96*cdf0e10cSrcweir 					new drawinglayer::primitive2d::TransformPrimitive2D(
97*cdf0e10cSrcweir 						aObjectMatrix,
98*cdf0e10cSrcweir 						xSequenceVirtual));
99*cdf0e10cSrcweir 
100*cdf0e10cSrcweir 				return drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1);
101*cdf0e10cSrcweir 			}
102*cdf0e10cSrcweir 			else
103*cdf0e10cSrcweir 			{
104*cdf0e10cSrcweir 				// always append an invisible outline for the cases where no visible content exists
105*cdf0e10cSrcweir 				const drawinglayer::primitive2d::Primitive2DReference xReference(
106*cdf0e10cSrcweir 					drawinglayer::primitive2d::createHiddenGeometryPrimitives2D(
107*cdf0e10cSrcweir 						false, aObjectMatrix));
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir 				return drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1);
110*cdf0e10cSrcweir 			}
111*cdf0e10cSrcweir 		}
112*cdf0e10cSrcweir 	} // end of namespace contact
113*cdf0e10cSrcweir } // end of namespace sdr
114*cdf0e10cSrcweir 
115*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
116*cdf0e10cSrcweir // eof
117