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



#ifndef __FRAMEWORK_DISPATCH_HELPAGENTDISPATCHER_HXX_
#define __FRAMEWORK_DISPATCH_HELPAGENTDISPATCHER_HXX_

#include <threadhelp/threadhelpbase.hxx>
#include <macros/xinterface.hxx>
#include <macros/xtypeprovider.hxx>
#include <com/sun/star/frame/XDispatch.hpp>
#include <com/sun/star/frame/XFrame.hpp>
#include <com/sun/star/awt/XWindowListener.hpp>
#include <com/sun/star/awt/XWindow.hpp>
#include <svtools/helpagentwindow.hxx>
#include <vcl/timer.hxx>
#include <vcl/evntpost.hxx>
#include <cppuhelper/weak.hxx>

//........................................................................
namespace framework
{

// define css alias ... and undefine it at the end of this file !!!
#ifdef css
	#error "I tried to use css as namespace define inside non exported header ... but it was already defined by somwhere else. .-)"
#else
	#define css ::com::sun::star
#endif
	
//........................................................................
	
class HelpAgentDispatcher : public  css::lang::XTypeProvider
						  , public  css::frame::XDispatch
						  , public  css::awt::XWindowListener // => css::lang::XEventListener
						  , public  ::svt::IHelpAgentCallback
						  , private ThreadHelpBase
						  , public  ::cppu::OWeakObject
{
	private:
	
        //---------------------------------------
		/// @short  represent the current active help URL, which must be used to show the right help page
		::rtl::OUString m_sCurrentURL;
	
        //---------------------------------------
		/// @short  parent of the agent window.
		css::uno::Reference< css::awt::XWindow > m_xContainerWindow;
	
        //---------------------------------------
		/// @short  the agent window itself (implemented in svtools)
		css::uno::Reference< css::awt::XWindow > m_xAgentWindow;

        //---------------------------------------
        /// @short  the timer for showing the agent window
        Timer m_aTimer;
	
        //---------------------------------------
        /** @short  hold this dispatcher alive till the timer was killed or expired!
			@descr	Because the vcl timer knows us by using a pointer ... and our instance is used
					ref counted normaly it can happen that our reference goes down to 0 ... and the timer
					runs into some trouble. So we hold us self alive till the timer could be stopped or expired.
		*/
		css::uno::Reference< css::uno::XInterface > m_xSelfHold;
	
	public:
		
		HelpAgentDispatcher(const css::uno::Reference< css::frame::XFrame >& xParentFrame);

		FWK_DECLARE_XINTERFACE
		FWK_DECLARE_XTYPEPROVIDER
	
		// css::frame::XDispatch
		virtual void SAL_CALL dispatch(const css::util::URL& 								  sURL ,
									   const css::uno::Sequence< css::beans::PropertyValue >& lArgs)
			throw(css::uno::RuntimeException);
		virtual void SAL_CALL addStatusListener(const css::uno::Reference< css::frame::XStatusListener >& xListener,
											    const css::util::URL& 									  aURL     )
			throw(css::uno::RuntimeException);
		virtual void SAL_CALL removeStatusListener(const css::uno::Reference< css::frame::XStatusListener >& xListener,
												   const css::util::URL& 									 aURL     )
			throw(css::uno::RuntimeException);
	
		// css::awt::XWindowListener
		virtual void SAL_CALL windowResized(const css::awt::WindowEvent& aSource)
			throw(css::uno::RuntimeException);
		virtual void SAL_CALL windowMoved(const css::awt::WindowEvent& aSource)
			throw(css::uno::RuntimeException);
		virtual void SAL_CALL windowShown(const css::lang::EventObject& aSource)
			throw(css::uno::RuntimeException);
		virtual void SAL_CALL windowHidden(const css::lang::EventObject& aSource)
			throw(css::uno::RuntimeException);
	
		// css::lang::XEventListener
		virtual void SAL_CALL disposing(const css::lang::EventObject& aSource)
			throw(css::uno::RuntimeException);
		
	protected:
		
		~HelpAgentDispatcher();

	protected:

		/// IHelpAgentCallback overridables
		virtual void helpRequested();
		virtual void closeAgent();

	private:
		
        //---------------------------------------
        /** @short  mark the current set URL as "accepted by user" and show the right help window
         */
        void implts_acceptCurrentURL();
	
        //---------------------------------------
        /** @short  mark the current set URL as "ignored by user"
         */
        void implts_ignoreCurrentURL();
	
        //---------------------------------------
		/** @short	ensures that the agent's window exists
			@descr	We create the agent window on demand. But afterwards we hold it alive till
					this helpagent dispatcher dies. The agent window will be made visible/hidden
					in case a new dispatch occures or in case the timer expired.
	
			@return	[sal_Bool]
					sal_True in case the member m_xAgentWindow is a valid reference;
					sal_False otherwise.
		*/
		css::uno::Reference< css::awt::XWindow > implts_ensureAgentWindow();
	
        //---------------------------------------
        /** @short  show the agent window.
			@descr	If the agent window does not exists, it will be created on demand.
					(see implts_ensureAgentWindow). Further it's checked if the parent container
					window is currently visible or not. Only if its visible the agent window will
					be shown too.
         */
        void implts_showAgentWindow();
	
        //---------------------------------------
        /** @short  hide the agent window.
         */
        void implts_hideAgentWindow();
		
        //---------------------------------------
        /** @short  set the new position and size of the agent window.
			@descr	If the agent window does not exists, it will be created on demand.
					(see implts_ensureAgentWindow).
					If the agent window exists, its position and size will be calculated
					and set.
         */
        void implts_positionAgentWindow();
		
        //---------------------------------------
        /** @short  starts the timer for showing the agent window.
			@descr	The timer wont be started twice ... this method checks the current running state .-)
         */
        void implts_startTimer();
		
        //---------------------------------------
        /** @short  stop the timer.
			@descr	The timer wont be stopped twice ... this method checks the current running state .-)
					Further this method marks the current help URL (m_xCurrentURL) as "ignorable".
					Cause the user ignored it !
         */
        void implts_stopTimer();
		
        //---------------------------------------
        /** @short  callback of our internal timer.
         */
        DECL_LINK(implts_timerExpired, void*);
};

#undef css

//........................................................................
}	// namespace framework
//........................................................................

#endif // _FRAMEWORK_DISPATCH_HELPAGENTDISPATCHER_HXX_

