wvuing/wvuiave/AppSrc/ccacoloursettingitem.cpp
branchRCL_3
changeset 13 a941bc465d9f
parent 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/wvuiave/AppSrc/ccacoloursettingitem.cpp	Wed Sep 01 12:31:13 2010 +0100
@@ -0,0 +1,317 @@
+/*
+* Copyright (c) 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:  Setting item for message colour
+*
+*/
+
+
+#include <akncolourselectiongrid.h>
+#include <akniconutils.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <aknconsts.h>
+#include <avkon.mbg>
+#include <chatng.rsg>
+
+#include "ccacoloursettingitem.h"
+#include "MCASettingSapExt.h"
+#include "ccaappsettingsdialog.h"
+#include "chatdefinitions.h"
+// The Settings have been moved to Cenrep (also retained in the Resource file),
+// so the enums for keys and central repository header is added here
+#include 	"VariantKeys.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CCAColourSettingItem::CCAColourSettingItem(
+    MCASettingSapExt& aSAPExtension,
+    TBool& aBuffer,
+    TInt aIdentifier )
+        : CAknSettingItem( aIdentifier ),
+        iExternalValue( aBuffer ),
+        iSAPExtension( aSAPExtension )
+    {
+    // No implementation needed
+    }
+
+// ---------------------------------------------------------------------------
+// 2nd phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CCAColourSettingItem::ConstructL(
+    const TDesC& aKey,
+    const TInt aOrdinal,
+    const TDesC& aSettingTitle,
+    CArrayPtr<CGulIcon>* aIconArray )
+    {
+    iSAPKey = aKey.AllocL();
+    CAknSettingItem::ConstructL(
+        EFalse,
+        aOrdinal,
+        aSettingTitle,
+        aIconArray,
+        0,
+        EAknCtPopupSettingList,
+        0,
+        0 );
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CCAColourSettingItem::~CCAColourSettingItem()
+    {
+    delete iDefaultText;
+    delete iSAPKey;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CAknSettingItem.
+// @see CAknSettingItem
+// ---------------------------------------------------------------------------
+//
+void CCAColourSettingItem::StoreL()
+    {
+    iExternalValue = iInternalValue;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CAknSettingItem.
+// @see CAknSettingItem
+// ---------------------------------------------------------------------------
+//
+void CCAColourSettingItem::LoadL()
+    {
+    iInternalValue = iExternalValue;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CAknSettingItem.
+// EditItemL overridden to launch colour selection grid.
+// ---------------------------------------------------------------------------
+//
+void CCAColourSettingItem::EditItemL( TBool /*aCalledFromMenu*/ )
+    {
+    TBool retVal = EFalse;
+    CEikonEnv* env = CEikonEnv::Static();
+
+    // Array for TRgb colour values
+    CArrayFixFlat<TRgb>* colors = new( ELeave ) CArrayFixFlat<TRgb>( KArrayGranularity );
+    CleanupStack::PushL( colors );
+
+    // Read colours from resources
+    CDesCArrayFlat* indices = env->ReadDesCArrayResourceL( R_MESSAGE_COLORS );
+    CleanupStack::PushL( indices );
+
+    // Convert to TRgb's
+    TInt cnt = indices->Count();
+    for ( TInt i = 0; i < cnt; ++i )
+        {
+        TInt col;
+        TLex lex( indices->MdcaPoint( i ) );
+        User::LeaveIfError( lex.Val( col ) );
+        colors->AppendL( AKN_LAF_COLOR( col ) );
+        }
+    CleanupStack::PopAndDestroy( indices );
+
+    // Get current colour
+    TRgb color( iSAPExtension.IntValueL( *iSAPKey ) );
+    TInt startValue = color.Value();
+    TBool noneChosen = ( startValue == KErrNotFound );
+
+    // Construct colour selection grid
+    CAknDialog *dlg = CAknColourSelectionGrid::NewL(
+                          colors,
+                          ETrue,
+                          noneChosen,
+                          color );
+
+    // Use own resource to customize the "none" text.
+    retVal = dlg->ExecuteLD( R_CHATCLIENT_COLOR_GRID_DLG );
+
+    TInt colVal = KErrNotFound;
+    if ( !noneChosen )
+        {
+        colVal = color.Value();
+        }
+
+    if ( !retVal )
+        {
+        colVal = startValue;
+        }
+    else
+        {
+        // Set new value to SAP
+        iSAPExtension.SetIntValueL( *iSAPKey, colVal );
+        }
+
+    CleanupStack::PopAndDestroy( colors );
+
+    // ETrue: User specific color selected
+    // EFalse: Default color used
+    iInternalValue = ( colVal != KErrNotFound );
+
+    UpdateListBoxTextL();
+    }
+
+// ---------------------------------------------------------------------------
+// From class CAknSettingItem.
+// @see CAknSettingItem
+// ---------------------------------------------------------------------------
+//
+const TDesC& CCAColourSettingItem::SettingTextL()
+    {
+    // When using user defined colour return empty
+    // descriptor, otherwise return default text
+    if ( iInternalValue )
+        {
+        return KEmptyDesC;
+        }
+    else
+        {
+        return *iDefaultText;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From class CAknSettingItem.
+// @see CAknSettingItem
+// ---------------------------------------------------------------------------
+//
+void CCAColourSettingItem::CompleteConstructionL()
+    {
+    // Check that correct ConstructL was used
+    if ( !iSAPKey )
+        {
+        User::Panic( KPanicText, EChatColourSettingItemWronglyConstructed );
+        }
+
+    // Read default colour text from resources
+    CEikonEnv* env = CEikonEnv::Static();
+    iDefaultText = env->AllocReadResourceAsDes16L(
+                       R_QTN_CHAT_SET_COLOUR_DEFAULT );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CAknSettingItem.
+// @see CAknSettingItem
+// ---------------------------------------------------------------------------
+//
+CFbsBitmap* CCAColourSettingItem::CreateBitmapL()
+    {
+    // If custom colour is in use create bitmap with that colour to be
+    // shown inside the setting item
+
+    // Create rect of correct size to be used for resizing the icon
+    TRect origin;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, origin );
+
+    TAknLayoutRect layoutRect;
+    layoutRect.LayoutRect( origin,
+                           AknLayoutScalable_Avkon::listscroll_gen_pane( 0 ) );
+    layoutRect.LayoutRect( layoutRect.Rect(),
+                           AknLayoutScalable_Avkon::list_gen_pane( 0 ) );
+    layoutRect.LayoutRect( layoutRect.Rect(),
+                           AknLayoutScalable_Avkon::list_setting_number_pane( 0 ) );
+    layoutRect.LayoutRect( layoutRect.Rect(),
+                           AknLayoutScalable_Avkon::set_value_pane( 0 ) );
+    TRect rect( layoutRect.Rect() );
+
+    // Move rect to 0,0
+    rect.Move( -rect.iTl.iX, -rect.iTl.iY );
+
+    // Get current color from SAP
+    TRgb color( iSAPExtension.IntValueL( *iSAPKey ) );
+
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* mask = NULL;
+
+    // Create icon
+    AknIconUtils::CreateIconL(
+        bitmap,
+        mask,
+        KAvkonBitmapFile,
+        EMbmAvkonQgn_prop_empty,
+        EMbmAvkonQgn_prop_empty_mask
+    );
+
+    if ( iInternalValue )
+        {
+        // Set colour
+        AknIconUtils::SetIconColor( bitmap, color );
+
+        // Create solid mask to make
+        // colour box visible
+        delete mask;
+        mask = NULL;
+        CleanupStack::PushL( bitmap );
+        mask = AknIconUtils::CreateIconL( KAvkonBitmapFile,
+                                          EMbmAvkonQgn_prop_empty );
+        CleanupStack::Pop( bitmap );    // No leaving code after this, CGulIcon
+        // takes ownership in NewL
+        }
+
+    // Resize bitmaps
+    AknIconUtils::SetSize( bitmap, rect.Size() );
+    AknIconUtils::SetSize( mask, rect.Size() );
+
+    // icon takes ownership of bitmaps
+    CGulIcon* icon = CGulIcon::NewL( bitmap, mask );
+    // Ownership of icon gets transferred
+    CFbsBitmap* returnedBitmap = SetIconMaskAndReturnBitmap( icon );
+    return returnedBitmap;  // Caller takes ownership
+    }
+
+// ---------------------------------------------------------------------------
+// CCAColourSettingItem::SetIconMaskAndReturnBitmap
+// ---------------------------------------------------------------------------
+//
+CFbsBitmap* CCAColourSettingItem::SetIconMaskAndReturnBitmap( CGulIcon* aIcon )
+    {
+    CFbsBitmap* returnedBitmap = NULL;
+
+    if ( aIcon )
+        {
+        // Drop ownership of bitmaps from icon
+        aIcon->SetBitmapsOwnedExternally( ETrue );
+        // Get bitmaps
+        CFbsBitmap* bitmap = aIcon->Bitmap();
+        CFbsBitmap* mask = aIcon->Mask();
+        delete aIcon; // Does not own bitmaps anymore, so let it go
+
+        // Always return the bitmap and transfer ownership if there is one
+        if ( bitmap )
+            {
+            returnedBitmap = bitmap;
+            }
+
+        // Set the mask if there is a bitmap, an icon and a mask
+        TBool maskOwnershipTransferred = EFalse;
+        if ( bitmap && mask && HasIcon() )
+            {
+            maskOwnershipTransferred = SetIconMask( mask );
+            }
+        if ( !maskOwnershipTransferred )
+            {
+            // Ownership didn't transfer
+            delete mask;
+            }
+        }
+
+    return returnedBitmap;  // Caller takes ownership
+    }