summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schlüns <as@openoffice.org>2001-07-02 12:27:02 +0000
committerAndreas Schlüns <as@openoffice.org>2001-07-02 12:27:02 +0000
commitbc5ee4fbf53291eca5e4b0da94740f719812f22e (patch)
treea54c18cfa160885421fbac63a29e8e5a3c43f675
parentb056e2012ca2aab0fadd72bf9041ce822af85aac (diff)
#79955# move to dispatch dir
-rw-r--r--framework/inc/dispatch/helpagentdispatcher.hxx225
-rw-r--r--framework/inc/dispatch/interceptionhelper.hxx416
-rw-r--r--framework/inc/dispatch/mailtodispatcher.hxx423
-rw-r--r--framework/inc/dispatch/menudispatcher.hxx448
-rw-r--r--framework/source/dispatch/helpagentdispatcher.cxx436
-rw-r--r--framework/source/dispatch/interceptionhelper.cxx504
-rw-r--r--framework/source/dispatch/mailtodispatcher.cxx479
-rw-r--r--framework/source/dispatch/menudispatcher.cxx670
8 files changed, 3601 insertions, 0 deletions
diff --git a/framework/inc/dispatch/helpagentdispatcher.hxx b/framework/inc/dispatch/helpagentdispatcher.hxx
new file mode 100644
index 000000000000..6ecf2f525e69
--- /dev/null
+++ b/framework/inc/dispatch/helpagentdispatcher.hxx
@@ -0,0 +1,225 @@
+/*************************************************************************
+ *
+ * $RCSfile: helpagentdispatcher.hxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: as $ $Date: 2001-07-02 13:23:13 $
+ *
+ * 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 EXPRESS 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_DISPATCH_HELPAGENTDISPATCHER_HXX_
+#define __FRAMEWORK_DISPATCH_HELPAGENTDISPATCHER_HXX_
+
+#ifndef __FRAMEWORK_THREADHELP_THREADHELPBASE_HXX_
+#include <threadhelp/threadhelpbase.hxx>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XDISPATCH_HPP_
+#include <com/sun/star/frame/XDispatch.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XFRAME_HPP_
+#include <com/sun/star/frame/XFrame.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_AWT_XWINDOWLISTENER_HPP_
+#include <com/sun/star/awt/XWindowListener.hpp>
+#endif
+
+#ifndef _CPPUHELPER_IMPLBASE2_HXX_
+#include <cppuhelper/implbase2.hxx>
+#endif
+
+#ifndef _OSL_MUTEX_HXX_
+#include <osl/mutex.hxx>
+#endif
+
+#ifndef _VOS_REF_HXX_
+#include <vos/ref.hxx>
+#endif
+
+#ifndef _FRAMEWORK_HELPER_TIMERHELPER_HXX_
+#include <helper/timerhelper.hxx>
+#endif
+
+#ifndef _SVTOOLS_HELPAGENTWIDNOW_HXX_
+#include <svtools/helpagentwindow.hxx>
+#endif
+
+class Window;
+
+//........................................................................
+namespace framework
+{
+//........................................................................
+
+ //====================================================================
+ //= OHelpAgentDispatcher
+ //====================================================================
+ typedef ::cppu::WeakImplHelper2 < ::com::sun::star::frame::XDispatch
+ , ::com::sun::star::awt::XWindowListener
+ > OHelpAgent_Base;
+
+ class HelpAgentDispatcher
+ :private ThreadHelpBase
+ ,public OHelpAgent_Base
+ ,public ITimerListener
+ ,public ::svt::IHelpAgentCallback
+ {
+ protected:
+ ::rtl::OUString m_sCurrentURL;
+
+ Window* m_pContainerWindow; // parent of the agent window.
+ ::svt::HelpAgentWindow*
+ m_pAgentWindow; // the agent window itself
+
+ ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >
+ m_xParentFrame; // weak reference to the frame we're responsible for
+
+ ::vos::ORef< OTimerHelper >
+ m_xAutoCloseTimer;
+
+ public:
+ HelpAgentDispatcher( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& _rxParentFrame );
+
+ protected:
+ ~HelpAgentDispatcher();
+
+ // ::com::sun::star::frame::XDispatch
+ virtual void SAL_CALL dispatch( const ::com::sun::star::util::URL& _rURL, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& _rArgs ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL addStatusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener >& _rxListener, const ::com::sun::star::util::URL& _rURL ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL removeStatusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener >& _rxListener, const ::com::sun::star::util::URL& _rURL ) throw (::com::sun::star::uno::RuntimeException);
+
+ // ::com::sun::star::awt::XWindowListener
+ virtual void SAL_CALL windowResized( const ::com::sun::star::awt::WindowEvent& _rSource ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL windowMoved( const ::com::sun::star::awt::WindowEvent& _rSource ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL windowShown( const ::com::sun::star::lang::EventObject& _rSource ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL windowHidden( const ::com::sun::star::lang::EventObject& _rSource ) throw (::com::sun::star::uno::RuntimeException);
+
+ // ::com::sun::star::lang::XEventListener
+ virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& _rSource ) throw (::com::sun::star::uno::RuntimeException);
+
+ protected:
+ void implConstruct( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& _rxContainer );
+
+ /// switches the agent to a new URL
+ void switchURL(const ::com::sun::star::util::URL& _rURL);
+
+ /// ensures that the agent's window exists and is visible
+ sal_Bool ensureAgentWindow();
+ /// check if the agent window exists
+ sal_Bool haveAgentWindow() const { return (NULL != m_pAgentWindow); }
+ /** destroyes the agent window
+ <p>This method has to be called with m_aMutex aqcuired _exactly_ once!</p>
+ */
+ void closeAgentWindow();
+
+ /** positions the help agent's window in an optimal position
+ <p>At the moment, this is a lie. The agent's window will always be placed in the
+ lower right corner of the parent window.</p>
+ */
+ void positionAgentWindow();
+
+ /// stops the timer which triggers the auto close event
+ void stopAutoCloseTimer();
+ /// starts the timer which triggers the auto close event
+ void startAutoCloseTimer();
+
+ /** ensures that m_pContainerWindow is set
+ */
+ sal_Bool ensureContainerWindow();
+
+ /** checks whether or not the given is on the ignore list
+ */
+ sal_Bool approveURLRequest(const ::com::sun::star::util::URL& _rURL);
+
+ /** mark the given URL as "ignored once more"
+ */
+ void markURLIgnored( const ::rtl::OUString& _rURL );
+
+ /// to be called when the agent window has been closed by an external instance
+ void agentClosedExternally();
+
+ protected:
+ // ITimerListener overridables
+ virtual void timerExpired();
+
+ // IHelpAgentCallback overridables
+ virtual void helpRequested();
+ virtual void closeAgent();
+ };
+
+//........................................................................
+} // namespace framework
+//........................................................................
+
+#endif // _FRAMEWORK_DISPATCH_HELPAGENTDISPATCHER_HXX_
+
+/*************************************************************************
+ * history:
+ * $Log: not supported by cvs2svn $
+ * Revision 1.3 2001/06/11 10:14:25 as
+ * #85529# use new lock mechanism
+ *
+ * Revision 1.2 2001/05/07 15:05:17 fs
+ * moved the HelpAgentWindow implementation to SVTOOLS (prevent creating a new resource file here)
+ *
+ * Revision 1.1 2001/05/07 13:39:50 fs
+ * initial checkin - help agent dispatcher
+ *
+ *
+ * Revision 1.0 03.05.01 11:28:28 fs
+ ************************************************************************/
+
diff --git a/framework/inc/dispatch/interceptionhelper.hxx b/framework/inc/dispatch/interceptionhelper.hxx
new file mode 100644
index 000000000000..e4a74deabc0a
--- /dev/null
+++ b/framework/inc/dispatch/interceptionhelper.hxx
@@ -0,0 +1,416 @@
+/*************************************************************************
+ *
+ * $RCSfile: interceptionhelper.hxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: as $ $Date: 2001-07-02 13:20:35 $
+ *
+ * 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_INTERCEPTIONHELPER_HXX_
+#define __FRAMEWORK_HELPER_INTERCEPTIONHELPER_HXX_
+
+//_________________________________________________________________________________________________________________
+// my own includes
+//_________________________________________________________________________________________________________________
+
+#ifndef __FRAMEWORK_MACROS_GENERIC_HXX_
+#include <macros/generic.hxx>
+#endif
+
+#ifndef __FRAMEWORK_MACROS_XINTERFACE_HXX_
+#include <macros/xinterface.hxx>
+#endif
+
+#ifndef __FRAMEWORK_MACROS_DEBUG_HXX_
+#include <macros/debug.hxx>
+#endif
+
+#ifndef __FRAMEWORK_THREADHELP_THREADHELPBASE_HXX_
+#include <threadhelp/threadhelpbase.hxx>
+#endif
+
+#ifndef __FRAMEWORK_SERVICES_FRAME_HXX_
+#include <services/frame.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_FRAME_XDISPATCHPROVIDERINTERCEPTION_HPP_
+#include <com/sun/star/frame/XDispatchProviderInterception.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XDISPATCHPROVIDERINTERCEPTOR_HPP_
+#include <com/sun/star/frame/XDispatchProviderInterceptor.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XDISPATCHPROVIDER_HPP_
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XDISPATCH_HPP_
+#include <com/sun/star/frame/XDispatch.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XFRAME_HPP_
+#include <com/sun/star/frame/XFrame.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_DISPATCHDESCRIPTOR_HPP_
+#include <com/sun/star/frame/DispatchDescriptor.hpp>
+#endif
+
+//_________________________________________________________________________________________________________________
+// other includes
+//_________________________________________________________________________________________________________________
+
+#ifndef _CPPUHELPER_WEAK_HXX_
+#include <cppuhelper/weak.hxx>
+#endif
+
+#ifndef _CPPUHELPER_WEAKREF_HXX_
+#include <cppuhelper/weakref.hxx>
+#endif
+
+#ifndef __SGI_STL_DEQUE
+#include <deque>
+#endif
+
+//_________________________________________________________________________________________________________________
+// namespace
+//_________________________________________________________________________________________________________________
+
+namespace framework{
+
+//_________________________________________________________________________________________________________________
+// exported const
+//_________________________________________________________________________________________________________________
+
+//_________________________________________________________________________________________________________________
+// exported definitions
+//_________________________________________________________________________________________________________________
+
+/*-************************************************************************************************************//**
+ We must save a performant list with URL pattern for all registered interceptor objects.
+ We implement this as a dynamical vector of interceptor references with a URL list for every item.
+*//*-*************************************************************************************************************/
+
+struct IMPL_TInterceptorInfo
+{
+ css::uno::Reference< css::frame::XDispatchProviderInterceptor > xInterceptor ;
+ css::uno::Sequence< ::rtl::OUString > seqPatternList ;
+};
+
+class IMPL_CInterceptorList : public ::std::deque< IMPL_TInterceptorInfo >
+{
+ public:
+ // Implement our own find method to search for an interceptor in our list of structures!
+ // We can't search for it directly with ::std::find_if() or something else.
+ iterator find( const css::uno::Reference< css::frame::XDispatchProviderInterceptor >& xInterceptor )
+ {
+ // I hope that the iterator has a right implemented ++operator and we arrive end() exactly!
+ // If it is so - we can use aItem->... without any problems and must not check it.
+ iterator aItem;
+ for( aItem=begin(); aItem!=end(); ++aItem )
+ {
+ if( aItem->xInterceptor == xInterceptor )
+ {
+ break;
+ }
+ }
+ return aItem;
+ }
+};
+
+/*-************************************************************************************************************//**
+ @short implement a helper to support interception with additional functionality
+ @descr These helper implement the complete XDispatchProviderInterception interface with
+ master/slave functionality AND using of optional features like URL lists!
+
+ @implements XInterface
+ XDispatchProviderInterception
+ @base ThreadHelpBase
+ OWeakObject
+
+ @attention Don't use this class as direct member - use it dynamicly. Do not derive from this class.
+ We hold a weakreference to ouer owner not to ouer superclass.
+
+ @devstatus ready to use
+ @threadsafe yes
+*//*-*************************************************************************************************************/
+
+class InterceptionHelper : public css::frame::XDispatchProvider ,
+ public css::frame::XDispatchProviderInterception ,
+ public css::lang::XEventListener ,
+ public ThreadHelpBase ,
+ public ::cppu::OWeakObject
+{
+ //-------------------------------------------------------------------------------------------------------------
+ // public methods
+ //-------------------------------------------------------------------------------------------------------------
+
+ public:
+
+ //---------------------------------------------------------------------------------------------------------
+ // constructor / destructor
+ //---------------------------------------------------------------------------------------------------------
+
+ /*-****************************************************************************************************//**
+ @short standard ctor
+ @descr These initialize a new instance of this class with all needed informations for work.
+ We share mutex with owner implementation and hold a weakreference to it!
+
+ @seealso -
+
+ @param "xSlaveDispatcher" , reference to a dispatch helper of our owner. We need it as slave for registered interceptors.
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ InterceptionHelper( const css::uno::Reference< css::frame::XFrame >& xFrame ,
+ const css::uno::Reference< css::frame::XDispatchProvider >& xSlaveDispatcher );
+
+ //---------------------------------------------------------------------------------------------------------
+ // XInterface
+ //---------------------------------------------------------------------------------------------------------
+
+ DECLARE_XINTERFACE
+
+ //---------------------------------------------------------------------------------------------------------
+ // XDispatchProvider
+ //---------------------------------------------------------------------------------------------------------
+
+ /*-****************************************************************************************************//**
+ @short query for a dispatcher for given parameter
+ @descr If somebody will dispatch a URL he must have a valid dispatch object to do it.
+ With these function you he can get these object ... if target exist or could create!
+ If an interceptor is registered for given URL we used - otherwise not.
+
+ @seealso interface XDispatch
+ @seealso method queryDispatches()
+
+ @param "aURL" , the URL to dispatch
+ @param "sTargetFrameName" , the name of the target frame or a special name like "_blank", "_top" ...
+ @param "nSearchFlags" , optional search parameter for targeting
+ @return -
+
+ @onerror A null reference is returned.
+ *//*-*****************************************************************************************************/
+
+ virtual css::uno::Reference< css::frame::XDispatch > SAL_CALL queryDispatch( const css::util::URL& aURL ,
+ const ::rtl::OUString& sTargetFrameName,
+ sal_Int32 nSearchFlags ) throw( css::uno::RuntimeException );
+
+ /*-****************************************************************************************************//**
+ @short query for more then one dispatcher at the same time
+ @descr These function do the same like queryDispatch() before, but for a lot of URLs at the same time.
+ A registered interceptor is used automaticly.
+
+ @seealso interface XDispatch
+ @seealso method queryDispatch()
+
+ @param "aDescriptor", list to describe more then one dispatches
+ @return -
+
+ @onerror An empty list is returned or if one dispatch was wrong one result is missing!
+ *//*-*****************************************************************************************************/
+
+ virtual css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL queryDispatches( const css::uno::Sequence< css::frame::DispatchDescriptor >& seqDescriptor ) throw( css::uno::RuntimeException );
+
+ //---------------------------------------------------------------------------------------------------------
+ // XDispatchProviderInterception
+ //---------------------------------------------------------------------------------------------------------
+
+ /*-****************************************************************************************************//**
+ @short register an interceptor for dispatches
+ @descr Somebody can register himself to intercept all or some special dispatches.
+ It's depend from his supported interfaces. If he implement XInterceptorInfo
+ he his called for some special URLs only - otherwise we call it for every request!
+
+ @seealso interface XDispatchProviderInterceptor
+ @seealso interface XInterceptorInfo
+ @seealso method releaseDispatchProviderInterceptor()
+
+ @param "xInterceptor", reference to interceptor for register
+ @return -
+
+ @onerror Listener is'nt added to our container.
+ *//*-*****************************************************************************************************/
+
+ virtual void SAL_CALL registerDispatchProviderInterceptor( const css::uno::Reference< css::frame::XDispatchProviderInterceptor >& xInterceptor ) throw( css::uno::RuntimeException );
+
+ /*-****************************************************************************************************//**
+ @short release an interceptor for dispatches
+ @descr Remove registered interceptor from our internal list and all special informations about him.
+
+ @seealso method registerDispatchProviderInterceptor()
+
+ @param "xInterceptor", reference to interceptor for release
+ @return -
+
+ @onerror Listener is'nt removed from our container.
+ *//*-*****************************************************************************************************/
+
+ virtual void SAL_CALL releaseDispatchProviderInterceptor( const css::uno::Reference< css::frame::XDispatchProviderInterceptor >& xInterceptor ) throw( css::uno::RuntimeException );
+
+ //---------------------------------------------------------------------------------------------------------
+ // XEventListener
+ //---------------------------------------------------------------------------------------------------------
+
+ virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) throw ( css::uno::RuntimeException );
+
+ //-------------------------------------------------------------------------------------------------------------
+ // protected methods
+ //-------------------------------------------------------------------------------------------------------------
+
+ protected:
+
+ /*-****************************************************************************************************//**
+ @short standard destructor
+ @descr This method destruct an instance of this class and clear some member.
+ This method is protected, because its not allowed to use this class as a direct member!
+ You MUST use a dynamical instance (pointer). That's the reason for a protected dtor.
+
+ @seealso -
+
+ @param -
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ virtual ~InterceptionHelper();
+
+ //-------------------------------------------------------------------------------------------------------------
+ // private methods
+ //-------------------------------------------------------------------------------------------------------------
+
+ private:
+
+ /*-****************************************************************************************************//**
+ @short search an interceptor which is registered for given URL
+ @descr We search in our list to get the right interceptor, which wish to intercept these URL.
+ We don't must use the highest one!
+
+ @seealso -
+
+ @param "sURL", URL which must match with a registered pattern
+ @return Reference to a registered interceptor for these URL or NULL if no object was found.
+
+ @onerror A null reference is returned.
+ *//*-*****************************************************************************************************/
+
+ css::uno::Reference< css::frame::XDispatchProviderInterceptor > impl_searchMatchingInterceptor( const ::rtl::OUString& sURL );
+
+ //-------------------------------------------------------------------------------------------------------------
+ // debug methods
+ // (should be private everyway!)
+ //-------------------------------------------------------------------------------------------------------------
+
+ /*-****************************************************************************************************//**
+ @short debug-method to check incoming parameter of some other mehods of this class
+ @descr The following methods are used to check parameters for other methods
+ of this class. The return value is used directly for an ASSERT(...).
+
+ @seealso ASSERTs in implementation!
+
+ @param references to checking variables
+ @return sal_False ,on invalid parameter
+ @return sal_True ,otherwise
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ #ifdef ENABLE_ASSERTIONS
+
+ private:
+
+ static sal_Bool impldbg_checkParameter_InterceptionHelper ( const css::uno::Reference< css::frame::XDispatchProvider >& xSlaveDispatcher);
+ static sal_Bool impldbg_checkParameter_queryDispatch ( const css::util::URL& aURL ,
+ const ::rtl::OUString& sTargetFrameName,
+ sal_Int32 nSearchFlags );
+ static sal_Bool impldbg_checkParameter_queryDispatches ( const css::uno::Sequence< css::frame::DispatchDescriptor >& seqDescriptor );
+ static sal_Bool impldbg_checkParameter_registerDispatchProviderInterceptor ( const css::uno::Reference< css::frame::XDispatchProviderInterceptor >& xInterceptor );
+ static sal_Bool impldbg_checkParameter_releaseDispatchProviderInterceptor ( const css::uno::Reference< css::frame::XDispatchProviderInterceptor >& xInterceptor );
+
+ #endif // #ifdef ENABLE_ASSERTIONS
+
+ //-------------------------------------------------------------------------------------------------------------
+ // variables
+ // (should be private everyway!)
+ //-------------------------------------------------------------------------------------------------------------
+
+ private:
+
+ css::uno::WeakReference< css::frame::XFrame > m_xOwnerWeak ; /// weakreference to owner (Don't use a hard reference. Owner can't delete us then!)
+ css::uno::Reference< css::frame::XDispatchProvider > m_xSlaveDispatcher ; /// helper for XDispatchProvider and XDispatch interfaces
+ IMPL_CInterceptorList m_aInterceptorList ; /// an interceptor can register himself for a list of URLs or URL pattern
+
+}; // class InterceptionHelper
+
+} // namespace framework
+
+#endif // #ifndef __FRAMEWORK_HELPER_INTERCEPTIONHELPER_HXX_
diff --git a/framework/inc/dispatch/mailtodispatcher.hxx b/framework/inc/dispatch/mailtodispatcher.hxx
new file mode 100644
index 000000000000..2c8644be673f
--- /dev/null
+++ b/framework/inc/dispatch/mailtodispatcher.hxx
@@ -0,0 +1,423 @@
+/*************************************************************************
+ *
+ * $RCSfile: mailtodispatcher.hxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: as $ $Date: 2001-07-02 13:22:39 $
+ *
+ * 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_DISPATCH_MAILTODISPATCHER_HXX_
+#define __FRAMEWORK_DISPATCH_MAILTODISPATCHER_HXX_
+
+//_________________________________________________________________________________________________________________
+// my own includes
+//_________________________________________________________________________________________________________________
+
+#ifndef __FRAMEWORK_CLASSES_TASKCREATOR_HXX_
+#include <classes/taskcreator.hxx>
+#endif
+
+#ifndef __FRAMEWORK_SERVICES_FRAME_HXX_
+#include <services/frame.hxx>
+#endif
+
+#ifndef __FRAMEWORK_MACROS_GENERIC_HXX_
+#include <macros/generic.hxx>
+#endif
+
+#ifndef __FRAMEWORK_MACROS_XINTERFACE_HXX_
+#include <macros/xinterface.hxx>
+#endif
+
+#ifndef __FRAMEWORK_MACROS_XTYPEPROVIDER_HXX_
+#include <macros/xtypeprovider.hxx>
+#endif
+
+#ifndef __FRAMEWORK_MACROS_DEBUG_HXX_
+#include <macros/debug.hxx>
+#endif
+
+#ifndef __FRAMEWORK_THREADHELP_THREADHELPBASE_HXX_
+#include <threadhelp/threadhelpbase.hxx>
+#endif
+
+#ifndef __FRAMEWORK_GENERAL_H_
+#include <general.h>
+#endif
+
+#ifndef __FRAMEWORK_STDTYPES_H_
+#include <stdtypes.h>
+#endif
+
+//_________________________________________________________________________________________________________________
+// interface includes
+//_________________________________________________________________________________________________________________
+
+#ifndef _COM_SUN_STAR_LANG_XTYPEPROVIDER_HPP_
+#include <com/sun/star/lang/XTypeProvider.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XDISPATCH_HPP_
+#include <com/sun/star/frame/XDispatch.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_UTIL_URL_HPP_
+#include <com/sun/star/util/URL.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_DISPATCHDESCRIPTOR_HPP_
+#include <com/sun/star/frame/DispatchDescriptor.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_
+#include <com/sun/star/beans/PropertyValue.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XSTATUSLISTENER_HPP_
+#include <com/sun/star/frame/XStatusListener.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XFRAMELOADER_HPP_
+#include <com/sun/star/frame/XFrameLoader.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XLOADEVENTLISTENER_HPP_
+#include <com/sun/star/frame/XLoadEventListener.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XDESKTOP_HPP_
+#include <com/sun/star/frame/XDesktop.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XTASK_HPP_
+#include <com/sun/star/frame/XTask.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_FEATURESTATEEVENT_HPP_
+#include <com/sun/star/frame/FeatureStateEvent.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XFRAMEACTIONLISTENER_HPP_
+#include <com/sun/star/frame/XFrameActionListener.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_SYSTEM_XSIMPLEMAILCLIENTSUPPLIER_HPP_
+#include <com/sun/star/system/XSimpleMailClientSupplier.hpp>
+#endif
+
+//_________________________________________________________________________________________________________________
+// other includes
+//_________________________________________________________________________________________________________________
+
+#ifndef _CPPUHELPER_WEAK_HXX_
+#include <cppuhelper/weak.hxx>
+#endif
+
+#ifndef _CPPUHELPER_WEAKREF_HXX_
+#include <cppuhelper/weakref.hxx>
+#endif
+
+#ifndef _CPPUHELPER_INTERFACECONTAINER_H_
+#include <cppuhelper/interfacecontainer.h>
+#endif
+
+//_________________________________________________________________________________________________________________
+// namespace
+//_________________________________________________________________________________________________________________
+
+namespace framework{
+
+typedef ::cppu::OMultiTypeInterfaceContainerHelperVar< ::rtl::OUString ,
+ OUStringHashCode ,
+ std::equal_to< ::rtl::OUString > > IMPL_ListenerHashContainer;
+
+
+//_________________________________________________________________________________________________________________
+// exported const
+//_________________________________________________________________________________________________________________
+
+//_________________________________________________________________________________________________________________
+// exported definitions
+//_________________________________________________________________________________________________________________
+
+
+/*-************************************************************************************************************//**
+ @short helper for desktop only(!) to create new tasks on demand for dispatches
+ @descr Use this class as member only! Never use it as baseclass.
+ XInterface will be ambigous and we hold a weakcss::uno::Reference to ouer OWNER - not to ouer SUPERCLASS!
+
+ @implements XInterface
+ XDispatch
+ XLoadEventListener
+ XFrameActionListener
+ XEventListener
+ @base OMutexMember
+ OWeakObject
+
+ @devstatus ready to use
+*//*-*************************************************************************************************************/
+class MailToDispatcher : // interfaces
+ public css::lang::XTypeProvider ,
+ public css::frame::XDispatch ,
+ public css::lang::XEventListener ,
+ // baseclasses
+ // Order is neccessary for right initialization!
+ public ThreadHelpBase ,
+ public cppu::OWeakObject
+{
+ //-------------------------------------------------------------------------------------------------------------
+ // public methods
+ //-------------------------------------------------------------------------------------------------------------
+
+ public:
+
+ //---------------------------------------------------------------------------------------------------------
+ // constructor / destructor
+ //---------------------------------------------------------------------------------------------------------
+
+ /*-****************************************************************************************************//**
+ @short standard ctor
+ @descr These initialize a new instance of ths class with needed informations for work.
+
+ @seealso using at owner
+
+ @param "xFactory" , css::uno::Reference to servicemanager for creation of new services
+ @param "xOwner" , css::uno::Reference to our owner, the Desktop!!!
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ MailToDispatcher( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory ,
+ const css::uno::Reference< css::frame::XFrame >& xOwner );
+
+ //---------------------------------------------------------------------------------------------------------
+ // XInterface
+ //---------------------------------------------------------------------------------------------------------
+
+ DECLARE_XINTERFACE
+ DECLARE_XTYPEPROVIDER
+
+ //---------------------------------------------------------------------------------------------------------
+ // XDispatch
+ //---------------------------------------------------------------------------------------------------------
+
+ /*-****************************************************************************************************//**
+ @short dispatch URL with arguments
+ @descr Every dispatch create a new task. If load of URL failed task will deleted automaticly!
+
+ @seealso -
+
+ @param "aURL" , URL to dispatch.
+ @param "seqArguments" , list of optional arguments.
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ virtual void SAL_CALL dispatch( const css::util::URL& aURL ,
+ const css::uno::Sequence< css::beans::PropertyValue >& seqProperties ) throw( css::uno::RuntimeException );
+
+ /*-****************************************************************************************************//**
+ @short add listener for state events
+ @descr You can add a listener to get information about status of dispatch: OK or Failed.
+
+ @seealso method loadFinished()
+ @seealso method loadCancelled()
+
+ @param "xControl" , css::uno::Reference to a valid listener for state events.
+ @param "aURL" , URL about listener will be informed, if something occured.
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ virtual void SAL_CALL addStatusListener( const css::uno::Reference< css::frame::XStatusListener >& xControl,
+ const css::util::URL& aURL ) throw( css::uno::RuntimeException );
+
+ /*-****************************************************************************************************//**
+ @short remove listener for state events
+ @descr You can remove a listener if information of dispatch isn't important for you any longer.
+
+ @seealso method loadFinished()
+ @seealso method loadCancelled()
+
+ @param "xControl" , css::uno::Reference to a valid listener.
+ @param "aURL" , URL on which listener has registered.
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ virtual void SAL_CALL removeStatusListener( const css::uno::Reference< css::frame::XStatusListener >& xControl,
+ const css::util::URL& aURL ) throw( css::uno::RuntimeException );
+
+
+ //---------------------------------------------------------------------------------------------------------
+ // XEventListener
+ //---------------------------------------------------------------------------------------------------------
+
+ /*-****************************************************************************************************//**
+ @short dispose current instance
+ @descr If service helper isn't required any longer call this method to release all used ressources.
+
+ @seealso -
+
+ @param "aEvent", information about source of this event.
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ void SAL_CALL disposing( const css::lang::EventObject& aEvent ) throw( css::uno::RuntimeException );
+
+ //-------------------------------------------------------------------------------------------------------------
+ // protected methods
+ //-------------------------------------------------------------------------------------------------------------
+
+ protected:
+
+ /*-****************************************************************************************************//**
+ @short standard destructor
+ @descr This method destruct an instance of this class and clear some member.
+ This method is protected, because its not allowed to use an instance of this class as a member!
+ You MUST use a pointer.
+
+ @seealso -
+
+ @param -
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ virtual ~MailToDispatcher();
+
+ //-------------------------------------------------------------------------------------------------------------
+ // private methods
+ //-------------------------------------------------------------------------------------------------------------
+
+ private:
+
+ /*-****************************************************************************************************//**
+ @short -
+ @descr -
+
+ @seealso -
+
+ @param -
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ void impl_sendStatusEvent( const css::uno::Reference< css::frame::XFrame >& xEventSource ,
+ const ::rtl::OUString& sURL ,
+ sal_Bool bLoadState );
+
+
+ void impl_getSequenceFromStringList( css::uno::Sequence< ::rtl::OUString >&, const ::rtl::OUString& );
+
+ //-------------------------------------------------------------------------------------------------------------
+ // debug methods
+ // (should be private everyway!)
+ //-------------------------------------------------------------------------------------------------------------
+
+ /*-****************************************************************************************************//**
+ @short debug-method to check incoming parameter of some other mehods of this class
+ @descr The following methods are used to check parameters for other methods
+ of this class. The return value is used directly for an ASSERT(...).
+
+ @seealso ASSERTs in implementation!
+
+ @param css::uno::References to checking variables
+ @return sal_False on invalid parameter<BR>
+ sal_True otherway
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ #ifdef ENABLE_ASSERTIONS
+
+ private:
+
+ static sal_Bool impldbg_checkParameter_MailToDispatcher ( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory ,
+ const css::uno::Reference< css::frame::XFrame >& xOwner );
+ static sal_Bool impldbg_checkParameter_dispatch ( const css::util::URL& aURL ,
+ const css::uno::Sequence< css::beans::PropertyValue >& seqArguments );
+ static sal_Bool impldbg_checkParameter_addStatusListener ( const css::uno::Reference< css::frame::XStatusListener >& xControl ,
+ const css::util::URL& aURL );
+ static sal_Bool impldbg_checkParameter_removeStatusListener ( const css::uno::Reference< css::frame::XStatusListener >& xControl ,
+ const css::util::URL& aURL );
+ #endif // #ifdef ENABLE_ASSERTIONS
+
+ //-------------------------------------------------------------------------------------------------------------
+ // variables
+ // (should be private everyway!)
+ //-------------------------------------------------------------------------------------------------------------
+
+ private:
+
+ css::uno::WeakReference< css::frame::XFrame > m_xOwnerWeak ; /// css::uno::WeakReference to owner (Don't use a hard css::uno::Reference. Owner can't delete us then!)
+ css::uno::Reference< css::lang::XMultiServiceFactory > m_xFactory ; /// factory shared with our owner to create new services!
+ IMPL_ListenerHashContainer m_aListenerContainer; /// hash table for listener at specified URLs
+ sal_Bool m_bAlreadyDisposed ; /// Protection against multiple disposing calls.
+ css::uno::Reference< css::system::XSimpleMailClientSupplier > m_xSimpleMailClientSupplier; /// simple mail client supplier
+}; // class MailToDispatcher
+
+} // namespace framework
+
+#endif // #ifndef __FRAMEWORK_DISPATCH_MAILTODISPATCHER_HXX_
diff --git a/framework/inc/dispatch/menudispatcher.hxx b/framework/inc/dispatch/menudispatcher.hxx
new file mode 100644
index 000000000000..01253c6703a9
--- /dev/null
+++ b/framework/inc/dispatch/menudispatcher.hxx
@@ -0,0 +1,448 @@
+/*************************************************************************
+ *
+ * $RCSfile: menudispatcher.hxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: as $ $Date: 2001-07-02 13:22:14 $
+ *
+ * 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_DISPATCH_MENUDISPATCHER_HXX_
+#define __FRAMEWORK_DISPATCH_MENUDISPATCHER_HXX_
+
+//_________________________________________________________________________________________________________________
+// my own includes
+//_________________________________________________________________________________________________________________
+
+#ifndef __FRAMEWORK_CLASSES_TASKCREATOR_HXX_
+#include <classes/taskcreator.hxx>
+#endif
+
+#ifndef __FRAMEWORK_SERVICES_FRAME_HXX_
+#include <services/frame.hxx>
+#endif
+
+#ifndef __FRAMEWORK_MACROS_GENERIC_HXX_
+#include <macros/generic.hxx>
+#endif
+
+#ifndef __FRAMEWORK_MACROS_XINTERFACE_HXX_
+#include <macros/xinterface.hxx>
+#endif
+
+#ifndef __FRAMEWORK_MACROS_XTYPEPROVIDER_HXX_
+#include <macros/xtypeprovider.hxx>
+#endif
+
+#ifndef __FRAMEWORK_MACROS_DEBUG_HXX_
+#include <macros/debug.hxx>
+#endif
+
+#ifndef __FRAMEWORK_THREADHELP_THREADHELPBASE_HXX_
+#include <threadhelp/threadhelpbase.hxx>
+#endif
+
+#ifndef __FRAMEWORK_CLASSES_MENUMANAGER_HXX_
+#include <classes/menumanager.hxx>
+#endif
+
+#ifndef __FRAMEWORK_GENERAL_H_
+#include <general.h>
+#endif
+
+#ifndef __FRAMEWORK_STDTYPES_H_
+#include <stdtypes.h>
+#endif
+
+//_________________________________________________________________________________________________________________
+// interface includes
+//_________________________________________________________________________________________________________________
+
+#ifndef _COM_SUN_STAR_LANG_XTYPEPROVIDER_HPP_
+#include <com/sun/star/lang/XTypeProvider.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XDISPATCH_HPP_
+#include <com/sun/star/frame/XDispatch.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_UTIL_URL_HPP_
+#include <com/sun/star/util/URL.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_DISPATCHDESCRIPTOR_HPP_
+#include <com/sun/star/frame/DispatchDescriptor.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_
+#include <com/sun/star/beans/PropertyValue.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XSTATUSLISTENER_HPP_
+#include <com/sun/star/frame/XStatusListener.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XFRAMELOADER_HPP_
+#include <com/sun/star/frame/XFrameLoader.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XLOADEVENTLISTENER_HPP_
+#include <com/sun/star/frame/XLoadEventListener.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XDESKTOP_HPP_
+#include <com/sun/star/frame/XDesktop.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XTASK_HPP_
+#include <com/sun/star/frame/XTask.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_FEATURESTATEEVENT_HPP_
+#include <com/sun/star/frame/FeatureStateEvent.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XFRAMEACTIONLISTENER_HPP_
+#include <com/sun/star/frame/XFrameActionListener.hpp>
+#endif
+
+//_________________________________________________________________________________________________________________
+// other includes
+//_________________________________________________________________________________________________________________
+
+#ifndef _CPPUHELPER_WEAK_HXX_
+#include <cppuhelper/weak.hxx>
+#endif
+
+#ifndef _CPPUHELPER_WEAKREF_HXX_
+#include <cppuhelper/weakref.hxx>
+#endif
+
+#ifndef _CPPUHELPER_INTERFACECONTAINER_H_
+#include <cppuhelper/interfacecontainer.h>
+#endif
+
+//_________________________________________________________________________________________________________________
+// namespace
+//_________________________________________________________________________________________________________________
+
+namespace framework{
+
+
+//_________________________________________________________________________________________________________________
+// exported const
+//_________________________________________________________________________________________________________________
+
+//_________________________________________________________________________________________________________________
+// exported definitions
+//_________________________________________________________________________________________________________________
+
+/*-************************************************************************************************************//**
+ We must save informations about our listener and URL for listening.
+ We implement this as a hashtable for strings.
+*//*-*************************************************************************************************************/
+
+typedef ::cppu::OMultiTypeInterfaceContainerHelperVar< ::rtl::OUString ,
+ OUStringHashCode ,
+ std::equal_to< ::rtl::OUString > > IMPL_ListenerHashContainer;
+
+
+/*-************************************************************************************************************//**
+ @short helper for desktop only(!) to create new tasks on demand for dispatches
+ @descr Use this class as member only! Never use it as baseclass.
+ XInterface will be ambigous and we hold a weakcss::uno::Reference to ouer OWNER - not to ouer SUPERCLASS!
+
+ @implements XInterface
+ XDispatch
+ XLoadEventListener
+ XFrameActionListener
+ XEventListener
+ @base ThreadHelpBase
+ OWeakObject
+
+ @devstatus ready to use
+*//*-*************************************************************************************************************/
+class MenuDispatcher : // interfaces
+ public css::lang::XTypeProvider ,
+ public css::frame::XDispatch ,
+ public css::frame::XFrameActionListener ,
+ // baseclasses
+ // Order is neccessary for right initialization!
+ public ThreadHelpBase ,
+ public cppu::OWeakObject
+{
+ //-------------------------------------------------------------------------------------------------------------
+ // public methods
+ //-------------------------------------------------------------------------------------------------------------
+
+ public:
+
+ //---------------------------------------------------------------------------------------------------------
+ // constructor / destructor
+ //---------------------------------------------------------------------------------------------------------
+
+ /*-****************************************************************************************************//**
+ @short standard ctor
+ @descr These initialize a new instance of ths class with needed informations for work.
+
+ @seealso using at owner
+
+ @param "xFactory" , css::uno::Reference to servicemanager for creation of new services
+ @param "xOwner" , css::uno::Reference to our owner, the Desktop!!!
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ MenuDispatcher( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory ,
+ const css::uno::Reference< css::frame::XFrame >& xOwner );
+
+ //---------------------------------------------------------------------------------------------------------
+ // XInterface
+ //---------------------------------------------------------------------------------------------------------
+
+ DECLARE_XINTERFACE
+ DECLARE_XTYPEPROVIDER
+
+ //---------------------------------------------------------------------------------------------------------
+ // XDispatch
+ //---------------------------------------------------------------------------------------------------------
+
+ /*-****************************************************************************************************//**
+ @short dispatch URL with arguments
+ @descr Every dispatch create a new task. If load of URL failed task will deleted automaticly!
+
+ @seealso -
+
+ @param "aURL" , URL to dispatch.
+ @param "seqArguments" , list of optional arguments.
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ virtual void SAL_CALL dispatch( const css::util::URL& aURL ,
+ const css::uno::Sequence< css::beans::PropertyValue >& seqProperties ) throw( css::uno::RuntimeException );
+
+ /*-****************************************************************************************************//**
+ @short add listener for state events
+ @descr You can add a listener to get information about status of dispatch: OK or Failed.
+
+ @seealso method loadFinished()
+ @seealso method loadCancelled()
+
+ @param "xControl" , css::uno::Reference to a valid listener for state events.
+ @param "aURL" , URL about listener will be informed, if something occured.
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ virtual void SAL_CALL addStatusListener( const css::uno::Reference< css::frame::XStatusListener >& xControl,
+ const css::util::URL& aURL ) throw( css::uno::RuntimeException );
+
+ /*-****************************************************************************************************//**
+ @short remove listener for state events
+ @descr You can remove a listener if information of dispatch isn't important for you any longer.
+
+ @seealso method loadFinished()
+ @seealso method loadCancelled()
+
+ @param "xControl" , css::uno::Reference to a valid listener.
+ @param "aURL" , URL on which listener has registered.
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ virtual void SAL_CALL removeStatusListener( const css::uno::Reference< css::frame::XStatusListener >& xControl,
+ const css::util::URL& aURL ) throw( css::uno::RuntimeException );
+
+
+ //---------------------------------------------------------------------------------------------------------
+ // XFrameActionListener
+ //---------------------------------------------------------------------------------------------------------
+
+ virtual void SAL_CALL frameAction( const css::frame::FrameActionEvent& aEvent ) throw ( css::uno::RuntimeException );
+
+ //---------------------------------------------------------------------------------------------------------
+ // XEventListener
+ //---------------------------------------------------------------------------------------------------------
+
+ /*-****************************************************************************************************//**
+ @short dispose current instance
+ @descr If service helper isn't required any longer call this method to release all used ressources.
+
+ @seealso -
+
+ @param "aEvent", information about source of this event.
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ void SAL_CALL disposing( const EVENTOBJECT& aEvent ) throw( css::uno::RuntimeException );
+
+ //-------------------------------------------------------------------------------------------------------------
+ // protected methods
+ //-------------------------------------------------------------------------------------------------------------
+
+ protected:
+
+ /*-****************************************************************************************************//**
+ @short standard destructor
+ @descr This method destruct an instance of this class and clear some member.
+ This method is protected, because its not allowed to use an instance of this class as a member!
+ You MUST use a pointer.
+
+ @seealso -
+
+ @param -
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ virtual ~MenuDispatcher();
+
+ //-------------------------------------------------------------------------------------------------------------
+ // private methods
+ //-------------------------------------------------------------------------------------------------------------
+
+ private:
+
+ /*-****************************************************************************************************//**
+ @short -
+ @descr -
+
+ @seealso -
+
+ @param -
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ void impl_sendStatusEvent( const css::uno::Reference< XFRAME >& xEventSource ,
+ const ::rtl::OUString& sURL ,
+ sal_Bool bLoadState );
+
+
+ /*-****************************************************************************************************//**
+ @short -
+ @descr -
+
+ @seealso -
+
+ @param -
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ sal_Bool impl_setMenuBar( MenuBar* pMenuBar, sal_Bool bMenuFromResource = sal_False );
+
+ //-------------------------------------------------------------------------------------------------------------
+ // debug methods
+ // (should be private everyway!)
+ //-------------------------------------------------------------------------------------------------------------
+
+ /*-****************************************************************************************************//**
+ @short debug-method to check incoming parameter of some other mehods of this class
+ @descr The following methods are used to check parameters for other methods
+ of this class. The return value is used directly for an ASSERT(...).
+
+ @seealso ASSERTs in implementation!
+
+ @param css::uno::References to checking variables
+ @return sal_False on invalid parameter<BR>
+ sal_True otherway
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ #ifdef ENABLE_ASSERTIONS
+
+ private:
+
+ static sal_Bool impldbg_checkParameter_MenuDispatcher ( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory ,
+ const css::uno::Reference< css::frame::XFrame >& xOwner );
+ static sal_Bool impldbg_checkParameter_dispatch ( const css::util::URL& aURL ,
+ const css::uno::Sequence< css::beans::PropertyValue >& seqArguments );
+ static sal_Bool impldbg_checkParameter_addStatusListener ( const css::uno::Reference< css::frame::XStatusListener >& xControl ,
+ const css::util::URL& aURL );
+ static sal_Bool impldbg_checkParameter_removeStatusListener ( const css::uno::Reference< css::frame::XStatusListener >& xControl ,
+ const css::util::URL& aURL );
+ #endif // #ifdef ENABLE_ASSERTIONS
+
+ //-------------------------------------------------------------------------------------------------------------
+ // variables
+ // (should be private everyway!)
+ //-------------------------------------------------------------------------------------------------------------
+
+ private:
+
+ css::uno::WeakReference< css::frame::XFrame > m_xOwnerWeak ; /// css::uno::WeakReference to owner (Don't use a hard css::uno::Reference. Owner can't delete us then!)
+ css::uno::Reference< css::lang::XMultiServiceFactory > m_xFactory ; /// factory shared with our owner to create new services!
+ IMPL_ListenerHashContainer m_aListenerContainer; /// hash table for listener at specified URLs
+ sal_Bool m_bAlreadyDisposed ; /// Protection against multiple disposing calls.
+ sal_Bool m_bActivateListener ; /// dispatcher is listener for frame activation
+ MenuManager* m_pMenuManager ; /// menu manager controlling menu dispatches
+
+}; // class MenuDispatcher
+
+} // namespace framework
+
+#endif // #ifndef __FRAMEWORK_DISPATCH_MENUDISPATCHER_HXX_
diff --git a/framework/source/dispatch/helpagentdispatcher.cxx b/framework/source/dispatch/helpagentdispatcher.cxx
new file mode 100644
index 000000000000..d3cc459a366f
--- /dev/null
+++ b/framework/source/dispatch/helpagentdispatcher.cxx
@@ -0,0 +1,436 @@
+/*************************************************************************
+ *
+ * $RCSfile: helpagentdispatcher.cxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: as $ $Date: 2001-07-02 13:27:02 $
+ *
+ * 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 EXPRESS 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_DISPATCH_HELPAGENTDISPATCHER_HXX_
+#include <dispatch/helpagentdispatcher.hxx>
+#endif
+
+#ifndef __FRAMEWORK_THREADHELP_RESETABLEGUARD_HXX_
+#include <threadhelp/resetableguard.hxx>
+#endif
+
+#ifndef _OSL_DIAGNOSE_H_
+#include <osl/diagnose.h>
+#endif
+
+#ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
+#include <toolkit/helper/vclunohelper.hxx>
+#endif
+
+#ifndef _SV_SVAPP_HXX
+#include <vcl/svapp.hxx>
+#endif
+
+#ifndef _SV_HELP_HXX
+#include <vcl/help.hxx>
+#endif
+
+#ifndef _COMPHELPER_GUARDING_HXX_
+#include <comphelper/guarding.hxx>
+#endif
+
+#ifndef INCLUDED_SVTOOLS_HELPOPT_HXX
+#include <svtools/helpopt.hxx>
+#endif
+
+#ifndef _SV_SVAPP_HXX
+#include <vcl/svapp.hxx>
+#endif
+//........................................................................
+namespace framework
+{
+//........................................................................
+
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::frame;
+ using namespace ::com::sun::star::util;
+ using namespace ::com::sun::star::beans;
+ using namespace ::com::sun::star::awt;
+ using namespace ::com::sun::star::lang;
+
+ //====================================================================
+ //= HelpAgentDispatcher
+ //====================================================================
+ //--------------------------------------------------------------------
+ HelpAgentDispatcher::HelpAgentDispatcher( const Reference< XFrame >& _rxParentFrame )
+ :ThreadHelpBase(&Application::GetSolarMutex())
+ ,m_pContainerWindow(NULL)
+ ,m_pAgentWindow(NULL)
+ ,m_xParentFrame(_rxParentFrame)
+ {
+ OSL_ENSURE(m_xParentFrame.is(), "HelpAgentDispatcher::HelpAgentDispatcher: invalid parent frame!");
+ }
+
+ //--------------------------------------------------------------------
+ HelpAgentDispatcher::~HelpAgentDispatcher()
+ {
+ osl_incrementInterlockedCount( &m_refCount );
+ // we may create new references to ourself below, so ensure the dtor is not called twice ....
+ closeAgentWindow();
+ }
+
+ //--------------------------------------------------------------------
+ sal_Bool HelpAgentDispatcher::ensureContainerWindow()
+ {
+ if (m_pContainerWindow)
+ return sal_True;
+
+ if (!m_xParentFrame.is())
+ {
+ OSL_ENSURE(sal_False, "HelpAgentDispatcher::ensureContainerWindow: have no explicit container window and no frame to obtain an implicit one!");
+ // error condition, already asserted in the ctor
+ return sal_False;
+ }
+
+ Reference< XWindow > xContainer = m_xParentFrame->getContainerWindow();
+ implConstruct(xContainer);
+
+ return (NULL != m_pContainerWindow);
+ }
+
+ //--------------------------------------------------------------------
+ void HelpAgentDispatcher::implConstruct( const Reference< XWindow >& _rxContainer )
+ {
+ OSL_ENSURE(!m_pContainerWindow, "HelpAgentDispatcher::implConstruct: not to be called twice!");
+ OSL_ENSURE(_rxContainer.is(), "HelpAgentDispatcher::implConstruct: invalid container window given!");
+
+ m_pContainerWindow = VCLUnoHelper::GetWindow(_rxContainer);
+ OSL_ENSURE(!_rxContainer.is() || (NULL != m_pContainerWindow), "HelpAgentDispatcher::implConstruct: could not get the implementation of the container!");
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL HelpAgentDispatcher::dispatch( const URL& _rURL, const Sequence< PropertyValue >& _rArgs ) throw (RuntimeException)
+ {
+ ResetableGuard aGuard(m_aLock);
+ switchURL(_rURL);
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL HelpAgentDispatcher::addStatusListener( const Reference< XStatusListener >& _rxListener, const URL& _rURL ) throw (RuntimeException)
+ {
+ // this is pretty simple: we accept _all_ URLs, and we accept them _always_. So simply notify the listener
+ // of the initial "available" state and then do nothing.
+ if (_rxListener.is())
+ {
+ FeatureStateEvent aEvent;
+ aEvent.FeatureURL = _rURL;
+ aEvent.IsEnabled = sal_True;
+ aEvent.Requery = sal_False;
+ _rxListener->statusChanged(aEvent);
+ }
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL HelpAgentDispatcher::removeStatusListener( const Reference< XStatusListener >& _rxListener, const URL& _rURL ) throw (RuntimeException)
+ {
+ // nothing to do. see addStatusListener
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL HelpAgentDispatcher::windowResized( const WindowEvent& _rSource ) throw (RuntimeException)
+ {
+ positionAgentWindow();
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL HelpAgentDispatcher::windowMoved( const WindowEvent& _rSource ) throw (RuntimeException)
+ {
+ // not interested in
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL HelpAgentDispatcher::windowShown( const EventObject& _rSource ) throw (RuntimeException)
+ {
+ // not interested in
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL HelpAgentDispatcher::windowHidden( const EventObject& _rSource ) throw (RuntimeException)
+ {
+ // not interested in
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL HelpAgentDispatcher::disposing( const EventObject& _rSource ) throw (RuntimeException)
+ {
+ // not interested in case the container window is closed (this should be handled by our owner)
+
+ // interested in case our agent window is closed (we're the only instance allowed to close it)
+ if (m_pAgentWindow)
+ {
+ Reference< XWindow > xSource(_rSource.Source, UNO_QUERY);
+ Reference< XWindow > xAgentWindow = VCLUnoHelper::GetInterface(m_pAgentWindow);
+ if (xSource.get() == xAgentWindow.get())
+ { // somebody closed my agent window, but it was not me
+ agentClosedExternally();
+ }
+ }
+ }
+
+ //--------------------------------------------------------------------
+ void HelpAgentDispatcher::agentClosedExternally()
+ {
+ ResetableGuard aGuard(m_aLock);
+ stopAutoCloseTimer();
+ m_pAgentWindow = NULL;
+ }
+
+ //--------------------------------------------------------------------
+ sal_Bool HelpAgentDispatcher::approveURLRequest(const URL& _rURL)
+ {
+ SvtHelpOptions aHelpOptions;
+ sal_Int32 nAllowedToIgnore = aHelpOptions.getAgentIgnoreURLCounter(_rURL.Complete);
+ return nAllowedToIgnore > 0;
+ }
+
+ //--------------------------------------------------------------------
+ void HelpAgentDispatcher::switchURL(const URL& _rURL)
+ {
+ if (!approveURLRequest(_rURL))
+ // silently drop the request
+ return;
+
+ // show our agent window
+ ensureAgentWindow();
+
+ // stop the expiration timer for the old URL
+ stopAutoCloseTimer();
+
+ // set the URL as tooltip text
+ m_sCurrentURL = _rURL.Complete;
+ m_pAgentWindow->SetQuickHelpText(m_sCurrentURL);
+
+ // start the expiration timer for the new URL
+ startAutoCloseTimer();
+ }
+
+ //--------------------------------------------------------------------
+ void HelpAgentDispatcher::stopAutoCloseTimer()
+ {
+ if (!m_xAutoCloseTimer.isValid())
+ return;
+
+ m_xAutoCloseTimer->stop();
+ }
+
+ //--------------------------------------------------------------------
+ void HelpAgentDispatcher::startAutoCloseTimer()
+ {
+ ::vos::TTimeValue aAutoCloseTimeout( SvtHelpOptions().GetHelpAgentTimeoutPeriod(), 0 );
+ if (!m_xAutoCloseTimer.isValid())
+ {
+
+ m_xAutoCloseTimer = new OTimerHelper(aAutoCloseTimeout);
+ m_xAutoCloseTimer->setListener(this);
+ }
+
+ m_xAutoCloseTimer->setRemainingTime(aAutoCloseTimeout);
+ m_xAutoCloseTimer->start();
+ }
+
+ //--------------------------------------------------------------------
+ void HelpAgentDispatcher::helpRequested()
+ {
+ ResetableGuard aGuard(m_aLock);
+
+ // FIRST stop the timer
+ stopAutoCloseTimer();
+
+ // reset the ignore counter for this URL
+ SvtHelpOptions().resetAgentIgnoreURLCounter(m_sCurrentURL);
+
+ Help* pApplicationHelp = Application::GetHelp();
+ OSL_ENSURE(pApplicationHelp, "HelpAgentDispatcher::helpRequested: no help system available!");
+ if (pApplicationHelp)
+ pApplicationHelp->Start( m_sCurrentURL, NULL );
+
+ aGuard.unlock();
+ closeAgentWindow();
+ }
+
+ //--------------------------------------------------------------------
+ void HelpAgentDispatcher::closeAgent()
+ {
+ closeAgentWindow();
+ }
+
+ //--------------------------------------------------------------------
+ void HelpAgentDispatcher::timerExpired()
+ {
+ // the hint has been ignored by the user
+ markURLIgnored(m_sCurrentURL);
+ // close the window
+ closeAgentWindow();
+ }
+
+ //--------------------------------------------------------------------
+ void HelpAgentDispatcher::markURLIgnored( const ::rtl::OUString& _rURL )
+ {
+ SvtHelpOptions().decAgentIgnoreURLCounter(_rURL);
+ }
+
+ //--------------------------------------------------------------------
+ void HelpAgentDispatcher::closeAgentWindow()
+ {
+ // now acquire the SolarMutex ...
+ ::vos::OGuard aSolarGuard(Application::GetSolarMutex());
+ // ... and our own mutex
+ ResetableGuard aGuard(m_aLock);
+
+ stopAutoCloseTimer();
+
+ if (!m_pAgentWindow)
+ return;
+
+ if (m_pContainerWindow)
+ {
+ Reference< XWindow > xContainer = VCLUnoHelper::GetInterface(m_pContainerWindow);
+ OSL_ENSURE(xContainer.is(), "HelpAgentDispatcher::closeAgentWindow: no UNO interface for the container window!");
+ if (xContainer.is())
+ xContainer->removeWindowListener(this);
+ }
+
+ if (m_pAgentWindow)
+ {
+ Reference< XWindow > xAgentWindow = VCLUnoHelper::GetInterface(m_pAgentWindow);
+ OSL_ENSURE(xAgentWindow.is(), "HelpAgentDispatcher::closeAgentWindow: no UNO interface for the agent window!");
+ if (xAgentWindow.is())
+ xAgentWindow->removeWindowListener(this);
+ }
+
+ delete m_pAgentWindow;
+ m_pAgentWindow = NULL;
+ }
+
+ //--------------------------------------------------------------------
+ void HelpAgentDispatcher::positionAgentWindow()
+ {
+ OSL_ENSURE(m_pContainerWindow, "HelpAgentDispatcher::positionAgentWindow: please use ensureContainerWindow!");
+ OSL_ENSURE(m_pAgentWindow, "HelpAgentDispatcher::positionAgentWindow: to be called with an existing agent window only!");
+ OSL_ENSURE(m_pAgentWindow->GetParent() == m_pContainerWindow, "HelpAgentDispatcher::positionAgentWindow: invalid window hierarchy!");
+
+ const Size aContainerSize = m_pContainerWindow->GetSizePixel();
+ const Size aAgentSize = m_pAgentWindow->getPreferredSizePixel();
+
+ const Point aAgentPos ( aContainerSize.Width() - aAgentSize.Width()
+ , aContainerSize.Height() - aAgentSize.Height() );
+
+ // TODO: use a surrogate if the container window is too small to contain the full-sized agent window
+
+ m_pAgentWindow->SetPosSizePixel(aAgentPos, aAgentSize);
+ }
+
+ //--------------------------------------------------------------------
+ sal_Bool HelpAgentDispatcher::ensureAgentWindow()
+ {
+ if (m_pAgentWindow)
+ return sal_True;
+
+ ::vos::OGuard aSolarGuard(Application::GetSolarMutex());
+ if (!ensureContainerWindow())
+ return sal_False;
+
+ // create it
+ m_pAgentWindow = new ::svt::HelpAgentWindow(m_pContainerWindow);
+ m_pAgentWindow->setCallback(this);
+
+ // add as listener at the agent window in case it is closed by the user (and not by us ourself)
+ Reference< XWindow > xAgentWindow = VCLUnoHelper::GetInterface(m_pAgentWindow);
+ OSL_ENSURE(xAgentWindow.is(), "HelpAgentDispatcher::ensureAgentWindow: no UNO interface for the agent window!");
+ if (xAgentWindow.is())
+ xAgentWindow->addWindowListener(this);
+
+ // add as window listener to the container window so we can maintain the property position of the agent window
+ Reference< XWindow > xContainer = VCLUnoHelper::GetInterface(m_pContainerWindow);
+ OSL_ENSURE(xContainer.is(), "HelpAgentDispatcher::ensureAgentWindow: no container window interface!");
+ if (xContainer.is())
+ xContainer->addWindowListener(this);
+
+ // position it
+ positionAgentWindow();
+
+ // show it
+ if (m_pContainerWindow->IsVisible())
+ m_pAgentWindow->Show();
+
+ return sal_True;
+ }
+
+//........................................................................
+} // namespace framework
+//........................................................................
+
+/*************************************************************************
+ * history:
+ * $Log: not supported by cvs2svn $
+ * Revision 1.3 2001/06/11 10:27:57 as
+ * #85529# use new lock mechanism
+ *
+ * Revision 1.2 2001/05/07 15:07:20 fs
+ * moved the HelpAgentWindow implementation to SVTOOLS (prevent creating a new resource file here)
+ *
+ * Revision 1.1 2001/05/07 13:42:24 fs
+ * initial checkin - help agent dispatcher
+ *
+ *
+ * Revision 1.0 03.05.01 11:28:01 fs
+ ************************************************************************/
+
diff --git a/framework/source/dispatch/interceptionhelper.cxx b/framework/source/dispatch/interceptionhelper.cxx
new file mode 100644
index 000000000000..748ecfe8776e
--- /dev/null
+++ b/framework/source/dispatch/interceptionhelper.cxx
@@ -0,0 +1,504 @@
+/*************************************************************************
+ *
+ * $RCSfile: interceptionhelper.cxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: as $ $Date: 2001-07-02 13:24:41 $
+ *
+ * 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_DISPATCH_INTERCEPTIONHELPER_HXX_
+#include <dispatch/interceptionhelper.hxx>
+#endif
+
+#ifndef __FRAMEWORK_CLASSES_WILDCARD_HXX_
+#include <classes/wildcard.hxx>
+#endif
+
+//_________________________________________________________________________________________________________________
+// interface includes
+//_________________________________________________________________________________________________________________
+
+#ifndef _COM_SUN_STAR_FRAME_XINTERCEPTORINFO_HPP_
+#include <com/sun/star/frame/XInterceptorInfo.hpp>
+#endif
+
+//_________________________________________________________________________________________________________________
+// includes of other projects
+//_________________________________________________________________________________________________________________
+
+#ifndef _SV_SVAPP_HXX
+#include <vcl/svapp.hxx>
+#endif
+
+//_________________________________________________________________________________________________________________
+// namespace
+//_________________________________________________________________________________________________________________
+
+namespace framework{
+
+using namespace ::com::sun::star::frame ;
+using namespace ::com::sun::star::lang ;
+using namespace ::com::sun::star::uno ;
+using namespace ::com::sun::star::util ;
+using namespace ::cppu ;
+using namespace ::osl ;
+using namespace ::rtl ;
+using namespace ::std ;
+
+//_________________________________________________________________________________________________________________
+// non exported const
+//_________________________________________________________________________________________________________________
+
+//_________________________________________________________________________________________________________________
+// non exported definitions
+//_________________________________________________________________________________________________________________
+
+//_________________________________________________________________________________________________________________
+// declarations
+//_________________________________________________________________________________________________________________
+
+//*****************************************************************************************************************
+// constructor
+//*****************************************************************************************************************
+InterceptionHelper::InterceptionHelper( const Reference< XFrame >& rFrame ,
+ const Reference< XDispatchProvider >& xSlaveDispatcher )
+ // Init baseclasses first
+ : ThreadHelpBase ( &Application::GetSolarMutex() )
+ , OWeakObject ( )
+ // Init member
+ , m_xSlaveDispatcher ( xSlaveDispatcher )
+ , m_xOwnerWeak ( rFrame )
+{
+ // Safe impossible cases
+ // Method is not defined for ALL incoming parameters!
+ LOG_ASSERT( impldbg_checkParameter_InterceptionHelper( xSlaveDispatcher ), "InterceptionHelper::InterceptionHelper()\nInvalid parameter detected!\n" )
+}
+
+//*****************************************************************************************************************
+// (proteced!) destructor
+//*****************************************************************************************************************
+InterceptionHelper::~InterceptionHelper()
+{
+}
+
+//*****************************************************************************************************************
+// XInterface
+//*****************************************************************************************************************
+DEFINE_XINTERFACE_3 ( InterceptionHelper ,
+ OWeakObject ,
+ DIRECT_INTERFACE(XDispatchProvider ),
+ DIRECT_INTERFACE(XDispatchProviderInterception ),
+ DIRECT_INTERFACE(XEventListener )
+ )
+
+//*****************************************************************************************************************
+// XDispatchProvider
+//*****************************************************************************************************************
+Reference< XDispatch > SAL_CALL InterceptionHelper::queryDispatch( const URL& aURL ,
+ const OUString& sTargetFrameName,
+ sal_Int32 nSearchFlags ) throw( RuntimeException )
+{
+ // Ready for multithreading
+ ResetableGuard aGuard( m_aLock );
+ // Safe impossible cases
+ // Method not defined for all incoming parameter.
+ LOG_ASSERT( impldbg_checkParameter_queryDispatch( aURL, sTargetFrameName, nSearchFlags ), "InterceptionHelper::queryDispatch()\nInvalid parameter detected.\n" )
+
+ // Set default return value.
+ Reference< XDispatch > xReturn;
+
+ // For better performance:
+ // Search interceptor which has registered himself with a pattern which match given URL!
+ Reference< XDispatchProvider > xInterceptor( impl_searchMatchingInterceptor( aURL.Complete ), UNO_QUERY );
+ if( xInterceptor.is() == sal_True )
+ {
+ // If so an interceptor exist forward dispatch to it.
+ xReturn = xInterceptor->queryDispatch( aURL, sTargetFrameName, nSearchFlags );
+ }
+ else
+ {
+ // Otherwise; use ouer own dispatch helper to do this and set results for return.
+ xReturn = m_xSlaveDispatcher->queryDispatch( aURL, sTargetFrameName, nSearchFlags );
+ }
+
+ // Return results of this operation.
+ return xReturn;
+}
+
+//*****************************************************************************************************************
+// XDispatchProvider
+//*****************************************************************************************************************
+Sequence< Reference< XDispatch > > SAL_CALL InterceptionHelper::queryDispatches( const Sequence< DispatchDescriptor >& seqDescriptor ) throw( RuntimeException )
+{
+ // Ready for multithreading
+ ResetableGuard aGuard( m_aLock );
+ // Safe impossible cases
+ // Method not defined for all incoming parameter.
+ LOG_ASSERT( impldbg_checkParameter_queryDispatches( seqDescriptor ), "InterceptionHelper::queryDispatches()\nInvalid parameter detected.\n" )
+
+ // Set default return value.
+ Sequence< Reference< XDispatch > > seqReturn;
+
+ /*ATTENTION
+
+ Don't use our performance mechanism to search registered interceptors for given URLs!
+ What will you do - call different interceptor objects for different URLs ...
+ ... we implement these mechanism to save (remote) calls to an interceptor ...
+ */
+
+ // If any interceptor exist ...
+ if( m_aInterceptorList.empty() == sal_False )
+ {
+ // ... forward query to these instance and set results for return.
+ Reference< XDispatchProvider> xInterceptor( m_aInterceptorList.begin()->xInterceptor, UNO_QUERY );
+ seqReturn = xInterceptor->queryDispatches( seqDescriptor );
+ }
+ else
+ {
+ // No; Then use ouer own dispatchhelper to do this and set results for return.
+ seqReturn = m_xSlaveDispatcher->queryDispatches( seqDescriptor );
+ }
+
+ // Return results of this operation.
+ return seqReturn;
+}
+
+//*****************************************************************************************************************
+// XDispatchProviderInterception
+//*****************************************************************************************************************
+void SAL_CALL InterceptionHelper::registerDispatchProviderInterceptor( const Reference< XDispatchProviderInterceptor >& xInterceptor ) throw( RuntimeException )
+{
+ // Ready for multithreading
+ ResetableGuard aGuard( m_aLock );
+ // Safe impossible cases
+ // Method not defined for all incoming parameter.
+ LOG_ASSERT( impldbg_checkParameter_registerDispatchProviderInterceptor( xInterceptor ), "InterceptionHelper::registerDispatchProviderInterceptor()\nInvalid parameter detected.\n" )
+
+ // Fill a new info structure for new interceptor.
+ // Save his reference and try to get an additional URL/pattern list from him.
+ // If no list exist register these interceptor for all dispatch events with "*"!
+ IMPL_TInterceptorInfo aInfo;
+ aInfo.xInterceptor = xInterceptor;
+ Reference< XInterceptorInfo > xInfoInterface( xInterceptor, UNO_QUERY );
+ if( xInfoInterface.is() == sal_True )
+ {
+ aInfo.seqPatternList = xInfoInterface->getInterceptedURLs();
+ }
+ else
+ {
+ aInfo.seqPatternList.realloc(1);
+ aInfo.seqPatternList[0] = DECLARE_ASCII("*");
+ }
+
+ // Add new interceptor to front of list and initialize master/slave relations with old top one.
+ // If anyone already exist!
+ if( m_aInterceptorList.size() < 1 )
+ {
+ // a) No interceptor exist before.
+ // Take it as the first one and pass our own dispatch helper as his slave.
+ // (For economical code writing - we add info structure at later time! Otherwise we must duplicate these code for every IF/ELSE branch!)
+ aInfo.xInterceptor->setSlaveDispatchProvider( m_xSlaveDispatcher );
+ }
+ else
+ {
+ // b) There is already an interceptor; current will be the slave of the new one.
+ // Insert it on the top of list.
+ // (For economical code writing - we add info structure at later time! Otherwise we must duplicate these code for every IF/ELSE branch!)
+ Reference< XDispatchProviderInterceptor > xOldTopInterceptor = m_aInterceptorList.begin()->xInterceptor;
+ aInfo.xInterceptor->setSlaveDispatchProvider ( Reference< XDispatchProvider >( xOldTopInterceptor, UNO_QUERY ) );
+ xOldTopInterceptor->setMasterDispatchProvider ( Reference< XDispatchProvider >( aInfo.xInterceptor, UNO_QUERY ) );
+ }
+
+ // The new interceptor must be a slave of us too!
+ aInfo.xInterceptor->setMasterDispatchProvider( this );
+ // Now we can add our info structure to the list.
+ m_aInterceptorList.push_front( aInfo );
+
+ Reference < XFrame > xOwner( m_xOwnerWeak.get(), UNO_QUERY );
+ if ( xOwner.is() )
+ xOwner->contextChanged();
+}
+
+//*****************************************************************************************************************
+// XDispatchProviderInterception
+//*****************************************************************************************************************
+void SAL_CALL InterceptionHelper::releaseDispatchProviderInterceptor( const Reference< XDispatchProviderInterceptor >& xInterceptor ) throw( RuntimeException )
+{
+ // Ready for multithreading
+ ResetableGuard aGuard( m_aLock );
+ // Safe impossible cases
+ // Method not defined for all incoming parameter.
+ LOG_ASSERT( impldbg_checkParameter_releaseDispatchProviderInterceptor( xInterceptor ), "InterceptionHelper::releaseDispatchProviderInterceptor()\nInvalid parameter detected.\n" )
+
+ // Search for existing interceptor in list.
+ IMPL_CInterceptorList::iterator aItem = m_aInterceptorList.find( xInterceptor );
+ // Safe impossible cases
+ // We can't remove an interceptor, which we don't know ...
+ LOG_ASSERT( !(aItem==m_aInterceptorList.end()), "InterceptionHelper::releaseDispatchProviderInterceptor()\nCan't remove interceptor which I don't know!\n")
+ if( aItem != m_aInterceptorList.end() )
+ {
+ // Rebuild master/slave relations of interceptor list.
+ // Get slave and master of given interceptor.
+ Reference< XDispatchProvider > xSlave ( xInterceptor->getSlaveDispatchProvider() , UNO_QUERY );
+ Reference< XDispatchProviderInterceptor > xSlaveInterceptor ( xSlave , UNO_QUERY );
+ Reference< XDispatchProvider > xMaster ( xInterceptor->getMasterDispatchProvider() , UNO_QUERY );
+ Reference< XDispatchProviderInterceptor > xMasterInterceptor ( xMaster , UNO_QUERY );
+ // Safe impossible cases.
+ // A master must exist - but it must not an interceptor!
+ // => We set us as a master of highest registered interecptor; but we don't implement the interceptor interface!
+ // The same must valid for slaves.
+ // => We set our dispatch helper as slave of lowest registered interceptor - but they don't implement the interceptor interface!
+ // ( see register function for further informations! )
+ LOG_ASSERT( !(xMaster.is()==sal_False || xSlave.is()==sal_False), "InterceptionHelper::releaseDispatchProviderInterceptor()\nCan't find a master or slave of registered interceptor. Taht could'nt be!\n" )
+ // Reconnect slave relation.
+ if( xMasterInterceptor.is() == sal_True )
+ {
+ xMasterInterceptor->setSlaveDispatchProvider( xSlave );
+ }
+ // Reconnect master relation.
+ if( xSlaveInterceptor.is() == sal_True )
+ {
+ xSlaveInterceptor->setMasterDispatchProvider( xMaster );
+ }
+ // Unchain the interceptor that has to be removed.
+ xInterceptor->setSlaveDispatchProvider ( Reference< XDispatchProvider >() );
+ xInterceptor->setMasterDispatchProvider ( Reference< XDispatchProvider >() );
+ // Remove interceptor from our list.
+ m_aInterceptorList.erase( aItem );
+ }
+
+ Reference < XFrame > xOwner( m_xOwnerWeak.get(), UNO_QUERY );
+ if ( xOwner.is() )
+ xOwner->contextChanged();
+}
+
+//*****************************************************************************************************************
+// XDispatchProviderInterception
+//*****************************************************************************************************************
+Reference< XDispatchProviderInterceptor > InterceptionHelper::impl_searchMatchingInterceptor( const OUString& sURL )
+{
+ // Step over all items and return interceptor, which URL list match given one at first.
+ sal_Int32 nInterceptorCount = (sal_Int32)(m_aInterceptorList.size());
+ for( sal_Int32 nInterceptor=0; nInterceptor<nInterceptorCount; ++nInterceptor )
+ {
+ // Use reference to list for faster access! (Don't use index operator for every element.)
+ // Don't check index - we know what we do ...
+ const Sequence< OUString >& seqPatternList = m_aInterceptorList[nInterceptor].seqPatternList;
+ sal_Int32 nPatternCount = seqPatternList.getLength();
+ for( sal_Int32 nPattern=0; nPattern<nPatternCount; ++nPattern )
+ {
+ // Try to match given URL with current pattern.
+ // If it match true we have found an interceptor and can return it.
+ // ( For better performance we return immediately! )
+ if( Wildcard::match( sURL, seqPatternList[nPattern] ) == sal_True )
+ {
+ return m_aInterceptorList[nInterceptor].xInterceptor;
+ }
+ }
+ }
+ // Return with an empty result of operation!
+ // No pattern and no interceptor was found.
+ return Reference< XDispatchProviderInterceptor >();
+}
+
+//*****************************************************************************************************************
+// XEventListener
+//*****************************************************************************************************************
+void SAL_CALL InterceptionHelper::disposing( const EventObject& Source ) throw ( RuntimeException )
+{
+ Reference< XEventListener >( m_xSlaveDispatcher, UNO_QUERY )->disposing( Source );
+ m_xSlaveDispatcher = 0;
+}
+
+//_________________________________________________________________________________________________________________
+// debug methods
+//_________________________________________________________________________________________________________________
+
+/*-----------------------------------------------------------------------------------------------------------------
+ The follow methods checks the parameter for other functions. If a parameter or his value is non valid,
+ we return "sal_False". (else sal_True) This mechanism is used to throw an ASSERT!
+
+ ATTENTION
+
+ If you miss a test for one of this parameters, contact the autor or add it himself !(?)
+ But ... look for right testing! See using of this methods!
+-----------------------------------------------------------------------------------------------------------------*/
+
+#ifdef ENABLE_ASSERTIONS
+
+//*****************************************************************************************************************
+// An instance of this class can only work with valid initialization.
+sal_Bool InterceptionHelper::impldbg_checkParameter_InterceptionHelper( const Reference< XDispatchProvider >& xSlaveDispatcher )
+{
+ // Set default return value.
+ sal_Bool bOK = sal_True;
+ // Check parameter.
+ if (
+ ( &xSlaveDispatcher == NULL ) ||
+ ( xSlaveDispatcher.is() == sal_False )
+ )
+ {
+ bOK = sal_False ;
+ }
+ // Return result of check.
+ return bOK ;
+}
+
+//*****************************************************************************************************************
+// We accept non zero URLs only. Target name can be empty!
+// And we can't test search flags in all combinations ...
+sal_Bool InterceptionHelper::impldbg_checkParameter_queryDispatch( const URL& aURL ,
+ const OUString& sTargetFrameName,
+ sal_Int32 nSearchFlags )
+{
+ // Set default return value.
+ sal_Bool bOK = sal_True;
+ // Check parameter.
+ if (
+ ( &aURL == NULL ) ||
+ ( &sTargetFrameName == NULL ) ||
+ ( aURL.Complete.getLength() < 1 )
+ )
+ {
+ bOK = sal_False ;
+ }
+ // Return result of check.
+ return bOK ;
+}
+
+//*****************************************************************************************************************
+// We check the same like queryDispatch() before but for a list of description items.
+sal_Bool InterceptionHelper::impldbg_checkParameter_queryDispatches( const Sequence< DispatchDescriptor >& seqDescriptor )
+{
+ // Set default return value.
+ sal_Bool bOK = sal_True;
+ // Check parameter.
+ if( &seqDescriptor == NULL )
+ {
+ bOK = sal_False;
+ }
+ else
+ {
+ sal_Int32 nCount = seqDescriptor.getLength();
+ if( nCount < 1 )
+ {
+ bOK = sal_False;
+ }
+ else
+ {
+ for( sal_Int32 nPosition=0; nPosition<nCount; ++nPosition )
+ {
+ if ( impldbg_checkParameter_queryDispatch ( seqDescriptor[nPosition].FeatureURL ,
+ seqDescriptor[nPosition].FrameName ,
+ seqDescriptor[nPosition].SearchFlags
+ ) == sal_False
+ )
+ {
+ bOK = sal_False;
+ break;
+ }
+ }
+ }
+ }
+ // Return result of check.
+ return bOK ;
+}
+
+//*****************************************************************************************************************
+// A valid interceptor must given and he must support the XDispatchProvider interface too!
+sal_Bool InterceptionHelper::impldbg_checkParameter_registerDispatchProviderInterceptor( const Reference< XDispatchProviderInterceptor >& xInterceptor )
+{
+ // Set default return value.
+ sal_Bool bOK = sal_True;
+ // Check parameter.
+ if (
+ ( &xInterceptor == NULL ) ||
+ ( xInterceptor.is() == sal_False ) ||
+ ( Reference< XDispatchProvider >( xInterceptor, UNO_QUERY ).is() == sal_False )
+ )
+ {
+ bOK = sal_False ;
+ }
+ // Return result of check.
+ return bOK ;
+}
+
+//*****************************************************************************************************************
+// A valid interceptor must given and he must support the XDispatchProvider interface too!
+sal_Bool InterceptionHelper::impldbg_checkParameter_releaseDispatchProviderInterceptor( const Reference< XDispatchProviderInterceptor >& xInterceptor )
+{
+ // Set default return value.
+ sal_Bool bOK = sal_True;
+ // Check parameter.
+ if (
+ ( &xInterceptor == NULL ) ||
+ ( xInterceptor.is() == sal_False ) ||
+ ( Reference< XDispatchProvider >( xInterceptor, UNO_QUERY ).is() == sal_False )
+ )
+ {
+ bOK = sal_False ;
+ }
+ // Return result of check.
+ return bOK ;
+}
+
+#endif // #ifdef ENABLE_ASSERTIONS
+
+} // namespace framework
diff --git a/framework/source/dispatch/mailtodispatcher.cxx b/framework/source/dispatch/mailtodispatcher.cxx
new file mode 100644
index 000000000000..147d28441ca8
--- /dev/null
+++ b/framework/source/dispatch/mailtodispatcher.cxx
@@ -0,0 +1,479 @@
+/*************************************************************************
+ *
+ * $RCSfile: mailtodispatcher.cxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: as $ $Date: 2001-07-02 13:26:39 $
+ *
+ * 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_DISPATCH_MAILTODISPATCHER_HXX_
+#include <dispatch/mailtodispatcher.hxx>
+#endif
+
+#ifndef __FRAMEWORK_CLASSES_ARGUMENTANALYZER_HXX_
+#include <classes/argumentanalyzer.hxx>
+#endif
+
+#ifndef __FRAMEWORK_GENERAL_H_
+#include <general.h>
+#endif
+
+//_________________________________________________________________________________________________________________
+// interface includes
+//_________________________________________________________________________________________________________________
+
+#ifndef _COM_SUN_STAR_FRAME_FRAMESEARCHFLAG_HPP_
+#include <com/sun/star/frame/FrameSearchFlag.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_AWT_XTOOLKIT_HPP_
+#include <com/sun/star/awt/XToolkit.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_AWT_WINDOWATTRIBUTE_HPP_
+#include <com/sun/star/awt/WindowAttribute.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_AWT_WINDOWDESCRIPTOR_HPP_
+#include <com/sun/star/awt/WindowDescriptor.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_AWT_POSSIZE_HPP_
+#include <com/sun/star/awt/PosSize.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_AWT_XWINDOWPEER_HPP_
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_MOZILLA_XPLUGININSTANCE_HPP_
+#include <com/sun/star/mozilla/XPluginInstance.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_BEANS_UNKNOWNPROPERTYEXCEPTION_HPP_
+#include <com/sun/star/beans/UnknownPropertyException.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_LANG_WRAPPEDTARGETEXCEPTION_HPP_
+#include <com/sun/star/lang/WrappedTargetException.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
+#include <com/sun/star/beans/XPropertySet.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XTASKSSUPPLIER_HPP_
+#include <com/sun/star/frame/XTasksSupplier.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_CONTAINER_XENUMERATION_HPP_
+#include <com/sun/star/container/XEnumeration.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_SYSTEM_XSIMPLEMAILCLIENTSUPPLIER_HPP_
+#include <com/sun/star/system/XSimpleMailClientSupplier.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_SYSTEM_SIMPLEMAILCLIENTFLAGS_HPP_
+#include <com/sun/star/system/SimpleMailClientFlags.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_SYSTEM_XSYSTEMSHELLEXECUTE_HPP_
+#include <com/sun/star/system/XSystemShellExecute.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_SYSTEM_SYSTEMSHELLEXECUTEFLAGS_HPP_
+#include <com/sun/star/system/SystemShellExecuteFlags.hpp>
+#endif
+
+//_________________________________________________________________________________________________________________
+// includes of other projects
+//_________________________________________________________________________________________________________________
+
+#include <vos/mutex.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <ucbhelper/content.hxx>
+#include <vcl/svapp.hxx>
+
+#ifndef _URLOBJ_HXX
+#include <tools/urlobj.hxx>
+#endif
+
+//_________________________________________________________________________________________________________________
+// namespace
+//_________________________________________________________________________________________________________________
+
+namespace framework{
+
+using namespace ::com::sun::star::awt ;
+using namespace ::com::sun::star::beans ;
+using namespace ::com::sun::star::container ;
+using namespace ::com::sun::star::frame ;
+using namespace ::com::sun::star::lang ;
+using namespace ::com::sun::star::mozilla ;
+using namespace ::com::sun::star::uno ;
+using namespace ::com::sun::star::util ;
+using namespace ::cppu ;
+using namespace ::osl ;
+using namespace ::rtl ;
+using namespace ::vos ;
+
+//_________________________________________________________________________________________________________________
+// non exported const
+//_________________________________________________________________________________________________________________
+
+#define MAILTO "mailto:"
+
+//_________________________________________________________________________________________________________________
+// non exported definitions
+//_________________________________________________________________________________________________________________
+
+//_________________________________________________________________________________________________________________
+// declarations
+//_________________________________________________________________________________________________________________
+
+//*****************************************************************************************************************
+// constructor
+//*****************************************************************************************************************
+MailToDispatcher::MailToDispatcher( const Reference< XMultiServiceFactory >& xFactory ,
+ const Reference< XFrame >& xOwner )
+ // Init baseclasses first
+ : ThreadHelpBase ( &Application::GetSolarMutex() )
+ , OWeakObject ( )
+ // Init member
+ , m_xOwnerWeak ( xOwner )
+ , m_xFactory ( xFactory )
+ , m_aListenerContainer ( m_aLock.getShareableOslMutex() )
+ , m_bAlreadyDisposed ( sal_False )
+{
+ // Safe impossible cases
+ // We need valid informations about ouer ownerfor work.
+ LOG_ASSERT( impldbg_checkParameter_MailToDispatcher( xFactory, xOwner ), "MailToDispatcher::MailToDispatcher()\nInvalid parameter detected!\n" )
+}
+
+//*****************************************************************************************************************
+// destructor
+//*****************************************************************************************************************
+MailToDispatcher::~MailToDispatcher()
+{
+ // Warn programmer if he forgot to dispose this instance.
+ // We must release all our references ...
+ // and a dtor isn't the best place to do that!
+}
+
+//*****************************************************************************************************************
+// XInterface, XTypeProvider
+//*****************************************************************************************************************
+DEFINE_XINTERFACE_3 ( MailToDispatcher ,
+ OWeakObject ,
+ DIRECT_INTERFACE( XTypeProvider ),
+ DIRECT_INTERFACE( XDispatch ),
+ DIRECT_INTERFACE( XEventListener )
+ )
+
+DEFINE_XTYPEPROVIDER_3 ( MailToDispatcher ,
+ XTypeProvider ,
+ XDispatch ,
+ XEventListener
+ )
+
+
+//*****************************************************************************************************************
+// XDispatch
+//*****************************************************************************************************************
+void SAL_CALL MailToDispatcher::dispatch( const URL& aURL ,
+ const Sequence< PropertyValue >& seqProperties ) throw( RuntimeException )
+{
+ // Ready for multithreading
+ ResetableGuard aGuard( m_aLock );
+ // Safe impossible cases
+ // Method not defined for all incoming parameter
+ LOG_ASSERT( impldbg_checkParameter_dispatch( aURL, seqProperties ), "MailToDispatcher::dispatch()\nInvalid parameter detected.\n" )
+
+ Reference< XFrame > xFrame( m_xOwnerWeak.get(), UNO_QUERY );
+ LOG_ASSERT( !(xFrame.is()==sal_False), "MailToDispatcher::dispatch()\nDispatch failed ... can't get reference to owner!\n" )
+ if( xFrame.is() == sal_True )
+ {
+ // mailto URL
+ OUString aURLProtocol( aURL.Protocol );
+ if ( aURLProtocol.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MAILTO )) )
+ {
+ Reference< ::com::sun::star::system::XSystemShellExecute > xSystemShellExecute(
+ m_xFactory->createInstance(
+ ::rtl::OUString::createFromAscii( "com.sun.star.system.SystemShellExecute" )), UNO_QUERY );
+ if ( xSystemShellExecute.is() )
+ {
+ try
+ {
+ // start mail client
+ ::rtl::OUString aURLString( aURL.Complete );
+ xSystemShellExecute->execute( aURLString, ::rtl::OUString(), ::com::sun::star::system::SystemShellExecuteFlags::DEFAULTS );
+ }
+ catch ( ::com::sun::star::lang::IllegalArgumentException& )
+ {
+ }
+ catch ( ::com::sun::star::system::SystemShellExecuteException& )
+ {
+ }
+ }
+ }
+ }
+}
+
+//*****************************************************************************************************************
+// XDispatch
+//*****************************************************************************************************************
+void SAL_CALL MailToDispatcher::addStatusListener( const Reference< XStatusListener >& xControl,
+ const URL& aURL ) throw( RuntimeException )
+{
+ // Ready for multithreading
+ ResetableGuard aGuard( m_aLock );
+ // Safe impossible cases
+ // Method not defined for all incoming parameter
+ LOG_ASSERT( impldbg_checkParameter_addStatusListener( xControl, aURL ), "OMenuDispatcher::addStatusListener()\nInvalid parameter detected.\n" )
+ // Add listener to container.
+ m_aListenerContainer.addInterface( aURL.Complete, xControl );
+}
+
+//*****************************************************************************************************************
+// XDispatch
+//*****************************************************************************************************************
+void SAL_CALL MailToDispatcher::removeStatusListener( const Reference< XStatusListener >& xControl,
+ const URL& aURL ) throw( RuntimeException )
+{
+ // Ready for multithreading
+ ResetableGuard aGuard( m_aLock );
+ // Safe impossible cases
+ // Method not defined for all incoming parameter
+ LOG_ASSERT( impldbg_checkParameter_removeStatusListener( xControl, aURL ), "OMenuDispatcher::removeStatusListener()\nInvalid parameter detected.\n" )
+ // Add listener to container.
+ m_aListenerContainer.removeInterface( aURL.Complete, xControl );
+}
+
+
+//*****************************************************************************************************************
+// XEventListener
+//*****************************************************************************************************************
+void SAL_CALL MailToDispatcher::disposing( const EventObject& aEvent ) throw( RuntimeException )
+{
+ // Ready for multithreading
+ ResetableGuard aGuard( m_aLock );
+ // Safe impossible cases
+ LOG_ASSERT( !(m_bAlreadyDisposed==sal_True), "MailToDispatcher::disposing()\nObject already disposed .. don't call it again!\n" )
+
+ if( m_bAlreadyDisposed == sal_False )
+ {
+ m_bAlreadyDisposed = sal_True;
+
+ // Forget mail client supplier
+ m_xSimpleMailClientSupplier = 0;
+
+ // Forget our factory.
+ m_xFactory = Reference< XMultiServiceFactory >();
+ }
+}
+
+//*****************************************************************************************************************
+// private method
+//*****************************************************************************************************************
+void MailToDispatcher::impl_sendStatusEvent( const Reference< XFrame >& xEventSource ,
+ const OUString& sURL ,
+ sal_Bool bLoadState )
+{
+ // Get listener for given URL!
+ OInterfaceContainerHelper* pListenerForURL = m_aListenerContainer.getContainer( sURL );
+ // Send messages to all listener.
+ // Do nothing, if there no listener or "getContainer()" works not correct!
+ if( pListenerForURL != NULL )
+ {
+ // Build event for send to listener.
+ FeatureStateEvent aEvent;
+ aEvent.FeatureURL.Complete = sURL ;
+ aEvent.FeatureDescriptor = FEATUREDESCRIPTOR_LOADSTATE ;
+ aEvent.IsEnabled = bLoadState ;
+ aEvent.Requery = sal_False ;
+ aEvent.State <<= xEventSource ;
+
+ // Send message to all listener on this URL.
+ OInterfaceIteratorHelper aIterator(*pListenerForURL);
+ while( aIterator.hasMoreElements() )
+ {
+ ((XStatusListener*)aIterator.next())->statusChanged( aEvent );
+ }
+ }
+}
+
+
+void MailToDispatcher::impl_getSequenceFromStringList( css::uno::Sequence< ::rtl::OUString >& aStringSeq, const ::rtl::OUString& aStringList )
+{
+ sal_Int32 nParamIndex = 0;
+ sal_Int32 nPos = 0;
+ do
+ {
+ OUString aName = aStringList.getToken( 0, ',', nParamIndex );
+ aStringSeq.realloc( aStringSeq.getLength() + 1 );
+ aName = INetURLObject::decode( aName, '%', INetURLObject::DECODE_WITH_CHARSET, RTL_TEXTENCODING_UTF8);
+ aStringSeq[nPos++] = aName;
+ }
+ while ( nParamIndex >= 0 );
+}
+
+
+//_________________________________________________________________________________________________________________
+// debug methods
+//_________________________________________________________________________________________________________________
+
+/*-----------------------------------------------------------------------------------------------------------------
+ The follow methods checks the parameter for other functions. If a parameter or his value is non valid,
+ we return "sal_False". (else sal_True) This mechanism is used to throw an ASSERT!
+
+ ATTENTION
+
+ If you miss a test for one of this parameters, contact the autor or add it himself !(?)
+ But ... look for right testing! See using of this methods!
+-----------------------------------------------------------------------------------------------------------------*/
+
+#ifdef ENABLE_ASSERTIONS
+
+//*****************************************************************************************************************
+sal_Bool MailToDispatcher::impldbg_checkParameter_MailToDispatcher( const Reference< XMultiServiceFactory >& xFactory ,
+ const Reference< XFrame >& xOwner )
+{
+ // Set default return value.
+ sal_Bool bOK = sal_True;
+ // Check parameter.
+ if (
+ ( &xFactory == NULL ) ||
+ ( &xOwner == NULL ) ||
+ ( xFactory.is() == sal_False ) ||
+ ( xOwner.is() == sal_False )
+ )
+ {
+ bOK = sal_False ;
+ }
+ // Return result of check.
+ return bOK ;
+}
+
+//*****************************************************************************************************************
+// We don't know anything about right values of aURL and seqArguments!
+// Check valid references only.
+sal_Bool MailToDispatcher::impldbg_checkParameter_dispatch( const URL& aURL ,
+ const Sequence< PropertyValue >& seqArguments)
+{
+ // Set default return value.
+ sal_Bool bOK = sal_True;
+ // Check parameter.
+ if (
+ ( &aURL == NULL ) ||
+ ( &seqArguments == NULL )
+ )
+ {
+ bOK = sal_False ;
+ }
+ // Return result of check.
+ return bOK ;
+}
+
+//*****************************************************************************************************************
+// We need a valid URL. What is meaning with "register for nothing"?!
+// xControl must correct to - nobody can advised otherwise!
+sal_Bool MailToDispatcher::impldbg_checkParameter_addStatusListener( const Reference< XStatusListener >& xControl,
+ const URL& aURL )
+{
+ // Set default return value.
+ sal_Bool bOK = sal_True;
+ // Check parameter.
+ if (
+ ( &xControl == NULL ) ||
+ ( &aURL == NULL ) ||
+ ( aURL.Complete.getLength() < 1 )
+ )
+ {
+ bOK = sal_False ;
+ }
+ // Return result of check.
+ return bOK ;
+}
+
+//*****************************************************************************************************************
+// The same goes for these case! We have added valid listener for correct URL only.
+// We can't remove invalid listener for nothing!
+sal_Bool MailToDispatcher::impldbg_checkParameter_removeStatusListener( const Reference< XStatusListener >& xControl,
+ const URL& aURL )
+{
+ // Set default return value.
+ sal_Bool bOK = sal_True;
+ // Check parameter.
+ if (
+ ( &xControl == NULL ) ||
+ ( &aURL == NULL ) ||
+ ( aURL.Complete.getLength() < 1 )
+ )
+ {
+ bOK = sal_False ;
+ }
+ // Return result of check.
+ return bOK ;
+}
+
+#endif // #ifdef ENABLE_ASSERTIONS
+
+} // namespace framework
diff --git a/framework/source/dispatch/menudispatcher.cxx b/framework/source/dispatch/menudispatcher.cxx
new file mode 100644
index 000000000000..a9c54cf00621
--- /dev/null
+++ b/framework/source/dispatch/menudispatcher.cxx
@@ -0,0 +1,670 @@
+/*************************************************************************
+ *
+ * $RCSfile: menudispatcher.cxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: as $ $Date: 2001-07-02 13:26:10 $
+ *
+ * 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_DISPATCH_MENUDISPATCHER_HXX_
+#include <dispatch/menudispatcher.hxx>
+#endif
+
+#ifndef __FRAMEWORK_CLASSES_ARGUMENTANALYZER_HXX_
+#include <classes/argumentanalyzer.hxx>
+#endif
+
+#ifndef __FRAMEWORK_GENERAL_H_
+#include <general.h>
+#endif
+
+#ifndef __FRAMEWORK_CLASSES_MENUCONFIGURATION_HXX_
+#include <classes/menuconfiguration.hxx>
+#endif
+
+//_________________________________________________________________________________________________________________
+// interface includes
+//_________________________________________________________________________________________________________________
+
+#ifndef _COM_SUN_STAR_FRAME_FRAMESEARCHFLAG_HPP_
+#include <com/sun/star/frame/FrameSearchFlag.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_AWT_XTOOLKIT_HPP_
+#include <com/sun/star/awt/XToolkit.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_AWT_WINDOWATTRIBUTE_HPP_
+#include <com/sun/star/awt/WindowAttribute.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_AWT_WINDOWDESCRIPTOR_HPP_
+#include <com/sun/star/awt/WindowDescriptor.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_AWT_POSSIZE_HPP_
+#include <com/sun/star/awt/PosSize.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_AWT_XWINDOWPEER_HPP_
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_MOZILLA_XPLUGININSTANCE_HPP_
+#include <com/sun/star/mozilla/XPluginInstance.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_BEANS_UNKNOWNPROPERTYEXCEPTION_HPP_
+#include <com/sun/star/beans/UnknownPropertyException.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_LANG_WRAPPEDTARGETEXCEPTION_HPP_
+#include <com/sun/star/lang/WrappedTargetException.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
+#include <com/sun/star/beans/XPropertySet.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XTASKSSUPPLIER_HPP_
+#include <com/sun/star/frame/XTasksSupplier.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_CONTAINER_XENUMERATION_HPP_
+#include <com/sun/star/container/XEnumeration.hpp>
+#endif
+
+#include <vcl/window.hxx>
+#include <vcl/syswin.hxx>
+#include <vcl/menu.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/resmgr.hxx>
+#include <tools/rcid.h>
+#include <vos/mutex.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+
+//_________________________________________________________________________________________________________________
+// includes of other projects
+//_________________________________________________________________________________________________________________
+
+#include <ucbhelper/content.hxx>
+
+//_________________________________________________________________________________________________________________
+// namespace
+//_________________________________________________________________________________________________________________
+
+namespace framework{
+
+using namespace ::com::sun::star::awt ;
+using namespace ::com::sun::star::beans ;
+using namespace ::com::sun::star::container ;
+using namespace ::com::sun::star::frame ;
+using namespace ::com::sun::star::lang ;
+using namespace ::com::sun::star::mozilla ;
+using namespace ::com::sun::star::uno ;
+using namespace ::com::sun::star::util ;
+using namespace ::cppu ;
+using namespace ::osl ;
+using namespace ::rtl ;
+using namespace ::vos ;
+
+//_________________________________________________________________________________________________________________
+// non exported const
+//_________________________________________________________________________________________________________________
+
+//_________________________________________________________________________________________________________________
+// non exported definitions
+//_________________________________________________________________________________________________________________
+
+//_________________________________________________________________________________________________________________
+// declarations
+//_________________________________________________________________________________________________________________
+
+//*****************************************************************************************************************
+// constructor
+//*****************************************************************************************************************
+MenuDispatcher::MenuDispatcher( const Reference< XMultiServiceFactory >& xFactory ,
+ const Reference< XFrame >& xOwner )
+ // Init baseclasses first
+ : ThreadHelpBase ( &Application::GetSolarMutex() )
+ , OWeakObject ( )
+ // Init member
+ , m_xOwnerWeak ( xOwner )
+ , m_xFactory ( xFactory )
+ , m_aListenerContainer ( m_aLock.getShareableOslMutex() )
+ , m_pMenuManager ( NULL )
+ , m_bAlreadyDisposed ( sal_False )
+ , m_bActivateListener ( sal_False )
+{
+ // Safe impossible cases
+ // We need valid informations about ouer ownerfor work.
+ LOG_ASSERT( impldbg_checkParameter_MenuDispatcher( xFactory, xOwner ), "MenuDispatcher::MenuDispatcher()\nInvalid parameter detected!\n" )
+
+ m_bActivateListener = sal_True;
+ xOwner->addFrameActionListener( Reference< XFrameActionListener >( (OWeakObject *)this, UNO_QUERY ));
+}
+
+//*****************************************************************************************************************
+// destructor
+//*****************************************************************************************************************
+MenuDispatcher::~MenuDispatcher()
+{
+ // Warn programmer if he forgot to dispose this instance.
+ // We must release all our references ...
+ // and a dtor isn't the best place to do that!
+}
+
+//*****************************************************************************************************************
+// XInterface, XTypeProvider
+//*****************************************************************************************************************
+DEFINE_XINTERFACE_4 ( MenuDispatcher ,
+ OWeakObject ,
+ DIRECT_INTERFACE( XTypeProvider ),
+ DIRECT_INTERFACE( XDispatch ),
+ DIRECT_INTERFACE( XEventListener ),
+ DERIVED_INTERFACE( XFrameActionListener, XEventListener )
+ )
+
+DEFINE_XTYPEPROVIDER_4 ( MenuDispatcher ,
+ XTypeProvider ,
+ XDispatch ,
+ XEventListener ,
+ XFrameActionListener
+ )
+
+
+//*****************************************************************************************************************
+// XDispatch
+//*****************************************************************************************************************
+void SAL_CALL MenuDispatcher::dispatch( const URL& aURL ,
+ const Sequence< PropertyValue >& seqProperties ) throw( RuntimeException )
+{
+ const char RESOURCE_URL[] = "private:resource/";
+
+ // Ready for multithreading
+ ResetableGuard aGuard( m_aLock );
+ // Safe impossible cases
+ // Method not defined for all incoming parameter
+ LOG_ASSERT( impldbg_checkParameter_dispatch( aURL, seqProperties ), "MenuDispatcher::dispatch()\nInvalid parameter detected.\n" )
+
+ Reference< XFrame > xFrame( m_xOwnerWeak.get(), UNO_QUERY );
+ LOG_ASSERT( !(xFrame.is()==sal_False), "MenuDispatcher::dispatch()\nDispatch failed ... can't get reference to owner!\n" )
+ if( xFrame.is() == sal_True )
+ {
+ OUString aResourceURLCommand( RTL_CONSTASCII_USTRINGPARAM( RESOURCE_URL ));
+
+ if ( aURL.Complete.compareTo( aResourceURLCommand, aResourceURLCommand.getLength() ) == 0 )
+ {
+ // check for the right url syntax
+ OUString aResourceString = aURL.Complete.copy( aResourceURLCommand.getLength() );
+
+ int nResIdIndex = aResourceString.indexOf( '/' );
+ if ( nResIdIndex >= 0 )
+ {
+ int nResId = 0;
+ MenuBar* pMenuBar = NULL;
+ OUString aResourceFileName( aResourceString.copy( 0, nResIdIndex ));
+
+ nResId = aResourceString.copy( nResIdIndex+1 ).toInt32();
+
+ aGuard.unlock();
+
+ OGuard aSolarGuard( Application::GetSolarMutex() );
+ {
+ // execute not thread safe VCL code
+ ResMgr* pResManager = new ResMgr( aResourceFileName );
+
+ ResId aMenuBarResId( nResId, pResManager );
+ aMenuBarResId.SetRT( RSC_MENU );
+
+ if ( pResManager && pResManager->IsAvailable( aMenuBarResId ))
+ pMenuBar = new MenuBar( aMenuBarResId );
+
+ delete pResManager;
+ }
+
+ if ( pMenuBar )
+ {
+ // set new menu bar if there is an old one delete it before!
+ if ( !impl_setMenuBar( pMenuBar, sal_True ))
+ {
+ OGuard aSolarGuard( Application::GetSolarMutex() );
+ delete pMenuBar;
+ }
+ }
+ }
+ }
+ else if ( aURL.Complete.compareToAscii( ".uno:load" ) == 0 )
+ {
+ aGuard.unlock();
+
+ // load menu from xml stream
+ Reference< ::com::sun::star::io::XInputStream > xInputStream;
+ int nPropertyCount = seqProperties.getLength();
+
+ for( int nProperty = 0; nProperty < nPropertyCount; ++nProperty )
+ {
+ if( seqProperties[nProperty].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("InputStream")) )
+ seqProperties[nProperty].Value >>= xInputStream;
+ }
+
+ MenuBar* pNewMenuBar = NULL;
+
+ if ( xInputStream.is() )
+ {
+ MenuConfiguration aMenuConfiguration( m_xFactory );
+
+ try
+ {
+ OGuard aSolarGuard( Application::GetSolarMutex() );
+ {
+ pNewMenuBar = aMenuConfiguration.CreateMenuBarFromConfiguration( xInputStream );
+ }
+
+ if ( pNewMenuBar )
+ impl_setMenuBar( pNewMenuBar );
+ }
+ catch ( WrappedTargetException& )
+ {
+ }
+ }
+
+ impl_sendStatusEvent( xFrame, aURL.Complete, ( pNewMenuBar != 0 ));
+ }
+ else if ( aURL.Complete.compareToAscii( ".uno:save" ) == 0 )
+ {
+ // save menu to xml stream
+ int nPropertyCount = seqProperties.getLength();
+ sal_Bool bStoreSuccessfull = sal_False;
+ Reference< ::com::sun::star::io::XOutputStream > xOutputStream;
+
+ for( int nProperty = 0; nProperty < nPropertyCount; ++nProperty )
+ {
+ if( seqProperties[nProperty].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("OutputStream")) )
+ seqProperties[nProperty].Value >>= xOutputStream;
+ }
+
+ MenuConfiguration aMenuConfiguration( m_xFactory );
+ MenuBar* pMenuBar = (MenuBar *)m_pMenuManager->GetMenu();
+ aGuard.unlock();
+
+ if ( xOutputStream.is() && m_pMenuManager )
+ {
+ OGuard aSolarGuard( Application::GetSolarMutex() );
+ {
+ try
+ {
+ aMenuConfiguration.StoreMenuBar( pMenuBar, xOutputStream );
+ bStoreSuccessfull = sal_True;
+ xOutputStream->flush(); // test!!!!
+ }
+ catch ( WrappedTargetException& )
+ {
+ }
+ }
+ }
+
+ impl_sendStatusEvent( xFrame, aURL.Complete, bStoreSuccessfull );
+ }
+ else if ( aURL.Complete.compareToAscii( ".uno:close" ) == 0 )
+ {
+ // close menu
+ impl_setMenuBar( NULL );
+ aGuard.unlock();
+ }
+ }
+}
+
+//*****************************************************************************************************************
+// XDispatch
+//*****************************************************************************************************************
+void SAL_CALL MenuDispatcher::addStatusListener( const Reference< XStatusListener >& xControl,
+ const URL& aURL ) throw( RuntimeException )
+{
+ // Ready for multithreading
+ ResetableGuard aGuard( m_aLock );
+ // Safe impossible cases
+ // Method not defined for all incoming parameter
+ LOG_ASSERT( impldbg_checkParameter_addStatusListener( xControl, aURL ), "MenuDispatcher::addStatusListener()\nInvalid parameter detected.\n" )
+ // Add listener to container.
+ m_aListenerContainer.addInterface( aURL.Complete, xControl );
+}
+
+//*****************************************************************************************************************
+// XDispatch
+//*****************************************************************************************************************
+void SAL_CALL MenuDispatcher::removeStatusListener( const Reference< XStatusListener >& xControl,
+ const URL& aURL ) throw( RuntimeException )
+{
+ // Ready for multithreading
+ ResetableGuard aGuard( m_aLock );
+ // Safe impossible cases
+ // Method not defined for all incoming parameter
+ LOG_ASSERT( impldbg_checkParameter_removeStatusListener( xControl, aURL ), "MenuDispatcher::removeStatusListener()\nInvalid parameter detected.\n" )
+ // Add listener to container.
+ m_aListenerContainer.removeInterface( aURL.Complete, xControl );
+}
+
+//*****************************************************************************************************************
+// XFrameActionListener
+//*****************************************************************************************************************
+
+void SAL_CALL MenuDispatcher::frameAction( const FrameActionEvent& aEvent ) throw ( RuntimeException )
+{
+ ResetableGuard aGuard( m_aLock );
+
+ if ( m_pMenuManager && aEvent.Action == FrameAction_FRAME_UI_ACTIVATED )
+ {
+ MenuBar* pMenuBar = (MenuBar *)m_pMenuManager->GetMenu();
+ Reference< XFrame > xFrame( m_xOwnerWeak.get(), UNO_QUERY );
+ aGuard.unlock();
+
+ if ( xFrame.is() && pMenuBar )
+ {
+ Reference< ::com::sun::star::awt::XWindow >xContainerWindow = xFrame->getContainerWindow();
+
+ OGuard aSolarGuard( Application::GetSolarMutex() );
+ {
+ Window* pWindow = VCLUnoHelper::GetWindow( xContainerWindow );
+ while ( pWindow && !pWindow->IsSystemWindow() )
+ pWindow = pWindow->GetParent();
+
+ if ( pWindow )
+ {
+ SystemWindow* pSysWindow = (SystemWindow *)pWindow;
+ pSysWindow->SetMenuBar( pMenuBar );
+ }
+ }
+ }
+ }
+}
+
+//*****************************************************************************************************************
+// XEventListener
+//*****************************************************************************************************************
+void SAL_CALL MenuDispatcher::disposing( const EventObject& aEvent ) throw( RuntimeException )
+{
+ // Ready for multithreading
+ ResetableGuard aGuard( m_aLock );
+ // Safe impossible cases
+ LOG_ASSERT( !(m_bAlreadyDisposed==sal_True), "MenuDispatcher::disposing()\nObject already disposed .. don't call it again!\n" )
+
+ if( m_bAlreadyDisposed == sal_False )
+ {
+ m_bAlreadyDisposed = sal_True;
+
+ if ( m_bActivateListener )
+ {
+ Reference< XFrame > xFrame( m_xOwnerWeak.get(), UNO_QUERY );
+ if ( xFrame.is() )
+ {
+ xFrame->removeFrameActionListener( Reference< XFrameActionListener >( (OWeakObject *)this, UNO_QUERY ));
+ m_bActivateListener = sal_False;
+ if ( m_pMenuManager )
+ {
+ EventObject aEventObj;
+ aEventObj.Source = xFrame;
+ m_pMenuManager->disposing( aEventObj );
+ }
+ }
+ }
+
+ // Forget our factory.
+ m_xFactory = Reference< XMultiServiceFactory >();
+
+ // Remove our menu from system window if it is still there!
+ if ( m_pMenuManager )
+ impl_setMenuBar( NULL );
+ }
+}
+
+//*****************************************************************************************************************
+// private method
+//*****************************************************************************************************************
+void MenuDispatcher::impl_sendStatusEvent( const Reference< XFrame >& xEventSource ,
+ const OUString& sURL ,
+ sal_Bool bLoadState )
+{
+ // Get listener for given URL!
+ OInterfaceContainerHelper* pListenerForURL = m_aListenerContainer.getContainer( sURL );
+ // Send messages to all listener.
+ // Do nothing, if there no listener or "getContainer()" works not correct!
+ if( pListenerForURL != NULL )
+ {
+ // Build event for send to listener.
+ FeatureStateEvent aEvent;
+ aEvent.FeatureURL.Complete = sURL ;
+ aEvent.FeatureDescriptor = FEATUREDESCRIPTOR_LOADSTATE ;
+ aEvent.IsEnabled = bLoadState ;
+ aEvent.Requery = sal_False ;
+ aEvent.State <<= xEventSource ;
+
+ // Send message to all listener on this URL.
+ OInterfaceIteratorHelper aIterator(*pListenerForURL);
+ while( aIterator.hasMoreElements() )
+ {
+ ((XStatusListener*)aIterator.next())->statusChanged( aEvent );
+ }
+ }
+}
+
+//*****************************************************************************************************************
+// private method
+//
+//
+//*****************************************************************************************************************
+sal_Bool MenuDispatcher::impl_setMenuBar( MenuBar* pMenuBar, sal_Bool bMenuFromResource )
+{
+ Reference< XFrame > xFrame( m_xOwnerWeak.get(), UNO_QUERY );
+ if ( xFrame.is() )
+ {
+ Reference< ::com::sun::star::awt::XWindow >xContainerWindow = xFrame->getContainerWindow();
+ Window* pWindow = NULL;
+
+ // Use SolarMutex for threadsafe code too!
+ OGuard aSolarGuard( Application::GetSolarMutex() );
+ {
+ pWindow = VCLUnoHelper::GetWindow( xContainerWindow );
+ while ( pWindow && !pWindow->IsSystemWindow() )
+ pWindow = pWindow->GetParent();
+ }
+
+ if ( pWindow )
+ {
+ // Ready for multithreading
+ ResetableGuard aGuard( m_aLock );
+
+ SystemWindow* pSysWindow = (SystemWindow *)pWindow;
+
+ if ( m_pMenuManager )
+ {
+ OGuard aSolarGuard( Application::GetSolarMutex() );
+ {
+ // remove old menu from our system window if it was set before
+ if ( m_pMenuManager->GetMenu() == (Menu *)pSysWindow->GetMenuBar() )
+ pSysWindow->SetMenuBar( NULL );
+
+ SAL_STATIC_CAST( ::com::sun::star::uno::XInterface*, (OWeakObject*)m_pMenuManager )->release();
+ }
+
+ m_pMenuManager = 0;
+ }
+
+ if ( pMenuBar != NULL )
+ {
+ OGuard aSolarGuard( Application::GetSolarMutex() );
+ {
+ // set new menu on our system window and create new menu manager
+ if ( bMenuFromResource )
+ m_pMenuManager = new MenuManager( xFrame, pMenuBar, sal_True, sal_False );
+ else
+ m_pMenuManager = new MenuManager( xFrame, pMenuBar, sal_True, sal_True );
+ pSysWindow->SetMenuBar( pMenuBar );
+ }
+ }
+
+ return sal_True;
+ }
+ }
+
+ return sal_False;
+}
+
+//_________________________________________________________________________________________________________________
+// debug methods
+//_________________________________________________________________________________________________________________
+
+/*-----------------------------------------------------------------------------------------------------------------
+ The follow methods checks the parameter for other functions. If a parameter or his value is non valid,
+ we return "sal_False". (else sal_True) This mechanism is used to throw an ASSERT!
+
+ ATTENTION
+
+ If you miss a test for one of this parameters, contact the autor or add it himself !(?)
+ But ... look for right testing! See using of this methods!
+-----------------------------------------------------------------------------------------------------------------*/
+
+#ifdef ENABLE_ASSERTIONS
+
+//*****************************************************************************************************************
+sal_Bool MenuDispatcher::impldbg_checkParameter_MenuDispatcher( const Reference< XMultiServiceFactory >& xFactory ,
+ const Reference< XFrame >& xOwner )
+{
+ // Set default return value.
+ sal_Bool bOK = sal_True;
+ // Check parameter.
+ if (
+ ( &xFactory == NULL ) ||
+ ( &xOwner == NULL ) ||
+ ( xFactory.is() == sal_False ) ||
+ ( xOwner.is() == sal_False )
+ )
+ {
+ bOK = sal_False ;
+ }
+ // Return result of check.
+ return bOK ;
+}
+
+//*****************************************************************************************************************
+// We don't know anything about right values of aURL and seqArguments!
+// Check valid references only.
+sal_Bool MenuDispatcher::impldbg_checkParameter_dispatch( const URL& aURL ,
+ const Sequence< PropertyValue >& seqArguments)
+{
+ // Set default return value.
+ sal_Bool bOK = sal_True;
+ // Check parameter.
+ if (
+ ( &aURL == NULL ) ||
+ ( &seqArguments == NULL )
+ )
+ {
+ bOK = sal_False ;
+ }
+ // Return result of check.
+ return bOK ;
+}
+
+//*****************************************************************************************************************
+// We need a valid URL. What is meaning with "register for nothing"?!
+// xControl must correct to - nobody can advised otherwise!
+sal_Bool MenuDispatcher::impldbg_checkParameter_addStatusListener( const Reference< XStatusListener >& xControl,
+ const URL& aURL )
+{
+ // Set default return value.
+ sal_Bool bOK = sal_True;
+ // Check parameter.
+ if (
+ ( &xControl == NULL ) ||
+ ( &aURL == NULL ) ||
+ ( aURL.Complete.getLength() < 1 )
+ )
+ {
+ bOK = sal_False ;
+ }
+ // Return result of check.
+ return bOK ;
+}
+
+//*****************************************************************************************************************
+// The same goes for these case! We have added valid listener for correct URL only.
+// We can't remove invalid listener for nothing!
+sal_Bool MenuDispatcher::impldbg_checkParameter_removeStatusListener( const Reference< XStatusListener >& xControl,
+ const URL& aURL )
+{
+ // Set default return value.
+ sal_Bool bOK = sal_True;
+ // Check parameter.
+ if (
+ ( &xControl == NULL ) ||
+ ( &aURL == NULL ) ||
+ ( aURL.Complete.getLength() < 1 )
+ )
+ {
+ bOK = sal_False ;
+ }
+ // Return result of check.
+ return bOK ;
+}
+
+#endif // #ifdef ENABLE_ASSERTIONS
+
+} // namespace framework