diff -r 000000000000 -r 094583676ce7 wvuing/wvuiave/AppSrc/ccacoloursettingitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuiave/AppSrc/ccacoloursettingitem.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -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 +#include +#include +#include +#include +#include + +#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* 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* colors = new( ELeave ) CArrayFixFlat( 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 + }