idlehomescreen/xmluirendering/renderingplugins/xnclockfactory/src/xnclockadapter.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/xmluirendering/renderingplugins/xnclockfactory/src/xnclockadapter.cpp Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,555 @@
+/*
+* Copyright (c) 2005-2006 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: Implementation wrapper for CAknSkinnableClock
+*
+*/
+
+// SYSTEM INCLUDE FILES
+#include <e32base.h>
+#include <e32const.h>
+#include <AknLayoutFont.h>
+#include <AknsUtils.h>
+
+// USER INCLUDE FILES
+#include "xndomproperty.h"
+#include "xndomlist.h"
+#include "xnproperty.h"
+#include "xntype.h"
+#include "xnuienginepluginif.h"
+#include "xnnodepluginif.h"
+#include "xncontroladapter.h"
+#include "xnclockcontrol.h"
+#include "xnclockadapter.h"
+#include "c_xnutils.h"
+
+// CONSTANTS
+_LIT8( KDateInformation, "Clock/DateInformation" );
+_LIT8( KDayInformation, "Clock/DayInformation" );
+
+_LIT( KDigitalFont, "EAknLogicalFontDigitalFont" );
+_LIT( KAmPmFont, "EAknLogicalFontSecondaryFont" );
+_LIT( KDateFont, "EAknLogicalFontSecondaryFont" );
+
+// ============================ LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// ClockFormat
+// Resolves the clock format
+// -----------------------------------------------------------------------------
+//
+static TClockFormat ClockFormat( CXnProperty* aProperty, TBool& aUseLocale )
+ {
+ // Default, from locale
+ TClockFormat format( TLocale().ClockFormat() );
+
+ aUseLocale = ETrue;
+
+ if( aProperty )
+ {
+ const TDesC8& name( aProperty->Property()->Name() );
+
+ if( name == XnPropertyNames::clock::KS60Format )
+ {
+ const TDesC8& value( aProperty->StringValue() );
+
+ if( value == XnPropertyNames::clock::format::KDigital )
+ {
+ format = EClockDigital;
+ aUseLocale = EFalse;
+ }
+ else if( value == XnPropertyNames::clock::format::KAnalog )
+ {
+ format = EClockAnalog;
+ aUseLocale = EFalse;
+ }
+ }
+ }
+
+ return format;
+ }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::NewL
+// Symbian static 1st phase constructor
+// -----------------------------------------------------------------------------
+//
+CXnClockAdapter* CXnClockAdapter::NewL( CXnControlAdapter* aParent,
+ CXnNodePluginIf& aNode )
+ {
+ CXnClockAdapter* self = new( ELeave ) CXnClockAdapter( aParent, aNode );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::CXnClockAdapter
+// C++ default constructor
+// -----------------------------------------------------------------------------
+//
+CXnClockAdapter::CXnClockAdapter( CXnControlAdapter* aParent,
+ CXnNodePluginIf& aNode )
+ : iParent( aParent ), iNode( aNode )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::~CXnClockAdapter
+// C++ destructor
+// -----------------------------------------------------------------------------
+//
+CXnClockAdapter::~CXnClockAdapter()
+ {
+ iCoeEnv->RemoveMessageMonitorObserver( *this );
+
+ delete iClockControl;
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CXnClockAdapter::ConstructL()
+ {
+ CXnControlAdapter::ConstructL( iNode );
+
+ RPointerArray< CXnNodePluginIf > children( iNode.ChildrenL() );
+ CleanupClosePushL( children );
+
+ for( TInt i = 0; i < children.Count(); i++ )
+ {
+ CXnNodePluginIf* child( children[i] );
+
+ CXnProperty* id( child->IdL() );
+
+ if( id )
+ {
+ if( id->StringValue() == KDateInformation )
+ {
+ iDate = child;
+ }
+ else if( id->StringValue() == KDayInformation )
+ {
+ iDay = child;
+ }
+ }
+ }
+
+ CleanupStack::PopAndDestroy( &children );
+
+ TBool useLocale;
+
+ CXnProperty* prop(
+ iNode.GetPropertyL( XnPropertyNames::clock::KS60Format ) );
+
+ TClockFormat format( ClockFormat( prop, useLocale ) );
+
+ iClockControl = CXnClockControl::NewL( this, useLocale, format );
+
+ iCoeEnv->AddMessageMonitorObserverL( *this );
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::DoHandlePropertyChangeL
+// -----------------------------------------------------------------------------
+//
+void CXnClockAdapter::DoHandlePropertyChangeL( CXnProperty* aProperty )
+ {
+ if( aProperty )
+ {
+ const TDesC8& name( aProperty->Property()->Name() );
+
+ if( name == XnPropertyNames::clock::KS60Format )
+ {
+ TBool useLocale;
+
+ TClockFormat format( ClockFormat( aProperty, useLocale ) );
+
+ iClockControl->SetFormatL( useLocale, format );
+ }
+ else if( name == XnPropertyNames::clock::KS60DigitalFontSize )
+ {
+ iDigitalFont = NULL;
+ }
+ else if( name == XnPropertyNames::clock::KS60AmPmFontSize )
+ {
+ iAmPmFont = NULL;
+ }
+ else if( name == XnPropertyNames::clock::KS60DateFontSize )
+ {
+ iDateFont = NULL;
+ }
+ else if( name == XnPropertyNames::appearance::common::KColor )
+ {
+ iColorSet = EFalse;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::UpdateDisplay
+// Draws the clock component
+// -----------------------------------------------------------------------------
+//
+void CXnClockAdapter::UpdateDisplay() const
+ {
+ if ( !iNode.Rect().IsEmpty() )
+ {
+ DrawNow();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::Draw
+// Draws the clock component
+// -----------------------------------------------------------------------------
+//
+void CXnClockAdapter::Draw( const TRect& aRect ) const
+ {
+ CXnControlAdapter::Draw( aRect );
+
+ CWindowGc& gc( SystemGc() );
+
+ iClockControl->Draw( gc, iNode.Rect() );
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::MakeVisible
+//
+// -----------------------------------------------------------------------------
+//
+void CXnClockAdapter::MakeVisible( TBool aVisible )
+ {
+ TBool visible( IsVisible() );
+
+ if ( aVisible != visible )
+ {
+ CCoeControl::MakeVisible( aVisible );
+
+ if ( !aVisible )
+ {
+ iClockControl->StopTimer();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::MonitorWsMessage
+//
+// -----------------------------------------------------------------------------
+//
+void CXnClockAdapter::MonitorWsMessage( const TWsEvent& aEvent )
+ {
+ TInt type( aEvent.Type() );
+
+ TBool foreground( iForeground );
+
+ if( type == KAknFullOrPartialForegroundGained )
+ {
+ iForeground = ETrue;
+ }
+ else if( type == KAknFullOrPartialForegroundLost )
+ {
+ iForeground = EFalse;
+ }
+
+ if( foreground != iForeground && IsVisible() )
+ {
+ if( iForeground )
+ {
+ iClockControl->StartTimer();
+ }
+ else
+ {
+ iClockControl->StopTimer();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::FontL
+//
+// -----------------------------------------------------------------------------
+//
+const CAknLayoutFont* CXnClockAdapter::FontL( const TInt aType )
+ {
+ CFont* font( NULL );
+
+ if( aType == EDigitalFont )
+ {
+ if( !iDigitalFont )
+ {
+ CreateFontL( aType );
+ }
+
+ font = iDigitalFont;
+ }
+ else if( aType == EAmPmFont )
+ {
+ if( !iAmPmFont )
+ {
+ CreateFontL( aType );
+ }
+
+ font = iAmPmFont;
+ }
+ else if( aType == EDateFont )
+ {
+ if( !iDateFont )
+ {
+ CreateFontL( aType );
+ }
+
+ font = iDateFont;
+ }
+
+ if( font )
+ {
+ return CAknLayoutFont::AsCAknLayoutFontOrNull( font );
+ }
+
+ return NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::TextColorL
+//
+// -----------------------------------------------------------------------------
+//
+const TRgb& CXnClockAdapter::TextColorL()
+ {
+ if( !iColorSet )
+ {
+ CreateColorL();
+ }
+
+ return iColor;
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::Date
+//
+// -----------------------------------------------------------------------------
+//
+CXnNodePluginIf* CXnClockAdapter::Date() const
+ {
+ return iDate;
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::Day
+//
+// -----------------------------------------------------------------------------
+//
+CXnNodePluginIf* CXnClockAdapter::Day() const
+ {
+ return iDay;
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::CreateFontL
+//
+// -----------------------------------------------------------------------------
+//
+void CXnClockAdapter::CreateFontL( const TInt aType )
+ {
+ TFontSpec spec;
+ TInt dummy;
+
+ if( aType == EDigitalFont )
+ {
+ iDigitalFont = NULL;
+
+ CXnProperty* prop( iNode.GetPropertyL(
+ XnPropertyNames::clock::KS60DigitalFontSize ) );
+
+ // default
+ TInt height( ( iNode.Rect().Height() / 3 ) * 2 );
+
+ if ( prop )
+ {
+ height = iNode.UiEngineL()->VerticalPixelValueL(
+ prop, iNode.Rect().Height() );
+ }
+
+ // No need to relase avkon font
+ CXnUtils::CreateFontL( KDigitalFont,
+ height,
+ spec.iFontStyle,
+ iDigitalFont,
+ dummy );
+ }
+ else if( aType == EAmPmFont )
+ {
+ iAmPmFont = NULL;
+
+ CXnProperty* prop( iNode.GetPropertyL(
+ XnPropertyNames::clock::KS60AmPmFontSize ) );
+
+ // default
+ TInt height( ( iNode.Rect().Height() / 5 ) );
+
+ if ( prop )
+ {
+ height = iNode.UiEngineL()->VerticalPixelValueL(
+ prop, iNode.Rect().Height() );
+ }
+
+ // No need to relase avkon font
+ CXnUtils::CreateFontL( KAmPmFont,
+ height,
+ spec.iFontStyle,
+ iAmPmFont,
+ dummy );
+ }
+ else if( aType == EDateFont )
+ {
+ iDateFont = NULL;
+
+ CXnProperty* prop( iNode.GetPropertyL(
+ XnPropertyNames::clock::KS60DateFontSize ) );
+
+ // default
+ TInt height( ( iNode.Rect().Height() / 5 ) );
+
+ if ( prop )
+ {
+ height = iNode.UiEngineL()->VerticalPixelValueL(
+ prop, iNode.Rect().Height() );
+ }
+
+ // No need to relase avkon font
+ CXnUtils::CreateFontL( KDateFont,
+ height,
+ spec.iFontStyle,
+ iDateFont,
+ dummy );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::CreateColorL
+//
+// -----------------------------------------------------------------------------
+//
+void CXnClockAdapter::CreateColorL()
+ {
+ TRgb color;
+
+ TInt result( KErrNone );
+
+ CXnProperty* prop( iNode.GetPropertyL(
+ XnPropertyNames::appearance::common::KColor ) );
+
+ if( !prop )
+ {
+ return;
+ }
+
+ CXnDomProperty* domProp( prop->Property() );
+
+ MAknsSkinInstance* skin( AknsUtils::SkinInstance() );
+
+ if( domProp )
+ {
+ CXnDomPropertyValue* value = static_cast< CXnDomPropertyValue* >
+ ( domProp->PropertyValueList().Item( 0 ) );
+
+ if( value->PrimitiveValueType() == CXnDomPropertyValue::ERgbColor )
+ {
+ color = value->RgbColorValueL();
+ }
+ else if( !value->IsAutoIdent() )
+ {
+ HBufC* str( prop->StringValueL() );
+ CleanupStack::PushL( str );
+
+ CXnUtils::StripQuotes( str );
+
+ TInt index( 0 );
+ TAknsItemID skinID;
+
+ TBool idResolved( CXnUtils::ResolveSkinItemIDL( *str, skinID, index ) );
+
+ result = KErrNotFound;
+
+ if( idResolved )
+ {
+ result = AknsUtils::GetCachedColor( skin, color, skinID, index );
+ }
+
+ CleanupStack::PopAndDestroy( str );
+ }
+
+ if( value->IsAutoIdent() || result != KErrNone )
+ {
+ result = AknsUtils::GetCachedColor( skin, color,
+ KAknsIIDQsnTextColors,
+ EAknsCIQsnTextColorsCG6 );
+ }
+ }
+
+ if( result == KErrNone )
+ {
+ iColorSet = ETrue;
+ iColor = color;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::SkinChanged
+// Skin change notification
+// -----------------------------------------------------------------------------
+//
+void CXnClockAdapter::SkinChanged()
+ {
+ iAmPmFont = iDigitalFont = iDateFont = NULL;
+ iColorSet = EFalse;
+
+ CXnControlAdapter::SkinChanged();
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::HandleScreenDeviceChangedL
+// Screen device change notification
+// -----------------------------------------------------------------------------
+//
+void CXnClockAdapter::HandleScreenDeviceChangedL()
+ {
+ iAmPmFont = iDigitalFont = iDateFont = NULL;
+ iColorSet = EFalse;
+
+ CXnControlAdapter::HandleScreenDeviceChangedL();
+ }
+
+// -----------------------------------------------------------------------------
+// CXnClockAdapter::SizeChanged
+// Size changed notification
+// -----------------------------------------------------------------------------
+//
+void CXnClockAdapter::SizeChanged()
+ {
+ iAmPmFont = iDigitalFont = iDateFont = NULL;
+ iColorSet = EFalse;
+
+ CXnControlAdapter::SizeChanged();
+ }
+
+// End of file