/**************************************************************
 *
 * 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.
 *
 *************************************************************/



//____________________________________________________________________________________________________________
//	my own includes
//____________________________________________________________________________________________________________

#include "progressmonitor.hxx"

//____________________________________________________________________________________________________________
//	includes of other projects
//____________________________________________________________________________________________________________
#include <com/sun/star/awt/GradientStyle.hpp>
#include <com/sun/star/awt/RasterOperation.hpp>
#include <com/sun/star/awt/Gradient.hpp>
#include <com/sun/star/awt/XGraphics.hpp>
#include <com/sun/star/awt/PosSize.hpp>
#include <cppuhelper/typeprovider.hxx>
#include <tools/debug.hxx>
#include <tools/solar.h>

//____________________________________________________________________________________________________________
//	includes of my project
//____________________________________________________________________________________________________________
#include "progressbar.hxx"

//____________________________________________________________________________________________________________
//	namespace
//____________________________________________________________________________________________________________

using namespace	::cppu					;
using namespace	::osl					;
using namespace	::rtl					;
using namespace	::com::sun::star::uno	;
using namespace	::com::sun::star::lang	;
using namespace	::com::sun::star::awt	;

namespace unocontrols{

//____________________________________________________________________________________________________________
//	construct/destruct
//____________________________________________________________________________________________________________

ProgressMonitor::ProgressMonitor( const Reference< XMultiServiceFactory >& xFactory )
	: BaseContainerControl	( xFactory	)
{
	// Its not allowed to work with member in this method (refcounter !!!)
	// But with a HACK (++refcount) its "OK" :-(
	++m_refCount ;

	// Create instances for fixedtext, button and progress ...
	m_xTopic_Top	= Reference< XFixedText > 		( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_SERVICENAME	) ), UNO_QUERY ) ;
	m_xText_Top		= Reference< XFixedText > 		( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_SERVICENAME	) ), UNO_QUERY ) ;
	m_xTopic_Bottom	= Reference< XFixedText > 		( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_SERVICENAME	) ), UNO_QUERY ) ;
	m_xText_Bottom	= Reference< XFixedText > 		( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_SERVICENAME	) ), UNO_QUERY ) ;
	m_xButton		= Reference< XButton > 			( xFactory->createInstance ( OUString::createFromAscii( BUTTON_SERVICENAME		) ), UNO_QUERY ) ;
	m_xProgressBar	= Reference< XProgressBar >  	( xFactory->createInstance ( OUString::createFromAscii( SERVICENAME_PROGRESSBAR	) ), UNO_QUERY ) ;

	// ... cast controls to Reference< XControl >  (for "setModel"!) ...
	Reference< XControl > 	xRef_Topic_Top		( m_xTopic_Top	  , UNO_QUERY ) ;
	Reference< XControl > 	xRef_Text_Top		( m_xText_Top	  , UNO_QUERY ) ;
	Reference< XControl > 	xRef_Topic_Bottom	( m_xTopic_Bottom , UNO_QUERY ) ;
	Reference< XControl > 	xRef_Text_Bottom	( m_xText_Bottom  , UNO_QUERY ) ;
	Reference< XControl > 	xRef_Button			( m_xButton		  , UNO_QUERY ) ;
	Reference< XControl > 	xRef_ProgressBar	( m_xProgressBar  , UNO_QUERY ) ;

	// ... set models ...
	xRef_Topic_Top->setModel		( Reference< XControlModel >  ( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_MODELNAME	) ), UNO_QUERY ) ) ;
	xRef_Text_Top->setModel			( Reference< XControlModel >  ( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_MODELNAME	) ), UNO_QUERY ) ) ;
	xRef_Topic_Bottom->setModel		( Reference< XControlModel >  ( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_MODELNAME	) ), UNO_QUERY ) ) ;
	xRef_Text_Bottom->setModel		( Reference< XControlModel >  ( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_MODELNAME	) ), UNO_QUERY ) ) ;
	xRef_Button->setModel			( Reference< XControlModel >  ( xFactory->createInstance ( OUString::createFromAscii( BUTTON_MODELNAME		) ), UNO_QUERY ) ) ;
	// ProgressBar has no model !!!

	// ... and add controls to basecontainercontrol!
	addControl ( OUString::createFromAscii( CONTROLNAME_TEXT		) , xRef_Topic_Top   	) ;
	addControl ( OUString::createFromAscii( CONTROLNAME_TEXT		) , xRef_Text_Top	   	) ;
	addControl ( OUString::createFromAscii( CONTROLNAME_TEXT		) , xRef_Topic_Bottom	) ;
	addControl ( OUString::createFromAscii( CONTROLNAME_TEXT		) , xRef_Text_Bottom	) ;
	addControl ( OUString::createFromAscii( CONTROLNAME_BUTTON		) , xRef_Button			) ;
	addControl ( OUString::createFromAscii( CONTROLNAME_PROGRESSBAR	) , xRef_ProgressBar 	) ;

	// FixedText make it automatically visible by himself ... but not the progressbar !!!
	// it must be set explicitly
	Reference< XWindow > xWindowRef_ProgressBar( m_xProgressBar, UNO_QUERY );
	xWindowRef_ProgressBar->setVisible( sal_True );

	// Reset to defaults !!!
	// (progressbar take automatically its own defaults)
	m_xButton->setLabel			( OUString::createFromAscii( DEFAULT_BUTTONLABEL	) ) ;
	m_xTopic_Top->setText		( OUString::createFromAscii( DEFAULT_TOPIC			) ) ;
	m_xText_Top->setText		( OUString::createFromAscii( DEFAULT_TEXT			) ) ;
	m_xTopic_Bottom->setText	( OUString::createFromAscii( DEFAULT_TOPIC			) ) ;
	m_xText_Bottom->setText		( OUString::createFromAscii( DEFAULT_TEXT			) ) ;

	--m_refCount ;

	// Initialize info lists for fixedtext's
	m_pTextlist_Top		= new IMPL_Textlist ;
	m_pTextlist_Bottom	= new IMPL_Textlist ;
}

ProgressMonitor::~ProgressMonitor()
{
	impl_cleanMemory () ;
}

//____________________________________________________________________________________________________________
//	XInterface
//____________________________________________________________________________________________________________

Any SAL_CALL ProgressMonitor::queryInterface( const Type& rType ) throw( RuntimeException )
{
	// Attention:
	//	Don't use mutex or guard in this method!!! Is a method of XInterface.
	Any aReturn ;
	Reference< XInterface > xDel = BaseContainerControl::impl_getDelegator();
	if ( xDel.is() )
	{
		// If an delegator exist, forward question to his queryInterface.
		// Delegator will ask his own queryAggregation!
		aReturn = xDel->queryInterface( rType );
	}
	else
	{
		// If an delegator unknown, forward question to own queryAggregation.
		aReturn = queryAggregation( rType );
	}

	return aReturn ;
}

//____________________________________________________________________________________________________________
//	XInterface
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::acquire() throw()
{
	// Attention:
	//	Don't use mutex or guard in this method!!! Is a method of XInterface.

	// Forward to baseclass
	BaseControl::acquire();
}

//____________________________________________________________________________________________________________
//	XInterface
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::release() throw()
{
	// Attention:
	//	Don't use mutex or guard in this method!!! Is a method of XInterface.

	// Forward to baseclass
	BaseControl::release();
}

//____________________________________________________________________________________________________________
//	XTypeProvider
//____________________________________________________________________________________________________________

Sequence< Type > SAL_CALL ProgressMonitor::getTypes() throw( RuntimeException )
{
	// Optimize this method !
	// We initialize a static variable only one time. And we don't must use a mutex at every call!
	// For the first call; pTypeCollection is NULL - for the second call pTypeCollection is different from NULL!
	static OTypeCollection* pTypeCollection = NULL ;

	if ( pTypeCollection == NULL )
	{
		// Ready for multithreading; get global mutex for first call of this method only! see before
		MutexGuard aGuard( Mutex::getGlobalMutex() );

		// Control these pointer again ... it can be, that another instance will be faster then these!
		if ( pTypeCollection == NULL )
		{
			// Create a static typecollection ...
			static OTypeCollection aTypeCollection	(	::getCppuType(( const Reference< XLayoutConstrains	>*)NULL )	,
												  		::getCppuType(( const Reference< XButton			>*)NULL )	,
												  		::getCppuType(( const Reference< XProgressMonitor	>*)NULL )	,
														BaseContainerControl::getTypes()
													);
			// ... and set his address to static pointer!
			pTypeCollection = &aTypeCollection ;
		}
	}

	return pTypeCollection->getTypes();
}

//____________________________________________________________________________________________________________
//	XAggregation
//____________________________________________________________________________________________________________

Any SAL_CALL ProgressMonitor::queryAggregation( const Type& aType ) throw( RuntimeException )
{
	// Ask for my own supported interfaces ...
	// Attention: XTypeProvider and XInterface are supported by OComponentHelper!
	Any aReturn	( ::cppu::queryInterface(	aType					   					,
									   		static_cast< XLayoutConstrains*	> ( this )	,
									   		static_cast< XButton*			> ( this )	,
									   		static_cast< XProgressMonitor*	> ( this )
										)
				);

	// If searched interface not supported by this class ...
	if ( aReturn.hasValue() == sal_False )
	{
		// ... ask baseclasses.
		aReturn = BaseControl::queryAggregation( aType );
	}

	return aReturn ;
}

//____________________________________________________________________________________________________________
//	XProgressMonitor
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::addText( const OUString& rTopic, const OUString& rText, sal_Bool bbeforeProgress ) throw( RuntimeException )
{
	// Safe impossible cases
	// Check valid call of this method.
	DBG_ASSERT ( impl_debug_checkParameter ( rTopic, rText, bbeforeProgress )	, "ProgressMonitor::addText()\nCall without valid parameters!\n") ;
	DBG_ASSERT ( !(impl_searchTopic ( rTopic, bbeforeProgress ) != NULL )		, "ProgresMonitor::addText()\nThe text already exist.\n"		) ;

	// Do nothing (in Release), if topic already exist.
	if ( impl_searchTopic ( rTopic, bbeforeProgress ) != NULL )
	{
		return ;
	}

	// Else ... take memory for new item ...
	IMPL_TextlistItem*	pTextItem = new IMPL_TextlistItem ;

	if ( pTextItem != NULL )
	{
		// Set values ...
		pTextItem->sTopic	= rTopic ;
		pTextItem->sText	= rText	;

		// Ready for multithreading
		MutexGuard aGuard ( m_aMutex ) ;

		// ... and insert it in right list.
		if ( bbeforeProgress == sal_True )
		{
			m_pTextlist_Top->Insert    ( pTextItem, LIST_APPEND ) ;
		}
		else
		{
			m_pTextlist_Bottom->Insert ( pTextItem, LIST_APPEND ) ;
		}
	}

	// ... update window
	impl_rebuildFixedText	() ;
	impl_recalcLayout		() ;
}

//____________________________________________________________________________________________________________
//	XProgressMonitor
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::removeText ( const OUString& rTopic, sal_Bool bbeforeProgress ) throw( RuntimeException )
{
	// Safe impossible cases
	// Check valid call of this method.
	DBG_ASSERT ( impl_debug_checkParameter ( rTopic, bbeforeProgress ), "ProgressMonitor::removeText()\nCall without valid parameters!\n" ) ;

	// Search the topic ...
	IMPL_TextlistItem* pSearchItem = impl_searchTopic ( rTopic, bbeforeProgress ) ;

	if ( pSearchItem != NULL )
	{
		// Ready for multithreading
		MutexGuard aGuard ( m_aMutex ) ;

		// ... delete item from right list ...
		if ( bbeforeProgress == sal_True )
		{
			m_pTextlist_Top->Remove	   ( pSearchItem ) ;
		}
		else
		{
			m_pTextlist_Bottom->Remove ( pSearchItem ) ;
		}

		delete pSearchItem ;

		// ... and update window.
		impl_rebuildFixedText	() ;
		impl_recalcLayout		() ;
	}
}

//____________________________________________________________________________________________________________
//	XProgressMonitor
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::updateText ( const OUString& rTopic, const OUString& rText, sal_Bool bbeforeProgress ) throw( RuntimeException )
{
	// Safe impossible cases
	// Check valid call of this method.
	DBG_ASSERT ( impl_debug_checkParameter ( rTopic, rText, bbeforeProgress ), "ProgressMonitor::updateText()\nCall without valid parameters!\n" ) ;

	// Search topic ...
	IMPL_TextlistItem* pSearchItem = impl_searchTopic ( rTopic, bbeforeProgress ) ;

	if ( pSearchItem != NULL )
	{
		// Ready for multithreading
		MutexGuard aGuard ( m_aMutex ) ;

		// ... update text ...
		pSearchItem->sText = rText ;

		// ... and update window.
		impl_rebuildFixedText	() ;
		impl_recalcLayout		() ;
	}
}

//____________________________________________________________________________________________________________
//	XProgressBar
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::setForegroundColor ( sal_Int32 nColor ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard ( m_aMutex ) ;

	if ( m_xProgressBar.is () )
	{
		m_xProgressBar->setForegroundColor ( nColor ) ;
	}
}

//____________________________________________________________________________________________________________
//	XProgressBar
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::setBackgroundColor ( sal_Int32 nColor ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard ( m_aMutex ) ;

	if ( m_xProgressBar.is () )
	{
		m_xProgressBar->setBackgroundColor ( nColor ) ;
	}
}

//____________________________________________________________________________________________________________
//	XProgressBar
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::setValue ( sal_Int32 nValue ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard ( m_aMutex ) ;

	if ( m_xProgressBar.is () )
	{
		m_xProgressBar->setValue ( nValue ) ;
	}
}

//____________________________________________________________________________________________________________
//	XProgressBar
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::setRange ( sal_Int32 nMin, sal_Int32 nMax ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard ( m_aMutex ) ;

	if ( m_xProgressBar.is () )
	{
		m_xProgressBar->setRange ( nMin, nMax ) ;
	}
}

//____________________________________________________________________________________________________________
//	XProgressBar
//____________________________________________________________________________________________________________

sal_Int32 SAL_CALL ProgressMonitor::getValue () throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard ( m_aMutex ) ;

	if (m_xProgressBar.is())
	{
		return m_xProgressBar->getValue () ;
	}

	return 0 ;
}

//____________________________________________________________________________________________________________
//	XButton
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::addActionListener ( const Reference< XActionListener > & rListener ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard ( m_aMutex ) ;

	if ( m_xButton.is () )
	{
		m_xButton->addActionListener ( rListener ) ;
	}
}

//____________________________________________________________________________________________________________
//	XButton
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::removeActionListener ( const Reference< XActionListener > & rListener ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard ( m_aMutex ) ;

	if ( m_xButton.is () )
	{
		m_xButton->removeActionListener ( rListener ) ;
	}
}

//____________________________________________________________________________________________________________
//	XButton
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::setLabel ( const OUString& rLabel ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard ( m_aMutex ) ;

	if ( m_xButton.is () )
	{
		m_xButton->setLabel ( rLabel ) ;
	}
}

//____________________________________________________________________________________________________________
//	XButton
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::setActionCommand ( const OUString& rCommand ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard ( m_aMutex ) ;

	if ( m_xButton.is () )
	{
		m_xButton->setActionCommand ( rCommand ) ;
	}
}

//____________________________________________________________________________________________________________
//	XLayoutConstrains
//____________________________________________________________________________________________________________

Size SAL_CALL ProgressMonitor::getMinimumSize () throw( RuntimeException )
{
	return Size (DEFAULT_WIDTH, DEFAULT_HEIGHT) ;
}

//____________________________________________________________________________________________________________
//	XLayoutConstrains
//____________________________________________________________________________________________________________

Size SAL_CALL ProgressMonitor::getPreferredSize () throw( RuntimeException )
{
	// Ready for multithreading
	ClearableMutexGuard aGuard ( m_aMutex ) ;

	// get information about required place of child controls
	Reference< XLayoutConstrains > 	xTopicLayout_Top		( m_xTopic_Top		, UNO_QUERY ) ;
	Reference< XLayoutConstrains > 	xTopicLayout_Bottom		( m_xTopic_Bottom	, UNO_QUERY ) ;
	Reference< XLayoutConstrains > 	xButtonLayout			( m_xButton			, UNO_QUERY ) ;
	Reference< XWindow > 			xProgressBarWindow		( m_xProgressBar	, UNO_QUERY ) ;

	Size		aTopicSize_Top		=	xTopicLayout_Top->getPreferredSize			();
	Size		aTopicSize_Bottom	=	xTopicLayout_Bottom->getPreferredSize		();
	Size		aButtonSize			=	xButtonLayout->getPreferredSize		 		();
	Rectangle	aTempRectangle		=	xProgressBarWindow->getPosSize				();
	Size		aProgressBarSize	=	Size( aTempRectangle.Width, aTempRectangle.Height );

	aGuard.clear () ;

	// calc preferred size of progressmonitor
	sal_Int32	nWidth	=	0 ;
	sal_Int32	nHeight	=	0 ;

	nWidth	 =	3 * FREEBORDER			;
	nWidth	+=	aProgressBarSize.Width	;

	nHeight	 =	6 * FREEBORDER			;
	nHeight	+=	aTopicSize_Top.Height	;
	nHeight	+=	aProgressBarSize.Height	;
	nHeight	+=	aTopicSize_Bottom.Height;
	nHeight	+=	2						;	// 1 for black line, 1 for white line = 3D-Line!
	nHeight	+=	aButtonSize.Height		;

	// norm to minimum
	if ( nWidth<DEFAULT_WIDTH )
	{
		nWidth = DEFAULT_WIDTH ;
	}
	if ( nHeight<DEFAULT_HEIGHT )
	{
		nHeight = DEFAULT_HEIGHT ;
	}

	// return to caller
	return Size ( nWidth, nHeight ) ;
}

//____________________________________________________________________________________________________________
//	XLayoutConstrains
//____________________________________________________________________________________________________________

Size SAL_CALL ProgressMonitor::calcAdjustedSize ( const Size& /*rNewSize*/ ) throw( RuntimeException )
{
	return getPreferredSize () ;
}

//____________________________________________________________________________________________________________
//	XControl
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::createPeer ( const Reference< XToolkit > & rToolkit, const Reference< XWindowPeer > & rParent	) throw( RuntimeException )
{
	if (!getPeer().is())
	{
		BaseContainerControl::createPeer ( rToolkit, rParent ) ;

		// If user forget to call "setPosSize()", we have still a correct size.
		// And a "MinimumSize" IS A "MinimumSize"!
		// We change not the position of control at this point.
		Size aDefaultSize = getMinimumSize () ;
		setPosSize ( 0, 0, aDefaultSize.Width, aDefaultSize.Height, PosSize::SIZE ) ;
	}
}

//____________________________________________________________________________________________________________
//	XControl
//____________________________________________________________________________________________________________

sal_Bool SAL_CALL ProgressMonitor::setModel ( const Reference< XControlModel > & /*rModel*/ ) throw( RuntimeException )
{
	// We have no model.
	return sal_False ;
}

//____________________________________________________________________________________________________________
//	XControl
//____________________________________________________________________________________________________________

Reference< XControlModel > SAL_CALL ProgressMonitor::getModel () throw( RuntimeException )
{
	// We have no model.
	// return (XControlModel*)this ;
	return Reference< XControlModel >  () ;
}

//____________________________________________________________________________________________________________
//	XComponent
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::dispose () throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard ( m_aMutex ) ;

	// "removeControl()" control the state of a reference
	Reference< XControl >  xRef_Topic_Top		( m_xTopic_Top		, UNO_QUERY ) ;
	Reference< XControl >  xRef_Text_Top		( m_xText_Top		, UNO_QUERY ) ;
	Reference< XControl >  xRef_Topic_Bottom	( m_xTopic_Bottom	, UNO_QUERY ) ;
	Reference< XControl >  xRef_Text_Bottom		( m_xText_Bottom	, UNO_QUERY ) ;
	Reference< XControl >  xRef_Button			( m_xButton			, UNO_QUERY ) ;
	Reference< XControl >  xRef_ProgressBar		( m_xProgressBar	, UNO_QUERY ) ;

	removeControl ( xRef_Topic_Top	  	) ;
	removeControl ( xRef_Text_Top	  	) ;
	removeControl ( xRef_Topic_Bottom 	) ;
	removeControl ( xRef_Text_Bottom	) ;
	removeControl ( xRef_Button 		) ;
	removeControl ( xRef_ProgressBar	) ;

	// do'nt use "...->clear ()" or "... = XFixedText ()"
	// when other hold a reference at this object !!!
	xRef_Topic_Top->dispose 	() ;
	xRef_Text_Top->dispose 		() ;
	xRef_Topic_Bottom->dispose 	() ;
	xRef_Text_Bottom->dispose 	() ;
	xRef_Button->dispose		() ;
	xRef_ProgressBar->dispose	() ;

	BaseContainerControl::dispose () ;
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL ProgressMonitor::setPosSize ( sal_Int32 nX, sal_Int32 nY, sal_Int32 nWidth, sal_Int32 nHeight, sal_Int16 nFlags ) throw( RuntimeException )
{
	Rectangle	aBasePosSize = getPosSize () ;
	BaseContainerControl::setPosSize (nX, nY, nWidth, nHeight, nFlags) ;

	// if position or size changed
	if (
		( nWidth  != aBasePosSize.Width	) ||
		( nHeight != aBasePosSize.Height)
	   )
	{
		// calc new layout for controls
		impl_recalcLayout () ;
		// clear background (!)
		// [Childs was repainted in "recalcLayout" by setPosSize() automatically!]
		getPeer()->invalidate(2);
		// and repaint the control
		impl_paint ( 0, 0, impl_getGraphicsPeer() ) ;
	}
}

//____________________________________________________________________________________________________________
//	impl but public method to register service
//____________________________________________________________________________________________________________

const Sequence< OUString > ProgressMonitor::impl_getStaticSupportedServiceNames()
{
	MutexGuard aGuard( Mutex::getGlobalMutex() );
    Sequence< OUString > seqServiceNames( 1 );
    seqServiceNames.getArray() [0] = OUString::createFromAscii( SERVICENAME_PROGRESSMONITOR );
    return seqServiceNames ;
}

//____________________________________________________________________________________________________________
//	impl but public method to register service
//____________________________________________________________________________________________________________

const OUString ProgressMonitor::impl_getStaticImplementationName()
{
	return OUString::createFromAscii( IMPLEMENTATIONNAME_PROGRESSMONITOR );
}

//____________________________________________________________________________________________________________
//	protected method
//____________________________________________________________________________________________________________

void ProgressMonitor::impl_paint ( sal_Int32 nX, sal_Int32 nY, const Reference< XGraphics > & rGraphics )
{
	if (rGraphics.is())
	{
		// Ready for multithreading
		MutexGuard aGuard ( m_aMutex ) ;

		// paint shadowed border around the progressmonitor
		rGraphics->setLineColor ( LINECOLOR_SHADOW																) ;
		rGraphics->drawLine		( impl_getWidth()-1, impl_getHeight()-1, impl_getWidth()-1, nY 					) ;
		rGraphics->drawLine		( impl_getWidth()-1, impl_getHeight()-1, nX		   		  , impl_getHeight()-1	) ;

		rGraphics->setLineColor ( LINECOLOR_BRIGHT							) ;
		rGraphics->drawLine		( nX, nY, impl_getWidth(), nY 				) ;
		rGraphics->drawLine		( nX, nY, nX		  	 , impl_getHeight()	) ;

		// Paint 3D-line
		rGraphics->setLineColor ( LINECOLOR_SHADOW	) ;
		rGraphics->drawLine		( m_a3DLine.X, m_a3DLine.Y, m_a3DLine.X+m_a3DLine.Width, m_a3DLine.Y ) ;

		rGraphics->setLineColor ( LINECOLOR_BRIGHT	) ;
		rGraphics->drawLine		( m_a3DLine.X, m_a3DLine.Y+1, m_a3DLine.X+m_a3DLine.Width, m_a3DLine.Y+1 ) ;
	}
}

//____________________________________________________________________________________________________________
//	private method
//____________________________________________________________________________________________________________

void ProgressMonitor::impl_recalcLayout ()
{
	sal_Int32	nX_Button				;
	sal_Int32	nY_Button				;
	sal_Int32	nWidth_Button			;
	sal_Int32	nHeight_Button			;

	sal_Int32	nX_ProgressBar			;
	sal_Int32	nY_ProgressBar			;
	sal_Int32	nWidth_ProgressBar		;
	sal_Int32	nHeight_ProgressBar		;

	sal_Int32	nX_3DLine				;
	sal_Int32	nY_3DLine				;
	sal_Int32	nWidth_3DLine			;
	sal_Int32	nHeight_3DLine			;

	sal_Int32	nX_Text_Top				;
	sal_Int32	nY_Text_Top				;
	sal_Int32	nWidth_Text_Top			;
	sal_Int32	nHeight_Text_Top		;

	sal_Int32	nX_Topic_Top	 		;
	sal_Int32	nY_Topic_Top	 		;
	sal_Int32	nWidth_Topic_Top 		;
	sal_Int32	nHeight_Topic_Top		;

	sal_Int32	nX_Text_Bottom			;
	sal_Int32	nY_Text_Bottom			;
	sal_Int32	nWidth_Text_Bottom		;
	sal_Int32	nHeight_Text_Bottom		;

	sal_Int32	nX_Topic_Bottom	 		;
	sal_Int32	nY_Topic_Bottom	 		;
	sal_Int32	nWidth_Topic_Bottom 	;
	sal_Int32	nHeight_Topic_Bottom	;

	// Ready for multithreading
	MutexGuard aGuard ( m_aMutex ) ;

	// get information about required place of child controls
	Reference< XLayoutConstrains > 	xTopicLayout_Top	( m_xTopic_Top		, UNO_QUERY ) ;
	Reference< XLayoutConstrains > 	xTextLayout_Top		( m_xText_Top		, UNO_QUERY ) ;
	Reference< XLayoutConstrains > 	xTopicLayout_Bottom	( m_xTopic_Bottom	, UNO_QUERY ) ;
	Reference< XLayoutConstrains > 	xTextLayout_Bottom	( m_xText_Bottom	, UNO_QUERY ) ;
	Reference< XLayoutConstrains > 	xButtonLayout		( m_xButton			, UNO_QUERY ) ;

	Size	aTopicSize_Top		=	xTopicLayout_Top->getPreferredSize		() ;
	Size	aTextSize_Top		=	xTextLayout_Top->getPreferredSize		() ;
	Size	aTopicSize_Bottom	=	xTopicLayout_Bottom->getPreferredSize	() ;
	Size	aTextSize_Bottom	=	xTextLayout_Bottom->getPreferredSize	() ;
	Size	aButtonSize			=	xButtonLayout->getPreferredSize		 	() ;

	// calc position and size of child controls
	// Button has preferred size!
	nWidth_Button			=	aButtonSize.Width												;
	nHeight_Button			=	aButtonSize.Height												;

	// Left column before progressbar has preferred size and fixed position.
	// But "Width" is oriented on left column below progressbar to!!! "max(...)"
	nX_Topic_Top			=	FREEBORDER														;
	nY_Topic_Top			=	FREEBORDER														;
	nWidth_Topic_Top		=	Max ( aTopicSize_Top.Width, aTopicSize_Bottom.Width )			;
	nHeight_Topic_Top		=	aTopicSize_Top.Height											;

	// Right column before progressbar has relativ position to left column ...
	// ... and a size as rest of dialog size!
	nX_Text_Top				=	nX_Topic_Top+nWidth_Topic_Top+FREEBORDER						;
	nY_Text_Top				=	nY_Topic_Top													;
	nWidth_Text_Top			=	Max ( aTextSize_Top.Width, aTextSize_Bottom.Width )				;
	// Fix size of this column to minimum!
	sal_Int32 nSummaryWidth = nWidth_Text_Top+nWidth_Topic_Top+(3*FREEBORDER) ;
	if ( nSummaryWidth < DEFAULT_WIDTH )
		nWidth_Text_Top		=	DEFAULT_WIDTH-nWidth_Topic_Top-(3*FREEBORDER);
	// Fix size of column to maximum!
	if ( nSummaryWidth > impl_getWidth() )
		nWidth_Text_Top		=	impl_getWidth()-nWidth_Topic_Top-(3*FREEBORDER)					;
	nHeight_Text_Top		=	nHeight_Topic_Top												;

	// Position of progressbar is relativ to columns before.
	// Progressbar.Width  = Dialog.Width !!!
	// Progressbar.Height = Button.Height
	nX_ProgressBar			=	nX_Topic_Top													;
	nY_ProgressBar			=	nY_Topic_Top+nHeight_Topic_Top+FREEBORDER						;
	nWidth_ProgressBar		=	FREEBORDER+nWidth_Topic_Top+nWidth_Text_Top						;
	nHeight_ProgressBar		=	nHeight_Button													;

	// Oriented by left column before progressbar.
	nX_Topic_Bottom			=	nX_Topic_Top													;
	nY_Topic_Bottom			=	nY_ProgressBar+nHeight_ProgressBar+FREEBORDER					;
	nWidth_Topic_Bottom		=	nWidth_Topic_Top												;
	nHeight_Topic_Bottom	=	aTopicSize_Bottom.Height										;

	// Oriented by right column before progressbar.
	nX_Text_Bottom			=	nX_Topic_Bottom+nWidth_Topic_Bottom+FREEBORDER					;
	nY_Text_Bottom			=	nY_Topic_Bottom													;
	nWidth_Text_Bottom		=	nWidth_Text_Top													;
	nHeight_Text_Bottom		=	nHeight_Topic_Bottom											;

	// Oriented by progressbar.
	nX_3DLine				=	nX_Topic_Top													;
	nY_3DLine				=	nY_Topic_Bottom+nHeight_Topic_Bottom+(FREEBORDER/2)				;
	nWidth_3DLine			=	nWidth_ProgressBar												;
	nHeight_3DLine			=	1																;	// Height for ONE line ! (But we paint two lines!)

	// Oriented by progressbar.
	nX_Button				=	nX_ProgressBar+nWidth_ProgressBar-nWidth_Button					;
	nY_Button				=	nY_Topic_Bottom+nHeight_Topic_Bottom+FREEBORDER					;

	// Calc offsets to center controls
	sal_Int32	nDx	;
	sal_Int32	nDy	;

	nDx	=	( (2*FREEBORDER)+nWidth_ProgressBar																) ;
	nDy	=	( (6*FREEBORDER)+nHeight_Topic_Top+nHeight_ProgressBar+nHeight_Topic_Bottom+2+nHeight_Button	) ;

	// At this point use original dialog size to center controls!
	nDx	=	(impl_getWidth ()/2)-(nDx/2)	;
	nDy	=	(impl_getHeight()/2)-(nDy/2)	;

	if ( nDx<0 )
	{
		nDx=0 ;
	}
	if ( nDy<0 )
	{
		nDy=0 ;
	}

	// Set new position and size on all controls
	Reference< XWindow >  xRef_Topic_Top		( m_xTopic_Top		, UNO_QUERY ) ;
	Reference< XWindow >  xRef_Text_Top			( m_xText_Top 		, UNO_QUERY ) ;
	Reference< XWindow >  xRef_Topic_Bottom		( m_xTopic_Bottom	, UNO_QUERY ) ;
	Reference< XWindow >  xRef_Text_Bottom		( m_xText_Bottom 	, UNO_QUERY ) ;
	Reference< XWindow >  xRef_Button			( m_xButton			, UNO_QUERY ) ;
	Reference< XWindow >  xRef_ProgressBar		( m_xProgressBar	, UNO_QUERY ) ;

	xRef_Topic_Top->setPosSize		( nDx+nX_Topic_Top		, nDy+nY_Topic_Top		, nWidth_Topic_Top		, nHeight_Topic_Top	  	, 15 ) ;
	xRef_Text_Top->setPosSize		( nDx+nX_Text_Top		, nDy+nY_Text_Top		, nWidth_Text_Top		, nHeight_Text_Top		, 15 ) ;
	xRef_Topic_Bottom->setPosSize	( nDx+nX_Topic_Bottom	, nDy+nY_Topic_Bottom	, nWidth_Topic_Bottom	, nHeight_Topic_Bottom	, 15 ) ;
	xRef_Text_Bottom->setPosSize	( nDx+nX_Text_Bottom	, nDy+nY_Text_Bottom	, nWidth_Text_Bottom	, nHeight_Text_Bottom	, 15 ) ;
	xRef_Button->setPosSize			( nDx+nX_Button	 		, nDy+nY_Button	 		, nWidth_Button	 		, nHeight_Button	 	, 15 ) ;
	xRef_ProgressBar->setPosSize	( nDx+nX_ProgressBar	, nDy+nY_ProgressBar	, nWidth_ProgressBar	, nHeight_ProgressBar	, 15 ) ;

	m_a3DLine.X			= nDx+nX_Topic_Top											;
	m_a3DLine.Y			= nDy+nY_Topic_Bottom+nHeight_Topic_Bottom+(FREEBORDER/2)	;
	m_a3DLine.Width		= nWidth_ProgressBar										;
	m_a3DLine.Height	= nHeight_ProgressBar										;

	// All childcontrols make an implicit repaint in setPosSize()!
	// Make it also for this 3D-line ...
	Reference< XGraphics >  xGraphics = impl_getGraphicsPeer () ;

	xGraphics->setLineColor ( LINECOLOR_SHADOW	) ;
	xGraphics->drawLine		( m_a3DLine.X, m_a3DLine.Y, m_a3DLine.X+m_a3DLine.Width, m_a3DLine.Y ) ;

	xGraphics->setLineColor ( LINECOLOR_BRIGHT	) ;
	xGraphics->drawLine		( m_a3DLine.X, m_a3DLine.Y+1, m_a3DLine.X+m_a3DLine.Width, m_a3DLine.Y+1 ) ;
}

//____________________________________________________________________________________________________________
//	private method
//____________________________________________________________________________________________________________

void ProgressMonitor::impl_rebuildFixedText ()
{
	// Ready for multithreading
	MutexGuard aGuard ( m_aMutex ) ;

	// Rebuild fixedtext before progress

	// Rebuild left site of text
	if (m_xTopic_Top.is())
	{
		OUString		aCollectString	;

		// Collect all topics from list and format text.
		// "\n" MUST BE at the end of line!!! => Else ... topic and his text are not in the same line!!!
		for ( sal_uInt32 n=0; n<m_pTextlist_Top->Count(); ++n )
		{
			IMPL_TextlistItem* pSearchItem = m_pTextlist_Top->GetObject (n) ;
			aCollectString	+=	pSearchItem->sTopic ;
			aCollectString	+=	OUString::createFromAscii("\n")			    ;
		}
		aCollectString	+=	OUString::createFromAscii("\0")	;	// It's better :-)

		m_xTopic_Top->setText ( aCollectString ) ;
	}

	// Rebuild right site of text
	if (m_xText_Top.is())
	{
		OUString		aCollectString	;

		// Collect all topics from list and format text.
		// "\n" MUST BE at the end of line!!! => Else ... topic and his text are not in the same line!!!
		for ( sal_uInt32 n=0; n<m_pTextlist_Top->Count(); ++n )
		{
			IMPL_TextlistItem* pSearchItem = m_pTextlist_Top->GetObject (n) ;
			aCollectString	+=	pSearchItem->sText ;
			aCollectString	+=	OUString::createFromAscii("\n")			   ;
		}
		aCollectString	+=	OUString::createFromAscii("\0")	;	// It's better :-)

		m_xText_Top->setText ( aCollectString ) ;
	}

	// Rebuild fixedtext below progress

	// Rebuild left site of text
	if (m_xTopic_Bottom.is())
	{
		OUString		aCollectString	;

		// Collect all topics from list and format text.
		// "\n" MUST BE at the end of line!!! => Else ... topic and his text are not in the same line!!!
		for ( sal_uInt32 n=0; n<m_pTextlist_Bottom->Count(); ++n )
		{
			IMPL_TextlistItem* pSearchItem = m_pTextlist_Bottom->GetObject (n) ;
			aCollectString	+=	pSearchItem->sTopic ;
			aCollectString	+=	OUString::createFromAscii("\n")			    ;
		}
		aCollectString	+=	OUString::createFromAscii("\0")	;	// It's better :-)

		m_xTopic_Bottom->setText ( aCollectString ) ;
	}

	// Rebuild right site of text
	if (m_xText_Bottom.is())
	{
		OUString		aCollectString	;

		// Collect all topics from list and format text.
		// "\n" MUST BE at the end of line!!! => Else ... topic and his text are not in the same line!!!
		for ( sal_uInt32 n=0; n<m_pTextlist_Bottom->Count(); ++n )
		{
			IMPL_TextlistItem* pSearchItem = m_pTextlist_Bottom->GetObject (n) ;
			aCollectString	+=	pSearchItem->sText ;
			aCollectString	+=	OUString::createFromAscii("\n")			   ;
		}
		aCollectString	+=	OUString::createFromAscii("\0")	;	// It's better :-)

		m_xText_Bottom->setText ( aCollectString ) ;
	}
}

//____________________________________________________________________________________________________________
//	private method
//____________________________________________________________________________________________________________

void ProgressMonitor::impl_cleanMemory ()
{
	// Ready for multithreading
	MutexGuard aGuard ( m_aMutex ) ;

	// Delete all of lists.

	sal_uInt32 nPosition ;

	for ( nPosition = 0; nPosition < m_pTextlist_Top->Count () ; ++nPosition )
	{
		IMPL_TextlistItem* pSearchItem = m_pTextlist_Top->GetObject ( nPosition ) ;
		delete pSearchItem ;
	}
	m_pTextlist_Top->Clear () ;
	delete m_pTextlist_Top ;

	for ( nPosition = 0; nPosition < m_pTextlist_Bottom->Count () ; ++nPosition )
	{
		IMPL_TextlistItem* pSearchItem = m_pTextlist_Bottom->GetObject ( nPosition ) ;
		delete pSearchItem ;
	}
	m_pTextlist_Bottom->Clear () ;
	delete m_pTextlist_Bottom ;
}

//____________________________________________________________________________________________________________
//	private method
//____________________________________________________________________________________________________________

IMPL_TextlistItem* ProgressMonitor::impl_searchTopic ( const OUString& rTopic, sal_Bool bbeforeProgress	)
{
	// Get right textlist for following operations.
	IMPL_Textlist* pTextList ;

	// Ready for multithreading
	ClearableMutexGuard aGuard ( m_aMutex ) ;

	if ( bbeforeProgress == sal_True )
	{
		pTextList = m_pTextlist_Top    ;
	}
	else
	{
		pTextList = m_pTextlist_Bottom ;
	}

	// Switch off guard.
	aGuard.clear () ;

	// Search the topic in textlist.
	sal_uInt32	nPosition	=	0					;
	sal_uInt32	nCount		=	pTextList->Count ()	;

	for ( nPosition = 0; nPosition < nCount ; ++nPosition )
	{
		IMPL_TextlistItem* pSearchItem = pTextList->GetObject ( nPosition ) ;

		if ( pSearchItem->sTopic == rTopic )
		{
			// We have found this topic ... return a valid pointer.
			return pSearchItem ;
		}
	}

	// We have'nt found this topic ... return a nonvalid pointer.
	return NULL ;
}

//____________________________________________________________________________________________________________
//	debug methods
//____________________________________________________________________________________________________________

#ifdef DBG_UTIL

// addText, updateText
sal_Bool ProgressMonitor::impl_debug_checkParameter ( const OUString& rTopic, const OUString& rText, sal_Bool /*bbeforeProgress*/ )
{
	// Check "rTopic"
	if ( &rTopic		==	NULL	) return sal_False ;	// NULL-pointer for reference ???!!!
	if ( rTopic.getLength ()	<	1		) return sal_False ;	// ""

	// Check "rText"
	if ( &rText			==	NULL	) return sal_False ;	// NULL-pointer for reference ???!!!
	if ( rText.getLength ()	<	1		) return sal_False ;	// ""

	// "bbeforeProgress" is valid in everyway!

	// Parameter OK ... return sal_True.
	return sal_True ;
}

// removeText
sal_Bool ProgressMonitor::impl_debug_checkParameter ( const OUString& rTopic, sal_Bool /*bbeforeProgress*/ )
{
	// Check "rTopic"
	if ( &rTopic		==	NULL	) return sal_False ;	// NULL-pointer for reference ???!!!
	if ( rTopic.getLength ()	<	1		) return sal_False ;	// ""

	// "bbeforeProgress" is valid in everyway!

	// Parameter OK ... return sal_True.
	return sal_True ;
}

#endif	// #ifdef DBG_UTIL

}	// namespace unocontrols
