1*bfd08df8SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*bfd08df8SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*bfd08df8SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*bfd08df8SAndrew Rist * distributed with this work for additional information
6*bfd08df8SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*bfd08df8SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*bfd08df8SAndrew Rist * "License"); you may not use this file except in compliance
9*bfd08df8SAndrew Rist * with the License. You may obtain a copy of the License at
10*bfd08df8SAndrew Rist *
11*bfd08df8SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*bfd08df8SAndrew Rist *
13*bfd08df8SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*bfd08df8SAndrew Rist * software distributed under the License is distributed on an
15*bfd08df8SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*bfd08df8SAndrew Rist * KIND, either express or implied. See the License for the
17*bfd08df8SAndrew Rist * specific language governing permissions and limitations
18*bfd08df8SAndrew Rist * under the License.
19*bfd08df8SAndrew Rist *
20*bfd08df8SAndrew Rist *************************************************************/
21*bfd08df8SAndrew Rist
22*bfd08df8SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_embeddedobj.hxx"
26cdf0e10cSrcweir #include <com/sun/star/embed/Aspects.hpp>
27cdf0e10cSrcweir #include <com/sun/star/embed/EmbedStates.hpp>
28cdf0e10cSrcweir #include <com/sun/star/datatransfer/XTransferable.hpp>
29cdf0e10cSrcweir #include <com/sun/star/uno/Sequence.hxx>
30cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp>
31cdf0e10cSrcweir
32cdf0e10cSrcweir #include <rtl/logfile.hxx>
33cdf0e10cSrcweir
34cdf0e10cSrcweir
35cdf0e10cSrcweir #include <commonembobj.hxx>
36cdf0e10cSrcweir
37cdf0e10cSrcweir
38cdf0e10cSrcweir using namespace ::com::sun::star;
39cdf0e10cSrcweir
setVisualAreaSize(sal_Int64 nAspect,const awt::Size & aSize)40cdf0e10cSrcweir void SAL_CALL OCommonEmbeddedObject::setVisualAreaSize( sal_Int64 nAspect, const awt::Size& aSize )
41cdf0e10cSrcweir throw ( lang::IllegalArgumentException,
42cdf0e10cSrcweir embed::WrongStateException,
43cdf0e10cSrcweir uno::Exception,
44cdf0e10cSrcweir uno::RuntimeException )
45cdf0e10cSrcweir {
46cdf0e10cSrcweir RTL_LOGFILE_CONTEXT( aLog, "embeddedobj (mv76033) OCommonEmbeddedObject::setVisualAreaSize" );
47cdf0e10cSrcweir
48cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
49cdf0e10cSrcweir if ( m_bDisposed )
50cdf0e10cSrcweir throw lang::DisposedException(); // TODO
51cdf0e10cSrcweir
52cdf0e10cSrcweir OSL_ENSURE( nAspect != embed::Aspects::MSOLE_ICON, "For iconified objects no graphical replacement is required!\n" );
53cdf0e10cSrcweir if ( nAspect == embed::Aspects::MSOLE_ICON )
54cdf0e10cSrcweir // no representation can be retrieved
55cdf0e10cSrcweir throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "Illegal call!\n" ),
56cdf0e10cSrcweir uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
57cdf0e10cSrcweir
58cdf0e10cSrcweir if ( m_nObjectState == -1 )
59cdf0e10cSrcweir throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The own object has no persistence!\n" ),
60cdf0e10cSrcweir uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
61cdf0e10cSrcweir
62cdf0e10cSrcweir m_bHasClonedSize = sal_False;
63cdf0e10cSrcweir
64cdf0e10cSrcweir sal_Bool bBackToLoaded = sal_False;
65cdf0e10cSrcweir if ( m_nObjectState == embed::EmbedStates::LOADED )
66cdf0e10cSrcweir {
67cdf0e10cSrcweir changeState( embed::EmbedStates::RUNNING );
68cdf0e10cSrcweir
69cdf0e10cSrcweir // the links should be switched back to loaded state for now to avoid locking problems
70cdf0e10cSrcweir bBackToLoaded = m_bIsLink;
71cdf0e10cSrcweir }
72cdf0e10cSrcweir
73cdf0e10cSrcweir sal_Bool bSuccess = m_pDocHolder->SetExtent( nAspect, aSize );
74cdf0e10cSrcweir
75cdf0e10cSrcweir if ( bBackToLoaded )
76cdf0e10cSrcweir changeState( embed::EmbedStates::LOADED );
77cdf0e10cSrcweir
78cdf0e10cSrcweir if ( !bSuccess )
79cdf0e10cSrcweir throw uno::Exception(); // TODO:
80cdf0e10cSrcweir }
81cdf0e10cSrcweir
getVisualAreaSize(sal_Int64 nAspect)82cdf0e10cSrcweir awt::Size SAL_CALL OCommonEmbeddedObject::getVisualAreaSize( sal_Int64 nAspect )
83cdf0e10cSrcweir throw ( lang::IllegalArgumentException,
84cdf0e10cSrcweir embed::WrongStateException,
85cdf0e10cSrcweir uno::Exception,
86cdf0e10cSrcweir uno::RuntimeException )
87cdf0e10cSrcweir {
88cdf0e10cSrcweir RTL_LOGFILE_CONTEXT( aLog, "embeddedobj (mv76033) OCommonEmbeddedObject::getVisualAreaSize" );
89cdf0e10cSrcweir
90cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
91cdf0e10cSrcweir if ( m_bDisposed )
92cdf0e10cSrcweir throw lang::DisposedException(); // TODO
93cdf0e10cSrcweir
94cdf0e10cSrcweir if ( m_nObjectState == -1 )
95cdf0e10cSrcweir throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The own object has no persistence!\n" ),
96cdf0e10cSrcweir uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
97cdf0e10cSrcweir
98cdf0e10cSrcweir OSL_ENSURE( nAspect != embed::Aspects::MSOLE_ICON, "For iconified objects no graphical replacement is required!\n" );
99cdf0e10cSrcweir
100cdf0e10cSrcweir if ( m_bHasClonedSize )
101cdf0e10cSrcweir return m_aClonedSize;
102cdf0e10cSrcweir
103cdf0e10cSrcweir sal_Bool bBackToLoaded = sal_False;
104cdf0e10cSrcweir if ( m_nObjectState == embed::EmbedStates::LOADED )
105cdf0e10cSrcweir {
106cdf0e10cSrcweir changeState( embed::EmbedStates::RUNNING );
107cdf0e10cSrcweir
108cdf0e10cSrcweir // the links should be switched back to loaded state for now to avoid locking problems
109cdf0e10cSrcweir bBackToLoaded = m_bIsLink;
110cdf0e10cSrcweir }
111cdf0e10cSrcweir
112cdf0e10cSrcweir awt::Size aResult;
113cdf0e10cSrcweir sal_Bool bSuccess = m_pDocHolder->GetExtent( nAspect, &aResult );
114cdf0e10cSrcweir
115cdf0e10cSrcweir if ( bBackToLoaded )
116cdf0e10cSrcweir changeState( embed::EmbedStates::LOADED );
117cdf0e10cSrcweir
118cdf0e10cSrcweir if ( !bSuccess )
119cdf0e10cSrcweir throw uno::Exception(); // TODO:
120cdf0e10cSrcweir
121cdf0e10cSrcweir return aResult;
122cdf0e10cSrcweir }
123cdf0e10cSrcweir
getMapUnit(sal_Int64 nAspect)124cdf0e10cSrcweir sal_Int32 SAL_CALL OCommonEmbeddedObject::getMapUnit( sal_Int64 nAspect )
125cdf0e10cSrcweir throw ( uno::Exception,
126cdf0e10cSrcweir uno::RuntimeException)
127cdf0e10cSrcweir {
128cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
129cdf0e10cSrcweir if ( m_bDisposed )
130cdf0e10cSrcweir throw lang::DisposedException(); // TODO
131cdf0e10cSrcweir
132cdf0e10cSrcweir OSL_ENSURE( nAspect != embed::Aspects::MSOLE_ICON, "For iconified objects no graphical replacement is required!\n" );
133cdf0e10cSrcweir if ( nAspect == embed::Aspects::MSOLE_ICON )
134cdf0e10cSrcweir // no representation can be retrieved
135cdf0e10cSrcweir throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "Illegal call!\n" ),
136cdf0e10cSrcweir uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
137cdf0e10cSrcweir
138cdf0e10cSrcweir if ( m_nObjectState == -1 )
139cdf0e10cSrcweir throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The own object has no persistence!\n" ),
140cdf0e10cSrcweir uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
141cdf0e10cSrcweir
142cdf0e10cSrcweir if ( m_bHasClonedSize )
143cdf0e10cSrcweir return m_nClonedMapUnit;
144cdf0e10cSrcweir
145cdf0e10cSrcweir sal_Bool bBackToLoaded = sal_False;
146cdf0e10cSrcweir if ( m_nObjectState == embed::EmbedStates::LOADED )
147cdf0e10cSrcweir {
148cdf0e10cSrcweir changeState( embed::EmbedStates::RUNNING );
149cdf0e10cSrcweir
150cdf0e10cSrcweir // the links should be switched back to loaded state for now to avoid locking problems
151cdf0e10cSrcweir bBackToLoaded = m_bIsLink;
152cdf0e10cSrcweir }
153cdf0e10cSrcweir
154cdf0e10cSrcweir sal_Int32 nResult = m_pDocHolder->GetMapUnit( nAspect );
155cdf0e10cSrcweir
156cdf0e10cSrcweir if ( bBackToLoaded )
157cdf0e10cSrcweir changeState( embed::EmbedStates::LOADED );
158cdf0e10cSrcweir
159cdf0e10cSrcweir if ( nResult < 0 )
160cdf0e10cSrcweir throw uno::Exception(); // TODO:
161cdf0e10cSrcweir
162cdf0e10cSrcweir return nResult;
163cdf0e10cSrcweir }
164cdf0e10cSrcweir
getPreferredVisualRepresentation(sal_Int64 nAspect)165cdf0e10cSrcweir embed::VisualRepresentation SAL_CALL OCommonEmbeddedObject::getPreferredVisualRepresentation( sal_Int64 nAspect )
166cdf0e10cSrcweir throw ( lang::IllegalArgumentException,
167cdf0e10cSrcweir embed::WrongStateException,
168cdf0e10cSrcweir uno::Exception,
169cdf0e10cSrcweir uno::RuntimeException )
170cdf0e10cSrcweir {
171cdf0e10cSrcweir RTL_LOGFILE_CONTEXT( aLog, "embeddedobj (mv76033) OCommonEmbeddedObject::getPrefferedVisualRepresentation" );
172cdf0e10cSrcweir
173cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
174cdf0e10cSrcweir if ( m_bDisposed )
175cdf0e10cSrcweir throw lang::DisposedException(); // TODO
176cdf0e10cSrcweir
177cdf0e10cSrcweir if ( m_nObjectState == -1 )
178cdf0e10cSrcweir throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The own object has no persistence!\n" ),
179cdf0e10cSrcweir uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
180cdf0e10cSrcweir
181cdf0e10cSrcweir
182cdf0e10cSrcweir OSL_ENSURE( nAspect != embed::Aspects::MSOLE_ICON, "For iconified objects no graphical replacement is required!\n" );
183cdf0e10cSrcweir if ( nAspect == embed::Aspects::MSOLE_ICON )
184cdf0e10cSrcweir // no representation can be retrieved
185cdf0e10cSrcweir throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "Illegal call!\n" ),
186cdf0e10cSrcweir uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
187cdf0e10cSrcweir
188cdf0e10cSrcweir sal_Bool bBackToLoaded = sal_False;
189cdf0e10cSrcweir if ( m_nObjectState == embed::EmbedStates::LOADED )
190cdf0e10cSrcweir {
191cdf0e10cSrcweir changeState( embed::EmbedStates::RUNNING );
192cdf0e10cSrcweir
193cdf0e10cSrcweir // the links should be switched back to loaded state for now to avoid locking problems
194cdf0e10cSrcweir bBackToLoaded = m_bIsLink;
195cdf0e10cSrcweir }
196cdf0e10cSrcweir
197cdf0e10cSrcweir OSL_ENSURE( m_pDocHolder->GetComponent().is(), "Running or Active object has no component!\n" );
198cdf0e10cSrcweir
199cdf0e10cSrcweir // TODO: return for the aspect of the document
200cdf0e10cSrcweir embed::VisualRepresentation aVisualRepresentation;
201cdf0e10cSrcweir
202cdf0e10cSrcweir uno::Reference< embed::XVisualObject > xVisualObject( m_pDocHolder->GetComponent(), uno::UNO_QUERY );
203cdf0e10cSrcweir if( xVisualObject.is())
204cdf0e10cSrcweir {
205cdf0e10cSrcweir aVisualRepresentation = xVisualObject->getPreferredVisualRepresentation( nAspect );
206cdf0e10cSrcweir }
207cdf0e10cSrcweir else
208cdf0e10cSrcweir {
209cdf0e10cSrcweir uno::Reference< datatransfer::XTransferable > xTransferable( m_pDocHolder->GetComponent(), uno::UNO_QUERY );
210cdf0e10cSrcweir if (!xTransferable.is() )
211cdf0e10cSrcweir throw uno::RuntimeException();
212cdf0e10cSrcweir
213cdf0e10cSrcweir datatransfer::DataFlavor aDataFlavor(
214cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "application/x-openoffice-gdimetafile;windows_formatname=\"GDIMetaFile\"" ),
215cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "GDIMetaFile" ),
216cdf0e10cSrcweir ::getCppuType( (const uno::Sequence< sal_Int8 >*) NULL ) );
217cdf0e10cSrcweir
218cdf0e10cSrcweir if( xTransferable->isDataFlavorSupported( aDataFlavor ))
219cdf0e10cSrcweir {
220cdf0e10cSrcweir aVisualRepresentation.Data = xTransferable->getTransferData( aDataFlavor );
221cdf0e10cSrcweir aVisualRepresentation.Flavor = aDataFlavor;
222cdf0e10cSrcweir }
223cdf0e10cSrcweir else
224cdf0e10cSrcweir throw uno::RuntimeException();
225cdf0e10cSrcweir }
226cdf0e10cSrcweir
227cdf0e10cSrcweir if ( bBackToLoaded )
228cdf0e10cSrcweir changeState( embed::EmbedStates::LOADED );
229cdf0e10cSrcweir
230cdf0e10cSrcweir return aVisualRepresentation;
231cdf0e10cSrcweir }
232cdf0e10cSrcweir
233