diff options
Diffstat (limited to 'framework/source/services/frame.cxx')
-rw-r--r-- | framework/source/services/frame.cxx | 3308 |
1 files changed, 0 insertions, 3308 deletions
diff --git a/framework/source/services/frame.cxx b/framework/source/services/frame.cxx deleted file mode 100644 index 72562ecd64..0000000000 --- a/framework/source/services/frame.cxx +++ /dev/null @@ -1,3308 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_framework.hxx" - -//_________________________________________________________________________________________________________________ -// my own includes -//_________________________________________________________________________________________________________________ -#include <services/frame.hxx> -#include <dispatch/dispatchprovider.hxx> - -#include <dispatch/interceptionhelper.hxx> -#include <dispatch/closedispatcher.hxx> -#include <dispatch/windowcommanddispatch.hxx> -#include <loadenv/loadenv.hxx> -#include <helper/oframes.hxx> -#include <helper/statusindicatorfactory.hxx> -#include <framework/titlehelper.hxx> -#include <classes/droptargetlistener.hxx> -#include <classes/taskcreator.hxx> -#include <loadenv/targethelper.hxx> -#include <framework/framelistanalyzer.hxx> -#include <helper/dockingareadefaultacceptor.hxx> -#include <dispatch/dispatchinformationprovider.hxx> -#include <threadhelp/transactionguard.hxx> -#include <pattern/window.hxx> -#include <services.h> -#include <properties.h> - -//_________________________________________________________________________________________________________________ -// interface includes -//_________________________________________________________________________________________________________________ -#include <com/sun/star/lang/XInitialization.hpp> -#include <com/sun/star/lang/DisposedException.hpp> -#include <com/sun/star/task/XJobExecutor.hpp> -#include <com/sun/star/util/XURLTransformer.hpp> -#include <com/sun/star/util/XCloseable.hpp> -#include <com/sun/star/awt/XDevice.hpp> -#include <com/sun/star/awt/XTopWindow.hpp> -#include <com/sun/star/frame/XDesktop.hpp> -#include <com/sun/star/awt/PosSize.hpp> -#include <com/sun/star/frame/FrameSearchFlag.hpp> -#include <com/sun/star/awt/XWindowPeer.hpp> -#include <com/sun/star/awt/XVclWindowPeer.hpp> -#include <com/sun/star/task/XStatusIndicatorSupplier.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/beans/PropertyValue.hpp> -#include <com/sun/star/beans/XPropertySet.hpp> -#include <com/sun/star/frame/XModel.hpp> -#include <com/sun/star/awt/XDataTransferProviderAccess.hpp> -#include <com/sun/star/datatransfer/dnd/XDropTarget.hpp> -#include <com/sun/star/awt/WindowAttribute.hpp> -#include <com/sun/star/container/XIndexAccess.hpp> -#include <com/sun/star/beans/XMaterialHolder.hpp> - -#include <com/sun/star/frame/XTitleChangeBroadcaster.hpp> - -//_________________________________________________________________________________________________________________ -// includes of other projects -//_________________________________________________________________________________________________________________ -#include <comphelper/sequenceashashmap.hxx> -#include <cppuhelper/queryinterface.hxx> -#include <cppuhelper/typeprovider.hxx> -#include <cppuhelper/factory.hxx> -#include <cppuhelper/proptypehlp.hxx> -#include <rtl/ustrbuf.hxx> -#include <vcl/window.hxx> -#include <vcl/wrkwin.hxx> -#include <vcl/svapp.hxx> - -#include <toolkit/unohlp.hxx> -#include <toolkit/awt/vclxwindow.hxx> -#include <comphelper/processfactory.hxx> -#include <unotools/moduleoptions.hxx> - -#ifdef ENABLE_ASSERTIONS - #ifndef _RTL_STRBUF_HXX_ - #include <rtl/strbuf.hxx> - #endif -#endif - -#include <vcl/menu.hxx> - -//_________________________________________________________________________________________________________________ -// namespace -//_________________________________________________________________________________________________________________ - -namespace framework{ - -//_________________________________________________________________________________________________________________ -// non exported const -//_________________________________________________________________________________________________________________ - -//_________________________________________________________________________________________________________________ -// non exported definitions -//_________________________________________________________________________________________________________________ - -css::uno::WeakReference< css::frame::XFrame > Frame::m_xCloserFrame = css::uno::WeakReference< css::frame::XFrame >(); - -//_________________________________________________________________________________________________________________ -// declarations -//_________________________________________________________________________________________________________________ - -//***************************************************************************************************************** -// XInterface, XTypeProvider, XServiceInfo -//***************************************************************************************************************** -DEFINE_XINTERFACE_21 ( Frame , - OWeakObject , - DIRECT_INTERFACE(css::lang::XTypeProvider ), - DIRECT_INTERFACE(css::lang::XServiceInfo ), - DIRECT_INTERFACE(css::frame::XFramesSupplier ), - DIRECT_INTERFACE(css::frame::XFrame ), - DIRECT_INTERFACE(css::lang::XComponent ), - DIRECT_INTERFACE(css::task::XStatusIndicatorFactory ), - DIRECT_INTERFACE(css::frame::XDispatchProvider ), - DIRECT_INTERFACE(css::frame::XDispatchInformationProvider ), - DIRECT_INTERFACE(css::frame::XDispatchProviderInterception ), - DIRECT_INTERFACE(css::beans::XPropertySet ), - DIRECT_INTERFACE(css::beans::XPropertySetInfo ), - DIRECT_INTERFACE(css::awt::XWindowListener ), - DIRECT_INTERFACE(css::awt::XTopWindowListener ), - DIRECT_INTERFACE(css::awt::XFocusListener ), - DERIVED_INTERFACE(css::lang::XEventListener, css::awt::XWindowListener ), - DIRECT_INTERFACE(css::document::XActionLockable ), - DIRECT_INTERFACE(css::util::XCloseable ), - DIRECT_INTERFACE(css::util::XCloseBroadcaster ), - DIRECT_INTERFACE(css::frame::XComponentLoader ), - DIRECT_INTERFACE(css::frame::XTitle ), - DIRECT_INTERFACE(css::frame::XTitleChangeBroadcaster ) - ) - -DEFINE_XTYPEPROVIDER_20 ( Frame , - css::lang::XTypeProvider , - css::lang::XServiceInfo , - css::frame::XFramesSupplier , - css::frame::XFrame , - css::lang::XComponent , - css::task::XStatusIndicatorFactory , - css::beans::XPropertySet , - css::beans::XPropertySetInfo , - css::frame::XDispatchProvider , - css::frame::XDispatchInformationProvider , - css::frame::XDispatchProviderInterception , - css::awt::XWindowListener , - css::awt::XTopWindowListener , - css::awt::XFocusListener , - css::lang::XEventListener , - css::util::XCloseable , - css::util::XCloseBroadcaster , - css::frame::XComponentLoader , - css::frame::XTitle , - css::frame::XTitleChangeBroadcaster - ) - -DEFINE_XSERVICEINFO_MULTISERVICE ( Frame , - ::cppu::OWeakObject , - SERVICENAME_FRAME , - IMPLEMENTATIONNAME_FRAME - ) - -DEFINE_INIT_SERVICE ( Frame, - { - /*Attention - I think we don't need any mutex or lock here ... because we are called by our own static method impl_createInstance() - to create a new instance of this class by our own supported service factory. - see macro DEFINE_XSERVICEINFO_MULTISERVICE and "impl_initService()" for further informations! - */ - css::uno::Reference< css::uno::XInterface > xThis(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY_THROW); - - //------------------------------------------------------------------------------------------------------------- - // Initialize a new dispatchhelper-object to handle dispatches. - // We use these helper as slave for our interceptor helper ... not directly! - // But he is event listener on THIS instance! - DispatchProvider* pDispatchHelper = new DispatchProvider( m_xFactory, this ); - css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider( static_cast< ::cppu::OWeakObject* >(pDispatchHelper), css::uno::UNO_QUERY ); - - //------------------------------------------------------------------------------------------------------------- - DispatchInformationProvider* pInfoHelper = new DispatchInformationProvider(m_xFactory, this); - m_xDispatchInfoHelper = css::uno::Reference< css::frame::XDispatchInformationProvider >( static_cast< ::cppu::OWeakObject* >(pInfoHelper), css::uno::UNO_QUERY ); - - //------------------------------------------------------------------------------------------------------------- - // Initialize a new interception helper object to handle dispatches and implement an interceptor mechanism. - // Set created dispatch provider as slowest slave of it. - // Hold interception helper by reference only - not by pointer! - // So it's easiear to destroy it. - InterceptionHelper* pInterceptionHelper = new InterceptionHelper( this, xDispatchProvider ); - m_xDispatchHelper = css::uno::Reference< css::frame::XDispatchProvider >( static_cast< ::cppu::OWeakObject* >(pInterceptionHelper), css::uno::UNO_QUERY ); - - //------------------------------------------------------------------------------------------------------------- - // Initialize a new XFrames-helper-object to handle XIndexAccess and XElementAccess. - // We hold member as reference ... not as pointer too! - // Attention: We share our frame container with this helper. Container is threadsafe himself ... So I think we can do that. - // But look on dispose() for right order of deinitialization. - OFrames* pFramesHelper = new OFrames( m_xFactory, this, &m_aChildFrameContainer ); - m_xFramesHelper = css::uno::Reference< css::frame::XFrames >( static_cast< ::cppu::OWeakObject* >(pFramesHelper), css::uno::UNO_QUERY ); - - //------------------------------------------------------------------------------------------------------------- - // Initialize a the drop target listener. - // We hold member as reference ... not as pointer too! - DropTargetListener* pDropListener = new DropTargetListener( m_xFactory, this ); - m_xDropTargetListener = css::uno::Reference< css::datatransfer::dnd::XDropTargetListener >( static_cast< ::cppu::OWeakObject* >(pDropListener), css::uno::UNO_QUERY ); - - // Safe impossible cases - // We can't work without these helpers! - LOG_ASSERT2( xDispatchProvider.is ()==sal_False, "Frame::impl_initService()", "Slowest slave for dispatch- and interception helper isn't valid. XDispatchProvider, XDispatch, XDispatchProviderInterception are not full supported!" ) - LOG_ASSERT2( m_xDispatchHelper.is ()==sal_False, "Frame::impl_initService()", "Interception helper isn't valid. XDispatchProvider, XDispatch, XDispatchProviderInterception are not full supported!" ) - LOG_ASSERT2( m_xFramesHelper.is ()==sal_False, "Frame::impl_initService()", "Frames helper isn't valid. XFrames, XIndexAccess and XElementAcces are not supported!" ) - LOG_ASSERT2( m_xDropTargetListener.is()==sal_False, "Frame::impl_initService()", "DropTarget helper isn't valid. Drag and drop without functionality!" ) - - //------------------------------------------------------------------------------------------------------------- - // establish notifies for changing of "disabled commands" configuration during runtime - m_aCommandOptions.EstablisFrameCallback(this); - - //------------------------------------------------------------------------------------------------------------- - // Create an initial layout manager - // Create layout manager and connect it to the newly created frame - m_xLayoutManager = css::uno::Reference< css::frame::XLayoutManager >(m_xFactory->createInstance(SERVICENAME_LAYOUTMANAGER), css::uno::UNO_QUERY); - - //------------------------------------------------------------------------------------------------------------- - // set information about all supported properties at the base class helper PropertySetHelper - impl_initializePropInfo(); - } - ) - -/*-****************************************************************************************************//** - @short standard constructor to create instance by factory - @descr This constructor initialize a new instance of this class by valid factory, - and will be set valid values on his member and baseclasses. - - @attention a) Don't use your own reference during an UNO-Service-ctor! There is no guarantee, that you - will get over this. (e.g. using of your reference as parameter to initialize some member) - Do such things in DEFINE_INIT_SERVICE() method, which is called automaticly after your ctor!!! - b) Baseclass OBroadcastHelper is a typedef in namespace cppu! - The microsoft compiler has some problems to handle it right BY using namespace explicitly ::cppu::OBroadcastHelper. - If we write it without a namespace or expand the typedef to OBrodcastHelperVar<...> -> it will be OK!? - I don't know why! (other compiler not tested .. but it works!) - - @seealso method DEFINE_INIT_SERVICE() - - @param "xFactory" is the multi service manager, which create this instance. - The value must be different from NULL! - @return - - - @onerror ASSERT in debug version or nothing in relaese version. -*//*-*****************************************************************************************************/ -Frame::Frame( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory ) - : ThreadHelpBase ( &Application::GetSolarMutex() ) - , TransactionBase ( ) - , PropertySetHelper ( xFactory, - &m_aLock, - &m_aTransactionManager, - sal_False) // sal_False => dont release shared mutex on calling us! - , ::cppu::OWeakObject ( ) - // init member - , m_xFactory ( xFactory ) - , m_aListenerContainer ( m_aLock.getShareableOslMutex() ) - , m_xParent ( ) - , m_xContainerWindow ( ) - , m_xComponentWindow ( ) - , m_xController ( ) - , m_eActiveState ( E_INACTIVE ) - , m_sName ( ) - , m_bIsFrameTop ( sal_True ) // I think we are top without a parent ... and there is no parent yet! - , m_bConnected ( sal_False ) // There exist no component inside of use => sal_False, we are not connected! - , m_nExternalLockCount ( 0 ) - , m_bSelfClose ( sal_False ) // Important! - , m_bIsHidden ( sal_True ) - , m_xTitleHelper ( ) - , m_pWindowCommandDispatch ( 0 ) - , m_aChildFrameContainer ( ) -{ - // Check incoming parameter to avoid against wrong initialization. - LOG_ASSERT2( implcp_ctor( xFactory ), "Frame::Frame()", "Invalid parameter detected!" ) - - /* Please have a look on "@attentions" of description before! */ -} - -/*-****************************************************************************************************//** - @short standard destructor - @descr This one do NOTHING! Use dispose() instaed of this. - - @seealso method dispose() - - @param - - @return - - - @onerror - -*//*-*****************************************************************************************************/ -Frame::~Frame() -{ - LOG_ASSERT2( m_aTransactionManager.getWorkingMode()!=E_CLOSE, "Frame::~Frame()", "Who forgot to dispose this service?" ) -} - -/*-************************************************************************************************************//** - @interface XComponentLoader - @short try to load given URL into a task - @descr You can give us some informations about the content, which you will load into a frame. - We search or create this target for you, make a type detection of given URL and try to load it. - As result of this operation we return the new created component or nothing, if loading failed. - - @seealso - - - @param "sURL" , URL, which represant the content - @param "sTargetFrameName" , name of target frame or special value like "_self", "_blank" ... - @param "nSearchFlags" , optional arguments for frame search, if target isn't a special one - @param "lArguments" , optional arguments for loading - @return A valid component reference, if loading was successfully. - A null reference otherwise. - - @onerror We return a null reference. - @threadsafe yes -*//*-*************************************************************************************************************/ -css::uno::Reference< css::lang::XComponent > SAL_CALL Frame::loadComponentFromURL( const ::rtl::OUString& sURL , - const ::rtl::OUString& sTargetFrameName, - sal_Int32 nSearchFlags , - const css::uno::Sequence< css::beans::PropertyValue >& lArguments ) throw( css::io::IOException , - css::lang::IllegalArgumentException , - css::uno::RuntimeException ) -{ - { - // If the frame is closed the call might lead to crash even with target "_blank", - // so the DisposedException should be thrown in this case - // It still looks to be too dangerous to set the transaction for the whole loading process - // so the guard is used in scopes to let the standard check be used - - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - } - - ReadGuard aReadLock(m_aLock); - css::uno::Reference< css::frame::XComponentLoader > xThis(static_cast< css::frame::XComponentLoader* >(this), css::uno::UNO_QUERY); - css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xFactory; - aReadLock.unlock(); - - return LoadEnv::loadComponentFromURL(xThis, xSMGR, sURL, sTargetFrameName, nSearchFlags, lArguments); -} - -/*-****************************************************************************************************//** - @short return access to append or remove childs on desktop - @descr We don't implement these interface directly. We use a helper class to do this. - If you wish to add or delete childs to/from the container, call these method to get - a reference to the helper. - - @seealso class OFrames - - @param - - @return A reference to the helper which answer your queries. - - @onerror A null reference is returned. -*//*-*****************************************************************************************************/ -css::uno::Reference< css::frame::XFrames > SAL_CALL Frame::getFrames() throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Register transaction and reject wrong calls. - -/*TODO - This is a temp. HACK! - Our parent (a Task!) stand in close/dispose and set working mode to E_BEFOERECLOSE - and call dispose on us! We tra to get this xFramesHelper and are reject by an "already closed" pranet instance .... - => We use SOFTEXCEPTIONS here ... but we should make it right in further times .... - */ - - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - - // Return access to all child frames to caller. - // Ouer childframe container is implemented in helper class OFrames and used as a reference m_xFramesHelper! - return m_xFramesHelper; -} - -/*-****************************************************************************************************//** - @short get the current active child frame - @descr It must be a frameto. Direct childs of a frame are frames only! No task or desktop is accepted. - We don't save this information directly in this class. We use ouer container-helper - to do that. - - @seealso class OFrameContainer - @seealso method setActiveFrame() - - @param - - @return A reference to ouer current active childframe, if anyone exist. - @return A null reference, if nobody is active. - - @onerror A null reference is returned. -*//*-*****************************************************************************************************/ -css::uno::Reference< css::frame::XFrame > SAL_CALL Frame::getActiveFrame() throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Register transaction and reject wrong calls. - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - - // Return current active frame. - // This information is avaliable on the container. - return m_aChildFrameContainer.getActive(); -} - -/*-****************************************************************************************************//** - @short set the new active direct child frame - @descr It must be a frame to. Direct childs of frame are frames only! No task or desktop is accepted. - We don't save this information directly in this class. We use ouer container-helper - to do that. - - @seealso class OFrameContainer - @seealso method getActiveFrame() - - @param "xFrame", reference to new active child. It must be an already existing child! - @return - - - @onerror An assertion is thrown and element is ignored, if given frame is'nt already a child of us. -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::setActiveFrame( const css::uno::Reference< css::frame::XFrame >& xFrame ) throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Check incoming parameters. - LOG_ASSERT2( implcp_setActiveFrame( xFrame ), "Frame::setActiveFrame()", "Invalid parameter detected!" ) - // Look for rejected calls! - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - - // Copy neccessary member for threadsafe access! - // m_aChildFrameContainer is threadsafe himself and he live if we live!!! - // ...and our transaction is non breakable too ... - css::uno::Reference< css::frame::XFrame > xActiveChild = m_aChildFrameContainer.getActive(); - EActiveState eActiveState = m_eActiveState ; - - aWriteLock.unlock(); - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - - // Don't work, if "new" active frame is'nt different from current one! - // (xFrame==NULL is allowed to UNSET it!) - if( xActiveChild != xFrame ) - { - // ... otherwise set new and deactivate old one. - m_aChildFrameContainer.setActive( xFrame ); - if ( - ( eActiveState != E_INACTIVE ) && - ( xActiveChild.is() == sal_True ) - ) - { - xActiveChild->deactivate(); - } - } - - if( xFrame.is() == sal_True ) - { - // If last active frame had focus ... - // ... reset state to ACTIVE and send right FrameActionEvent for focus lost. - if( eActiveState == E_FOCUS ) - { - aWriteLock.lock(); - eActiveState = E_ACTIVE ; - m_eActiveState = eActiveState; - aWriteLock.unlock(); - implts_sendFrameActionEvent( css::frame::FrameAction_FRAME_UI_DEACTIVATING ); - } - - // If last active frame was active ... - // but new one isn't it ... - // ... set it as active one. - if ( - ( eActiveState == E_ACTIVE ) && - ( xFrame->isActive() == sal_False ) - ) - { - xFrame->activate(); - } - } - else - // If this frame is active and has no active subframe anymore it is UI active too - if( eActiveState == E_ACTIVE ) - { - aWriteLock.lock(); - eActiveState = E_FOCUS ; - m_eActiveState = eActiveState; - aWriteLock.unlock(); - implts_sendFrameActionEvent( css::frame::FrameAction_FRAME_UI_ACTIVATED ); - } -} - -/*-****************************************************************************************************//** - initialize new created layout manager -**/ -void lcl_enableLayoutManager(const css::uno::Reference< css::frame::XLayoutManager >& xLayoutManager, - const css::uno::Reference< css::frame::XFrame >& xFrame ) -{ - // Provide container window to our layout manager implementation - xLayoutManager->attachFrame(xFrame); - - css::uno::Reference< css::frame::XFrameActionListener > xListen(xLayoutManager, css::uno::UNO_QUERY_THROW); - xFrame->addFrameActionListener(xListen); - - DockingAreaDefaultAcceptor* pAcceptor = new DockingAreaDefaultAcceptor(xFrame); - css::uno::Reference< css::ui::XDockingAreaAcceptor > xDockingAreaAcceptor( static_cast< ::cppu::OWeakObject* >(pAcceptor), css::uno::UNO_QUERY_THROW); - xLayoutManager->setDockingAreaAcceptor(xDockingAreaAcceptor); -} - -/*-****************************************************************************************************//** - deinitialize layout manager -**/ -void lcl_disableLayoutManager(const css::uno::Reference< css::frame::XLayoutManager >& xLayoutManager, - const css::uno::Reference< css::frame::XFrame >& xFrame ) -{ - css::uno::Reference< css::frame::XFrameActionListener > xListen(xLayoutManager, css::uno::UNO_QUERY_THROW); - xFrame->removeFrameActionListener(xListen); - xLayoutManager->setDockingAreaAcceptor(css::uno::Reference< css::ui::XDockingAreaAcceptor >()); - xLayoutManager->attachFrame(css::uno::Reference< css::frame::XFrame >()); -} - -/*-****************************************************************************************************//** - @short initialize frame instance - @descr A frame needs a window. This method set a new one ... but should called one times only! - We use this window to listen for window events and forward it to our set component. - Its used as parent of component window too. - - @seealso method getContainerWindow() - @seealso method setComponent() - @seealso member m_xContainerWindow - - @param "xWindow", reference to new container window - must be valid! - @return - - - @onerror We do nothing. -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::initialize( const css::uno::Reference< css::awt::XWindow >& xWindow ) throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - if (!xWindow.is()) - throw css::uno::RuntimeException( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Frame::initialize() called without a valid container window reference.")), - static_cast< css::frame::XFrame* >(this)); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - - if ( m_xContainerWindow.is() ) - throw css::uno::RuntimeException( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Frame::initialized() is called more then once, which isnt usefull nor allowed.")), - static_cast< css::frame::XFrame* >(this)); - - // Look for rejected calls first! - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - - // Enable object for real working ... so follow impl methods don't must handle it special! (e.g. E_SOFTEXCEPTIONS for rejected calls) - m_aTransactionManager.setWorkingMode( E_WORK ); - - // This must be the first call of this method! - // We should initialize our object and open it for working. - // Set the new window. - LOG_ASSERT2( m_xContainerWindow.is()==sal_True, "Frame::initialize()", "Leak detected! This state should never occure ..." ) - m_xContainerWindow = xWindow; - - // if window is initially visible, we will never get a windowShowing event - Window* pWindow = VCLUnoHelper::GetWindow(xWindow); - if (pWindow && pWindow->IsVisible()) - m_bIsHidden = sal_False; - - css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xFactory; - css::uno::Reference< css::frame::XLayoutManager > xLayoutManager = m_xLayoutManager; - - // Release lock ... because we call some impl methods, which are threadsafe by himself. - // If we hold this lock - we will produce our own deadlock! - aWriteLock.unlock(); - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - - if (xLayoutManager.is()) - lcl_enableLayoutManager(xLayoutManager, this); - - // create progress helper - css::uno::Reference< css::frame::XFrame > xThis (static_cast< css::frame::XFrame* >(this) , css::uno::UNO_QUERY_THROW); - css::uno::Reference< css::task::XStatusIndicatorFactory > xIndicatorFactory(xSMGR->createInstance(IMPLEMENTATIONNAME_STATUSINDICATORFACTORY), css::uno::UNO_QUERY_THROW); - css::uno::Reference< css::lang::XInitialization > xIndicatorInit (xIndicatorFactory , css::uno::UNO_QUERY_THROW); - css::uno::Sequence< css::uno::Any > lArgs(2); - css::beans::NamedValue aArg; - aArg.Name = STATUSINDICATORFACTORY_PROPNAME_FRAME; - aArg.Value <<= xThis; - lArgs[0] <<= aArg; - aArg.Name = STATUSINDICATORFACTORY_PROPNAME_ALLOWPARENTSHOW; - aArg.Value <<= sal_True; - lArgs[1] <<= aArg; - xIndicatorInit->initialize(lArgs); - - // SAFE -> ---------------------------------- - aWriteLock.lock(); - m_xIndicatorFactoryHelper = xIndicatorFactory; - aWriteLock.unlock(); - // <- SAFE ---------------------------------- - - // Start listening for events after setting it on helper class ... - // So superflous messages are filtered to NULL :-) - implts_startWindowListening(); - - impl_enablePropertySet(); - - m_pWindowCommandDispatch = new WindowCommandDispatch(xSMGR, this); - - // Initialize title functionality - TitleHelper* pTitleHelper = new TitleHelper(xSMGR); - m_xTitleHelper = css::uno::Reference< css::frame::XTitle >(static_cast< ::cppu::OWeakObject* >(pTitleHelper), css::uno::UNO_QUERY_THROW); - pTitleHelper->setOwner(xThis); -} - -/*-****************************************************************************************************//** - @short returns current set container window - @descr The ContainerWindow property is used as a container for the component - in this frame. So this object implements a container interface too. - The instantiation of the container window is done by the user of this class. - The frame is the owner of its container window. - - @seealso method initialize() - - @param - - @return A reference to current set containerwindow. - - @onerror A null reference is returned. -*//*-*****************************************************************************************************/ -css::uno::Reference< css::awt::XWindow > SAL_CALL Frame::getContainerWindow() throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Register transaction and reject wrong calls. - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - - return m_xContainerWindow; -} - -/*-****************************************************************************************************//** - @short set parent frame - @descr We need a parent to support some functionality! e.g. findFrame() - By the way we use the chance to set an internal information about our top state. - So we must not check this information during every isTop() call. - We are top, if our parent is the desktop instance or we havent any parent. - - @seealso getCreator() - @seealso findFrame() - @seealso isTop() - @seealos m_bIsFrameTop - - @param xCreator - valid reference to our new owner frame, which should implement a supplier interface - - @threadsafe yes - @modified 08.05.2002 09:35, as96863 -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::setCreator( const css::uno::Reference< css::frame::XFramesSupplier >& xCreator ) throw( css::uno::RuntimeException ) -{ - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - /* SAFE { */ - WriteGuard aWriteLock( m_aLock ); - m_xParent = xCreator; - aWriteLock.unlock(); - /* } SAFE */ - - css::uno::Reference< css::frame::XDesktop > xIsDesktop( xCreator, css::uno::UNO_QUERY ); - m_bIsFrameTop = ( xIsDesktop.is() || ! xCreator.is() ); -} - -/*-****************************************************************************************************//** - @short returns current parent frame - @descr The Creator is the parent frame container. If it is NULL, the frame is the uppermost one. - - @seealso method setCreator() - - @param - - @return A reference to current set parent frame container. - - @onerror A null reference is returned. -*//*-*****************************************************************************************************/ -css::uno::Reference< css::frame::XFramesSupplier > SAL_CALL Frame::getCreator() throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Register transaction and reject wrong calls. - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - - return m_xParent; -} - -/*-****************************************************************************************************//** - @short returns current set name of frame - @descr This name is used to find target of findFrame() or queryDispatch() calls. - - @seealso method setName() - - @param - - @return Current set name of frame. - - @onerror An empty string is returned. -*//*-*****************************************************************************************************/ -::rtl::OUString SAL_CALL Frame::getName() throw( css::uno::RuntimeException ) -{ - /* SAFE { */ - ReadGuard aReadLock( m_aLock ); - return m_sName; - /* } SAFE */ -} - -/*-****************************************************************************************************//** - @short set new name for frame - @descr This name is used to find target of findFrame() or queryDispatch() calls. - - @attention Special names like "_blank", "_self" aren't allowed ... - "_beamer" or "_menubar" excepts this rule! - - @seealso method getName() - - @param "sName", new frame name. - @return - - - @onerror We do nothing. -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::setName( const ::rtl::OUString& sName ) throw( css::uno::RuntimeException ) -{ - /* SAFE { */ - WriteGuard aWriteLock( m_aLock ); - // Set new name ... but look for invalid special target names! - // They are not allowed to set. - if (TargetHelper::isValidNameForFrame(sName)) - m_sName = sName; - aWriteLock.unlock(); - /* } SAFE */ -} - -/*-****************************************************************************************************//** - @short search for frames - @descr This method searches for a frame with the specified name. - Frames may contain other frames (e.g. a frameset) and may - be contained in other frames. This hierarchie ist searched by - this method. - First some special names are taken into account, i.e. "", - "_self", "_top", "_blank" etc. The nSearchFlags are ignored - when comparing these names with sTargetFrameName, further steps are - controlled by the search flags. If allowed, the name of the frame - itself is compared with the desired one, then ( again if allowed ) - the method findFrame() is called for all children, for siblings - and as last for the parent frame. - If no frame with the given name is found until the top frames container, - a new top one is created, if this is allowed by a special - flag. The new frame also gets the desired name. - - @param sTargetFrameName - special names (_blank, _self) or real name of target frame - @param nSearchFlags - optional flags which regulate search for non special target frames - - @return A reference to found or may be new created frame. - @threadsafe yes - @modified 16.05.2002 11:08, as96863 -*//*-*****************************************************************************************************/ -css::uno::Reference< css::frame::XFrame > SAL_CALL Frame::findFrame( const ::rtl::OUString& sTargetFrameName, - sal_Int32 nSearchFlags ) throw( css::uno::RuntimeException ) -{ - css::uno::Reference< css::frame::XFrame > xTarget; - - //----------------------------------------------------------------------------------------------------- - // 0) Ignore wrong parameter! - // We doesn't support search for following special targets. - // If we reject this requests - we mustnt check for such names - // in following code again and again. If we do not so -wrong - // search results can occure! - //----------------------------------------------------------------------------------------------------- - if ( - (sTargetFrameName==SPECIALTARGET_DEFAULT ) || // valid for dispatches - not for findFrame()! - (sTargetFrameName==SPECIALTARGET_MENUBAR ) || // valid for dispatches - not for findFrame()! - (sTargetFrameName==SPECIALTARGET_HELPAGENT) // valid for dispatches - not for findFrame()! - ) - { - return NULL; - } - - //----------------------------------------------------------------------------------------------------- - // I) check for special defined targets first which must be handled exclusive. - // force using of "if() else if() ..." - //----------------------------------------------------------------------------------------------------- - - // get threadsafe some neccessary member which are neccessary for following functionality - /* SAFE { */ - ReadGuard aReadLock( m_aLock ); - css::uno::Reference< css::frame::XFrame > xParent ( m_xParent, css::uno::UNO_QUERY ); - css::uno::Reference< css::lang::XMultiServiceFactory > xFactory = m_xFactory; - sal_Bool bIsTopFrame = m_bIsFrameTop; - sal_Bool bIsTopWindow = WindowHelper::isTopWindow(m_xContainerWindow); - aReadLock.unlock(); - /* } SAFE */ - - //----------------------------------------------------------------------------------------------------- - // I.I) "_blank" - // Not allowed for a normal frame - but for the desktop. - // Use helper class to do so. It use the desktop automaticly. - //----------------------------------------------------------------------------------------------------- - if ( sTargetFrameName==SPECIALTARGET_BLANK ) - { - TaskCreator aCreator(xFactory); - xTarget = aCreator.createTask(sTargetFrameName,sal_False); - } - - //----------------------------------------------------------------------------------------------------- - // I.II) "_parent" - // It doesn't matter if we have a valid parent or not. User ask for him and get it. - // An empty result is a valid result too. - //----------------------------------------------------------------------------------------------------- - else - if ( sTargetFrameName==SPECIALTARGET_PARENT ) - { - xTarget = xParent; - } - - //----------------------------------------------------------------------------------------------------- - // I.III) "_top" - // If we are not the top frame in this hierarchy, we must forward request to our parent. - // Otherwhise we must return ourself. - //----------------------------------------------------------------------------------------------------- - else - if ( sTargetFrameName==SPECIALTARGET_TOP ) - { - if (bIsTopFrame) - xTarget = this; - else - if (xParent.is()) // If we are not top - the parent MUST exist. But may it's better to check it again .-) - xTarget = xParent->findFrame(SPECIALTARGET_TOP,0); - } - - //----------------------------------------------------------------------------------------------------- - // I.IV) "_self", "" - // This mean this frame in every case. - //----------------------------------------------------------------------------------------------------- - else - if ( - ( sTargetFrameName==SPECIALTARGET_SELF ) || - ( sTargetFrameName.getLength()<1 ) - ) - { - xTarget = this; - } - - //----------------------------------------------------------------------------------------------------- - // I.V) "_beamer" - // This is a special sub frame of any task. We must return it if we found it on our direct childrens - // or create it there if it not already exists. - // Note: Such beamer exists for task(top) frames only! - //----------------------------------------------------------------------------------------------------- - else - if ( sTargetFrameName==SPECIALTARGET_BEAMER ) - { - // We are a task => search or create the beamer - if (bIsTopWindow) - { - xTarget = m_aChildFrameContainer.searchOnDirectChildrens(SPECIALTARGET_BEAMER); - if ( ! xTarget.is() ) - { - /* TODO - Creation not supported yet! - Wait for new layout manager service because we can't plug it - inside already opened document of this frame ... - */ - } - } - // We arent a task => forward request to our parent or ignore it. - else - if (xParent.is()) - xTarget = xParent->findFrame(SPECIALTARGET_BEAMER,0); - } - - else - { - //------------------------------------------------------------------------------------------------- - // II) otherwhise use optional given search flags - // force using of combinations of such flags. means no "else" part of use if() statements. - // But we ust break further searches if target was already found. - // Order of using flags is fix: SELF - CHILDREN - SIBLINGS - PARENT - // TASK and CREATE are handled special. - //------------------------------------------------------------------------------------------------- - - // get threadsafe some neccessary member which are neccessary for following functionality - /* SAFE { */ - aReadLock.lock(); - ::rtl::OUString sOwnName = m_sName; - aReadLock.unlock(); - /* } SAFE */ - - //------------------------------------------------------------------------------------------------- - // II.I) SELF - // Check for right name. If it's the searched one return ourself - otherwhise - // ignore this flag. - //------------------------------------------------------------------------------------------------- - if ( - (nSearchFlags & css::frame::FrameSearchFlag::SELF) && - (sOwnName == sTargetFrameName ) - ) - { - xTarget = this; - } - - //------------------------------------------------------------------------------------------------- - // II.II) CHILDREN - // Search on all children for the given target name. - // An empty name value can't occure here - because it must be already handled as "_self" - // before. Used helper function of container doesn't create any frame. - // It makes a deep search only. - //------------------------------------------------------------------------------------------------- - if ( - ( ! xTarget.is() ) && - (nSearchFlags & css::frame::FrameSearchFlag::CHILDREN) - ) - { - xTarget = m_aChildFrameContainer.searchOnAllChildrens(sTargetFrameName); - } - - //------------------------------------------------------------------------------------------------- - // II.III) TASKS - // This is a special flag. It regulate search on this task tree only or allow search on - // all other ones (which are sibling trees of us) too. - // Upper search must stop at this frame if we are the topest one and the TASK flag isn't set - // or we can ignore it if we have no valid parent. - //------------------------------------------------------------------------------------------------- - if ( - ( bIsTopFrame && (nSearchFlags & css::frame::FrameSearchFlag::TASKS) ) || - ( ! bIsTopFrame ) - ) - { - //------------------------------------------------------------------------------------------------- - // II.III.I) SIBLINGS - // Search on all our direct siblings - means all childrens of our parent. - // Use this flag in combination with TASK. We must supress such upper search if - // user has not set it and if we are a top frame. - // Attention: Don't forward this request to our parent as a findFrame() call. - // In such case we must protect us against recursive calls. - // Use snapshot of our parent. But don't use queryFrames() of XFrames interface. - // Because it's return all siblings and all her childrens including our children too - // if we call it with the CHILDREN flag. We doesn't need that - we need the direct container - // items of our parent only to start searches there. So we must use the container interface - // XIndexAccess instead of XFrames. - //------------------------------------------------------------------------------------------------- - if ( - ( ! xTarget.is() ) && - (nSearchFlags & css::frame::FrameSearchFlag::SIBLINGS) && - ( xParent.is() ) // search on siblings is impossible without a parent - ) - { - css::uno::Reference< css::frame::XFramesSupplier > xSupplier( xParent, css::uno::UNO_QUERY ); - if (xSupplier.is()) - { - css::uno::Reference< css::container::XIndexAccess > xContainer( xSupplier->getFrames(), css::uno::UNO_QUERY ); - if (xContainer.is()) - { - sal_Int32 nCount = xContainer->getCount(); - for( sal_Int32 i=0; i<nCount; ++i ) - { - css::uno::Reference< css::frame::XFrame > xSibling; - if ( - ( !(xContainer->getByIndex(i)>>=xSibling) ) || // control unpacking - ( ! xSibling.is() ) || // check for valid items - ( xSibling==static_cast< ::cppu::OWeakObject* >(this) ) // ignore ourself! (We are a part of this container too - but search on our children was already done.) - ) - { - continue; - } - - // Don't allow upper search here! Use rigth flags to regulate it. - // And allow deep search on children only - if it was allowed for us too. - sal_Int32 nRightFlags = css::frame::FrameSearchFlag::SELF; - if (nSearchFlags & css::frame::FrameSearchFlag::CHILDREN) - nRightFlags |= css::frame::FrameSearchFlag::CHILDREN; - xTarget = xSibling->findFrame(sTargetFrameName, nRightFlags ); - // perform search be breaking further search if a result exist. - if (xTarget.is()) - break; - } - } - } - } - - //------------------------------------------------------------------------------------------------- - // II.III.II) PARENT - // Forward search to our parent (if he exists.) - // To prevent us against recursive and superflous calls (which can occure if we allow him - // to search on his childrens too) we must change used search flags. - //------------------------------------------------------------------------------------------------- - if ( - ( ! xTarget.is() ) && - (nSearchFlags & css::frame::FrameSearchFlag::PARENT) && - ( xParent.is() ) - ) - { - if (xParent->getName() == sTargetFrameName) - xTarget = xParent; - else - { - sal_Int32 nRightFlags = nSearchFlags; - nRightFlags &= ~css::frame::FrameSearchFlag::CHILDREN; - xTarget = xParent->findFrame(sTargetFrameName, nRightFlags); - } - } - } - - //------------------------------------------------------------------------------------------------- - // II.IV) CREATE - // If we haven't found any valid target frame by using normal flags - but user allowed us to create - // a new one ... we should do that. Used TaskCreator use Desktop instance automaticly as parent! - //------------------------------------------------------------------------------------------------- - if ( - ( ! xTarget.is() ) && - (nSearchFlags & css::frame::FrameSearchFlag::CREATE) - ) - { - TaskCreator aCreator(xFactory); - xTarget = aCreator.createTask(sTargetFrameName,sal_False); - } - } - - return xTarget; -} - -/*-****************************************************************************************************//** - @short - - @descr Returns sal_True, if this frame is a "top frame", otherwise sal_False. - The "m_bIsFrameTop" member must be set in the ctor or setCreator() method. - A top frame is a member of the top frame container or a member of the - task frame container. Both containers can create new frames if the findFrame() - method of their css::frame::XFrame interface is called with a frame name not yet known. - - @seealso ctor - @seealso method setCreator() - @seealso method findFrame() - - @param - - @return true, if is it a top frame ... false otherwise. - - @onerror No error should occure! -*//*-*****************************************************************************************************/ -sal_Bool SAL_CALL Frame::isTop() throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Register transaction and reject wrong calls. - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - - // This information is set in setCreator(). - // We are top, if ouer parent is a task or the desktop or if no parent exist! - return m_bIsFrameTop; -} - -/*-****************************************************************************************************//** - @short activate frame in hierarchy - @descr This feature is used to mark active pathes in our frame hierarchy. - You can be a listener for this event to react for it ... change some internal states or something else. - - @seealso method deactivate() - @seealso method isActivate() - @seealso enum EActiveState - @seealso listener mechanism - - @param - - @return - - - @onerror - -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::activate() throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Register transaction and reject wrong calls. - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - - // Copy neccessary member and free the lock. - // It's not neccessary for m_aChildFrameContainer ... because - // he is threadsafe himself and live if we live. - // We use a registered transaction to prevent us against - // breaks during this operation! - css::uno::Reference< css::frame::XFrame > xActiveChild = m_aChildFrameContainer.getActive() ; - css::uno::Reference< css::frame::XFramesSupplier > xParent ( m_xParent, css::uno::UNO_QUERY ) ; - css::uno::Reference< css::frame::XFrame > xThis ( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY ); - css::uno::Reference< css::awt::XWindow > xComponentWindow( m_xComponentWindow, css::uno::UNO_QUERY ) ; - EActiveState eState = m_eActiveState ; - - aWriteLock.unlock(); - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - - //_________________________________________________________________________________________________________ - // 1) If I'am not active before ... - if( eState == E_INACTIVE ) - { - // ... do it then. - aWriteLock.lock(); - eState = E_ACTIVE; - m_eActiveState = eState; - aWriteLock.unlock(); - // Deactivate sibling path and forward activation to parent ... if any parent exist! - if( xParent.is() == sal_True ) - { - // Everytime set THIS frame as active child of parent and activate it. - // We MUST have a valid path from bottom to top as active path! - // But we must deactivate the old active sibling path first. - - // Attention: Deactivation of an active path, deactivate the whole path ... from bottom to top! - // But we wish to deactivate founded sibling-tree only. - // [ see deactivate() / step 4) for further informations! ] - - xParent->setActiveFrame( xThis ); - - // Then we can activate from here to top. - // Attention: We are ACTIVE now. And the parent will call activate() at us! - // But we do nothing then! We are already activated. - xParent->activate(); - } - // Its neccessary to send event NOW - not before. - // Activation goes from bottom to top! - // Thats the reason to activate parent first and send event now. - implts_sendFrameActionEvent( css::frame::FrameAction_FRAME_ACTIVATED ); - } - - //_________________________________________________________________________________________________________ - // 2) I was active before or current activated and there is a path from here to bottom, who CAN be active. - // But ouer direct child of path is not active yet. - // (It can be, if activation occur in the middle of a current path!) - // In these case we activate path to bottom to set focus on right frame! - if ( - ( eState == E_ACTIVE ) && - ( xActiveChild.is() == sal_True ) && - ( xActiveChild->isActive() == sal_False ) - ) - { - xActiveChild->activate(); - } - - //_________________________________________________________________________________________________________ - // 3) I was active before or current activated. But if I have no active child => I will get the focus! - if ( - ( eState == E_ACTIVE ) && - ( xActiveChild.is() == sal_False ) - ) - { - aWriteLock.lock(); - eState = E_FOCUS; - m_eActiveState = eState; - aWriteLock.unlock(); - implts_sendFrameActionEvent( css::frame::FrameAction_FRAME_UI_ACTIVATED ); - } -} - -/*-****************************************************************************************************//** - @short deactivate frame in hierarchy - @descr This feature is used to deactive pathes in our frame hierarchy. - You can be a listener for this event to react for it ... change some internal states or something else. - - @seealso method activate() - @seealso method isActivate() - @seealso enum EActiveState - @seealso listener mechanism - - @param - - @return - - - @onerror - -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::deactivate() throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Register transaction and reject wrong calls. - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - - // Copy neccessary member and free the lock. - css::uno::Reference< css::frame::XFrame > xActiveChild = m_aChildFrameContainer.getActive() ; - css::uno::Reference< css::frame::XFramesSupplier > xParent ( m_xParent, css::uno::UNO_QUERY ) ; - css::uno::Reference< css::frame::XFrame > xThis ( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY ); - EActiveState eState = m_eActiveState ; - - aWriteLock.unlock(); - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - - // Work only, if there something to do! - if( eState != E_INACTIVE ) - { - //_____________________________________________________________________________________________________ - // 1) Deactivate all active childs. - if ( - ( xActiveChild.is() == sal_True ) && - ( xActiveChild->isActive() == sal_True ) - ) - { - xActiveChild->deactivate(); - } - - //_____________________________________________________________________________________________________ - // 2) If I have the focus - I will lost it now. - if( eState == E_FOCUS ) - { - // Set new state INACTIVE(!) and send message to all listener. - // Don't set ACTIVE as new state. This frame is deactivated for next time - due to activate(). - aWriteLock.lock(); - eState = E_ACTIVE; - m_eActiveState = eState ; - aWriteLock.unlock(); - implts_sendFrameActionEvent( css::frame::FrameAction_FRAME_UI_DEACTIVATING ); - } - - //_____________________________________________________________________________________________________ - // 3) If I'am active - I will be deactivated now. - if( eState == E_ACTIVE ) - { - // Set new state and send message to all listener. - aWriteLock.lock(); - eState = E_INACTIVE; - m_eActiveState = eState ; - aWriteLock.unlock(); - implts_sendFrameActionEvent( css::frame::FrameAction_FRAME_DEACTIVATING ); - } - - //_____________________________________________________________________________________________________ - // 4) If there is a path from here to my parent ... - // ... I'am on the top or in the middle of deactivated subtree and action was started here. - // I must deactivate all frames from here to top, which are members of current path. - // Stop, if THESE frame not the active frame of ouer parent! - if ( - ( xParent.is() == sal_True ) && - ( xParent->getActiveFrame() == xThis ) - ) - { - // We MUST break the path - otherwise we will get the focus - not ouer parent! ... - // Attention: Ouer parent don't call us again - WE ARE NOT ACTIVE YET! - // [ see step 3 and condition "if ( m_eActiveState!=INACTIVE ) ..." in this method! ] - xParent->deactivate(); - } - } -} - -/*-****************************************************************************************************//** - @short returns active state - @descr Call it to get informations about current active state of this frame. - - @seealso method activate() - @seealso method deactivate() - @seealso enum EActiveState - - @param - - @return true if active, false otherwise. - - @onerror No error should occure. -*//*-*****************************************************************************************************/ -sal_Bool SAL_CALL Frame::isActive() throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Register transaction and reject wrong calls. - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - - return ( - ( m_eActiveState == E_ACTIVE ) || - ( m_eActiveState == E_FOCUS ) - ); -} - -/*-****************************************************************************************************//** - @short ??? - @descr - - - @seealso - - - @param - - @return - - - @onerror - -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::contextChanged() throw( css::uno::RuntimeException ) -{ - // Look for rejected calls! - // Sometimes called during closing object... => soft exceptions - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - // Impl-method is threadsafe himself! - // Send event to all listener for frame actions. - implts_sendFrameActionEvent( css::frame::FrameAction_CONTEXT_CHANGED ); -} - -/*-****************************************************************************************************//** - @short set new component inside the frame - @descr A frame is a container for a component. Use this method to set, change or realease it! - We accept null references! The xComponentWindow will be a child of our container window - and get all window events from us. - - @attention (a) A current set component can disagree with the suspend() request! - We don't set the new one and return with false then. - (b) It's possible to set: - (b1) a simple component here which supports the window only - no controller; - (b2) a full featured component which supports window and controller; - (b3) or both to NULL if outside code which to forget this component. - - @seealso method getComponentWindow() - @seealso method getController() - - @param xComponentWindow - valid reference to new component window which will be a child of internal container window - May <NULL/> for releasing. - @param xController - reference to new component controller - (may <NULL/> for relasing or setting of a simple component) - - @return <TRUE/> if operation was successful, <FALSE/> otherwise. - - @onerror We return <FALSE/>. - @threadsafe yes - @modified 06.05.2002 11:39, as96863 -*//*-*****************************************************************************************************/ -sal_Bool SAL_CALL Frame::setComponent( const css::uno::Reference< css::awt::XWindow >& xComponentWindow , - const css::uno::Reference< css::frame::XController >& xController ) throw( css::uno::RuntimeException ) -{ - //_____________________________________________________________________________________________________ - // Ignore this HACK of sfx2! - // He call us with an valid controller without a valid window ... Thats not allowed! - if ( xController.is() && ! xComponentWindow.is() ) - return sal_True; - - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - //_____________________________________________________________________________________________________ - // Get threadsafe some copies of used members. - /* SAFE { */ - ReadGuard aReadLock( m_aLock ); - css::uno::Reference< css::awt::XWindow > xContainerWindow = m_xContainerWindow; - css::uno::Reference< css::awt::XWindow > xOldComponentWindow = m_xComponentWindow; - css::uno::Reference< css::frame::XController > xOldController = m_xController; - Window* pOwnWindow = VCLUnoHelper::GetWindow( xContainerWindow ); - sal_Bool bHadFocus = pOwnWindow->HasChildPathFocus(); - sal_Bool bWasConnected = m_bConnected; - aReadLock.unlock(); - /* } SAFE */ - - //_____________________________________________________________________________________________________ - // stop listening on old window - // May it produce some trouble. - // But don't forget to listen on new window again ... or reactivate listening - // if we reject this setComponent() request and leave this method without changing the old window. - implts_stopWindowListening(); - - // Notify all listener, that this component (if current one exist) will be unloaded. - if (bWasConnected) - implts_sendFrameActionEvent( css::frame::FrameAction_COMPONENT_DETACHING ); - - //_____________________________________________________________________________________________________ - // otherwhise release old component first - // Always release controller before releasing window, - // because controller may want to access its window! - // But check for real changes - may the new controller is the old one. - if ( - (xOldController.is() ) && - (xOldController != xController) - ) - { - /* ATTENTION - Don't suspend the old controller here. Because the outside caller must do that - by definition. We have to dispose it here only. - */ - - // Before we dispose this controller we should hide it inside this frame instance. - // We hold it alive for next calls by using xOldController! - /* SAFE {*/ - WriteGuard aWriteLock( m_aLock ); - m_xController = NULL; - aWriteLock.unlock(); - /* } SAFE */ - - css::uno::Reference< css::lang::XComponent > xDisposable( xOldController, css::uno::UNO_QUERY ); - if (xDisposable.is()) - { - try - { - xDisposable->dispose(); - } - catch(const css::lang::DisposedException&) - {} - } - xOldController = NULL; - } - - //_____________________________________________________________________________________________________ - // Now it's time to release the component window. - // If controller wasn't released successfully - this code line shouldn't be reached. - // Because in case of "suspend()==false" we return immediately with false ... - // see before - // Check for real changes too. - if ( - (xOldComponentWindow.is() ) && - (xOldComponentWindow != xComponentWindow) - ) - { - /* SAFE { */ - WriteGuard aWriteLock( m_aLock ); - m_xComponentWindow = NULL; - aWriteLock.unlock(); - /* } SAFE */ - - css::uno::Reference< css::lang::XComponent > xDisposable( xOldComponentWindow, css::uno::UNO_QUERY ); - if (xDisposable.is()) - { - try - { - xDisposable->dispose(); - } - catch(const css::lang::DisposedException&) - {} - } - xOldComponentWindow = NULL; - } - - //_____________________________________________________________________________________________________ - // Now it's time to set the new component ... - // By the way - find out our new "load state" - means if we have a valid component inside. - /* SAFE { */ - WriteGuard aWriteLock( m_aLock ); - m_xComponentWindow = xComponentWindow; - m_xController = xController ; - m_bConnected = (m_xComponentWindow.is() || m_xController.is()); - sal_Bool bIsConnected = m_bConnected; - aWriteLock.unlock(); - /* } SAFE */ - - //_____________________________________________________________________________________________________ - // notifies all interest listener, that current component was changed or a new one was loaded - if (bIsConnected && bWasConnected) - implts_sendFrameActionEvent( css::frame::FrameAction_COMPONENT_REATTACHED ); - else - if (bIsConnected && !bWasConnected) - implts_sendFrameActionEvent( css::frame::FrameAction_COMPONENT_ATTACHED ); - - //_____________________________________________________________________________________________________ - // A new component window doesn't know anything about current active/focus states. - // Set this information on it! - if ( - (bHadFocus ) && - (xComponentWindow.is()) - ) - { - xComponentWindow->setFocus(); - } - - // If it was a new component window - we must resize it to fill out - // our container window. - implts_resizeComponentWindow(); - // New component should change our current icon ... - implts_setIconOnWindow(); - // OK - start listening on new window again - or do nothing if it is an empty one. - implts_startWindowListening(); - - /* SAFE { */ - aWriteLock.lock(); - impl_checkMenuCloser(); - aWriteLock.unlock(); - /* } SAFE */ - - return sal_True; -} - -/*-****************************************************************************************************//** - @short returns current set component window - @descr Frames are used to display components. The actual displayed component is - held by the m_xComponentWindow property. If the component implements only a - XComponent interface, the communication between the frame and the - component is very restricted. Better integration is achievable through a - XController interface. - If the component wants other objects to be able to get information about its - ResourceDescriptor it has to implement a XModel interface. - This frame is the owner of the component window. - - @seealso method setComponent() - - @param - - @return css::uno::Reference to current set component window. - - @onerror A null reference is returned. -*//*-*****************************************************************************************************/ -css::uno::Reference< css::awt::XWindow > SAL_CALL Frame::getComponentWindow() throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Register transaction and reject wrong calls. - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - - return m_xComponentWindow; -} - -/*-****************************************************************************************************//** - @short returns current set controller - @descr Frames are used to display components. The actual displayed component is - held by the m_xComponentWindow property. If the component implements only a - XComponent interface, the communication between the frame and the - component is very restricted. Better integration is achievable through a - XController interface. - If the component wants other objects to be able to get information about its - ResourceDescriptor it has to implement a XModel interface. - This frame is the owner of the component window. - - @seealso method setComponent() - - @param - - @return css::uno::Reference to current set controller. - - @onerror A null reference is returned. -*//*-*****************************************************************************************************/ -css::uno::Reference< css::frame::XController > SAL_CALL Frame::getController() throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - - return m_xController; -} - -/*-****************************************************************************************************//** - @short add/remove listener for activate/deactivate/contextChanged events - @descr - - - @seealso method activate() - @seealso method deactivate() - @seealso method contextChanged() - - @param "xListener" reference to your listener object - @return - - - @onerror Listener is ignored. -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::addFrameActionListener( const css::uno::Reference< css::frame::XFrameActionListener >& xListener ) throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Check incoming parameter. - LOG_ASSERT2( implcp_addFrameActionListener( xListener ), "Frame::addFrameActionListener()", "Invalid parameter detected." ) - // Listener container is threadsafe by himself ... but we must look for rejected calls! - // Our OMenuDispatch-helper (is a member of ODispatchProvider!) is create at startup of this frame BEFORE initialize! - // => soft exceptions! - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - m_aListenerContainer.addInterface( ::getCppuType( (const css::uno::Reference< css::frame::XFrameActionListener >*)NULL ), xListener ); -} - -//***************************************************************************************************************** -void SAL_CALL Frame::removeFrameActionListener( const css::uno::Reference< css::frame::XFrameActionListener >& xListener ) throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Check incoming parameter. - LOG_ASSERT2( implcp_removeFrameActionListener( xListener ), "Frame::removeFrameActionListener()", "Invalid parameter detected." ) - // Listener container is threadsafe by himself ... but we must look for rejected calls after disposing! - // But we must work with E_SOFTEXCEPTIONS ... because sometimes we are called from our listeners - // during dispose! Our work mode is E_BEFORECLOSE then ... and E_HARDEXCEPTIONS whould throw a DisposedException. - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - m_aListenerContainer.removeInterface( ::getCppuType( (const css::uno::Reference< css::frame::XFrameActionListener >*)NULL ), xListener ); -} - -/*-****************************************************************************************************//** - @short support two way mechanism to release a frame - @descr This method ask internal component (controller) if he accept this close request. - In case of <TRUE/> nothing will be happen (from point of caller of this close method). - In case of <FALSE/> a CloseVetoException is thrown. After such exception given parameter - <var>bDeliverOwnerShip</var> regulate which will be the new owner of this instance. - - @attention It's the replacement for XTask::close() which is marked as obsolete method. - - @param bDeliverOwnerShip - If parameter is set to <FALSE/> the original caller will be the owner after thrown - veto exception and must try to close this frame at later time again. Otherwhise the - source of throwed exception is the right one. May it will be the frame himself. - - @thrown CloseVetoException - if any internal things willn't be closed - - @threadsafe yes - @modified 06.05.2002 08:33, as96863 -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::close( sal_Bool bDeliverOwnerShip ) throw( css::util::CloseVetoException, - css::uno::RuntimeException ) -{ - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - // At the end of this method may we must dispose ourself ... - // and may nobody from outside hold a reference to us ... - // then it's a good idea to do that by ourself. - css::uno::Reference< css::uno::XInterface > xSelfHold( static_cast< ::cppu::OWeakObject* >(this) ); - - // Check any close listener before we look for currently running internal processes. - // Because if a listener disagree with this close() request - we hace time to finish this - // internal operations too ... - // Note: container is threadsafe himself. - css::lang::EventObject aSource (static_cast< ::cppu::OWeakObject*>(this)); - ::cppu::OInterfaceContainerHelper* pContainer = m_aListenerContainer.getContainer( ::getCppuType( ( const css::uno::Reference< css::util::XCloseListener >*) NULL ) ); - if (pContainer!=NULL) - { - ::cppu::OInterfaceIteratorHelper pIterator(*pContainer); - while (pIterator.hasMoreElements()) - { - try - { - ((css::util::XCloseListener*)pIterator.next())->queryClosing( aSource, bDeliverOwnerShip ); - } - catch( css::uno::RuntimeException& ) - { - pIterator.remove(); - } - } - } - - // Ok - no listener disagreed with this close() request - // check if this frame is used for any load process currently - if (isActionLocked()) - { - if (bDeliverOwnerShip) - { - /* SAFE */ - WriteGuard aWriteLock( m_aLock ); - m_bSelfClose = sal_True; - aWriteLock.unlock(); - /* SAFE */ - } - - throw css::util::CloseVetoException(DECLARE_ASCII("Frame in use for loading document ..."),static_cast< ::cppu::OWeakObject*>(this)); - } - - if ( ! setComponent(NULL,NULL) ) - throw css::util::CloseVetoException(DECLARE_ASCII("Component couldn't be deattached ..."),static_cast< ::cppu::OWeakObject*>(this)); - - // If closing is allowed ... inform all istener and dispose this frame! - pContainer = m_aListenerContainer.getContainer( ::getCppuType( ( const css::uno::Reference< css::util::XCloseListener >*) NULL ) ); - if (pContainer!=NULL) - { - ::cppu::OInterfaceIteratorHelper pIterator(*pContainer); - while (pIterator.hasMoreElements()) - { - try - { - ((css::util::XCloseListener*)pIterator.next())->notifyClosing( aSource ); - } - catch( css::uno::RuntimeException& ) - { - pIterator.remove(); - } - } - } - - /* SAFE { */ - WriteGuard aWriteLock( m_aLock ); - m_bIsHidden = sal_True; - aWriteLock.unlock(); - /* } SAFE */ - impl_checkMenuCloser(); - - // Attention: We must release our own registered transaction here. Otherwhise following dispose() call - // wait for us too .... - aTransaction.stop(); - dispose(); -} - -/*-****************************************************************************************************//** - @short be a listener for close events! - @descr Adds/remove a CloseListener at this frame instance. If the close() method is called on - this object, the such listener are informed and can disagree with that by throwing - a CloseVetoException. - - @seealso Frame::close() - - @param xListener - reference to your listener object - - @onerror Listener is ignored. - - @threadsafe yes - @modified 06.05.2002 10:03, as96863 -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::addCloseListener( const css::uno::Reference< css::util::XCloseListener >& xListener ) throw (css::uno::RuntimeException) -{ - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - // We doesn't need any lock here ... - // Container lives if we live and is threadsafe by himself. - m_aListenerContainer.addInterface( ::getCppuType( ( const css::uno::Reference< css::util::XCloseListener >* ) NULL ), xListener ); -} - -//***************************************************************************************************************** -void SAL_CALL Frame::removeCloseListener( const css::uno::Reference< css::util::XCloseListener >& xListener ) throw (css::uno::RuntimeException) -{ - // Use soft exception mode - moslty this method is called during disposing of this frame ... - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - // We doesn't need any lock here ... - // Container lives if we live and is threadsafe by himself. - m_aListenerContainer.removeInterface( ::getCppuType( ( const css::uno::Reference< css::util::XCloseListener >* ) NULL ), xListener ); -} - -//***************************************************************************************************************** -::rtl::OUString SAL_CALL Frame::getTitle() - throw (css::uno::RuntimeException) -{ - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - // SAFE -> - ReadGuard aReadLock(m_aLock); - css::uno::Reference< css::frame::XTitle > xTitle(m_xTitleHelper, css::uno::UNO_QUERY_THROW); - aReadLock.unlock(); - // <- SAFE - - return xTitle->getTitle(); -} - -//***************************************************************************************************************** -void SAL_CALL Frame::setTitle( const ::rtl::OUString& sTitle ) - throw (css::uno::RuntimeException) -{ - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - // SAFE -> - ReadGuard aReadLock(m_aLock); - css::uno::Reference< css::frame::XTitle > xTitle(m_xTitleHelper, css::uno::UNO_QUERY_THROW); - aReadLock.unlock(); - // <- SAFE - - xTitle->setTitle(sTitle); -} - -//***************************************************************************************************************** -void SAL_CALL Frame::addTitleChangeListener( const css::uno::Reference< css::frame::XTitleChangeListener >& xListener) - throw (css::uno::RuntimeException) -{ - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - // SAFE -> - ReadGuard aReadLock(m_aLock); - css::uno::Reference< css::frame::XTitleChangeBroadcaster > xTitle(m_xTitleHelper, css::uno::UNO_QUERY_THROW); - aReadLock.unlock(); - // <- SAFE - - xTitle->addTitleChangeListener(xListener); -} - -//***************************************************************************************************************** -void SAL_CALL Frame::removeTitleChangeListener( const css::uno::Reference< css::frame::XTitleChangeListener >& xListener ) - throw (css::uno::RuntimeException) -{ - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - // SAFE -> - ReadGuard aReadLock(m_aLock); - css::uno::Reference< css::frame::XTitleChangeBroadcaster > xTitle(m_xTitleHelper, css::uno::UNO_QUERY_THROW); - aReadLock.unlock(); - // <- SAFE - - xTitle->removeTitleChangeListener(xListener); -} - -/*-****************************************************************************************************/ -void Frame::implts_forgetSubFrames() -{ - // SAFE -> - ReadGuard aReadLock(m_aLock); - css::uno::Reference< css::container::XIndexAccess > xContainer(m_xFramesHelper, css::uno::UNO_QUERY_THROW); - aReadLock.unlock(); - // <- SAFE - - sal_Int32 c = xContainer->getCount(); - sal_Int32 i = 0; - - for (i=0; i<c; ++i) - { - try - { - css::uno::Reference< css::frame::XFrame > xFrame; - xContainer->getByIndex(i) >>= xFrame; - if (xFrame.is()) - xFrame->setCreator(css::uno::Reference< css::frame::XFramesSupplier >()); - } - catch(const css::uno::Exception&) - { - // Ignore errors here. - // Nobody can guarantee a stable index in multi threaded environments .-) - } - } - - // SAFE -> - WriteGuard aWriteLock(m_aLock); - m_xFramesHelper.clear(); // clear uno reference - m_aChildFrameContainer.clear(); // clear container content - aWriteLock.unlock(); - // <- SAFE -} - -/*-****************************************************************************************************//** - @short destroy instance - @descr The owner of this object calles the dispose method if the object - should be destroyed. All other objects and components, that are registered - as an EventListener are forced to release their references to this object. - Furthermore this frame is removed from its parent frame container to release - this reference. The reference attributes are disposed and released also. - - @attention Look for globale description at beginning of file too! - (DisposedException, FairRWLock ..., initialize, dispose) - - @seealso method initialize() - @seealso baseclass FairRWLockBase! - - @param - - @return - - - @onerror - -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::dispose() throw( css::uno::RuntimeException ) -{ - // We should hold a reference to ourself ... - // because our owner dispose us and release our reference ... - // May be we will die before we could finish this method ... - css::uno::Reference< css::frame::XFrame > xThis( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY ); - - LOG_DISPOSEEVENT( "Frame", sName ) - - // First operation should be ... "stopp all listening for window events on our container window". - // These events are superflous but can make trouble! - // We will die, die and die ... - implts_stopWindowListening(); - - if (m_xLayoutManager.is()) - lcl_disableLayoutManager(m_xLayoutManager, this); - - delete m_pWindowCommandDispatch; - - // Send message to all listener and forget her references. - css::lang::EventObject aEvent( xThis ); - m_aListenerContainer.disposeAndClear( aEvent ); - - // set "end of live" for our property set helper - impl_disablePropertySet(); - - // interception/dispatch chain must be destructed explicitly - // Otherwhise some dispatches and/or interception objects wont die. - css::uno::Reference< css::lang::XEventListener > xDispatchHelper(m_xDispatchHelper, css::uno::UNO_QUERY_THROW); - xDispatchHelper->disposing(aEvent); - xDispatchHelper.clear(); - - // Disable this instance for further work. - // This will wait for all current running ones ... - // and reject all further requests! - m_aTransactionManager.setWorkingMode( E_BEFORECLOSE ); - - // Don't show any dialogs, errors or something else any more! - // If somewhere called dispose() whitout close() before - normaly no dialogs - // should exist. Otherwhise it's the problem of the outside caller. - // Note: - // (a) Do it after stopWindowListening(). May that force some active/deactive - // notifications which we doesn't need here realy. - // (b) Don't forget to save the old value of IsDialogCancelEnabled() to - // restore it afterwards. We cannot call EnableDialogCancel( sal_False ) - // as we would kill the headless mode! - sal_Bool bCancelDialogs( Application::IsDialogCancelEnabled() ); - Application::EnableDialogCancel( sal_True ); - - // We should be alone for ever and further dispose calls are rejected by lines before ... - // I hope it :-) - - // Free references of our frame tree. - // Force parent container to forget this frame too ... - // ( It's contained in m_xParent and so no css::lang::XEventListener for m_xParent! ) - // It's important to do that before we free some other internal structures. - // Because if our parent gets an activate and found us as last possible active frame - // he try to deactivate us ... and we run into some trouble (DisposedExceptions!). - if( m_xParent.is() == sal_True ) - { - m_xParent->getFrames()->remove( xThis ); - m_xParent = css::uno::Reference< css::frame::XFramesSupplier >(); - } - - /* } SAFE */ - // Forget our internal component and her window first. - // So we can release our container window later without problems. - // Because this container window is the parent of the component window ... - // Note: Dispose it hard - because suspending must be done inside close() call! - // But try to dispose the controller first befor you destroy the window. - // Because the window is used by the controller too ... - if (m_xController.is()) - { - css::uno::Reference< css::lang::XComponent > xDisposable( m_xController, css::uno::UNO_QUERY ); - if (xDisposable.is()) - xDisposable->dispose(); - } - - if (m_xComponentWindow.is()) - { - css::uno::Reference< css::lang::XComponent > xDisposable( m_xComponentWindow, css::uno::UNO_QUERY ); - if (xDisposable.is()) - xDisposable->dispose(); - } - - impl_checkMenuCloser(); - - impl_disposeContainerWindow( m_xContainerWindow ); - - /*ATTENTION - Clear container after successful removing from parent container ... - because our parent could be the desktop which stand in dispose too! - If we have already cleared our own container we lost our child before this could be - remove himself at this instance ... - Release m_xFramesHelper after that ... it's the same problem between parent and child! - "m_xParent->getFrames()->remove( xThis );" needs this helper ... - Otherwise we get a null reference and could finish removing successfuly. - => You see: Order of calling operations is important!!! - */ - implts_forgetSubFrames(); - - // Release some other references. - // This calls should be easy ... I hope it :-) - m_xDispatchHelper.clear(); - m_xFactory.clear(); - m_xDropTargetListener.clear(); - m_xDispatchRecorderSupplier.clear(); - m_xLayoutManager.clear(); - m_xIndicatorFactoryHelper.clear(); - - // It's important to set default values here! - // If may be later somewhere change the disposed-behaviour of this implementation - // and doesn't throw any DisposedExceptions we must guarantee best matching default values ... - m_eActiveState = E_INACTIVE; - m_sName = ::rtl::OUString(); - m_bIsFrameTop = sal_False; - m_bConnected = sal_False; - m_nExternalLockCount = 0; - m_bSelfClose = sal_False; - m_bIsHidden = sal_True; - - // Disable this instance for further working realy! - m_aTransactionManager.setWorkingMode( E_CLOSE ); - - // Don't forget it restore old value - - // otherwhise no dialogs can be shown anymore in other frames. - Application::EnableDialogCancel( bCancelDialogs ); -} - -/*-****************************************************************************************************//** - @short Be a listener for dispose events! - @descr Adds/remove an EventListener to this object. If the dispose method is called on - this object, the disposing method of the listener is called. - - @seealso - - - @param "xListener" reference to your listener object. - @return - - - @onerror Listener is ignored. -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Check incoming parameter. - LOG_ASSERT2( implcp_addEventListener( xListener ), "Frame::addEventListener()", "Invalid parameter detected." ) - // Look for rejected calls only! - // Container is threadsafe. - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - m_aListenerContainer.addInterface( ::getCppuType( ( const css::uno::Reference< css::lang::XEventListener >* ) NULL ), xListener ); -} - -//***************************************************************************************************************** -void SAL_CALL Frame::removeEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Check incoming parameter. - LOG_ASSERT2( implcp_removeEventListener( xListener ), "Frame::removeEventListener()", "Invalid parameter detected." ) - // Look for rejected calls only! - // Container is threadsafe. - // Use E_SOFTEXCEPTIONS to allow removing listeners during dispose call! - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - m_aListenerContainer.removeInterface( ::getCppuType( ( const css::uno::Reference< css::lang::XEventListener >* ) NULL ), xListener ); -} - -/*-****************************************************************************************************//** - @short create new status indicator - @descr Use returned status indicator to show progresses and some text informations. - All created objects share the same dialog! Only the last one can show his information. - - @seealso class StatusIndicatorFactory - @seealso class StatusIndicator - - @param - - @return A reference to created object. - - @onerror We return a null reference. -*//*-*****************************************************************************************************/ -css::uno::Reference< css::task::XStatusIndicator > SAL_CALL Frame::createStatusIndicator() throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA ----------------------------------------------------------------------------------------- */ - // Look for rejected calls! - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - - // Make snapshot of neccessary member and define default return value. - css::uno::Reference< css::task::XStatusIndicator > xExternal(m_xIndicatorInterception.get(), css::uno::UNO_QUERY); - css::uno::Reference< css::task::XStatusIndicatorFactory > xFactory = m_xIndicatorFactoryHelper; - - aReadLock.unlock(); - /* UNSAFE AREA ----------------------------------------------------------------------------------------- */ - - // Was set from outside to intercept any progress activities! - if (xExternal.is()) - return xExternal; - - // Or use our own factory as fallback, to create such progress. - if (xFactory.is()) - return xFactory->createStatusIndicator(); - - return css::uno::Reference< css::task::XStatusIndicator >(); -} - -/*-****************************************************************************************************//** - @short search for target to load URL - @descr This method searches for a dispatch for the specified DispatchDescriptor. - The FrameSearchFlags and the FrameName of the DispatchDescriptor are - treated as described for findFrame. - - @seealso method findFrame() - @seealso method queryDispatches() - @seealso method set/getName() - @seealso class TargetFinder - - @param "aURL" , URL for loading - @param "sTargetFrameName" , name of target frame - @param "nSearchFlags" , additional flags to regulate search if sTargetFrameName isn't clear - @return css::uno::Reference to dispatch handler. - - @onerror A null reference is returned. -*//*-*****************************************************************************************************/ -css::uno::Reference< css::frame::XDispatch > SAL_CALL Frame::queryDispatch( const css::util::URL& aURL , - const ::rtl::OUString& sTargetFrameName, - sal_Int32 nSearchFlags ) throw( css::uno::RuntimeException ) -{ - const char UNO_PROTOCOL[] = ".uno:"; - - // Don't check incoming parameter here! Our helper do it for us and it isn't a good idea to do it more then ones! - // But look for rejected calls! - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - // Remove uno and cmd protocol part as we want to support both of them. We store only the command part - // in our hash map. All other protocols are stored with the protocol part. - String aCommand( aURL.Main ); - if ( aURL.Protocol.equalsIgnoreAsciiCaseAsciiL( UNO_PROTOCOL, sizeof( UNO_PROTOCOL )-1 )) - aCommand = aURL.Path; - - // Make boost::unordered_map lookup if the current URL is in the disabled list - if ( m_aCommandOptions.Lookup( SvtCommandOptions::CMDOPTION_DISABLED, aCommand ) ) - return css::uno::Reference< css::frame::XDispatch >(); - else - { - // We use a helper to support these interface and an interceptor mechanism. - // Our helper is threadsafe by himself! - return m_xDispatchHelper->queryDispatch( aURL, sTargetFrameName, nSearchFlags ); - } -} - -/*-****************************************************************************************************//** - @short handle more then ones dispatches at same call - @descr Returns a sequence of dispatches. For details see the queryDispatch method. - For failed dispatches we return empty items in list! - - @seealso method queryDispatch() - - @param "lDescriptor" list of dispatch arguments for queryDispatch()! - @return List of dispatch references. Some elements can be NULL! - - @onerror An empty list is returned. -*//*-*****************************************************************************************************/ -css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL Frame::queryDispatches( const css::uno::Sequence< css::frame::DispatchDescriptor >& lDescriptor ) throw( css::uno::RuntimeException ) -{ - // Don't check incoming parameter here! Our helper do it for us and it isn't a good idea to do it more then ones! - // But look for rejected calls! - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - // We use a helper to support these interface and an interceptor mechanism. - // Our helper is threadsafe by himself! - return m_xDispatchHelper->queryDispatches( lDescriptor ); -} - -/*-****************************************************************************************************//** - @short register/unregister interceptor for dispatch calls - @descr If you whish to handle some dispatches by himself ... you should be - an interceptor for it. Please see class OInterceptionHelper for further informations. - - @seealso class OInterceptionHelper - - @param "xInterceptor", reference to your interceptor implementation. - @return - - - @onerror Interceptor is ignored. -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::registerDispatchProviderInterceptor( const css::uno::Reference< css::frame::XDispatchProviderInterceptor >& xInterceptor ) throw( css::uno::RuntimeException ) -{ - // We use a helper to support these interface and an interceptor mechanism. - // This helper is threadsafe himself and check incoming parameter too. - // I think we don't need any lock here! - // But we must look for rejected calls. - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - css::uno::Reference< css::frame::XDispatchProviderInterception > xInterceptionHelper( m_xDispatchHelper, css::uno::UNO_QUERY ); - xInterceptionHelper->registerDispatchProviderInterceptor( xInterceptor ); -} - -//***************************************************************************************************************** -void SAL_CALL Frame::releaseDispatchProviderInterceptor( const css::uno::Reference< css::frame::XDispatchProviderInterceptor >& xInterceptor ) throw( css::uno::RuntimeException ) -{ - // We use a helper to support these interface and an interceptor mechanism. - // This helper is threadsafe himself and check incoming parameter too. - // I think we don't need any lock here! - // But we must look for rejected calls ... - // Sometimes we are called during our dispose() method ... => soft exceptions! - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - - css::uno::Reference< css::frame::XDispatchProviderInterception > xInterceptionHelper( m_xDispatchHelper, css::uno::UNO_QUERY ); - xInterceptionHelper->releaseDispatchProviderInterceptor( xInterceptor ); -} - -/*-****************************************************************************************************//** - @short provides information about all possible dispatch functions - inside the currnt frame environment -*//*-*****************************************************************************************************/ -css::uno::Sequence< sal_Int16 > SAL_CALL Frame::getSupportedCommandGroups() - throw(css::uno::RuntimeException) -{ - return m_xDispatchInfoHelper->getSupportedCommandGroups(); -} - -//***************************************************************************************************************** -css::uno::Sequence< css::frame::DispatchInformation > SAL_CALL Frame::getConfigurableDispatchInformation(sal_Int16 nCommandGroup) - throw(css::uno::RuntimeException) -{ - return m_xDispatchInfoHelper->getConfigurableDispatchInformation(nCommandGroup); -} - -/*-****************************************************************************************************//** - @short notifications for window events - @descr We are a listener on our container window to forward it to our component window. - - @seealso method setComponent() - @seealso member m_xContainerWindow - @seealso member m_xComponentWindow - - @param "aEvent" describe source of detected event - @return - - - @onerror - -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::windowResized( const css::awt::WindowEvent& -#if OSL_DEBUG_LEVEL > 0 -aEvent -#endif -) throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Check incoming parameter. - LOG_ASSERT2( implcp_windowResized( aEvent ), "Frame::windowResized()", "Invalid parameter detected." ) - // Look for rejected calls. - // Part of dispose-mechanism => soft exceptions - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - // Impl-method is threadsafe! - // If we have a current component window - we must resize it! - implts_resizeComponentWindow(); -} - -//***************************************************************************************************************** -void SAL_CALL Frame::focusGained( const css::awt::FocusEvent& -#if OSL_DEBUG_LEVEL > 0 -aEvent -#endif -) throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Check incoming parameter. - LOG_ASSERT2( implcp_focusGained( aEvent ), "Frame::focusGained()", "Invalid parameter detected." ) - // Look for rejected calls. - // Part of dispose() mechanism ... => soft exceptions! - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - // Make snapshot of member! - css::uno::Reference< css::awt::XWindow > xComponentWindow = m_xComponentWindow; - aReadLock.unlock(); - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - - if( xComponentWindow.is() == sal_True ) - { - xComponentWindow->setFocus(); - } -} - -/*-****************************************************************************************************//** - @short notifications for window events - @descr We are a listener on our container window to forward it to our component window ... - but a XTopWindowListener we are only if we are a top frame! - - @seealso method setComponent() - @seealso member m_xContainerWindow - @seealso member m_xComponentWindow - - @param "aEvent" describe source of detected event - @return - - - @onerror - -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::windowActivated( const css::lang::EventObject& -#if OSL_DEBUG_LEVEL > 0 -aEvent -#endif -) throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Check incoming parameter. - LOG_ASSERT2( implcp_windowActivated( aEvent ), "Frame::windowActivated()", "Invalid parameter detected." ) - // Look for rejected calls. - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - // Make snapshot of member! - EActiveState eState = m_eActiveState; - aReadLock.unlock(); - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Activate the new active path from here to top. - if( eState == E_INACTIVE ) - { - setActiveFrame( css::uno::Reference< css::frame::XFrame >() ); - activate(); - } -} - -//***************************************************************************************************************** -void SAL_CALL Frame::windowDeactivated( const css::lang::EventObject& -#if OSL_DEBUG_LEVEL > 0 -aEvent -#endif -) throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Check incoming parameter. - LOG_ASSERT2( implcp_windowDeactivated( aEvent ), "Frame::windowDeactivated()", "Invalid parameter detected." ) - // Look for rejected calls. - // Sometimes called during dispose() => soft exceptions - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - - css::uno::Reference< css::frame::XFrame > xParent ( m_xParent, css::uno::UNO_QUERY ); - css::uno::Reference< css::awt::XWindow > xContainerWindow = m_xContainerWindow; - EActiveState eActiveState = m_eActiveState ; - - aReadLock.unlock(); - - if( eActiveState != E_INACTIVE ) - { - // Deactivation is always done implicitely by activation of another frame. - // Only if no activation is done, deactivations have to be processed if the activated window - // is a parent window of the last active Window! - SolarMutexClearableGuard aSolarGuard; - Window* pFocusWindow = Application::GetFocusWindow(); - if ( - ( xContainerWindow.is() == sal_True ) && - ( xParent.is() == sal_True ) && - ( (css::uno::Reference< css::frame::XDesktop >( xParent, css::uno::UNO_QUERY )).is() == sal_False ) - ) - { - css::uno::Reference< css::awt::XWindow > xParentWindow = xParent->getContainerWindow() ; - Window* pParentWindow = VCLUnoHelper::GetWindow( xParentWindow ); - //#i70261#: dialogs opend from an OLE object will cause a deactivate on the frame of the OLE object - // on Solaris/Linux at that time pFocusWindow is still NULL because the focus handling is different; right after - // the deactivation the focus will be set into the dialog! - // currently I see no case where a sub frame could get a deactivate with pFocusWindow being NULL permanently - // so for now this case is omitted from handled deactivations - if( pFocusWindow && pParentWindow->IsChild( pFocusWindow ) ) - { - css::uno::Reference< css::frame::XFramesSupplier > xSupplier( xParent, css::uno::UNO_QUERY ); - if( xSupplier.is() == sal_True ) - { - aSolarGuard.clear(); - xSupplier->setActiveFrame( css::uno::Reference< css::frame::XFrame >() ); - } - } - } - } -} - -//***************************************************************************************************************** -void SAL_CALL Frame::windowClosing( const css::lang::EventObject& ) throw( css::uno::RuntimeException ) -{ - /* #i62088# - Some interceptor objects intercept our "internaly asynchronoues implemented" dispatch call. - And they close this frame directly (means synchronous then). - Means: Frame::windowClosing()->Frame::close() - In such situation its not a good idea to hold this transaction count alive .-) - */ - { - // Look for rejected calls. - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - // deactivate this frame ... - deactivate(); - } - - // ... and try to close it - // But do it asynchron inside the main thread. - // VCL has no fun to do such things outside his main thread :-( - // Note: The used dispatch make it asynchronous for us .-) - - /*ATTENTION! - Don't try to suspend the controller here! Because it's done inside used dispatch(). - Otherwhise the dialog "would you save your changes?" will be shown more then once ... - */ - - /* SAFE */ - ReadGuard aReadLock( m_aLock ); - css::uno::Reference< css::lang::XMultiServiceFactory > xFactory = m_xFactory; - aReadLock.unlock(); - /* SAFE */ - - css::util::URL aURL; - aURL.Complete = DECLARE_ASCII(".uno:CloseFrame"); - css::uno::Reference< css::util::XURLTransformer > xParser(xFactory->createInstance(SERVICENAME_URLTRANSFORMER), css::uno::UNO_QUERY_THROW); - xParser->parseStrict(aURL); - - css::uno::Reference< css::frame::XDispatch > xCloser = queryDispatch(aURL, SPECIALTARGET_SELF, 0); - if (xCloser.is()) - xCloser->dispatch(aURL, css::uno::Sequence< css::beans::PropertyValue >()); - - // Attention: If this dispatch works synchronous ... and full fill its job ... - // this line of code will never be reached ... - // Or if it will be reached it will be for sure that all your member are gone .-) -} - -/*-****************************************************************************************************//** - @short react for a show event for the internal container window - @descr Normaly we doesn't need this information realy. But we can use it to - implement the special feature "trigger first visible task". - - Algorithm: - first we have to check if we are a top (task) frame - It's not enough to be a top frame! Because we MUST have the desktop as parent. - But frames without a parent are top too. So it's not possible to check isTop() here! - We have to look for the type of our parent. - - if we are a task frame, then we have to check if we are the first one. - We use a static variable to do so. They will be reset to afterwards be shure - that further calls of this method doesn't do anything then. - - Then we have to trigger the right event string on the global job executor. - - @seealso css::task::JobExecutor - - @param aEvent - describes the source of this event - We are not interested on this information. We are interested on the visible state only. - - @threadsafe yes - @modified 31.07.2002 07:56, as96863 -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::windowShown( const css::lang::EventObject& ) throw(css::uno::RuntimeException) -{ - static sal_Bool bFirstVisibleTask = sal_True; - - /* SAFE { */ - ReadGuard aReadLock(m_aLock); - css::uno::Reference< css::frame::XDesktop > xDesktopCheck( m_xParent, css::uno::UNO_QUERY ); - css::uno::Reference< css::lang::XMultiServiceFactory > xFactory = m_xFactory; - m_bIsHidden = sal_False; - aReadLock.unlock(); - /* } SAFE */ - - impl_checkMenuCloser(); - - if (xDesktopCheck.is()) - { - /* STATIC SAFE { */ - WriteGuard aStaticWriteLock( LockHelper::getGlobalLock() ); - sal_Bool bMustBeTriggered = bFirstVisibleTask; - bFirstVisibleTask = sal_False; - aStaticWriteLock.unlock(); - /* } STATIC SAFE */ - - if (bMustBeTriggered) - { - css::uno::Reference< css::task::XJobExecutor > xExecutor( xFactory->createInstance( SERVICENAME_JOBEXECUTOR ), css::uno::UNO_QUERY ); - if (xExecutor.is()) - { - xExecutor->trigger( DECLARE_ASCII("onFirstVisibleTask") ); - } - } - } -} - -void SAL_CALL Frame::windowHidden( const css::lang::EventObject& ) throw(css::uno::RuntimeException) -{ - /* SAFE { */ - ReadGuard aReadLock(m_aLock); - m_bIsHidden = sal_True; - aReadLock.unlock(); - /* } SAFE */ - - impl_checkMenuCloser(); -} - -/*-****************************************************************************************************//** - @short called by dispose of our windows! - @descr This object is forced to release all references to the interfaces given - by the parameter source. We are a listener at our container window and - should listen for his diposing. - - @seealso XWindowListener - @seealso XTopWindowListener - @seealso XFocusListener - - @param - - @return - - - @onerror - -*//*-*****************************************************************************************************/ -void SAL_CALL Frame::disposing( const css::lang::EventObject& aEvent ) throw( css::uno::RuntimeException ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Check incoming parameter. - LOG_ASSERT2( implcp_disposing( aEvent ), "Frame::disposing()", "Invalid parameter detected." ) - // Look for rejected calls. - // May be we are called during releasing our windows in our in dispose call!? => soft exceptions - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - - if( aEvent.Source == m_xContainerWindow ) - { - // NECCESSARY: Impl-method is threadsafe by himself! - aWriteLock.unlock(); - implts_stopWindowListening(); - aWriteLock.lock(); - m_xContainerWindow = css::uno::Reference< css::awt::XWindow >(); - } -} - -/*-************************************************************************************************************//** - @interface com.sun.star.document.XActionLockable - @short implement locking of frame/task from outside - @descr Sometimes we have problems to decide if closing of task is allowed. Because; frame/task - could be used for pending loading jobs. So you can lock this object from outside and - prevent instance against closing during using! But - don't do it in a wrong or expensive manner. - Otherwise task couldn't die anymore!!! - - @seealso interface XActionLockable - @seeelso method BaseDispatcher::implts_loadIt() - @seeelso method Desktop::loadComponentFromURL() - - @param - - @return true if frame/task is locked - false otherwise - - @onerror - - @threadsafe yes -*//*-*************************************************************************************************************/ -sal_Bool SAL_CALL Frame::isActionLocked() throw( css::uno::RuntimeException ) -{ - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - return( m_nExternalLockCount!=0); -} - -//***************************************************************************************************************** -void SAL_CALL Frame::addActionLock() throw( css::uno::RuntimeException ) -{ - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - ++m_nExternalLockCount; -} - -//***************************************************************************************************************** -void SAL_CALL Frame::removeActionLock() throw( css::uno::RuntimeException ) -{ - // Register no transaction here! Otherwhise we wait for ever inside possible - // implts_checkSuicide()/dispose() request ... - - /* SAFE AREA */{ - WriteGuard aWriteLock( m_aLock ); - LOG_ASSERT2( m_nExternalLockCount<=0, "Frame::removeActionLock()", "Frame isn't locked! Possible multithreading problem detected." ) - --m_nExternalLockCount; - }/* SAFE */ - - implts_checkSuicide(); -} - -//***************************************************************************************************************** -void SAL_CALL Frame::setActionLocks( sal_Int16 nLock ) throw( css::uno::RuntimeException ) -{ - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - // Attention: If somewhere called resetActionLocks() before and get e.g. 5 locks ... - // and tried to set these 5 ones here after his operations ... - // we can't ignore setted requests during these two calls! - // So we must add(!) these 5 locks here. - m_nExternalLockCount = m_nExternalLockCount + nLock; -} - -//***************************************************************************************************************** -sal_Int16 SAL_CALL Frame::resetActionLocks() throw( css::uno::RuntimeException ) -{ - // Register no transaction here! Otherwhise we wait for ever inside possible - // implts_checkSuicide()/dispose() request ... - - sal_Int16 nCurrentLocks = 0; - /* SAFE */{ - WriteGuard aWriteLock( m_aLock ); - nCurrentLocks = m_nExternalLockCount; - m_nExternalLockCount = 0; - }/* SAFE */ - - // Attention: - // external lock count is 0 here every time ... but if - // member m_bSelfClose is set to true too .... we call our own close()/dispose(). - // See close() for further informations - implts_checkSuicide(); - - return nCurrentLocks; -} - -//***************************************************************************************************************** -void Frame::impl_initializePropInfo() -{ - impl_setPropertyChangeBroadcaster(static_cast< css::frame::XFrame* >(this)); - - impl_addPropertyInfo( - css::beans::Property( - FRAME_PROPNAME_DISPATCHRECORDERSUPPLIER, - FRAME_PROPHANDLE_DISPATCHRECORDERSUPPLIER, - ::getCppuType((const css::uno::Reference< css::frame::XDispatchRecorderSupplier >*)NULL), - css::beans::PropertyAttribute::TRANSIENT)); - - impl_addPropertyInfo( - css::beans::Property( - FRAME_PROPNAME_INDICATORINTERCEPTION, - FRAME_PROPHANDLE_INDICATORINTERCEPTION, - ::getCppuType((const css::uno::Reference< css::task::XStatusIndicator >*)NULL), - css::beans::PropertyAttribute::TRANSIENT)); - - impl_addPropertyInfo( - css::beans::Property( - FRAME_PROPNAME_ISHIDDEN, - FRAME_PROPHANDLE_ISHIDDEN, - ::getBooleanCppuType(), - css::beans::PropertyAttribute::TRANSIENT | css::beans::PropertyAttribute::READONLY)); - - impl_addPropertyInfo( - css::beans::Property( - FRAME_PROPNAME_LAYOUTMANAGER, - FRAME_PROPHANDLE_LAYOUTMANAGER, - ::getCppuType((const css::uno::Reference< ::com::sun::star::frame::XLayoutManager >*)NULL), - css::beans::PropertyAttribute::TRANSIENT)); - - impl_addPropertyInfo( - css::beans::Property( - FRAME_PROPNAME_TITLE, - FRAME_PROPHANDLE_TITLE, - ::getCppuType((const ::rtl::OUString*)NULL), - css::beans::PropertyAttribute::TRANSIENT)); -} - -//***************************************************************************************************************** -void SAL_CALL Frame::impl_setPropertyValue(const ::rtl::OUString& /*sProperty*/, - sal_Int32 nHandle , - const css::uno::Any& aValue ) - -{ - static ::rtl::OUString MATERIALPROP_TITLE(RTL_CONSTASCII_USTRINGPARAM("title")); - - /* There is no need to lock any mutex here. Because we share the - solar mutex with our base class. And we said to our base class: "dont release it on calling us" .-) - see ctor of PropertySetHelper for further informations. - */ - - /* Attention: You can use nHandle only, if you are sure that all supported - properties has an unique handle. That must be guaranteed - inside method impl_initializePropInfo()! - */ - switch (nHandle) - { - case FRAME_PROPHANDLE_TITLE : - { - ::rtl::OUString sExternalTitle; - aValue >>= sExternalTitle; - setTitle (sExternalTitle); - } - break; - - case FRAME_PROPHANDLE_DISPATCHRECORDERSUPPLIER : - aValue >>= m_xDispatchRecorderSupplier; - break; - - case FRAME_PROPHANDLE_LAYOUTMANAGER : - { - css::uno::Reference< css::frame::XLayoutManager > xOldLayoutManager = m_xLayoutManager; - css::uno::Reference< css::frame::XLayoutManager > xNewLayoutManager; - aValue >>= xNewLayoutManager; - - if (xOldLayoutManager != xNewLayoutManager) - { - m_xLayoutManager = xNewLayoutManager; - if (xOldLayoutManager.is()) - lcl_disableLayoutManager(xOldLayoutManager, this); - if (xNewLayoutManager.is()) - lcl_enableLayoutManager(xNewLayoutManager, this); - } - } - break; - - case FRAME_PROPHANDLE_INDICATORINTERCEPTION : - { - css::uno::Reference< css::task::XStatusIndicator > xProgress; - aValue >>= xProgress; - m_xIndicatorInterception = xProgress; - } - break; - - #ifdef ENABLE_WARNINGS - default : - LOG_WARNING( "Frame::setFastPropertyValue_NoBroadcast()", "Invalid handle detected!" ) - break; - #endif - } -} - -//***************************************************************************************************************** -css::uno::Any SAL_CALL Frame::impl_getPropertyValue(const ::rtl::OUString& /*sProperty*/, - sal_Int32 nHandle ) -{ - /* There is no need to lock any mutex here. Because we share the - solar mutex with our base class. And we said to our base class: "dont release it on calling us" .-) - see ctor of PropertySetHelper for further informations. - */ - - /* Attention: You can use nHandle only, if you are sure that all supported - properties has an unique handle. That must be guaranteed - inside method impl_initializePropInfo()! - */ - css::uno::Any aValue; - switch (nHandle) - { - case FRAME_PROPHANDLE_TITLE : - aValue <<= getTitle (); - break; - - case FRAME_PROPHANDLE_DISPATCHRECORDERSUPPLIER : - aValue <<= m_xDispatchRecorderSupplier; - break; - - case FRAME_PROPHANDLE_ISHIDDEN : - aValue <<= m_bIsHidden; - break; - - case FRAME_PROPHANDLE_LAYOUTMANAGER : - aValue <<= m_xLayoutManager; - break; - - case FRAME_PROPHANDLE_INDICATORINTERCEPTION : - { - css::uno::Reference< css::task::XStatusIndicator > xProgress(m_xIndicatorInterception.get(), css::uno::UNO_QUERY); - aValue = css::uno::makeAny(xProgress); - } - break; - - #ifdef ENABLE_WARNINGS - default : - LOG_WARNING( "Frame::getFastPropertyValue()", "Invalid handle detected!" ) - break; - #endif - } - - return aValue; -} - -/*-****************************************************************************************************//** - @short dispose old container window and forget his reference - @descr Sometimes we must repair our "modal dialog parent mechanism" too! - - @seealso - - - @param "xWindow", reference to old container window to dispose it - @return An empty reference. - - @onerror - - @threadsafe NO! -*//*-*****************************************************************************************************/ -void Frame::impl_disposeContainerWindow( css::uno::Reference< css::awt::XWindow >& xWindow ) -{ - if( xWindow.is() == sal_True ) - { - xWindow->setVisible( sal_False ); - // All VclComponents are XComponents; so call dispose before discarding - // a css::uno::Reference< XVclComponent >, because this frame is the owner of the window - xWindow->dispose(); - xWindow = css::uno::Reference< css::awt::XWindow >(); - } -} - -/*-****************************************************************************************************//** - @short send frame action event to our listener - @descr This method is threadsafe AND can be called by our dispose method too! - - @seealso - - - @param "aAction", describe the event for sending - @return - - - @onerror - -*//*-*****************************************************************************************************/ -void Frame::implts_sendFrameActionEvent( const css::frame::FrameAction& aAction ) -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Sometimes used by dispose() => soft exceptions! - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - - // Log informations about order of events to file! - // (only activated in debug version!) - LOG_FRAMEACTIONEVENT( "Frame", m_sName, aAction ) - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - // Send css::frame::FrameAction event to all listener. - // Get container for right listener. - // FOLLOW LINES ARE THREADSAFE!!! - // ( OInterfaceContainerHelper is synchronized with m_aListenerContainer! ) - ::cppu::OInterfaceContainerHelper* pContainer = m_aListenerContainer.getContainer( ::getCppuType( ( const css::uno::Reference< css::frame::XFrameActionListener >*) NULL ) ); - - if( pContainer != NULL ) - { - // Build action event. - css::frame::FrameActionEvent aFrameActionEvent( static_cast< ::cppu::OWeakObject* >(this), this, aAction ); - - // Get iterator for access to listener. - ::cppu::OInterfaceIteratorHelper aIterator( *pContainer ); - // Send message to all listener. - while( aIterator.hasMoreElements() == sal_True ) - { - try - { - ((css::frame::XFrameActionListener*)aIterator.next())->frameAction( aFrameActionEvent ); - } - catch( css::uno::RuntimeException& ) - { - aIterator.remove(); - } - } - } -} - -/*-****************************************************************************************************//** - @short helper to resize our component window - @descr A frame contains 2 windows - a container ~ and a component window. - This method resize inner component window to full size of outer container window. - This method is threadsafe AND can be called by our dispose method too! - - @seealso - - - @param - - @return - - - @onerror - -*//*-*****************************************************************************************************/ -void Frame::implts_resizeComponentWindow() -{ - // usually the LayoutManager does the resizing - // in case there is no LayoutManager resizing has to be done here - if ( !m_xLayoutManager.is() ) - { - css::uno::Reference< css::awt::XWindow > xComponentWindow( getComponentWindow() ); - if( xComponentWindow.is() == sal_True ) - { - css::uno::Reference< css::awt::XDevice > xDevice( getContainerWindow(), css::uno::UNO_QUERY ); - - // Convert relativ size to output size. - css::awt::Rectangle aRectangle = getContainerWindow()->getPosSize(); - css::awt::DeviceInfo aInfo = xDevice->getInfo(); - css::awt::Size aSize ( aRectangle.Width - aInfo.LeftInset - aInfo.RightInset , - aRectangle.Height - aInfo.TopInset - aInfo.BottomInset ); - - // Resize our component window. - xComponentWindow->setPosSize( 0, 0, aSize.Width, aSize.Height, css::awt::PosSize::POSSIZE ); - } - } -} - -/*-****************************************************************************************************//** - @short helper to set icon on our container window (if it is a system window!) - @descr We use our internal set controller (if it exist) to specify which factory he represanted. - These information can be used to find right icon. But our controller can say it us directly - too ... we should ask his optional property set first ... - - @seealso method Window::SetIcon() - - @param - - @return - - - @onerror We do nothing. -*//*-*****************************************************************************************************/ -void Frame::implts_setIconOnWindow() -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Look for rejected calls. - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - // Make snapshot of neccessary members and release lock. - ReadGuard aReadLock( m_aLock ); - css::uno::Reference< css::awt::XWindow > xContainerWindow( m_xContainerWindow, css::uno::UNO_QUERY ); - css::uno::Reference< css::frame::XController > xController ( m_xController , css::uno::UNO_QUERY ); - aReadLock.unlock(); - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - - if( - ( xContainerWindow.is() == sal_True ) && - ( xController.is() == sal_True ) - ) - { - //------------------------------------------------------------------------------------------------------------- - // a) set default value to an invalid one. So we can start further searches for right icon id, if - // first steps failed! - // We must reset it to any fallback value - if no search step returns a valid result. - sal_Int32 nIcon = -1; - - //------------------------------------------------------------------------------------------------------------- - // b) try to find information on controller propertyset directly - // Don't forget to catch possible exceptions - because these property is an optional one! - css::uno::Reference< css::beans::XPropertySet > xSet( xController, css::uno::UNO_QUERY ); - if( xSet.is() == sal_True ) - { - try - { - xSet->getPropertyValue( DECLARE_ASCII("IconId") )>>= nIcon; - } - catch( css::beans::UnknownPropertyException& ) - { - } - } - - //------------------------------------------------------------------------------------------------------------- - // c) if b) failed ... analyze argument list of currently loaded document insde the frame to find the filter. - // He can be used to detect right factory - and these can be used to match factory to icon ... - if( nIcon == -1 ) - { - css::uno::Reference< css::frame::XModel > xModel = xController->getModel(); - if( xModel.is() == sal_True ) - { - SvtModuleOptions::EFactory eFactory = SvtModuleOptions::ClassifyFactoryByModel(xModel); - if (eFactory != SvtModuleOptions::E_UNKNOWN_FACTORY) - nIcon = SvtModuleOptions().GetFactoryIcon( eFactory ); - } - } - - //------------------------------------------------------------------------------------------------------------- - // d) if all steps failed - use fallback! - if( nIcon == -1 ) - { - nIcon = 0; - } - - //------------------------------------------------------------------------------------------------------------- - // e) set icon on container window now - // Don't forget SolarMutex! We use vcl directly :-( - // Check window pointer for right WorkWindow class too!!! - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - { - SolarMutexGuard aSolarGuard; - Window* pWindow = (VCLUnoHelper::GetWindow( xContainerWindow )); - if( - ( pWindow != NULL ) && - ( pWindow->GetType() == WINDOW_WORKWINDOW ) - ) - { - WorkWindow* pWorkWindow = (WorkWindow*)pWindow; - pWorkWindow->SetIcon( (sal_uInt16)nIcon ); - } - } - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - } -} - -/*-************************************************************************************************************//** - @short helper to start/stop listeneing for window events on container window - @descr If we get a new container window, we must set it on internal memeber ... - and stop listening at old one ... and start listening on new one! - But sometimes (in dispose() call!) it's neccessary to stop listeneing without starting - on new connections. So we split this functionality to make it easier at use. - - @seealso method initialize() - @seealso method dispose() - - @param - - @return - - - @onerror We do nothing! - @threadsafe yes -*//*-*************************************************************************************************************/ -void Frame::implts_startWindowListening() -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - // Make snapshot of neccessary member! - ReadGuard aReadLock( m_aLock ); - css::uno::Reference< css::awt::XWindow > xContainerWindow = m_xContainerWindow ; - css::uno::Reference< css::lang::XMultiServiceFactory > xFactory = m_xFactory ; - css::uno::Reference< css::datatransfer::dnd::XDropTargetListener > xDragDropListener = m_xDropTargetListener; - css::uno::Reference< css::awt::XWindowListener > xWindowListener ( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY ); - css::uno::Reference< css::awt::XFocusListener > xFocusListener ( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY ); - css::uno::Reference< css::awt::XTopWindowListener > xTopWindowListener ( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY ); - aReadLock.unlock(); - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - - if( xContainerWindow.is() == sal_True ) - { - xContainerWindow->addWindowListener( xWindowListener); - xContainerWindow->addFocusListener ( xFocusListener ); - - css::uno::Reference< css::awt::XTopWindow > xTopWindow( xContainerWindow, css::uno::UNO_QUERY ); - if( xTopWindow.is() == sal_True ) - { - xTopWindow->addTopWindowListener( xTopWindowListener ); - - css::uno::Reference< css::awt::XDataTransferProviderAccess > xTransfer( xFactory->createInstance( SERVICENAME_VCLTOOLKIT ), css::uno::UNO_QUERY ); - if( xTransfer.is() == sal_True ) - { - css::uno::Reference< css::datatransfer::dnd::XDropTarget > xDropTarget = xTransfer->getDropTarget( xContainerWindow ); - if( xDropTarget.is() == sal_True ) - { - xDropTarget->addDropTargetListener( xDragDropListener ); - xDropTarget->setActive( sal_True ); - } - } - } - } -} - -//***************************************************************************************************************** -void Frame::implts_stopWindowListening() -{ - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - // Sometimes used by dispose() => soft exceptions! - TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - // Make snapshot of neccessary member! - ReadGuard aReadLock( m_aLock ); - css::uno::Reference< css::awt::XWindow > xContainerWindow = m_xContainerWindow ; - css::uno::Reference< css::lang::XMultiServiceFactory > xFactory = m_xFactory ; - css::uno::Reference< css::datatransfer::dnd::XDropTargetListener > xDragDropListener = m_xDropTargetListener; - css::uno::Reference< css::awt::XWindowListener > xWindowListener ( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY ); - css::uno::Reference< css::awt::XFocusListener > xFocusListener ( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY ); - css::uno::Reference< css::awt::XTopWindowListener > xTopWindowListener ( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY ); - aReadLock.unlock(); - /* UNSAFE AREA --------------------------------------------------------------------------------------------- */ - - if( xContainerWindow.is() == sal_True ) - { - xContainerWindow->removeWindowListener( xWindowListener); - xContainerWindow->removeFocusListener ( xFocusListener ); - - css::uno::Reference< css::awt::XTopWindow > xTopWindow( xContainerWindow, css::uno::UNO_QUERY ); - if( xTopWindow.is() == sal_True ) - { - xTopWindow->removeTopWindowListener( xTopWindowListener ); - - css::uno::Reference< css::awt::XDataTransferProviderAccess > xTransfer( xFactory->createInstance( SERVICENAME_VCLTOOLKIT ), css::uno::UNO_QUERY ); - if( xTransfer.is() == sal_True ) - { - css::uno::Reference< css::datatransfer::dnd::XDropTarget > xDropTarget = xTransfer->getDropTarget( xContainerWindow ); - if( xDropTarget.is() == sal_True ) - { - xDropTarget->removeDropTargetListener( xDragDropListener ); - xDropTarget->setActive( sal_False ); - } - } - } - } -} - -/*-****************************************************************************************************//** - @short helper to force breaked close() request again - @descr If we self disagree with a close() request, and detect that all external locks are gone ... - then we must try to close this frame again. - - @seealso XCloseable::close() - @seealso Frame::close() - @seealso Frame::removeActionLock() - @seealso Frame::resetActionLock() - @seealso m_bSelfClose - @seealso m_nExternalLockCount - - @threadsafe yes - @modified 06.05.2002 09:31, as96863 -*//*-*****************************************************************************************************/ -void Frame::implts_checkSuicide() -{ - /* SAFE */ - ReadGuard aReadLock(m_aLock); - // in case of lock==0 and safed state of previous close() request m_bSelfClose - // we must force close() again. Because we had disagreed with that before. - sal_Bool bSuicide = (m_nExternalLockCount==0 && m_bSelfClose); - m_bSelfClose = sal_False; - aReadLock.unlock(); - /* } SAFE */ - // force close and deliver owner ship to source of possible throwed veto exception - // Attention: Because this method isn't designed to throw such exception we must supress - // it for outside code! - try - { - if (bSuicide) - close(sal_True); - } - catch(const css::util::CloseVetoException&) - {} - catch(const css::lang::DisposedException&) - {} -} - -//_______________________________________________________________ - -/** little helper to enable/disable the menu closer at the menubar of the given frame. - - @param xFrame - we use its layout manager to set/reset a special callback. - Its existence regulate visibility of this closer item. - - @param bState - <TRUE/> enable; <FALSE/> disable this state - */ - -void Frame::impl_setCloser( /*IN*/ const css::uno::Reference< css::frame::XFrame >& xFrame , - /*IN*/ sal_Bool bState ) -{ - // Note: If start module isnt installed - no closer has to be shown! - if (!SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SSTARTMODULE)) - return; - - try - { - css::uno::Reference< css::beans::XPropertySet > xFrameProps(xFrame, css::uno::UNO_QUERY_THROW); - css::uno::Reference< css::frame::XLayoutManager > xLayoutManager; - xFrameProps->getPropertyValue(FRAME_PROPNAME_LAYOUTMANAGER) >>= xLayoutManager; - css::uno::Reference< css::beans::XPropertySet > xLayoutProps(xLayoutManager, css::uno::UNO_QUERY_THROW); - xLayoutProps->setPropertyValue(LAYOUTMANAGER_PROPNAME_MENUBARCLOSER, css::uno::makeAny(bState)); - } - catch(const css::uno::RuntimeException&) - { throw; } - catch(const css::uno::Exception&) - {} -} - -//_______________________________________________________________ - -/** it checks, which of the top level task frames must have the special menu closer for - switching to the backing window mode. - - It analyze the current list of visible top level frames. Only the last real document - frame can have this symbol. Not the help frame nor the backing task itself. - Here we do anything related to this closer. We remove it from the old frame and set it - for the new one. - */ - -void Frame::impl_checkMenuCloser() -{ - /* SAFE { */ - ReadGuard aReadLock(m_aLock); - - // only top frames, which are part of our desktop hierarchy, can - // do so! By the way - we need the desktop instance to have acess - // to all other top level frames too. - css::uno::Reference< css::frame::XDesktop > xDesktop (m_xParent, css::uno::UNO_QUERY); - css::uno::Reference< css::frame::XFramesSupplier > xTaskSupplier(xDesktop , css::uno::UNO_QUERY); - if ( !xDesktop.is() || !xTaskSupplier.is() ) - return; - - aReadLock.unlock(); - /* } SAFE */ - - // analyze the list of current open tasks - // Suppress search for other views to the same model ... - // It's not needed here and can be very expensive. - FrameListAnalyzer aAnalyzer( - xTaskSupplier, - this, - FrameListAnalyzer::E_HIDDEN | FrameListAnalyzer::E_HELP | FrameListAnalyzer::E_BACKINGCOMPONENT); - - // specify the new frame, which must have this special state ... - css::uno::Reference< css::frame::XFrame > xNewCloserFrame; - - // ----------------------------- - // a) - // If there exist ate least one other frame - there are two frames currently open. - // But we can enable this closer only, if one of these two tasks includes the help module. - // The "other frame" couldn't be the help. Because then it wouldn't be part of this "other list". - // In such case it will be seperated to the reference aAnalyzer.m_xHelp! - // But we must check, if weself includes the help ... - // Check aAnalyzer.m_bReferenceIsHelp! - if ( - (aAnalyzer.m_lOtherVisibleFrames.getLength()==1) && - ( - (aAnalyzer.m_bReferenceIsHelp ) || - (aAnalyzer.m_bReferenceIsHidden) - ) - ) - { - // others[0] can't be the backing component! - // Because it's set at the special member aAnalyzer.m_xBackingComponent ... :-) - xNewCloserFrame = aAnalyzer.m_lOtherVisibleFrames[0]; - } - else - // ----------------------------- - // b) - // There is no other frame ... means no other document frame. The help module - // will be handled seperatly and must(!) be ignored here ... excepting weself includes the help. - if ( - (aAnalyzer.m_lOtherVisibleFrames.getLength()==0) && - (!aAnalyzer.m_bReferenceIsHelp ) && - (!aAnalyzer.m_bReferenceIsHidden ) && - (!aAnalyzer.m_bReferenceIsBacking ) - ) - { - xNewCloserFrame = this; - } - - // Look for neccessary actions ... - // Only if the closer state must be moved from one frame to another one - // or must be enabled/disabled at all. - /* STATIC SAFE { */ - WriteGuard aStaticWriteLock(LockHelper::getGlobalLock()); - css::uno::Reference< css::frame::XFrame > xCloserFrame (m_xCloserFrame.get(), css::uno::UNO_QUERY); - if (xCloserFrame!=xNewCloserFrame) - { - if (xCloserFrame.is()) - impl_setCloser(xCloserFrame, sal_False); - if (xNewCloserFrame.is()) - impl_setCloser(xNewCloserFrame, sal_True); - m_xCloserFrame = xNewCloserFrame; - } - aStaticWriteLock.unlock(); - /* } STATIC SAFE */ -} - -//_________________________________________________________________________________________________________________ -// debug methods -//_________________________________________________________________________________________________________________ - -/*----------------------------------------------------------------------------------------------------------------- - The follow methods checks the parameter for other functions. If a parameter or his value is non valid, - we return "sal_True". (otherwise sal_False) This mechanism is used to throw an ASSERT! ------------------------------------------------------------------------------------------------------------------*/ - -#ifdef ENABLE_ASSERTIONS - -//***************************************************************************************************************** -// We don't accept null pointer or references! -sal_Bool Frame::implcp_ctor( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory ) -{ - return ( - ( &xFactory == NULL ) || - ( xFactory.is() == sal_False ) - ); -} - -//***************************************************************************************************************** -// Its allowed to reset the active frame membervariable with a NULL-css::uno::Reference but not with a NULL-pointer! -// And we accept frames only! No tasks and desktops! -sal_Bool Frame::implcp_setActiveFrame( const css::uno::Reference< css::frame::XFrame >& xFrame ) -{ - return ( - ( &xFrame == NULL ) || - ( css::uno::Reference< css::frame::XDesktop >( xFrame, css::uno::UNO_QUERY ).is() == sal_True ) - ); -} - -//***************************************************************************************************************** -sal_Bool Frame::implcp_addFrameActionListener( const css::uno::Reference< css::frame::XFrameActionListener >& xListener ) -{ - return ( - ( &xListener == NULL ) || - ( xListener.is() == sal_False ) - ); -} - -//***************************************************************************************************************** -sal_Bool Frame::implcp_removeFrameActionListener( const css::uno::Reference< css::frame::XFrameActionListener >& xListener ) -{ - return ( - ( &xListener == NULL ) || - ( xListener.is() == sal_False ) - ); -} - -//***************************************************************************************************************** -sal_Bool Frame::implcp_addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) -{ - return ( - ( &xListener == NULL ) || - ( xListener.is() == sal_False ) - ); -} - -//***************************************************************************************************************** -sal_Bool Frame::implcp_removeEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) -{ - return ( - ( &xListener == NULL ) || - ( xListener.is() == sal_False ) - ); -} - -//***************************************************************************************************************** -sal_Bool Frame::implcp_windowResized( const css::awt::WindowEvent& aEvent ) -{ - return ( - ( &aEvent == NULL ) || - ( aEvent.Source.is() == sal_False ) - ); -} - -//***************************************************************************************************************** -sal_Bool Frame::implcp_focusGained( const css::awt::FocusEvent& aEvent ) -{ - return ( - ( &aEvent == NULL ) || - ( aEvent.Source.is() == sal_False ) - ); -} - -//***************************************************************************************************************** -sal_Bool Frame::implcp_windowActivated( const css::lang::EventObject& aEvent ) -{ - return ( - ( &aEvent == NULL ) || - ( aEvent.Source.is() == sal_False ) - ); -} - -//***************************************************************************************************************** -sal_Bool Frame::implcp_windowDeactivated( const css::lang::EventObject& aEvent ) -{ - return ( - ( &aEvent == NULL ) || - ( aEvent.Source.is() == sal_False ) - ); -} - -//***************************************************************************************************************** -sal_Bool Frame::implcp_disposing( const css::lang::EventObject& aEvent ) -{ - return ( - ( &aEvent == NULL ) || - ( aEvent.Source.is() == sal_False ) - ); -} - -#endif // #ifdef ENABLE_ASSERTIONS - -} // namespace framework - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |