/**************************************************************
 *
 * 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 necessary 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 really!
						( 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 automatically.

			@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 methods 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_
