/**************************************************************
 * 
 * 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_SERVICES_TASK_HXX_
#define __FRAMEWORK_SERVICES_TASK_HXX_

//_________________________________________________________________________________________________________________
//	my own includes
//_________________________________________________________________________________________________________________

#include <services/frame.hxx>
#include <macros/generic.hxx>
#include <macros/debug.hxx>
#include <macros/xinterface.hxx>
#include <macros/xtypeprovider.hxx>
#include <macros/xserviceinfo.hxx>

//_________________________________________________________________________________________________________________
//	interface includes
//_________________________________________________________________________________________________________________
#include <com/sun/star/frame/XTask.hpp>
#include <com/sun/star/awt/Point.hpp>
#include <com/sun/star/awt/Size.hpp>

//_________________________________________________________________________________________________________________
//	other includes
//_________________________________________________________________________________________________________________
#include <cppuhelper/weak.hxx>
#include <cppuhelper/propshlp.hxx>

#include <tools/link.hxx>
#include <vcl/evntpost.hxx>

//_________________________________________________________________________________________________________________
//	namespace
//_________________________________________________________________________________________________________________

namespace framework{

//_________________________________________________________________________________________________________________
//	exported const
//_________________________________________________________________________________________________________________

//_________________________________________________________________________________________________________________
//	exported definitions
//_________________________________________________________________________________________________________________

/*-************************************************************************************************************//**
	@short		implements an special frame - a task frame

	@descr		-

	@implements	XTask

	@base		Frame
				OPropertySet
*//*-*************************************************************************************************************/

class Task  :   public css::frame::XTask    ,   // => XFrame => XComponent
                public Frame                    // Order of baseclasses is neccessary for right initialization!
{
	//-------------------------------------------------------------------------------------------------------------
	//	public methods
	//-------------------------------------------------------------------------------------------------------------

	public:

		//---------------------------------------------------------------------------------------------------------
		//	constructor / destructor
		//---------------------------------------------------------------------------------------------------------

		/*-****************************************************************************************************//**
			@short		standard constructor to create instance

			@descr		This constructor initialize a new instance of this class,
						and will be set valid values on his member and baseclasses.

			@seealso	-

			@param		-

			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

	 	Task( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory );

		/*-****************************************************************************************************//**
			@short		standard destructor

			@descr		This method destruct an instance of this class and clear some member.

			@seealso	-

			@param		-

			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

		virtual	~Task();

		//---------------------------------------------------------------------------------------------------------
		//	XInterface, XTypeProvider, XServiceInfo
		//---------------------------------------------------------------------------------------------------------

		DECLARE_XINTERFACE
		DECLARE_XTYPEPROVIDER
		DECLARE_XSERVICEINFO

		//---------------------------------------------------------------------------------------------------------
		//	XTask
		//---------------------------------------------------------------------------------------------------------

		/*-****************************************************************************************************//**
			@short		-

			@descr		-

			@seealso	-

			@param		-

			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

		virtual sal_Bool SAL_CALL close() throw( css::uno::RuntimeException );

		/*-****************************************************************************************************//**
			@short		-

			@descr		-

			@seealso	-

			@param		-

			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

    	virtual void SAL_CALL tileWindows() throw( css::uno::RuntimeException );

		/*-****************************************************************************************************//**
			@short		-

			@descr		-

			@seealso	-

			@param		-

			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

    	virtual void SAL_CALL arrangeWindowsVertical() throw( css::uno::RuntimeException );

		/*-****************************************************************************************************//**
			@short		-

			@descr		-

			@seealso	-

			@param		-

			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

    	virtual void SAL_CALL arrangeWindowsHorizontal() throw( css::uno::RuntimeException );

		//---------------------------------------------------------------------------------------------------------
		//	 XComponent
		//---------------------------------------------------------------------------------------------------------

		/*-****************************************************************************************************//**
			@short		-

			@descr		We must overwrite this method, because baseclass Frame implements XFrame and XComponent.
						XTask is derived from these classes to! The compiler don't know, which base is the right one.

			@seealso	-

			@param		-

			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

    	virtual void SAL_CALL dispose() throw( css::uno::RuntimeException )
		{
			Frame::dispose();
		}

		/*-*******************************************************************************************************/
    	virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) throw( css::uno::RuntimeException )
		{
			Frame::addEventListener( xListener );
		}

		/*-*******************************************************************************************************/
    	virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) throw( css::uno::RuntimeException )
		{
			Frame::removeEventListener( xListener );
		}

		//---------------------------------------------------------------------------------------------------------
		//	 XFrame
		//---------------------------------------------------------------------------------------------------------

		/*-****************************************************************************************************//**
			@short		-

			@descr		We must overwrite this method, because baseclass Frame implements XFrame and XComponent.
						XTask is derived from these classes to! The compiler don't know, which base is right.

			@seealso	-

			@param		-

			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

    	virtual void SAL_CALL initialize( const css::uno::Reference< css::awt::XWindow >& xWindow ) throw( css::uno::RuntimeException )
		{
			Frame::initialize( xWindow );
		}

    	virtual css::uno::Reference< css::awt::XWindow > SAL_CALL getContainerWindow() throw( css::uno::RuntimeException )
		{
			return Frame::getContainerWindow();
		}

    	virtual void SAL_CALL setCreator( const css::uno::Reference< css::frame::XFramesSupplier >& xCreator ) throw( css::uno::RuntimeException )
		{
			Frame::setCreator( xCreator );
		}

    	virtual css::uno::Reference< css::frame::XFramesSupplier > SAL_CALL getCreator() throw( css::uno::RuntimeException )
		{
			return Frame::getCreator();
		}

    	virtual ::rtl::OUString SAL_CALL getName() throw( css::uno::RuntimeException )
		{
			return Frame::getName();
		}

    	virtual void SAL_CALL setName( const ::rtl::OUString& sName ) throw( css::uno::RuntimeException )
		{
			Frame::setName( sName );
		}

    	virtual sal_Bool SAL_CALL isTop() throw( css::uno::RuntimeException )
		{
			return Frame::isTop();
		}

    	virtual void SAL_CALL activate() throw( css::uno::RuntimeException )
		{
			Frame::activate();
		}

    	virtual void SAL_CALL deactivate() throw( css::uno::RuntimeException )
		{
			Frame::deactivate();
		}

    	virtual sal_Bool SAL_CALL isActive() throw( css::uno::RuntimeException )
		{
			return Frame::isActive();
		}

    	virtual sal_Bool SAL_CALL setComponent(	const	css::uno::Reference< css::awt::XWindow >&		xComponentWindow	,
												const	css::uno::Reference< css::frame::XController >&	xController			) throw( css::uno::RuntimeException )
		{
			return Frame::setComponent( xComponentWindow, xController );
		}

    	virtual css::uno::Reference< css::awt::XWindow > SAL_CALL getComponentWindow() throw( css::uno::RuntimeException )
		{
			return Frame::getComponentWindow();
		}

    	virtual css::uno::Reference< css::frame::XController > SAL_CALL getController() throw( css::uno::RuntimeException )
		{
			return Frame::getController();
		}

    	virtual void SAL_CALL contextChanged() throw( css::uno::RuntimeException )
		{
			Frame::contextChanged();
		}

    	virtual void SAL_CALL addFrameActionListener( const css::uno::Reference< css::frame::XFrameActionListener >& xListener ) throw( css::uno::RuntimeException )
		{
			Frame::addFrameActionListener( xListener );
		}

    	virtual void SAL_CALL removeFrameActionListener( const css::uno::Reference< css::frame::XFrameActionListener >& xListener ) throw( css::uno::RuntimeException )
		{
			Frame::removeFrameActionListener( xListener );
		}

    	virtual css::uno::Reference< css::frame::XFrame > SAL_CALL findFrame(	const	::rtl::OUString&	sTargetFrameName	,
													   									sal_Int32			nSearchFlags		) throw( css::uno::RuntimeException );

		//---------------------------------------------------------------------------------------------------------
		//	 XTopWindowListener
		//---------------------------------------------------------------------------------------------------------

		/*-****************************************************************************************************//**
			@short		-

			@descr		-

			@seealso	-
			@seealso	-

			@param		-

			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

		virtual void SAL_CALL windowClosing( const css::lang::EventObject& aEvent ) throw( css::uno::RuntimeException );

		/*-****************************************************************************************************//**
			@short		-

			@descr		-

			@seealso	-
			@seealso	-

			@param		-

			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

		virtual void SAL_CALL windowActivated( const css::lang::EventObject& aEvent ) throw( css::uno::RuntimeException );

		/*-****************************************************************************************************//**
			@short		-

			@descr		-

			@seealso	-
			@seealso	-

			@param		-

			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

    	virtual void SAL_CALL windowDeactivated( const css::lang::EventObject& aEvent ) throw( css::uno::RuntimeException );

		//---------------------------------------------------------------------------------------------------------
		//	 XEventListener
		//---------------------------------------------------------------------------------------------------------

		/*-****************************************************************************************************//**
			@short		-

			@descr		This object is forced to release all references to the interfaces given
						by the parameter Source.

			@seealso	-

			@param		-

			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

	    virtual void SAL_CALL disposing( const css::lang::EventObject& aEvent ) throw( css::uno::RuntimeException );

	//-------------------------------------------------------------------------------------------------------------
	//	protected methods
	//-------------------------------------------------------------------------------------------------------------

	protected:

		//---------------------------------------------------------------------------
		//	OPropertySetHelper
		//---------------------------------------------------------------------------

		/*-****************************************************************************************************//**
			@short		try to convert a property value
			@descr		This method is calling from helperclass "OPropertySetHelper".
						Don't use this directly!
						You must try to convert the value of given propertyhandle and
						return results of this operation. This will be use to ask vetoable
						listener. If no listener have a veto, we will change value realy!
						( in method setFastPropertyValue_NoBroadcast(...) )

			@seealso	OPropertySetHelper
			@seealso	setFastPropertyValue_NoBroadcast()

			@param		"aConvertedValue"	new converted value of property
			@param		"aOldValue"			old value of property
			@param		"nHandle"			handle of property
			@param		"aValue"			new value of property

			@return		sal_True if value will be changed, sal_FALSE otherway

			@onerror	IllegalArgumentException, if you call this with an invalid argument
		*//*-*****************************************************************************************************/
/*
		virtual sal_Bool SAL_CALL convertFastPropertyValue(			css::uno::Any&		aConvertedValue	,
								  									css::uno::Any&		aOldValue		,
																	sal_Int32			nHandle			,
															const	css::uno::Any&		aValue			) throw( css::lang::IllegalArgumentException );
*/
		/*-****************************************************************************************************//**
			@short		set value of a transient property
			@descr		This method is calling from helperclass "OPropertySetHelper".
						Don't use this directly!
						Handle and value are valid everyway! You must set the new value only.
						After this, baseclass send messages to all listener automaticly.

			@seealso	OPropertySetHelper

			@param      "nHandle"	handle of property to change
			@param      "aValue"	new value of property

			@return		-

			@onerror	An exception is thrown.
		*//*-*****************************************************************************************************/
/*
		virtual void SAL_CALL setFastPropertyValue_NoBroadcast(			sal_Int32		nHandle	,
							  									const	css::uno::Any&	aValue	) throw( css::uno::Exception );
*/
		/*-****************************************************************************************************//**
			@short		get value of a transient property
			@descr		This method is calling from helperclass "OPropertySetHelper".
						Don't use this directly!

			@seealso	OPropertySetHelper

			@param      "nHandle"	handle of property to change
			@param      "aValue"	current value of property

			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/
/*
		virtual void SAL_CALL getFastPropertyValue(	css::uno::Any&	aValue	,
							  						sal_Int32		nHandle	) const;
*/
		/*-****************************************************************************************************//**
			@short      return structure and information about transient properties
			@descr		This method is calling from helperclass "OPropertySetHelper".
						Don't use this directly!

			@seealso	OPropertySetHelper

			@param		-

			@return		structure with property-informations

			@onerror	-
		*//*-*****************************************************************************************************/
/*
		virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper();
*/
		/*-****************************************************************************************************//**
			@short		return propertysetinfo
			@descr		You can call this method to get information about transient properties
						of this object.

			@seealso	OPropertySetHelper
			@seealso	XPropertySet
			@seealso	XMultiPropertySet

			@param		-

			@return		reference to object with information [XPropertySetInfo]

			@onerror	-
		*//*-*****************************************************************************************************/
/*
		virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo();
*/
	//-------------------------------------------------------------------------------------------------------------
	//	private methods
	//-------------------------------------------------------------------------------------------------------------

	private:

        DECL_LINK( Close_Impl, void* );

//        void    impl_SaveWindowAttributes();

/*		sal_Bool impl_tryToChangeProperty(			sal_Bool			bProperty		,
											const	css::uno::Any&		aValue			,
													css::uno::Any&		aOldValue		,
													css::uno::Any&		aConvertedValue	) throw( css::lang::IllegalArgumentException );
		sal_Bool impl_tryToChangeProperty(	const	::rtl::OUString&	sProperty		,
											const	css::uno::Any&		aValue			,
													css::uno::Any&		aOldValue		,
													css::uno::Any&		aConvertedValue	) throw( css::lang::IllegalArgumentException );
		sal_Bool impl_tryToChangeProperty(	const	css::awt::Point&	aProperty		,
											const	css::uno::Any&		aValue			,
													css::uno::Any&		aOldValue		,
													css::uno::Any&		aConvertedValue	) throw( css::lang::IllegalArgumentException );
		sal_Bool impl_tryToChangeProperty(	const	css::awt::Size&		aProperty		,
											const	css::uno::Any&		aValue			,
													css::uno::Any&		aOldValue		,
													css::uno::Any&		aConvertedValue	) throw( css::lang::IllegalArgumentException );

		static const css::uno::Sequence< css::beans::Property > impl_getStaticPropertyDescriptor();
*/

	//-------------------------------------------------------------------------------------------------------------
	//	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<BR>
						sal_True  otherway

			@onerror	-
		*//*-*****************************************************************************************************/

	#ifdef ENABLE_ASSERTIONS

	private:

		// Not used in the moment!

	#endif	// #ifdef ENABLE_ASSERTIONS

	//-------------------------------------------------------------------------------------------------------------
	//	variables
	//	(should be private everyway!)
	//-------------------------------------------------------------------------------------------------------------

	protected:

		// But some values are neede by derived classes!
//        sal_Bool            m_bIsPlugIn         ;   /// In objects of these class this member is set to sal_False.
													/// But in derived class PlugInFrame it's overwrited with sal_True!

	private:

		// Properties
        sal_Bool            m_bIsAlwaysVisible  ;
        sal_Bool            m_bIsFloating       ;
        css::awt::Point		m_aPosition         ;
        css::awt::Size		m_aSize             ;
        ::vcl::EventPoster  m_aPoster           ;

};		//	class Tasks

}		//	namespace framework

#endif	//	#ifndef __FRAMEWORK_SERVICES_TASKS_HXX_
