diff -r 5f0182e07bfb -r 5456b4e8b3a8 idlehomescreen/xmluirendering/renderingplugins/xnclockfactory/src/xnclockcontrol.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlehomescreen/xmluirendering/renderingplugins/xnclockfactory/src/xnclockcontrol.cpp Wed Sep 01 12:32:46 2010 +0100 @@ -0,0 +1,246 @@ +/* +* 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 + +// User includes +#include +#include "xncontroladapter.h" +#include "xnclockadapter.h" +#include "xnclockface.h" + +#include "xnclockcontrol.h" + +// Constants +static const TInt KIntervalTime( 60000000 ); // in microseconds + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CXnClockControl::CXnClockControl +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CXnClockControl::CXnClockControl( CXnClockAdapter* aAdapter, + const TBool aFormatFromLocale, + const TClockFormat aFormat ) + : iAdapter( aAdapter ), + iClockFormat( aFormat ), + iFormatFromLocale ( aFormatFromLocale ) + { + } + +// ----------------------------------------------------------------------------- +// CXnClockControl::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CXnClockControl::ConstructL() + { + iTimer = CPeriodic::NewL( CActive::EPriorityHigh ); + + SetFormatL( iFormatFromLocale, iClockFormat ); + } + +// ----------------------------------------------------------------------------- +// CXnClockControl::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CXnClockControl* CXnClockControl::NewL( CXnClockAdapter* aAdapter, + const TBool aFormatFromLocale, + const TClockFormat aFormat ) + { + CXnClockControl* self = + new (ELeave) CXnClockControl( aAdapter, aFormatFromLocale, aFormat ); + + CleanupStack::PushL( self ); + self->ConstructL(); + + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// Destructor +// +// ----------------------------------------------------------------------------- +// +CXnClockControl::~CXnClockControl() + { + delete iTimer; + delete iFace; + } + +// ----------------------------------------------------------------------------- +// CXnClockControl::UpdateDisplay +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CXnClockControl::UpdateDisplay() + { + if( !iFace ) + { + return; + } + + iAdapter->UpdateDisplay(); + } + +// ----------------------------------------------------------------------------- +// CXnClockControl::SetFormatL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CXnClockControl::SetFormatL( const TBool aFormatFromLocale, + const TClockFormat aFormat ) + { + TClockFormat format( aFormat ); + + if( aFormatFromLocale ) + { + format = TLocale().ClockFormat(); + } + + iFormatFromLocale = aFormatFromLocale; + + if( format == iClockFormat && iFace ) + { + // Already correct face + return; + } + + iClockFormat = format; + + delete iFace; + iFace = NULL; + + if( format == EClockAnalog ) + { + iFace = CXnClockFaceAnalog::NewL(); + } + else if( format == EClockDigital ) + { + iFace = CXnClockFaceDigital::NewL(); + } + } + +// ----------------------------------------------------------------------------- +// CXnClockControl::Format +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TClockFormat CXnClockControl::Format() const + { + return iClockFormat; + } + +// ----------------------------------------------------------------------------- +// CXnClockControl::Draw +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CXnClockControl::Draw( CWindowGc& aGc, const TRect& aRect ) + { + // Ensure correct appearance + TRAP_IGNORE( SetFormatL( iFormatFromLocale, iClockFormat ) ); + + if( iFace && !aRect.IsEmpty() ) + { + __PRINT( __DBG_FORMAT( "CXnClockControl::Draw: 0x%X" ), this ); + + TTime homeTime; + homeTime.HomeTime(); + + TRAP_IGNORE( iFace->DrawL( *iAdapter, aGc, aRect, homeTime ) ); + } + } + +// ----------------------------------------------------------------------------- +// CXnClockControl::TimerCallback +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CXnClockControl::TimerCallback( TAny* aThis ) + { + __PRINT( __DBG_FORMAT( "CXnClockControl::TimerCallback: 0x%X" ), aThis ); + + CXnClockControl* self = static_cast< CXnClockControl* >( aThis ); + + // Update the clock display + self->UpdateDisplay(); + + // Adjust the timer delay if necessary + TTime time; + time.HomeTime(); + TDateTime dateTime( time.DateTime() ); + + if( dateTime.Second() > 0 ) + { + self->iTimer->Cancel(); + self->iTimer->After( KIntervalTime - + 1000000 * dateTime.Second() - dateTime.MicroSecond() ); + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CXnClockControl::StartTimer +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CXnClockControl::StartTimer() + { + if ( iTimer && !iTimer->IsActive() ) + { + __PRINT( __DBG_FORMAT( "CXnClockControl::StartTimer: 0x%X" ), this ); + + TTime time; + time.HomeTime(); + TDateTime dateTime( time.DateTime() ); + TCallBack callBack( TimerCallback, this ); + + iTimer->Start( + TTimeIntervalMicroSeconds32( + KIntervalTime - 1000000 * dateTime.Second() - dateTime.MicroSecond() ), + TTimeIntervalMicroSeconds32( KIntervalTime ), + callBack ); + } + } + +// ----------------------------------------------------------------------------- +// CXnClockControl::StopTimer +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CXnClockControl::StopTimer() + { + if ( iTimer && iTimer->IsActive() ) + { + __PRINT( __DBG_FORMAT( "CXnClockControl::StopTimer: 0x%X" ), this ); + + iTimer->Cancel(); + } + } + +// End of File