cbs/cbsui/UiSrc/CCbsUiTopicViewContainer.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) 2002-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:  CCbsUiTopicViewContainer is container for CCbsUiTopicView. 
*               It has one control, a list box, which is showing information
*               about messages in one topic.
*
*
*/


//  INCLUDES
#include <AknsConstants.h>    // KAknsMessageSkinChange
#include <cbsuiapp.mbg>       // TMbmCbsuiapp
#include <AknsUtils.h>        // CreateIconL, SkinInstance
#include <akncontext.h>       // CAknContextPane
#include <AknUtils.h>         // AknLayoutUtils 
#include <AknDef.h>           // KEikDynamicLayoutVariantSwitch
#include <e32std.h>
#include <calslbs.h>
#include <barsread.h>
#include <gulicon.h>
#include <eikfrlbd.h>
#include <eikclbd.h>
#include <eikslb.h>
#include <eiklbx.h>
#include <avkon.hrh>
#include <aknlists.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 "Cbsuiapp.hrh"
#include "CCbsUiTopicViewContainer.h"
#include "CCbsUiTopicView.h"
#include "CbsUiUtility.h"
#include "CbsUiPanic.h"
#include "CbsUiConstants.h"
 

// CONSTANTS
_LIT(KDirAndCbsUiAppMbmFile,"z:cbsuiapp.mbm");
_LIT(KSeparator1, "1\t");
_LIT(KSeparator2, "0\t");
_LIT(KSeparator3, "\t2");

const TInt KNumberOfIconsInTopicViewcontainer = 6;


//DATA TYPES
enum TopicViewIconArrayIndexes
    {
    ECbsPropCbMsgUnread = 0,
    ECbsPropCbMsg,
    ECbsIndiCbKeptAdd
    };



// ================= MEMBER FUNCTIONS =======================

// C++ default constructor can NOT contain any code, that
// might leave.
//
CCbsUiTopicViewContainer::CCbsUiTopicViewContainer( CCbsUiTopicView& aTopicView )
                                                   : iTopicView( aTopicView )
    {
    }

// Symbian OS default constructor can leave.
void CCbsUiTopicViewContainer::ConstructL( const TRect& aRect )
    {
    CreateWindowL();
    SetMopParent(&iTopicView);
    
    iListBox = new (ELeave) CAknSingleGraphicStyleListBox;
    iListBox->SetContainerWindowL(*this);
    iListBox->ConstructL(this, EEikListBoxMultipleSelection);
    iListBox->CreateScrollBarFrameL( ETrue );
    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
        CEikScrollBarFrame::EOff,
        CEikScrollBarFrame::EAuto );
    
    CDesCArrayFlat* array = 
        new (ELeave) CDesCArrayFlat( KNumberOfTemporaryMessages );
    
    // changing the owner, shouldn't leave 
    iListBox->Model()->SetItemTextArray(array);
    iListBox->SetListBoxObserver( this );
    
    SetRect(aRect);
    LoadIconsL();
    }

// Two-phased constructor.
CCbsUiTopicViewContainer* CCbsUiTopicViewContainer::NewL( CCbsUiTopicView& aTopicView, const TRect& aRect )
    {
    CCbsUiTopicViewContainer* self = 
        new (ELeave) CCbsUiTopicViewContainer(aTopicView);
    
    CleanupStack::PushL(self);
    self->ConstructL(aRect);
    CleanupStack::Pop();
    return self;
    }

// Destructor
CCbsUiTopicViewContainer::~CCbsUiTopicViewContainer()
    {
    delete iListBox;
    }

// ---------------------------------------------------------
// CCbsUiTopicViewContainer::ReloadStarts
// 
// 
// ---------------------------------------------------------
//
void CCbsUiTopicViewContainer::ReloadStarts() const
    {
    MDesCArray* itemList = iListBox->Model()->ItemTextArray();
    CDesCArray* itemArray = STATIC_CAST(CDesCArray*, itemList);
    itemArray->Reset();
    }

// ---------------------------------------------------------
// CCbsUiTopicViewContainer::ReloadOfferL
// 
// 
// ---------------------------------------------------------
// 
void CCbsUiTopicViewContainer::ReloadOfferL( const TCbsMessage& aMessage, const TDesC& aBuffer ) const
    {
    MDesCArray* itemList = iListBox->Model()->ItemTextArray();
    CDesCArray* itemArray = STATIC_CAST(CDesCArray*, itemList);
    
    TInt titleLength( (aBuffer.Length() > KMaxMessageTitleLength ) ? 
                       KMaxMessageTitleLength : aBuffer.Length() );
    
    HBufC* buffer = HBufC::NewMaxLC( titleLength + KSeparator1().Length() + KSeparator2().Length() +
        KSeparator3().Length() );
    
    TPtr ptr = buffer->Des();    
    
    // First column icon.
    if ( aMessage.iRead )
        {
        ptr = KSeparator1;
        }
    else
        {
        ptr = KSeparator2;
        }
    
    for ( TInt index(0); index < titleLength; index++ )
        {
        TChar character = aBuffer[index];
        
        // if character is line break, then stop
        if ( character == EKeyLineFeed
            || character == EKeyEnter )
            {
            break;
            }
        
        ptr.Append( character );
        }
    
    // And finally saved icon.
    if ( aMessage.iPermanent )
        {
        ptr.Append(KSeparator3);
        }
    
    // Finally append!
    itemArray->AppendL(*buffer);
    CleanupStack::PopAndDestroy(); // buffer
    }

// ---------------------------------------------------------
// CCbsUiTopicViewContainer::ReloadEndsL
// 
// 
// ---------------------------------------------------------
//    
void CCbsUiTopicViewContainer::ReloadEndsL()
    {  
    // Inform listbox that some items has been added.
    iListBox->HandleItemAdditionL();
    // check if listbox has any item. if numberOfItems == 0
    // then disable scrollbars
    if ( iListBox->Model()->NumberOfItems() == 0 )
    	{
    	iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
    		CEikScrollBarFrame::EOff,
    		CEikScrollBarFrame::EOff );
    	}
    else
    	{
    	iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
    		CEikScrollBarFrame::EOff,
    		CEikScrollBarFrame::EAuto );
    	}	
    }

// ---------------------------------------------------------
// CCbsUiTopicViewContainer::CurrentPosition
// 
// 
// ---------------------------------------------------------
//
TInt CCbsUiTopicViewContainer::CurrentPosition() const
    {
    return iListBox->CurrentItemIndex();
    }

// ---------------------------------------------------------
// CCbsUiTopicViewContainer::SetCurrentItemIndex
// 
// 
// ---------------------------------------------------------
//
void CCbsUiTopicViewContainer::SetCurrentItemIndex( TInt aItemIndex ) const
    {
    __ASSERT_DEBUG( aItemIndex >= 0, CbsUiPanic(EErrInvalidValue) );
    
    MDesCArray* itemList = iListBox->Model()->ItemTextArray();
    CDesCArray* itemArray = STATIC_CAST(CDesCArray*, itemList);
    
    TInt count( itemArray->MdcaCount() );
    
    if ( count > aItemIndex && count >= 0 )
        {
        iListBox->SetCurrentItemIndexAndDraw(aItemIndex);
        }
    }

// ----------------------------------------------------
// CCbsUiTopicViewContainer::HandleListBoxEventL
//
// ----------------------------------------------------
void CCbsUiTopicViewContainer::HandleListBoxEventL(	CEikListBox* /*aListBox*/,
                                                     TListBoxEvent aEventType )
    {
    switch ( aEventType )
        {
        case EEventItemSingleClicked:
            {
            TKeyEvent keyEvent;
            keyEvent.iCode = EKeyOK;
            OfferKeyEventL( keyEvent, EEventKey );
            break;
            }
        default:
            break;
        }
    }

// ---------------------------------------------------------
// CCbsUiTopicViewContainer::GetListBox
// 
// 
// ---------------------------------------------------------
//
CEikColumnListBox* CCbsUiTopicViewContainer::GetListBox() 
    {
    return iListBox;
    }

// ---------------------------------------------------------
// CCbsUiTopicViewContainer::CountComponentControls
// 
// 
// ---------------------------------------------------------
//
TInt CCbsUiTopicViewContainer::CountComponentControls() const
    {
    return 1;
    }

// ---------------------------------------------------------
// 
// 
// 
// ---------------------------------------------------------
//
CCoeControl* CCbsUiTopicViewContainer::ComponentControl( TInt /*aIndex*/ ) const 
    { 
    return iListBox;
    }

// ---------------------------------------------------------
// CCbsUiTopicViewContainer::OfferKeyEventL
// 
// 
// ---------------------------------------------------------
//
TKeyResponse CCbsUiTopicViewContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
    {    
    TKeyResponse result = EKeyWasNotConsumed;
    
    switch (aKeyEvent.iCode)
        {
        case EKeyLeftArrow:
            {
            if( AknLayoutUtils::LayoutMirrored() )
                {
                // Go to next topic.
                iTopicView.ProcessCommandL( ECbsUiappTopicViewCmdGoToNextTopic );
                }
            else
                {            
                // Go to previous topic.
                iTopicView.ProcessCommandL( ECbsUiappTopicViewCmdGoToPrevTopic );
                }
            result = EKeyWasConsumed;
            break;
            }            
        case EKeyRightArrow:
            {
            if( AknLayoutUtils::LayoutMirrored() )
                {
                // Go to previous topic.
                iTopicView.ProcessCommandL( ECbsUiappTopicViewCmdGoToPrevTopic );
                }
            else
                {            
                // Go to next topic.
                iTopicView.ProcessCommandL( ECbsUiappTopicViewCmdGoToNextTopic );
                }
            result = EKeyWasConsumed;
            break;
            } 
        case EKeyEnter:
        case EKeyOK:
            {
            // to open a right message
            iTopicView.MarkCurrentlyFocusedHandle();
            iTopicView.ProcessCommandL( ECbsUiappCmdTopicMenuRead );
            result = EKeyWasConsumed;
            break;
            }            
        case EKeyBackspace:
            {
            iTopicView.MarkCurrentlyFocusedHandle();
            iTopicView.ProcessCommandL( ECbsUiappCmdMessageDelete );
            result = EKeyWasConsumed;
            break;
            }
        default:
            {
            result = iListBox->OfferKeyEventL( aKeyEvent, aType );
            break;            
            }
        }
    
    return result;
    }

// ---------------------------------------------------------
// CCbsUiTopicViewContainer::SizeChanged
// 
// 
// ---------------------------------------------------------
//
void CCbsUiTopicViewContainer::SizeChanged()
    {
    if (iListBox) 
        {
        iListBox->SetRect( Rect() );
        }
    }


// ---------------------------------------------------------
// CCbsUiTopicViewContainer::FocusChanged
// ---------------------------------------------------------
//
void CCbsUiTopicViewContainer::FocusChanged( TDrawNow aDrawNow )
    {
    CCoeControl::FocusChanged( aDrawNow );
    if( iListBox )
        {
        iListBox->SetFocus( IsFocused(), aDrawNow );
        }
    }


// ---------------------------------------------------------
// CCbsUiTopicViewContainer::GetHelpContext
// 
// Gets the control's help context.
// ---------------------------------------------------------
//
void CCbsUiTopicViewContainer::GetHelpContext( TCoeHelpContext& aContext ) const
    {
    aContext.iMajor = TUid::Uid(KUidCbsUiappDef);
    aContext.iContext = KCBS_HLP_TOPIC_VIEW;
    }


// ----------------------------------------------------
// CCbsUiTopicViewContainer::HandleResourceChange
//
//
// ----------------------------------------------------
void CCbsUiTopicViewContainer::HandleResourceChange( TInt aType )
    {
    CCoeControl::HandleResourceChange( aType );

    if( aType == KEikDynamicLayoutVariantSwitch )
        {
        iTopicView.HandleRectChangeInContainer();  
        }
    
    if( aType == KAknsMessageSkinChange )
        {
        // change skin bitmap
        TRAPD( ignore, SkinBitmapChangesL( ) );
        if( ignore )
            {
            ignore = KErrNone; //This prevent only ARMV5 varnings!!
            }
        }    
    }



// ---------------------------------------------------------
// CCbsUiTopicViewContainer::LoadIconsL
// 
// 
// ---------------------------------------------------------
//
void CCbsUiTopicViewContainer::LoadIconsL()
    {
    CAknIconArray* icons = new (ELeave) CAknIconArray(KNumberOfIconsInTopicViewcontainer);
    CleanupStack::PushL(icons);

    TParse parse; 
    parse.Set(KDirAndCbsUiAppMbmFile, &KDC_APP_BITMAP_DIR, NULL); 
    TFileName mbmFileAndPathName(parse.FullName());

    // First icon & mask.
    AddIconL( KAknsIIDQgnPropCbMsgUnread, icons, mbmFileAndPathName, EMbmCbsuiappQgn_prop_cb_msg_unread,
              EMbmCbsuiappQgn_prop_cb_msg_unread_mask );

    // Second icon & mask.
    AddIconL( KAknsIIDQgnPropCbMsg, icons, mbmFileAndPathName, EMbmCbsuiappQgn_prop_cb_msg,
              EMbmCbsuiappQgn_prop_cb_msg_mask );

    // Third icon & mask.
    AddIconL( KAknsIIDQgnIndiCbKeptAdd, icons, mbmFileAndPathName, EMbmCbsuiappQgn_indi_cb_kept_add,
              EMbmCbsuiappQgn_indi_cb_kept_add_mask, ETrue );

    CleanupStack::Pop(); // icons
    
    iListBox->ItemDrawer()->ColumnData()->SetIconArray( icons );
    }


// ---------------------------------------------------------
// CCbsUiTopicViewContainer::AddIconL
// 
// 
// ---------------------------------------------------------
//
void CCbsUiTopicViewContainer::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
    }



// ----------------------------------------------------
// CCbsUiTopicViewContainer::SkinBitmapChangesL
// ----------------------------------------------------
void CCbsUiTopicViewContainer::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;

    //change list icons
    MAknsSkinInstance* skins = AknsUtils::SkinInstance();
    for ( TInt cc=count; --cc>=0; )
        {
        switch( cc )
            {
            case ECbsPropCbMsgUnread:                
                bitmapIndex = EMbmCbsuiappQgn_prop_cb_msg_unread;
                bitmapMaskIndex = EMbmCbsuiappQgn_prop_cb_msg_unread_mask;
                id = KAknsIIDQgnPropCbMsgUnread;
                break;
            case ECbsPropCbMsg:                
                bitmapIndex = EMbmCbsuiappQgn_prop_cb_msg;
                bitmapMaskIndex = EMbmCbsuiappQgn_prop_cb_msg_mask;
                id = KAknsIIDQgnPropCbMsg;
                break;
            case ECbsIndiCbKeptAdd:                
                bitmapIndex = EMbmCbsuiappQgn_indi_cb_kept_add;
                bitmapMaskIndex = EMbmCbsuiappQgn_indi_cb_kept_add_mask;
                id = KAknsIIDQgnIndiCbKeptAdd;
                break;
            default:                
                bitmapIndex = EMbmCbsuiappQgn_prop_cb_msg_unread;
                bitmapMaskIndex = EMbmCbsuiappQgn_prop_cb_msg_unread_mask;
                id = KAknsIIDQgnPropCbMsgUnread;
                break;           
            } 
        
        CFbsBitmap* bitmap;
        CFbsBitmap* mask;
        TParse parse; 
        parse.Set(KDirAndCbsUiAppMbmFile, &KDC_APP_BITMAP_DIR, NULL); 
        TFileName mbmFileAndPathName(parse.FullName());
        AknsUtils::CreateIconL( skins, id, bitmap,
            mask, mbmFileAndPathName, bitmapIndex, bitmapMaskIndex );      

        CGulIcon* icon = CGulIcon::NewL( bitmap, mask );
     
        CleanupStack::PushL( icon );
        CGulIcon* iconToBeDelete = icons->At( cc );
        icons->At( cc ) = icon;
        delete iconToBeDelete;
        iconToBeDelete = NULL;

        CleanupStack::Pop(); // icon
    
        }  
    }


// ----------------------------------------------------
// CCbsUiTopicViewContainer::ConstructIconL
// ----------------------------------------------------
CGulIcon* CCbsUiTopicViewContainer::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