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

#undef SC_DLLIMPLEMENTATION



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

#include "scitems.hxx"
#include <vcl/msgbox.hxx>

#include "global.hxx"
#include "globstr.hrc"
#include "uiitems.hxx"
#include "docsh.hxx"
#include "document.hxx"
#include "docoptio.hxx"
#include "scresid.hxx"
#include "sc.hrc"       // -> Slot-IDs
#include "optdlg.hrc"

#define _TPCALC_CXX
#include "tpcalc.hxx"
#undef _TPCALC_CXX

#include <math.h>

// STATIC DATA -----------------------------------------------------------

static sal_uInt16 pCalcOptRanges[] =
{
	SID_SCDOCOPTIONS,
	SID_SCDOCOPTIONS,
	0
};

//========================================================================

ScTpCalcOptions::ScTpCalcOptions( Window*			pParent,
								  const SfxItemSet& rCoreAttrs )

	:	SfxTabPage		( pParent,
						  ScResId( RID_SCPAGE_CALC ),
						  rCoreAttrs ),

		aGbZRefs		( this, ScResId( GB_ZREFS ) ),
		aBtnIterate 	( this, ScResId( BTN_ITERATE ) ),
		aFtSteps		( this, ScResId( FT_STEPS ) ),
		aEdSteps		( this, ScResId( ED_STEPS ) ),
		aFtEps			( this, ScResId( FT_EPS ) ),
		aEdEps			( this, ScResId( ED_EPS ) ),
        aSeparatorFL    ( this, ScResId( FL_SEPARATOR ) ),
		aGbDate 		( this, ScResId( GB_DATE ) ),
		aBtnDateStd 	( this, ScResId( BTN_DATESTD ) ),
		aBtnDateSc10	( this, ScResId( BTN_DATESC10 ) ),
		aBtnDate1904	( this, ScResId( BTN_DATE1904 ) ),
        aHSeparatorFL   ( this, ScResId( FL_H_SEPARATOR ) ),
		aBtnCase	 	( this, ScResId( BTN_CASE ) ),
		aBtnCalc	 	( this, ScResId( BTN_CALC ) ),
		aBtnMatch	 	( this, ScResId( BTN_MATCH ) ),
        aBtnRegex       ( this, ScResId( BTN_REGEX ) ),
		aBtnLookUp   	( this, ScResId( BTN_LOOKUP ) ),
        aBtnGeneralPrec ( this, ScResId( BTN_GENERAL_PREC ) ),
		aFtPrec 		( this, ScResId( FT_PREC ) ),
		aEdPrec 		( this, ScResId( ED_PREC ) ),
		pOldOptions 	( new ScDocOptions(
							((const ScTpCalcItem&)rCoreAttrs.Get(
								GetWhich( SID_SCDOCOPTIONS ))).
									GetDocOptions() ) ),
		pLocalOptions	( new ScDocOptions ),
		nWhichCalc		( GetWhich( SID_SCDOCOPTIONS ) )
{
    aSeparatorFL.SetStyle( aSeparatorFL.GetStyle() | WB_VERT );
    Init();
	FreeResource();
	SetExchangeSupport();
}

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

__EXPORT ScTpCalcOptions::~ScTpCalcOptions()
{
	delete pOldOptions;
	delete pLocalOptions;
}

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

void ScTpCalcOptions::Init()
{
	aBtnIterate .SetClickHdl( LINK( this, ScTpCalcOptions, CheckClickHdl ) );
    aBtnGeneralPrec.SetClickHdl( LINK(this, ScTpCalcOptions, CheckClickHdl) );
	aBtnDateStd .SetClickHdl( LINK( this, ScTpCalcOptions, RadioClickHdl ) );
	aBtnDateSc10.SetClickHdl( LINK( this, ScTpCalcOptions, RadioClickHdl ) );
	aBtnDate1904.SetClickHdl( LINK( this, ScTpCalcOptions, RadioClickHdl ) );
}

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

sal_uInt16* __EXPORT ScTpCalcOptions::GetRanges()
{
	return pCalcOptRanges;
}

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

SfxTabPage* __EXPORT ScTpCalcOptions::Create( Window* pParent, const SfxItemSet& rAttrSet )
{
	return ( new ScTpCalcOptions( pParent, rAttrSet ) );
}

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

void __EXPORT ScTpCalcOptions::Reset( const SfxItemSet& /* rCoreAttrs */ )
{
	sal_uInt16	d,m,y;

	*pLocalOptions	= *pOldOptions;

	aBtnCase   .Check( !pLocalOptions->IsIgnoreCase() );
	aBtnCalc   .Check( pLocalOptions->IsCalcAsShown() );
	aBtnMatch  .Check( pLocalOptions->IsMatchWholeCell() );
    aBtnRegex  .Check( pLocalOptions->IsFormulaRegexEnabled() );
	aBtnLookUp .Check( pLocalOptions->IsLookUpColRowNames() );
	aBtnIterate.Check( pLocalOptions->IsIter() );
	aEdSteps   .SetValue( pLocalOptions->GetIterCount() );
    aEdEps     .SetValue( pLocalOptions->GetIterEps(), 6 );

	pLocalOptions->GetDate( d, m, y );

	switch ( y )
	{
		case 1899:
			aBtnDateStd.Check();
			break;
		case 1900:
			aBtnDateSc10.Check();
			break;
		case 1904:
			aBtnDate1904.Check();
			break;
	}

    sal_uInt16 nPrec = pLocalOptions->GetStdPrecision();
    if (nPrec == SvNumberFormatter::UNLIMITED_PRECISION)
    {
        aFtPrec.Disable();
        aEdPrec.Disable();
        aBtnGeneralPrec.Check(false);
    }
    else
    {
        aBtnGeneralPrec.Check();
        aFtPrec.Enable();
        aEdPrec.Enable();
        aEdPrec.SetValue(nPrec);
    }

	CheckClickHdl( &aBtnIterate );
}


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

sal_Bool __EXPORT ScTpCalcOptions::FillItemSet( SfxItemSet& rCoreAttrs )
{
	// alle weiteren Optionen werden in den Handlern aktualisiert
	pLocalOptions->SetIterCount( (sal_uInt16)aEdSteps.GetValue() );
	pLocalOptions->SetIgnoreCase( !aBtnCase.IsChecked() );
	pLocalOptions->SetCalcAsShown( aBtnCalc.IsChecked() );
	pLocalOptions->SetMatchWholeCell( aBtnMatch.IsChecked() );
    pLocalOptions->SetFormulaRegexEnabled( aBtnRegex.IsChecked() );
	pLocalOptions->SetLookUpColRowNames( aBtnLookUp.IsChecked() );

    if (aBtnGeneralPrec.IsChecked())
        pLocalOptions->SetStdPrecision(
            static_cast<sal_uInt16>(aEdPrec.GetValue()) );
    else
        pLocalOptions->SetStdPrecision( SvNumberFormatter::UNLIMITED_PRECISION );

	if ( *pLocalOptions != *pOldOptions )
	{
		rCoreAttrs.Put( ScTpCalcItem( nWhichCalc, *pLocalOptions ) );
		return sal_True;
	}
	else
		return sal_False;
}

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

int __EXPORT ScTpCalcOptions::DeactivatePage( SfxItemSet* pSetP )
{
    int nReturn = KEEP_PAGE;

    double fEps;
    if( aEdEps.GetValue( fEps ) && (fEps > 0.0) )
    {
        pLocalOptions->SetIterEps( fEps );
        nReturn = LEAVE_PAGE;
    }

	if ( nReturn == KEEP_PAGE )
	{
		ErrorBox( this,
				  WinBits( WB_OK | WB_DEF_OK ),
				  ScGlobal::GetRscString( STR_INVALID_EPS )
				).Execute();

		aEdEps.GrabFocus();
	}
    else if ( pSetP )
        FillItemSet( *pSetP );

	return nReturn;
}

//-----------------------------------------------------------------------
// Handler:

IMPL_LINK( ScTpCalcOptions, RadioClickHdl, RadioButton*, pBtn )
{
	if ( pBtn == &aBtnDateStd )
	{
		pLocalOptions->SetDate( 30, 12, 1899 );
	}
	else if ( pBtn == &aBtnDateSc10 )
	{
		pLocalOptions->SetDate( 1, 1, 1900 );
	}
	else if ( pBtn == &aBtnDate1904 )
	{
		pLocalOptions->SetDate( 1, 1, 1904 );
	}

	return 0;
}

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

IMPL_LINK( ScTpCalcOptions, CheckClickHdl, CheckBox*, pBtn )
{
    if (pBtn == &aBtnGeneralPrec)
	{
        if (pBtn->IsChecked())
        {
            aEdPrec.Enable();
            aFtPrec.Enable();
        }
        else
        {
            aEdPrec.Disable();
            aFtPrec.Disable();
        }
	}
    else if (pBtn == &aBtnIterate)
	{
        if ( pBtn->IsChecked() )
        {
            pLocalOptions->SetIter( sal_True );
            aFtSteps.Enable();	aEdSteps.Enable();
            aFtEps	.Enable();	aEdEps	.Enable();
        }
        else
        {
            pLocalOptions->SetIter( sal_False );
            aFtSteps.Disable(); aEdSteps.Disable();
            aFtEps	.Disable(); aEdEps	.Disable();
        }
	}

	return 0;
}




