idlehomescreen/xmluirendering/renderingplugins/xnclockfactory/src/xndatecontrol.cpp
branchRCL_3
changeset 35 3321d3e205b6
--- /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 <e32std.h>
+#include <debug.h>
+#include <AknLayoutFont.h>
+#include <AknUtils.h>
+#include <AknBidiTextUtils.h>
+#include <StringLoader.h>
+#include <bacntf.h>
+
+// 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<CXnDateControl*>( aPtr );
+    
+    if( self )
+        {
+        TInt changes( self->iEnvNotifier->Change() );
+        
+        if ( changes & 
+            ( EChangesLocale | EChangesMidnightCrossover | EChangesSystemTime ) )
+            {
+            self->RefreshDateL();
+            }       
+        }    
+        
+    return KErrNone;
+    }
+
+//  End of File