// EIKTIME.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <badesca.h>
#include <eiktime.h>
#include <eikenv.h>
#include <eikbutb.h>
#include <eiklabel.h>
#include <eikwsel.h>
#include <eikchlst.h>
#include <eikpanic.h>
#include <eiktime.hrh>
#include <eikdialg.hrh>
#include <eikpriv.hrh>
#include <eikon.rsg>

//
//	class TEikTimeOptions
//

EXPORT_C void TEikTimeOptions::InternalizeL(RReadStream& aStream)
//
//	Read from a stream only those values that will be saved bewtween sessions
//
	{
	iDistance=(TWldDistanceUnits)aStream.ReadInt32L();
	iCurrentView=(TEikTimeViewChoice)aStream.ReadInt32L();
	iClock=(TClockFormat)aStream.ReadInt32L();
	iUseDefaultAlarmTime=aStream.ReadInt32L();
	iDefaultAlarmHour=aStream.ReadInt32L();
	iDefaultAlarmMinute=aStream.ReadInt32L();
	aStream >> iDefaultSound;
	iToolbarVisible=aStream.ReadInt32L();
	}

EXPORT_C void TEikTimeOptions::ExternalizeL(RWriteStream& aStream) const
//
//	Write to a stream only those values that will be saved bewtween sessions
//
	{
	aStream.WriteInt32L(iDistance);
	aStream.WriteInt32L(iCurrentView);
	aStream.WriteInt32L(iClock);
	aStream.WriteInt32L(iUseDefaultAlarmTime);
	aStream.WriteInt32L(iDefaultAlarmHour);
	aStream.WriteInt32L(iDefaultAlarmMinute);
	aStream << iDefaultSound;
	aStream.WriteInt32L(iToolbarVisible);
	}

//
//	class CEikTimeDialog
//

EXPORT_C CEikTimeDialog::CEikTimeDialog()
//
//	C'tor.
//	
	{
	__DECLARE_NAME(_S("CEikTimeDialog"));
	}

EXPORT_C void CEikTimeDialog::DoSetLabelText(TInt aTagId,TInt aMessageId)
//
//	Set the text of any tag control to match a given resource ID.
//
	{
	CEikLabel* label=(CEikLabel*)Control(aTagId);
	TEikTimeBuffer buf;
	iEikonEnv->ReadResource(buf,aMessageId);
	label->SetTextL(buf);
	}

//
//	class CEikTimeDialogSetCity
//


CEikTimeDialogSetCity::CEikTimeDialogSetCity()
//
//	C'tor.
//
	{
	__DECLARE_NAME(_S("CEikTimeDialogSetCity"));
	}


EXPORT_C CEikTimeDialogSetCity* CEikTimeDialogSetCity::NewL()
	{
	CEikTimeDialogSetCity* dialog= new(ELeave) CEikTimeDialogSetCity;
	return dialog;
	}


EXPORT_C TBool CEikTimeDialogSetCity::SetCityLD(TCityName& aCity,TCountryName& aCountry,TInt aTitleResource, TInt aDescriptResource)
//
//	Run the dialog.
//
	{
	TBool retVal=EFalse;
	iChanged=&retVal;
	iCity=&aCity;
	iCountry=&aCountry;
	iTitleResourceId=aTitleResource;
	iDescriptResourceId=aDescriptResource;
	ExecuteLD(R_EIK_TIME_DLG_SET_CITY);
	return(retVal);
	}

void CEikTimeDialogSetCity::PreLayoutDynInitL()
//
//	Initialize the dialog values.
//
	{
	__ASSERT_DEBUG(iCity!=NULL && iCountry!=NULL,Panic(EEikPanicTimeNoDataForDialog));
	// description line deleted if not required.
	if (iDescriptResourceId)
		DoSetLabelText(EEikTimeCidDialogDescription,iDescriptResourceId);
	else 
		DeleteLine(EEikTimeCidDialogDescription);
	SetTitleL(iTitleResourceId);
	SWorldSelectorState state;
	state.iCity=*iCity;
	state.iCountry=*iCountry;
	state.iSearch=EWithinWorld;
	TInt error=((CEikWorldSelector*)Control(EEikTimeCidSetCityCity))->Controller()->SetStateL(state);
	User::LeaveIfError(error);
	}

TBool CEikTimeDialogSetCity::OkToExitL(TInt aButtonId)
//
//	Update passed parameters on exit.
//
	{
	if (aButtonId==EEikBidOk)
		{
		SWorldSelectorState state;
		((CEikWorldSelector*)Control(EEikTimeCidSetCityCity))->Controller()->GetState(state);
		if (state.iCity!=*iCity || state.iCountry!=*iCountry)
			*iChanged=ETrue;
		*iCity=state.iCity;
		*iCountry=state.iCountry;
		}
	return(ETrue);
	}

//
//	class CEikTimeDialogSetTime
//

CEikTimeDialogSetTime::CEikTimeDialogSetTime()
//
//	C'tor.
//
	{
	__DECLARE_NAME(_S("CEikTimeDialogSetTime"));
	}

EXPORT_C CEikTimeDialogSetTime* CEikTimeDialogSetTime::NewL()
	{
	CEikTimeDialogSetTime* dialog= new(ELeave) CEikTimeDialogSetTime;
	return dialog;
	}


EXPORT_C TBool CEikTimeDialogSetTime::SetTimeLD(TTime& aTime)
//
//	Run the dialog.
//
	{
	iTime=&aTime;
	return(ExecuteLD(R_EIK_TIME_DLG_SET_TIME));
	}

void CEikTimeDialogSetTime::PreLayoutDynInitL()
//
//	Initialize the control values.
//
	{
	TTime now;
	now.HomeTime();
	SetTTimeEditorValue(EEikTimeCidSetTimeDate,now);
	SetTTimeEditorValue(EEikTimeCidSetTimeTime,now);
	}

TBool CEikTimeDialogSetTime::OkToExitL(TInt aButtonId)
//
//	Update data on exit.
//
	{
	if (aButtonId==EEikBidOk)
		{
		TDateTime newDateDateTime=TTimeEditorValue(EEikTimeCidSetTimeDate).DateTime();
		TDateTime newTimeDateTime=TTimeEditorValue(EEikTimeCidSetTimeTime).DateTime();
		newTimeDateTime.SetYear(newDateDateTime.Year());
		newTimeDateTime.SetMonth(newDateDateTime.Month());
		newTimeDateTime.SetDay(newDateDateTime.Day());
		*iTime=newTimeDateTime;
		}
	return(ETrue);
	}

//
//	class CEikTimeDialogSetDst
//

CEikTimeDialogSetDst::CEikTimeDialogSetDst()
//
//	C'tor.
//
	{
	__DECLARE_NAME(_S("CEikTimeDialogSetDst"));
	}


EXPORT_C CEikTimeDialogSetDst* CEikTimeDialogSetDst::NewL()
	{
	CEikTimeDialogSetDst* dialog= new(ELeave) CEikTimeDialogSetDst;
	return dialog;
	}


EXPORT_C TBool CEikTimeDialogSetDst::SetDstLD(TUint& aDstZones,TDaylightSavingZone aHomeZone)
//
//	Run the dialog.
//
	{
	iDstZones=&aDstZones;
	iHomeDstZone=aHomeZone;
	return(ExecuteLD(R_EIK_TIME_DLG_SET_DST));
	}

void CEikTimeDialogSetDst::PreLayoutDynInitL()
//
//	Initialize the control values.
//
	{
	DoSetLabelText(EEikTimeCidDialogDescription,R_EIK_TIME_TBUF_LBL_DST_DESCRIPTION);
	SetCheckBoxState(EEikTimeCidDstHome,(*iDstZones&EDstHome)? CEikButtonBase::ESet: CEikButtonBase::EClear);
	SetCheckBoxState(EEikTimeCidDstEuropean,(*iDstZones&EDstEuropean)? CEikButtonBase::ESet: CEikButtonBase::EClear);
	SetCheckBoxState(EEikTimeCidDstNorthern,(*iDstZones&EDstNorthern)? CEikButtonBase::ESet: CEikButtonBase::EClear);
	SetCheckBoxState(EEikTimeCidDstSouthern,(*iDstZones&EDstSouthern)? CEikButtonBase::ESet: CEikButtonBase::EClear);
	}

TBool CEikTimeDialogSetDst::OkToExitL(TInt aButtonId)
//
//	Update data on exit.
//
	{
	if (aButtonId==EEikBidOk)
		{
		*iDstZones=0;
		if (CheckBoxState(EEikTimeCidDstHome)==CEikButtonBase::ESet)
			*iDstZones|=EDstHome;
		if (CheckBoxState(EEikTimeCidDstEuropean)==CEikButtonBase::ESet)
			*iDstZones|=EDstEuropean;
		if (CheckBoxState(EEikTimeCidDstNorthern)==CEikButtonBase::ESet)
			*iDstZones|=EDstNorthern;
		if (CheckBoxState(EEikTimeCidDstSouthern)==CEikButtonBase::ESet)
			*iDstZones|=EDstSouthern;
		}
	return(ETrue);
	}

void CEikTimeDialogSetDst::HandleControlStateChangeL(TInt aControlId)
//
//	Update the controls to keep track of each other
//
	{
	if (aControlId<=EEikTimeCidDstHome || aControlId>EEikTimeCidDstSouthern)
		return;
	TDaylightSavingZone zone=EDstNone;
	switch (aControlId)
		{
	case EEikTimeCidDstEuropean:	zone=EDstEuropean; break;
	case EEikTimeCidDstNorthern:	zone=EDstNorthern; break;
	case EEikTimeCidDstSouthern:	zone=EDstSouthern; break;
		}
	if (iHomeDstZone!=EDstNone && zone==iHomeDstZone)
		SetCheckBoxState(EEikTimeCidDstHome,CheckBoxState(aControlId));
	}

//
//	class CEikTimeDialogOptionFormat
//

CEikTimeDialogOptionFormat::CEikTimeDialogOptionFormat()
//
//	C'tor.
//
	{
	__DECLARE_NAME(_S("CEikTimeDialogOptionFormat"));
	}


EXPORT_C CEikTimeDialogOptionFormat* CEikTimeDialogOptionFormat::NewL()
	{
	CEikTimeDialogOptionFormat* dialog= new(ELeave) CEikTimeDialogOptionFormat;
	return dialog;
	}


EXPORT_C TBool CEikTimeDialogOptionFormat::EditOptionsLD(TEikTimeOptions& aOptions)
//
//	Run the dialog.
//
	{
	iOptions=&aOptions;
	TBool retVal=EFalse;
	iChanged=&retVal;
	ExecuteLD(R_EIK_TIME_DLG_OPTION_FORMAT);
	return(retVal);
	}

void CEikTimeDialogOptionFormat::PreLayoutDynInitL()
//
//	Initialize dialog values.
//
	{
	__ASSERT_ALWAYS(iOptions!=NULL,Panic(EEikPanicTimeNoDataForDialog));
	SetData(*iOptions);
	}

void CEikTimeDialogOptionFormat::Data(TEikTimeOptions& aOptions) const
//
//	Set the options from the dialog state.
//
	{
	TInt state;
	state=ChoiceListCurrentItem(EEikTimeCidTimeFormat);
	aOptions.iTime=(TTimeFormat)state;
	state=ChoiceListCurrentItem(EEikTimeCidDateFormat);
	aOptions.iDate=(TDateFormat)state;
	CEikChoiceList* choice=(CEikChoiceList*)Control(EEikTimeCidTimeSeparator);
	state=(*choice->DesCArray())[choice->CurrentItem()][0];
	aOptions.iTimeSeparator=state;
	choice=(CEikChoiceList*)Control(EEikTimeCidDateSeparator);
	state=(*choice->DesCArray())[choice->CurrentItem()][0];
	aOptions.iDateSeparator=state;
	}


void CEikTimeDialogOptionFormat::SetData(const TEikTimeOptions& aOptions)
//
//	Set the dialog from the option values.
//
	{
	TInt state=aOptions.iTime;
	SetChoiceListCurrentItem(EEikTimeCidTimeFormat,state);
	state=aOptions.iDate;
	SetChoiceListCurrentItem(EEikTimeCidDateFormat,state);
	CEikChoiceList* choice=(CEikChoiceList*)Control(EEikTimeCidTimeSeparator);
	TBuf<4> stateBuf;
	stateBuf.Append(aOptions.iTimeSeparator);
	if (choice->DesCArray()->Find(stateBuf,state)!=KErrNone)
		state=0;
	SetChoiceListCurrentItem(EEikTimeCidTimeSeparator,state);
	choice=(CEikChoiceList*)Control(EEikTimeCidDateSeparator);
	stateBuf.Zero();
	stateBuf.Append(aOptions.iDateSeparator);
	if (choice->DesCArray()->Find(stateBuf,state)!=KErrNone)
		state=0;
	SetChoiceListCurrentItem(EEikTimeCidDateSeparator,state);
	}

TBool CEikTimeDialogOptionFormat::OkToExitL(TInt aButtonId)
//
//	Set the data before closing the dialog.
//
	{
	if (aButtonId==EEikBidOk)
		{
		Data(*iOptions);
		*iChanged=ETrue;
		}
	return(ETrue);
	}

//
//	class CEikTimeDialogOptionWorkday
//

CEikTimeDialogOptionWorkday::CEikTimeDialogOptionWorkday()
//
//	C'tor
//
	{
	__DECLARE_NAME(_S("CEikTimeDialogOptionWorkday"));
	}

EXPORT_C CEikTimeDialogOptionWorkday* CEikTimeDialogOptionWorkday::NewL()
	{
	CEikTimeDialogOptionWorkday* dialog= new(ELeave) CEikTimeDialogOptionWorkday;
	return dialog;
	}

EXPORT_C TBool CEikTimeDialogOptionWorkday::EditWorkdaysLD(TUint& aWorkdayFlags)
//
//	Execute the workdays dialog
//
	{
	iWorkdayFlags=&aWorkdayFlags;
	TBool retVal=EFalse;
	iChanged=&retVal;
	ExecuteLD(R_EIK_TIME_DLG_SET_WORKDAYS);
	return(retVal);
	}

void CEikTimeDialogOptionWorkday::PreLayoutDynInitL()
//
//	Seed the dialog with the current values
//
	{
	__ASSERT_ALWAYS(iWorkdayFlags!=NULL,Panic(EEikPanicTimeNoDataForDialog));
	DoSetLabelText(EEikTimeCidDialogDescription,R_EIK_TIME_TBUF_LBL_WORKDAY_DESCRIPTION);
	CEikButtonBase::TState state;
	TInt day=1;
	TInt id=EEikTimeCidWorkayMonday;
	for (TInt ii=0;ii<7;ii++,day<<=1,id++)
		{
		state=(day&*iWorkdayFlags)? CEikButtonBase::ESet : CEikButtonBase::EClear;
		SetCheckBoxState(id,state);
		}
	}

TBool CEikTimeDialogOptionWorkday::OkToExitL(TInt aButtonId)
//
//	Update for closing dialog
//
	{
	if (aButtonId==EEikBidOk)
		{
		TUint workdays=*iWorkdayFlags;
		*iWorkdayFlags=0;
		TInt day=1;
		TInt id=EEikTimeCidWorkayMonday;
		for (TInt ii=0;ii<7;ii++,day<<=1,id++)
			{
			if (CheckBoxState(id)==CEikButtonBase::ESet)
				*iWorkdayFlags|=day;
			}
		if (workdays!=*iWorkdayFlags)
			*iChanged=ETrue;
		}
	return(ETrue);
	}
