/**************************************************************
 * 
 * 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 "progressbar.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 <tools/debug.hxx>
#include <cppuhelper/typeprovider.hxx>

#include <math.h>
#include <limits.h>

//____________________________________________________________________________________________________________
//	includes of my project
//____________________________________________________________________________________________________________

//____________________________________________________________________________________________________________
//	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
//____________________________________________________________________________________________________________

ProgressBar::ProgressBar( const Reference< XMultiServiceFactory >& xFactory )
	: BaseControl		 	(	 xFactory					)
	, m_bHorizontal			(	 DEFAULT_HORIZONTAL			)
	, m_aBlockSize			(	 DEFAULT_BLOCKDIMENSION		)
	, m_nForegroundColor	(	 DEFAULT_FOREGROUNDCOLOR	)
	, m_nBackgroundColor	(	 DEFAULT_BACKGROUNDCOLOR	)
	, m_nMinRange		 	(	 DEFAULT_MINRANGE			)
	, m_nMaxRange		 	(	 DEFAULT_MAXRANGE			)
	, m_nBlockValue		 	(	 DEFAULT_BLOCKVALUE			)
	, m_nValue		 	 	(	 DEFAULT_VALUE				)
{
}

ProgressBar::~ProgressBar()
{
}

//____________________________________________________________________________________________________________
//	XInterface
//____________________________________________________________________________________________________________

Any SAL_CALL ProgressBar::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 = BaseControl::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 ProgressBar::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 ProgressBar::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 ProgressBar::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< XControlModel	>*)NULL )	,
												  		::getCppuType(( const Reference< XProgressBar	>*)NULL )	,
														BaseControl::getTypes()
													);
			// ... and set his address to static pointer!
			pTypeCollection = &aTypeCollection ;
		}
	}

	return pTypeCollection->getTypes();
}

//____________________________________________________________________________________________________________
//	XAggregation
//____________________________________________________________________________________________________________

Any SAL_CALL ProgressBar::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< XControlModel*	> ( this )	,
									   		static_cast< XProgressBar*	> ( this )
										)
				);

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

	return aReturn ;
}

//____________________________________________________________________________________________________________
//	XProgressBar
//____________________________________________________________________________________________________________

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

	// Safe color for later use.
	m_nForegroundColor = nColor ;

	// Repaint control
	impl_paint ( 0, 0, impl_getGraphicsPeer() ) ;
}

//____________________________________________________________________________________________________________
//	XProgressBar
//____________________________________________________________________________________________________________

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

	// Safe color for later use.
	m_nBackgroundColor = nColor ;

	// Repaint control
	impl_paint ( 0, 0, impl_getGraphicsPeer() ) ;
}

//____________________________________________________________________________________________________________
//	XProgressBar
//____________________________________________________________________________________________________________

void SAL_CALL ProgressBar::setValue ( sal_Int32 nValue ) throw( RuntimeException )
{
	// This method is defined for follow things:
	//		1) Values >= _nMinRange
	//		2) Values <= _nMaxRange

	// Ready for multithreading
	MutexGuard aGuard (m_aMutex) ;

	// save impossible cases
	// This method is only defined for valid values
	DBG_ASSERT ( (( nValue >= m_nMinRange ) && ( nValue <= m_nMaxRange )), "ProgressBar::setValue()\nNot valid value.\n" ) ;

	// If new value not valid ... do nothing in release version!
	if (
		( nValue >= m_nMinRange ) &&
		( nValue <= m_nMaxRange )
	   )
	{
		// New value is ok => save this
		m_nValue = nValue ;

		// Repaint to display changes
		impl_paint ( 0, 0, impl_getGraphicsPeer() ) ;
	}
}

//____________________________________________________________________________________________________________
//	XProgressBar
//____________________________________________________________________________________________________________

void SAL_CALL ProgressBar::setRange ( sal_Int32 nMin, sal_Int32 nMax ) throw( RuntimeException )
{
	// This method is defined for follow things:
	//		1) All values of sal_Int32
	//		2) Min < Max
	//		3) Min > Max

	// save impossible cases
	// This method is only defined for valid values
	// If you ignore this, the release version wil produce an error "division by zero" in "ProgressBar::setValue()"!
	DBG_ASSERT ( ( nMin != nMax ) , "ProgressBar::setRange()\nValues for MIN and MAX are the same. This is not allowed!\n" ) ;

	// Ready for multithreading
	MutexGuard	aGuard (m_aMutex) ;

	// control the values for min and max
	if ( nMin < nMax )
	{
		// Take correct Min and Max
		m_nMinRange = nMin	;
		m_nMaxRange = nMax	;
	}
	else
	{
		// Change Min and Max automaticly
		m_nMinRange = nMax	;
		m_nMaxRange = nMin	;
	}

    // assure that m_nValue is within the range
	if (!(m_nMinRange < m_nValue  &&  m_nValue < m_nMaxRange))
		m_nValue = m_nMinRange;
    
    impl_recalcRange () ;

	// Do not repaint the control at this place!!!
	// An old "m_nValue" is set and can not be correct for this new range.
	// Next call of "ProgressBar::setValue()" do this.
}

//____________________________________________________________________________________________________________
//	XProgressBar
//____________________________________________________________________________________________________________

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

	return ( m_nValue ) ;
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL ProgressBar::setPosSize ( sal_Int32 nX, sal_Int32 nY, sal_Int32 nWidth, sal_Int32 nHeight, sal_Int16 nFlags ) throw( RuntimeException )
{
	// Take old size BEFORE you set the new values at baseclass!
	// You will control changes. At the other way, the values are the same!
	Rectangle aBasePosSize = getPosSize () ;
	BaseControl::setPosSize (nX, nY, nWidth, nHeight, nFlags) ;

	// Do only, if size has changed.
	if (
		( nWidth  != aBasePosSize.Width		) ||
		( nHeight != aBasePosSize.Height	)
	   )
	{
		impl_recalcRange	(							) ;
		impl_paint 			( 0, 0, impl_getGraphicsPeer ()	) ;
	}
}

//____________________________________________________________________________________________________________
//	XControl
//____________________________________________________________________________________________________________

sal_Bool SAL_CALL ProgressBar::setModel( const Reference< XControlModel >& /*xModel*/ ) throw( RuntimeException )
{
	// A model is not possible for this control.
	return sal_False ;
}

//____________________________________________________________________________________________________________
//	XControl
//____________________________________________________________________________________________________________

Reference< XControlModel > SAL_CALL ProgressBar::getModel() throw( RuntimeException )
{
	// A model is not possible for this control.
	return Reference< XControlModel >();
}

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

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

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

const OUString ProgressBar::impl_getStaticImplementationName()
{
	return OUString::createFromAscii( IMPLEMENTATIONNAME_PROGRESSBAR );
}

//____________________________________________________________________________________________________________
//	protected method
//____________________________________________________________________________________________________________

void ProgressBar::impl_paint ( sal_Int32 nX, sal_Int32 nY, const Reference< XGraphics > & rGraphics )
{
	// save impossible cases
	DBG_ASSERT ( rGraphics.is(), "ProgressBar::paint()\nCalled with invalid Reference< XGraphics > ." ) ;

	// This paint method ist not buffered !!
	// Every request paint the completely control. ( but only, if peer exist )
 	if ( rGraphics.is () )
	{
		MutexGuard	aGuard (m_aMutex) ;

		// Clear background
		// (same color for line and fill)
		rGraphics->setFillColor ( m_nBackgroundColor						) ;
		rGraphics->setLineColor ( m_nBackgroundColor						) ;
		rGraphics->drawRect		( nX, nY, impl_getWidth(), impl_getHeight()	) ;

		// same color for line and fill for blocks
		rGraphics->setFillColor ( m_nForegroundColor ) ;
		rGraphics->setLineColor ( m_nForegroundColor ) ;

        sal_Int32   nBlockStart     =   0                                                                           ;   // = left site of new block
        sal_Int32   nBlockCount     =   m_nBlockValue!=0.00 ? (sal_Int32)((m_nValue-m_nMinRange)/m_nBlockValue) : 0 ;   // = number of next block

		// Draw horizontal progressbar
		// decision in "recalcRange()"
		if (m_bHorizontal)
		{
			// Step to left side of window
			nBlockStart	= nX ;

			for ( sal_Int16 i=1; i<=nBlockCount; ++i )
			{
				// step free field
				nBlockStart	+=	FREESPACE	;
				// paint block
				rGraphics->drawRect (nBlockStart, nY+FREESPACE, m_aBlockSize.Width, m_aBlockSize.Height) ;
				// step next free field
				nBlockStart	+=	m_aBlockSize.Width ;
			}
		}
		// draw vertikal progressbar
		// decision in "recalcRange()"
		else
		{
			// step to bottom side of window
			nBlockStart	 =	nY+impl_getHeight() ;
			nBlockStart	-=	m_aBlockSize.Height ;

			for ( sal_Int16 i=1; i<=nBlockCount; ++i )
			{
				// step free field
				nBlockStart	-=	FREESPACE	;
				// paint block
				rGraphics->drawRect (nX+FREESPACE, nBlockStart, m_aBlockSize.Width, m_aBlockSize.Height) ;
				// step next free field
				nBlockStart	-=	m_aBlockSize.Height;
			}
		}

		// Paint shadow border around the progressbar
		rGraphics->setLineColor ( LINECOLOR_SHADOW  						) ;
		rGraphics->drawLine		( nX, nY, impl_getWidth(), nY 				) ;
		rGraphics->drawLine		( nX, nY, nX		  	 , impl_getHeight() ) ;

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

//____________________________________________________________________________________________________________
//	protected method
//____________________________________________________________________________________________________________

void ProgressBar::impl_recalcRange ()
{
	MutexGuard	aGuard (m_aMutex) ;

    sal_Int32 nWindowWidth  = impl_getWidth()  ;
    sal_Int32 nWindowHeight = impl_getHeight() ;
    double    fBlockHeight                     ;
    double    fBlockWidth                      ;
    double    fMaxBlocks                       ;

    if( nWindowWidth > nWindowHeight )
	{
        m_bHorizontal = sal_True                            ;
        fBlockHeight  = (nWindowHeight-(2*FREESPACE))       ;
        fBlockWidth   = fBlockHeight                        ;
        fMaxBlocks    = nWindowWidth/(fBlockWidth+FREESPACE);
    }
    else
    {
        m_bHorizontal = sal_False                             ;
        fBlockWidth   = (nWindowWidth-(2*FREESPACE))          ;
        fBlockHeight  = fBlockWidth                           ;
        fMaxBlocks    = nWindowHeight/(fBlockHeight+FREESPACE);
    }

    double fRange       = m_nMaxRange-m_nMinRange    ;
    double fBlockValue  = fRange/fMaxBlocks          ;

    m_nBlockValue       = fBlockValue            ;
    m_aBlockSize.Height = (sal_Int32)fBlockHeight;
    m_aBlockSize.Width  = (sal_Int32)fBlockWidth ;
/*
		// Calculate count of blocks for actual size
		// (prevent error "division by zero")
		if ( nHeight == 0 )
		{
			nHeight = 1 ;
		}

		nMaxBlock	 =	nWidth / nHeight	;
		nMaxBlock	*=	2					;

		// prevent error "division by zero"
		if ( nMaxBlock == 0 )
		{
			nMaxBlock = 1 ;
		}

		// Calculate new value and new size for ONE block.

		// Do not a calculation like this: "m_nBlockValue=(m_nMaxRange-m_nMinRange)/nMaxBlock"	!
		// If difference between m_nMaxRange and m_nMinRange to large, it give an overflow and a
		// following error "division by zero" in method "paint() ... nBlockCount=nDifference/m_nBlockValue ..."

		// Overflow ? => example: _I32_MAX - _I32_MIN = -1 and not _UI32_MAX !!!

		m_nBlockValue		=	( m_nMaxRange / nMaxBlock ) - ( m_nMinRange / nMaxBlock ) ;
		m_aBlockSize.Height	=	( nHeight - ( FREESPACE * 2 )							) ;
		m_aBlockSize.Width	=	( ( nWidth / nMaxBlock ) - FREESPACE					) ;
	}
	else
	{
		// Don't forget to save this state! Used in "ProgressBar::paint()"
		m_bHorizontal = sal_False ;

        double fBlockWidth  = (nHeight-(2*FREESPACE))       ;
        double fBlockHeight = fBlockWidth                   ;
        double fRange       = m_nMaxRange-m_nMinRange       ;
        double fBlockValue  = fRange/(fBlockWidth+FREESPACE);

        m_nBlockValue       = fBlockValue            ;
        m_aBlockSize.Height = (sal_Int32)fBlockHeight;
        m_aBlockSize.Width  = (sal_Int32)fBlockWidth ;

		// Calculate count of blocks for actual size
		// (prevent error "division by zero")
		if ( nWidth == 0 )
		{
			nWidth = 1 ;
		}

		nMaxBlock	 =	nHeight / nWidth	;
		nMaxBlock	*=	2					;

		// prevent error "division by zero"
		if ( nMaxBlock == 0 )
		{
			nMaxBlock = 1 ;
		}

		// Calculate new value and new size for ONE block.

		// Do not a calculation like this: "m_nBlockValue=(m_nMaxRange-m_nMinRange)/nMaxBlock"	!
		// If difference between m_nMaxRange and m_nMinRange to large, it give an overflow and a
		// following error "division by zero" in method "paint() ... nBlockCount=nDifference/m_nBlockValue ..."

		// Overflow ? => example: _I32_MAX - _I32_MIN = -1 and not _UI32_MAX !!!

		m_nBlockValue		=	( m_nMaxRange / nMaxBlock ) - ( m_nMinRange / nMaxBlock ) ;
		m_aBlockSize.Height	=	( ( nHeight / nMaxBlock ) - FREESPACE					) ;
		m_aBlockSize.Width	=	( nWidth - ( FREESPACE * 2 )							) ;

	}
*/
}

}	// namespace unocontrols
