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 1621 : SfxObjectShell* SfxObjectShell::GetParentShellByModel_Impl()
45 : {
46 1621 : SfxObjectShell* pResult = NULL;
47 :
48 : try {
49 1621 : uno::Reference< container::XChild > xChildModel( GetModel(), uno::UNO_QUERY );
50 1621 : if ( xChildModel.is() )
51 : {
52 1621 : uno::Reference< lang::XUnoTunnel > xParentTunnel( xChildModel->getParent(), uno::UNO_QUERY );
53 1573 : if ( xParentTunnel.is() )
54 : {
55 1144 : SvGlobalName aSfxIdent( SFX_GLOBAL_CLASSID );
56 1144 : pResult = reinterpret_cast<SfxObjectShell*>(xParentTunnel->getSomething(
57 1144 : uno::Sequence< sal_Int8 >( aSfxIdent.GetByteSequence() ) ) );
58 1573 : }
59 1621 : }
60 : }
61 48 : catch( uno::Exception& )
62 : {
63 : // TODO: error handling
64 : }
65 :
66 1621 : return pResult;
67 : }
68 :
69 : // -----------------------------------------------------------------------
70 1176 : Printer* SfxObjectShell::GetDocumentPrinter()
71 : {
72 1176 : SfxObjectShell* pParent = GetParentShellByModel_Impl();
73 1176 : if ( pParent )
74 858 : return pParent->GetDocumentPrinter();
75 318 : return NULL;
76 : }
77 :
78 : // -----------------------------------------------------------------------
79 445 : OutputDevice* SfxObjectShell::GetDocumentRefDev()
80 : {
81 445 : SfxObjectShell* pParent = GetParentShellByModel_Impl();
82 445 : if ( pParent )
83 286 : return pParent->GetDocumentRefDev();
84 159 : return NULL;
85 : }
86 :
87 : // -----------------------------------------------------------------------
88 0 : void SfxObjectShell::OnDocumentPrinterChanged( Printer* /*pNewPrinter*/ )
89 : {
90 : // virtual method
91 0 : }
92 :
93 : // -----------------------------------------------------------------------
94 11973 : Rectangle SfxObjectShell::GetVisArea( sal_uInt16 nAspect ) const
95 : {
96 11973 : if( nAspect == ASPECT_CONTENT )
97 11973 : 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 3914 : const Rectangle& SfxObjectShell::GetVisArea() const
110 : {
111 3914 : pImp->m_aVisArea = GetVisArea( ASPECT_CONTENT );
112 3914 : return pImp->m_aVisArea;
113 : }
114 :
115 : // -----------------------------------------------------------------------
116 1309 : void SfxObjectShell::SetVisArea( const Rectangle & rVisArea )
117 : {
118 1309 : if( pImp->m_aVisArea != rVisArea )
119 : {
120 1004 : pImp->m_aVisArea = rVisArea;
121 1004 : if ( GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
122 : {
123 445 : if ( IsEnableSetModified() )
124 11 : SetModified( sal_True );
125 :
126 445 : SFX_APP()->NotifyEvent(SfxEventHint( SFX_EVENT_VISAREACHANGED, GlobalEventConfig::GetEventName(STR_EVENT_VISAREACHANGED), this));
127 : }
128 : }
129 1309 : }
130 :
131 : // -----------------------------------------------------------------------
132 448 : void SfxObjectShell::SetVisAreaSize( const Size & rVisSize )
133 : {
134 448 : SetVisArea( Rectangle( GetVisArea().TopLeft(), rVisSize ) );
135 448 : }
136 :
137 : // -----------------------------------------------------------------------
138 0 : sal_uIntPtr SfxObjectShell::GetMiscStatus() const
139 : {
140 0 : return 0;
141 : }
142 :
143 : // -----------------------------------------------------------------------
144 8074 : MapUnit SfxObjectShell::GetMapUnit() const
145 : {
146 8074 : return pImp->m_nMapUnit;
147 : }
148 :
149 : // -----------------------------------------------------------------------
150 279 : void SfxObjectShell::SetMapUnit( MapUnit nMapUnit )
151 : {
152 279 : pImp->m_nMapUnit = nMapUnit;
153 279 : }
154 :
155 : // -----------------------------------------------------------------------
156 0 : void SfxObjectShell::FillTransferableObjectDescriptor( TransferableObjectDescriptor& rDesc ) const
157 : {
158 : sal_uInt32 nClipFormat;
159 0 : String aAppName, aShortName;
160 0 : FillClass( &rDesc.maClassName, &nClipFormat, &aAppName, &rDesc.maTypeName, &aShortName, SOFFICE_FILEFORMAT_CURRENT );
161 :
162 0 : rDesc.mnViewAspect = ASPECT_CONTENT;
163 0 : rDesc.mnOle2Misc = GetMiscStatus();
164 0 : rDesc.maSize = OutputDevice::LogicToLogic( GetVisArea().GetSize(), GetMapUnit(), MAP_100TH_MM );
165 0 : rDesc.maDragStartPos = Point();
166 0 : rDesc.maDisplayName = String();
167 0 : rDesc.mbCanLink = sal_False;
168 0 : }
169 :
170 : // -----------------------------------------------------------------------
171 2291 : void SfxObjectShell::DoDraw( OutputDevice* pDev,
172 : const Point & rObjPos,
173 : const Size & rSize,
174 : const JobSetup & rSetup,
175 : sal_uInt16 nAspect )
176 : {
177 2291 : MapMode aMod = pDev->GetMapMode();
178 2291 : Size aSize = GetVisArea( nAspect ).GetSize();
179 2291 : MapMode aWilliMode( GetMapUnit() );
180 2291 : aSize = pDev->LogicToLogic( aSize, &aWilliMode, &aMod );
181 2291 : if( aSize.Width() && aSize.Height() )
182 : {
183 2291 : Fraction aXF( rSize.Width(), aSize.Width() );
184 2291 : Fraction aYF( rSize.Height(), aSize.Height() );
185 :
186 2291 : DoDraw_Impl( pDev, rObjPos, aXF, aYF, rSetup, nAspect );
187 2291 : }
188 2291 : }
189 :
190 : // -----------------------------------------------------------------------
191 2291 : 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 2291 : Rectangle aVisArea = GetVisArea( nAspect );
199 : // MapUnit des Ziels
200 2291 : MapMode aMapMode( GetMapUnit() );
201 2291 : aMapMode.SetScaleX( rScaleX );
202 2291 : aMapMode.SetScaleY( rScaleY );
203 :
204 : // Target in Pixels
205 2291 : Point aOrg = pDev->LogicToLogic( rViewPos, NULL, &aMapMode );
206 2291 : Point aDelta = aOrg - aVisArea.TopLeft();
207 :
208 : // Origin moved according to the viewable area
209 : // Origin set with Scale
210 2291 : aMapMode.SetOrigin( aDelta );
211 :
212 : // Secure the Device settings
213 2291 : pDev->Push();
214 :
215 2291 : Region aRegion;
216 2291 : if( pDev->IsClipRegion() && pDev->GetOutDevType() != OUTDEV_PRINTER )
217 : {
218 0 : aRegion = pDev->GetClipRegion();
219 0 : aRegion = pDev->LogicToPixel( aRegion );
220 : }
221 2291 : pDev->SetRelativeMapMode( aMapMode );
222 :
223 2291 : GDIMetaFile * pMtf = pDev->GetConnectMetaFile();
224 2291 : if( pMtf )
225 : {
226 2291 : if( pMtf->IsRecord() && pDev->GetOutDevType() != OUTDEV_PRINTER )
227 2291 : pMtf->Stop();
228 : else
229 0 : pMtf = NULL;
230 : }
231 2291 : if( pDev->IsClipRegion() && pDev->GetOutDevType() != OUTDEV_PRINTER )
232 : {
233 0 : aRegion = pDev->PixelToLogic( aRegion );
234 0 : pDev->SetClipRegion( aRegion );
235 : }
236 2291 : if( pMtf )
237 2291 : pMtf->Record( pDev );
238 :
239 2291 : Draw( pDev, rSetup, nAspect );
240 :
241 : // Restore Device settings
242 2291 : pDev->Pop();
243 :
244 2291 : }
245 :
246 5564 : comphelper::EmbeddedObjectContainer& SfxObjectShell::GetEmbeddedObjectContainer() const
247 : {
248 5564 : if ( !pImp->mpObjectContainer )
249 451 : pImp->mpObjectContainer = new comphelper::EmbeddedObjectContainer( ((SfxObjectShell*)this)->GetStorage(), GetModel() );
250 5564 : return *pImp->mpObjectContainer;
251 : }
252 :
253 0 : void SfxObjectShell::ClearEmbeddedObjects()
254 : {
255 : // frees alle space taken by embedded objects
256 0 : DELETEZ( pImp->mpObjectContainer );
257 0 : }
258 :
259 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|