/**************************************************************
 * 
 * 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 automaticly 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 automaticly 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() automaticly!]
		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
