Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <com/sun/star/container/XChild.hpp>
21 : #include <com/sun/star/embed/XEmbedObjectCreator.hpp>
22 : #include <com/sun/star/embed/XComponentSupplier.hpp>
23 : #include <com/sun/star/embed/XEmbedPersist.hpp>
24 : #include <com/sun/star/util/XCloseable.hpp>
25 : #include <com/sun/star/embed/EmbedStates.hpp>
26 :
27 : #include <sfx2/objsh.hxx>
28 : #include <sfx2/app.hxx>
29 : #include "objshimp.hxx"
30 : #include <sfx2/sfx.hrc>
31 : #include <sfx2/event.hxx>
32 :
33 : #include <comphelper/seqstream.hxx>
34 : #include <comphelper/processfactory.hxx>
35 : #include <comphelper/storagehelper.hxx>
36 : #include <svtools/embedtransfer.hxx>
37 : #include <vcl/outdev.hxx>
38 : #include <vcl/gdimtf.hxx>
39 :
40 : using namespace ::com::sun::star;
41 :
42 :
43 : // TODO/LATER: this workaround must be replaced by API in future if possible
44 6702 : SfxObjectShell* SfxObjectShell::GetParentShellByModel_Impl()
45 : {
46 6702 : SfxObjectShell* pResult = NULL;
47 :
48 : try {
49 6702 : uno::Reference< container::XChild > xChildModel( GetModel(), uno::UNO_QUERY );
50 6702 : if ( xChildModel.is() )
51 : {
52 6702 : uno::Reference< lang::XUnoTunnel > xParentTunnel( xChildModel->getParent(), uno::UNO_QUERY );
53 6594 : if ( xParentTunnel.is() )
54 : {
55 4892 : SvGlobalName aSfxIdent( SFX_GLOBAL_CLASSID );
56 4892 : pResult = reinterpret_cast<SfxObjectShell*>(xParentTunnel->getSomething(
57 4892 : uno::Sequence< sal_Int8 >( aSfxIdent.GetByteSequence() ) ) );
58 6594 : }
59 6702 : }
60 : }
61 108 : catch( uno::Exception& )
62 : {
63 : // TODO: error handling
64 : }
65 :
66 6702 : return pResult;
67 : }
68 :
69 :
70 4764 : Printer* SfxObjectShell::GetDocumentPrinter()
71 : {
72 4764 : SfxObjectShell* pParent = GetParentShellByModel_Impl();
73 4764 : if ( pParent )
74 3544 : return pParent->GetDocumentPrinter();
75 1220 : return NULL;
76 : }
77 :
78 :
79 1938 : OutputDevice* SfxObjectShell::GetDocumentRefDev()
80 : {
81 1938 : SfxObjectShell* pParent = GetParentShellByModel_Impl();
82 1938 : if ( pParent )
83 1348 : return pParent->GetDocumentRefDev();
84 590 : return NULL;
85 : }
86 :
87 :
88 0 : void SfxObjectShell::OnDocumentPrinterChanged( Printer* /*pNewPrinter*/ )
89 : {
90 : // virtual method
91 0 : }
92 :
93 :
94 68317 : Rectangle SfxObjectShell::GetVisArea( sal_uInt16 nAspect ) const
95 : {
96 68317 : if( nAspect == ASPECT_CONTENT )
97 68317 : return pImp->m_aVisArea;
98 0 : else if( nAspect == ASPECT_THUMBNAIL )
99 : {
100 0 : Rectangle aRect;
101 : aRect.SetSize( OutputDevice::LogicToLogic( Size( 5000, 5000 ),
102 0 : MAP_100TH_MM, GetMapUnit() ) );
103 0 : return aRect;
104 : }
105 0 : return Rectangle();
106 : }
107 :
108 :
109 15408 : const Rectangle& SfxObjectShell::GetVisArea() const
110 : {
111 15408 : pImp->m_aVisArea = GetVisArea( ASPECT_CONTENT );
112 15408 : return pImp->m_aVisArea;
113 : }
114 :
115 :
116 29884 : void SfxObjectShell::SetVisArea( const Rectangle & rVisArea )
117 : {
118 29884 : if( pImp->m_aVisArea != rVisArea )
119 : {
120 26026 : pImp->m_aVisArea = rVisArea;
121 26026 : if ( GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
122 : {
123 2032 : if ( IsEnableSetModified() )
124 84 : SetModified( true );
125 :
126 2032 : SfxGetpApp()->NotifyEvent(SfxEventHint( SFX_EVENT_VISAREACHANGED, GlobalEventConfig::GetEventName(STR_EVENT_VISAREACHANGED), this));
127 : }
128 : }
129 29884 : }
130 :
131 :
132 1712 : void SfxObjectShell::SetVisAreaSize( const Size & rVisSize )
133 : {
134 1712 : SetVisArea( Rectangle( GetVisArea().TopLeft(), rVisSize ) );
135 1712 : }
136 :
137 :
138 24 : sal_uIntPtr SfxObjectShell::GetMiscStatus() const
139 : {
140 24 : return 0;
141 : }
142 :
143 :
144 55599 : MapUnit SfxObjectShell::GetMapUnit() const
145 : {
146 55599 : return pImp->m_nMapUnit;
147 : }
148 :
149 :
150 5056 : void SfxObjectShell::SetMapUnit( MapUnit nMapUnit )
151 : {
152 5056 : pImp->m_nMapUnit = nMapUnit;
153 5056 : }
154 :
155 :
156 72 : void SfxObjectShell::FillTransferableObjectDescriptor( TransferableObjectDescriptor& rDesc ) const
157 : {
158 : sal_uInt32 nClipFormat;
159 144 : OUString aAppName, aShortName;
160 72 : FillClass( &rDesc.maClassName, &nClipFormat, &aAppName, &rDesc.maTypeName, &aShortName, SOFFICE_FILEFORMAT_CURRENT );
161 :
162 72 : rDesc.mnViewAspect = ASPECT_CONTENT;
163 72 : rDesc.mnOle2Misc = GetMiscStatus();
164 72 : rDesc.maSize = OutputDevice::LogicToLogic( GetVisArea().GetSize(), GetMapUnit(), MAP_100TH_MM );
165 72 : rDesc.maDragStartPos = Point();
166 72 : rDesc.maDisplayName = "";
167 144 : rDesc.mbCanLink = false;
168 72 : }
169 :
170 :
171 9806 : void SfxObjectShell::DoDraw( OutputDevice* pDev,
172 : const Point & rObjPos,
173 : const Size & rSize,
174 : const JobSetup & rSetup,
175 : sal_uInt16 nAspect )
176 : {
177 9806 : MapMode aMod = pDev->GetMapMode();
178 9806 : Size aSize = GetVisArea( nAspect ).GetSize();
179 19612 : MapMode aWilliMode( GetMapUnit() );
180 9806 : aSize = pDev->LogicToLogic( aSize, &aWilliMode, &aMod );
181 9806 : if( aSize.Width() && aSize.Height() )
182 : {
183 9806 : Fraction aXF( rSize.Width(), aSize.Width() );
184 9806 : Fraction aYF( rSize.Height(), aSize.Height() );
185 :
186 9806 : DoDraw_Impl( pDev, rObjPos, aXF, aYF, rSetup, nAspect );
187 9806 : }
188 9806 : }
189 :
190 :
191 9806 : void SfxObjectShell::DoDraw_Impl( OutputDevice* pDev,
192 : const Point & rViewPos,
193 : const Fraction & rScaleX,
194 : const Fraction & rScaleY,
195 : const JobSetup & rSetup,
196 : sal_uInt16 nAspect )
197 : {
198 9806 : Rectangle aVisArea = GetVisArea( nAspect );
199 : // MapUnit des Ziels
200 9806 : MapMode aMapMode( GetMapUnit() );
201 9806 : aMapMode.SetScaleX( rScaleX );
202 9806 : aMapMode.SetScaleY( rScaleY );
203 :
204 : // Target in Pixels
205 9806 : Point aOrg = pDev->LogicToLogic( rViewPos, NULL, &aMapMode );
206 9806 : Point aDelta = aOrg - aVisArea.TopLeft();
207 :
208 : // Origin moved according to the viewable area
209 : // Origin set with Scale
210 9806 : aMapMode.SetOrigin( aDelta );
211 :
212 : // Secure the Device settings
213 9806 : pDev->Push();
214 :
215 19612 : vcl::Region aRegion;
216 9806 : if( pDev->IsClipRegion() && pDev->GetOutDevType() != OUTDEV_PRINTER )
217 : {
218 0 : aRegion = pDev->GetClipRegion();
219 0 : aRegion = pDev->LogicToPixel( aRegion );
220 : }
221 9806 : pDev->SetRelativeMapMode( aMapMode );
222 :
223 9806 : GDIMetaFile * pMtf = pDev->GetConnectMetaFile();
224 9806 : if( pMtf )
225 : {
226 9806 : if( pMtf->IsRecord() && pDev->GetOutDevType() != OUTDEV_PRINTER )
227 9806 : pMtf->Stop();
228 : else
229 0 : pMtf = NULL;
230 : }
231 9806 : if( pDev->IsClipRegion() && pDev->GetOutDevType() != OUTDEV_PRINTER )
232 : {
233 0 : aRegion = pDev->PixelToLogic( aRegion );
234 0 : pDev->SetClipRegion( aRegion );
235 : }
236 9806 : if( pMtf )
237 9806 : pMtf->Record( pDev );
238 :
239 9806 : Draw( pDev, rSetup, nAspect );
240 :
241 : // Restore Device settings
242 19612 : pDev->Pop();
243 :
244 9806 : }
245 :
246 38256 : comphelper::EmbeddedObjectContainer& SfxObjectShell::GetEmbeddedObjectContainer() const
247 : {
248 38256 : if ( !pImp->mpObjectContainer )
249 3814 : pImp->mpObjectContainer = new comphelper::EmbeddedObjectContainer( ((SfxObjectShell*)this)->GetStorage(), GetModel() );
250 38256 : return *pImp->mpObjectContainer;
251 : }
252 :
253 22 : void SfxObjectShell::ClearEmbeddedObjects()
254 : {
255 : // frees alle space taken by embedded objects
256 22 : DELETEZ( pImp->mpObjectContainer );
257 973 : }
258 :
259 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|