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