xref: /AOO41X/main/svx/source/sdr/contact/viewobjectcontactofsdrole2obj.cxx (revision 0702bc67a2ac2836add565ba470821c1aa4db6ed)
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 
27 #include <svx/sdr/contact/viewobjectcontactofsdrole2obj.hxx>
28 #include <svx/sdr/contact/viewobjectcontactofsdrobj.hxx>
29 #include <svx/sdr/contact/viewcontactofsdrole2obj.hxx>
30 #include <svx/svdoole2.hxx>
31 #include <svx/sdr/contact/objectcontact.hxx>
32 #include <svx/svdview.hxx>
33 #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
34 #include <basegfx/polygon/b2dpolygontools.hxx>
35 #include <com/sun/star/embed/EmbedMisc.hpp>
36 #include <com/sun/star/embed/EmbedStates.hpp>
37 #include <basegfx/polygon/b2dpolygon.hxx>
38 #include <basegfx/matrix/b2dhommatrix.hxx>
39 
40 //////////////////////////////////////////////////////////////////////////////
41 
42 using namespace com::sun::star;
43 
44 //////////////////////////////////////////////////////////////////////////////
45 
46 namespace sdr
47 {
48     namespace contact
49     {
getSdrOle2Object() const50         const SdrOle2Obj& ViewObjectContactOfSdrOle2Obj::getSdrOle2Object() const
51         {
52             return static_cast< ViewContactOfSdrOle2Obj& >(GetViewContact()).GetOle2Obj();
53         }
54 
createPrimitive2DSequence(const DisplayInfo &) const55         drawinglayer::primitive2d::Primitive2DSequence ViewObjectContactOfSdrOle2Obj::createPrimitive2DSequence(
56             const DisplayInfo& /*rDisplayInfo*/) const
57         {
58             // this method is overloaded to do some things the old SdrOle2Obj::DoPaintObject did.
59             // In the future, some of these may be solved different, but ATM try to stay compatible
60             // with the old behaviour
61             drawinglayer::primitive2d::Primitive2DSequence xRetval;
62             const SdrOle2Obj& rSdrOle2 = getSdrOle2Object();
63             sal_Int32 nState(-1);
64 
65             {
66                 const svt::EmbeddedObjectRef& xObjRef  = rSdrOle2.getEmbeddedObjectRef();
67                 if ( xObjRef.is() )
68                     nState = xObjRef->getCurrentState();
69             }
70 
71             const bool bIsOutplaceActive(nState == embed::EmbedStates::ACTIVE);
72             const bool bIsInplaceActive((nState == embed::EmbedStates::INPLACE_ACTIVE) || (nState == embed::EmbedStates::UI_ACTIVE));
73             bool bDone(false);
74 
75             if(!bDone && bIsInplaceActive)
76             {
77                 if( !GetObjectContact().isOutputToPrinter() && !GetObjectContact().isOutputToRecordingMetaFile() )
78                 {
79                     //no need to create a primitive sequence here as the OLE object does render itself
80                     //in case of charts the superfluous creation of a metafile is strongly performance relevant!
81                     bDone = true;
82                 }
83             }
84 
85             if( !bDone )
86             {
87                 //old stuff that should be reworked
88                 {
89                     //if no replacement image is available load the OLE object
90 //                    if(!rSdrOle2.GetGraphic()) //try to fetch the metafile - this can lead to the actual creation of the metafile what can be extremely expensive (e.g. for big charts)!!! #i101925#
91 //                    {
92 //                      // try to create embedded object
93 //                        rSdrOle2.GetObjRef(); //this loads the OLE object if it is not loaded already
94 //                    }
95                     const svt::EmbeddedObjectRef& xObjRef  = rSdrOle2.getEmbeddedObjectRef();
96                     if(xObjRef.is())
97                     {
98                         const sal_Int64 nMiscStatus(xObjRef->getStatus(rSdrOle2.GetAspect()));
99 
100                         // this hack (to change model data during PAINT argh(!)) should be reworked
101                         if(!rSdrOle2.IsResizeProtect() && (nMiscStatus & embed::EmbedMisc::EMBED_NEVERRESIZE))
102                         {
103                             const_cast< SdrOle2Obj* >(&rSdrOle2)->SetResizeProtect(true);
104                         }
105 
106                         SdrPageView* pPageView = GetObjectContact().TryToGetSdrPageView();
107                         if(pPageView && (nMiscStatus & embed::EmbedMisc::MS_EMBED_ACTIVATEWHENVISIBLE))
108                         {
109                             // connect plugin object
110                             pPageView->GetView().DoConnect(const_cast< SdrOle2Obj* >(&rSdrOle2));
111                         }
112                     }
113                 }//end old stuff to rework
114 
115                 // create OLE primitive stuff directly at VC with HC as parameter
116                 const ViewContactOfSdrOle2Obj& rVC = static_cast< const ViewContactOfSdrOle2Obj& >(GetViewContact());
117                 xRetval = rVC.createPrimitive2DSequenceWithParameters(GetObjectContact().isDrawModeHighContrast());
118 
119                 if(bIsOutplaceActive)
120                 {
121                     // do not shade when printing or PDF exporting
122                     if(!GetObjectContact().isOutputToPrinter() && !GetObjectContact().isOutputToRecordingMetaFile())
123                     {
124                         // get object transformation
125                         const basegfx::B2DHomMatrix aObjectMatrix(static_cast< ViewContactOfSdrOle2Obj& >(GetViewContact()).createObjectTransform());
126 
127                         // shade the representation if the object is activated outplace
128                         basegfx::B2DPolygon aObjectOutline(basegfx::tools::createUnitPolygon());
129                         aObjectOutline.transform(aObjectMatrix);
130 
131                         // Use a FillHatchPrimitive2D with necessary attributes
132                         const drawinglayer::attribute::FillHatchAttribute aFillHatch(
133                             drawinglayer::attribute::HATCHSTYLE_SINGLE, // single hatch
134                             125.0, // 1.25 mm
135                             45.0 * F_PI180, // 45 degree diagonal
136                             Color(COL_BLACK).getBColor(), // black color
137                             3, // same default as VCL, a minimum of three discrete units (pixels) offset
138                             false); // no filling
139 
140                         const drawinglayer::primitive2d::Primitive2DReference xReference(new drawinglayer::primitive2d::PolyPolygonHatchPrimitive2D(
141                             basegfx::B2DPolyPolygon(aObjectOutline),
142                             Color(COL_BLACK).getBColor(),
143                             aFillHatch));
144 
145                         drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(xRetval, xReference);
146                     }
147                 }
148 
149             }
150 
151             return xRetval;
152         }
153 
ViewObjectContactOfSdrOle2Obj(ObjectContact & rObjectContact,ViewContact & rViewContact)154         ViewObjectContactOfSdrOle2Obj::ViewObjectContactOfSdrOle2Obj(ObjectContact& rObjectContact, ViewContact& rViewContact)
155         :   ViewObjectContactOfSdrObj(rObjectContact, rViewContact)
156         {
157         }
158 
~ViewObjectContactOfSdrOle2Obj()159         ViewObjectContactOfSdrOle2Obj::~ViewObjectContactOfSdrOle2Obj()
160         {
161         }
162     } // end of namespace contact
163 } // end of namespace sdr
164 
165 //////////////////////////////////////////////////////////////////////////////
166 // eof
167