xref: /trunk/main/embeddedobj/source/commonembedding/embedobj.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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/embed/EmbedStates.hpp>
27 #include <com/sun/star/embed/EmbedVerbs.hpp>
28 #include <com/sun/star/embed/EmbedUpdateModes.hpp>
29 #include <com/sun/star/embed/XEmbeddedClient.hpp>
30 #include <com/sun/star/embed/XInplaceClient.hpp>
31 #include <com/sun/star/embed/XWindowSupplier.hpp>
32 #include <com/sun/star/embed/StateChangeInProgressException.hpp>
33 #include <com/sun/star/embed/Aspects.hpp>
34 
35 #include <com/sun/star/awt/XWindowPeer.hpp>
36 #include <com/sun/star/util/XCloseBroadcaster.hpp>
37 #include <com/sun/star/util/XCloseable.hpp>
38 #include <com/sun/star/util/XModifiable.hpp>
39 #include <com/sun/star/frame/XFrame.hpp>
40 #include <com/sun/star/frame/XComponentLoader.hpp>
41 #include <com/sun/star/frame/XDispatchProviderInterception.hpp>
42 #include <com/sun/star/frame/XModuleManager.hpp>
43 #include <com/sun/star/lang/DisposedException.hpp>
44 
45 #include <com/sun/star/embed/EmbedMisc.hpp>
46 
47 #include <rtl/logfile.hxx>
48 
49 #include <targetstatecontrol.hxx>
50 
51 #include "commonembobj.hxx"
52 #include "intercept.hxx"
53 
54 
55 using namespace ::com::sun::star;
56 
GetRectangleInterception(const awt::Rectangle & aRect1,const awt::Rectangle & aRect2)57 awt::Rectangle GetRectangleInterception( const awt::Rectangle& aRect1, const awt::Rectangle& aRect2 )
58 {
59     awt::Rectangle aResult;
60 
61     OSL_ENSURE( aRect1.Width >= 0 && aRect2.Width >= 0 && aRect1.Height >= 0 && aRect2.Height >= 0,
62                 "Offset must not be less then zero!" );
63 
64     aResult.X = aRect1.X > aRect2.X ? aRect1.X : aRect2.X;
65     aResult.Y = aRect1.Y > aRect2.Y ? aRect1.Y : aRect2.Y;
66 
67     sal_Int32 nRight1 = aRect1.X + aRect1.Width;
68     sal_Int32 nBottom1 = aRect1.Y + aRect1.Height;
69     sal_Int32 nRight2 = aRect2.X + aRect2.Width;
70     sal_Int32 nBottom2 = aRect2.Y + aRect2.Height;
71     aResult.Width = ( nRight1 < nRight2 ? nRight1 : nRight2 ) - aResult.X;
72     aResult.Height = ( nBottom1 < nBottom2 ? nBottom1 : nBottom2 ) - aResult.Y;
73 
74     return aResult;
75 }
76 
77 //----------------------------------------------
ConvertVerbToState_Impl(sal_Int32 nVerb)78 sal_Int32 OCommonEmbeddedObject::ConvertVerbToState_Impl( sal_Int32 nVerb )
79 {
80     for ( sal_Int32 nInd = 0; nInd < m_aVerbTable.getLength(); nInd++ )
81         if ( m_aVerbTable[nInd][0] == nVerb )
82             return m_aVerbTable[nInd][1];
83 
84     throw lang::IllegalArgumentException(); // TODO: unexpected verb provided
85 }
86 
87 //----------------------------------------------
Deactivate()88 void OCommonEmbeddedObject::Deactivate()
89 {
90     uno::Reference< util::XModifiable > xModif( m_pDocHolder->GetComponent(), uno::UNO_QUERY );
91     //MBA if ( !xModif.is() )
92     //MBA    throw uno::RuntimeException();
93 
94     // no need to lock for the initialization
95     uno::Reference< embed::XEmbeddedClient > xClientSite = m_xClientSite;
96     if ( !xClientSite.is() )
97         throw embed::WrongStateException(); //TODO: client site is not set!
98 
99     // store document if it is modified
100     if ( xModif.is() && xModif->isModified() )
101     {
102         try {
103             xClientSite->saveObject();
104         }
105         catch( embed::ObjectSaveVetoException& )
106         {
107         }
108         catch( uno::Exception& e )
109         {
110             throw embed::StorageWrappedTargetException(
111                 ::rtl::OUString::createFromAscii( "The client could not store the object!" ),
112                 uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >( this ) ),
113                 uno::makeAny( e ) );
114         }
115     }
116 
117     m_pDocHolder->CloseFrame();
118 
119     xClientSite->visibilityChanged( sal_False );
120 }
121 
122 //----------------------------------------------
StateChangeNotification_Impl(sal_Bool bBeforeChange,sal_Int32 nOldState,sal_Int32 nNewState,::osl::ResettableMutexGuard & rGuard)123 void OCommonEmbeddedObject::StateChangeNotification_Impl( sal_Bool bBeforeChange, sal_Int32 nOldState, sal_Int32 nNewState ,::osl::ResettableMutexGuard& rGuard )
124 {
125     if ( m_pInterfaceContainer )
126     {
127         ::cppu::OInterfaceContainerHelper* pContainer = m_pInterfaceContainer->getContainer(
128                             ::getCppuType( ( const uno::Reference< embed::XStateChangeListener >*) NULL ) );
129         if ( pContainer != NULL )
130         {
131             lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >( this ) );
132             ::cppu::OInterfaceIteratorHelper pIterator(*pContainer);
133 
134             // should be locked after the method is finished successfully
135             rGuard.clear();
136 
137             while (pIterator.hasMoreElements())
138             {
139                 try
140                 {
141                     if ( bBeforeChange )
142                         ((embed::XStateChangeListener*)pIterator.next())->changingState( aSource, nOldState, nNewState );
143                     else
144                         ((embed::XStateChangeListener*)pIterator.next())->stateChanged( aSource, nOldState, nNewState );
145                 }
146                 catch( uno::Exception& )
147                 {
148                     // even if the listener complains ignore it for now
149                    }
150 
151                 if ( m_bDisposed )
152                     return;
153             }
154 
155             rGuard.reset();
156         }
157     }
158 }
159 
160 //----------------------------------------------
SwitchStateTo_Impl(sal_Int32 nNextState)161 void OCommonEmbeddedObject::SwitchStateTo_Impl( sal_Int32 nNextState )
162 {
163     // TODO: may be needs interaction handler to detect wherether the object state
164     //         can be changed even after errors
165 
166     if ( m_nObjectState == embed::EmbedStates::LOADED )
167     {
168         if ( nNextState == embed::EmbedStates::RUNNING )
169         {
170             // after the object reaches the running state the cloned size is not necessary any more
171             m_bHasClonedSize = sal_False;
172 
173             if ( m_bIsLink )
174             {
175                 m_pDocHolder->SetComponent( LoadLink_Impl(), m_bReadOnly );
176             }
177             else
178             {
179                 uno::Reference < embed::XEmbedPersist > xPersist( static_cast < embed::XClassifiedObject* > (this), uno::UNO_QUERY );
180                 if ( xPersist.is() )
181                 {
182                     // in case embedded object is in loaded state the contents must
183                     // be stored in the related storage and the storage
184                     // must be created already
185                     if ( !m_xObjectStorage.is() )
186                         throw io::IOException(); //TODO: access denied
187 
188                     m_pDocHolder->SetComponent( LoadDocumentFromStorage_Impl(), m_bReadOnly );
189                 }
190                 else
191                 {
192                     // objects without persistence will be initialized internally
193                     uno::Sequence < uno::Any > aArgs(1);
194                     aArgs[0] <<= uno::Reference < embed::XEmbeddedObject >( this );
195                     uno::Reference< util::XCloseable > xDocument(
196                             m_xFactory->createInstanceWithArguments( GetDocumentServiceName(), aArgs ), uno::UNO_QUERY );
197 
198                     uno::Reference < container::XChild > xChild( xDocument, uno::UNO_QUERY );
199                     if ( xChild.is() )
200                         xChild->setParent( m_xParent );
201 
202                     m_pDocHolder->SetComponent( xDocument, m_bReadOnly );
203                 }
204             }
205 
206             if ( !m_pDocHolder->GetComponent().is() )
207                 throw embed::UnreachableStateException(); //TODO: can't open document
208 
209             m_nObjectState = nNextState;
210         }
211         else
212         {
213             OSL_ENSURE( sal_False, "Unacceptable state switch!\n" );
214             throw uno::RuntimeException(); // TODO
215         }
216     }
217     else if ( m_nObjectState == embed::EmbedStates::RUNNING )
218     {
219         if ( nNextState == embed::EmbedStates::LOADED )
220         {
221             m_nClonedMapUnit = m_pDocHolder->GetMapUnit( embed::Aspects::MSOLE_CONTENT );
222             m_bHasClonedSize = m_pDocHolder->GetExtent( embed::Aspects::MSOLE_CONTENT, &m_aClonedSize );
223 
224             // actually frame should not exist at this point
225             m_pDocHolder->CloseDocument( sal_False, sal_False );
226 
227             m_nObjectState = nNextState;
228         }
229         else
230         {
231             if ( nNextState == embed::EmbedStates::INPLACE_ACTIVE )
232             {
233                 if ( !m_xClientSite.is() )
234                     throw embed::WrongStateException(
235                         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "client site not set, yet" ) ),
236                         *this
237                 );
238 
239                 uno::Reference< embed::XInplaceClient > xInplaceClient( m_xClientSite, uno::UNO_QUERY );
240                 if ( xInplaceClient.is() && xInplaceClient->canInplaceActivate() )
241                 {
242                     xInplaceClient->activatingInplace();
243 
244                     uno::Reference< embed::XWindowSupplier > xClientWindowSupplier( xInplaceClient, uno::UNO_QUERY );
245                     if ( !xClientWindowSupplier.is() )
246                         throw uno::RuntimeException(); // TODO: the inplace client implementation must support XWinSupp
247 
248                     m_xClientWindow = xClientWindowSupplier->getWindow();
249                     m_aOwnRectangle = xInplaceClient->getPlacement();
250                     m_aClipRectangle = xInplaceClient->getClipRectangle();
251                     awt::Rectangle aRectangleToShow = GetRectangleInterception( m_aOwnRectangle, m_aClipRectangle );
252 
253                     // create own window based on the client window
254                     // place and resize the window according to the rectangles
255                     uno::Reference< awt::XWindowPeer > xClientWindowPeer( m_xClientWindow, uno::UNO_QUERY );
256                     if ( !xClientWindowPeer.is() )
257                         throw uno::RuntimeException(); // TODO: the container window must support the interface
258 
259                     // dispatch provider may not be provided
260                     uno::Reference< frame::XDispatchProvider > xContainerDP = xInplaceClient->getInplaceDispatchProvider();
261                     sal_Bool bOk = m_pDocHolder->ShowInplace( xClientWindowPeer, aRectangleToShow, xContainerDP );
262                     m_nObjectState = nNextState;
263                     if ( !bOk )
264                     {
265                         SwitchStateTo_Impl( embed::EmbedStates::RUNNING );
266                         throw embed::WrongStateException(); //TODO: can't activate inplace
267                     }
268                 }
269                 else
270                     throw embed::WrongStateException(); //TODO: can't activate inplace
271             }
272             else if ( nNextState == embed::EmbedStates::ACTIVE )
273             {
274                 if ( !m_xClientSite.is() )
275                     throw embed::WrongStateException(); //TODO: client site is not set!
276 
277                 // create frame and load document in the frame
278                 m_pDocHolder->Show();
279 
280                 m_xClientSite->visibilityChanged( sal_True );
281                 m_nObjectState = nNextState;
282             }
283             else
284             {
285                 OSL_ENSURE( sal_False, "Unacceptable state switch!\n" );
286                 throw uno::RuntimeException(); // TODO
287             }
288         }
289     }
290     else if ( m_nObjectState == embed::EmbedStates::INPLACE_ACTIVE )
291     {
292         if ( nNextState == embed::EmbedStates::RUNNING )
293         {
294             uno::Reference< embed::XInplaceClient > xInplaceClient( m_xClientSite, uno::UNO_QUERY );
295             if ( !xInplaceClient.is() )
296                 throw uno::RuntimeException();
297 
298             m_xClientSite->visibilityChanged( sal_True );
299 
300             xInplaceClient->deactivatedInplace();
301             Deactivate();
302             m_nObjectState = nNextState;
303         }
304         else if ( nNextState == embed::EmbedStates::UI_ACTIVE )
305         {
306             if ( !(m_nMiscStatus & embed::EmbedMisc::MS_EMBED_NOUIACTIVATE) )
307             {
308                 uno::Reference< embed::XInplaceClient > xInplaceClient( m_xClientSite, uno::UNO_QUERY_THROW );
309                 // TODO:
310                 uno::Reference< ::com::sun::star::frame::XLayoutManager > xContainerLM =
311                             xInplaceClient->getLayoutManager();
312                 if ( xContainerLM.is() )
313                 {
314                     // dispatch provider may not be provided
315                     uno::Reference< frame::XDispatchProvider > xContainerDP = xInplaceClient->getInplaceDispatchProvider();
316 
317                     // get the container module name
318                     ::rtl::OUString aModuleName;
319                     try
320                     {
321                         uno::Reference< embed::XComponentSupplier > xCompSupl( m_xClientSite, uno::UNO_QUERY_THROW );
322                         uno::Reference< uno::XInterface > xContDoc( xCompSupl->getComponent(), uno::UNO_QUERY_THROW );
323 
324                         uno::Reference< frame::XModuleManager > xManager(
325                             m_xFactory->createInstance(
326                                     ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ModuleManager" ) ) ),
327                             uno::UNO_QUERY_THROW );
328 
329                         aModuleName = xManager->identify( xContDoc );
330                     }
331                     catch( uno::Exception& )
332                     {}
333 
334                     // if currently another object is UIactive it will be deactivated; usually this will activate the LM of
335                     // the container. Locking the LM will prevent flicker.
336                     xContainerLM->lock();
337                     xInplaceClient->activatingUI();
338                     sal_Bool bOk = m_pDocHolder->ShowUI( xContainerLM, xContainerDP, aModuleName );
339                     xContainerLM->unlock();
340 
341                     if ( bOk )
342                     {
343                         m_nObjectState = nNextState;
344                         m_pDocHolder->ResizeHatchWindow();
345                     }
346                     else
347                     {
348                         xInplaceClient->deactivatedUI();
349                         throw embed::WrongStateException(); //TODO: can't activate UI
350                     }
351                 }
352                 else
353                     throw embed::WrongStateException(); //TODO: can't activate UI
354             }
355         }
356         else
357         {
358             OSL_ENSURE( sal_False, "Unacceptable state switch!\n" );
359             throw uno::RuntimeException(); // TODO
360         }
361     }
362     else if ( m_nObjectState == embed::EmbedStates::ACTIVE )
363     {
364         if ( nNextState == embed::EmbedStates::RUNNING )
365         {
366             Deactivate();
367             m_nObjectState = nNextState;
368         }
369         else
370         {
371             OSL_ENSURE( sal_False, "Unacceptable state switch!\n" );
372             throw uno::RuntimeException(); // TODO
373         }
374     }
375     else if ( m_nObjectState == embed::EmbedStates::UI_ACTIVE )
376     {
377         if ( nNextState == embed::EmbedStates::INPLACE_ACTIVE )
378         {
379             uno::Reference< embed::XInplaceClient > xInplaceClient( m_xClientSite, uno::UNO_QUERY_THROW );
380             uno::Reference< ::com::sun::star::frame::XLayoutManager > xContainerLM =
381                         xInplaceClient->getLayoutManager();
382 
383             sal_Bool bOk = sal_False;
384             if ( xContainerLM.is() )
385                    bOk = m_pDocHolder->HideUI( xContainerLM );
386 
387             if ( bOk )
388             {
389                 m_nObjectState = nNextState;
390                 m_pDocHolder->ResizeHatchWindow();
391                    xInplaceClient->deactivatedUI();
392             }
393             else
394                 throw embed::WrongStateException(); //TODO: can't activate UI
395         }
396     }
397     else
398         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The object is in unacceptable state!\n" ),
399                                         uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
400 }
401 
402 //----------------------------------------------
GetIntermediateStatesSequence_Impl(sal_Int32 nNewState)403 uno::Sequence< sal_Int32 > OCommonEmbeddedObject::GetIntermediateStatesSequence_Impl( sal_Int32 nNewState )
404 {
405     sal_Int32 nCurInd = 0;
406     for ( nCurInd = 0; nCurInd < m_aAcceptedStates.getLength(); nCurInd++ )
407         if ( m_aAcceptedStates[nCurInd] == m_nObjectState )
408             break;
409 
410     if ( nCurInd == m_aAcceptedStates.getLength() )
411         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The object is in unacceptable state!\n" ),
412                                         uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
413 
414     sal_Int32 nDestInd = 0;
415     for ( nDestInd = 0; nDestInd < m_aAcceptedStates.getLength(); nDestInd++ )
416         if ( m_aAcceptedStates[nDestInd] == nNewState )
417             break;
418 
419     if ( nDestInd == m_aAcceptedStates.getLength() )
420         throw embed::UnreachableStateException(
421             ::rtl::OUString::createFromAscii( "The state either not reachable, or the object allows the state only as an intermediate one!\n" ),
422             uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ),
423             m_nObjectState,
424             nNewState );
425 
426     return m_pIntermediateStatesSeqs[nCurInd][nDestInd];
427 }
428 
429 //----------------------------------------------
changeState(sal_Int32 nNewState)430 void SAL_CALL OCommonEmbeddedObject::changeState( sal_Int32 nNewState )
431 {
432     RTL_LOGFILE_CONTEXT( aLog, "embeddedobj (mv76033) OCommonEmbeddedObject::changeState" );
433 
434     uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >( this ), uno::UNO_QUERY);
435     {
436         ::osl::ResettableMutexGuard aGuard( m_aMutex );
437         if ( m_bDisposed )
438             throw lang::DisposedException(); // TODO
439 
440         if ( m_nObjectState == -1 )
441             throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The object has no persistence!\n" ),
442                                             uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
443 
444         sal_Int32 nOldState = m_nObjectState;
445 
446         if ( m_nTargetState != -1 )
447         {
448             // means that the object is currently trying to reach the target state
449             throw embed::StateChangeInProgressException( ::rtl::OUString(),
450                                                         uno::Reference< uno::XInterface >(),
451                                                         m_nTargetState );
452         }
453         else
454         {
455             TargetStateControl_Impl aControl( m_nTargetState, nNewState );
456 
457             // in case the object is already in requested state
458             if ( m_nObjectState == nNewState )
459             {
460                 // if active object is activated again, bring it's window to top
461                 if ( m_nObjectState == embed::EmbedStates::ACTIVE )
462                     m_pDocHolder->Show();
463 
464                 return;
465             }
466 
467             // retrieve sequence of states that should be passed to reach desired state
468             uno::Sequence< sal_Int32 > aIntermediateStates = GetIntermediateStatesSequence_Impl( nNewState );
469 
470             // notify listeners that the object is going to change the state
471             StateChangeNotification_Impl( sal_True, nOldState, nNewState,aGuard );
472 
473             try {
474                 for ( sal_Int32 nInd = 0; nInd < aIntermediateStates.getLength(); nInd++ )
475                     SwitchStateTo_Impl( aIntermediateStates[nInd] );
476 
477                 SwitchStateTo_Impl( nNewState );
478             }
479             catch( uno::Exception& )
480             {
481                 if ( nOldState != m_nObjectState )
482                     // notify listeners that the object has changed the state
483                     StateChangeNotification_Impl( sal_False, nOldState, m_nObjectState, aGuard );
484 
485                 throw;
486             }
487         }
488 
489         // notify listeners that the object has changed the state
490         StateChangeNotification_Impl( sal_False, nOldState, nNewState, aGuard );
491 
492         // let the object window be shown
493         if ( nNewState == embed::EmbedStates::UI_ACTIVE || nNewState == embed::EmbedStates::INPLACE_ACTIVE )
494             PostEvent_Impl( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OnVisAreaChanged" ) ),
495                                         uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
496     }
497 }
498 
499 //----------------------------------------------
getReachableStates()500 uno::Sequence< sal_Int32 > SAL_CALL OCommonEmbeddedObject::getReachableStates()
501 {
502     if ( m_bDisposed )
503         throw lang::DisposedException(); // TODO
504 
505     if ( m_nObjectState == -1 )
506         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The object has no persistence!\n" ),
507                                         uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
508 
509     return m_aAcceptedStates;
510 }
511 
512 //----------------------------------------------
getCurrentState()513 sal_Int32 SAL_CALL OCommonEmbeddedObject::getCurrentState()
514 {
515     if ( m_bDisposed )
516         throw lang::DisposedException(); // TODO
517 
518     if ( m_nObjectState == -1 )
519         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The object has no persistence!\n" ),
520                                         uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
521 
522     return m_nObjectState;
523 }
524 
525 //----------------------------------------------
doVerb(sal_Int32 nVerbID)526 void SAL_CALL OCommonEmbeddedObject::doVerb( sal_Int32 nVerbID )
527 {
528     RTL_LOGFILE_CONTEXT( aLog, "embeddedobj (mv76033) OCommonEmbeddedObject::doVerb" );
529 
530     ::osl::ResettableMutexGuard aGuard( m_aMutex );
531     if ( m_bDisposed )
532         throw lang::DisposedException(); // TODO
533 
534     if ( m_nObjectState == -1 )
535         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The object has no persistence!\n" ),
536                                         uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
537 
538     // for internal documents this call is just a duplicate of changeState
539     sal_Int32 nNewState = -1;
540     try
541     {
542         nNewState = ConvertVerbToState_Impl( nVerbID );
543     }
544     catch( uno::Exception& )
545     {}
546 
547     if ( nNewState == -1 )
548     {
549         // TODO/LATER: Save Copy as... verb ( -8 ) is implemented by container
550         // TODO/LATER: check if the verb is a supported one and if it is produce related operation
551     }
552     else
553     {
554         aGuard.clear();
555         changeState( nNewState );
556     }
557 }
558 
559 //----------------------------------------------
getSupportedVerbs()560 uno::Sequence< embed::VerbDescriptor > SAL_CALL OCommonEmbeddedObject::getSupportedVerbs()
561 {
562     if ( m_bDisposed )
563         throw lang::DisposedException(); // TODO
564 
565     if ( m_nObjectState == -1 )
566         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The object has no persistence!\n" ),
567                                         uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
568 
569     return m_aObjectVerbs;
570 }
571 
572 //----------------------------------------------
setClientSite(const uno::Reference<embed::XEmbeddedClient> & xClient)573 void SAL_CALL OCommonEmbeddedObject::setClientSite(
574                 const uno::Reference< embed::XEmbeddedClient >& xClient )
575 {
576     ::osl::MutexGuard aGuard( m_aMutex );
577     if ( m_bDisposed )
578         throw lang::DisposedException(); // TODO
579 
580     if ( m_xClientSite != xClient)
581     {
582         if ( m_nObjectState != embed::EmbedStates::LOADED && m_nObjectState != embed::EmbedStates::RUNNING )
583             throw embed::WrongStateException(
584                                     ::rtl::OUString::createFromAscii( "The client site can not be set currently!\n" ),
585                                     uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
586 
587         m_xClientSite = xClient;
588     }
589 }
590 
591 //----------------------------------------------
getClientSite()592 uno::Reference< embed::XEmbeddedClient > SAL_CALL OCommonEmbeddedObject::getClientSite()
593 {
594     if ( m_bDisposed )
595         throw lang::DisposedException(); // TODO
596 
597     if ( m_nObjectState == -1 )
598         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The object has no persistence!\n" ),
599                                         uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
600 
601     return m_xClientSite;
602 }
603 
604 //----------------------------------------------
update()605 void SAL_CALL OCommonEmbeddedObject::update()
606 {
607     ::osl::MutexGuard aGuard( m_aMutex );
608     if ( m_bDisposed )
609         throw lang::DisposedException(); // TODO
610 
611     if ( m_nObjectState == -1 )
612         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The object has no persistence!\n" ),
613                                         uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
614 
615     PostEvent_Impl( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OnVisAreaChanged" ) ),
616                                         uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
617 }
618 
619 //----------------------------------------------
setUpdateMode(sal_Int32 nMode)620 void SAL_CALL OCommonEmbeddedObject::setUpdateMode( sal_Int32 nMode )
621 {
622     ::osl::MutexGuard aGuard( m_aMutex );
623     if ( m_bDisposed )
624         throw lang::DisposedException(); // TODO
625 
626     if ( m_nObjectState == -1 )
627         throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The object has no persistence!\n" ),
628                                         uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
629 
630     OSL_ENSURE( nMode == embed::EmbedUpdateModes::ALWAYS_UPDATE
631                     || nMode == embed::EmbedUpdateModes::EXPLICIT_UPDATE,
632                 "Unknown update mode!\n" );
633     m_nUpdateMode = nMode;
634 }
635 
636 //----------------------------------------------
getStatus(sal_Int64)637 sal_Int64 SAL_CALL OCommonEmbeddedObject::getStatus( sal_Int64 )
638 {
639     if ( m_bDisposed )
640         throw lang::DisposedException(); // TODO
641 
642     return m_nMiscStatus;
643 }
644 
645 //----------------------------------------------
setContainerName(const::rtl::OUString & sName)646 void SAL_CALL OCommonEmbeddedObject::setContainerName( const ::rtl::OUString& sName )
647 {
648     ::osl::MutexGuard aGuard( m_aMutex );
649     if ( m_bDisposed )
650         throw lang::DisposedException(); // TODO
651 
652     m_aContainerName = sName;
653 }
654 
getParent()655 com::sun::star::uno::Reference< com::sun::star::uno::XInterface > SAL_CALL OCommonEmbeddedObject::getParent()
656 {
657     return m_xParent;
658 }
659 
setParent(const com::sun::star::uno::Reference<com::sun::star::uno::XInterface> & xParent)660 void SAL_CALL OCommonEmbeddedObject::setParent( const com::sun::star::uno::Reference< com::sun::star::uno::XInterface >& xParent )
661 {
662     m_xParent = xParent;
663     if ( m_nObjectState != -1 && m_nObjectState != embed::EmbedStates::LOADED )
664     {
665         uno::Reference < container::XChild > xChild( m_pDocHolder->GetComponent(), uno::UNO_QUERY );
666         if ( xChild.is() )
667             xChild->setParent( xParent );
668     }
669 }
670 
671 // XDefaultSizeTransmitter
setDefaultSize(const::com::sun::star::awt::Size & rSize_100TH_MM)672 void SAL_CALL OCommonEmbeddedObject::setDefaultSize( const ::com::sun::star::awt::Size& rSize_100TH_MM )
673 {
674     //#i103460# charts do not necessarily have an own size within ODF files, in this case they need to use the size settings from the surrounding frame, which is made available with this method
675     m_aDefaultSizeForChart_In_100TH_MM = rSize_100TH_MM;
676 }
677