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



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"

#include <vcl/outdev.hxx>
#include <vcl/window.hxx>
#include <vcl/decoview.hxx>
#include <vcl/svapp.hxx>
#include "cbutton.hxx"

//========================================================================
//	class ScDDComboBoxButton
//========================================================================

ScDDComboBoxButton::ScDDComboBoxButton( OutputDevice* pOutputDevice )
	:	pOut( pOutputDevice )
{
	SetOptSizePixel();
}

// -------------------------------------------------------------------------

__EXPORT ScDDComboBoxButton::~ScDDComboBoxButton()
{
}

// -------------------------------------------------------------------------

void ScDDComboBoxButton::SetOutputDevice( OutputDevice* pOutputDevice )
{
    pOut = pOutputDevice;
}

// -------------------------------------------------------------------------

void ScDDComboBoxButton::SetOptSizePixel()
{
	aBtnSize = pOut->LogicToPixel( Size(0,11), MAP_APPFONT );
	//aBtnSize.Width() = GetSystemMetrics( SM_CXVSCROLL ) - 1; // Win SDK-Funktion
	aBtnSize.Width() = pOut->GetSettings().GetStyleSettings().GetScrollBarSize();
}

// -------------------------------------------------------------------------

void ScDDComboBoxButton::Draw( const Point&	rAt,
							   const Size&	rSize,
                               sal_Bool         bState,
							   sal_Bool			bBtnIn  /* = sal_False */ )
{
    if ( rSize.Width() == 0 || rSize.Height() == 0 )
        return;     // #i43092# rectangle with size 0 would have RECT_EMPTY as end position

	// save old state
	sal_Bool		bHadFill   = pOut->IsFillColor();
	Color		aOldFill   = pOut->GetFillColor();
	sal_Bool		bHadLine   = pOut->IsLineColor();
	Color		aOldLine   = pOut->GetLineColor();
	sal_Bool		bOldEnable = pOut->IsMapModeEnabled();

	Size		aLogPix( 1, 1 );
	Rectangle	aBtnRect( rAt, rSize );
	Rectangle	aInnerRect = aBtnRect;

	pOut->EnableMapMode( sal_False );

	DecorationView aDecoView( pOut);

	sal_uInt16 nButtonStyle = BUTTON_DRAW_DEFAULT;
	if( bBtnIn )	// gedrueckt?
	{
		nButtonStyle = BUTTON_DRAW_PRESSED;
	}

	aInnerRect=aDecoView.DrawButton( aBtnRect, nButtonStyle );


	aInnerRect.Left()   += 1;
	aInnerRect.Top()    += 1;
	aInnerRect.Right()  -= 1;
	aInnerRect.Bottom() -= 1;

	Size  aInnerSize   = aInnerRect.GetSize();
	Point aInnerCenter = aInnerRect.Center();

	aInnerRect.Top()   = aInnerCenter.Y() - (aInnerSize.Width()>>1);
	aInnerRect.Bottom()= aInnerCenter.Y() + (aInnerSize.Width()>>1);

    ImpDrawArrow( aInnerRect, bState );


	// restore old state
	pOut->EnableMapMode( bOldEnable );
	if (bHadLine)
		pOut->SetLineColor(aOldLine);
	else
		pOut->SetLineColor();
	if (bHadFill)
		pOut->SetFillColor(aOldFill);
	else
		pOut->SetFillColor();
}

//------------------------------------------------------------------------

void ScDDComboBoxButton::ImpDrawArrow( const Rectangle& rRect,
                                       sal_Bool             bState )
{
	// no need to save old line and fill color here (is restored after the call)

	Rectangle	aPixRect = rRect;
	Point		aCenter  = aPixRect.Center();
	Size      	aSize    = aPixRect.GetSize();

	Size aSize3;
	aSize3.Width() = aSize.Width() >> 1;
	aSize3.Height() = aSize.Height() >> 1;

	Size aSize4;
	aSize4.Width() = aSize.Width() >> 2;
	aSize4.Height() = aSize.Height() >> 2;

	Rectangle aTempRect = aPixRect;

    const StyleSettings& rSett = Application::GetSettings().GetStyleSettings();
    Color aColor( bState ? COL_LIGHTBLUE : rSett.GetButtonTextColor().GetColor() );
    pOut->SetFillColor( aColor );
    pOut->SetLineColor( aColor );

	aTempRect.Left()   = aCenter.X() - aSize4.Width();
	aTempRect.Right()  = aCenter.X() + aSize4.Width();
	aTempRect.Top()    = aCenter.Y() - aSize3.Height();
	aTempRect.Bottom() = aCenter.Y() - 1;

	pOut->DrawRect( aTempRect );

	Point aPos1( aCenter.X()-aSize3.Width(), aCenter.Y() );
	Point aPos2( aCenter.X()+aSize3.Width(), aCenter.Y() );
	while( aPos1.X() <= aPos2.X() )
	{
		pOut->DrawLine( aPos1, aPos2 );
		aPos1.X()++; aPos2.X()--;
		aPos1.Y()++; aPos2.Y()++;
	}

	pOut->DrawLine( Point( aCenter.X() - aSize3.Width(), aPos1.Y()+1 ),
					Point( aCenter.X() + aSize3.Width(), aPos1.Y()+1 ) );
}
