diff -r 5456b4e8b3a8 -r 3321d3e205b6 idlehomescreen/xmluirendering/renderingplugins/xnclockfactory/src/xndatecontrol.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlehomescreen/xmluirendering/renderingplugins/xnclockfactory/src/xndatecontrol.cpp Tue Sep 14 20:58:58 2010 +0300 @@ -0,0 +1,282 @@ +/* +* Copyright (c) 2006-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Clock control +* +*/ + + +// System includes +#include +#include +#include +#include +#include +#include +#include + +// User includes +#include "xndatecontrol.h" +#include "xncontroladapter.h" +#include "xnclockadapter.h" +#include "xnnodepluginif.h" +#include "xnproperty.h" +#include "xnuienginepluginif.h" +#include "c_xnutils.h" + +// Constants +const TInt KMaxDateStringLength = 100; +const TInt KMaxDayNumberStringLength = 10; + +_LIT( KDateFont, "EAknLogicalFontSecondaryFont" ); +_LIT( KTimeFormat, "%0U %1U" ); + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CXnDateControl::CXnDateControl +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CXnDateControl::CXnDateControl( CXnClockAdapter& aAdapter, + TXnDateType aType ) + : iAdapter( aAdapter ), iDateType( aType ) + { + } + +// ----------------------------------------------------------------------------- +// CXnDateControl::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CXnDateControl::ConstructL() + { + // Create enviroment notifier + iEnvNotifier = CEnvironmentChangeNotifier::NewL( + CActive::EPriorityStandard, TCallBack( HandleCallBackL, this ) ); + // Start listening notifications + iEnvNotifier->Start(); + } + +// ----------------------------------------------------------------------------- +// CXnDateControl::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CXnDateControl* CXnDateControl::NewL( CXnClockAdapter& aAdapter, + TXnDateType aType ) + { + CXnDateControl* self = new (ELeave) CXnDateControl( aAdapter, aType ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CXnDateControl::~CXnDateControl() + { + delete iDateText; + delete iEnvNotifier; + } + +// ----------------------------------------------------------------------------- +// CXnDateControl::DrawL +// ----------------------------------------------------------------------------- +// +void CXnDateControl::DrawL( CWindowGc& aGc, CXnNodePluginIf* aNode ) + { + if ( !aNode || + !iDateText || + ( aNode && aNode->Rect().IsEmpty() ) ) + { + return; + } + + const CAknLayoutFont* dateFont( CreateFontL( *aNode ) ); + if ( !dateFont ) + { + return; + } + + const TRgb& color( CreateColorL( *aNode ) ); + + CGraphicsContext::TTextAlign align = iAdapter.GetTextAlignL( *aNode ); + + const TInt deltaHeight( aNode->Rect().Height() - dateFont->TextPaneHeight() ); + TInt offset( dateFont->TextPaneTopToBaseline() + deltaHeight / 2 ); + + aGc.SetPenColor( color ); + aGc.UseFont( dateFont ); + aGc.DrawText( *iDateText, aNode->Rect(), offset, align ); + aGc.DiscardFont(); + } + +// ----------------------------------------------------------------------------- +// CXnDateControl::ConstructDateStringL +// ----------------------------------------------------------------------------- +// +HBufC* CXnDateControl::ConstructDateStringL() + { + // Construct date string using date format from resource file + CCoeEnv* coeEnv = CCoeEnv::Static(); + + if( !coeEnv ) + { + User::Leave( KErrNotReady ); + } + + TTime time; + time.HomeTime(); + + HBufC* aiDateString = HBufC::NewLC( KMaxDateStringLength ); + HBufC* aiDateFormatString = HBufC::NewLC( KMaxDateStringLength ); + aiDateFormatString->Des().Copy( KTimeFormat() ); + // TODO: when localisation is ready read format string from resource + //HBufC* aiDateFormatString = StringLoader::LoadLC( R_ACTIVEIDLE_TIME_FORMAT, + // coeEnv ); + HBufC* dateStringBuf = HBufC::NewLC( KMaxDateStringLength ); + HBufC* dateFormatString = StringLoader::LoadLC( R_QTN_DATE_SHORT_WITH_ZERO, + coeEnv ); + TPtr dateString( dateStringBuf->Des() ); + time.FormatL( dateString, *dateFormatString ); + CleanupStack::PopAndDestroy( dateFormatString ); + + //now dateString contains string which is formatted using + //R_QTN_DATE_USUAL_WITH_ZERO + + // To arabic + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( dateString ); + + TPtr aiDateStringPtr = aiDateString->Des(); + + TDayNameAbb wkDayAbb = TDayNameAbb(); + wkDayAbb.Set(time.DayNoInWeek()); + + //add date to string + StringLoader::Format( aiDateStringPtr, *aiDateFormatString, 1,dateString ); + + //reuse dateString + dateString.Copy( aiDateStringPtr ); + + //add weekday to string + StringLoader::Format( aiDateStringPtr, dateString, 0, wkDayAbb ); + + CleanupStack::PopAndDestroy( dateStringBuf );//dateStringBuf, aiDateFormatString + CleanupStack::PopAndDestroy( aiDateFormatString ); + + CleanupStack::Pop( aiDateString ); + return aiDateString; + } + +// ----------------------------------------------------------------------------- +// CXnDateControl::ConstructDayStringL +// ----------------------------------------------------------------------------- +// +HBufC* CXnDateControl::ConstructDayStringL() + { + TTime time; + time.HomeTime(); + + HBufC* aiDayString = HBufC::NewLC( KMaxDayNumberStringLength ); + aiDayString->Des().Num( time.DayNoInMonth() + 1 ); + // To arabic + TPtr dayStringPtr = aiDayString->Des(); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( dayStringPtr ); + CleanupStack::Pop( aiDayString ); + return aiDayString; + } + +// ----------------------------------------------------------------------------- +// CXnDateControl::CreateFontL +// ----------------------------------------------------------------------------- +// +const CAknLayoutFont* CXnDateControl::CreateFontL( CXnNodePluginIf& aNode ) + { + if ( !iDateFont ) + { + iAdapter.CreateFontL( aNode, KDateFont, iDateFont ); + } + return CAknLayoutFont::AsCAknLayoutFontOrNull( iDateFont ); + } + +// ----------------------------------------------------------------------------- +// CXnDateControl::CreateColorL +// ----------------------------------------------------------------------------- +// +const TRgb& CXnDateControl::CreateColorL( CXnNodePluginIf& aNode ) + { + if ( !iIsColorSet ) + { + iAdapter.CreateColorL( aNode, iDateColor ); + iIsColorSet = ETrue; + } + return iDateColor; + } + +// ----------------------------------------------------------------------------- +// CXnDateControl::ResetFont +// ----------------------------------------------------------------------------- +// +void CXnDateControl::ResetFont() + { + iDateFont = NULL; + iIsColorSet = EFalse; + } + +// ----------------------------------------------------------------------------- +// CXnDateControl::RefreshDateL +// ----------------------------------------------------------------------------- +// +void CXnDateControl::RefreshDateL() + { + delete iDateText; + iDateText = NULL; + if ( iDateType == EDate ) + { + iDateText = ConstructDateStringL(); + } + else if ( iDateType == EDay ) + { + iDateText = ConstructDayStringL(); + } + } + +// ----------------------------------------------------------------------------- +// CXnDateControl::HandleCallBackL +// ----------------------------------------------------------------------------- +// +TInt CXnDateControl::HandleCallBackL( TAny *aPtr ) + { + CXnDateControl* self = static_cast( aPtr ); + + if( self ) + { + TInt changes( self->iEnvNotifier->Change() ); + + if ( changes & + ( EChangesLocale | EChangesMidnightCrossover | EChangesSystemTime ) ) + { + self->RefreshDateL(); + } + } + + return KErrNone; + } + +// End of File