#92086# helper for loadComponentFromURL
This commit is contained in:
parent
93c72913c4
commit
98a3130c79
2 changed files with 818 additions and 0 deletions
243
framework/inc/helper/persistentwindowstate.hxx
Normal file
243
framework/inc/helper/persistentwindowstate.hxx
Normal file
|
@ -0,0 +1,243 @@
|
|||
/*************************************************************************
|
||||
*
|
||||
* $RCSfile: persistentwindowstate.hxx,v $
|
||||
*
|
||||
* $Revision: 1.1 $
|
||||
*
|
||||
* last change: $Author: as $ $Date: 2002-07-29 08:15:40 $
|
||||
*
|
||||
* 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): _______________________________________
|
||||
*
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
#ifndef __FRAMEWORK_HELPER_PERSISTENTWINDOWSTATE_HXX_
|
||||
#define __FRAMEWORK_HELPER_PERSISTENTWINDOWSTATE_HXX_
|
||||
|
||||
//_________________________________________________________________________________________________________________
|
||||
// my own includes
|
||||
//_________________________________________________________________________________________________________________
|
||||
|
||||
#ifndef __FRAMEWORK_THREADHELP_THREADHELPBASE_HXX_
|
||||
#include <threadhelp/threadhelpbase.hxx>
|
||||
#endif
|
||||
|
||||
#ifndef __FRAMEWORK_MACROS_DEBUG_HXX_
|
||||
#include <macros/debug.hxx>
|
||||
#endif
|
||||
|
||||
#ifndef __FRAMEWORK_MACROS_XINTERFACE_HXX_
|
||||
#include <macros/xinterface.hxx>
|
||||
#endif
|
||||
|
||||
#ifndef __FRAMEWORK_MACROS_XTYPEPROVIDER_HXX_
|
||||
#include <macros/xtypeprovider.hxx>
|
||||
#endif
|
||||
|
||||
#ifndef __FRAMEWORK_GENERAL_H_
|
||||
#include <general.h>
|
||||
#endif
|
||||
|
||||
//_________________________________________________________________________________________________________________
|
||||
// interface includes
|
||||
//_________________________________________________________________________________________________________________
|
||||
|
||||
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
|
||||
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
|
||||
#endif
|
||||
|
||||
#ifndef _COM_SUN_STAR_LANG_XINITIALIZATION_HPP_
|
||||
#include <com/sun/star/lang/XInitialization.hpp>
|
||||
#endif
|
||||
|
||||
#ifndef _COM_SUN_STAR_FRAME_XFRAME_HPP_
|
||||
#include <com/sun/star/frame/XFrame.hpp>
|
||||
#endif
|
||||
|
||||
#ifndef _COM_SUN_STAR_FRAME_XFRAMEACTIONLISTENER_HPP_
|
||||
#include <com/sun/star/frame/XFrameActionListener.hpp>
|
||||
#endif
|
||||
|
||||
#ifndef _COM_SUN_STAR_LANG_XEVENTLISTENER_HPP_
|
||||
#include <com/sun/star/lang/XEventListener.hpp>
|
||||
#endif
|
||||
|
||||
#ifndef _COM_SUN_STAR_UTIL_XCLOSELISTENER_HPP_
|
||||
#include <com/sun/star/util/XCloseListener.hpp>
|
||||
#endif
|
||||
|
||||
#ifndef _COM_SUN_STAR_UTIL_CLOSEVETOEXCEPTION_HPP_
|
||||
#include <com/sun/star/util/CloseVetoException.hpp>
|
||||
#endif
|
||||
|
||||
//_________________________________________________________________________________________________________________
|
||||
// other includes
|
||||
//_________________________________________________________________________________________________________________
|
||||
|
||||
#ifndef INCLUDED_SVTOOLS_MODULEOPTIONS_HXX
|
||||
#include <svtools/moduleoptions.hxx>
|
||||
#endif
|
||||
|
||||
#ifndef _CPPUHELPER_WEAK_HXX_
|
||||
#include <cppuhelper/weak.hxx>
|
||||
#endif
|
||||
|
||||
//_________________________________________________________________________________________________________________
|
||||
// const
|
||||
//_________________________________________________________________________________________________________________
|
||||
|
||||
//_________________________________________________________________________________________________________________
|
||||
// namespace
|
||||
//_________________________________________________________________________________________________________________
|
||||
|
||||
namespace framework{
|
||||
|
||||
//_________________________________________________________________________________________________________________
|
||||
// declarations
|
||||
//_________________________________________________________________________________________________________________
|
||||
|
||||
/*-************************************************************************************************************//**
|
||||
@short listener for closing document frames to make her window state persistent
|
||||
@descr It's a feature of our office. If a document window was created by ourself (and not from
|
||||
any external process e.g. the office bean) we save and restore the window state of it
|
||||
corresponding to the document service factory. That means: one instance of this class will be
|
||||
a listener on one frame which container window was created by ourself. In case we get
|
||||
the callback "queryClosing()" we try to find out which application module is used for this document
|
||||
and which state the container window has. During callback "notifyClosing()" we use this informations
|
||||
then to make it persistent inside the configuration package "org.openoffice.Setup".
|
||||
We are used for restoring such data too. The class TaskCreator inside the framework will
|
||||
initialize us with the frame, on which we must listen till it dies.
|
||||
So we can react for loading the first document in it and restore the data for this application module,
|
||||
which is represented by the new document ... or can make it persistent for this module again
|
||||
during closing the frame.
|
||||
|
||||
@base ThreadHelpBase
|
||||
guarantee right initialized lock member during startup of instances of this class
|
||||
|
||||
@devstatus draft
|
||||
@threadsafe yes
|
||||
@modified 02.07.2002 09:51, as96863
|
||||
*//*-*************************************************************************************************************/
|
||||
class PersistentWindowState : // interfaces
|
||||
public css::lang::XTypeProvider,
|
||||
public css::lang::XInitialization,
|
||||
public css::frame::XFrameActionListener, // => XEventListener
|
||||
public css::util::XCloseListener, // => XEventListener
|
||||
// baseclasses (order neccessary for right initialization!)
|
||||
private ThreadHelpBase,
|
||||
public ::cppu::OWeakObject
|
||||
{
|
||||
//________________________________
|
||||
// member
|
||||
|
||||
private:
|
||||
|
||||
/// may we need an uno service manager to create own services
|
||||
css::uno::Reference< css::lang::XMultiServiceFactory > m_xFactory;
|
||||
/// reference to the frame which was created by the office himself
|
||||
css::uno::Reference< css::frame::XFrame > m_xFrame;
|
||||
/// we get the window state inside queryClosing() but save it inside notifyClosing(). This member hold it alive between these two calls.
|
||||
::rtl::OUString m_sWindowState;
|
||||
/// to make the state persistent it's neccessary to know the document factory
|
||||
SvtModuleOptions::EFactory m_eFactory;
|
||||
|
||||
//________________________________
|
||||
// interface
|
||||
|
||||
public:
|
||||
|
||||
//____________________________
|
||||
// ctor/dtor
|
||||
PersistentWindowState( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory );
|
||||
virtual ~PersistentWindowState( );
|
||||
|
||||
//____________________________
|
||||
// XInterface, XTypeProvider
|
||||
DECLARE_XINTERFACE
|
||||
DECLARE_XTYPEPROVIDER
|
||||
|
||||
//____________________________
|
||||
// XInitialization
|
||||
virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& lArguments ) throw (css::uno::Exception ,
|
||||
css::uno::RuntimeException);
|
||||
|
||||
//____________________________
|
||||
// XFrameActionListener
|
||||
virtual void SAL_CALL frameAction( const css::frame::FrameActionEvent& aEvent ) throw (css::uno::RuntimeException);
|
||||
|
||||
//____________________________
|
||||
// XCloseListener
|
||||
virtual void SAL_CALL queryClosing ( const css::lang::EventObject& aSource ,
|
||||
sal_Bool bGetsOwnership ) throw (css::util::CloseVetoException,
|
||||
css::uno::RuntimeException );
|
||||
virtual void SAL_CALL notifyClosing( const css::lang::EventObject& aSource ) throw (css::uno::RuntimeException );
|
||||
|
||||
//____________________________
|
||||
// XEventListener
|
||||
virtual void SAL_CALL disposing( const css::lang::EventObject& aSource ) throw (css::uno::RuntimeException);
|
||||
|
||||
//________________________________
|
||||
// helper
|
||||
|
||||
private:
|
||||
static sal_Bool implst_getFrameProps ( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory ,
|
||||
const css::uno::Reference< css::frame::XFrame >& xFrame ,
|
||||
SvtModuleOptions::EFactory* pModule ,
|
||||
css::uno::Reference< css::awt::XWindow >* pContainerWindow );
|
||||
static ::rtl::OUString implst_getWindowState( const css::uno::Reference< css::awt::XWindow >& xWindow );
|
||||
static void implst_setWindowState( const css::uno::Reference< css::awt::XWindow >& xWindow ,
|
||||
const ::rtl::OUString& sWindowState );
|
||||
|
||||
}; // class PersistentWindowState
|
||||
|
||||
} // namespace framework
|
||||
|
||||
#endif // #ifndef __FRAMEWORK_HELPER_PERSISTENTWINDOWSTATE_HXX_
|
575
framework/source/helper/persistentwindowstate.cxx
Normal file
575
framework/source/helper/persistentwindowstate.cxx
Normal file
|
@ -0,0 +1,575 @@
|
|||
/*************************************************************************
|
||||
*
|
||||
* $RCSfile: persistentwindowstate.cxx,v $
|
||||
*
|
||||
* $Revision: 1.1 $
|
||||
*
|
||||
* last change: $Author: as $ $Date: 2002-07-29 08:18: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_HELPER_COMPONENTLOADER_HXX_
|
||||
#include <helper/componentloader.hxx>
|
||||
#endif
|
||||
|
||||
#ifndef __FRAMEWORK_HELPER_PERSISTENTWINDOWSTATE_HXX_
|
||||
#include <helper/persistentwindowstate.hxx>
|
||||
#endif
|
||||
|
||||
#ifndef __FRAMEWORK_CLASSES_ARGUMENTANALYZER_HXX_
|
||||
#include <classes/argumentanalyzer.hxx>
|
||||
#endif
|
||||
|
||||
#ifndef __FRAMEWORK_CLASSES_FILTERCACHE_HXX_
|
||||
#include <classes/filtercache.hxx>
|
||||
#endif
|
||||
|
||||
#ifndef __FRAMEWORK_THREADHELP_WRITEGUARD_HXX_
|
||||
#include <threadhelp/writeguard.hxx>
|
||||
#endif
|
||||
|
||||
#ifndef __FRAMEWORK_THREADHELP_READGUARD_HXX_
|
||||
#include <threadhelp/readguard.hxx>
|
||||
#endif
|
||||
|
||||
#ifndef __FRAMEWORK_MACROS_GENERIC_HXX_
|
||||
#include <macros/generic.hxx>
|
||||
#endif
|
||||
|
||||
//_________________________________________________________________________________________________________________
|
||||
// interface includes
|
||||
//_________________________________________________________________________________________________________________
|
||||
|
||||
#ifndef _COM_SUN_STAR_AWT_XWINDOW_HPP_
|
||||
#include <com/sun/star/awt/XWindow.hpp>
|
||||
#endif
|
||||
|
||||
#ifndef _COM_SUN_STAR_UTIL_XCLOSEBROADCASTER_HPP_
|
||||
#include <com/sun/star/util/XCloseBroadcaster.hpp>
|
||||
#endif
|
||||
|
||||
#ifndef _COM_SUN_STAR_LANG_XSERVICXEINFO_HPP_
|
||||
#include <com/sun/star/lang/XServiceInfo.hpp>
|
||||
#endif
|
||||
|
||||
#ifndef _COM_SUN_STAR_FRAME_XCONTROLLER_HPP_
|
||||
#include <com/sun/star/frame/XController.hpp>
|
||||
#endif
|
||||
|
||||
#ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
|
||||
#include <com/sun/star/frame/XModel.hpp>
|
||||
#endif
|
||||
|
||||
//_________________________________________________________________________________________________________________
|
||||
// other includes
|
||||
//_________________________________________________________________________________________________________________
|
||||
|
||||
#ifndef _SV_WINDOW_HXX
|
||||
#include <vcl/window.hxx>
|
||||
#endif
|
||||
|
||||
#ifndef _SV_SYSWIN_HXX
|
||||
#include <vcl/syswin.hxx>
|
||||
#endif
|
||||
|
||||
#ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
|
||||
#include <toolkit/unohlp.hxx>
|
||||
#endif
|
||||
|
||||
#ifndef _SV_SVAPP_HXX
|
||||
#include <vcl/svapp.hxx>
|
||||
#endif
|
||||
|
||||
//_________________________________________________________________________________________________________________
|
||||
// namespace
|
||||
//_________________________________________________________________________________________________________________
|
||||
|
||||
namespace framework{
|
||||
|
||||
//_________________________________________________________________________________________________________________
|
||||
// non exported const
|
||||
//_________________________________________________________________________________________________________________
|
||||
|
||||
#define DOCSERVICE_WRITER DECLARE_ASCII("com.sun.star.text.TextDocument" )
|
||||
#define DOCSERVICE_WRITERWEB DECLARE_ASCII("com.sun.star.text.WebDocument" )
|
||||
#define DOCSERVICE_WRITERGLOBAL DECLARE_ASCII("com.sun.star.text.GlobalDocument" )
|
||||
#define DOCSERVICE_CALC DECLARE_ASCII("com.sun.star.sheet.SpreadsheetDocument" )
|
||||
#define DOCSERVICE_DRAW DECLARE_ASCII("com.sun.star.drawing.DrawingDocument" )
|
||||
#define DOCSERVICE_IMPRESS DECLARE_ASCII("com.sun.star.presentation.PresentationDocument")
|
||||
#define DOCSERVICE_MATH DECLARE_ASCII("com.sun.star.formula.FormulaProperties" )
|
||||
#define DOCSERVICE_CHART DECLARE_ASCII("com.sun.star.chart.ChartDocument" )
|
||||
|
||||
//_________________________________________________________________________________________________________________
|
||||
// non exported declarations
|
||||
//_________________________________________________________________________________________________________________
|
||||
|
||||
//_________________________________________________________________________________________________________________
|
||||
// definitions
|
||||
//_________________________________________________________________________________________________________________
|
||||
|
||||
//*****************************************************************************************************************
|
||||
// XInterface, XTypeProvider
|
||||
//*****************************************************************************************************************
|
||||
DEFINE_XINTERFACE_5( PersistentWindowState ,
|
||||
OWeakObject ,
|
||||
DIRECT_INTERFACE (css::lang::XTypeProvider ),
|
||||
DIRECT_INTERFACE (css::lang::XInitialization ),
|
||||
DIRECT_INTERFACE (css::frame::XFrameActionListener),
|
||||
DIRECT_INTERFACE (css::util::XCloseListener ),
|
||||
DERIVED_INTERFACE(css::lang::XEventListener,css::frame::XFrameActionListener))
|
||||
|
||||
DEFINE_XTYPEPROVIDER_5( PersistentWindowState ,
|
||||
css::lang::XTypeProvider ,
|
||||
css::lang::XInitialization ,
|
||||
css::frame::XFrameActionListener ,
|
||||
css::util::XCloseListener ,
|
||||
css::lang::XEventListener )
|
||||
|
||||
/*-****************************************************************************************************//**
|
||||
@short standard ctor
|
||||
@descr It initialize a new instance of this class with some - not all(!) - informations we need later.
|
||||
Here it's a reference to an uno service manager, which we can use to create own service if neccessary.
|
||||
Real initiialization with the frame, on which we should listen for events, will be done using
|
||||
XInitialization.initialize().
|
||||
|
||||
@seealso initialize()
|
||||
|
||||
@param xFactory
|
||||
reference to an uno service manager
|
||||
|
||||
@threadsafe not neccessary, its not a singleton
|
||||
@modified 26.07.2002 15:00, as96863
|
||||
*//*-*****************************************************************************************************/
|
||||
PersistentWindowState::PersistentWindowState( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory )
|
||||
: ThreadHelpBase( &Application::GetSolarMutex() )
|
||||
, m_xFactory ( xFactory )
|
||||
, m_sWindowState( ::rtl::OUString() )
|
||||
{
|
||||
}
|
||||
|
||||
/*-****************************************************************************************************//**
|
||||
@short standard dtor
|
||||
@descr Nothing to do here! Because all reactions has to be finished during calls disposing()
|
||||
or queryClosing()/notifyClosing(). If we reach this point without called methods (named before)
|
||||
it's an error!
|
||||
|
||||
@threadsafe not neccessary, its not a singleton
|
||||
@modified 02.07.2002 10:07, as96863
|
||||
*//*-*****************************************************************************************************/
|
||||
PersistentWindowState::~PersistentWindowState()
|
||||
{
|
||||
LOG_ASSERT2( m_xFrame.is(), "PersistentWindowState::~PersistentWindowState()", "Unsupported way to close this object! let it crash :-)" )
|
||||
}
|
||||
|
||||
/*-****************************************************************************************************//**
|
||||
@interface XInitialization
|
||||
@short initialize this instance with the frame, on which we should listen for events
|
||||
@descr Here we get the frame, on which we should restore it or make the window data persistent.
|
||||
To do so, we register us as listener for FrameActionEvents and Closing events.
|
||||
|
||||
@param lArguments
|
||||
first any inside list must include a valid frame reference, which we need for registration
|
||||
|
||||
@throws [css::uno::Exception]
|
||||
if no or no valid frame can be found
|
||||
|
||||
@threadsafe yes
|
||||
@modified 26.07.2002 15:04, as96863
|
||||
*//*-*****************************************************************************************************/
|
||||
void SAL_CALL PersistentWindowState::initialize( const css::uno::Sequence< css::uno::Any >& lArguments ) throw (css::uno::Exception ,
|
||||
css::uno::RuntimeException)
|
||||
{
|
||||
/* SAFE { */
|
||||
WriteGuard aWriteLock(m_aLock);
|
||||
// reject wrong initialization calls by throwing right exception
|
||||
if (
|
||||
( lArguments.getLength() < 1 ) ||
|
||||
( ! (lArguments[0] >>= m_xFrame ) ) ||
|
||||
( ! m_xFrame.is() )
|
||||
)
|
||||
{
|
||||
throw css::uno::Exception( DECLARE_ASCII("No or no valid frame was given!"), static_cast< ::cppu::OWeakObject* >(this) );
|
||||
}
|
||||
|
||||
// otherwise start listening immediately
|
||||
css::uno::Reference< css::frame::XFrame > xActionBroadcaster = m_xFrame;
|
||||
css::uno::Reference< css::util::XCloseBroadcaster > xCloseBroadcaster ( m_xFrame, css::uno::UNO_QUERY );
|
||||
aWriteLock.unlock();
|
||||
/* } SAFE */
|
||||
|
||||
if ( ! xCloseBroadcaster.is())
|
||||
throw css::uno::Exception( DECLARE_ASCII("Frame doesn't provide the right interface XCloseable!"), static_cast< ::cppu::OWeakObject* >(this) );
|
||||
|
||||
xActionBroadcaster->addFrameActionListener(this);
|
||||
xCloseBroadcaster->addCloseListener (this);
|
||||
}
|
||||
|
||||
/*-****************************************************************************************************//**
|
||||
@interface XFrameActionListener
|
||||
@short callback to know, if a document was loaded or changed inside the frame
|
||||
@descr The notification COMPONENT_ATTACHED can be used to know, that the first
|
||||
document was loaded into this frame. Because we got the frame directly after his
|
||||
creation and he doesn't included a valid document there - we wasn't able to restore
|
||||
may existing peristent window data on it. Because we must know the application module to do so.
|
||||
But without a document we can't specify it. But this event let us know - this is the first
|
||||
document.
|
||||
|
||||
But note: further calls of this callback must be ignored. Because we have to restore
|
||||
this data one times only for the same frame. Best way do reach that is to deregister us as
|
||||
listener for frame action events!
|
||||
|
||||
@param aEvent
|
||||
must be the frame, on which we listen
|
||||
And it should include the required action COMPONENT_ATTACHED too.
|
||||
In case there comes some other ones (e.g. FRAME_DEACTIVATING) it indicates
|
||||
that the frame wasn't realy used for loading or the load request failed.
|
||||
Then it dies and of course - because we are registered - we get two callbacks.
|
||||
One for closing the frame and one for deactivation.
|
||||
Ignore it here! Or wait for dispose.
|
||||
|
||||
@threadsafe yes
|
||||
@modified 26.07.2002 15:38, as96863
|
||||
*//*-*****************************************************************************************************/
|
||||
void SAL_CALL PersistentWindowState::frameAction( const css::frame::FrameActionEvent& aEvent ) throw (css::uno::RuntimeException)
|
||||
{
|
||||
if (aEvent.Action == css::frame::FrameAction_COMPONENT_ATTACHED)
|
||||
{
|
||||
/* SAFE { */
|
||||
ReadGuard aReadLock(m_aLock);
|
||||
css::uno::Reference< css::lang::XMultiServiceFactory > xFactory = m_xFactory;
|
||||
css::uno::Reference< css::frame::XFrame > xFrame = m_xFrame ;
|
||||
aReadLock.unlock();
|
||||
/* } SAFE */
|
||||
|
||||
// We must be informed from our internal set frame. Otherwhise we was registered
|
||||
// from any outside code. But that's not allowed and I think, we must't react then right.
|
||||
// We work on our internal frame only!
|
||||
if (aEvent.Frame!=xFrame)
|
||||
{
|
||||
LOG_WARNING("PersistentWindowState::frameAction()", "Notified fom unknown broadcaster! Will be ignored ...")
|
||||
return;
|
||||
}
|
||||
|
||||
css::uno::Reference< css::awt::XWindow > xWindow;
|
||||
SvtModuleOptions::EFactory eModule;
|
||||
if (PersistentWindowState::implst_getFrameProps(xFactory,xFrame,&eModule,&xWindow))
|
||||
{
|
||||
// Note: It's not neccessary to save the current window state internaly!
|
||||
// Because we restore it here only. The member m_sWindowState is neccessary
|
||||
// for saving the value only. see interface XCloseListener for further informations!
|
||||
PersistentWindowState::implst_setWindowState(xWindow,SvtModuleOptions().GetFactoryWindowAttributes(eModule));
|
||||
|
||||
// We should deregister us only for successfull restored window states.
|
||||
// F.e: In case we was coupled with a frame and a component inside, which
|
||||
// doesn't match any supported application module (e.g. basic) then we have normaly nothing to do.
|
||||
// But if some times later the same frame is used for a well known factory (e.g. writer), then
|
||||
// we can do our job here. So we should be registered till this moment comes .-)
|
||||
xFrame->removeFrameActionListener(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*-****************************************************************************************************//**
|
||||
@interface XCloseListener
|
||||
@short callback to prepare closing of the listened frame
|
||||
@descr If somewhere tries to close the frame we listen on, we are called to agree or throw the
|
||||
right veto exception. We have not veto for that. But we use the chance to get all
|
||||
neccessary informations we nee to make the current window state persistent.
|
||||
The reason: If we get the callback notifyClosing() it can be to late. Because then may the
|
||||
component of the frame was already closed. But we need the type of to know which entry
|
||||
inside the configuration package mustg be used. We save window states corresponding to
|
||||
application modules.
|
||||
|
||||
@param aSource
|
||||
describe the source of this event
|
||||
Must be our frame on which we listen. Otherwhise it's an error.
|
||||
|
||||
@param bGetsOwnerShip
|
||||
can be ignored. Because we never throw the veto exception, there will no reason
|
||||
to be the new owner of this frame and close it later.
|
||||
|
||||
@threadsafe yes
|
||||
@modified 26.07.2002 15:54, as96863
|
||||
*//*-*****************************************************************************************************/
|
||||
void SAL_CALL PersistentWindowState::queryClosing ( const css::lang::EventObject& aSource ,
|
||||
sal_Bool bGetsOwnership ) throw (css::util::CloseVetoException,
|
||||
css::uno::RuntimeException )
|
||||
{
|
||||
// reset our internal state values.
|
||||
// An empty state string means: no information available and saving inside notifyClosing() not neccessary!
|
||||
/* SAFE { */
|
||||
WriteGuard aWriteLock(m_aLock);
|
||||
css::uno::Reference< css::lang::XMultiServiceFactory > xFactory = m_xFactory;
|
||||
css::uno::Reference< css::frame::XFrame > xFrame = m_xFrame;
|
||||
m_sWindowState = ::rtl::OUString();
|
||||
aWriteLock.unlock();
|
||||
/* } SAFE */
|
||||
|
||||
// We must be informed from our internal set frame. Otherwhise we was registered
|
||||
// from any outside code. But that's not allowed and I think, we must't react then right.
|
||||
// We work on our internal frame only!
|
||||
if (aSource.Source!=xFrame)
|
||||
{
|
||||
LOG_WARNING("PersistentWindowState::queryClosing()", "Notified fom unknown broadcaster! Will be ignored ...")
|
||||
return;
|
||||
}
|
||||
|
||||
css::uno::Reference< css::awt::XWindow > xWindow;
|
||||
SvtModuleOptions::EFactory eModule;
|
||||
if (PersistentWindowState::implst_getFrameProps(xFactory,xFrame,&eModule,&xWindow))
|
||||
{
|
||||
::rtl::OUString sWindowState = PersistentWindowState::implst_getWindowState(xWindow);
|
||||
// save it temp. till notifyClosing() is called!
|
||||
// Then we can make it persistent inside the configuration package.
|
||||
if (sWindowState.getLength() > 0)
|
||||
{
|
||||
/* SAFE { */
|
||||
aWriteLock.lock();
|
||||
m_sWindowState = sWindowState;
|
||||
m_eFactory = eModule;
|
||||
aWriteLock.unlock();
|
||||
/* } SAFE */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*-****************************************************************************************************//**
|
||||
@interface XCloseListener
|
||||
@short callback to react for closing of a frame
|
||||
@descr Now it's time to make the collected information persistent. (getted inside queryClosing())
|
||||
We use the config item on top of the configuration package org.openoffice.Setup for saving.
|
||||
|
||||
By the way: We accept callbacks from our internal save frame only! All other notifications
|
||||
are an error and will be ignored.
|
||||
|
||||
@param aSource
|
||||
describe the source of this event
|
||||
Must be our frame on which we listen. Otherwhise it's an error.
|
||||
|
||||
@threadsafe yes
|
||||
@modified 02.07.2002 11:41, as96863
|
||||
*//*-*****************************************************************************************************/
|
||||
void SAL_CALL PersistentWindowState::notifyClosing( const css::lang::EventObject& aSource ) throw (css::uno::RuntimeException)
|
||||
{
|
||||
/* SAFE { */
|
||||
WriteGuard aWriteLock(m_aLock);
|
||||
css::uno::Reference< css::frame::XFrame > xFrame = m_xFrame ;
|
||||
SvtModuleOptions::EFactory eFactory = m_eFactory ;
|
||||
::rtl::OUString sWindowState = m_sWindowState;
|
||||
// Note: We reset the window state member here. So a second call of this method don't do anything!
|
||||
m_sWindowState = ::rtl::OUString();
|
||||
aWriteLock.unlock();
|
||||
/* } SAFE */
|
||||
|
||||
// We must be informed from our internal set frame. Otherwhise we was registered
|
||||
// from any outside code. But that's not allowed and I think, we must't react then right.
|
||||
// We work on our internal frame only!
|
||||
if (aSource.Source!=xFrame)
|
||||
{
|
||||
LOG_WARNING("PersistentWindowState::notifyClosing()", "Notified fom unknown broadcaster! Will be ignored ...")
|
||||
return;
|
||||
}
|
||||
|
||||
if (sWindowState.getLength() > 0)
|
||||
SvtModuleOptions().SetFactoryWindowAttributes(eFactory, sWindowState);
|
||||
}
|
||||
|
||||
/*-****************************************************************************************************//**
|
||||
@interface XEventListener
|
||||
@short callback for disposing of the frame
|
||||
@descr If the frame will be disposed() we must forget his reference. Otherwhise he can't die realy.
|
||||
This method is called in every case. It doesn't matter if XCloseListener mechanism was used
|
||||
before or not. But it's not a good idea to try to get the window state here. Because at this
|
||||
time the frame has guaranteed no component inside. It's to late!
|
||||
|
||||
And further its not neccessary to deregister us as listener. Because the frame whish to die
|
||||
and will forget us automaticly. But we must forget him too. Relese his reference only here.
|
||||
|
||||
@param aSource
|
||||
describe the source of this event
|
||||
Must be our frame on which we listen. Otherwhise it's an error.
|
||||
|
||||
@threadsafe yes
|
||||
@modified 26.07.2002 15:56, as96863
|
||||
*//*-*****************************************************************************************************/
|
||||
void SAL_CALL PersistentWindowState::disposing( const css::lang::EventObject& aSource ) throw (css::uno::RuntimeException)
|
||||
{
|
||||
/* SAFE { */
|
||||
WriteGuard aWriteLock(m_aLock);
|
||||
if (aSource.Source==m_xFrame)
|
||||
m_xFrame = css::uno::Reference< css::frame::XFrame >();
|
||||
else
|
||||
if (aSource.Source==m_xFactory)
|
||||
m_xFactory = css::uno::Reference< css::lang::XMultiServiceFactory >();
|
||||
m_sWindowState = ::rtl::OUString();
|
||||
aWriteLock.unlock();
|
||||
/* } SAFE */
|
||||
}
|
||||
|
||||
/*-****************************************************************************************************//**
|
||||
@short find out the document service of the current framec omponent
|
||||
@descr We return the docuemnt service name amd the window. So the outside code can decide,
|
||||
which application module currently is used and using the window it's possible to set/get
|
||||
the corresponding window state.
|
||||
|
||||
@param xFactory [in]
|
||||
the uno service manager - neccessary ressource for internal work
|
||||
|
||||
@param xFrame [in]
|
||||
the frame, on which the required informations exist
|
||||
|
||||
@param pModule [out]
|
||||
returns the type of used application module
|
||||
Value is undefined if method returns <FALSE/>
|
||||
|
||||
@param pContainerWindow [out]
|
||||
returns the container window of the frame
|
||||
Value is undefined if method returns <FALSE/>
|
||||
|
||||
@returns [boolean]
|
||||
<TRUE/> if all requred informations could be found and are valid.
|
||||
<FALSE/> otherwhise (Note: The out-parameter wasn't used then!)
|
||||
|
||||
@threadsafe yes
|
||||
@modified 29.07.2002 08:21, as96863
|
||||
*//*-*****************************************************************************************************/
|
||||
sal_Bool PersistentWindowState::implst_getFrameProps( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory ,
|
||||
const css::uno::Reference< css::frame::XFrame >& xFrame ,
|
||||
SvtModuleOptions::EFactory* pModule ,
|
||||
css::uno::Reference< css::awt::XWindow >* pContainerWindow )
|
||||
{
|
||||
if ( ! xFrame.is())
|
||||
return sal_False;
|
||||
|
||||
css::uno::Reference< css::awt::XWindow > xContainerWindow = xFrame->getContainerWindow();
|
||||
css::uno::Reference< css::frame::XController > xController = xFrame->getController();
|
||||
|
||||
// may its an empty frame - can occure only in case first load request failed
|
||||
// and framework try to close this frame immediatly
|
||||
// But then we hav nothing to do here!
|
||||
if ( ! xContainerWindow.is() || ! xController.is() )
|
||||
return sal_False;
|
||||
|
||||
::rtl::OUString sDocumentService = ComponentLoader::specifyDocServiceByDocument(xFactory,xController);
|
||||
if (sDocumentService.getLength() < 1)
|
||||
return sal_False;
|
||||
|
||||
SvtModuleOptions::EFactory eModule;
|
||||
if ( ! SvtModuleOptions::ClassifyFactoryByName(sDocumentService,eModule))
|
||||
return sal_False;
|
||||
|
||||
*pModule = eModule;
|
||||
*pContainerWindow = xContainerWindow;
|
||||
|
||||
return sal_True;
|
||||
}
|
||||
|
||||
/*-****************************************************************************************************//**
|
||||
@short get/set the current window state from the given window
|
||||
@descr Because the toolkit interface XWindow doesn't provide this information - we try
|
||||
to gte the implementation window behind that and use it.
|
||||
|
||||
@param xWindow [in]
|
||||
the window, on which we try to ask
|
||||
|
||||
@param sWindowState [in]
|
||||
the new window state to set it
|
||||
|
||||
@returns [string]
|
||||
the current window state of the given window
|
||||
|
||||
@threadsafe yes
|
||||
@modified 29.07.2002 08:23, as96863
|
||||
*//*-*****************************************************************************************************/
|
||||
::rtl::OUString PersistentWindowState::implst_getWindowState( const css::uno::Reference< css::awt::XWindow >& xWindow )
|
||||
{
|
||||
if ( ! xWindow.is())
|
||||
return ::rtl::OUString();
|
||||
|
||||
ByteString sWindowState;
|
||||
|
||||
/* SOLAR SAFE { */
|
||||
::vos::OClearableGuard aSolarGuard( Application::GetSolarMutex() );
|
||||
Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
|
||||
// check for system window is neccessary to guarantee correct pointer cast!
|
||||
if (pWindow!=NULL && pWindow->IsSystemWindow())
|
||||
sWindowState = ((SystemWindow*)pWindow)->GetWindowState();
|
||||
aSolarGuard.clear();
|
||||
/* } SOLAR SAFE */
|
||||
|
||||
return B2U_ENC(sWindowState,RTL_TEXTENCODING_UTF8);
|
||||
}
|
||||
|
||||
//*********************************************************************************************************
|
||||
void PersistentWindowState::implst_setWindowState( const css::uno::Reference< css::awt::XWindow >& xWindow ,
|
||||
const ::rtl::OUString& sWindowState )
|
||||
{
|
||||
if (! xWindow.is() || sWindowState.getLength() < 1)
|
||||
return;
|
||||
|
||||
/* SOLAR SAFE { */
|
||||
::vos::OClearableGuard aSolarGuard( Application::GetSolarMutex() );
|
||||
Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
|
||||
// check for system window is neccessary to guarantee correct pointer cast!
|
||||
if (pWindow!=NULL && pWindow->IsSystemWindow())
|
||||
((SystemWindow*)pWindow)->SetWindowState(U2B_ENC(sWindowState,RTL_TEXTENCODING_UTF8));
|
||||
aSolarGuard.clear();
|
||||
/* } SOLAR SAFE */
|
||||
}
|
||||
|
||||
} // namespace framework
|
Loading…
Reference in a new issue