cbs/cbsui/UiSrc/CCbsUiTopicListViewContainer.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:15:03 +0100
branchRCL_3
changeset 20 987c9837762f
parent 0 ff3b6d0fd310
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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 <akncontext.h>      // CAknContextPane
#include <cbsuiapp.mbg>      // TMbmCbsuiapp
#include <AknsConstants.h>   // KAknsMessageSkinChange
#include <AknsUtils.h>       // CreateIconL, SkinInstance
#include <AknUtils.h>        // AknTextUtils
#include <AknDef.h>          // KEikDynamicLayoutVariantSwitch
#include <barsread.h>
#include <aknlists.h>
#include <gulicon.h>
#include <eikclbd.h>
#include <AknIconArray.h>
#include <data_caging_path_literals.hrh> // KDC_RESOURCE_FILES_DIR
#include <cbsuiApp.rsg>
#include "CbsUiId.h"
#include <csxhelp/cbs.hlp.hrh>
#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<KSizeOfStatus> ch;
    ch.Append( GetStatus(aTopic) );
    TBuf<KTopicNumberLength> 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<KTopicNumberLength>& aIndexNumber ) const
    {
    TBuf<KTopicNumberLength> 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<CGulIcon> *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