/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef _INC_OLEEMBOBJ_HXX_
#define _INC_OLEEMBOBJ_HXX_

#include <com/sun/star/uno/Sequence.hxx>
#include <com/sun/star/uno/Reference.hxx>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/embed/XEmbeddedObject.hpp>
#include <com/sun/star/embed/XInplaceObject.hpp>
#include <com/sun/star/embed/XVisualObject.hpp>
#include <com/sun/star/embed/XEmbedPersist.hpp>
#include <com/sun/star/embed/XLinkageSupport.hpp>
#include <com/sun/star/embed/XClassifiedObject.hpp>
#include <com/sun/star/embed/XComponentSupplier.hpp>
#include <com/sun/star/embed/VerbDescriptor.hpp>
#include <com/sun/star/document/XEventBroadcaster.hpp>
#include <com/sun/star/container/XChild.hpp>
#include <com/sun/star/util/XCloseable.hpp>
#include <com/sun/star/util/XCloseListener.hpp>
#include <cppuhelper/implbase5.hxx>

#include <osl/thread.h>

namespace cppu {
	class OMultiTypeInterfaceContainerHelper;
}

class VerbExecutionController
{
	// the following mutex is allowed to be locked only for variables initialization, so no deadlock can be caused
	::osl::Mutex	m_aVerbExecutionMutex;

	sal_Bool m_bVerbExecutionInProgress;
	oslThreadIdentifier m_nVerbExecutionThreadIdentifier;
	sal_Bool m_bChangedOnVerbExecution;

	sal_Bool m_bWasEverActive;
	sal_Int32 m_nNotificationLock;

public:

	VerbExecutionController()
	: m_bVerbExecutionInProgress( sal_False )
	, m_nVerbExecutionThreadIdentifier( 0 )
	, m_bChangedOnVerbExecution( sal_False )
	, m_bWasEverActive( sal_False )
	, m_nNotificationLock( 0 )
	{}
#ifdef WNT
	void StartControlExecution();
	sal_Bool EndControlExecution_WasModified();
	void ModificationNotificationIsDone();
#endif
	void LockNotification();
	void UnlockNotification();

	// no need to lock anything to check the value of the numeric members
	sal_Bool CanDoNotification() { return ( !m_bVerbExecutionInProgress && !m_bWasEverActive && !m_nNotificationLock ); }
	// ... or to change it
	void ObjectIsActive() { m_bWasEverActive = sal_True; }
};

class VerbExecutionControllerGuard
{
	VerbExecutionController& m_rController;
public:

	VerbExecutionControllerGuard( VerbExecutionController& rController )
	: m_rController( rController )
	{
		m_rController.LockNotification();
	}

	~VerbExecutionControllerGuard()
	{
		m_rController.UnlockNotification();
	}
};


class OleComponent;
class OwnView_Impl;
class OleEmbeddedObject : public ::cppu::WeakImplHelper5
						< ::com::sun::star::embed::XEmbeddedObject
						, ::com::sun::star::embed::XEmbedPersist
						, ::com::sun::star::embed::XLinkageSupport
                        , ::com::sun::star::embed::XInplaceObject
                        , ::com::sun::star::container::XChild >
{
	friend class OleComponent;

	::osl::Mutex	m_aMutex;

	OleComponent*	m_pOleComponent;

	::cppu::OMultiTypeInterfaceContainerHelper* m_pInterfaceContainer;

	sal_Bool m_bReadOnly;

	sal_Int32 m_bDisposed;
	sal_Int32 m_nObjectState;
	sal_Int32 m_nTargetState;
	sal_Int32 m_nUpdateMode;

	::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xFactory;

	::com::sun::star::uno::Sequence< sal_Int8 > m_aClassID;
	::rtl::OUString m_aClassName;

	::com::sun::star::uno::Reference< ::com::sun::star::embed::XEmbeddedClient > m_xClientSite;

	::rtl::OUString m_aContainerName;

	::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseListener > m_xClosePreventer;

	sal_Bool m_bWaitSaveCompleted;
	sal_Bool m_bNewVisReplInStream;
	::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > m_xNewCachedVisRepl;
	::rtl::OUString m_aNewEntryName;
	::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > m_xNewParentStorage;
	::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > m_xNewObjectStream;
	sal_Bool m_bStoreLoaded;

	::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > m_xCachedVisualRepresentation;
	sal_Bool m_bVisReplInitialized;
	sal_Bool m_bVisReplInStream;
	sal_Bool m_bStoreVisRepl;

	sal_Bool m_bIsLink;

	// TODO/LATER: may need to cache more than one aspect in future
	sal_Bool m_bHasCachedSize; // the object has cached size
	::com::sun::star::awt::Size m_aCachedSize;
	sal_Int64 m_nCachedAspect;

	sal_Bool m_bHasSizeToSet;  // the object has cached size that should be set to OLE component
	::com::sun::star::awt::Size m_aSizeToSet; // this size might be different from the cached one ( scaling is applied )
	sal_Int64 m_nAspectToSet;


	// cache the status of the object
	// TODO/LATER: may need to cache more than one aspect in future
	sal_Bool m_bGotStatus;
	sal_Int64 m_nStatus;
	sal_Int64 m_nStatusAspect;

	// embedded object related stuff
	::rtl::OUString m_aEntryName;
	::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > m_xParentStorage;
	::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > m_xObjectStream;

	// link related stuff
	::rtl::OUString m_aLinkURL; // ???

	// points to own view provider if the the object has no server
	OwnView_Impl*	m_pOwnView;

	// whether the object should be initialized from clipboard in case of default initialization
	sal_Bool m_bFromClipboard;

	::rtl::OUString m_aTempURL;

	::rtl::OUString m_aTempDumpURL;

	// STAMPIT solution
	// the following member is used during verb execution to detect whether the verb execution modifies the object
	VerbExecutionController m_aVerbExecutionController;
	
    // if the following member is set, the object works in wrapper mode
    ::com::sun::star::uno::Reference< ::com::sun::star::embed::XEmbeddedObject > m_xWrappedObject;
    sal_Bool m_bTriedConversion;

    ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xParent;

protected:

	::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > TryToGetAcceptableFormat_Impl(
									const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xStream )
		throw ( ::com::sun::star::uno::Exception );

	::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > GetNewFilledTempStream_Impl(
									const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xInStream )
		throw( ::com::sun::star::io::IOException );
#ifdef WNT
	void SwitchComponentToRunningState_Impl();
#endif
	void MakeEventListenerNotification_Impl( const ::rtl::OUString& aEventName );
#ifdef WNT
	void StateChangeNotification_Impl( sal_Bool bBeforeChange, sal_Int32 nOldState, sal_Int32 nNewState );
	::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > GetStreamForSaving();


	::com::sun::star::uno::Sequence< sal_Int32 > GetIntermediateVerbsSequence_Impl( sal_Int32 nNewState );

	::com::sun::star::uno::Sequence< sal_Int32 > GetReachableStatesList_Impl(
						const ::com::sun::star::uno::Sequence< ::com::sun::star::embed::VerbDescriptor >& aVerbList );
#endif

	void CloseComponent();
	void Dispose();

	void SwitchOwnPersistence(
				const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xNewParentStorage,
				const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xNewObjectStream,
				const ::rtl::OUString& aNewName );

	void SwitchOwnPersistence(
				const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xNewParentStorage,
				const ::rtl::OUString& aNewName );

	void GetRidOfComponent();

	void StoreToLocation_Impl(
							const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage,
							const ::rtl::OUString& sEntName,
							const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments,
							const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs,
							sal_Bool bSaveAs )
		throw ( ::com::sun::star::uno::Exception );
#ifdef WNT
	void StoreObjectToStream( ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > xOutStream )
		throw ( ::com::sun::star::uno::Exception );
#endif
	void InsertVisualCache_Impl(
			const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xTargetStream,
			const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xCachedVisualRepresentation )
		throw ( ::com::sun::star::uno::Exception );

	void RemoveVisualCache_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xTargetStream )
		throw ( ::com::sun::star::uno::Exception );

	void SetVisReplInStream( sal_Bool bExists );
	sal_Bool HasVisReplInStream();

	::com::sun::star::embed::VisualRepresentation GetVisualRepresentationInNativeFormat_Impl(
					const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > xCachedVisRepr )
		throw ( ::com::sun::star::uno::Exception );

	::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > TryToRetrieveCachedVisualRepresentation_Impl(
					const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xStream,
					sal_Bool bAllowRepair50 = sal_False )
		throw ();
#ifdef WNT
	sal_Bool SaveObject_Impl();
	sal_Bool OnShowWindow_Impl( sal_Bool bShow );
	void CreateOleComponent_Impl( OleComponent* pOleComponent = NULL );
	void CreateOleComponentAndLoad_Impl( OleComponent* pOleComponent = NULL );
	void CreateOleComponentFromClipboard_Impl( OleComponent* pOleComponent = NULL );
#endif
	void SetObjectIsLink_Impl( sal_Bool bIsLink ) { m_bIsLink = bIsLink; }

#ifdef WNT
	::rtl::OUString CreateTempURLEmpty_Impl();
	::rtl::OUString GetTempURL_Impl();
#endif
	::rtl::OUString GetContainerName_Impl() { return m_aContainerName; }

    // the following 4 methods are related to switch to wrapping mode
    void MoveListeners();
    ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > CreateTemporarySubstorage( ::rtl::OUString& o_aStorageName );
    ::rtl::OUString MoveToTemporarySubstream();
    sal_Bool TryToConvertToOOo();

public:
	// in case a new object must be created the class ID must be specified
	OleEmbeddedObject( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xFactory,
						const ::com::sun::star::uno::Sequence< sal_Int8 >& aClassID,
						const ::rtl::OUString& aClassName );

	// in case object will be loaded from a persistent entry or from a file the class ID will be detected on loading
	// factory can do it for OOo objects, but for OLE objects OS dependent code is required
	OleEmbeddedObject( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xFactory,
						sal_Bool bLink );
#ifdef WNT
	// this constructor let object be initialized from clipboard
	OleEmbeddedObject( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xFactory );
#endif

    virtual ~OleEmbeddedObject();

#ifdef WNT
    void OnIconChanged_Impl();
    void OnViewChanged_Impl();
    void OnClosed_Impl();
#endif

// XEmbeddedObject

    virtual void SAL_CALL changeState( sal_Int32 nNewState )
		throw ( ::com::sun::star::embed::UnreachableStateException,
				::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException );

    virtual ::com::sun::star::uno::Sequence< sal_Int32 > SAL_CALL getReachableStates()
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::RuntimeException );

    virtual sal_Int32 SAL_CALL getCurrentState()
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL doVerb( sal_Int32 nVerbID )
		throw ( ::com::sun::star::lang::IllegalArgumentException,
				::com::sun::star::embed::WrongStateException,
				::com::sun::star::embed::UnreachableStateException,
				::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException );

    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::embed::VerbDescriptor > SAL_CALL getSupportedVerbs()
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL setClientSite(
				const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XEmbeddedClient >& xClient )
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::RuntimeException );

    virtual ::com::sun::star::uno::Reference< ::com::sun::star::embed::XEmbeddedClient > SAL_CALL getClientSite()
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL update()
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL setUpdateMode( sal_Int32 nMode )
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::RuntimeException );

    virtual sal_Int64 SAL_CALL getStatus( sal_Int64 nAspect )
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL setContainerName( const ::rtl::OUString& sName )
		throw ( ::com::sun::star::uno::RuntimeException );


// XVisualObject

    virtual void SAL_CALL setVisualAreaSize( sal_Int64 nAspect, const ::com::sun::star::awt::Size& aSize )
		throw ( ::com::sun::star::lang::IllegalArgumentException,
				::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException );

    virtual ::com::sun::star::awt::Size SAL_CALL getVisualAreaSize( sal_Int64 nAspect )
		throw ( ::com::sun::star::lang::IllegalArgumentException,
				::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException );

    virtual ::com::sun::star::embed::VisualRepresentation SAL_CALL getPreferredVisualRepresentation( ::sal_Int64 nAspect )
		throw ( ::com::sun::star::lang::IllegalArgumentException,
				::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException );

    virtual sal_Int32 SAL_CALL getMapUnit( sal_Int64 nAspect )
		throw ( ::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException);


// XEmbedPersist

    virtual void SAL_CALL setPersistentEntry(
					const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage,
					const ::rtl::OUString& sEntName,
					sal_Int32 nEntryConnectionMode,
					const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments,
					const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs )
		throw ( ::com::sun::star::lang::IllegalArgumentException,
				::com::sun::star::embed::WrongStateException,
				::com::sun::star::io::IOException,
				::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL storeToEntry( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, const ::rtl::OUString& sEntName, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs )
		throw ( ::com::sun::star::lang::IllegalArgumentException,
				::com::sun::star::embed::WrongStateException,
				::com::sun::star::io::IOException,
				::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL storeAsEntry(
				const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage,
				const ::rtl::OUString& sEntName,
				const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments,
				const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs )
		throw ( ::com::sun::star::lang::IllegalArgumentException,
				::com::sun::star::embed::WrongStateException,
				::com::sun::star::io::IOException,
				::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL saveCompleted( sal_Bool bUseNew )
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException );

    virtual sal_Bool SAL_CALL hasEntry()
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::RuntimeException );

    virtual ::rtl::OUString SAL_CALL getEntryName()
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::RuntimeException );

// XLinkageSupport

	virtual void SAL_CALL breakLink( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage,
									 const ::rtl::OUString& sEntName )
		throw ( ::com::sun::star::lang::IllegalArgumentException,
				::com::sun::star::embed::WrongStateException,
				::com::sun::star::io::IOException,
				::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException );

    virtual sal_Bool SAL_CALL isLink()
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::RuntimeException);

    virtual ::rtl::OUString SAL_CALL getLinkURL()
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException);

// XCommonEmbedPersist
    virtual void SAL_CALL storeOwn()
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::io::IOException,
				::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException );

    virtual sal_Bool SAL_CALL isReadonly()
		throw ( ::com::sun::star::embed::WrongStateException,
				::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL reload(
				const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lArguments,
				const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lObjArgs )
		throw ( ::com::sun::star::lang::IllegalArgumentException,
				::com::sun::star::embed::WrongStateException,
				::com::sun::star::io::IOException,
				::com::sun::star::uno::Exception,
				::com::sun::star::uno::RuntimeException );

// XClassifiedObject

	virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getClassID()
		throw ( ::com::sun::star::uno::RuntimeException );

    virtual ::rtl::OUString SAL_CALL getClassName()
		throw ( ::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL setClassInfo(
				const ::com::sun::star::uno::Sequence< sal_Int8 >& aClassID, const ::rtl::OUString& aClassName )
		throw ( ::com::sun::star::lang::NoSupportException,
				::com::sun::star::uno::RuntimeException );

// XStateChangeBroadcaster
    virtual void SAL_CALL addStateChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStateChangeListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeStateChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStateChangeListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);


// XComponentSupplier

    virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable > SAL_CALL getComponent()
		throw ( ::com::sun::star::uno::RuntimeException );

// XCloseable

    virtual void SAL_CALL close( sal_Bool DeliverOwnership )
		throw ( ::com::sun::star::util::CloseVetoException,
				::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL addCloseListener(
				const ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseListener >& Listener )
		throw ( ::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL removeCloseListener(
				const ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseListener >& Listener )
		throw ( ::com::sun::star::uno::RuntimeException );

// XEventBroadcaster
    virtual void SAL_CALL addEventListener(
				const ::com::sun::star::uno::Reference< ::com::sun::star::document::XEventListener >& Listener )
		throw ( ::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL removeEventListener(
				const ::com::sun::star::uno::Reference< ::com::sun::star::document::XEventListener >& Listener )
		throw ( ::com::sun::star::uno::RuntimeException );

// XInplaceObject ( only for wrapping scenario here )

    virtual void SAL_CALL setObjectRectangles( const ::com::sun::star::awt::Rectangle& aPosRect,
                                          const ::com::sun::star::awt::Rectangle& aClipRect )
        throw ( ::com::sun::star::embed::WrongStateException,
                ::com::sun::star::uno::Exception,
                ::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL enableModeless( sal_Bool bEnable )
        throw ( ::com::sun::star::embed::WrongStateException,
                ::com::sun::star::uno::Exception,
                ::com::sun::star::uno::RuntimeException );

    virtual void SAL_CALL translateAccelerators(
                    const ::com::sun::star::uno::Sequence< ::com::sun::star::awt::KeyEvent >& aKeys )
        throw ( ::com::sun::star::embed::WrongStateException,
                ::com::sun::star::uno::RuntimeException );

    // XChild ( only for wrapping scenario here )
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getParent(  ) throw (::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setParent( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& Parent ) throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);

};

#endif

