2000-09-18 15:33:13 +00:00
/*************************************************************************
*
* $ RCSfile : frame . cxx , v $
*
2003-04-04 16:17:57 +00:00
* $ Revision : 1.65 $
2000-09-18 15:33:13 +00:00
*
2003-04-04 16:17:57 +00:00
* last change : $ Author : hr $ $ Date : 2003 - 04 - 04 17 : 17 : 57 $
2000-09-18 15:33:13 +00:00
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc . , October , 2000
*
* GNU Lesser General Public License Version 2.1
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Copyright 2000 by Sun Microsystems , Inc .
* 901 San Antonio Road , Palo Alto , CA 94303 , USA
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 , as published by the Free Software Foundation .
*
* This library 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 for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston ,
* MA 02111 - 1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 ( the " License " ) ; You may not use this file
* except in compliance with the License . You may obtain a copy of the
* License at http : //www.openoffice.org/license.html.
*
* Software provided under this License is provided on an " AS IS " basis ,
* WITHOUT WARRANTY OF ANY KIND , EITHER EXPRESSED OR IMPLIED , INCLUDING ,
* WITHOUT LIMITATION , WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS ,
* MERCHANTABLE , FIT FOR A PARTICULAR PURPOSE , OR NON - INFRINGING .
* See the License for the specific provisions governing your rights and
* obligations concerning the Software .
*
* The Initial Developer of the Original Code is : Sun Microsystems , Inc .
*
* Copyright : 2000 by Sun Microsystems , Inc .
*
* All Rights Reserved .
*
* Contributor ( s ) : _______________________________________
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//_________________________________________________________________________________________________________________
// my own includes
//_________________________________________________________________________________________________________________
# ifndef __FRAMEWORK_SERVICES_FRAME_HXX_
# include <services/frame.hxx>
# endif
2001-07-02 12:40:19 +00:00
# ifndef __FRAMEWORK_DISPATCH_DISPATCHPROVIDER_HXX_
# include <dispatch/dispatchprovider.hxx>
2000-09-18 15:33:13 +00:00
# endif
2000-10-18 11:22:44 +00:00
2001-07-02 12:40:19 +00:00
# ifndef __FRAMEWORK_DISPATCH_INTERCEPTIONHELPER_HXX_
# include <dispatch/interceptionhelper.hxx>
2000-10-18 11:22:44 +00:00
# endif
2000-09-18 15:33:13 +00:00
2002-07-29 07:23:08 +00:00
# ifndef __FRAMEWORK_HELPER_COMPONENTLOADER_HXX_
# include <helper/componentloader.hxx>
# endif
2000-09-18 15:33:13 +00:00
# ifndef __FRAMEWORK_HELPER_OFRAMES_HXX_
# include <helper/oframes.hxx>
# endif
2001-08-10 10:54:29 +00:00
# ifndef __FRAMEWORK_HELPER_STATUSINDICATORFACTORY_HXX_
# include <helper/statusindicatorfactory.hxx>
2000-10-12 09:50:11 +00:00
# endif
2000-10-23 12:56:44 +00:00
# ifndef __FRAMEWORK_CLASSES_TARGETFINDER_HXX_
# include <classes/targetfinder.hxx>
# endif
2001-10-26 08:46:09 +00:00
# ifndef __FRAMEWORK_CLASSES_ARGUMENTANALYZER_HXX_
# include <classes/argumentanalyzer.hxx>
2001-05-02 11:58:40 +00:00
# endif
2001-10-26 08:46:09 +00:00
# ifndef __FRAMEWORK_CLASSES_FILTERCACHE_HXX_
# include <classes/filtercache.hxx>
2001-03-29 12:17:17 +00:00
# endif
2001-07-04 12:34:18 +00:00
# ifndef __FRAMEWORK_CLASSES_DROPTARGETLISTENER_HXX_
# include <classes/droptargetlistener.hxx>
2001-06-15 08:41:19 +00:00
# endif
2002-05-23 11:54:59 +00:00
# ifndef __FRAMEWORK_CLASSES_TASKCREATOR_HXX_
# include <classes/taskcreator.hxx>
# endif
2003-03-25 17:22:13 +00:00
# ifndef __FRAMEWORK_CLASSES_FRAMELISTANALYZER_HXX_
# include <classes/framelistanalyzer.hxx>
# endif
2001-10-26 08:46:09 +00:00
# ifndef __FRAMEWORK_THREADHELP_TRANSACTIONGUARD_HXX_
# include <threadhelp/transactionguard.hxx>
# endif
# ifndef __FRAMEWORK_SERVICES_H_
# include <services.h>
# endif
2003-03-25 17:22:13 +00:00
# ifndef __FRAMEWORK_PROPERTIES_H_
# include <properties.h>
# endif
2000-09-18 15:33:13 +00:00
//_________________________________________________________________________________________________________________
// interface includes
//_________________________________________________________________________________________________________________
2002-07-31 10:03:28 +00:00
# ifndef _COM_SUN_STAR_TASK_XJOBEXECUTOR_HPP_
# include <com/sun/star/task/XJobExecutor.hpp>
# endif
2003-03-25 17:22:13 +00:00
# ifndef _COM_SUN_STAR_UTIL_XURLTRANSFORMER_HPP_
# include <com/sun/star/util/XURLTransformer.hpp>
# endif
2001-05-02 11:58:40 +00:00
# ifndef _COM_SUN_STAR_MOZILLA_XPLUGININSTANCE_HPP_
# include <com/sun/star/mozilla/XPluginInstance.hpp>
# endif
2000-09-18 15:33:13 +00:00
# ifndef _COM_SUN_STAR_AWT_XDEVICE_HPP_
# include <com/sun/star/awt/XDevice.hpp>
# endif
# ifndef _COM_SUN_STAR_AWT_XTOPWINDOW_HPP_
# include <com/sun/star/awt/XTopWindow.hpp>
# endif
# ifndef _COM_SUN_STAR_FRAME_XDESKTOP_HPP_
# include <com/sun/star/frame/XDesktop.hpp>
# endif
# ifndef _COM_SUN_STAR_AWT_POSSIZE_HPP_
# include <com/sun/star/awt/PosSize.hpp>
# endif
# ifndef _COM_SUN_STAR_FRAME_FRAMESEARCHFLAG_HPP_
# include <com/sun/star/frame/FrameSearchFlag.hpp>
# endif
2000-12-07 10:12:31 +00:00
# ifndef _COM_SUN_STAR_AWT_XWINDOWPEER_HPP_
# include <com/sun/star/awt/XWindowPeer.hpp>
# endif
2001-05-02 11:58:40 +00:00
# ifndef _COM_SUN_STAR_AWT_XVCLWINDOWPEER_HPP_
# include <com/sun/star/awt/XVclWindowPeer.hpp>
# endif
2001-03-30 14:36:07 +00:00
# ifndef _COM_SUN_STAR_TASK_XSTATUSINDICATORSUPPLIER_HPP_
# include <com/sun/star/task/XStatusIndicatorSupplier.hpp>
# endif
2001-05-02 11:58:40 +00:00
# ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_
# include <com/sun/star/beans/PropertyAttribute.hpp>
# endif
2001-10-26 08:46:09 +00:00
# ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_
# include <com/sun/star/beans/PropertyValue.hpp>
# endif
# ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
# include <com/sun/star/beans/XPropertySet.hpp>
# endif
# ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
# include <com/sun/star/frame/XModel.hpp>
# endif
2001-07-04 12:34:18 +00:00
# ifndef _COM_SUN_STAR_AWT_XDATATRANSFERPROVIDERACCESS_HPP_
# include <com/sun/star/awt/XDataTransferProviderAccess.hpp>
# endif
2001-06-15 08:41:19 +00:00
2001-07-04 12:34:18 +00:00
# ifndef _COM_SUN_STAR_DATATRANSFER_DND_XDROPTARGET_HPP_
# include <com/sun/star/datatransfer/dnd/XDropTarget.hpp>
2001-06-15 08:41:19 +00:00
# endif
2001-08-10 10:54:29 +00:00
# ifndef _COM_SUN_STAR_AWT_WINDOWATTRIBUTE_HPP_
# include <com/sun/star/awt/WindowAttribute.hpp>
# endif
2002-05-23 11:54:59 +00:00
# ifndef _COM_SUN_STAR_CONTAINER_XINDEXACCESS_HPP_
# include <com/sun/star/container/XIndexAccess.hpp>
# endif
2000-09-18 15:33:13 +00:00
//_________________________________________________________________________________________________________________
// includes of other projects
//_________________________________________________________________________________________________________________
# ifndef _CPPUHELPER_QUERYINTERFACE_HXX_
# include <cppuhelper/queryinterface.hxx>
# endif
# ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
# include <cppuhelper/typeprovider.hxx>
# endif
# ifndef _CPPUHELPER_FACTORY_HXX_
# include <cppuhelper/factory.hxx>
# endif
2001-05-02 11:58:40 +00:00
# ifndef _CPPUHELPER_PROPTYPEHLP_HXX
# include <cppuhelper/proptypehlp.hxx>
# endif
2000-09-18 15:33:13 +00:00
# ifndef _RTL_USTRBUF_HXX_
# include <rtl/ustrbuf.hxx>
# endif
2000-12-07 10:12:31 +00:00
# ifndef _SV_WINDOW_HXX
# include <vcl/window.hxx>
# endif
2000-11-23 13:52:13 +00:00
2001-10-26 08:46:09 +00:00
# ifndef _SV_WRKWIN_HXX
# include <vcl/wrkwin.hxx>
# endif
2000-11-23 13:52:13 +00:00
# ifndef _SV_SVAPP_HXX
# include <vcl/svapp.hxx>
# endif
# ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
2000-12-07 10:12:31 +00:00
# include <toolkit/unohlp.hxx>
2000-11-23 13:52:13 +00:00
# endif
# ifndef _TOOLKIT_AWT_VCLXWINDOW_HXX_
# include <toolkit/awt/vclxwindow.hxx>
# endif
2001-06-15 08:41:19 +00:00
# ifndef _COMPHELPER_PROCESSFACTORY_HXX_
# include <comphelper/processfactory.hxx>
# endif
2001-10-26 08:46:09 +00:00
# ifndef INCLUDED_SVTOOLS_MODULEOPTIONS_HXX
# include <svtools/moduleoptions.hxx>
# endif
2001-05-02 11:58:40 +00:00
# ifdef ENABLE_ASSERTIONS
2000-12-07 10:12:31 +00:00
# ifndef _RTL_STRBUF_HXX_
# include <rtl/strbuf.hxx>
# endif
# endif
2000-11-23 13:52:13 +00:00
2002-10-07 09:21:25 +00:00
# include <vcl/menu.hxx>
2000-09-18 15:33:13 +00:00
//_________________________________________________________________________________________________________________
// namespace
//_________________________________________________________________________________________________________________
namespace framework {
//_________________________________________________________________________________________________________________
// non exported const
//_________________________________________________________________________________________________________________
2003-03-25 17:22:13 +00:00
//#define ENABLE_DEFMODALDIALOGPARENT
2000-09-18 15:33:13 +00:00
//_________________________________________________________________________________________________________________
// non exported definitions
//_________________________________________________________________________________________________________________
2003-03-25 17:22:13 +00:00
css : : uno : : WeakReference < css : : frame : : XFrame > Frame : : m_xCloserFrame = css : : uno : : WeakReference < css : : frame : : XFrame > ( ) ;
2000-09-18 15:33:13 +00:00
//_________________________________________________________________________________________________________________
// declarations
//_________________________________________________________________________________________________________________
//*****************************************************************************************************************
2001-05-02 11:58:40 +00:00
// XInterface, XTypeProvider, XServiceInfo
2000-09-18 15:33:13 +00:00
//*****************************************************************************************************************
2003-03-25 17:22:13 +00:00
DEFINE_XINTERFACE_19 ( Frame ,
2001-05-02 11:58:40 +00:00
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 : : XDispatchProviderInterception ) ,
DIRECT_INTERFACE ( css : : beans : : XMultiPropertySet ) ,
DIRECT_INTERFACE ( css : : beans : : XFastPropertySet ) ,
DIRECT_INTERFACE ( css : : beans : : XPropertySet ) ,
DIRECT_INTERFACE ( css : : awt : : XWindowListener ) ,
DIRECT_INTERFACE ( css : : awt : : XTopWindowListener ) ,
DIRECT_INTERFACE ( css : : awt : : XFocusListener ) ,
2001-08-16 11:16:12 +00:00
DERIVED_INTERFACE ( css : : lang : : XEventListener , css : : awt : : XWindowListener ) ,
2002-05-23 11:54:59 +00:00
DIRECT_INTERFACE ( css : : document : : XActionLockable ) ,
DIRECT_INTERFACE ( css : : util : : XCloseable ) ,
2002-07-29 07:23:08 +00:00
DIRECT_INTERFACE ( css : : util : : XCloseBroadcaster ) ,
DIRECT_INTERFACE ( css : : frame : : XComponentLoader )
2001-05-02 11:58:40 +00:00
)
2003-03-25 17:22:13 +00:00
DEFINE_XTYPEPROVIDER_18 ( Frame ,
2001-05-02 11:58:40 +00:00
css : : lang : : XTypeProvider ,
css : : lang : : XServiceInfo ,
css : : frame : : XFramesSupplier ,
css : : frame : : XFrame ,
css : : lang : : XComponent ,
css : : task : : XStatusIndicatorFactory ,
css : : beans : : XMultiPropertySet ,
css : : beans : : XFastPropertySet ,
css : : beans : : XPropertySet ,
css : : frame : : XDispatchProvider ,
css : : frame : : XDispatchProviderInterception ,
css : : awt : : XWindowListener ,
css : : awt : : XTopWindowListener ,
css : : awt : : XFocusListener ,
2002-05-23 11:54:59 +00:00
css : : lang : : XEventListener ,
css : : util : : XCloseable ,
2002-07-29 07:23:08 +00:00
css : : util : : XCloseBroadcaster ,
css : : frame : : XComponentLoader
2001-05-02 11:58:40 +00:00
)
DEFINE_XSERVICEINFO_MULTISERVICE ( Frame ,
2001-07-04 12:34:18 +00:00
: : cppu : : OWeakObject ,
2001-05-02 11:58:40 +00:00
SERVICENAME_FRAME ,
IMPLEMENTATIONNAME_FRAME
)
2001-07-04 12:34:18 +00:00
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 !
*/
//-------------------------------------------------------------------------------------------------------------
// 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 ) ;
//-------------------------------------------------------------------------------------------------------------
// 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!
2002-07-05 07:04:37 +00:00
DropTargetListener * pDropListener = new DropTargetListener ( m_xFactory , this ) ;
2001-07-04 12:34:18 +00:00
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! " )
}
)
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 .
2001-07-04 12:34:18 +00:00
@ 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 ( )
2001-05-02 11:58:40 +00:00
@ 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 )
// init baseclasses first!
// Attention: Don't change order of initialization!
2001-06-11 09:42:15 +00:00
: ThreadHelpBase ( & Application : : GetSolarMutex ( ) )
2001-05-02 11:58:40 +00:00
, TransactionBase ( )
2001-06-11 09:42:15 +00:00
, : : cppu : : OBroadcastHelperVar < : : cppu : : OMultiTypeInterfaceContainerHelper , : : cppu : : OMultiTypeInterfaceContainerHelper : : keyType > ( m_aLock . getShareableOslMutex ( ) )
2001-05-02 11:58:40 +00:00
, : : cppu : : OPropertySetHelper ( * ( static_cast < : : cppu : : OBroadcastHelper * > ( this ) ) )
, : : cppu : : OWeakObject ( )
// init member
, m_xFactory ( xFactory )
2001-06-11 09:42:15 +00:00
, m_aListenerContainer ( m_aLock . getShareableOslMutex ( ) )
2001-05-02 11:58:40 +00:00
, m_aChildFrameContainer ( )
, 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!
2001-07-04 12:34:18 +00:00
, m_bConnected ( sal_False ) // There exist no component inside of use => sal_False, we are not connected!
2001-08-16 08:45:37 +00:00
, m_nExternalLockCount ( 0 )
2002-05-23 11:54:59 +00:00
, m_bSelfClose ( sal_False ) // Important!
, m_bIsPlugIn ( sal_False )
, m_aPoster ( LINK ( this , Frame , implts_windowClosing ) )
2003-03-25 17:22:13 +00:00
, m_bIsHidden ( sal_True )
, m_bIsBackingMode ( sal_False )
2001-05-02 11:58:40 +00:00
{
2001-07-04 12:34:18 +00:00
// Check incoming parameter to avoid against wrong initialization.
LOG_ASSERT2 ( implcp_ctor ( xFactory ) , " Frame::Frame() " , " Invalid parameter detected! " )
2001-05-02 11:58:40 +00:00
2001-07-04 12:34:18 +00:00
/* Please have a look on "@attentions" of description before! */
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ short standard destructor
@ descr This one do NOTHING ! Use dispose ( ) instaed of this .
@ seealso method dispose ( )
@ param -
@ return -
@ onerror -
*/ /*-*****************************************************************************************************/
2000-09-18 15:33:13 +00:00
Frame : : ~ Frame ( )
{
2001-07-04 12:34:18 +00:00
LOG_ASSERT2 ( m_aTransactionManager . getWorkingMode ( ) ! = E_CLOSE , " Frame::~Frame() " , " Who forgot to dispose this service? " )
2000-09-18 15:33:13 +00:00
}
2002-07-29 07:23:08 +00:00
/*-************************************************************************************************************/ /**
@ 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 )
{
/* SAFE { */
ReadGuard aReadLock ( m_aLock ) ;
2002-08-12 10:47:27 +00:00
ComponentLoader * pLoader = new ComponentLoader ( m_xFactory , this ) ;
2002-07-29 07:23:08 +00:00
aReadLock . unlock ( ) ;
/* } SAFE */
2002-08-12 10:47:27 +00:00
css : : uno : : Reference < css : : frame : : XComponentLoader > xLoader ( static_cast < : : cppu : : OWeakObject * > ( pLoader ) , css : : uno : : UNO_QUERY ) ;
return xLoader - > loadComponentFromURL ( sURL , sTargetFrameName , nSearchFlags , lArguments ) ;
2002-07-29 07:23:08 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ seealso class OFrames
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ param -
@ return A reference to the helper which answer your queries .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ onerror A null reference is returned .
*/ /*-*****************************************************************************************************/
css : : uno : : Reference < css : : frame : : XFrames > SAL_CALL Frame : : getFrames ( ) throw ( css : : uno : : RuntimeException )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Register transaction and reject wrong calls.
2001-05-04 09:21:42 +00:00
/*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 ) ;
2001-05-02 11:58:40 +00:00
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
ReadGuard aReadLock ( m_aLock ) ;
2000-09-18 15:33:13 +00:00
// Return access to all child frames to caller.
2001-05-02 11:58:40 +00:00
// Ouer childframe container is implemented in helper class OFrames and used as a reference m_xFramesHelper!
2000-09-18 15:33:13 +00:00
return m_xFramesHelper ;
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Register transaction and reject wrong calls.
TransactionGuard aTransaction ( m_aTransactionManager , E_HARDEXCEPTIONS ) ;
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
ReadGuard aReadLock ( m_aLock ) ;
2000-09-18 15:33:13 +00:00
// Return current active frame.
// This information is avaliable on the container.
return m_aChildFrameContainer . getActive ( ) ;
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Check incoming parameters.
2001-07-04 12:34:18 +00:00
LOG_ASSERT2 ( implcp_setActiveFrame ( xFrame ) , " Frame::setActiveFrame() " , " Invalid parameter detected! " )
2001-05-02 11:58:40 +00:00
// Look for rejected calls!
TransactionGuard aTransaction ( m_aTransactionManager , E_HARDEXCEPTIONS ) ;
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
2001-05-04 09:21:42 +00:00
WriteGuard aWriteLock ( m_aLock ) ;
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
// 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 ;
2001-05-04 09:21:42 +00:00
aWriteLock . unlock ( ) ;
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
2000-09-18 15:33:13 +00:00
// Don't work, if "new" active frame is'nt different from current one!
2001-05-02 11:58:40 +00:00
// (xFrame==NULL is allowed to UNSET it!)
if ( xActiveChild ! = xFrame )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
// ... otherwise set new and deactivate old one.
2000-09-18 15:33:13 +00:00
m_aChildFrameContainer . setActive ( xFrame ) ;
2001-05-02 11:58:40 +00:00
if (
( eActiveState ! = E_INACTIVE ) & &
( xActiveChild . is ( ) = = sal_True )
)
{
2000-09-18 15:33:13 +00:00
xActiveChild - > deactivate ( ) ;
2001-05-02 11:58:40 +00:00
}
2000-09-18 15:33:13 +00:00
}
2000-12-07 10:12:31 +00:00
2001-05-02 11:58:40 +00:00
if ( xFrame . is ( ) = = sal_True )
2000-12-07 10:12:31 +00:00
{
2001-05-02 11:58:40 +00:00
// If last active frame had focus ...
// ... reset state to ACTIVE and send right FrameActionEvent for focus lost.
if ( eActiveState = = E_FOCUS )
2000-12-07 10:12:31 +00:00
{
2001-05-04 09:21:42 +00:00
aWriteLock . lock ( ) ;
eActiveState = E_ACTIVE ;
m_eActiveState = eActiveState ;
aWriteLock . unlock ( ) ;
2001-05-02 11:58:40 +00:00
implts_sendFrameActionEvent ( css : : frame : : FrameAction_FRAME_UI_DEACTIVATING ) ;
2000-12-07 10:12:31 +00:00
}
2001-05-02 11:58:40 +00:00
// 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 )
)
{
2000-12-07 10:12:31 +00:00
xFrame - > activate ( ) ;
2001-05-02 11:58:40 +00:00
}
2000-12-07 10:12:31 +00:00
}
2001-05-02 11:58:40 +00:00
else
// If this frame is active and has no active subframe anymore it is UI active too
if ( eActiveState = = E_ACTIVE )
2000-12-07 10:12:31 +00:00
{
2001-05-04 09:21:42 +00:00
aWriteLock . lock ( ) ;
eActiveState = E_FOCUS ;
2001-05-02 11:58:40 +00:00
m_eActiveState = eActiveState ;
2001-05-04 09:21:42 +00:00
aWriteLock . unlock ( ) ;
implts_sendFrameActionEvent ( css : : frame : : FrameAction_FRAME_UI_ACTIVATED ) ;
2001-03-30 14:36:07 +00:00
}
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ seealso method getContainerWindow ( )
@ seealso method setComponent ( )
@ seealso member m_xContainerWindow
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ param " xWindow " , reference to new container window - must be valid !
@ return -
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ onerror We do nothing .
*/ /*-*****************************************************************************************************/
void SAL_CALL Frame : : initialize ( const css : : uno : : Reference < css : : awt : : XWindow > & xWindow ) throw ( css : : uno : : RuntimeException )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Check incoming parameter.
2001-07-04 12:34:18 +00:00
LOG_ASSERT2 ( implcp_initialize ( xWindow ) , " Frame::initialize() " , " Invalid parameter detected! " )
2001-06-19 09:37:05 +00:00
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
WriteGuard aWriteLock ( m_aLock ) ;
2001-05-02 11:58:40 +00:00
// Look for rejected calls first!
TransactionGuard aTransaction ( m_aTransactionManager , E_SOFTEXCEPTIONS ) ;
2000-09-18 15:33:13 +00:00
2001-08-10 10:54:29 +00:00
// 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 ) ;
2001-05-02 11:58:40 +00:00
// 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 ... " )
2001-06-11 11:52:42 +00:00
m_xContainerWindow = xWindow ;
2001-05-02 11:58:40 +00:00
// Now we can use our indicator factory helper to support XStatusIndicatorFactory interface.
// We have a valid parent window for it!
// Initialize helper.
2001-06-19 09:37:05 +00:00
if ( m_xContainerWindow . is ( ) = = sal_True )
2001-05-14 12:00:26 +00:00
{
2003-03-25 17:22:13 +00:00
StatusIndicatorFactory * pIndicatorFactoryHelper = new StatusIndicatorFactory ( m_xFactory , m_xContainerWindow , sal_False ) ;
2001-05-14 12:00:26 +00:00
m_xIndicatorFactoryHelper = css : : uno : : Reference < css : : task : : XStatusIndicatorFactory > ( static_cast < : : cppu : : OWeakObject * > ( pIndicatorFactoryHelper ) , css : : uno : : UNO_QUERY ) ;
}
2000-09-18 15:33:13 +00:00
2001-06-19 09:37:05 +00:00
// 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 --------------------------------------------------------------------------------------------- */
2001-06-11 11:52:42 +00:00
2001-06-19 09:37:05 +00:00
// Start listening for events after setting it on helper class ...
// So superflous messages are filtered to NULL :-)
implts_startWindowListening ( ) ;
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ seealso method initialize ( )
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ param -
@ return A reference to current set containerwindow .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ onerror A null reference is returned .
*/ /*-*****************************************************************************************************/
css : : uno : : Reference < css : : awt : : XWindow > SAL_CALL Frame : : getContainerWindow ( ) throw ( css : : uno : : RuntimeException )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Register transaction and reject wrong calls.
2001-05-03 12:21:51 +00:00
TransactionGuard aTransaction ( m_aTransactionManager , E_SOFTEXCEPTIONS ) ;
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
ReadGuard aReadLock ( m_aLock ) ;
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
return m_xContainerWindow ;
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ short set parent frame
@ descr We need a parent to support some functionality ! e . g . findFrame ( )
2002-05-23 11:54:59 +00:00
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 .
2000-09-18 15:33:13 +00:00
2002-05-23 11:54:59 +00:00
@ seealso getCreator ( )
@ seealso findFrame ( )
@ seealso isTop ( )
@ seealos m_bIsFrameTop
2000-09-18 15:33:13 +00:00
2002-05-23 11:54:59 +00:00
@ param xCreator
valid reference to our new owner frame , which should implement a supplier interface
2001-05-02 11:58:40 +00:00
2002-05-23 11:54:59 +00:00
@ threadsafe yes
@ modified 08.05 .2002 09 : 35 , as96863
2001-05-02 11:58:40 +00:00
*/ /*-*****************************************************************************************************/
void SAL_CALL Frame : : setCreator ( const css : : uno : : Reference < css : : frame : : XFramesSupplier > & xCreator ) throw ( css : : uno : : RuntimeException )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
TransactionGuard aTransaction ( m_aTransactionManager , E_HARDEXCEPTIONS ) ;
2000-09-18 15:33:13 +00:00
2002-05-23 11:54:59 +00:00
/* SAFE { */
WriteGuard aWriteLock ( m_aLock ) ;
m_xParent = xCreator ;
aWriteLock . unlock ( ) ;
/* } SAFE */
2000-09-18 15:33:13 +00:00
2002-05-23 11:54:59 +00:00
css : : uno : : Reference < css : : frame : : XDesktop > xIsDesktop ( xCreator , css : : uno : : UNO_QUERY ) ;
m_bIsFrameTop = ( xIsDesktop . is ( ) | | ! xCreator . is ( ) ) ;
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ short returns current parent frame
@ descr The Creator is the parent frame container . If it is NULL , the frame is the uppermost one .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ seealso method setCreator ( )
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ param -
@ return A reference to current set parent frame container .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ onerror A null reference is returned .
*/ /*-*****************************************************************************************************/
css : : uno : : Reference < css : : frame : : XFramesSupplier > SAL_CALL Frame : : getCreator ( ) throw ( css : : uno : : RuntimeException )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Register transaction and reject wrong calls.
TransactionGuard aTransaction ( m_aTransactionManager , E_HARDEXCEPTIONS ) ;
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
ReadGuard aReadLock ( m_aLock ) ;
return m_xParent ;
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ short returns current set name of frame
@ descr This name is used to find target of findFrame ( ) or queryDispatch ( ) calls .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ seealso method setName ( )
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ param -
@ return Current set name of frame .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ onerror An empty string is returned .
*/ /*-*****************************************************************************************************/
: : rtl : : OUString SAL_CALL Frame : : getName ( ) throw ( css : : uno : : RuntimeException )
2000-09-18 15:33:13 +00:00
{
2002-05-23 11:54:59 +00:00
/* SAFE { */
2001-05-02 11:58:40 +00:00
ReadGuard aReadLock ( m_aLock ) ;
2000-09-18 15:33:13 +00:00
return m_sName ;
2002-05-23 11:54:59 +00:00
/* } SAFE */
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 )
{
2002-05-23 11:54:59 +00:00
/* SAFE { */
2001-05-02 11:58:40 +00:00
WriteGuard aWriteLock ( m_aLock ) ;
// Set new name ... but look for invalid special target names!
// They are not allowed to set.
2003-03-25 17:22:13 +00:00
if ( TargetCheck : : isValidFrameName ( sName ) )
m_sName = sName ;
2002-05-23 11:54:59 +00:00
aWriteLock . unlock ( ) ;
/* } SAFE */
2001-05-02 11:58:40 +00:00
}
/*-****************************************************************************************************/ /**
@ 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 . " " ,
2002-05-23 11:54:59 +00:00
" _self " , " _top " , " _blank " etc . The nSearchFlags are ignored
2001-05-02 11:58:40 +00:00
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 )
2002-05-23 11:54:59 +00:00
the method findFrame ( ) is called for all children , for siblings
and as last for the parent frame .
2001-05-02 11:58:40 +00:00
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 .
2002-05-23 11:54:59 +00:00
@ param sTargetFrameName
special names ( _blank , _self ) or real name of target frame
@ param nSearchFlags
optional flags which regulate search for non special target frames
2001-05-02 11:58:40 +00:00
2002-05-23 11:54:59 +00:00
@ return A reference to found or may be new created frame .
@ threadsafe yes
@ modified 16.05 .2002 11 : 08 , as96863
2001-05-02 11:58:40 +00:00
*/ /*-*****************************************************************************************************/
css : : uno : : Reference < css : : frame : : XFrame > SAL_CALL Frame : : findFrame ( const : : rtl : : OUString & sTargetFrameName ,
sal_Int32 nSearchFlags ) throw ( css : : uno : : RuntimeException )
{
2002-05-23 11:54:59 +00:00
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 ;
}
2001-05-02 11:58:40 +00:00
2002-05-23 11:54:59 +00:00
//-----------------------------------------------------------------------------------------------------
// I) check for special defined targets first which must be handled exclusive.
// force using of "if() else if() ..."
//-----------------------------------------------------------------------------------------------------
2001-05-02 11:58:40 +00:00
2002-05-23 11:54:59 +00:00
// get threadsafe some neccessary member which are neccessary for following functionality
/* SAFE { */
2001-05-02 11:58:40 +00:00
ReadGuard aReadLock ( m_aLock ) ;
2002-05-23 11:54:59 +00:00
css : : uno : : Reference < css : : frame : : XFrame > xParent ( m_xParent , css : : uno : : UNO_QUERY ) ;
css : : uno : : Reference < css : : lang : : XMultiServiceFactory > xFactory = m_xFactory ;
2003-03-25 17:22:13 +00:00
sal_Bool bIsTop = m_bIsFrameTop ;
2002-05-23 11:54:59 +00:00
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 ( : : rtl : : OUString ( ) , sal_False ) ;
}
2001-05-02 11:58:40 +00:00
2002-05-23 11:54:59 +00:00
//-----------------------------------------------------------------------------------------------------
// 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 )
2001-03-15 09:35:49 +00:00
{
2002-05-23 11:54:59 +00:00
xTarget = xParent ;
2001-03-15 09:35:49 +00:00
}
2000-10-23 12:56:44 +00:00
2002-05-23 11:54:59 +00:00
//-----------------------------------------------------------------------------------------------------
// 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 )
{
2003-03-25 17:22:13 +00:00
if ( bIsTop )
2002-05-23 11:54:59 +00:00
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 ) ;
}
2001-05-02 11:58:40 +00:00
2002-05-23 11:54:59 +00:00
//-----------------------------------------------------------------------------------------------------
// I.IV) "_self", ""
// This mean this frame in every case.
//-----------------------------------------------------------------------------------------------------
else
if (
( sTargetFrameName = = SPECIALTARGET_SELF ) | |
( sTargetFrameName . getLength ( ) < 1 )
)
{
xTarget = this ;
}
2001-05-02 11:58:40 +00:00
2002-05-23 11:54:59 +00:00
//-----------------------------------------------------------------------------------------------------
// 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 )
2000-10-23 12:56:44 +00:00
{
2002-05-23 11:54:59 +00:00
// We are a task => search or create the beamer
2003-03-25 17:22:13 +00:00
if ( bIsTop )
2002-05-23 11:54:59 +00:00
{
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 (
2003-03-25 17:22:13 +00:00
( bIsTop & & ( nSearchFlags & css : : frame : : FrameSearchFlag : : TASKS ) ) | |
( ! bIsTop )
2002-05-23 11:54:59 +00:00
)
{
//-------------------------------------------------------------------------------------------------
// 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 : : Any aItem = xContainer - > getByIndex ( i ) ;
css : : uno : : Reference < css : : frame : : XFrame > xSibling ;
if (
( ! ( aItem > > = 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 ( ) )
2001-07-02 12:40:19 +00:00
break ;
2002-05-23 11:54:59 +00:00
}
}
}
}
//-------------------------------------------------------------------------------------------------
// 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 ) ;
}
2000-10-23 12:56:44 +00:00
}
2002-05-23 11:54:59 +00:00
return xTarget ;
2000-10-23 12:56:44 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ seealso ctor
@ seealso method setCreator ( )
@ seealso method findFrame ( )
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ 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 )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Register transaction and reject wrong calls.
TransactionGuard aTransaction ( m_aTransactionManager , E_HARDEXCEPTIONS ) ;
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/* 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 ;
}
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 ----------------------------------------------------------------------------------------------- */
2001-05-04 09:21:42 +00:00
WriteGuard aWriteLock ( m_aLock ) ;
2001-05-02 11:58:40 +00:00
// 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 ;
2003-03-25 17:22:13 +00:00
sal_Bool bIsTop = m_bIsFrameTop ;
2001-05-02 11:58:40 +00:00
2001-05-04 09:21:42 +00:00
aWriteLock . unlock ( ) ;
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
//_________________________________________________________________________________________________________
// 1) If I'am not active before ...
if ( eState = = E_INACTIVE )
2000-09-18 15:33:13 +00:00
{
// ... do it then.
2001-05-04 09:21:42 +00:00
aWriteLock . lock ( ) ;
eState = E_ACTIVE ;
m_eActiveState = eState ;
aWriteLock . unlock ( ) ;
2000-09-18 15:33:13 +00:00
// Deactivate sibling path and forward activation to parent ... if any parent exist!
2001-05-02 11:58:40 +00:00
if ( xParent . is ( ) = = sal_True )
2000-09-18 15:33:13 +00:00
{
// 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! ]
2001-05-02 11:58:40 +00:00
xParent - > setActiveFrame ( xThis ) ;
2000-09-18 15:33:13 +00:00
// 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.
2001-05-02 11:58:40 +00:00
xParent - > activate ( ) ;
2000-09-18 15:33:13 +00:00
}
// 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.
2001-05-02 11:58:40 +00:00
implts_sendFrameActionEvent ( css : : frame : : FrameAction_FRAME_ACTIVATED ) ;
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
//_________________________________________________________________________________________________________
// 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!
2000-09-18 15:33:13 +00:00
if (
2001-05-02 11:58:40 +00:00
( eState = = E_ACTIVE ) & &
2000-09-18 15:33:13 +00:00
( xActiveChild . is ( ) = = sal_True ) & &
( xActiveChild - > isActive ( ) = = sal_False )
)
{
xActiveChild - > activate ( ) ;
}
2001-05-02 11:58:40 +00:00
//_________________________________________________________________________________________________________
// 3) I was active before or current activated. But if I have no active child => I will get the focus!
2000-09-18 15:33:13 +00:00
if (
2001-05-02 11:58:40 +00:00
( eState = = E_ACTIVE ) & &
2000-09-18 15:33:13 +00:00
( xActiveChild . is ( ) = = sal_False )
)
{
2001-05-04 09:21:42 +00:00
aWriteLock . lock ( ) ;
eState = E_FOCUS ;
m_eActiveState = eState ;
aWriteLock . unlock ( ) ;
2001-05-02 11:58:40 +00:00
implts_sendFrameActionEvent ( css : : frame : : FrameAction_FRAME_UI_ACTIVATED ) ;
2003-03-25 17:22:13 +00:00
# ifdef ENABLE_DEFMODALDIALOGPARENT
2001-08-29 12:52:07 +00:00
: : vos : : OClearableGuard aSolarGuard ( Application : : GetSolarMutex ( ) ) ;
2001-05-02 11:58:40 +00:00
Window * pWindow = VCLUnoHelper : : GetWindow ( xComponentWindow ) ;
2002-07-18 08:56:17 +00:00
if ( ! pWindow )
pWindow = VCLUnoHelper : : GetWindow ( m_xContainerWindow ) ;
2003-03-25 17:22:13 +00:00
if ( pWindow ! = NULL & & bisTop & & m_xController . is ( ) )
2001-05-02 11:58:40 +00:00
{
2001-04-02 13:11:42 +00:00
Application : : SetDefModalDialogParent ( pWindow ) ;
2001-05-02 11:58:40 +00:00
}
2001-08-29 12:52:07 +00:00
aSolarGuard . clear ( ) ;
2003-03-25 17:22:13 +00:00
# endif // ENABLE_DEFMODALDIALOGPARENT
2001-05-02 11:58:40 +00:00
}
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Register transaction and reject wrong calls.
TransactionGuard aTransaction ( m_aTransactionManager , E_HARDEXCEPTIONS ) ;
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
2001-05-04 09:21:42 +00:00
WriteGuard aWriteLock ( m_aLock ) ;
2001-05-02 11:58:40 +00:00
// 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 ;
2001-05-04 09:21:42 +00:00
aWriteLock . unlock ( ) ;
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
2000-09-18 15:33:13 +00:00
// Work only, if there something to do!
2001-05-02 11:58:40 +00:00
if ( eState ! = E_INACTIVE )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
//_____________________________________________________________________________________________________
// 1) Deactivate all active childs.
if (
( xActiveChild . is ( ) = = sal_True ) & &
( xActiveChild - > isActive ( ) = = sal_True )
)
2000-09-18 15:33:13 +00:00
{
xActiveChild - > deactivate ( ) ;
}
2001-05-02 11:58:40 +00:00
//_____________________________________________________________________________________________________
// 2) If I have the focus - I will lost it now.
if ( eState = = E_FOCUS )
2000-09-18 15:33:13 +00:00
{
// 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().
2001-05-04 09:21:42 +00:00
aWriteLock . lock ( ) ;
2001-05-02 11:58:40 +00:00
eState = E_ACTIVE ;
2001-05-04 09:21:42 +00:00
m_eActiveState = eState ;
aWriteLock . unlock ( ) ;
2001-05-02 11:58:40 +00:00
implts_sendFrameActionEvent ( css : : frame : : FrameAction_FRAME_UI_DEACTIVATING ) ;
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
//_____________________________________________________________________________________________________
// 3) If I'am active - I will be deactivated now.
if ( eState = = E_ACTIVE )
2000-09-18 15:33:13 +00:00
{
// Set new state and send message to all listener.
2001-05-04 09:21:42 +00:00
aWriteLock . lock ( ) ;
2001-05-02 11:58:40 +00:00
eState = E_INACTIVE ;
2001-05-04 09:21:42 +00:00
m_eActiveState = eState ;
aWriteLock . unlock ( ) ;
2001-05-02 11:58:40 +00:00
implts_sendFrameActionEvent ( css : : frame : : FrameAction_FRAME_DEACTIVATING ) ;
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
//_____________________________________________________________________________________________________
// 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!
2000-09-18 15:33:13 +00:00
if (
2001-05-02 11:58:40 +00:00
( xParent . is ( ) = = sal_True ) & &
( xParent - > getActiveFrame ( ) = = xThis )
2000-09-18 15:33:13 +00:00
)
{
// 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! ]
2001-05-02 11:58:40 +00:00
xParent - > deactivate ( ) ;
}
2000-09-18 15:33:13 +00:00
}
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ short returns active state
@ descr Call it to get informations about current active state of this frame .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ seealso method activate ( )
@ seealso method deactivate ( )
@ seealso enum EActiveState
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ param -
@ return true if active , false otherwise .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ 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 )
) ;
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ short ? ? ?
@ descr -
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ seealso -
2001-02-14 07:26:40 +00:00
2001-05-02 11:58:40 +00:00
@ param -
@ return -
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ 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 ) ;
}
2001-02-09 14:36:52 +00:00
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 .
2001-02-09 14:36:52 +00:00
2002-05-23 11:54:59 +00:00
@ 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 .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ seealso method getComponentWindow ( )
@ seealso method getController ( )
2000-09-18 15:33:13 +00:00
2002-05-23 11:54:59 +00:00
@ 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 )
2000-09-18 15:33:13 +00:00
2002-05-23 11:54:59 +00:00
@ return < TRUE / > if operation was successful , < FALSE / > otherwise .
@ onerror We return < FALSE / > .
@ threadsafe yes
@ modified 06.05 .2002 11 : 39 , as96863
2001-05-02 11:58:40 +00:00
*/ /*-*****************************************************************************************************/
2002-05-23 11:54:59 +00:00
sal_Bool SAL_CALL Frame : : setComponent ( const css : : uno : : Reference < css : : awt : : XWindow > & xComponentWindow ,
2001-05-02 11:58:40 +00:00
const css : : uno : : Reference < css : : frame : : XController > & xController ) throw ( css : : uno : : RuntimeException )
2002-05-23 11:54:59 +00:00
{
//_____________________________________________________________________________________________________
// 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 ;
sal_Bool bHadFocus = ( m_eActiveState = = E_FOCUS & & m_xComponentWindow . is ( ) ) ;
sal_Bool bWasConnected = m_bConnected ;
aReadLock . unlock ( ) ;
/* } SAFE */
2003-03-25 17:22:13 +00:00
# ifdef ENABLE_DEFMODALDIALOGPARENT
2002-07-09 13:26:52 +00:00
// Before dispose() of this window we must search another def modal dialog parent.
// Set the container window of this frame as the new one - but do it only if our old
// component window was this special dialog parent realy.
/* SOLAR SAFE { */
: : vos : : OClearableGuard aGlobalSolarLock ( Application : : GetSolarMutex ( ) ) ;
Window * pContainerWindow = VCLUnoHelper : : GetWindow ( xContainerWindow ) ;
Window * pOldComponentWindow = VCLUnoHelper : : GetWindow ( xOldComponentWindow ) ;
if (
( pOldComponentWindow ! = NULL ) & &
( Application : : GetDefModalDialogParent ( ) = = pOldComponentWindow ) & &
isTop ( )
)
{
Application : : SetDefModalDialogParent ( pContainerWindow ) ;
}
aGlobalSolarLock . clear ( ) ;
/* } SAFE */
2003-03-25 17:22:13 +00:00
# endif
2002-05-23 11:54:59 +00:00
//_____________________________________________________________________________________________________
// 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 )
)
{
2002-05-31 12:43:15 +00:00
/* ATTENTION
Don ' t suspend the old controller here . Because the outside caller must do that
by definition . We have to dispose it here only .
*/
2002-05-23 11:54:59 +00:00
// 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 ( ) )
xDisposable - > dispose ( ) ;
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 ( ) )
xDisposable - > dispose ( ) ;
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 ) ;
2002-10-07 09:21:25 +00:00
m_xComponentWindow = xComponentWindow ;
m_xController = xController ;
m_bConnected = ( m_xComponentWindow . is ( ) | | m_xController . is ( ) ) ;
2002-05-23 11:54:59 +00:00
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!
2002-07-18 09:08:02 +00:00
if ( xComponentWindow . is ( ) & & m_eActiveState = = E_FOCUS )
2002-05-23 11:54:59 +00:00
{
2002-07-18 09:08:02 +00:00
if ( bHadFocus )
xComponentWindow - > setFocus ( ) ;
2002-05-23 11:54:59 +00:00
2003-03-25 17:22:13 +00:00
# ifdef ENABLE_DEFMODALDIALOGPARENT
2002-05-23 11:54:59 +00:00
/* SOLAR SAFE { */
: : vos : : OClearableGuard aSolarGuard ( Application : : GetSolarMutex ( ) ) ;
Window * pWindow = VCLUnoHelper : : GetWindow ( xComponentWindow ) ;
2002-10-07 09:21:25 +00:00
if ( pWindow ! = NULL & & isTop ( ) & & xController . is ( ) )
2002-05-23 11:54:59 +00:00
Application : : SetDefModalDialogParent ( pWindow ) ;
aSolarGuard . clear ( ) ;
/* } SOLAR SAFE */
2003-03-25 17:22:13 +00:00
# endif
2002-05-23 11:54:59 +00:00
}
// 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 ( ) ;
2003-03-25 17:22:13 +00:00
// We have to reset the backing component state property!
// It was set from outside ... but it can't be true for a new component.
// So we have to reset it. The outside code must restore this state again.
// Bute note:
// Because the backing component doesn't show the closer ...
// but every other document frame have it (if it's the last opened document) ...
// we have to update this state her too. The frame will may be recycled and switch
// from backing mode to a document mode.
/* SAFE { */
aWriteLock . lock ( ) ;
if ( m_bIsBackingMode )
{
m_bIsBackingMode = sal_False ;
impl_checkMenuCloser ( ) ;
}
aWriteLock . unlock ( ) ;
/* } SAFE */
2002-05-23 11:54:59 +00:00
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 --------------------------------------------------------------------------------------------- */
// Register transaction and reject wrong calls.
TransactionGuard aTransaction ( m_aTransactionManager , E_HARDEXCEPTIONS ) ;
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
ReadGuard aReadLock ( m_aLock ) ;
return m_xController ;
}
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Check incoming parameter.
2001-07-04 12:34:18 +00:00
LOG_ASSERT2 ( implcp_addFrameActionListener ( xListener ) , " Frame::addFrameActionListener() " , " Invalid parameter detected. " )
2001-05-02 11:58:40 +00:00
// 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 ) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-05-02 11:58:40 +00:00
void SAL_CALL Frame : : removeFrameActionListener ( const css : : uno : : Reference < css : : frame : : XFrameActionListener > & xListener ) throw ( css : : uno : : RuntimeException )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Check incoming parameter.
2001-07-04 12:34:18 +00:00
LOG_ASSERT2 ( implcp_removeFrameActionListener ( xListener ) , " Frame::removeFrameActionListener() " , " Invalid parameter detected. " )
2001-05-02 11:58:40 +00:00
// 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 ) ;
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
m_aListenerContainer . removeInterface ( : : getCppuType ( ( const css : : uno : : Reference < css : : frame : : XFrameActionListener > * ) NULL ) , xListener ) ;
2000-09-18 15:33:13 +00:00
}
2002-05-23 11:54:59 +00:00
/*-****************************************************************************************************/ /**
@ 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.
2002-05-28 11:57:57 +00:00
css : : lang : : EventObject aSource ( static_cast < : : cppu : : OWeakObject * > ( this ) ) ;
2002-05-23 11:54:59 +00:00
: : 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 ( ) )
2002-05-24 10:33:59 +00:00
{
try
{
( ( css : : util : : XCloseListener * ) pIterator . next ( ) ) - > queryClosing ( aSource , bDeliverOwnerShip ) ;
}
catch ( css : : uno : : RuntimeException & )
{
pIterator . remove ( ) ;
}
}
2002-05-23 11:54:59 +00:00
}
// Ok - no listener disagreed with this close() request
// check if this frame is used for any load process currently
2002-10-24 11:25:54 +00:00
if ( isActionLocked ( ) )
2002-05-23 11:54:59 +00:00
{
if ( bDeliverOwnerShip )
2002-05-31 12:43:15 +00:00
{
/* SAFE */
2002-05-23 11:54:59 +00:00
WriteGuard aWriteLock ( m_aLock ) ;
m_bSelfClose = sal_True ;
2002-05-31 12:43:15 +00:00
aWriteLock . unlock ( ) ;
/* SAFE */
}
2002-05-23 11:54:59 +00:00
2002-10-24 11:25:54 +00:00
throw css : : util : : CloseVetoException ( DECLARE_ASCII ( " Frame in use for loading document ... " ) , static_cast < : : cppu : : OWeakObject * > ( this ) ) ;
2002-05-23 11:54:59 +00:00
}
2002-10-24 11:25:54 +00:00
if ( ! setComponent ( NULL , NULL ) )
throw css : : util : : CloseVetoException ( DECLARE_ASCII ( " Component couldn't be deattached ... " ) , static_cast < : : cppu : : OWeakObject * > ( this ) ) ;
2002-05-23 11:54:59 +00:00
// 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 ( ) )
2002-05-24 10:33:59 +00:00
{
try
{
( ( css : : util : : XCloseListener * ) pIterator . next ( ) ) - > notifyClosing ( aSource ) ;
}
catch ( css : : uno : : RuntimeException & )
{
pIterator . remove ( ) ;
}
}
2002-05-23 11:54:59 +00:00
}
2003-03-25 17:22:13 +00:00
/* SAFE { */
WriteGuard aWriteLock ( m_aLock ) ;
m_bIsHidden = sal_True ;
aWriteLock . unlock ( ) ;
/* } SAFE */
impl_checkMenuCloser ( ) ;
2002-05-23 11:54:59 +00:00
// 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 ) ;
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 )
2000-09-18 15:33:13 +00:00
{
2001-06-19 09:37:05 +00:00
// 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 ) ;
// First operation should be ... "stopp all listening for window events on our container window".
2001-07-18 05:22:42 +00:00
// These events are superflous but can make trouble!
// We will die, die and die ...
2001-06-19 09:37:05 +00:00
implts_stopWindowListening ( ) ;
2001-06-22 09:39:28 +00:00
2001-07-18 05:22:42 +00:00
// Send message to all listener and forget her references.
LOG_DISPOSEEVENT ( " Frame " , sName )
css : : lang : : EventObject aEvent ( xThis ) ;
m_aListenerContainer . disposeAndClear ( aEvent ) ;
2001-05-02 11:58:40 +00:00
// Disable this instance for further work.
// This will wait for all current running ones ...
// and reject all further requests!
m_aTransactionManager . setWorkingMode ( E_BEFORECLOSE ) ;
2002-05-23 11:54:59 +00:00
// 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 enable this dialog mode at the end of this dipose()
// again. Otherwhise no dialogs will be shown in any frame anymore.
Application : : EnableDialogCancel ( sal_True ) ;
2001-06-19 09:37:05 +00:00
// We should be alone for ever and further dispose calls are rejected by lines before ...
2001-05-02 11:58:40 +00:00
// I hope it :-)
2002-05-23 11:54:59 +00:00
// 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 ( ) )
{
LOG_WARNING ( " Frame::dispose() " , " Sorry - but controller shouldn't exist at this point! " )
css : : uno : : Reference < css : : lang : : XComponent > xDisposable ( m_xController , css : : uno : : UNO_QUERY ) ;
if ( xDisposable . is ( ) )
xDisposable - > dispose ( ) ;
}
if ( m_xComponentWindow . is ( ) )
{
LOG_WARNING ( " Frame::dispose() " , " Sorry - but component window shouldn't exist at this point! " )
css : : uno : : Reference < css : : lang : : XComponent > xDisposable ( m_xComponentWindow , css : : uno : : UNO_QUERY ) ;
if ( xDisposable . is ( ) )
xDisposable - > dispose ( ) ;
}
2001-05-02 11:58:40 +00:00
2002-05-15 11:13:38 +00:00
// 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.
if ( m_xParent . is ( ) = = sal_True )
{
m_xParent - > getFrames ( ) - > remove ( xThis ) ;
m_xParent = css : : uno : : Reference < css : : frame : : XFramesSupplier > ( ) ;
}
2001-05-04 09:21:42 +00:00
/*ATTENTION
2001-06-19 09:37:05 +00:00
It ' s neccessary to release our StatusIndicatorFactory - helper at first !
He share our container window as parent for any created status indicator objects . . .
2001-05-04 09:21:42 +00:00
and if we dispose this container window before we release this helper . . .
2001-06-19 09:37:05 +00:00
we will run into some trouble !
2001-05-04 09:21:42 +00:00
*/
2002-05-23 11:54:59 +00:00
m_xIndicatorFactoryHelper = NULL ;
2001-06-11 11:52:42 +00:00
impl_disposeContainerWindow ( m_xContainerWindow ) ;
2001-05-04 09:21:42 +00:00
/*ATTENTION
Clear container after successful removing from parent container . . .
2002-05-23 11:54:59 +00:00
because our parent could be the desktop which stand in dispose too !
2001-05-04 09:21:42 +00:00
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 ! ! !
*/
m_aChildFrameContainer . clear ( ) ;
2002-05-23 11:54:59 +00:00
m_xFramesHelper = NULL ;
2001-05-02 11:58:40 +00:00
// Release some other references.
2001-05-04 09:21:42 +00:00
// This calls should be easy ... I hope it :-)
2002-05-23 11:54:59 +00:00
m_xDispatchHelper = NULL ;
m_xFactory = NULL ;
m_xDropTargetListener = NULL ;
2002-04-22 12:51:21 +00:00
m_xDispatchRecorderSupplier = NULL ;
2001-05-02 11:58:40 +00:00
2003-03-25 17:22:13 +00:00
// 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 ;
m_bIsBackingMode = sal_False ;
m_bIsPlugIn = sal_False ;
2001-05-02 11:58:40 +00:00
// Disable this instance for further working realy!
m_aTransactionManager . setWorkingMode ( E_CLOSE ) ;
2001-12-12 12:16:39 +00:00
2002-05-23 11:54:59 +00:00
// Don't forget it - otherwhise no dialogs can be shown anymore in other frames.
Application : : EnableDialogCancel ( sal_False ) ;
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Check incoming parameter.
2001-07-04 12:34:18 +00:00
LOG_ASSERT2 ( implcp_addEventListener ( xListener ) , " Frame::addEventListener() " , " Invalid parameter detected. " )
2001-05-02 11:58:40 +00:00
// Look for rejected calls only!
// Container is threadsafe.
TransactionGuard aTransaction ( m_aTransactionManager , E_HARDEXCEPTIONS ) ;
2001-02-14 07:26:40 +00:00
2001-05-02 11:58:40 +00:00
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
m_aListenerContainer . addInterface ( : : getCppuType ( ( const css : : uno : : Reference < css : : lang : : XEventListener > * ) NULL ) , xListener ) ;
}
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
//*****************************************************************************************************************
void SAL_CALL Frame : : removeEventListener ( const css : : uno : : Reference < css : : lang : : XEventListener > & xListener ) throw ( css : : uno : : RuntimeException )
{
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Check incoming parameter.
2001-07-04 12:34:18 +00:00
LOG_ASSERT2 ( implcp_removeEventListener ( xListener ) , " Frame::removeEventListener() " , " Invalid parameter detected. " )
2001-05-02 11:58:40 +00:00
// 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 ) ;
}
2001-02-09 14:36:52 +00:00
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 .
2001-02-09 14:36:52 +00:00
2001-08-10 10:54:29 +00:00
@ seealso class StatusIndicatorFactory
@ seealso class StatusIndicator
2001-02-09 14:36:52 +00:00
2001-05-02 11:58:40 +00:00
@ param -
@ return A reference to created object .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ 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 ) ;
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
ReadGuard aReadLock ( m_aLock ) ;
2001-02-09 14:36:52 +00:00
2001-05-02 11:58:40 +00:00
// Make snapshot of neccessary member and define default return value.
css : : uno : : Reference < css : : task : : XStatusIndicator > xIndicator ;
css : : uno : : Reference < css : : task : : XStatusIndicatorSupplier > xSupplier ( m_xController , css : : uno : : UNO_QUERY ) ;
css : : uno : : Reference < css : : task : : XStatusIndicatorFactory > xFactory = m_xIndicatorFactoryHelper ;
2001-04-02 13:11:42 +00:00
2001-05-02 11:58:40 +00:00
aReadLock . unlock ( ) ;
/* UNSAFE AREA ----------------------------------------------------------------------------------------- */
// If controller can create this status indicator ... use it for return.
// Otherwise use our own indicator factory helper!
if ( xSupplier . is ( ) = = sal_True )
{
xIndicator = xSupplier - > getStatusIndicator ( ) ;
}
2001-08-10 10:54:29 +00:00
if (
( xIndicator . is ( ) = = sal_False ) & &
( xFactory . is ( ) = = sal_True )
)
{
xIndicator = xFactory - > createStatusIndicator ( ) ;
}
2001-05-02 11:58:40 +00:00
return xIndicator ;
}
2001-02-09 14:36:52 +00:00
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ seealso method findFrame ( )
@ seealso method queryDispatches ( )
@ seealso method set / getName ( )
@ seealso class TargetFinder
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ 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 .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ 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 )
{
2002-04-22 06:18:26 +00:00
const char UNO_PROTOCOL [ ] = " .uno: " ;
2001-05-02 11:58:40 +00:00
// 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 ) ;
2000-09-18 15:33:13 +00:00
2002-04-22 06:18:26 +00:00
// 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 hash_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 ) ;
}
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
// 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 ) ;
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
// 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
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ 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 ) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-05-02 11:58:40 +00:00
void SAL_CALL Frame : : releaseDispatchProviderInterceptor ( const css : : uno : : Reference < css : : frame : : XDispatchProviderInterceptor > & xInterceptor ) throw ( css : : uno : : RuntimeException )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
// 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 ) ;
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
css : : uno : : Reference < css : : frame : : XDispatchProviderInterception > xInterceptionHelper ( m_xDispatchHelper , css : : uno : : UNO_QUERY ) ;
xInterceptionHelper - > releaseDispatchProviderInterceptor ( xInterceptor ) ;
}
/*-****************************************************************************************************/ /**
@ 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 -
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ onerror -
*/ /*-*****************************************************************************************************/
void SAL_CALL Frame : : windowResized ( const css : : awt : : WindowEvent & aEvent ) throw ( css : : uno : : RuntimeException )
{
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Check incoming parameter.
2001-07-04 12:34:18 +00:00
LOG_ASSERT2 ( implcp_windowResized ( aEvent ) , " Frame::windowResized() " , " Invalid parameter detected. " )
2001-05-02 11:58:40 +00:00
// 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 ( ) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-05-02 11:58:40 +00:00
void SAL_CALL Frame : : focusGained ( const css : : awt : : FocusEvent & aEvent ) throw ( css : : uno : : RuntimeException )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Check incoming parameter.
2001-07-04 12:34:18 +00:00
LOG_ASSERT2 ( implcp_focusGained ( aEvent ) , " Frame::focusGained() " , " Invalid parameter detected. " )
2001-05-02 11:58:40 +00:00
// Look for rejected calls.
// Part of dispose() mechanism ... => soft exceptions!
TransactionGuard aTransaction ( m_aTransactionManager , E_SOFTEXCEPTIONS ) ;
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
ReadGuard aReadLock ( m_aLock ) ;
// Make snapshot of member!
css : : uno : : Reference < css : : awt : : XWindow > xComponentWindow = m_xComponentWindow ;
aReadLock . unlock ( ) ;
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
if ( xComponentWindow . is ( ) = = sal_True )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
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 & aEvent ) throw ( css : : uno : : RuntimeException )
{
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Check incoming parameter.
2001-07-04 12:34:18 +00:00
LOG_ASSERT2 ( implcp_windowActivated ( aEvent ) , " Frame::windowActivated() " , " Invalid parameter detected. " )
2001-05-02 11:58:40 +00:00
// 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 )
{
2003-03-25 17:22:13 +00:00
// CheckMenuCloser_Impl();
2001-05-02 11:58:40 +00:00
setActiveFrame ( css : : uno : : Reference < css : : frame : : XFrame > ( ) ) ;
activate ( ) ;
2000-09-18 15:33:13 +00:00
}
}
//*****************************************************************************************************************
2001-05-02 11:58:40 +00:00
void SAL_CALL Frame : : windowDeactivated ( const css : : lang : : EventObject & aEvent ) throw ( css : : uno : : RuntimeException )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Check incoming parameter.
2001-07-04 12:34:18 +00:00
LOG_ASSERT2 ( implcp_windowDeactivated ( aEvent ) , " Frame::windowDeactivated() " , " Invalid parameter detected. " )
2001-05-02 11:58:40 +00:00
// Look for rejected calls.
// Sometimes called during dispose() => soft exceptions
TransactionGuard aTransaction ( m_aTransactionManager , E_SOFTEXCEPTIONS ) ;
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
ReadGuard aReadLock ( m_aLock ) ;
2001-08-29 12:52:07 +00:00
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 )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
// 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!
2001-08-29 12:52:07 +00:00
: : vos : : OClearableGuard aSolarGuard ( Application : : GetSolarMutex ( ) ) ;
2003-03-25 17:22:13 +00:00
// CheckMenuCloser_Impl();
2001-05-02 11:58:40 +00:00
Window * pFocusWindow = Application : : GetFocusWindow ( ) ;
if (
2001-08-29 12:52:07 +00:00
( xContainerWindow . is ( ) = = sal_True ) & &
( xParent . is ( ) = = sal_True ) & &
( ( css : : uno : : Reference < css : : frame : : XDesktop > ( xParent , css : : uno : : UNO_QUERY ) ) . is ( ) = = sal_False )
2001-05-02 11:58:40 +00:00
)
{
2001-08-29 12:52:07 +00:00
css : : uno : : Reference < css : : awt : : XWindow > xParentWindow = xParent - > getContainerWindow ( ) ;
Window * pOwnWindow = VCLUnoHelper : : GetWindow ( xContainerWindow ) ;
Window * pParentWindow = VCLUnoHelper : : GetWindow ( xParentWindow ) ;
2002-08-12 10:47:27 +00:00
if ( pFocusWindow = = NULL | | pParentWindow - > IsChild ( pFocusWindow ) )
2001-05-02 11:58:40 +00:00
{
2001-08-29 12:52:07 +00:00
css : : uno : : Reference < css : : frame : : XFramesSupplier > xSupplier ( xParent , css : : uno : : UNO_QUERY ) ;
2001-05-02 11:58:40 +00:00
if ( xSupplier . is ( ) = = sal_True )
{
2001-08-29 12:52:07 +00:00
aSolarGuard . clear ( ) ;
2001-05-02 11:58:40 +00:00
xSupplier - > setActiveFrame ( css : : uno : : Reference < css : : frame : : XFrame > ( ) ) ;
}
}
}
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
}
2002-05-23 11:54:59 +00:00
//*****************************************************************************************************************
void SAL_CALL Frame : : windowClosing ( const css : : lang : : EventObject & aEvent ) throw ( css : : uno : : RuntimeException )
{
/* Attention:
Don ' t use any transaction registration here . Because we try to kill ourself .
And if we have registered this function as non breakable and force a close ( ) - > dispose ( ) operation
this will wait for us for ever . . .
*/
// deactivate this frame 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 :-(
deactivate ( ) ;
m_aPoster . Post ( 0 ) ;
}
IMPL_LINK ( Frame , implts_windowClosing , void * , pVoid )
{
// try to close this frame
2002-10-24 11:25:54 +00:00
// But don't deliver the ownership to anyone.
2002-05-23 11:54:59 +00:00
// Because our "UI owner" will try it again if this request
// will fail.
// e.g. Somewhere try to open an impress document ... and during
// load process the wizard dialog comes up. Then it's possible for
// the user to click the window closer of the document window - this task
// disagree but gets the owner shipt and practice suicide directly after
// closing of the dialog. That's not fine.
// We must ignore this close() request then and user can try it later again ...
2002-10-24 11:25:54 +00:00
2003-04-04 16:17:57 +00:00
try
{
/*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 . . .
*/
2002-10-24 11:25:54 +00:00
/* SAFE */
ReadGuard aReadLock ( m_aLock ) ;
css : : uno : : Reference < css : : frame : : XController > xController = m_xController ;
aReadLock . unlock ( ) ;
/* SAFE */
2003-03-25 17:22:13 +00:00
css : : util : : URL aURL ;
aURL . Complete = DECLARE_ASCII ( " .uno:CloseFrame " ) ;
css : : uno : : Reference < css : : util : : XURLTransformer > xParser ( m_xFactory - > createInstance ( SERVICENAME_URLTRANSFORMER ) , css : : uno : : UNO_QUERY ) ;
if ( xParser . is ( ) )
xParser - > parseStrict ( aURL ) ;
css : : uno : : Reference < css : : frame : : XDispatch > xCloser = queryDispatch ( aURL , SPECIALTARGET_TOP , 0 ) ;
if ( xCloser . is ( ) )
xCloser - > dispatch ( aURL , css : : uno : : Sequence < css : : beans : : PropertyValue > ( ) ) ;
2002-05-23 11:54:59 +00:00
}
catch ( css : : util : : CloseVetoException & )
{
}
2002-10-24 11:25:54 +00:00
2002-05-23 11:54:59 +00:00
return 0 ;
}
2002-07-31 10:03:28 +00:00
/*-****************************************************************************************************/ /**
@ 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 & aEvent ) throw ( css : : uno : : RuntimeException )
{
static sal_Bool bFirstVisibleTask = sal_True ;
/* SAFE { */
2003-03-25 17:22:13 +00:00
ReadGuard aReadLock ( m_aLock ) ;
2002-07-31 10:03:28 +00:00
css : : uno : : Reference < css : : frame : : XDesktop > xDesktopCheck ( m_xParent , css : : uno : : UNO_QUERY ) ;
css : : uno : : Reference < css : : lang : : XMultiServiceFactory > xFactory = m_xFactory ;
2003-03-25 17:22:13 +00:00
m_bIsHidden = sal_False ;
aReadLock . unlock ( ) ;
2002-07-31 10:03:28 +00:00
/* } SAFE */
2003-03-25 17:22:13 +00:00
impl_checkMenuCloser ( ) ;
2002-07-31 10:03:28 +00:00
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 " ) ) ;
}
}
}
}
2003-03-25 17:22:13 +00:00
void SAL_CALL Frame : : windowHidden ( const css : : lang : : EventObject & aEvent ) throw ( css : : uno : : RuntimeException )
{
/* SAFE { */
ReadGuard aReadLock ( m_aLock ) ;
m_bIsHidden = sal_True ;
aReadLock . unlock ( ) ;
/* } SAFE */
impl_checkMenuCloser ( ) ;
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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.
2001-07-04 12:34:18 +00:00
LOG_ASSERT2 ( implcp_disposing ( aEvent ) , " Frame::disposing() " , " Invalid parameter detected. " )
2001-05-02 11:58:40 +00:00
// 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 ----------------------------------------------------------------------------------------------- */
2001-06-11 11:52:42 +00:00
WriteGuard aWriteLock ( m_aLock ) ;
if ( aEvent . Source = = m_xContainerWindow )
2000-09-18 15:33:13 +00:00
{
2001-06-19 09:37:05 +00:00
// NECCESSARY: Impl-method is threadsafe by himself!
aWriteLock . unlock ( ) ;
implts_stopWindowListening ( ) ;
aWriteLock . lock ( ) ;
2001-06-11 11:52:42 +00:00
m_xContainerWindow = css : : uno : : Reference < css : : awt : : XWindow > ( ) ;
2000-09-18 15:33:13 +00:00
}
}
2001-08-16 08:45:37 +00:00
/*-************************************************************************************************************/ /**
@ 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 ) ;
2001-12-12 12:16:39 +00:00
return ( m_nExternalLockCount ! = 0 ) ;
2001-08-16 08:45:37 +00:00
}
//*****************************************************************************************************************
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 )
{
2002-05-23 11:54:59 +00:00
// Register no transaction here! Otherwhise we wait for ever inside possible
// implts_checkSuicide()/dispose() request ...
2001-08-16 08:45:37 +00:00
2002-05-23 11:54:59 +00:00
/* SAFE AREA */ {
WriteGuard aWriteLock ( m_aLock ) ;
LOG_ASSERT2 ( m_nExternalLockCount < = 0 , " Frame::removeActionLock() " , " Frame isn't locked! Possible multithreading problem detected. " )
- - m_nExternalLockCount ;
} /* SAFE */
2001-08-16 08:45:37 +00:00
2002-05-23 11:54:59 +00:00
implts_checkSuicide ( ) ;
2001-08-16 08:45:37 +00:00
}
//*****************************************************************************************************************
void SAL_CALL Frame : : setActionLocks ( sal_Int16 nLock ) throw ( css : : uno : : RuntimeException )
{
2001-12-12 12:16:39 +00:00
/* 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 + = nLock ;
2001-08-16 08:45:37 +00:00
}
//*****************************************************************************************************************
sal_Int16 SAL_CALL Frame : : resetActionLocks ( ) throw ( css : : uno : : RuntimeException )
{
2002-05-23 11:54:59 +00:00
// 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 ( ) ;
2001-12-12 12:16:39 +00:00
return nCurrentLocks ;
2001-08-16 08:45:37 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ short try to convert a property value
@ descr This method is calling from helperclass " OPropertySetHelper " .
Don ' t use this directly !
2003-03-25 17:22:13 +00:00
You must try to convert the value of given FRAME_PROPHANDLE and
2001-05-02 11:58:40 +00:00
return results of this operation . This will be use to ask vetoable
listener . If no listener have a veto , we will change value realy !
( in method setFastPropertyValue_NoBroadcast ( . . . ) )
@ seealso OPropertySetHelper
@ seealso setFastPropertyValue_NoBroadcast ( )
@ param " aConvertedValue " new converted value of property
@ param " aOldValue " old value of property
@ param " nHandle " handle of property
@ param " aValue " new value of property
@ return sal_True if value will be changed , sal_FALSE otherway
@ onerror IllegalArgumentException , if you call this with an invalid argument
*/ /*-*****************************************************************************************************/
sal_Bool SAL_CALL Frame : : convertFastPropertyValue ( css : : uno : : Any & aConvertedValue ,
css : : uno : : Any & aOldValue ,
sal_Int32 nHandle ,
const css : : uno : : Any & aValue ) throw ( css : : lang : : IllegalArgumentException )
{
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
// We don't need any mutex or lock here ... if we work with our properties only!
// The propertyset helper synchronize for us.
// Bur if we try to work with some other member ... we must make it threadsafe!!!
// Check, if value of property will changed in method "setFastPropertyValue_NoBroadcast()".
// Return TRUE, if changed - else return FALSE.
// Initialize state with FALSE !!!
// (Handle can be invalid)
sal_Bool bReturn = sal_False ;
switch ( nHandle )
{
2003-03-25 17:22:13 +00:00
case FRAME_PROPHANDLE_TITLE :
bReturn = PropHelper : : willPropertyBeChanged (
css : : uno : : makeAny ( implts_getTitleFromWindow ( ) ) , aValue , aOldValue , aConvertedValue ) ;
break ;
case FRAME_PROPHANDLE_DISPATCHRECORDERSUPPLIER :
bReturn = PropHelper : : willPropertyBeChanged (
css : : uno : : makeAny ( m_xDispatchRecorderSupplier ) , aValue , aOldValue , aConvertedValue ) ;
break ;
case FRAME_PROPHANDLE_ISHIDDEN :
bReturn = PropHelper : : willPropertyBeChanged (
css : : uno : : makeAny ( m_bIsHidden ) , aValue , aOldValue , aConvertedValue ) ;
2002-04-22 12:51:21 +00:00
break ;
2003-03-25 17:22:13 +00:00
case FRAME_PROPHANDLE_ISBACKINGMODE :
bReturn = PropHelper : : willPropertyBeChanged (
css : : uno : : makeAny ( m_bIsBackingMode ) , aValue , aOldValue , aConvertedValue ) ;
2002-04-22 12:51:21 +00:00
break ;
2001-05-30 09:59:05 +00:00
# ifdef ENABLE_WARNINGS
default : LOG_WARNING ( " Frame::convertFastPropertyValue() " , " Invalid handle detected! " )
2001-05-02 11:58:40 +00:00
break ;
# endif
}
2001-03-09 13:42:26 +00:00
2001-05-02 11:58:40 +00:00
// Return state of operation.
return bReturn ;
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ short set value of a transient property
@ descr This method is calling from helperclass " OPropertySetHelper " .
Don ' t use this directly !
Handle and value are valid everyway ! You must set the new value only .
After this , baseclass send messages to all listener automaticly .
2001-02-09 14:36:52 +00:00
2001-05-02 11:58:40 +00:00
@ seealso OPropertySetHelper
2001-02-14 07:26:40 +00:00
2001-05-02 11:58:40 +00:00
@ param " nHandle " handle of property to change
@ param " aValue " new value of property
@ return -
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ onerror An exception is thrown .
*/ /*-*****************************************************************************************************/
void SAL_CALL Frame : : setFastPropertyValue_NoBroadcast ( sal_Int32 nHandle ,
const css : : uno : : Any & aValue ) throw ( css : : uno : : Exception )
{
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
// We don't need any mutex or lock here ... if we work with our properties only!
// The propertyset helper synchronize for us.
// Bur if we try to work with some other member ... we must make it threadsafe!!!
2001-02-14 07:26:40 +00:00
2001-05-02 11:58:40 +00:00
// Search for right handle ... and try to set property value.
switch ( nHandle )
2000-09-18 15:33:13 +00:00
{
2003-03-25 17:22:13 +00:00
case FRAME_PROPHANDLE_TITLE :
2002-04-22 12:51:21 +00:00
{
: : rtl : : OUString sTitle ;
aValue > > = sTitle ;
implts_setTitleOnWindow ( sTitle ) ;
}
break ;
2003-03-25 17:22:13 +00:00
case FRAME_PROPHANDLE_DISPATCHRECORDERSUPPLIER :
2002-04-22 12:51:21 +00:00
aValue > > = m_xDispatchRecorderSupplier ;
break ;
2003-03-25 17:22:13 +00:00
case FRAME_PROPHANDLE_ISBACKINGMODE :
aValue > > = m_bIsBackingMode ;
break ;
2001-05-30 09:59:05 +00:00
# ifdef ENABLE_WARNINGS
2002-04-22 12:51:21 +00:00
default :
LOG_WARNING ( " Frame::setFastPropertyValue_NoBroadcast() " , " Invalid handle detected! " )
break ;
2001-05-02 11:58:40 +00:00
# endif
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
}
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ short get value of a transient property
@ descr This method is calling from helperclass " OPropertySetHelper " .
Don ' t use this directly !
2001-02-09 14:36:52 +00:00
2001-05-02 11:58:40 +00:00
@ seealso OPropertySetHelper
2001-02-09 14:36:52 +00:00
2001-05-02 11:58:40 +00:00
@ param " nHandle " handle of property to change
@ param " aValue " current value of property
@ return -
2001-04-09 15:29:50 +00:00
2001-05-02 11:58:40 +00:00
@ onerror -
*/ /*-*****************************************************************************************************/
void SAL_CALL Frame : : getFastPropertyValue ( css : : uno : : Any & aValue ,
sal_Int32 nHandle ) const
{
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
// We don't need any mutex or lock here ... if we work with our properties only!
// The propertyset helper synchronize for us.
// Bur if we try to work with some other member ... we must make it threadsafe!!!
// Search for right handle ... and try to set property value.
switch ( nHandle )
{
2003-03-25 17:22:13 +00:00
case FRAME_PROPHANDLE_TITLE :
2002-04-22 12:51:21 +00:00
aValue < < = implts_getTitleFromWindow ( ) ;
break ;
2003-03-25 17:22:13 +00:00
case FRAME_PROPHANDLE_DISPATCHRECORDERSUPPLIER :
2002-04-22 12:51:21 +00:00
aValue < < = m_xDispatchRecorderSupplier ;
break ;
2003-03-25 17:22:13 +00:00
case FRAME_PROPHANDLE_ISHIDDEN :
aValue < < = m_bIsHidden ;
break ;
case FRAME_PROPHANDLE_ISBACKINGMODE :
aValue < < = m_bIsBackingMode ;
break ;
2001-05-30 09:59:05 +00:00
# ifdef ENABLE_WARNINGS
2002-04-22 12:51:21 +00:00
default :
LOG_WARNING ( " Frame::getFastPropertyValue() " , " Invalid handle detected! " )
break ;
2001-05-02 11:58:40 +00:00
# endif
2001-02-09 14:36:52 +00:00
}
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ short return structure and information about transient properties
@ descr This method is calling from helperclass " OPropertySetHelper " .
Don ' t use this directly !
@ seealso OPropertySetHelper
@ param -
@ return structure with property - informations
@ onerror -
*/ /*-*****************************************************************************************************/
: : cppu : : IPropertyArrayHelper & SAL_CALL Frame : : getInfoHelper ( )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
// Optimize this method !
// We initialize a static variable only one time. And we don't must use a mutex at every call!
// For the first call; pInfoHelper is NULL - for the second call pInfoHelper is different from NULL!
static : : cppu : : OPropertyArrayHelper * pInfoHelper = NULL ;
2001-02-09 14:36:52 +00:00
2001-05-02 11:58:40 +00:00
if ( pInfoHelper = = NULL )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
// Ready for multithreading
2001-06-11 09:42:15 +00:00
: : osl : : MutexGuard aGuard ( LockHelper : : getGlobalLock ( ) . getShareableOslMutex ( ) ) ;
2001-05-02 11:58:40 +00:00
// Control this pointer again, another instance can be faster then these!
if ( pInfoHelper = = NULL )
{
// Define static member to give structure of properties to baseclass "OPropertySetHelper".
// "impl_getStaticPropertyDescriptor" is a non exported and static funtion, who will define a static propertytable.
// "sal_True" say: Table is sorted by name.
static : : cppu : : OPropertyArrayHelper aInfoHelper ( impl_getStaticPropertyDescriptor ( ) , sal_True ) ;
pInfoHelper = & aInfoHelper ;
}
}
2001-02-09 14:36:52 +00:00
2001-05-02 11:58:40 +00:00
return ( * pInfoHelper ) ;
}
/*-****************************************************************************************************/ /**
@ short return propertysetinfo
@ descr You can call this method to get information about transient properties
of this object .
2001-02-09 14:36:52 +00:00
2001-05-02 11:58:40 +00:00
@ seealso OPropertySetHelper
@ seealso XPropertySet
@ seealso XMultiPropertySet
2000-10-13 11:02:25 +00:00
2001-05-02 11:58:40 +00:00
@ param -
@ return reference to object with information [ XPropertySetInfo ]
@ onerror -
*/ /*-*****************************************************************************************************/
2001-09-12 15:33:42 +00:00
css : : uno : : Reference < css : : beans : : XPropertySetInfo > SAL_CALL Frame : : getPropertySetInfo ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException )
2001-05-02 11:58:40 +00:00
{
// Optimize this method !
// We initialize a static variable only one time. And we don't must use a mutex at every call!
// For the first call; pInfo is NULL - for the second call pInfo is different from NULL!
static css : : uno : : Reference < css : : beans : : XPropertySetInfo > * pInfo = NULL ;
if ( pInfo = = NULL )
{
// Ready for multithreading
2001-06-11 09:42:15 +00:00
: : osl : : MutexGuard aGuard ( LockHelper : : getGlobalLock ( ) . getShareableOslMutex ( ) ) ;
2001-05-02 11:58:40 +00:00
// Control this pointer again, another instance can be faster then these!
if ( pInfo = = NULL )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
// Create structure of propertysetinfo for baseclass "OPropertySetHelper".
// (Use method "getInfoHelper()".)
static css : : uno : : Reference < css : : beans : : XPropertySetInfo > xInfo ( createPropertySetInfo ( getInfoHelper ( ) ) ) ;
pInfo = & xInfo ;
2000-09-18 15:33:13 +00:00
}
}
2001-05-02 11:58:40 +00:00
return ( * pInfo ) ;
}
/*-****************************************************************************************************/ /**
@ short build information struct of our supported properties
@ descr We create it one times only and return it every time .
@ seealso OPropertySetHelper
@ seealso XPropertySet
@ seealso XMultiPropertySet
@ param -
@ return const struct with information about supported properties
@ onerror -
*/ /*-*****************************************************************************************************/
const css : : uno : : Sequence < css : : beans : : Property > Frame : : impl_getStaticPropertyDescriptor ( )
{
// Create a new static property array to initialize sequence!
// Table of all predefined properties of this class. Its used from OPropertySetHelper-class!
// Don't forget to change the defines (see begin of this file), if you add, change or delete a property in this list!!!
// It's necessary for methods of OPropertySetHelper.
// ATTENTION:
// YOU MUST SORT FOLLOW TABLE BY NAME !!!
static const css : : beans : : Property pPropertys [ ] =
{
2003-03-25 17:22:13 +00:00
css : : beans : : Property ( FRAME_PROPNAME_DISPATCHRECORDERSUPPLIER , FRAME_PROPHANDLE_DISPATCHRECORDERSUPPLIER , : : getCppuType ( ( const css : : uno : : Reference < css : : frame : : XDispatchRecorderSupplier > * ) NULL ) , css : : beans : : PropertyAttribute : : TRANSIENT ) ,
css : : beans : : Property ( FRAME_PROPNAME_ISBACKINGMODE , FRAME_PROPHANDLE_ISBACKINGMODE , : : getBooleanCppuType ( ) , css : : beans : : PropertyAttribute : : TRANSIENT ) ,
css : : beans : : Property ( FRAME_PROPNAME_ISHIDDEN , FRAME_PROPHANDLE_ISHIDDEN , : : getBooleanCppuType ( ) , css : : beans : : PropertyAttribute : : TRANSIENT | css : : beans : : PropertyAttribute : : READONLY ) ,
css : : beans : : Property ( FRAME_PROPNAME_TITLE , FRAME_PROPHANDLE_TITLE , : : getCppuType ( ( const : : rtl : : OUString * ) NULL ) , css : : beans : : PropertyAttribute : : TRANSIENT ) ,
2001-05-02 11:58:40 +00:00
} ;
// Use it to initialize sequence!
2003-03-25 17:22:13 +00:00
static const css : : uno : : Sequence < css : : beans : : Property > lPropertyDescriptor ( pPropertys , FRAME_PROPCOUNT ) ;
2001-05-02 11:58:40 +00:00
// Return static "PropertyDescriptor"
return lPropertyDescriptor ;
2000-09-18 15:33:13 +00:00
}
2001-06-11 11:52:42 +00:00
/*-****************************************************************************************************/ /**
@ 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 )
{
2003-03-25 17:22:13 +00:00
# ifdef ENABLE_DEFMODALDIALOGPARENT
2001-08-29 12:52:07 +00:00
: : vos : : OClearableGuard aSolarGuard ( Application : : GetSolarMutex ( ) ) ;
2001-06-11 11:52:42 +00:00
Window * pWindow = VCLUnoHelper : : GetWindow ( xWindow ) ;
if (
( pWindow ! = NULL ) & &
( Application : : GetDefModalDialogParent ( ) = = pWindow )
)
{
Application : : SetDefModalDialogParent ( NULL ) ;
}
2001-08-29 12:52:07 +00:00
aSolarGuard . clear ( ) ;
2003-03-25 17:22:13 +00:00
# endif
2001-06-11 11:52:42 +00:00
xWindow - > setVisible ( sal_False ) ;
2003-03-25 17:22:13 +00:00
// All VclComponents are XComponents; so call dispose before discarding
// a css::uno::Reference< XVclComponent >, because this frame is the owner of the window
2001-06-11 11:52:42 +00:00
xWindow - > dispose ( ) ;
xWindow = css : : uno : : Reference < css : : awt : : XWindow > ( ) ;
}
}
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Sometimes used by dispose() => soft exceptions!
TransactionGuard aTransaction ( m_aTransactionManager , E_SOFTEXCEPTIONS ) ;
2000-09-18 15:33:13 +00:00
// Log informations about order of events to file!
// (only activated in debug version!)
2001-05-02 11:58:40 +00:00
LOG_FRAMEACTIONEVENT ( " Frame " , m_sName , aAction )
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
// Send css::frame::FrameAction event to all listener.
2000-09-18 15:33:13 +00:00
// Get container for right listener.
2001-05-02 11:58:40 +00:00
// 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 ) ) ;
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
if ( pContainer ! = NULL )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
// Build action event.
css : : frame : : FrameActionEvent aFrameActionEvent ( static_cast < : : cppu : : OWeakObject * > ( this ) , this , aAction ) ;
2000-09-18 15:33:13 +00:00
// Get iterator for access to listener.
2001-05-02 11:58:40 +00:00
: : cppu : : OInterfaceIteratorHelper aIterator ( * pContainer ) ;
2000-09-18 15:33:13 +00:00
// Send message to all listener.
2001-05-02 11:58:40 +00:00
while ( aIterator . hasMoreElements ( ) = = sal_True )
2000-09-18 15:33:13 +00:00
{
2002-05-23 11:54:59 +00:00
try
{
2002-05-24 10:33:59 +00:00
( ( css : : frame : : XFrameActionListener * ) aIterator . next ( ) ) - > frameAction ( aFrameActionEvent ) ;
2002-05-23 11:54:59 +00:00
}
2002-05-24 10:33:59 +00:00
catch ( css : : uno : : RuntimeException & )
2002-05-23 11:54:59 +00:00
{
2002-05-24 10:33:59 +00:00
aIterator . remove ( ) ;
2002-05-23 11:54:59 +00:00
}
2000-09-18 15:33:13 +00:00
}
}
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ 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 !
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ seealso -
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ param -
@ return -
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ onerror -
*/ /*-*****************************************************************************************************/
void Frame : : implts_resizeComponentWindow ( )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Sometimes used by dispose() => soft exceptions!
TransactionGuard aTransaction ( m_aTransactionManager , E_SOFTEXCEPTIONS ) ;
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
ReadGuard aReadLock ( m_aLock ) ;
// Make snapshot of both windows.
css : : uno : : Reference < css : : awt : : XWindow > xContainerWindow = m_xContainerWindow ;
css : : uno : : Reference < css : : awt : : XWindow > xComponentWindow = m_xComponentWindow ;
aReadLock . unlock ( ) ;
/* UNSAFE AREA ----------------------------------------------------------------------------------------- */
2000-09-18 15:33:13 +00:00
// Work only if container window is set!
if (
2001-05-02 11:58:40 +00:00
( xContainerWindow . is ( ) = = sal_True ) & &
( xComponentWindow . is ( ) = = sal_True )
2000-09-18 15:33:13 +00:00
)
{
// Get reference to his device.
2001-05-02 11:58:40 +00:00
css : : uno : : Reference < css : : awt : : XDevice > xDevice ( xContainerWindow , css : : uno : : UNO_QUERY ) ;
2000-09-18 15:33:13 +00:00
// Convert relativ size to output size.
2001-05-02 11:58:40 +00:00
css : : awt : : Rectangle aRectangle = xContainerWindow - > getPosSize ( ) ;
css : : awt : : DeviceInfo aInfo = xDevice - > getInfo ( ) ;
css : : awt : : Size aSize ( aRectangle . Width - aInfo . LeftInset - aInfo . RightInset ,
aRectangle . Height - aInfo . TopInset - aInfo . BottomInset ) ;
// Resize ouer component window.
xComponentWindow - > setPosSize ( 0 , 0 , aSize . Width , aSize . Height , css : : awt : : PosSize : : SIZE ) ;
2000-09-18 15:33:13 +00:00
}
}
2001-05-02 11:58:40 +00:00
/*-****************************************************************************************************/ /**
@ short helper to set / get a title on / from our container window
@ descr We need this impl method to make it threadsafe . Another reason is - we can ' t hold this value
by using an own member . . . because if somewhere change the title by using the vcl - window directly . . .
we never get this information ! That ' s why we write and rewad this property direct via toolkit and vcl !
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ seealso interface XVclWindowPeer
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ param " sTitle " , new value to set it on our window
@ return Current title of our window .
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
@ onerror We do nothing or return an empty value .
*/ /*-*****************************************************************************************************/
void Frame : : implts_setTitleOnWindow ( const : : rtl : : OUString & sTitle )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Look for rejected calls.
TransactionGuard aTransaction ( m_aTransactionManager , E_HARDEXCEPTIONS ) ;
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
// Make snapshot of neccessary members and release lock.
ReadGuard aReadLock ( m_aLock ) ;
css : : uno : : Reference < css : : awt : : XVclWindowPeer > xContainerWindow ( m_xContainerWindow , css : : uno : : UNO_QUERY ) ;
aReadLock . unlock ( ) ;
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Use non well known feature of toolkit to set property on window!
// -> cast window to XVclWindowPeer interface and call setProperty() ...
if ( xContainerWindow . is ( ) = = sal_True )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
css : : uno : : Any aValue ;
aValue < < = sTitle ;
xContainerWindow - > setProperty ( DECLARE_ASCII ( " Title " ) , aValue ) ;
2000-09-18 15:33:13 +00:00
}
}
//*****************************************************************************************************************
2001-05-02 11:58:40 +00:00
const : : rtl : : OUString Frame : : implts_getTitleFromWindow ( ) const
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Look for rejected calls.
TransactionGuard aTransaction ( m_aTransactionManager , E_HARDEXCEPTIONS ) ;
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
// Make snapshot of neccessary members and release lock.
ReadGuard aReadLock ( m_aLock ) ;
css : : uno : : Reference < css : : awt : : XVclWindowPeer > xContainerWindow ( m_xContainerWindow , css : : uno : : UNO_QUERY ) ;
aReadLock . unlock ( ) ;
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
// Use non well known feature of toolkit to get property from window!
// -> cast window to XVclWindowPeer interface and call getProperty() ...
: : rtl : : OUString sTitle ;
if ( xContainerWindow . is ( ) = = sal_True )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
css : : uno : : Any aValue = xContainerWindow - > getProperty ( DECLARE_ASCII ( " Title " ) ) ;
aValue > > = sTitle ;
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
return sTitle ;
2000-09-18 15:33:13 +00:00
}
2001-10-26 08:46:09 +00:00
/*-****************************************************************************************************/ /**
@ 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
{
css : : uno : : Any aID = xSet - > getPropertyValue ( DECLARE_ASCII ( " IconId " ) ) ;
if ( aID . hasValue ( ) = = sal_True )
{
aID > > = 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 )
{
2002-07-29 07:23:08 +00:00
: : rtl : : OUString sFilter ;
2002-08-12 10:47:27 +00:00
ArgumentAnalyzer aAnalyzer ( xModel - > getArgs ( ) , sal_True ) ;
2001-10-26 08:46:09 +00:00
aAnalyzer . getArgument ( E_FILTERNAME , sFilter ) ;
2002-07-29 07:23:08 +00:00
2001-10-26 08:46:09 +00:00
if ( sFilter . getLength ( ) > 0 )
{
FilterCache aCacheRef ; // Cache use refcount and static impl_data_container! So we can use it so!
Filter aFilter = aCacheRef . getFilter ( sFilter ) ;
SvtModuleOptions : : EFactory eFactory ;
if ( SvtModuleOptions : : ClassifyFactoryByName ( aFilter . sDocumentService , eFactory ) = = sal_True )
{
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 ----------------------------------------------------------------------------------------------- */
: : vos : : OClearableGuard aSolarGuard ( Application : : GetSolarMutex ( ) ) ;
Window * pWindow = ( VCLUnoHelper : : GetWindow ( xContainerWindow ) ) ;
if (
( pWindow ! = NULL ) & &
( pWindow - > GetType ( ) = = WINDOW_WORKWINDOW )
)
{
WorkWindow * pWorkWindow = ( WorkWindow * ) pWindow ;
pWorkWindow - > SetIcon ( ( sal_uInt16 ) nIcon ) ;
}
aSolarGuard . clear ( ) ;
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
}
}
2001-06-11 11:52:42 +00:00
/*-************************************************************************************************************/ /**
@ 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 ( )
2001-06-19 09:37:05 +00:00
@ param -
2001-06-11 11:52:42 +00:00
@ return -
@ onerror We do nothing !
2001-06-19 09:37:05 +00:00
@ threadsafe yes
2001-06-11 11:52:42 +00:00
*/ /*-*************************************************************************************************************/
2001-06-19 09:37:05 +00:00
void Frame : : implts_startWindowListening ( )
2001-06-11 11:52:42 +00:00
{
2001-06-19 09:37:05 +00:00
/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
TransactionGuard aTransaction ( m_aTransactionManager , E_HARDEXCEPTIONS ) ;
2001-06-11 11:52:42 +00:00
2001-06-19 09:37:05 +00:00
/* 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 ) ;
2001-06-11 11:52:42 +00:00
2001-06-19 09:37:05 +00:00
css : : uno : : Reference < css : : awt : : XTopWindow > xTopWindow ( xContainerWindow , css : : uno : : UNO_QUERY ) ;
2001-06-11 11:52:42 +00:00
if ( xTopWindow . is ( ) = = sal_True )
{
xTopWindow - > addTopWindowListener ( xTopWindowListener ) ;
2001-06-15 08:41:19 +00:00
2001-06-19 09:37:05 +00:00
css : : uno : : Reference < css : : awt : : XDataTransferProviderAccess > xTransfer ( xFactory - > createInstance ( SERVICENAME_VCLTOOLKIT ) , css : : uno : : UNO_QUERY ) ;
if ( xTransfer . is ( ) = = sal_True )
2001-06-15 08:41:19 +00:00
{
2001-06-19 09:37:05 +00:00
css : : uno : : Reference < css : : datatransfer : : dnd : : XDropTarget > xDropTarget = xTransfer - > getDropTarget ( xContainerWindow ) ;
if ( xDropTarget . is ( ) = = sal_True )
2001-06-15 08:41:19 +00:00
{
2001-06-19 09:37:05 +00:00
xDropTarget - > addDropTargetListener ( xDragDropListener ) ;
2001-06-15 08:41:19 +00:00
xDropTarget - > setActive ( sal_True ) ;
}
}
2001-06-11 11:52:42 +00:00
}
}
}
//*****************************************************************************************************************
2001-06-19 09:37:05 +00:00
void Frame : : implts_stopWindowListening ( )
2001-06-11 11:52:42 +00:00
{
2001-06-19 09:37:05 +00:00
/* 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 --------------------------------------------------------------------------------------------- */
2001-06-11 11:52:42 +00:00
2001-06-19 09:37:05 +00:00
if ( xContainerWindow . is ( ) = = sal_True )
{
xContainerWindow - > removeWindowListener ( xWindowListener ) ;
xContainerWindow - > removeFocusListener ( xFocusListener ) ;
2001-06-11 11:52:42 +00:00
2001-06-19 09:37:05 +00:00
css : : uno : : Reference < css : : awt : : XTopWindow > xTopWindow ( xContainerWindow , css : : uno : : UNO_QUERY ) ;
2001-06-11 11:52:42 +00:00
if ( xTopWindow . is ( ) = = sal_True )
{
xTopWindow - > removeTopWindowListener ( xTopWindowListener ) ;
2001-06-15 08:41:19 +00:00
2001-06-19 09:37:05 +00:00
css : : uno : : Reference < css : : awt : : XDataTransferProviderAccess > xTransfer ( xFactory - > createInstance ( SERVICENAME_VCLTOOLKIT ) , css : : uno : : UNO_QUERY ) ;
if ( xTransfer . is ( ) = = sal_True )
2001-06-15 08:41:19 +00:00
{
2001-06-19 09:37:05 +00:00
css : : uno : : Reference < css : : datatransfer : : dnd : : XDropTarget > xDropTarget = xTransfer - > getDropTarget ( xContainerWindow ) ;
if ( xDropTarget . is ( ) = = sal_True )
2001-06-15 08:41:19 +00:00
{
2001-06-19 09:37:05 +00:00
xDropTarget - > removeDropTargetListener ( xDragDropListener ) ;
2001-06-15 08:41:19 +00:00
xDropTarget - > setActive ( sal_False ) ;
}
}
2001-06-11 11:52:42 +00:00
}
}
}
2002-05-23 11:54:59 +00:00
/*-****************************************************************************************************/ /**
@ 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 ( )
{
2003-03-25 17:22:13 +00:00
/* 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 */
2002-05-23 11:54:59 +00:00
// 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 ( css : : util : : CloseVetoException & )
{
}
}
2003-03-25 17:22:13 +00:00
//_______________________________________________________________
/** little helper to enable/disable the menu closer at the menubar of the given frame.
2002-10-07 09:21:25 +00:00
2003-03-25 17:22:13 +00:00
@ param xFrame
we use it ' s container window
@ 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 )
{
if ( ! xFrame . is ( ) )
2002-10-07 09:21:25 +00:00
return ;
2003-03-25 17:22:13 +00:00
try
2002-10-07 09:21:25 +00:00
{
2003-03-25 17:22:13 +00:00
css : : uno : : Reference < css : : awt : : XWindow > xWindow = xFrame - > getContainerWindow ( ) ;
/* SOLAR SAFE { */
: : vos : : OClearableGuard aSolarGuard ( Application : : GetSolarMutex ( ) ) ;
Window * pWindow = VCLUnoHelper : : GetWindow ( xWindow ) ;
if ( pWindow & & pWindow - > IsSystemWindow ( ) )
2002-10-07 09:21:25 +00:00
{
2003-03-25 17:22:13 +00:00
MenuBar * pMenu = ( ( SystemWindow * ) pWindow ) - > GetMenuBar ( ) ;
if ( pMenu )
pMenu - > ShowCloser ( bState ) ;
2002-10-07 09:21:25 +00:00
}
2003-03-25 17:22:13 +00:00
aSolarGuard . clear ( ) ;
/* } SOLAR SAFE */
}
catch ( css : : uno : : Exception & )
{
return ;
}
}
//_______________________________________________________________
/** 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 ) ;
sal_Bool bHidden = m_bIsHidden ;
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 )
)
)
{
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 )
)
{
xNewCloserFrame = this ;
2002-10-07 09:21:25 +00:00
}
2003-03-25 17:22:13 +00:00
// 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 )
2002-10-07 09:21:25 +00:00
{
2003-03-25 17:22:13 +00:00
if ( xCloserFrame . is ( ) )
impl_setCloser ( xCloserFrame , sal_False ) ;
if ( xNewCloserFrame . is ( ) )
impl_setCloser ( xNewCloserFrame , sal_True ) ;
m_xCloserFrame = xNewCloserFrame ;
2002-10-07 09:21:25 +00:00
}
2003-03-25 17:22:13 +00:00
aStaticWriteLock . unlock ( ) ;
/* } STATIC SAFE */
2002-10-07 09:21:25 +00:00
}
2001-05-02 11:58:40 +00:00
//_________________________________________________________________________________________________________________
// debug methods
//_________________________________________________________________________________________________________________
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
/*-----------------------------------------------------------------------------------------------------------------
The follow methods checks the parameter for other functions . If a parameter or his value is non valid ,
2001-07-04 12:34:18 +00:00
we return " sal_True " . ( otherwise sal_False ) This mechanism is used to throw an ASSERT !
2001-05-02 11:58:40 +00:00
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
# ifdef ENABLE_ASSERTIONS
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
//*****************************************************************************************************************
// We don't accept null pointer or references!
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_ctor ( const css : : uno : : Reference < css : : lang : : XMultiServiceFactory > & xFactory )
2001-05-02 11:58:40 +00:00
{
return (
( & xFactory = = NULL ) | |
( xFactory . is ( ) = = sal_False )
) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-05-02 11:58:40 +00:00
// 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!
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_setActiveFrame ( const css : : uno : : Reference < css : : frame : : XFrame > & xFrame )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
return (
( & xFrame = = NULL ) | |
( css : : uno : : Reference < css : : frame : : XDesktop > ( xFrame , css : : uno : : UNO_QUERY ) . is ( ) = = sal_True ) | |
( css : : uno : : Reference < css : : mozilla : : XPluginInstance > ( xFrame , css : : uno : : UNO_QUERY ) . is ( ) = = sal_True )
) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-06-19 09:37:05 +00:00
// We don't accept null pointer ... but NULL-References are allowed!
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_initialize ( const css : : uno : : Reference < css : : awt : : XWindow > & xWindow )
2000-09-18 15:33:13 +00:00
{
2001-06-19 09:37:05 +00:00
return ( & xWindow = = NULL ) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-05-02 11:58:40 +00:00
// We don't accept null pointer or references!
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_setCreator ( const css : : uno : : Reference < css : : frame : : XFramesSupplier > & xCreator )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
return (
( & xCreator = = NULL ) | |
( xCreator . is ( ) = = sal_False )
) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-05-02 11:58:40 +00:00
// We don't accept null pointer or references!
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_setName ( const : : rtl : : OUString & sName )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
return ( & sName = = NULL ) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-05-02 11:58:40 +00:00
// We don't accept null pointer or references!
// An empty target name is allowed => is the same like "_self"
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_findFrame ( const : : rtl : : OUString & sTargetFrameName ,
2001-05-02 11:58:40 +00:00
sal_Int32 nSearchFlags )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
return ( & sTargetFrameName = = NULL ) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-05-02 11:58:40 +00:00
// We don't accept null pointer!
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_setComponent ( const css : : uno : : Reference < css : : awt : : XWindow > & xComponentWindow ,
2001-05-02 11:58:40 +00:00
const css : : uno : : Reference < css : : frame : : XController > & xController )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
return (
( & xComponentWindow = = NULL ) | |
( & xController = = NULL )
) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_addFrameActionListener ( const css : : uno : : Reference < css : : frame : : XFrameActionListener > & xListener )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
return (
( & xListener = = NULL ) | |
( xListener . is ( ) = = sal_False )
) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_removeFrameActionListener ( const css : : uno : : Reference < css : : frame : : XFrameActionListener > & xListener )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
return (
( & xListener = = NULL ) | |
( xListener . is ( ) = = sal_False )
) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_addEventListener ( const css : : uno : : Reference < css : : lang : : XEventListener > & xListener )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
return (
( & xListener = = NULL ) | |
( xListener . is ( ) = = sal_False )
) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_removeEventListener ( const css : : uno : : Reference < css : : lang : : XEventListener > & xListener )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
return (
( & xListener = = NULL ) | |
( xListener . is ( ) = = sal_False )
) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_windowResized ( const css : : awt : : WindowEvent & aEvent )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
return (
( & aEvent = = NULL ) | |
( aEvent . Source . is ( ) = = sal_False )
) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_focusGained ( const css : : awt : : FocusEvent & aEvent )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
return (
( & aEvent = = NULL ) | |
( aEvent . Source . is ( ) = = sal_False )
) ;
2000-09-18 15:33:13 +00:00
}
//*****************************************************************************************************************
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_windowActivated ( const css : : lang : : EventObject & aEvent )
2000-09-18 15:33:13 +00:00
{
2001-05-02 11:58:40 +00:00
return (
( & aEvent = = NULL ) | |
( aEvent . Source . is ( ) = = sal_False )
) ;
}
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
//*****************************************************************************************************************
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_windowDeactivated ( const css : : lang : : EventObject & aEvent )
2001-05-02 11:58:40 +00:00
{
return (
( & aEvent = = NULL ) | |
( aEvent . Source . is ( ) = = sal_False )
) ;
}
2000-09-18 15:33:13 +00:00
2001-05-02 11:58:40 +00:00
//*****************************************************************************************************************
2001-07-04 12:34:18 +00:00
sal_Bool Frame : : implcp_disposing ( const css : : lang : : EventObject & aEvent )
2001-05-02 11:58:40 +00:00
{
return (
( & aEvent = = NULL ) | |
( aEvent . Source . is ( ) = = sal_False )
) ;
2000-09-18 15:33:13 +00:00
}
2001-05-02 11:58:40 +00:00
# endif // #ifdef ENABLE_ASSERTIONS
2000-09-18 15:33:13 +00:00
} // namespace framework