/**************************************************************
 * 
 * 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 "tptable.hxx"
#include "global.hxx"
#include "attrib.hxx"
#include "scresid.hxx"
#include "sc.hrc"
#include "pagedlg.hrc"

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

void EmptyNumericField::Modify()
{
    if( GetText().Len() )
        NumericField::Modify();
    else
        SetEmptyFieldValue();
}

void EmptyNumericField::SetValue( sal_Int64 nValue )
{
    if( nValue == 0 )
        SetEmptyFieldValue();
    else
        NumericField::SetValue( nValue );
}

sal_Int64 EmptyNumericField::GetValue() const
{
    return IsEmptyFieldValue() ? 0 : NumericField::GetValue();
}

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

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

static sal_uInt16 pPageTableRanges[] =
{
	ATTR_PAGE_NOTES, ATTR_PAGE_FIRSTPAGENO,
	0
};

sal_Bool lcl_PutVObjModeItem( sal_uInt16			nWhich,
						  SfxItemSet&		rCoreSet,
						  const SfxItemSet&	rOldSet,
						  const CheckBox&	rBtn );

sal_Bool lcl_PutScaleItem( sal_uInt16				nWhich,
					   SfxItemSet&			rCoreSet,
					   const SfxItemSet&	rOldSet,
                       const ListBox&       rListBox,
                       sal_uInt16               nLBEntry,
                       const SpinField&     rEd,
                       sal_uInt16               nValue );

sal_Bool lcl_PutScaleItem2( sal_uInt16               nWhich,
                       SfxItemSet&          rCoreSet,
                       const SfxItemSet&    rOldSet,
                       const ListBox&       rListBox,
                       sal_uInt16               nLBEntry,
                       const NumericField&  rEd1,
                       const NumericField&  rEd2 );

sal_Bool lcl_PutBoolItem( sal_uInt16			nWhich,
					  SfxItemSet&		rCoreSet,
					  const SfxItemSet&	rOldSet,
					  sal_Bool				bIsChecked,
					  sal_Bool				bSavedValue );

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

#define PAGENO_HDL 			LINK(this,ScTablePage,PageNoHdl)
#define PAGEDIR_HDL 		LINK(this,ScTablePage,PageDirHdl)
#define SCALE_HDL			LINK(this,ScTablePage,ScaleHdl)

#define WAS_DEFAULT(w,s)    (SFX_ITEM_DEFAULT==(s).GetItemState((w),sal_True))
#define GET_BOOL(sid,set)	((const SfxBoolItem&)((set).Get(GetWhich((sid))))).GetValue()
#define GET_USHORT(sid,set)	(sal_uInt16)((const SfxUInt16Item&)((set).Get(GetWhich((sid))))).GetValue()
#define GET_SHOW(sid,set) 	( ScVObjMode( ((const ScViewObjectModeItem&)((set).Get(GetWhich((sid))))).GetValue() ) \
							  == VOBJ_MODE_SHOW )

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

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

        SfxTabPage( pParent, ScResId( RID_SCPAGE_TABLE ), rCoreAttrs ),

        aFlPageDir          ( this, ScResId( FL_PAGEDIR ) ),
		aBtnTopDown 		( this, ScResId( BTN_TOPDOWN ) ),
		aBtnLeftRight		( this, ScResId( BTN_LEFTRIGHT ) ),
		aBmpPageDir 		( this, ScResId( BMP_PAGEDIR ) ),
		aImgLeftRight		( ScResId( IMG_LEFTRIGHT ) ),
		aImgTopDown 		( ScResId( IMG_TOPDOWN ) ),
        aImgLeftRightHC     ( ScResId( IMG_LEFTRIGHT_H ) ),
        aImgTopDownHC       ( ScResId( IMG_TOPDOWN_H ) ),
		aBtnPageNo			( this, ScResId( BTN_PAGENO ) ),
		aEdPageNo			( this, ScResId( ED_PAGENO ) ),
        aFlPrint            ( this, ScResId( FL_PRINT ) ),
		aBtnHeaders 		( this, ScResId( BTN_HEADER ) ),
		aBtnGrid			( this, ScResId( BTN_GRID ) ),
		aBtnNotes			( this, ScResId( BTN_NOTES ) ),
		aBtnObjects 		( this, ScResId( BTN_OBJECTS ) ),
		aBtnCharts			( this, ScResId( BTN_CHARTS ) ),
		aBtnDrawings		( this, ScResId( BTN_DRAWINGS ) ),
		aBtnFormulas		( this, ScResId( BTN_FORMULAS ) ),
		aBtnNullVals		( this, ScResId( BTN_NULLVALS ) ),
        aFlScale            ( this, ScResId( FL_SCALE ) ),
        aFtScaleMode        ( this, ScResId( FT_SCALEMODE ) ),
        aLbScaleMode        ( this, ScResId( LB_SCALEMODE ) ),
        aFtScaleAll         ( this, ScResId( FT_SCALEFACTOR ) ),
		aEdScaleAll 		( this, ScResId( ED_SCALEALL ) ),
        aFtScalePageWidth   ( this, ScResId( FT_SCALEPAGEWIDTH ) ),
        aEdScalePageWidth   ( this, ScResId( ED_SCALEPAGEWIDTH ) ),
        aFtScalePageHeight  ( this, ScResId( FT_SCALEPAGEHEIGHT ) ),
        aEdScalePageHeight  ( this, ScResId( ED_SCALEPAGEHEIGHT ) ),
        aFtScalePageNum     ( this, ScResId( FT_SCALEPAGENUM ) ),
        aEdScalePageNum     ( this, ScResId( ED_SCALEPAGENUM ) )
{
	SetExchangeSupport();
    aBtnPageNo.SetClickHdl( PAGENO_HDL );
    aBtnTopDown.SetClickHdl( PAGEDIR_HDL );
    aBtnLeftRight.SetClickHdl( PAGEDIR_HDL );
    aLbScaleMode.SetSelectHdl( SCALE_HDL );

    Size aBmpSize = Image( ScResId( IMG_LEFTRIGHT ) ).GetSizePixel();
    aBmpPageDir.SetOutputSizePixel( aBmpSize );

	FreeResource();

	aEdPageNo.SetAccessibleName(aBtnPageNo.GetText());
	aEdPageNo.SetAccessibleRelationLabeledBy(&aBtnPageNo);
}

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

void ScTablePage::ShowImage()
{
    bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode();
    bool bLeftRight = aBtnLeftRight.IsChecked();
    aBmpPageDir.SetImage( bHC ?
        (bLeftRight ? aImgLeftRightHC : aImgTopDownHC) :
        (bLeftRight ? aImgLeftRight : aImgTopDown) );
}

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

ScTablePage::~ScTablePage()
{
}

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

sal_uInt16* ScTablePage::GetRanges()
{
	return pPageTableRanges;
}

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

SfxTabPage* ScTablePage::Create( Window* pParent, const SfxItemSet& rCoreSet )
{
	return ( new ScTablePage( pParent, rCoreSet ) );
}

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

void ScTablePage::Reset( const SfxItemSet& rCoreSet )
{
	sal_Bool	bTopDown = GET_BOOL( SID_SCATTR_PAGE_TOPDOWN, rCoreSet );
	sal_uInt16	nWhich   = 0;

	//-----------
	// sal_Bool-Flags
	//-----------
	aBtnNotes		.Check( GET_BOOL(SID_SCATTR_PAGE_NOTES,rCoreSet) );
	aBtnGrid		.Check( GET_BOOL(SID_SCATTR_PAGE_GRID,rCoreSet) );
	aBtnHeaders 	.Check( GET_BOOL(SID_SCATTR_PAGE_HEADERS,rCoreSet) );
	aBtnFormulas	.Check( GET_BOOL(SID_SCATTR_PAGE_FORMULAS,rCoreSet) );
	aBtnNullVals	.Check( GET_BOOL(SID_SCATTR_PAGE_NULLVALS,rCoreSet) );
	aBtnTopDown 	.Check( bTopDown );
	aBtnLeftRight	.Check( !bTopDown );

	//------------------
	// Erste Druckseite:
	//------------------
	sal_uInt16 nPage = GET_USHORT(SID_SCATTR_PAGE_FIRSTPAGENO,rCoreSet);
	aBtnPageNo.Check( nPage != 0 );
	aEdPageNo.SetValue( (nPage != 0) ? nPage : 1 );
	PageNoHdl( NULL );

	//-------------------
	// Objektdarstellung:
	//-------------------
	aBtnCharts		.Check( GET_SHOW( SID_SCATTR_PAGE_CHARTS, rCoreSet ) );
	aBtnObjects 	.Check( GET_SHOW( SID_SCATTR_PAGE_OBJECTS, rCoreSet ) );
	aBtnDrawings	.Check( GET_SHOW( SID_SCATTR_PAGE_DRAWINGS, rCoreSet ) );

	//------------
	// Skalierung:
	//------------

	nWhich = GetWhich(SID_SCATTR_PAGE_SCALE);
	if ( rCoreSet.GetItemState( nWhich, sal_True ) >= SFX_ITEM_AVAILABLE )
	{
		sal_uInt16 nScale = ((const SfxUInt16Item&)rCoreSet.Get(nWhich)).GetValue();
        if( nScale > 0 )
            aLbScaleMode.SelectEntryPos( SC_TPTABLE_SCALE_PERCENT );
        aEdScaleAll.SetValue( (nScale > 0) ? nScale : 100 );
	}

    nWhich = GetWhich(SID_SCATTR_PAGE_SCALETO);
    if ( rCoreSet.GetItemState( nWhich, sal_True ) >= SFX_ITEM_AVAILABLE )
    {
        const ScPageScaleToItem& rItem = static_cast< const ScPageScaleToItem& >( rCoreSet.Get( nWhich ) );
        sal_uInt16 nWidth = rItem.GetWidth();
        sal_uInt16 nHeight = rItem.GetHeight();

        /*  width==0 and height==0 is invalid state, used as "not selected".
            Dialog shows width=height=1 then. */
        bool bValid = nWidth || nHeight;
        if( bValid )
            aLbScaleMode.SelectEntryPos( SC_TPTABLE_SCALE_TO );
        aEdScalePageWidth.SetValue( bValid ? nWidth : 1 );
        aEdScalePageHeight.SetValue( bValid ? nHeight : 1 );
    }

	nWhich = GetWhich(SID_SCATTR_PAGE_SCALETOPAGES);
	if ( rCoreSet.GetItemState( nWhich, sal_True ) >= SFX_ITEM_AVAILABLE )
	{
		sal_uInt16 nPages = ((const SfxUInt16Item&)rCoreSet.Get(nWhich)).GetValue();
        if( nPages > 0 )
            aLbScaleMode.SelectEntryPos( SC_TPTABLE_SCALE_TO_PAGES );
        aEdScalePageNum.SetValue( (nPages > 0) ? nPages : 1 );
	}

    if( aLbScaleMode.GetSelectEntryCount() == 0 )
    {
        // fall back to 100%
        DBG_ERRORFILE( "ScTablePage::Reset - missing scaling item" );
        aLbScaleMode.SelectEntryPos( SC_TPTABLE_SCALE_PERCENT );
        aEdScaleAll.SetValue( 100 );
    }

	PageDirHdl( NULL );
	ScaleHdl( NULL );

	// merken fuer FillItemSet
	aBtnFormulas	.SaveValue();
	aBtnNullVals	.SaveValue();
	aBtnNotes		.SaveValue();
	aBtnGrid		.SaveValue();
	aBtnHeaders 	.SaveValue();
	aBtnTopDown 	.SaveValue();
	aBtnLeftRight	.SaveValue();
    aLbScaleMode    .SaveValue();
	aBtnCharts		.SaveValue();
	aBtnObjects 	.SaveValue();
	aBtnDrawings	.SaveValue();
	aBtnPageNo		.SaveValue();
	aEdPageNo		.SaveValue();
	aEdScaleAll		.SaveValue();
    aEdScalePageWidth.SaveValue();
    aEdScalePageHeight.SaveValue();
	aEdScalePageNum	.SaveValue();
}

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

sal_Bool ScTablePage::FillItemSet( SfxItemSet& rCoreSet )
{
	const SfxItemSet&	rOldSet		 = GetItemSet();
	sal_uInt16				nWhichPageNo = GetWhich(SID_SCATTR_PAGE_FIRSTPAGENO);
	sal_Bool				bDataChanged = sal_False;

	//-----------
	// sal_Bool-Flags
	//-----------

	bDataChanged |= lcl_PutBoolItem( GetWhich(SID_SCATTR_PAGE_NOTES),
									 rCoreSet, rOldSet,
									 aBtnNotes.IsChecked(),
                                     aBtnNotes.GetSavedValue() != STATE_NOCHECK );

	bDataChanged |= lcl_PutBoolItem( GetWhich(SID_SCATTR_PAGE_GRID),
									 rCoreSet, rOldSet,
									 aBtnGrid.IsChecked(),
                                     aBtnGrid.GetSavedValue() != STATE_NOCHECK );

	bDataChanged |= lcl_PutBoolItem( GetWhich(SID_SCATTR_PAGE_HEADERS),
									 rCoreSet, rOldSet,
									 aBtnHeaders.IsChecked(),
                                     aBtnHeaders.GetSavedValue() != STATE_NOCHECK );

	bDataChanged |= lcl_PutBoolItem( GetWhich(SID_SCATTR_PAGE_TOPDOWN),
									 rCoreSet, rOldSet,
									 aBtnTopDown.IsChecked(),
									 aBtnTopDown.GetSavedValue() );

	bDataChanged |= lcl_PutBoolItem( GetWhich(SID_SCATTR_PAGE_FORMULAS),
									 rCoreSet, rOldSet,
									 aBtnFormulas.IsChecked(),
                                     aBtnFormulas.GetSavedValue() != STATE_NOCHECK );

	bDataChanged |= lcl_PutBoolItem( GetWhich(SID_SCATTR_PAGE_NULLVALS),
									 rCoreSet, rOldSet,
									 aBtnNullVals.IsChecked(),
                                     aBtnNullVals.GetSavedValue() != STATE_NOCHECK );

	//------------------
	// Erste Druckseite:
	//------------------
	sal_Bool bUseValue = aBtnPageNo.IsChecked();

	if (   WAS_DEFAULT(nWhichPageNo,rOldSet)
		&& (	(!bUseValue && bUseValue == aBtnPageNo.GetSavedValue())
			|| (   bUseValue && bUseValue == aBtnPageNo.GetSavedValue()
				&& aEdPageNo.GetText() == aEdPageNo.GetSavedValue() ) ) )
	{
			rCoreSet.ClearItem( nWhichPageNo );
	}
	else
	{
		sal_uInt16 nPage = (sal_uInt16)( aBtnPageNo.IsChecked()
									? aEdPageNo.GetValue()
									: 0 );

		rCoreSet.Put( SfxUInt16Item( nWhichPageNo, nPage ) );
		bDataChanged = sal_True;
	}

	//-------------------
	// Objektdarstellung:
	//-------------------

	bDataChanged |= lcl_PutVObjModeItem( GetWhich(SID_SCATTR_PAGE_CHARTS),
										 rCoreSet, rOldSet, aBtnCharts );

	bDataChanged |= lcl_PutVObjModeItem( GetWhich(SID_SCATTR_PAGE_OBJECTS),
										 rCoreSet, rOldSet, aBtnObjects );

	bDataChanged |= lcl_PutVObjModeItem( GetWhich(SID_SCATTR_PAGE_DRAWINGS),
										 rCoreSet, rOldSet, aBtnDrawings );

	//------------
	// Skalierung:
	//------------

    if( !aEdScalePageWidth.GetValue() && !aEdScalePageHeight.GetValue() )
    {
        aLbScaleMode.SelectEntryPos( SC_TPTABLE_SCALE_PERCENT );
        aEdScaleAll.SetValue( 100 );
    }

	bDataChanged |= lcl_PutScaleItem( GetWhich(SID_SCATTR_PAGE_SCALE),
									  rCoreSet, rOldSet,
                                      aLbScaleMode, SC_TPTABLE_SCALE_PERCENT,
                                      aEdScaleAll, (sal_uInt16)aEdScaleAll.GetValue() );

    bDataChanged |= lcl_PutScaleItem2( GetWhich(SID_SCATTR_PAGE_SCALETO),
                                      rCoreSet, rOldSet,
                                      aLbScaleMode, SC_TPTABLE_SCALE_TO,
                                      aEdScalePageWidth, aEdScalePageHeight );

	bDataChanged |= lcl_PutScaleItem( GetWhich(SID_SCATTR_PAGE_SCALETOPAGES),
									  rCoreSet, rOldSet,
                                      aLbScaleMode, SC_TPTABLE_SCALE_TO_PAGES,
                                      aEdScalePageNum, (sal_uInt16)aEdScalePageNum.GetValue() );

	return bDataChanged;
}

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

int ScTablePage::DeactivatePage( SfxItemSet* pSetP )
{
    if ( pSetP )
        FillItemSet( *pSetP );

	return LEAVE_PAGE;
}

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

void ScTablePage::DataChanged( const DataChangedEvent& rDCEvt )
{
    if( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
        ShowImage();
    SfxTabPage::DataChanged( rDCEvt );
}

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

IMPL_LINK( ScTablePage, PageDirHdl, RadioButton*, EMPTYARG )
{
    ShowImage();
	return 0;
}

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

IMPL_LINK( ScTablePage, PageNoHdl, CheckBox*, pBtn )
{
	if ( aBtnPageNo.IsChecked() )
	{
		aEdPageNo.Enable();
		if ( pBtn )
			aEdPageNo.GrabFocus();
	}
	else
		aEdPageNo.Disable();

	return 0;
}

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

IMPL_LINK( ScTablePage, ScaleHdl, ListBox*, EMPTYARG )
{
    // controls for "Reduce/enlarge"
    bool bPercent = (aLbScaleMode.GetSelectEntryPos() == SC_TPTABLE_SCALE_PERCENT);
    aFtScaleAll.Show( bPercent );
    aEdScaleAll.Show( bPercent );

    // controls for "Scale to width/height"
    bool bScaleTo = (aLbScaleMode.GetSelectEntryPos() == SC_TPTABLE_SCALE_TO);
    aFtScalePageWidth.Show( bScaleTo );
    aEdScalePageWidth.Show( bScaleTo );
    aFtScalePageHeight.Show( bScaleTo );
    aEdScalePageHeight.Show( bScaleTo );

    // controls for "Scale to pages"
    bool bScalePages = (aLbScaleMode.GetSelectEntryPos() == SC_TPTABLE_SCALE_TO_PAGES);
    aFtScalePageNum.Show( bScalePages );
    aEdScalePageNum.Show( bScalePages );

	return 0;
}

//========================================================================
// Hilfsfunktionen fuer FillItemSet:
//========================================================================

sal_Bool lcl_PutBoolItem( sal_uInt16			nWhich,
					 SfxItemSet&		rCoreSet,
					 const SfxItemSet&	rOldSet,
					 sal_Bool				bIsChecked,
					 sal_Bool				bSavedValue )
{
	sal_Bool bDataChanged = (   bSavedValue == bIsChecked
						 && WAS_DEFAULT(nWhich,rOldSet) );

	if ( bDataChanged )
		rCoreSet.ClearItem(nWhich);
	else
		rCoreSet.Put( SfxBoolItem( nWhich, bIsChecked ) );

	return bDataChanged;
}

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

sal_Bool lcl_PutVObjModeItem( sal_uInt16			nWhich,
						 SfxItemSet&		rCoreSet,
						 const SfxItemSet&	rOldSet,
						 const CheckBox&	rBtn )
{
	sal_Bool bIsChecked   = rBtn.IsChecked();
	sal_Bool bDataChanged = (   rBtn.GetSavedValue() == bIsChecked
						 && WAS_DEFAULT(nWhich,rOldSet) );

	if ( bDataChanged )
		rCoreSet.ClearItem( nWhich );

	else
		rCoreSet.Put( ScViewObjectModeItem( nWhich, bIsChecked
													? VOBJ_MODE_SHOW
													: VOBJ_MODE_HIDE ) );
	return bDataChanged;
}

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

sal_Bool lcl_PutScaleItem( sal_uInt16				nWhich,
					  SfxItemSet&			rCoreSet,
					  const SfxItemSet&		rOldSet,
                      const ListBox&        rListBox,
                      sal_uInt16                nLBEntry,
                      const SpinField&      rEd,
                      sal_uInt16                nValue )
{
    sal_Bool bIsSel = (rListBox.GetSelectEntryPos() == nLBEntry);
    sal_Bool bDataChanged = (rListBox.GetSavedValue() != nLBEntry) ||
                        (rEd.GetSavedValue() != rEd.GetText()) ||
                        !WAS_DEFAULT( nWhich, rOldSet );

    if( bDataChanged )
        rCoreSet.Put( SfxUInt16Item( nWhich, bIsSel ? nValue : 0 ) );
    else
        rCoreSet.ClearItem( nWhich );

	return bDataChanged;
}


sal_Bool lcl_PutScaleItem2( sal_uInt16               nWhich,
                      SfxItemSet&           rCoreSet,
                      const SfxItemSet&     rOldSet,
                      const ListBox&        rListBox,
                      sal_uInt16                nLBEntry,
                      const NumericField&   rEd1,
                      const NumericField&   rEd2 )
{
    sal_uInt16 nValue1 = (sal_uInt16)rEd1.GetValue();
    sal_uInt16 nValue2 = (sal_uInt16)rEd2.GetValue();
    sal_Bool bIsSel = (rListBox.GetSelectEntryPos() == nLBEntry);
    sal_Bool bDataChanged = (rListBox.GetSavedValue() != nLBEntry) ||
                        (rEd1.GetSavedValue() != rEd1.GetText()) ||
                        (rEd2.GetSavedValue() != rEd2.GetText()) ||
                        !WAS_DEFAULT( nWhich, rOldSet );

    if( bDataChanged )
    {
        ScPageScaleToItem aItem;
        if( bIsSel )
            aItem.Set( nValue1, nValue2 );
        rCoreSet.Put( aItem );
    }
    else
        rCoreSet.ClearItem( nWhich );

    return bDataChanged;
}



