diff -r 7d48bed6ce0c -r 987c9837762f cbs/cbsui/UiSrc/CCbsUiTopicListViewContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbs/cbsui/UiSrc/CCbsUiTopicListViewContainer.cpp Wed Sep 01 12:15:03 2010 +0100 @@ -0,0 +1,617 @@ +/* +* Copyright (c) 2009 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: +* TopicListViewContainer owns the list box which shows topics. +* +*/ + + +// INCLUDES +#include // CAknContextPane +#include // TMbmCbsuiapp +#include // KAknsMessageSkinChange +#include // CreateIconL, SkinInstance +#include // AknTextUtils +#include // KEikDynamicLayoutVariantSwitch +#include +#include +#include +#include +#include +#include // KDC_RESOURCE_FILES_DIR +#include +#include "CbsUiId.h" +#include +#include "CCbsUiTopicListViewContainer.h" +#include "CCbsUiTopicListView.h" +#include "Cbsuiapp.hrh" +#include "CbsUiUtility.h" +#include "CbsUiPanic.h" +#include "CbsUiConstants.h" + + +// CONSTANTS +_LIT(KDirAndCbsUiAppMbmFile,"z:cbsuiapp.mbm"); +_LIT(KItemSeparator1, "\t "); +_LIT(KItemSeparator2, "\t4"); +const TInt KSizeOfStatus = 1; +const TInt KCountOfSeparator1 = 2; +const TInt KNumberOfIconsInTopicListContainer = 5; +const TUint KZeroFill = '0'; +const TUint KSubscribedAndNoMessages = '0'; +const TUint KSubscribedAndMessages = '1'; +const TUint KNotSubscribedAndNoMessages = '2'; +const TUint KNotSubscribedButMessagesExists = '3'; + + +//DATA TYPES +enum TopicListViewIconArrayIndexes + { + ECbsPropCbSubs = 0, + ECbsPropCbSubsUnread, + ECbsPropCbUnsubs, + ECbsPropCbUnsubsUnread, + ECbsIndiCbHotAdd + }; + + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// + +CCbsUiTopicListViewContainer::CCbsUiTopicListViewContainer( CCbsUiTopicListView& aListView ) + : iListView( aListView ) + { + } + +// Symbian OS default constructor can leave. +void CCbsUiTopicListViewContainer::ConstructL( const TRect& aRect ) + { + CreateWindowL(); + + SetMopParent(&iListView); + + iListBox = new(ELeave) CAknSingleGraphicHeadingStyleListBox; + iListBox->SetContainerWindowL(*this); + + iListBox->ConstructL( this, EEikListBoxMultipleSelection ); + + CDesCArrayFlat* array = + new (ELeave) CDesCArrayFlat(KNumberOfStandardTopics); + + // changing the owner, shouldn't leave + iListBox->Model()->SetItemTextArray( array ); + + iListBox->CreateScrollBarFrameL( ETrue ); + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EAuto ); + iListBox->SetListBoxObserver( this ); + + SetRect( aRect ); + LoadIconsL(); + } + +// Two-phased constructor. +CCbsUiTopicListViewContainer* CCbsUiTopicListViewContainer::NewL( CCbsUiTopicListView& aListView, + const TRect& aRect ) + { + CCbsUiTopicListViewContainer* self = + new (ELeave) CCbsUiTopicListViewContainer( aListView ); + + CleanupStack::PushL( self ); + self->ConstructL( aRect ); + CleanupStack::Pop(); + + return self; + } + +// Destructor +CCbsUiTopicListViewContainer::~CCbsUiTopicListViewContainer() + { + delete iListBox; + } + +// --------------------------------------------------------- +// CCbsUiTopicListViewContainer::ReloadStarts +// +// +// --------------------------------------------------------- +// +void CCbsUiTopicListViewContainer::ReloadStarts() const + { + MDesCArray* itemList = iListBox->Model()->ItemTextArray(); + CDesCArray* itemArray = STATIC_CAST(CDesCArray*, itemList); + + itemArray->Reset(); + } + +// --------------------------------------------------------- +// CCbsUiTopicListViewContainer::CountComponentControls +// +// +// --------------------------------------------------------- +// +TInt CCbsUiTopicListViewContainer::CountComponentControls() const + { + return 1; + } + +// --------------------------------------------------------- +// +// +// +// --------------------------------------------------------- +// +CCoeControl* CCbsUiTopicListViewContainer::ComponentControl( TInt /*aIndex*/ ) const + { + return iListBox; + } + +// --------------------------------------------------------- +// CCbsUiTopicListViewContainer::OfferKeyEventL +// +// +// --------------------------------------------------------- +// +TKeyResponse CCbsUiTopicListViewContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + TKeyResponse result = EKeyWasNotConsumed; + + switch ( aKeyEvent.iCode ) + { + case EKeyEnter: // To support qwert keyboard + case EKeyOK: + // to open a right topic + iListView.MarkCurrentHandle(); + iListView.ProcessCommandL(ECbsUiappCmdSwitchOpen); + result = EKeyWasConsumed; + break; + case EKeyBackspace: + iListView.MarkCurrentHandle(); + iListView.ProcessCommandL(ECbsUiappCmdSwitchDelete); + result = EKeyWasConsumed; + break; + default: + result = iListBox->OfferKeyEventL(aKeyEvent, aType); + break; + } + + return result; + } + + +// --------------------------------------------------------- +// CCbsUiTopicListViewContainer::SetCurrentItemIndex +// +// +// --------------------------------------------------------- +// +void CCbsUiTopicListViewContainer::SetCurrentItemIndex( TInt aItemIndex ) const + { + + MDesCArray* itemList = iListBox->Model()->ItemTextArray(); + CDesCArray* itemArray = STATIC_CAST(CDesCArray*, itemList); + + TInt count( itemArray->MdcaCount() ); + + __ASSERT_DEBUG( + aItemIndex >= EMinTopicNumber && + aItemIndex <= EMaxTopicNumber, + CbsUiPanic( EErrBadIndex ) ); + + if ( aItemIndex < count && aItemIndex >= EMinTopicNumber ) + { + iListBox->SetCurrentItemIndexAndDraw( aItemIndex ); + } + } + +// --------------------------------------------------------- +// CCbsUiTopicListViewContainer::ReloadOfferTopicL +// +// +// --------------------------------------------------------- +// +void CCbsUiTopicListViewContainer::ReloadOfferTopicL( const TCbsTopic& aTopic ) const + { + + MDesCArray* itemList = iListBox->Model()->ItemTextArray(); + CDesCArray* itemArray = STATIC_CAST(CDesCArray*, itemList); + + TBuf ch; + ch.Append( GetStatus(aTopic) ); + TBuf index; + GetIndexNumber(aTopic, index); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( index ); + + HBufC* buffer = HBufC::NewLC( + aTopic.iName.Length() + KItemSeparator1().Length() * + KCountOfSeparator1 + KItemSeparator2().Length() + + index.Length() + ch.Length() ); + + TPtr ptr = buffer->Des(); + ptr = ch; + ptr.Append(KItemSeparator1); + ptr.Append(index); + ptr.Append(KItemSeparator1); + ptr.Append(aTopic.iName); + + if ( aTopic.iHotmarked ) + { + ptr.Append(KItemSeparator2); + } + + itemArray->AppendL(*buffer); + CleanupStack::PopAndDestroy(); // buffer + } + +// --------------------------------------------------------- +// CCbsUiTopicListViewContainer::ReloadEndsL +// +// +// --------------------------------------------------------- +// +void CCbsUiTopicListViewContainer::ReloadEndsL() + { + iListBox->HandleItemAdditionL(); + } + +// --------------------------------------------------------- +// CCbsUiTopicListViewContainer::CurrentPosition +// +// +// --------------------------------------------------------- +// +TInt CCbsUiTopicListViewContainer::CurrentPosition() const + { + TInt result(KCbsErrValue); + + if ( iListBox ) + { + result = iListBox->CurrentItemIndex(); + } + + return result; + } + +// --------------------------------------------------------- +// CCbsUiTopicListViewContainer::GetStatus +// +// Informs which icon to use. +// --------------------------------------------------------- +// +TChar CCbsUiTopicListViewContainer::GetStatus( const TCbsTopic& aTopic ) const + { + + TChar retVal(KSubscribedAndNoMessages); + + + if ( aTopic.iSubscribed ) + { + if ( aTopic.iUnreadMessages == 0 ) + { + retVal = KSubscribedAndNoMessages; + } + else + { + retVal = KSubscribedAndMessages; + } + } + else + { + if ( aTopic.iUnreadMessages == 0 ) + { + retVal = KNotSubscribedAndNoMessages; + } + else + { + retVal = KNotSubscribedButMessagesExists; + } + } + + return retVal; + } + +// --------------------------------------------------------- +// CCbsUiTopicListViewContainer::GetIndexNumber +// +// +// --------------------------------------------------------- +// +void CCbsUiTopicListViewContainer::GetIndexNumber( const TCbsTopic& aTopic , + TBuf& aIndexNumber ) const + { + TBuf ind; + + __ASSERT_DEBUG( aIndexNumber.MaxSize() >= KTopicNumberLength, + CbsUiPanic(EErrBadLength) ); + + ind.AppendNum( TInt(aTopic.iNumber) ); + aIndexNumber.Justify(ind , KTopicNumberLength, ERight, KZeroFill); + } + +// --------------------------------------------------------- +// CCbsUiTopicListViewContainer::SizeChanged +// +// +// --------------------------------------------------------- +// +void CCbsUiTopicListViewContainer::SizeChanged() + { + if (iListBox) + { + iListBox->SetRect( Rect() ); + } + } + +// --------------------------------------------------------- +// CCbsUiTopicListViewContainer::FocusChanged +// --------------------------------------------------------- +// +void CCbsUiTopicListViewContainer::FocusChanged( TDrawNow aDrawNow ) + { + CCoeControl::FocusChanged( aDrawNow ); + if( iListBox ) + { + iListBox->SetFocus( IsFocused(), aDrawNow ); + } + } + +// --------------------------------------------------------- +// CCbsUiTopicListViewContainer::GetHelpContext +// +// Gets the control's help context. +// --------------------------------------------------------- +// +void CCbsUiTopicListViewContainer::GetHelpContext(TCoeHelpContext& aContext) const + { + aContext.iMajor = TUid::Uid(KUidCbsUiappDef); + aContext.iContext = KCBS_HLP_MAIN; + } + + + +// ---------------------------------------------------- +// CCbsUiTopicListViewContainer::HandleResourceChange +// +// ---------------------------------------------------- +void CCbsUiTopicListViewContainer::HandleResourceChange( TInt aType ) + { + CCoeControl::HandleResourceChange( aType ); + + if( aType == KEikDynamicLayoutVariantSwitch ) + { + iListView.HandleRectChangeInContainer(); + } + + if( aType == KAknsMessageSkinChange ) + { + // change skin bitmap + TRAPD( ignore, SkinBitmapChangesL( ) ); + if( ignore ) + { + ignore = KErrNone; //Prevent ARMV5 compilation varning + } + } + } + +// ---------------------------------------------------- +// CCbsUiTopicListViewContainer::HandleListBoxEventL +// +// ---------------------------------------------------- +void CCbsUiTopicListViewContainer::HandleListBoxEventL( CEikListBox* /*aListBox*/, + TListBoxEvent aEventType ) + { + switch ( aEventType ) + { + case EEventItemSingleClicked: + { + TKeyEvent keyEvent; + keyEvent.iCode = EKeyOK; + OfferKeyEventL( keyEvent, EEventKey ); + break; + } + default: + break; + } + } + +// --------------------------------------------------------- +// CCbsUiTopicListViewContainer::LoadIconsL +// +// +// --------------------------------------------------------- +// +void CCbsUiTopicListViewContainer::LoadIconsL() + { + CAknIconArray* icons = + new (ELeave) CAknIconArray(KNumberOfIconsInTopicListContainer); + CleanupStack::PushL(icons); + + TParse parse; + parse.Set(KDirAndCbsUiAppMbmFile, &KDC_APP_BITMAP_DIR, NULL); + TFileName mbmFileAndPathName(parse.FullName()); + + // First icon & mask. + AddIconL( KAknsIIDQgnPropCbSubs, icons, mbmFileAndPathName, EMbmCbsuiappQgn_prop_cb_subs, + EMbmCbsuiappQgn_prop_cb_subs_mask ); + + // Second icon & mask. + AddIconL( KAknsIIDQgnPropCbSubsUnread, icons, mbmFileAndPathName, EMbmCbsuiappQgn_prop_cb_subs_unread, + EMbmCbsuiappQgn_prop_cb_subs_unread_mask ); + + // Third icon & mask. + AddIconL( KAknsIIDQgnPropCbUnsubs, icons, mbmFileAndPathName, EMbmCbsuiappQgn_prop_cb_unsubs, + EMbmCbsuiappQgn_prop_cb_unsubs_mask ); + + // Fourth icon & mask. + AddIconL( KAknsIIDQgnPropCbUnsubsUnread, icons, mbmFileAndPathName, EMbmCbsuiappQgn_prop_cb_unsubs_unread, + EMbmCbsuiappQgn_prop_cb_unsubs_unread_mask ); + + // Fifth icon & mask. + AddIconL( KAknsIIDQgnIndiCbHotAdd, icons, mbmFileAndPathName, EMbmCbsuiappQgn_indi_cb_hot_add, + EMbmCbsuiappQgn_indi_cb_hot_add_mask, ETrue ); + + CleanupStack::Pop(); // icons + + iListBox->ItemDrawer()->ColumnData()->SetIconArray( icons ); + } + + +// --------------------------------------------------------- +// CCbsUiTopicListViewContainer::AddIconL +// +// +// --------------------------------------------------------- +// +void CCbsUiTopicListViewContainer::AddIconL( + TAknsItemID aId, + CAknIconArray* aIcons, + const TDesC& aIconFileWithPath, + TInt aIconGraphicsIndex, + TInt aIconGraphicsMaskIndex, + TBool aColorIcon ) + { + // icon & mask. + MAknsSkinInstance* skins = AknsUtils::SkinInstance(); + + // COnstruct the icon and append it to icon array + CGulIcon* icon = ConstructIconL( aColorIcon, skins, aId, + aIconFileWithPath, aIconGraphicsIndex, aIconGraphicsMaskIndex ); + CleanupStack::PushL( icon ); + aIcons->AppendL( icon ); + CleanupStack::Pop( ); // icon + } + +// ---------------------------------------------------- +// CCbsUiTopicListViewContainer::SkinBitmapChangesL +// ---------------------------------------------------- +void CCbsUiTopicListViewContainer::SkinBitmapChangesL() + { + CArrayPtr *icons = 0; + icons = iListBox->ItemDrawer()->ColumnData()->IconArray(); + + TAknsItemID id; + id.iMajor = 0; + id.iMinor = 0; + + TInt count = icons->Count(); + TInt bitmapIndex = 0; + TInt bitmapMaskIndex = 0; + TBool colourIcon( EFalse ); + + // Change list icons + MAknsSkinInstance* skins = AknsUtils::SkinInstance(); + for ( TInt cc=count; --cc>=0; ) + { + switch( cc ) + { + case ECbsPropCbSubs: + bitmapIndex = EMbmCbsuiappQgn_prop_cb_subs; + bitmapMaskIndex = EMbmCbsuiappQgn_prop_cb_subs_mask; + id = KAknsIIDQgnPropCbSubs; + break; + case ECbsPropCbSubsUnread: + bitmapIndex = EMbmCbsuiappQgn_prop_cb_subs_unread; + bitmapMaskIndex = EMbmCbsuiappQgn_prop_cb_subs_unread_mask; + id = KAknsIIDQgnPropCbSubsUnread; + break; + case ECbsPropCbUnsubs: + bitmapIndex = EMbmCbsuiappQgn_prop_cb_unsubs; + bitmapMaskIndex = EMbmCbsuiappQgn_prop_cb_unsubs_mask; + id = KAknsIIDQgnPropCbUnsubs; + break; + case ECbsPropCbUnsubsUnread: + bitmapIndex = EMbmCbsuiappQgn_prop_cb_unsubs_unread; + bitmapMaskIndex = EMbmCbsuiappQgn_prop_cb_unsubs_unread_mask; + id = KAknsIIDQgnPropCbUnsubsUnread; + break; + case ECbsIndiCbHotAdd: + bitmapIndex = EMbmCbsuiappQgn_indi_cb_hot_add; + bitmapMaskIndex = EMbmCbsuiappQgn_indi_cb_hot_add_mask; + id = KAknsIIDQgnIndiCbHotAdd; + colourIcon = ETrue; + break; + default: + bitmapIndex = EMbmCbsuiappQgn_prop_cb_unsubs_unread; + bitmapMaskIndex = EMbmCbsuiappQgn_prop_cb_unsubs_unread_mask; + id = KAknsIIDQgnPropCbUnsubsUnread; + break; + } + + // icon & mask + TParse parse; + parse.Set( KDirAndCbsUiAppMbmFile, &KDC_APP_BITMAP_DIR, NULL ); + TFileName mbmFileAndPathName( parse.FullName() ); + + CGulIcon* icon = ConstructIconL( colourIcon, skins, id, + mbmFileAndPathName, bitmapIndex, bitmapMaskIndex ); + + CleanupStack::PushL( icon ); + CGulIcon* iconToBeDelete = icons->At( cc ); + icons->At( cc ) = icon; + delete iconToBeDelete; + iconToBeDelete = NULL; + + CleanupStack::Pop(); // icon + + colourIcon = EFalse; + } + } + + +// ---------------------------------------------------- +// CCbsUiTopicListViewContainer::ConstructIconL +// ---------------------------------------------------- +CGulIcon* CCbsUiTopicListViewContainer::ConstructIconL( + TBool& aColourIcon, + MAknsSkinInstance* aSkins, + const TAknsItemID& aID, + const TDesC& aFilename, + const TInt aFileBitmapId, + const TInt aFileMaskId ) + { + // icon & mask + CFbsBitmap* bitmap; + CFbsBitmap* mask; + + if ( aColourIcon ) + { + AknsUtils::CreateColorIconL( + aSkins, + aID, + KAknsIIDQsnIconColors, + EAknsCIQsnIconColorsCG13, // Check the used color group - this is usually correct group for D-column stuff + bitmap, + mask, + aFilename, + aFileBitmapId, + aFileMaskId , + KRgbBlack ); // This is default color used, if the color skinning fails, or there is no color defined. + } + else + { + AknsUtils::CreateIconL( aSkins, aID, bitmap, + mask, aFilename, aFileBitmapId, + aFileMaskId ); + } + + CGulIcon* icon = CGulIcon::NewL( bitmap, mask ); + return icon; + } + +// End of File