xref: /AOO41X/main/embeddedobj/source/commonembedding/specialobject.cxx (revision bfd08df8d53be340829eb05b5154718deb4e1b3d)
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_embeddedobj.hxx"
26 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
27 #include <com/sun/star/embed/EmbedStates.hpp>
28 #include <com/sun/star/embed/EmbedVerbs.hpp>
29 #include <com/sun/star/embed/EmbedUpdateModes.hpp>
30 #include <com/sun/star/embed/XEmbeddedClient.hpp>
31 #include <com/sun/star/embed/XInplaceClient.hpp>
32 #include <com/sun/star/embed/XWindowSupplier.hpp>
33 #include <com/sun/star/embed/Aspects.hpp>
34 #include <com/sun/star/awt/XWindowPeer.hpp>
35 #include <com/sun/star/util/XCloseBroadcaster.hpp>
36 #include <com/sun/star/util/XCloseable.hpp>
37 #include <com/sun/star/util/XModifiable.hpp>
38 #include <com/sun/star/frame/XFrame.hpp>
39 #include <com/sun/star/frame/XComponentLoader.hpp>
40 #include <com/sun/star/frame/XDispatchProviderInterception.hpp>
41 #include <com/sun/star/lang/DisposedException.hpp>
42 #include <com/sun/star/embed/EmbedMapUnits.hpp>
43 
44 #include <cppuhelper/typeprovider.hxx>
45 
46 #include "specialobject.hxx"
47 #include "intercept.hxx"
48 
49 using namespace ::com::sun::star;
50 
51 
OSpecialEmbeddedObject(const uno::Reference<lang::XMultiServiceFactory> & xFactory,const uno::Sequence<beans::NamedValue> & aObjectProps)52 OSpecialEmbeddedObject::OSpecialEmbeddedObject( const uno::Reference< lang::XMultiServiceFactory >& xFactory, const uno::Sequence< beans::NamedValue >& aObjectProps )
53 : OCommonEmbeddedObject( xFactory, aObjectProps )
54 {
55     maSize.Width = maSize.Height = 10000;
56     m_nObjectState = embed::EmbedStates::LOADED;
57 }
58 
59 //------------------------------------------------------
queryInterface(const uno::Type & rType)60 uno::Any SAL_CALL OSpecialEmbeddedObject::queryInterface( const uno::Type& rType )
61         throw( uno::RuntimeException )
62 {
63     uno::Any aReturn;
64 
65     aReturn <<= ::cppu::queryInterface( rType,
66                                         static_cast< embed::XEmbeddedObject* >( this ),
67                                         static_cast< embed::XInplaceObject* >( this ),
68                                         static_cast< embed::XVisualObject* >( this ),
69                                         static_cast< embed::XClassifiedObject* >( this ),
70                                         static_cast< embed::XComponentSupplier* >( this ),
71                                         static_cast< util::XCloseable* >( this ),
72                                         static_cast< document::XEventBroadcaster* >( this ) );
73     if ( aReturn.hasValue() )
74         return aReturn;
75     else
76         return ::cppu::OWeakObject::queryInterface( rType ) ;
77 
78 }
79 
80 //------------------------------------------------------
getTypes()81 uno::Sequence< uno::Type > SAL_CALL OSpecialEmbeddedObject::getTypes()
82         throw( uno::RuntimeException )
83 {
84     static ::cppu::OTypeCollection* pTypeCollection = NULL;
85 
86     if ( !pTypeCollection )
87     {
88         ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
89         if ( !pTypeCollection )
90         {
91             static ::cppu::OTypeCollection aTypeCollection(
92                                         ::getCppuType( (const uno::Reference< lang::XTypeProvider >*)NULL ),
93                                         ::getCppuType( (const uno::Reference< embed::XEmbeddedObject >*)NULL ),
94                                         ::getCppuType( (const uno::Reference< embed::XInplaceObject >*)NULL ) );
95 
96             pTypeCollection = &aTypeCollection ;
97         }
98     }
99 
100     return pTypeCollection->getTypes() ;
101 
102 }
103 
getPreferredVisualRepresentation(sal_Int64 nAspect)104 embed::VisualRepresentation SAL_CALL OSpecialEmbeddedObject::getPreferredVisualRepresentation( sal_Int64 nAspect )
105         throw ( lang::IllegalArgumentException,
106                 embed::WrongStateException,
107                 uno::Exception,
108                 uno::RuntimeException )
109 {
110     ::osl::MutexGuard aGuard( m_aMutex );
111     if ( m_bDisposed )
112         throw lang::DisposedException(); // TODO
113 
114     // TODO: if object is in loaded state it should switch itself to the running state
115     if ( m_nObjectState == -1 || m_nObjectState == embed::EmbedStates::LOADED )
116         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The own object has no model!\n" ),
117                                     uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
118 
119     OSL_ENSURE( nAspect != embed::Aspects::MSOLE_ICON, "For iconified objects no graphical replacement is required!\n" );
120     if ( nAspect == embed::Aspects::MSOLE_ICON )
121         // no representation can be retrieved
122         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "Illegal call!\n" ),
123                                     uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
124 
125     // TODO: return for the aspect of the document
126     embed::VisualRepresentation aVisualRepresentation;
127     /*
128     OSL_ENSURE( m_pDocHolder->GetComponent().is(), "Running or Active object has no component!\n" );
129     uno::Reference< datatransfer::XTransferable > xTransferable( m_pDocHolder->GetComponent(), uno::UNO_QUERY );
130     if ( !xTransferable.is() )
131         throw uno::RuntimeException();
132 
133     datatransfer::DataFlavor aDataFlavor(
134             ::rtl::OUString::createFromAscii( "application/x-openoffice-gdimetafile;windows_formatname=\"GDIMetaFile\"" ),
135             ::rtl::OUString::createFromAscii( "GDIMetaFile" ),
136             ::getCppuType( (const uno::Sequence< sal_Int8 >*) NULL ) );
137 
138     aVisualRepresentation.Data = xTransferable->getTransferData( aDataFlavor );
139     aVisualRepresentation.Flavor = aDataFlavor;*/
140     return aVisualRepresentation;
141 }
142 
setVisualAreaSize(sal_Int64 nAspect,const awt::Size & aSize)143 void SAL_CALL OSpecialEmbeddedObject::setVisualAreaSize( sal_Int64 nAspect, const awt::Size& aSize )
144         throw ( lang::IllegalArgumentException,
145                 embed::WrongStateException,
146                 uno::Exception,
147                 uno::RuntimeException )
148 {
149     ::osl::MutexGuard aGuard( m_aMutex );
150     if ( m_bDisposed )
151         throw lang::DisposedException(); // TODO
152 
153     OSL_ENSURE( nAspect != embed::Aspects::MSOLE_ICON, "For iconified objects no graphical replacement is required!\n" );
154     if ( nAspect == embed::Aspects::MSOLE_ICON )
155         // no representation can be retrieved
156         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "Illegal call!\n" ),
157                                     uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
158 
159     maSize = aSize;
160 }
161 
getVisualAreaSize(sal_Int64 nAspect)162 awt::Size SAL_CALL OSpecialEmbeddedObject::getVisualAreaSize( sal_Int64 nAspect )
163         throw ( lang::IllegalArgumentException,
164                 embed::WrongStateException,
165                 uno::Exception,
166                 uno::RuntimeException )
167 {
168     ::osl::MutexGuard aGuard( m_aMutex );
169     if ( m_bDisposed )
170         throw lang::DisposedException(); // TODO
171 
172     OSL_ENSURE( nAspect != embed::Aspects::MSOLE_ICON, "For iconified objects no graphical replacement is required!\n" );
173     if ( nAspect == embed::Aspects::MSOLE_ICON )
174         // no representation can be retrieved
175         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "Illegal call!\n" ),
176                                     uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
177 
178     if ( m_nObjectState == -1 )
179         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The own object has no model!\n" ),
180                                     uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
181 
182     awt::Size aResult;
183     return maSize;
184 }
185 
getMapUnit(sal_Int64 nAspect)186 sal_Int32 SAL_CALL OSpecialEmbeddedObject::getMapUnit( sal_Int64 nAspect )
187         throw ( uno::Exception,
188                 uno::RuntimeException)
189 {
190     ::osl::MutexGuard aGuard( m_aMutex );
191     if ( m_bDisposed )
192         throw lang::DisposedException(); // TODO
193 
194     OSL_ENSURE( nAspect != embed::Aspects::MSOLE_ICON, "For iconified objects no graphical replacement is required!\n" );
195     if ( nAspect == embed::Aspects::MSOLE_ICON )
196         // no representation can be retrieved
197         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "Illegal call!\n" ),
198                                     uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
199 
200     return embed::EmbedMapUnits::ONE_100TH_MM;
201 }
202 
changeState(sal_Int32 nNewState)203 void SAL_CALL OSpecialEmbeddedObject::changeState( sal_Int32 nNewState )
204         throw ( ::com::sun::star::embed::UnreachableStateException,
205                 ::com::sun::star::embed::WrongStateException,
206                 ::com::sun::star::uno::Exception,
207                 ::com::sun::star::uno::RuntimeException )
208 {
209     if ( nNewState == embed::EmbedStates::UI_ACTIVE )
210         nNewState = embed::EmbedStates::INPLACE_ACTIVE;
211     OCommonEmbeddedObject::changeState( nNewState );
212 }
213 
doVerb(sal_Int32 nVerbID)214 void SAL_CALL OSpecialEmbeddedObject::doVerb( sal_Int32 nVerbID )
215         throw ( lang::IllegalArgumentException,
216                 embed::WrongStateException,
217                 embed::UnreachableStateException,
218                 uno::Exception,
219                 uno::RuntimeException )
220 {
221     ::osl::MutexGuard aGuard( m_aMutex );
222     if ( m_bDisposed )
223         throw lang::DisposedException(); // TODO
224 
225     if ( m_nObjectState == -1 )
226         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The object has no persistence!\n" ),
227                                         uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
228 
229     if ( nVerbID == -7 )
230     {
231 
232         uno::Reference < ui::dialogs::XExecutableDialog > xDlg( m_pDocHolder->GetComponent(), uno::UNO_QUERY );
233         if ( xDlg.is() )
234             xDlg->execute();
235         else
236             throw embed::UnreachableStateException();
237     }
238     else
239         OCommonEmbeddedObject::doVerb( nVerbID );
240 }
241 
242