/**************************************************************
 *
 * 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_scui.hxx"




#include "global.hxx"
#include "document.hxx"
#include "attrib.hxx"
#include "scresid.hxx"
#include "sc.hrc"

#include "attrdlg.hrc"
#include "tabpages.hxx"

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

static sal_uInt16 pProtectionRanges[] =
{
	SID_SCATTR_PROTECTION,
	SID_SCATTR_PROTECTION,
	0
};

//========================================================================
// Zellschutz-Tabpage:
//========================================================================

ScTabPageProtection::ScTabPageProtection( Window*			pParent,
										  const SfxItemSet& rCoreAttrs )
	:	SfxTabPage			( pParent,
							  ScResId( RID_SCPAGE_PROTECTION ),
							  rCoreAttrs ),
		//
        aFlProtect          ( this, ScResId( FL_PROTECTION      ) ),
		aBtnHideCell		( this, ScResId( BTN_HIDE_ALL 		) ),
		aBtnProtect 		( this, ScResId( BTN_PROTECTED		) ),
		aBtnHideFormula 	( this, ScResId( BTN_HIDE_FORMULAR	) ),
		aTxtHint			( this, ScResId( FT_HINT			) ),
        aFlPrint            ( this, ScResId( FL_PRINT           ) ),
		aBtnHidePrint		( this, ScResId( BTN_HIDE_PRINT		) ),
        aTxtHint2           ( this, ScResId( FT_HINT2           ) )
{
	// diese Page braucht ExchangeSupport
	SetExchangeSupport();

	//	States werden in Reset gesetzt
	bTriEnabled = bDontCare = bProtect = bHideForm = bHideCell = bHidePrint = sal_False;

	aBtnProtect.SetClickHdl(	 LINK( this, ScTabPageProtection, ButtonClickHdl ) );
	aBtnHideCell.SetClickHdl(	 LINK( this, ScTabPageProtection, ButtonClickHdl ) );
	aBtnHideFormula.SetClickHdl( LINK( this, ScTabPageProtection, ButtonClickHdl ) );
	aBtnHidePrint.SetClickHdl(	 LINK( this, ScTabPageProtection, ButtonClickHdl ) );

	FreeResource();
}

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

__EXPORT ScTabPageProtection::~ScTabPageProtection()
{
}

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

sal_uInt16* __EXPORT ScTabPageProtection::GetRanges()
{
	return pProtectionRanges;
}

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

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

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

void __EXPORT ScTabPageProtection::Reset( const SfxItemSet& rCoreAttrs )
{
	//	Variablen initialisieren

	sal_uInt16 nWhich = GetWhich( SID_SCATTR_PROTECTION );
	const ScProtectionAttr* pProtAttr = NULL;
	SfxItemState eItemState = rCoreAttrs.GetItemState( nWhich, sal_False,
										  (const SfxPoolItem**)&pProtAttr );

	// handelt es sich um ein Default-Item?
	if ( eItemState == SFX_ITEM_DEFAULT )
		pProtAttr = (const ScProtectionAttr*)&(rCoreAttrs.Get(nWhich));
	// bei SFX_ITEM_DONTCARE auf 0 lassen

	bTriEnabled = ( pProtAttr == NULL );				// TriState, wenn DontCare
	bDontCare = bTriEnabled;
	if (bTriEnabled)
	{
		//	Defaults, die erscheinen wenn ein TriState weggeklickt wird:
		//	(weil alles zusammen ein Attribut ist, kann auch nur alles zusammen
		//	auf DontCare stehen - #38543#)
		bProtect = sal_True;
		bHideForm = bHideCell = bHidePrint = sal_False;
	}
	else
	{
		bProtect = pProtAttr->GetProtection();
		bHideCell = pProtAttr->GetHideCell();
		bHideForm = pProtAttr->GetHideFormula();
		bHidePrint = pProtAttr->GetHidePrint();
	}

	//	Controls initialisieren

	aBtnProtect		.EnableTriState( bTriEnabled );
	aBtnHideCell	.EnableTriState( bTriEnabled );
	aBtnHideFormula	.EnableTriState( bTriEnabled );
	aBtnHidePrint	.EnableTriState( bTriEnabled );

	UpdateButtons();
}

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

sal_Bool __EXPORT ScTabPageProtection::FillItemSet( SfxItemSet& rCoreAttrs )
{
	sal_Bool 				bAttrsChanged	= sal_False;
	sal_uInt16				nWhich			= GetWhich( SID_SCATTR_PROTECTION );
	const SfxPoolItem*	pOldItem		= GetOldItem( rCoreAttrs, SID_SCATTR_PROTECTION );
	const SfxItemSet&	rOldSet			= GetItemSet();
	SfxItemState		eItemState		= rOldSet.GetItemState( nWhich, sal_False );
	ScProtectionAttr	aProtAttr;

	if ( !bDontCare )
	{
		aProtAttr.SetProtection( bProtect );
		aProtAttr.SetHideCell( bHideCell );
		aProtAttr.SetHideFormula( bHideForm );
		aProtAttr.SetHidePrint( bHidePrint );

		if ( bTriEnabled )
			bAttrsChanged = sal_True;					// DontCare -> richtiger Wert
		else
			bAttrsChanged = !pOldItem || !( aProtAttr == *(const ScProtectionAttr*)pOldItem );
	}

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

	if ( bAttrsChanged )
		rCoreAttrs.Put( aProtAttr );
	else if ( eItemState == SFX_ITEM_DEFAULT )
		rCoreAttrs.ClearItem( nWhich );

	return bAttrsChanged;
}

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

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

	return LEAVE_PAGE;
}

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

IMPL_LINK( ScTabPageProtection, ButtonClickHdl, TriStateBox*, pBox )
{
	TriState eState = pBox->GetState();
	if ( eState == STATE_DONTKNOW )
		bDontCare = sal_True;							// alles zusammen auf DontCare
	else
	{
		bDontCare = sal_False;							// DontCare ueberall aus
		sal_Bool bOn = ( eState == STATE_CHECK );		// ausgewaehlter Wert

		if ( pBox == &aBtnProtect )
			bProtect = bOn;
		else if ( pBox == &aBtnHideCell )
			bHideCell = bOn;
		else if ( pBox == &aBtnHideFormula )
			bHideForm = bOn;
		else if ( pBox == &aBtnHidePrint )
			bHidePrint = bOn;
		else
		{
			DBG_ERRORFILE("falscher Button");
		}
	}

	UpdateButtons();		// TriState und Enable-Logik

	return 0;
}

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

void ScTabPageProtection::UpdateButtons()
{
	if ( bDontCare )
	{
		aBtnProtect.SetState( STATE_DONTKNOW );
		aBtnHideCell.SetState( STATE_DONTKNOW );
		aBtnHideFormula.SetState( STATE_DONTKNOW );
		aBtnHidePrint.SetState( STATE_DONTKNOW );
	}
	else
	{
		aBtnProtect.SetState( bProtect ? STATE_CHECK : STATE_NOCHECK );
		aBtnHideCell.SetState( bHideCell ? STATE_CHECK : STATE_NOCHECK );
		aBtnHideFormula.SetState( bHideForm ? STATE_CHECK : STATE_NOCHECK );
		aBtnHidePrint.SetState( bHidePrint ? STATE_CHECK : STATE_NOCHECK );
	}

	sal_Bool bEnable = ( aBtnHideCell.GetState() != STATE_CHECK );
	{
		aBtnProtect.Enable( bEnable );
		aBtnHideFormula.Enable( bEnable );
	}
}
