cbs/cbsui/UiSrc/CCbsUiTopicViewContainer.cpp
branchRCL_3
changeset 20 987c9837762f
parent 0 ff3b6d0fd310
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbs/cbsui/UiSrc/CCbsUiTopicViewContainer.cpp	Wed Sep 01 12:15:03 2010 +0100
@@ -0,0 +1,605 @@
+/*
+* 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