mobilemessaging/mmsui/notmtmsrc/MMBoxDialog.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/mmsui/notmtmsrc/MMBoxDialog.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,1974 @@
+/*
+* Copyright (c) 2004 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:   Implementation of the CMMBoxDialog class
+*
+*/
+
+
+
+// INCLUDES
+#include <eikmenup.h>
+#include <aknViewAppUi.h>               // iAvkonViewAppUi
+#include <AknWaitDialog.h>              // CAknWaitDialog
+#include <eikprogi.h>                   // CEikProgressInfo
+#include <AknQueryDialog.h>             // CAknQueryDialog
+#include <aknlists.h>
+#include <StringLoader.h>               // StringLoader
+#include <akntitle.h>                   // CAknTitlePane
+#include <AknIconArray.h>               // CAknIconArray
+// message includes
+#include <msvapi.h>                     // for CMsvSession
+#include <msvstd.h>                     // SelectionOrder
+#include <akninputblock.h>              // CAknInputBlock
+#include <MuiuMsvProgressReporterOperation.h> // MsvProgressReporterOperation
+#include <MuiuMsgEmbeddedEditorWatchingOperation.h> // CMsgEmbeddedEditorWatchingOperation
+#include <data_caging_path_literals.hrh> 
+#include <muiumsvuiserviceutilitiesinternal.h>
+
+#include <MuiuOperationWait.h>          // CMuiuOperationWait
+#include <csxhelp/mce.hlp.hrh>
+#include <hlplch.h>                     // For HlpLauncher 
+#include <bldvariant.hrh>
+#include <featmgr.h>                    // FeatureManager
+#include <muiu.mbg>                     // bitmaps
+#include <msvids.h>                     // for KMsvInboxIndexEntryId
+#include <mtclreg.h>
+#include <AknsUtils.h>                  // For skinned stuff
+#include <eikmenub.h>                   // For CEikMenuBar
+#include <aknnotewrappers.h>            // CAknInformationNote
+#include <mmsnotificationclient.h>      // For Notification Client MTM
+#include <aknnavi.h>                    // For navipane
+#include <aknnavide.h>                  // CAknNavigationDecorator
+#include <akntabgrp.h>                  // CAknTabGroup
+#include <aknenv.h>                     // CAknEnv
+
+#include <NotUi.rsg>
+#include "NotUi.hrh"                    // for EMsgControlIdMMBoxListBox
+#include "MMBoxDialog.h"
+#include "NotMtmUi.h"
+#include "NotMtmUiData.h"
+#include "MmsMtmConst.h"
+
+//  LOCAL CONSTANTS AND MACROS
+const TInt KMMBoxBitmapArrayGranularity = 4;
+const TInt KMMBoxMaxStatusInfoLength = 256;
+const TInt KDateSize            = 30;
+const TInt KMMBoxDialogFetchOperationsGranularity = 1;
+const TInt KLocalKilo = 1024;
+const TUid KUidMsvMessageListSortOrder={0x10005359};
+
+_LIT( KMMBoxMarkReplacement, "1");
+#define IS_PHONE_OFF_LINEL() MsvUiServiceUtilitiesInternal::IsPhoneOfflineL()
+//#if defined ( _DEBUG )
+// Enables notifications view testing without mmbox (to some extent).
+// Uses Inbox as notifications folder instead of mmbox folder.
+//#define MMS_NOTIFICATIONS_TESTING_WO_MMBOX 1
+//#endif
+
+
+//
+//
+// CMMBoxDialog
+//
+//
+
+// ----------------------------------------------------
+// CMMBoxDialog::CMMBoxDialog
+// ----------------------------------------------------
+CMMBoxDialog::CMMBoxDialog( CNotMtmUi&  aUi, 
+                            CNotMtmUiData&  aUiData, 
+                            CMsvSession& aSession, 
+                            TInt& aExitCode ):
+    iUi( aUi ),
+    iUiData( aUiData ),
+    iClientMtm( NULL ),
+    iSession( aSession ),
+    iNaviDecorator( NULL ),
+    iMMBoxFolderId( KMsvGlobalInBoxIndexEntryId ),
+    iFetchOperations( KMMBoxDialogFetchOperationsGranularity ),
+    iDeleteSelection( NULL ),
+    iExitCode( aExitCode ),
+    iFlags( 0 ),
+    iOriginalOrder ( KMsvNoGrouping, EMsvSortByDateReverse, EFalse )
+    {
+    iExitCode = KErrNone;
+    iMarkReplacementText.Copy( KMMBoxMarkReplacement );
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::~CMMBoxDialog
+// ----------------------------------------------------
+CMMBoxDialog::~CMMBoxDialog()
+    {
+    LOGTEXT(_L8("MMBoxDialog: Destructor "));
+    iSession.RemoveObserver( *this );
+    delete iClientMtm;
+    delete iMtmReg;
+    // do not delete iNavipane - it's just a pointer
+    delete iOldTitleText;
+    delete iDeleteOperation;
+    delete iOpenOperation;
+    for ( TInt cc=iFetchOperations.Count()-1; cc>=0; cc-- )
+        {
+        delete iFetchOperations[cc];
+        iFetchOperations.Delete(cc);
+        }    
+    iFetchOperations.ResetAndDestroy();
+    delete iDeleteSelection;
+    delete iUpdateOperation;
+    delete iWaitDialog;
+    delete iMessages;
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::NewL
+// ----------------------------------------------------
+CMMBoxDialog* CMMBoxDialog::NewL(   CNotMtmUi&  aUi, 
+                                    CNotMtmUiData&  aUiData, 
+                                    CMsvSession& aSession, 
+                                    TInt& aExitCode )
+    {
+    CMMBoxDialog* self= new(ELeave) CMMBoxDialog( aUi, 
+        aUiData, aSession, aExitCode );
+    CleanupStack::PushL(self);
+    self->ConstructL( );
+    CleanupStack::Pop( );
+    return self;
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::ConstructL
+// ----------------------------------------------------
+void CMMBoxDialog::ConstructL( )
+    {
+    LOGTEXT(_L8("MMBoxDialog: Construct start"));
+    CAknDialog::ConstructL( R_NOT_MMBOX_MENUBAR );
+    LOGTEXT(_L8("MMBoxDialog: Construct 2"));
+    iMessages = CMMBoxArray::NewL( iSession, iUiData );
+    LOGTEXT(_L8("MMBoxDialog: Construct 3"));
+    iSession.AddObserverL( *this );
+
+    // Prepare FeatureManager, read values to members and uninitialize FeatureManager
+    FeatureManager::InitializeLibL( );
+    if( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+        {
+        iFlags |= EHelpSupported;
+        }
+    FeatureManager::UnInitializeLib( );
+
+    CEikStatusPane *sp = iEikonEnv->AppUiFactory( )->StatusPane( );
+      
+    if ( sp )
+        {
+        iNaviPane = static_cast<CAknNavigationControlContainer*>
+        ( sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+        }
+    LOGTEXT(_L8("MMBoxDialog: Constructor end "));
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::PreLayoutDynInitL
+// ----------------------------------------------------
+void CMMBoxDialog::PreLayoutDynInitL( )
+    {
+    LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL start"));
+    CEikColumnListBox* listBox = ListBox( );
+    listBox->SetListBoxObserver( this );
+
+    // Create scroll bar
+    LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 2"));
+    listBox->CreateScrollBarFrameL( );
+    LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 3"));
+    CAknAppUiBase* appUi = static_cast<CAknAppUiBase*>( iEikonEnv->EikAppUi() );
+    if (AknLayoutUtils::DefaultScrollBarType(appUi) == CEikScrollBarFrame::EDoubleSpan)
+        {
+        // For EDoubleSpan type scrollbar
+        listBox->ScrollBarFrame( )->CreateDoubleSpanScrollBarsL(EFalse, EFalse); // non-window owning scrollbar
+        listBox->ScrollBarFrame( )->SetTypeOfVScrollBar(CEikScrollBarFrame::EDoubleSpan);
+        }
+    else
+        {
+        listBox->ScrollBarFrame( )->SetTypeOfVScrollBar(CEikScrollBarFrame::EArrowHead);
+        }
+    listBox->ScrollBarFrame( )->SetScrollBarVisibilityL(
+        CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+
+    // Set data
+    listBox->Model( )->SetItemTextArray( iMessages );
+    listBox->Model( )->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+    LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 4"));
+    HBufC* emptyText = StringLoader::LoadLC( 
+        R_NOT_MMBOX_EMPTY_STRING, 
+        iCoeEnv );
+    listBox->View( )->SetListEmptyTextL( *emptyText );
+    CleanupStack::PopAndDestroy( emptyText );
+
+    LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 5"));
+    StoreTitleTextAndNavipaneAndSetNewL( );
+    LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 6"));
+
+    iMtmReg = CClientMtmRegistry::NewL( iSession );
+    LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 7"));
+	iClientMtm = (CMmsNotificationClientMtm*)iMtmReg->NewMtmL( KUidMsgMMSNotification );
+    LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 8"));
+
+#ifndef MMS_NOTIFICATIONS_TESTING_WO_MMBOX
+    iMMBoxFolderId = iClientMtm->GetMmboxFolderL( );
+#else
+    LOGTEXT(_L8("MMBoxDialog: MMS_NOTIFICATIONS_TESTING_WO_MMBOX on"));
+#endif
+    LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 9"));
+
+    CArrayPtrFlat<CGulIcon>* icons 
+        = new( ELeave ) CAknIconArray( 
+        KMMBoxBitmapArrayGranularity ); 
+
+    CleanupStack::PushL( icons );
+
+    // create icon array
+    TFileName fileName;
+    fileName.Copy( KAvkonBitmapFile );
+    LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL Append bitmaps"));
+    // this must be first because of SetItemMarkReplacement index.
+    AppendSkinnedIconL( fileName, EMbmAvkonQgn_prop_checkbox_on, icons );
+    AppendSkinnedIconL( fileName, EMbmAvkonQgn_prop_checkbox_off, icons );
+    
+    // priority icons
+    AppendSkinnedIconL( fileName, EMbmAvkonQgn_indi_mce_priority_high, icons );
+    AppendSkinnedIconL( fileName, EMbmAvkonQgn_indi_mce_priority_low, icons );
+    LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL Append bitmaps end"));
+
+    iNaviPane = static_cast<CAknNavigationControlContainer*>
+        ( iEikonEnv->AppUiFactory()->StatusPane()->ControlL(
+            TUid::Uid(EEikStatusPaneUidNavi) ) );
+    iNaviPane->PushDefaultL();
+
+    REINTERPRET_CAST( CAknDoubleGraphicStyleListBox*, listBox)->
+        ItemDrawer( )->FormattedCellData()->SetIconArrayL( icons );
+    listBox->ItemDrawer( )->SetItemMarkReplacement( iMarkReplacementText );
+    CleanupStack::Pop( icons ); // icons
+
+    LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 10"));
+    UpdateMMBoxArrayL( );
+    LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 11"));
+    UpdateNavipaneL( );
+    LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL end"));
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::PostLayoutDynInitL
+// ----------------------------------------------------
+void CMMBoxDialog::PostLayoutDynInitL()
+    {
+    LOGTEXT(_L8("MMBoxDialog: PostLayoutDynInitL start"));
+
+    if ( IS_PHONE_OFF_LINEL() )
+        {   // We are in offline at the moment -> just return
+        return;
+        }
+
+    if( !iUi.CheckSettingsL( ) )
+        { // AP is not valid -> just return 
+        return;
+        }
+    
+    TMmboxInfo info;
+
+    TInt err=0;
+    TInt ret=0;
+    TRAP( err, ret = iClientMtm->MmboxInfoL( info ) );
+
+#ifdef MMS_NOTIFICATIONS_TESTING_WO_MMBOX
+    ret = 1;
+    info.error = 0;
+    info.date.HomeTime();
+#endif
+
+    if( err )
+        {
+        LOGTEXT(_L8("MMBoxDialog: PostLayoutDynInitL info leave"));
+        return;
+        }
+    else if( ret )
+        {
+        LOGTEXT(_L8("MMBoxDialog: PostLayoutDynInitL info found"));
+        TInt startUpdate;
+        if( info.error )
+            {
+            LOGTEXT(_L8("MMBoxDialog: PostLayoutDynInitL info update was not success"));
+	        HBufC* buf;		// a buffer for strings
+            buf = 
+                StringLoader::LoadL( R_NOT_MMBOX_LAST_UPDATE_ERROR, iCoeEnv );
+            CleanupStack::PushL( buf );
+
+            startUpdate = ShowConfirmationQueryL( *buf );
+
+            CleanupStack::PopAndDestroy( buf );
+            }
+        else
+            {
+            LOGTEXT(_L8("MMBoxDialog: PostLayoutDynInitL info update was success last"));
+
+            TTime date( info.date );
+
+            // Date is GMT so add offset + dst
+    	    TLocale locale;
+            date += locale.UniversalTimeOffset();
+    	    if (locale.QueryHomeHasDaylightSavingOn())          
+    		    {
+    		    TTimeIntervalHours daylightSaving(1);          
+    		    date += daylightSaving;
+    		    }
+
+	        HBufC* buf;		// a buffer for strings
+            HBufC* dateFormat = StringLoader::LoadLC( R_QTN_DATE_SHORT, iCoeEnv );
+            TBuf<KDateSize> dateString;
+            date.FormatL( dateString, *dateFormat );
+            CleanupStack::PopAndDestroy(); //dateFormat
+
+            dateFormat = StringLoader::LoadLC( R_QTN_TIME_USUAL, iCoeEnv );
+            TBuf<KDateSize> timeString;
+            date.FormatL( timeString, *dateFormat );
+            CleanupStack::PopAndDestroy(); //dateFormat
+
+            CDesC16ArrayFlat* array = new(ELeave) CDesC16ArrayFlat( 2 );
+            CleanupStack::PushL( array );
+            array->AppendL( timeString );
+            array->AppendL( dateString );
+            buf = 
+                StringLoader::LoadL( R_NOT_MMBOX_TIMED_QUERY, *array, iCoeEnv );
+            CleanupStack::PopAndDestroy( array );
+            CleanupStack::PushL( buf );
+
+            startUpdate = ShowConfirmationQueryL( *buf );
+
+            CleanupStack::PopAndDestroy( buf );
+            }
+        if( !startUpdate )
+            { // User did not accept the "Update?" query
+            return;
+            }
+        }
+    else
+        {
+        if( !ShowConfirmationQueryL( R_NOT_MMBOX_TIMELESS_QUERY ) )
+            {
+            return;
+            }
+        }
+
+    // If we end up here, user confirmed the update
+    LOGTEXT(_L8("MMBoxDialog: PostLayoutDynInitL 2"));
+    UpdateListL( );
+    LOGTEXT(_L8("MMBoxDialog: PostLayoutDynInitL end"));
+
+    return;
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::AppendSkinnedIconL
+// ----------------------------------------------------
+void CMMBoxDialog::AppendSkinnedIconL(    
+    TFileName& aFileName, 
+    TInt aIconIndex, 
+    CArrayPtrFlat<CGulIcon>* aIcons)
+    {
+    LOGTEXT(_L8("MMBoxDialog: AppendSkinnedIconL start"));
+    TAknsItemID skinId;
+    switch ( aIconIndex )
+        {
+        case EMbmAvkonQgn_prop_checkbox_off:
+            {
+            skinId.Set( KAknsIIDQgnPropCheckboxOff );
+            break;
+            }
+        case EMbmAvkonQgn_prop_checkbox_on:
+            {
+            skinId.Set( KAknsIIDQgnPropCheckboxOn );
+            break;
+            }
+        case EMbmAvkonQgn_indi_mce_priority_high:
+            {
+            skinId.Set( KAknsIIDQgnIndiMcePriorityHigh );
+            break;
+            }
+        case EMbmAvkonQgn_indi_mce_priority_low:
+            {
+            skinId.Set( KAknsIIDQgnIndiMcePriorityLow );
+            break;
+            }
+        default:
+            {
+            User::Leave( KErrNotFound );
+            break;
+            }
+        }
+
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* mask = NULL;
+
+    LOGTEXT(_L8("MMBoxDialog: AppendSkinnedIconL 2"));
+    AknsUtils::CreateIconL(
+        AknsUtils::SkinInstance(),
+        skinId,
+        bitmap,
+        mask,
+        aFileName,
+        aIconIndex,
+        aIconIndex + 1 ); //mask
+    LOGTEXT(_L8("MMBoxDialog: AppendSkinnedIconL 3"));
+
+    CleanupStack::PushL( bitmap );
+    CleanupStack::PushL( mask );        
+
+    CGulIcon* icon = NULL;
+    icon = CGulIcon::NewL( bitmap, mask );
+    CleanupStack::Pop( mask );
+    CleanupStack::Pop( bitmap );
+    CleanupStack::PushL( icon );
+    aIcons->AppendL( icon );
+    CleanupStack::Pop( icon ); // icon    
+    LOGTEXT(_L8("MMBoxDialog: AppendSkinnedIconL end"));
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::OkToExitL
+// ----------------------------------------------------
+TBool CMMBoxDialog::OkToExitL(TInt aButtonId)
+    {
+    LOGTEXT(_L8("MMBoxDialog: OkToExitL start"));
+    CAknInputBlock::NewLC(  ); // Absorb keys
+    TBool okToExit = CAknDialog::OkToExitL( aButtonId );
+
+    if ( okToExit )
+        {
+        LOGTEXT(_L8("MMBoxDialog: OkToExitL RestoreTitleText.."));
+        TRAP_IGNORE( RestoreTitleTextAndNavipaneL() );
+        }
+
+    CleanupStack::PopAndDestroy(); // CAknInputBlock
+
+    if( iExitCode == EEikCmdExit )
+        {
+        LOGTEXT(_L8("MMBoxDialog: OkToExitL RunAppShutter"));
+        CAknEnv::RunAppShutter();
+        }
+
+    LOGTEXT(_L8("MMBoxDialog: OkToExitL end"));
+    return okToExit;
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::ProcessCommandL
+// ----------------------------------------------------
+void CMMBoxDialog::ProcessCommandL( TInt aCommandId )
+    {
+    LOGTEXT(_L8("MMBoxDialog: ProcessCommand start"));
+    CAknDialog::ProcessCommandL( aCommandId ) ;
+
+    switch ( aCommandId )
+        {
+        case EMMBoxOpen:
+            LOGTEXT(_L8("MMBoxDialog: ProcessCommand OpenNotification start"));
+            OpenNotificationL( );
+            break;
+        case EMMBoxRetrieveSelected:
+            LOGTEXT(_L8("MMBoxDialog: ProcessCommand RetrieveL start"));
+            FetchL( );
+            break;
+        case EMMBoxRetrieveAll:
+            LOGTEXT(_L8("MMBoxDialog: ProcessCommand RetrieveAll start"));
+            FetchL( ETrue );
+            break;
+        case EMMBoxDeleteSelected:
+            LOGTEXT(_L8("MMBoxDialog: ProcessCommand Delete start"));
+            DeleteL( );
+            break;
+        case EMMBoxDeleteAll:
+            LOGTEXT(_L8("MMBoxDialog: ProcessCommand DeleteAll start"));
+            DeleteL( ETrue );
+            break;
+        case EMMBoxUpdateList:
+            LOGTEXT(_L8("MMBoxDialog: ProcessCommand UpdateList start"));
+            UpdateListL( );
+            break;
+        case EMMBoxViewStatus:
+            LOGTEXT(_L8("MMBoxDialog: ProcessCommand ViewStatus start"));
+            ShowStatusL( );
+            break;
+        case EMMBoxSortMessagesByDate:
+            LOGTEXT(_L8("MMBoxDialog: ProcessCommand SortByDate start"));
+            SortMessagesByL( EMMBoxSortByDate );
+            break;
+        case EMMBoxSortMessagesBySender:
+            LOGTEXT(_L8("MMBoxDialog: ProcessCommand SortBySender start"));
+            SortMessagesByL( EMMBoxSortByName );
+            break;
+        case EMMBoxSortMessagesBySubject:
+            LOGTEXT(_L8("MMBoxDialog: ProcessCommand SortBySubject start"));
+            SortMessagesByL( EMMBoxSortBySubject );
+            break;
+        case EAknCmdHelp:
+            LOGTEXT(_L8("MMBoxDialog: ProcessCommand Help start"));
+            LaunchHelpL();                
+            break;
+        case EAknCmdExit:
+            {
+            LOGTEXT(_L8("MMBoxDialog: ProcessCommand Exit start"));
+            iExitCode = EEikCmdExit;
+            TryExitL( EAknCmdExit );
+            }
+            break;
+
+        default :
+            LOGTEXT(_L8("MMBoxDialog: ProcessCommand default break"));
+            break;
+        }
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::DynInitMenuPaneL
+// ----------------------------------------------------
+void CMMBoxDialog::DynInitMenuPaneL(
+    TInt aResourceId, CEikMenuPane* aMenuPane )
+    {
+    LOGTEXT(_L8("MMBoxDialog: ProcessCommand DynInitMenuPaneL start"));
+    if ( aResourceId == R_NOT_MMBOX_MENUPANE )
+        {
+        LOGTEXT(_L8("MMBoxDialog: ProcessCommand DynInitMenuPaneL menupane"));
+        if( !( iFlags & EHelpSupported ) )
+            {
+            aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
+            }
+
+        TMmboxInfo info;
+        TInt ret = 0;
+        TRAPD( err, ret = iClientMtm->MmboxInfoL( info ) );
+
+#ifdef MMS_NOTIFICATIONS_TESTING_WO_MMBOX
+        ret = 1;
+#endif
+
+        if( err || !ret )
+            {// No info available
+            aMenuPane->SetItemDimmed( EMMBoxViewStatus, ETrue ); 
+            }
+
+        if ( ListBox()->Model()->NumberOfItems() == 0 )
+            {
+            aMenuPane->SetItemDimmed( EMMBoxOpen, ETrue ); 
+            aMenuPane->SetItemDimmed( EMMBoxRetrieveMenu, ETrue ); 
+            aMenuPane->SetItemDimmed( EMMBoxDeleteMenu, ETrue ); 
+            }
+        else
+            {
+            TMsvEntry entry = 
+                iMessages->Entry( ListBox( )->CurrentItemIndex( ) );
+
+            if( ListBox()->Model()->NumberOfItems() == 1 )
+                { // Operation support is only checked if there's only one entry
+                  // Otherwise we let the user try to start the functions..
+                if( iUiData.OperationSupportedL( KMtmUiFunctionFetchMMS, entry ) )
+                    {
+                    aMenuPane->SetItemDimmed( EMMBoxRetrieveMenu, ETrue ); 
+                    }
+                if( iUiData.OperationSupportedL( KMtmUiFunctionDeleteMessage, entry ) )
+                    {
+                    aMenuPane->SetItemDimmed( EMMBoxDeleteMenu, ETrue ); 
+                    }
+                }
+
+            if( iUiData.OperationSupportedL( KMtmUiFunctionOpenMessage, entry ) )
+                {
+                aMenuPane->SetItemDimmed( EMMBoxOpen, ETrue ); 
+                }
+            }
+        LOGTEXT(_L8("MMBoxDialog: ProcessCommand DynInitMenuPaneL end"));
+        }
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::OfferKeyEventL
+// ----------------------------------------------------
+TKeyResponse CMMBoxDialog::OfferKeyEventL(
+    const TKeyEvent& aKeyEvent, 
+    TEventCode aType )
+    {
+    LOGTEXT(_L8("MMBoxDialog: ProcessCommand OfferKeyEvent"));
+    CEikColumnListBox* listBox = ListBox();
+    if ( listBox && aType == EEventKey && ( iUpdateOperation || iDeleteOperation ) )
+        {   // When an operation is going on, we do not need keypresses
+        LOGTEXT(_L8("MMBoxDialog: ProcessCommand OfferKeyEvent operation in progress"));
+        return EKeyWasNotConsumed;
+        }
+    if ( listBox && aType == EEventKey && aKeyEvent.iCode == EKeyBackspace &&
+         listBox->Model()->NumberOfItems() > 0 )
+        { // C-key
+        LOGTEXT(_L8("MMBoxDialog: ProcessCommand OfferKeyEvent Delete"));
+        DeleteL( );
+        return EKeyWasConsumed;
+        }
+    else if ( listBox && aType == EEventKey && aKeyEvent.iCode == EKeyOK )
+        {   // Selection Key here!!!
+        LOGTEXT(_L8("MMBoxDialog: ProcessCommand OfferKeyEvent Selection key"));
+        listBox->View()->ToggleItemL( listBox->CurrentItemIndex() );
+        return EKeyWasConsumed;
+        }
+    else if( aType == EEventKey && aKeyEvent.iCode == EKeyEscape )
+        {
+        if( !OkToExitL( -1 ) )
+            {
+            return EKeyWasConsumed;
+            }
+        }
+
+    return CAknDialog::OfferKeyEventL( aKeyEvent, aType );
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::HandleListBoxEventL
+// ----------------------------------------------------
+void CMMBoxDialog::HandleListBoxEventL(
+    CEikListBox* /*aListBox*/, 
+    TListBoxEvent /*aEventType*/ )
+    {
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::UpdateMMBoxArrayL
+// ----------------------------------------------------
+void CMMBoxDialog::UpdateMMBoxArrayL()
+    {
+    LOGTEXT(_L8("MMBoxDialog: UpdateMMBoxArray start"));
+
+    iMessages->RefreshArrayL( iMMBoxFolderId );
+
+    //	TInt newIndex = 
+	ListBox()->ScrollToMakeItemVisible( ListBox()->CurrentItemIndex( ) );
+    ListBox()->DrawNow( );
+    
+    SetMSKL();
+
+    LOGTEXT(_L8("MMBoxDialog: UpdateMMBoxArray end"));
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::ListBox
+// ----------------------------------------------------
+CEikColumnListBox* CMMBoxDialog::ListBox() const
+    {
+    return((CEikColumnListBox*)Control(EMsgControlIdMMBoxListBox));
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::StoreTitleTextAndNavipaneAndSetNewL
+// ----------------------------------------------------
+void CMMBoxDialog::StoreTitleTextAndNavipaneAndSetNewL()
+    {
+    LOGTEXT(_L8("MMBoxDialog: StoreTitleTextAndNavipane.. start"));
+    CEikStatusPane* sp = iEikonEnv->AppUiFactory( )->StatusPane( );
+    // Fetch pointer to the default title pane control
+    CAknTitlePane* title=(CAknTitlePane *)sp->ControlL(
+        TUid::Uid(EEikStatusPaneUidTitle));
+
+    delete iOldTitleText;
+    iOldTitleText = NULL;
+    iOldTitleText = HBufC::NewL( title->Text()->Length() + 1 );
+    TPtr tempText = iOldTitleText->Des();
+    tempText.Copy( (*title->Text()) );
+
+    HBufC* newTitle = StringLoader::LoadLC( 
+        R_NOT_MMBOX_TITLE_TEXT, 
+        iCoeEnv );
+    title->SetTextL( *newTitle );
+    CleanupStack::PopAndDestroy( newTitle );
+
+    iNaviOld = iNaviPane->Top( );
+
+    CMsvEntry* entry=iSession.GetEntryL(KMsvRootIndexEntryId);
+    CleanupStack::PushL( entry );
+    if ( entry->HasStoreL() )
+        {
+        CMsvStore* store = entry->ReadStoreL();
+        CleanupStack::PushL( store );
+        if ( store->IsPresentL( KUidMsvMessageListSortOrder ) )
+            { // Read it first
+            RMsvReadStream readStream;
+            readStream.OpenLC( *store, KUidMsvMessageListSortOrder );
+            iOriginalOrder.InternalizeL( readStream );
+            CleanupStack::PopAndDestroy( ); // readStream
+            // Then remove it
+/*            CMsvStore* store2 = entry->EditStoreL();
+            CleanupStack::PushL( store2 );
+            store->Remove(KUidMsvMessageListSortOrder);
+            store->CommitL();
+            CleanupStack::PopAndDestroy( store2 ); // store2
+  */
+            }
+        CleanupStack::PopAndDestroy( store ); // store
+        }
+    CleanupStack::PopAndDestroy( entry );
+    LOGTEXT(_L8("MMBoxDialog: StoreTitleTextAndNavipane.. end"));
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::RestoreTitleTextL
+// ----------------------------------------------------
+void CMMBoxDialog::RestoreTitleTextAndNavipaneL()
+    {
+    LOGTEXT(_L8("MMBoxDialog: RestoreTitleTextAndNavipane.. start"));
+    CEikStatusPane* sp = iEikonEnv->AppUiFactory( )->StatusPane( );
+    // Fetch pointer to the default title pane control
+    CAknTitlePane* title=(CAknTitlePane *)sp->ControlL(
+        TUid::Uid(EEikStatusPaneUidTitle));
+
+    title->SetTextL( iOldTitleText->Des() );
+    delete iOldTitleText;
+    iOldTitleText = NULL;
+
+    iNaviPane->Pop( iNaviDecorator );
+    delete iNaviDecorator;
+    iNaviDecorator = NULL;
+
+    if( iNaviOld )
+        {
+        iNaviPane->PushL( *iNaviOld );
+        }
+    iNaviOld = NULL;
+
+    if( iFlags & ESortTypeChanged )
+        {
+        // Remove the one set by MMBoxList
+        CMsvEntry* entry=iSession.GetEntryL( KMsvRootIndexEntryId );
+        CleanupStack::PushL( entry );
+        CMsvStore* store = entry->EditStoreL();
+        CleanupStack::PushL( store );
+        store->Remove(KUidMsvMessageListSortOrder);
+        store->CommitL();
+        CleanupStack::PopAndDestroy( 2 ); // store, entry
+
+        // If the original sory type was not the default one -> write it..
+        TMsvSelectionOrdering def( KMsvNoGrouping, EMsvSortByDateReverse, EFalse );
+        if( !(iOriginalOrder == def) )
+            {
+            CMsvEntry* entry=iSession.GetEntryL( KMsvRootIndexEntryId );
+            CleanupStack::PushL( entry );
+ 	        CMsvStore* store = entry->EditStoreL();
+ 	        CleanupStack::PushL( store );
+ 	        RMsvWriteStream writeStream;
+ 	        writeStream.AssignLC( *store, KUidMsvMessageListSortOrder );
+ 	        iOriginalOrder.ExternalizeL( writeStream );
+ 	        writeStream.CommitL();
+ 	        store->CommitL();
+ 	        CleanupStack::PopAndDestroy( 3 ); // store, writestream, entry
+            }   
+        }    
+    LOGTEXT(_L8("MMBoxDialog: RestoreTitleTextAndNavipane.. end"));
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::OpCompleted
+// ----------------------------------------------------
+void CMMBoxDialog::OpCompleted(
+    CMsvSingleOpWatcher& aOpWatcher,
+    TInt aCompletionCode )
+    {
+    LOGTEXT(_L8("MMBoxDialog: OpCompleted start"));
+    TBool tryToExit = EFalse;
+    CMsvOperation* op=&aOpWatcher.Operation();
+    TRAP_IGNORE( tryToExit = DoOperationCompletedL(op, aCompletionCode ));  
+    if ( tryToExit )
+        {
+        LOGTEXT(_L8("MMBoxDialog: OpCompleted tryToExit"));
+        return;
+        }
+
+    if ( iDeleteOperation && iDeleteOperation->Operation().Id()==op->Id() )
+        {
+        LOGTEXT(_L8("MMBoxDialog: OpCompleted DeleteOperation"));
+        TInt error = op->iStatus.Int( );
+        // Check the entries one by one
+        TInt failedOnes = 0;
+        TInt totalOnes = 0;
+        if( iDeleteSelection )
+            { // This means user did not answer "No" to "Delete message" question
+            for( TInt loop = 0; loop < iDeleteSelection->Count( ); loop++ )
+                {
+                TMsvEntry entry;
+                TMsvId service = -1;
+                totalOnes++;            
+                if ( iSession.GetEntry(iDeleteSelection->At(loop), service, entry ) != KErrNotFound )
+                	{
+                    LOGTEXT(_L8("MMBoxDialog: OpCompleted DeleteOp Entry found after delete"));
+                    failedOnes++;
+                	}
+                }
+            }
+        if( error || failedOnes )
+            {
+            LOGTEXT2(_L16("MMBoxDialog: OpCompleted DeleteOperation Error: %d"), error);
+            if( failedOnes == 1)
+                {
+                LOGTEXT(_L8("MMBoxDialog: OpCompleted DeleteOp 1 failed"));
+                TRAP_IGNORE( ShowConfirmationQueryL( R_NOT_MMBOX_INFO_DELETE_FAILED, ETrue ) );
+                }
+            else
+                {
+                LOGTEXT(_L8("MMBoxDialog: OpCompleted DeleteOp many failed"));
+                TRAP_IGNORE ( ShowConfirmationQueryL(   failedOnes,
+                                                        totalOnes,                          
+                                                        R_NOT_MMBOX_INFO_DELETE_FAILED_MANY ) );
+                }
+            }
+        delete iDeleteSelection;
+        iDeleteSelection = NULL;
+        delete iDeleteOperation;
+        iDeleteOperation = NULL;
+        }
+
+    else if ( iOpenOperation && iOpenOperation->Operation().Id()==op->Id() )
+        {
+        if( !( iFlags & EDoNotDeleteOpen ) )
+            {
+            LOGTEXT(_L8("MMBoxDialog: OpCompleted OpenOperation"));
+            delete iOpenOperation;
+            iOpenOperation = NULL;
+            }
+        iFlags &= ~EDoNotDeleteOpen;    // Reset this anyway
+        }
+
+    else if ( iUpdateOperation && iUpdateOperation->Operation().Id()==op->Id() )
+        {
+        LOGTEXT(_L8("MMBoxDialog: OpCompleted UpdateOperation"));
+
+        if( iWaitDialog )   // Remove the wait note from the screen
+            {
+            delete iWaitDialog;
+            iWaitDialog=NULL;
+            }
+                
+        TInt error = op->iStatus.Int( );        
+
+        delete iUpdateOperation;
+        iUpdateOperation = NULL;
+
+        if( error )
+            {
+            LOGTEXT2(_L16("MMBoxDialog: OpCompleted DeleteOperation Error: %d"), error);
+            TRAP_IGNORE( ShowInformationNoteL( R_NOT_MMBOX_INFO_UNABLE_UPDATE, EFalse ) );
+            }
+        else
+            {
+            LOGTEXT(_L8("MMBoxDialog: OpCompleted UpdateOperation Success"));
+            TMmboxInfo info;
+            TBool infoExists=EFalse;
+            TRAPD( err, infoExists=iClientMtm->MmboxInfoL( info ) );
+
+#ifdef MMS_NOTIFICATIONS_TESTING_WO_MMBOX
+            infoExists = 1;
+            info.mmboxQuotaInBytes = 100500;
+            info.mmboxTotalInBytes = 98000;
+#endif
+
+            if( infoExists && !err )
+                {
+                if( info.mmboxTotalInBytes == 0 )
+                    {
+                    TRAP_IGNORE( ShowInformationNoteL( R_NOT_MMBOX_INFO_NO_MSGS, EFalse ) );
+                    }
+                else 
+	               {
+                   if( info.mmboxQuotaInBytes > 0 )
+                       { // Make sure there will be no "division by zero"
+    	               TReal res = (TReal)info.mmboxTotalInBytes/(TReal)info.mmboxQuotaInBytes;
+	                   if( res > 0.8 )
+	                        {
+	                        TRAP_IGNORE( ShowConfirmationQueryL( R_NOT_MMBOX_QUERY_80_USED, ETrue ) );
+	                        }
+                       }
+	                }
+                }
+            LOGTEXT(_L8("MMBoxDialog: OpCompleted UpdateOperation 2"));
+            TRAP_IGNORE( UpdateNavipaneL( ));  
+            // We just need to trap this, we can ignore the error code
+            }
+        }
+    else
+        { // Let's save the fetch operations last as there can be many..
+        for ( TInt cc=iFetchOperations.Count()-1; cc>=0; cc-- )
+            {
+            if ( iFetchOperations[cc]->Operation( ).Id( ) == op->Id( ) )
+                {
+                LOGTEXT(_L8("MMBoxDialog: OpCompleted FetchOperation"));
+                delete iFetchOperations[cc];
+                iFetchOperations.Delete(cc);
+                }
+            }
+        }
+    LOGTEXT(_L8("MMBoxDialog: OpCompleted End"));
+    ListBox()->DrawDeferred();
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::DoOperationCompletedL
+// ----------------------------------------------------
+TBool CMMBoxDialog::DoOperationCompletedL(
+    CMsvOperation* aOperation, 
+    TInt aCompletionCode )
+    {
+
+    if ( !aOperation )
+        {
+        return EFalse;
+        }
+
+    if( iOpenOperation && iOpenOperation->Operation( ).Id( ) == aOperation->Id( ) )
+        {
+        iFlags &= ~EDoNotDeleteOpen;
+        LOGTEXT(_L8("MMBoxDialog: DoOpCompleted Open"));
+        if ( aCompletionCode == CMsgEmbeddedEditorWatchingOperation::EMsgExitNext ||
+            aCompletionCode == CMsgEmbeddedEditorWatchingOperation::EMsgExitPrevious )
+            {
+            LOGTEXT(_L8("MMBoxDialog: DoOpCompleted Next/Prev Message"));
+            HandleOpenNextPreviousL( aCompletionCode == CMsgEmbeddedEditorWatchingOperation::EMsgExitNext );
+            iFlags |= EDoNotDeleteOpen;
+            }
+        else if ( aCompletionCode == EEikCmdExit )
+            {
+            LOGTEXT(_L8("MMBoxDialog: DoOpCompleted Exit"));
+            delete iOpenOperation;
+            iOpenOperation = NULL;
+            iExitCode = EEikCmdExit;
+            return ETrue;
+            }
+        }
+    else if( iUpdateOperation && iUpdateOperation->Operation( ).Id( ) == aOperation->Id( ) )
+        {
+        LOGTEXT(_L8("MMBoxDialog: DoOpCompleted Update"));
+        UpdateMMBoxArrayL();
+        }
+    else if ( iDeleteOperation && iDeleteOperation->Operation( ).Id( ) == aOperation->Id( ) )
+        {
+        LOGTEXT(_L8("MMBoxDialog: DoOpCompleted Delete"));
+        UpdateMMBoxArrayL();
+        }
+    else
+        {
+        // Nothing special to be done (for example for fetch operations)
+        }
+    return EFalse;
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::LaunchHelpL
+// launch help using context
+// 
+// ----------------------------------------------------
+void CMMBoxDialog::LaunchHelpL()
+    {   
+    if ( iFlags & EHelpSupported )
+        {
+        LOGTEXT(_L8("MMBoxDialog: LaunchHelpL"));
+        CCoeAppUi* appUi = ControlEnv()->AppUi();
+        if ( appUi )
+            {
+            HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), appUi->AppHelpContextL() );
+            }
+        LOGTEXT(_L8("MMBoxDialog: LaunchHelpL End"));
+        }
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::GetHelpContext
+// returns helpcontext as aContext
+// 
+// ----------------------------------------------------
+void CMMBoxDialog::GetHelpContext
+        ( TCoeHelpContext& aContext ) const
+    {  
+    const TUid KUidMce ={0x100058C5};      
+    aContext.iMajor = KUidMce;
+    aContext.iContext = KMCE_HLP_MMS_NOTIFICATIONS;
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::
+// ----------------------------------------------------
+TInt  CMMBoxDialog::DecodeProgress (
+            const TDesC8& /*aProgress*/,
+            TBuf<CBaseMtmUi::EProgressStringMaxLen>& /*aReturnString*/,
+            TInt& /*aTotalEntryCount*/,
+            TInt& /*aEntriesDone*/,
+            TInt& /*aCurrentEntrySize*/,
+            TInt& /*aCurrentBytesTrans*/, TBool /*aInternal*/ )
+    {
+    // At the moment there are no operations who would need this function.
+    // Only delete operation uses ProgressDecoder, but that progress is
+    // asked from NotMtmUi object.
+    return KErrNone;
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::
+// ----------------------------------------------------
+void CMMBoxDialog::SortMessagesByL( TMMBoxSortType aType )
+    {
+    // Lets memorize the id of the current focused one
+   LOGTEXT(_L8("MMBoxDialog: SortMessageByL start"));
+    TMsvId focused = KErrNotFound;
+    
+    if( iMessages->MdcaCount() > 0 )
+        {
+        focused= iMessages->EntryId( ListBox( )->CurrentItemIndex( ) );
+        }
+    
+    // Lets set the sorting type
+    TMsvSelectionOrdering newType = iMessages->SetSortType( aType );
+
+    // Lets find the focused one again
+    TInt index = 0;
+    TInt newFocused = KErrNotFound;
+    while( index < iMessages->MdcaCount( ) )
+        {
+        if( iMessages->EntryId( index ) == focused )
+            {
+            newFocused = index;
+            break;
+            }
+        index++;
+        }
+    
+    //Let's set the new focused item and draw the listbox
+    LOGTEXT(_L8("MMBoxDialog: SortMessageByL 2"));
+    if( newFocused != KErrNotFound )
+        {
+        LOGTEXT(_L8("MMBoxDialog: SortMessageByL 3"));
+        ListBox( )->SetCurrentItemIndexAndDraw( newFocused );
+        }
+
+    iFlags |= ESortTypeChanged;
+
+    LOGTEXT(_L8("MMBoxDialog: SortMessageByL 4"));
+    CMsvEntry* entry=iSession.GetEntryL( KMsvRootIndexEntryId );
+    CleanupStack::PushL( entry );
+    CMsvStore* store = entry->EditStoreL();
+    LOGTEXT(_L8("MMBoxDialog: SortMessageByL 5"));
+    CleanupStack::PushL( store );
+    store->Remove(KUidMsvMessageListSortOrder);
+    store->CommitL();
+    CleanupStack::PopAndDestroy( 1 ); // store
+
+    LOGTEXT(_L8("MMBoxDialog: SortMessageByL 6"));
+ 	CMsvStore* store2 = entry->EditStoreL();
+ 	CleanupStack::PushL( store2 );
+    LOGTEXT(_L8("MMBoxDialog: SortMessageByL 7"));
+ 	RMsvWriteStream writeStream;
+ 	writeStream.AssignLC( *store2, KUidMsvMessageListSortOrder );
+    LOGTEXT(_L8("MMBoxDialog: SortMessageByL 8"));
+ 	newType.ExternalizeL( writeStream );
+ 	writeStream.CommitL();
+ 	store2->CommitL();
+ 	CleanupStack::PopAndDestroy( 3 ); // store, writestream, entry
+
+    LOGTEXT(_L8("MMBoxDialog: SortMessagesByL End"));
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::
+// ----------------------------------------------------
+void CMMBoxDialog::OpenNotificationL( )
+    {
+    LOGTEXT(_L8("MMBoxDialog: OpenNotificationL start"));
+
+    CMsvOperation* op=NULL;
+    CAknInputBlock::NewLC(  );
+
+    CMsvSingleOpWatcher* singleOpWatcher=CMsvSingleOpWatcher::NewL( *this );
+    CleanupStack::PushL(singleOpWatcher);
+
+    TMsvEntry entry = 
+        iMessages->Entry( ListBox( )->CurrentItemIndex( ) );
+
+    if ( entry.iType != KUidMsvMessageEntry )
+        { // No message -> wrong kind of entry
+        CleanupStack::PopAndDestroy( 2 ); // singleOpWatcher, CAknInputBlock
+        return;
+        }
+    else
+        {
+        iOpenOperation = singleOpWatcher;
+        }
+
+    iUi.BaseMtm().SwitchCurrentEntryL( entry.Id( ) );
+    iUi.SetPreferences( iUi.Preferences() | EMtmUiFlagEditorPreferEmbedded );
+
+    LOGTEXT(_L8("MMBoxDialog: OpenNotificationL 2"));
+    op = iUi.OpenL(singleOpWatcher->iStatus );
+    LOGTEXT(_L8("MMBoxDialog: OpenNotificationL 3"));
+
+    CleanupStack::Pop( singleOpWatcher );
+
+    singleOpWatcher->SetOperation(op);
+
+    CleanupStack::PopAndDestroy( ); // CAknInputBlock::NewLC(  );
+    LOGTEXT(_L8("MMBoxDialog: OpenL End"));
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::
+// ----------------------------------------------------
+void CMMBoxDialog::FetchL( TBool aAll/*=EFalse*/ )
+    {
+    if ( IS_PHONE_OFF_LINEL() )
+        {   // We are in offline at the moment -> Infonote
+        ShowInformationNoteL( R_NOTMTM_OFFLINE_NOT_POSSIBLE, EFalse );
+        return;
+        }
+
+    CMsvEntrySelection* sel = SelectionL( aAll );
+    CleanupStack::PushL( sel );
+
+    // Lets see which ones are already deleted from server.
+    TInt all = 0; // includes all notifications in the selection
+    TInt bad = 0; // includes notifications that are not stored in mmbox
+    for( TInt i = 0; i<sel->Count( ); i++ )
+        {
+        TMsvEntry entry;
+        TMsvId service=-1;
+        iSession.GetEntry( sel->At( i ), service, entry );
+        if( ( ( entry.iMtmData1 & KMmsMessageTypeMask ) == KMmsMessageMNotificationInd ) &&
+              ( entry.iMtmData2 & KMmsStoredInMMBox ) )
+            {
+            all++;
+            }
+        else
+            {
+            if( ( entry.iMtmData1 & KMmsMessageTypeMask ) == KMmsMessageMNotificationInd )
+                {
+                bad++;
+                all++;
+                }
+            }
+        }
+
+    if( bad == 1 )
+        {
+        // One already deleted
+        ShowInformationNoteL( R_NOT_MMBOX_INFO_FETCH_FAILED_ONE, EFalse );
+        if( all == bad )
+            { // Just one notification -> leave from the function
+            CleanupStack::PopAndDestroy( sel );
+            return;
+            }
+        }
+    else if (bad > 0)
+        {
+        if( all == bad )
+            { // All notifications were bad
+            ShowInformationNoteL( R_NOT_MMBOX_INFO_FETCH_FAILED_ANY, EFalse );
+            LOGTEXT(_L8("MMBoxDialog: FetchL All bad - just return"));
+            CleanupStack::PopAndDestroy( sel );
+            return;
+            }
+        else
+            { // Some were bad, so one can continue fetching
+            ShowInformationNoteL( R_NOT_MMBOX_INFO_FETCH_FAILED_SOME, EFalse );
+            LOGTEXT(_L8("MMBoxDialog: FetchL Some bad - warn"));
+            }
+        }
+    else // bad == 0
+        {
+        if( all == 0 )
+            { // No notifications at all -> no note and just leave
+            LOGTEXT(_L8("MMBoxDialog: FetchL Selection empty - just return"));
+            CleanupStack::PopAndDestroy( sel );
+            return;
+            }
+        // else just continue as there were no bad notifications
+        }
+
+    TMsvId origId = iClientMtm->Entry().Entry().Id();
+
+    if( sel->Count( ) == 1 )
+        {
+        iClientMtm->SwitchCurrentEntryL( sel->At( 0 ) );
+        iClientMtm->LoadMessageL( );
+        TTime currentTime;
+        currentTime.HomeTime( );
+        TTime expiryTime = iClientMtm->ExpiryDate( );
+        iClientMtm->SwitchCurrentEntryL( origId );
+        iClientMtm->LoadMessageL( );
+	    TLocale locale;
+        expiryTime += locale.UniversalTimeOffset();
+	    if (locale.QueryHomeHasDaylightSavingOn())          
+		    {
+		    TTimeIntervalHours daylightSaving(1);          
+		    expiryTime += daylightSaving;
+		    }
+
+        if( currentTime > expiryTime )
+            {   // Message is expired
+            TBool res = EFalse;
+            TRAPD( err, res=ShowConfirmationQueryL( R_NOT_MMBOX_QUEST_MSG_EXPIRED ) );
+            if ( err || !res )
+                {   // User did not want to fetch expired message or the function leaved
+            CleanupStack::PopAndDestroy( sel );
+                return;
+                } // else we continue
+            }
+        }
+
+    CMsvSingleOpWatcher* singleOpWatcher=CMsvSingleOpWatcher::NewL(*this);
+    CleanupStack::PushL(singleOpWatcher);
+
+    TBuf8<1> buf;
+
+    CMsvOperation* op = NULL;
+
+    LOGTEXT(_L8("MMBoxDialog: FetchL 2"));
+    TRAPD( err, 
+            op= iUi.InvokeAsyncFunctionL( 
+            KMtmUiFunctionFetchMMS, 
+            *sel, 
+            singleOpWatcher->iStatus, 
+            buf) );
+    LOGTEXT(_L8("MMBoxDialog: FetchL 3"));
+
+    if( op == NULL || err )
+        {
+        LOGTEXT(_L8("MMBoxDialog: FetchL NULL op or left"));
+        CleanupStack::PopAndDestroy( singleOpWatcher );
+        CleanupStack::PopAndDestroy( sel );
+        return;
+        }
+
+    CleanupStack::Pop( singleOpWatcher );
+   
+    singleOpWatcher->SetOperation( op );
+    iFetchOperations.AppendL( singleOpWatcher );
+
+    CleanupStack::PopAndDestroy( sel );
+
+    LOGTEXT(_L8("MMBoxDialog: FetchL End"));
+    return;
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::DeleteL
+// ----------------------------------------------------
+void CMMBoxDialog::DeleteL( TBool aAll/*=EFalse*/ )
+    {
+    LOGTEXT(_L8("MMBoxDialog: DeleteL start"));
+
+    if ( IS_PHONE_OFF_LINEL() )
+        {   // We are in offline at the moment -> Infonote
+        ShowInformationNoteL( R_NOTMTM_OFFLINE_NOT_POSSIBLE, EFalse );
+        return;
+        }
+
+    CAknInputBlock::NewLC( );
+
+    if( iDeleteSelection )
+        {
+        // We should never end up in here because delete op has a wait note but just in case
+        delete iDeleteSelection;
+        iDeleteSelection = NULL;
+        }
+
+    iDeleteSelection = SelectionL( aAll );
+    LOGTEXT(_L8("MMBoxDialog: DeleteL 2"));
+
+    CMsvSingleOpWatcher* singleOpWatcher=CMsvSingleOpWatcher::NewL(*this);
+    CleanupStack::PushL(singleOpWatcher);
+
+    TBuf8<1> buf;
+
+    LOGTEXT(_L8("MMBoxDialog: DeleteL 3"));
+    CMsvOperation* op= iUi.InvokeAsyncFunctionL( 
+        KMtmUiFunctionDeleteMessage, 
+        *iDeleteSelection, 
+        singleOpWatcher->iStatus, 
+        buf);
+
+    LOGTEXT(_L8("MMBoxDialog: DeleteL 4"));
+    if( op == NULL )
+        {
+        // Lets just make a completed operation so
+        // the progress dialog is not shown
+        LOGTEXT(_L8("MMBoxDialog: Delete NULL op"));
+        delete iDeleteSelection;
+        iDeleteSelection = NULL;
+        TPckgC < TMsvId > progress = 0;
+        op = CMsvCompletedOperation::NewL( iSession, 
+            KUidMsgMMSNotification,
+            progress,
+            KMsvLocalServiceIndexEntryId, singleOpWatcher->iStatus );
+        }
+    LOGTEXT(_L8("MMBoxDialog: DeleteL 5"));
+
+    CleanupStack::Pop( singleOpWatcher );
+    
+    singleOpWatcher->SetOperation( op );
+    iDeleteOperation = singleOpWatcher;
+
+    CleanupStack::PopAndDestroy( ); // CAknInputBlock
+
+    LOGTEXT(_L8("MMBoxDialog: DeleteL End"));
+    return;
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::SelectionL
+// ----------------------------------------------------
+CMsvEntrySelection* CMMBoxDialog::SelectionL( TBool aAll/*=EFalse*/ )
+    {
+    LOGTEXT(_L8("MMBoxDialog: Selection Start"));
+    CMsvEntrySelection* sel = new ( ELeave ) CMsvEntrySelection;
+    CleanupStack::PushL( sel );
+
+    if( aAll )
+        {
+	    LOGTEXT(_L8("MMBoxDialog: Selection: Use all"));
+        TInt index = 0;
+        while( index < iMessages->MdcaCount( ) )
+            {
+	        LOGTEXT(_L8("MMBoxDialog: Selection: Use all: append"));
+            sel->AppendL( iMessages->EntryId( index ) );
+            index++;
+            }
+        }
+    else
+        {
+        const CListBoxView::CSelectionIndexArray* indexes = 
+            ListBox( )->SelectionIndexes( );
+        TInt index = 0;
+        
+        if( indexes->Count( ) < 1 )
+            { // Lets use the current one as there are no selected ones
+	        LOGTEXT(_L8("MMBoxDialog: Selection: No selected so just use current"));
+            sel->AppendL( iMessages->EntryId( ListBox( )->CurrentItemIndex( ) ) );
+            }
+        else 
+	        {
+            LOGTEXT(_L8("MMBoxDialog: Selection: Selected items"));
+	        while( index < indexes->Count( ) )
+            	{
+	            LOGTEXT(_L8("MMBoxDialog: Selection: Selected items added one"));
+            	TInt lbIndex = indexes->At(index);
+            	sel->AppendL( iMessages->EntryId( lbIndex ) );
+            	index++;
+            	}
+	        }
+        }
+
+    LOGTEXT(_L8("MMBoxDialog: Selection Done"));
+    CleanupStack::Pop( sel );
+    LOGTEXT(_L8("MMBoxDialog: Selection End"));
+    return sel;
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::
+// ----------------------------------------------------
+void CMMBoxDialog::ShowStatusL( )
+    {
+    LOGTEXT(_L8("MMBoxDialog: ShowStatus Start"));
+	HBufC* status;	// holds the text
+	HBufC* buf;		// a buffer for strings
+
+    TMmboxInfo info;
+    TInt ret = 0;
+    TRAPD( err, ret=iClientMtm->MmboxInfoL( info ) )
+
+#ifdef MMS_NOTIFICATIONS_TESTING_WO_MMBOX
+    ret = 1;
+    info.date.HomeTime();
+#endif
+
+    if( err || !ret )
+        {
+        return; // No quota data available -> just return;
+        }
+    TTime messageDate = info.date;
+    
+    // messageDate is GMT so add time offset
+    TLocale locale;
+    messageDate += locale.UniversalTimeOffset();
+    if (locale.QueryHomeHasDaylightSavingOn())          
+	    {
+	    TTimeIntervalHours daylightSaving(1);          
+	    messageDate += daylightSaving;
+	    }
+    
+    TInt usedQuota = info.mmboxTotalInBytes/KLocalKilo;
+    if (  info.mmboxTotalInBytes % KLocalKilo )
+            {
+            usedQuota++;
+            }
+    TInt fullQuota = info.mmboxQuotaInBytes/KLocalKilo;
+    if (  info.mmboxQuotaInBytes % KLocalKilo )
+            {
+            fullQuota++;
+            }
+
+	CEikFormattedCellListBox* listBox = new ( ELeave ) CAknDoublePopupMenuStyleListBox;
+	CleanupStack::PushL( listBox );
+
+	CAknPopupList* popupList;
+    popupList = CAknPopupList::NewL(listBox, R_AVKON_SOFTKEYS_OK_EMPTY__OK, 
+									AknPopupLayouts::EMenuDoubleWindow);
+	CleanupStack::PushL( popupList );
+
+    LOGTEXT(_L8("MMBoxDialog: ShowStatus 2"));
+    TInt flags = CEikListBox::EDisableHighlight;
+	listBox->ConstructL( popupList, flags );
+	listBox->CreateScrollBarFrameL( ETrue );
+	listBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, 
+															CEikScrollBarFrame::EAuto );
+    // Lets add the heading
+
+	status = StringLoader::LoadLC( R_NOT_MMBOX_STATUS_TITLE );
+	popupList->SetTitleL( *status );
+	CleanupStack::PopAndDestroy( status );	// status
+	status = NULL;
+
+	MDesCArray* itemList = listBox->Model()->ItemTextArray();
+	CDesCArray* itemArray = ( CDesCArray* ) itemList;
+
+    // Lets add the first label "Updated"
+
+    LOGTEXT(_L8("MMBoxDialog: ShowStatus 3"));
+	status = HBufC::NewLC( KMMBoxMaxStatusInfoLength );
+	buf = StringLoader::LoadLC( R_NOT_MMBOX_UPDATE_LABEL );	// first line - bold text
+	status->Des().Append( *buf );
+	status->Des().Append( TChar( '\t' ) );
+
+    // Lets add the update time
+
+    LOGTEXT(_L8("MMBoxDialog: ShowStatus 4"));
+    HBufC* dateFormat = StringLoader::LoadLC( R_QTN_DATE_USUAL_WITH_ZERO, iCoeEnv );
+    TBuf<KDateSize> dateString;
+    messageDate.FormatL( dateString, *dateFormat );
+    CleanupStack::PopAndDestroy(); //dateFormat
+
+    dateFormat = StringLoader::LoadLC( R_QTN_TIME_USUAL_WITH_ZERO, iCoeEnv );
+    TBuf<KDateSize> timeString;
+    messageDate.FormatL( timeString, *dateFormat );
+    CleanupStack::PopAndDestroy(); //dateFormat
+
+    LOGTEXT(_L8("MMBoxDialog: ShowStatus 5"));
+    CDesC16ArrayFlat* array = new(ELeave) CDesC16ArrayFlat( 2 );
+    CleanupStack::PushL( array );
+    array->AppendL( timeString );
+    array->AppendL( dateString );
+    buf = 
+        StringLoader::LoadL( R_NOT_MMBOX_INFO_TIME, *array, iCoeEnv );
+    status->Des().Append( *buf );
+    CleanupStack::PopAndDestroy( array );
+    CleanupStack::PushL( buf );
+
+    itemArray->AppendL( *status );
+	CleanupStack::PopAndDestroy(3);	// buf, buf, status
+	buf = NULL;
+	status = NULL;
+
+    // Lets add the 2nd label "Storage in use"
+
+    LOGTEXT(_L8("MMBoxDialog: ShowStatus 6"));
+	status = HBufC::NewLC( KMMBoxMaxStatusInfoLength );
+	buf = StringLoader::LoadLC( R_NOT_MMBOX_STORAGE_LABEL );	// first line - bold text
+	status->Des().Append( *buf );
+	status->Des().Append( TChar( '\t' ) );
+
+    // Lets add the "X %" stuff
+
+	TInt percentage = 100;
+
+	if( fullQuota > 0 )
+		{
+		percentage = TInt((((TReal)usedQuota/(TReal)fullQuota)+TReal(0.005))*100);
+		}
+
+	buf = StringLoader::LoadLC( R_NOT_MMBOX_STORAGE_DATA, percentage, iCoeEnv );
+
+    status->Des().Append( *buf );
+    itemArray->AppendL( *status );
+
+    CleanupStack::PopAndDestroy( 3 );	// buf, buf, status
+	buf = NULL;
+	status = NULL;
+
+    // Lets add the 3rd label "Quota used"
+
+	status = HBufC::NewLC( KMMBoxMaxStatusInfoLength );
+	buf = StringLoader::LoadLC( R_NOT_MMBOX_QUOTA_LABEL );	// first line - bold text
+	status->Des().Append( *buf );
+	status->Des().Append( TChar( '\t' ) );
+
+    // Lets add the " 5 / 5" stuff
+
+    LOGTEXT(_L8("MMBoxDialog: ShowStatus 7"));
+    CArrayFixFlat<TInt>* array3 = new(ELeave) CArrayFixFlat<TInt>( 2 );
+    CleanupStack::PushL( array3 );
+    array3->AppendL( usedQuota );
+    array3->AppendL( fullQuota );
+    buf = 
+        StringLoader::LoadL( R_NOT_MMBOX_QUOTA_DATA, *array3, iCoeEnv );
+    CleanupStack::PopAndDestroy( array3 ); //array3
+    CleanupStack::PushL( buf );
+
+    status->Des().Append( *buf );
+    itemArray->AppendL( *status );
+
+    CleanupStack::PopAndDestroy( 3 );	// buf, buf, status
+	buf = NULL;
+	status = NULL;
+
+	CleanupStack::Pop( popupList );	// popupList 
+
+	// Show Dialog
+    LOGTEXT(_L8("MMBoxDialog: ShowStatus 8"));
+	popupList->ExecuteLD( );
+	// cleanup
+	CleanupStack::PopAndDestroy( listBox );	//listBox
+	listBox = NULL;
+    LOGTEXT(_L8("MMBoxDialog: ShowStatus End"));
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::UpdateListL
+// ----------------------------------------------------
+void CMMBoxDialog::UpdateListL( )
+    {
+    LOGTEXT(_L8("MMBoxDialog: UpdateListL start"));
+    if ( IS_PHONE_OFF_LINEL() )
+        {   // We are in offline at the moment -> Infonote
+        ShowInformationNoteL( R_NOTMTM_OFFLINE_NOT_POSSIBLE, EFalse );
+        return;
+        }
+    LOGTEXT(_L8("MMBoxDialog: UpdateListL 2"));
+
+    if( !iUi.CheckSettingsL( ) )
+        { // AP is not valid so just return ->
+        return;
+        }
+    LOGTEXT(_L8("MMBoxDialog: UpdateListL 3"));
+
+    CMsvSingleOpWatcher* singleOpWatcher=CMsvSingleOpWatcher::NewL(*this);
+    CleanupStack::PushL(singleOpWatcher);
+
+    CMsvOperation* updateOp = iClientMtm->UpdateMmBoxListL(
+                        singleOpWatcher->iStatus );
+
+    if( updateOp == NULL )
+        {
+        // Unable to update the list -> show error
+        LOGTEXT(_L8("MMBoxDialog: UpdateList NULL op"));
+        CleanupStack::PopAndDestroy( singleOpWatcher );
+        ShowInformationNoteL( R_NOT_MMBOX_INFO_UNABLE_UPDATE, EFalse );
+        return;
+        }
+
+    CleanupStack::Pop( singleOpWatcher );    
+    iUpdateOperation = singleOpWatcher;
+    iUpdateOperation->SetOperation( updateOp );
+
+    ShowWaitNoteL( R_NOT_MMBOX_WAIT_UPDATING_NOTIF, ETrue );
+
+    LOGTEXT(_L8("MMBoxDialog: UpdateList End"));
+    return;
+    }
+
+// ---------------------------------------------------------
+// CMMBoxDialog::ShowInformationNoteL
+// ---------------------------------------------------------
+//
+void CMMBoxDialog::ShowInformationNoteL( TInt aResourceID, TBool aWaiting )
+    {
+    HBufC* string = NULL;
+    string = StringLoader::LoadLC( aResourceID, iCoeEnv );
+
+    CAknInformationNote* note = new ( ELeave )
+        CAknInformationNote( aWaiting );
+    note->ExecuteLD( *string );
+
+    CleanupStack::PopAndDestroy(); //string
+    }
+
+// ---------------------------------------------------------
+// CMMBoxDialog::ShowConfirmationQueryL
+// ---------------------------------------------------------
+//
+TInt CMMBoxDialog::ShowConfirmationQueryL( TInt aResourceId, TBool aOnlyOK/*=EFalse*/ ) const
+    {
+    HBufC* prompt = StringLoader::LoadLC( aResourceId, iCoeEnv );
+    TInt retVal = ShowConfirmationQueryL( *prompt, aOnlyOK );
+    CleanupStack::PopAndDestroy( prompt );
+    return retVal;
+    }
+
+// ---------------------------------------------------------
+// CMMBoxDialog::ShowConfirmationQueryL
+// ---------------------------------------------------------
+//
+TInt CMMBoxDialog::ShowConfirmationQueryL( const TDesC& aText, TBool aOnlyOK/*=EFalse*/ ) const
+    {
+    TInt dialogType=aOnlyOK?R_NOTUI_CONFIRMABLE_QUERY:R_NOTUI_CONFIRMATION_QUERY;
+    CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+    TInt retVal = dlg->ExecuteLD( dialogType, aText );
+    return retVal;    
+    }
+
+// ---------------------------------------------------------
+// CMMBoxDialog::HandleSessionEventL
+// ---------------------------------------------------------
+//
+void CMMBoxDialog::HandleSessionEventL(TMsvSessionEvent aEvent, 
+        TAny* /*aArg1*/, TAny* aArg2, TAny* /*aArg3*/)
+    {
+    LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Start"));
+    switch( aEvent )
+        {
+        case EMsvEntriesCreated:
+        case EMsvEntriesDeleted:
+        case EMsvEntriesChanged:
+			{
+			TMsvId parentId = KMsvNullIndexEntryId;
+			if ( aArg2 != NULL )
+				{	
+				parentId = *(TMsvId*)aArg2;
+				}
+			if( parentId == iMMBoxFolderId )
+				{ // in MMBoxFolder
+				ListBox( )->ClearSelection( );
+                if( !iOpenOperation && !iUpdateOperation && !iDeleteOperation )
+                    { // Lets close the menubar because something has been changed..
+				    LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Close menubar"));
+                    iMenuBar->StopDisplayingMenuBar( );
+				    LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Close menubar END"));
+                    }
+				if ( aEvent == EMsvEntriesCreated )
+					{
+				    LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Addition"));
+				    ListBox()->HandleItemAdditionL();
+					ListBox()->ScrollToMakeItemVisible( ListBox()->CurrentItemIndex( ) );
+					ListBox()->DrawNow();
+				    LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Addition End"));
+					}
+				else if ( aEvent == EMsvEntriesDeleted )
+					{
+					LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Removal"));
+					// Store the current selected item
+                    TInt index = ListBox()->CurrentItemIndex();
+                    // Refresh is needed to get the entry updated after the sessionevent
+                    iMessages->RefreshArrayL( iMMBoxFolderId );
+                    // Let's tell the listbox an item was removed
+					LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Removal 2"));
+					ListBox()->HandleItemRemovalL();
+                    // If current entry is out of boundaries, move the position
+                    TInt count = iMessages->MdcaCount( );
+                    if( index >= count || index < 0 )
+                        {
+    					LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Removal Change the index"));
+                        index = count - 1;
+                        }
+                    if( count > 0 )
+                        { // Lets make sure when don't highlight in an empty listbox
+    					LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Removal Entries left"));
+					    ListBox()->SetCurrentItemIndex( index );
+    					LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Removal Entries Update SB"));
+                        ListBox()->UpdateScrollBarsL( );
+                        }
+                    else 
+                        {
+                        SetMSKL();
+                        }
+					LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Removal DrawNow"));
+                    DrawNow();
+					ListBox()->DrawNow();
+					LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Removal End"));
+                    }
+				else
+					{
+					LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Entry Change"));
+                    // Refresh is needed to get the entry updated after the sessionevent
+                    iMessages->RefreshArrayL( iMMBoxFolderId );
+					ListBox()->DrawNow();
+					LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Entry Change END"));
+					}
+				}
+			break;
+			}
+
+        case EMsvCloseSession:
+            {
+            iSession.RemoveObserver( *this );
+            break;
+            }
+
+        default:
+            {
+            break;
+            }
+        }
+    LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent End"));
+    }
+
+// ---------------------------------------------------------
+// CMMBoxDialog::UpdateNavipaneL
+// ---------------------------------------------------------
+//
+void CMMBoxDialog::UpdateNavipaneL( )
+    {
+    LOGTEXT(_L8("MMBoxDialog: UpdateNavipaneL start"));
+	HBufC* buf;		// a buffer for strings
+
+    TMmboxInfo info;
+    TInt ret = 0;
+    TRAPD( err, ret=iClientMtm->MmboxInfoL( info ) );
+    
+#ifdef MMS_NOTIFICATIONS_TESTING_WO_MMBOX
+    ret = 1;
+    info.date.HomeTime();
+    User::After( 1000000 );
+#endif
+    
+    if( !err && ret )
+        {
+        TTime updateDate = info.date;
+
+	    TLocale locale;
+        updateDate += locale.UniversalTimeOffset();
+	    if (locale.QueryHomeHasDaylightSavingOn())          
+		    {
+		    TTimeIntervalHours daylightSaving(1);          
+		    updateDate += daylightSaving;
+		    }
+
+        TTime currentDate;
+        currentDate.HomeTime( );
+
+        TDateTime update = updateDate.DateTime( );
+        TDateTime current = currentDate.DateTime( );
+        if( update.Day( ) == current.Day( ) &&            
+            update.Month( ) == current.Month( ) &&
+            update.Year( ) == current.Year( ) )
+            {   // It's the same day
+
+            HBufC* dateFormat = StringLoader::LoadLC( R_QTN_TIME_USUAL, iCoeEnv );
+            TBuf<KDateSize> timeString;
+            updateDate.FormatL( timeString, *dateFormat );
+            CleanupStack::PopAndDestroy(); //dateFormat
+
+            CDesC16ArrayFlat* array = new(ELeave) CDesC16ArrayFlat( 1 );
+            CleanupStack::PushL( array );
+            array->AppendL( timeString );
+            buf = 
+                StringLoader::LoadL( R_NOT_MMBOX_NAVI_TIME, *array, iCoeEnv );
+            CleanupStack::PopAndDestroy( array );
+            CleanupStack::PushL( buf );
+            
+            }
+        else
+            {   // It's not the same day
+            HBufC* dateFormat = StringLoader::LoadLC( R_QTN_DATE_SHORT, iCoeEnv );
+            TBuf<KDateSize> dateString;
+            updateDate.FormatL( dateString, *dateFormat );
+            CleanupStack::PopAndDestroy(); //dateFormat
+
+            CDesC16ArrayFlat* array = new(ELeave) CDesC16ArrayFlat( 1 );
+            CleanupStack::PushL( array );
+            array->AppendL( dateString );
+            buf = 
+                StringLoader::LoadL( R_NOT_MMBOX_NAVI_DATE, *array, iCoeEnv );
+            CleanupStack::PopAndDestroy( array );
+            CleanupStack::PushL( buf );
+            }
+        }
+    else
+        {
+        buf = HBufC::NewL(0);
+        CleanupStack::PushL( buf );
+        }
+
+    delete iNaviDecorator;
+    iNaviDecorator = NULL;
+
+    iNaviDecorator = iNaviPane->CreateTabGroupL();
+    CAknTabGroup* tabGroup = static_cast<CAknTabGroup*>
+        ( iNaviDecorator->DecoratedControl() );
+
+    tabGroup->AddTabL( 0, *buf );
+
+    tabGroup->SetActiveTabById( 0 );
+    tabGroup->SetTabFixedWidthL( KTabWidthWithOneTab );
+
+	CleanupStack::PopAndDestroy( buf );	// buf, buf, status
+    
+    iNaviPane->PushL( *iNaviDecorator );  // Make it visible
+    LOGTEXT(_L8("MMBoxDialog: UpdateNavipaneL End"));
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::HandleOpenNextPreviousL
+// ----------------------------------------------------
+void CMMBoxDialog::HandleOpenNextPreviousL( TBool aOpenNext )
+    {
+    LOGTEXT(_L8("MMBoxDialog: Open Next/Prev Start"));
+    TInt newIndex = ListBox( )->CurrentItemIndex( );
+
+    if( iOpenOperation )
+        {
+        delete iOpenOperation;
+        iOpenOperation = NULL;
+        }
+
+    newIndex += aOpenNext?1:-1;
+
+    if( newIndex < 0 || newIndex >= iMessages->MdcaCount( ) )
+        { // Index out of array -> lets just ignore this..
+        return;
+        }
+
+    ListBox()->SetCurrentItemIndex( newIndex );
+    ListBox()->DrawDeferred();
+
+    TMsvEntry entry = iMessages->Entry( newIndex );
+
+    if( iUiData.OperationSupportedL( KMtmUiFunctionOpenMessage, entry ) )
+        {
+        return;
+        }
+
+    OpenNotificationL( );    
+    }
+
+// ---------------------------------------------------------
+// ShowWaitNoteLC
+// ---------------------------------------------------------
+
+void CMMBoxDialog::ShowWaitNoteLC(
+    TInt aNoteTxtResourceId, 
+    TBool aVisibilityDelayOff )
+    {
+    ConstructWaitNoteLC( aVisibilityDelayOff );
+    HBufC* text = StringLoader::LoadLC( aNoteTxtResourceId, iCoeEnv );
+    iWaitDialog->SetTextL( *text );
+    CleanupStack::PopAndDestroy( ); // text
+    iWaitDialog->RunLD( );
+    }
+
+// ---------------------------------------------------------
+// ConstructWaitNoteLC
+// ---------------------------------------------------------
+
+void CMMBoxDialog::ConstructWaitNoteLC(
+    TBool aVisibilityDelayOff )
+    {
+    delete iWaitDialog;
+    iWaitDialog = NULL;
+    iWaitDialog = new (ELeave) CAknWaitDialog( 
+        reinterpret_cast<CEikDialog**>( &iWaitDialog ), 
+        aVisibilityDelayOff );
+    CleanupStack::PushL( TCleanupItem( CleanupWaitDialog, (TAny**)&iWaitDialog ) ); 
+    iWaitDialog->PrepareLC( R_NOTUI_WAIT_NOTE );
+    }
+
+// ----------------------------------------------------
+// CMMBoxDialog::CleanupWaitDialog
+// ----------------------------------------------------
+void CMMBoxDialog::CleanupWaitDialog(TAny* aAny)
+    {
+    CAknWaitDialog** dialog = (CAknWaitDialog**) aAny;
+    if ( dialog && *dialog )
+        {
+        delete *dialog;
+        *dialog = NULL;
+        }
+    }
+
+// ---------------------------------------------------------
+// ShowWaitNoteL
+// ---------------------------------------------------------
+
+void CMMBoxDialog::ShowWaitNoteL(
+    TInt aNoteTxtResourceId, 
+    TBool aVisibilityDelayOff )
+    {
+    HBufC* text = StringLoader::LoadLC( aNoteTxtResourceId, iCoeEnv );
+    delete iWaitDialog;
+    iWaitDialog = NULL;
+    iWaitDialog = new (ELeave) CAknWaitDialog( 
+        reinterpret_cast<CEikDialog**>( &iWaitDialog ), 
+        aVisibilityDelayOff );
+    iWaitDialog->SetTextL( *text );
+    CleanupStack::PopAndDestroy( ); // text
+    iWaitDialog->PrepareLC( R_NOTUI_WAIT_NOTE );
+    iWaitDialog->RunLD( );
+    }
+
+// ---------------------------------------------------------
+// SetMSKL
+// ---------------------------------------------------------
+void CMMBoxDialog::SetMSKL()
+    {
+    const TInt KMskPosition = 3;
+    CEikColumnListBox* listBox = ListBox();
+    if ( listBox->Model()->NumberOfItems() > 0 )
+        {
+        TInt resourceId;
+        if ( listBox->View()->ItemIsSelected( listBox->CurrentItemIndex() ) )
+            {
+            resourceId = R_NOT_MMBOX_MSK_BUTTON_UNMARK;
+            }
+        else
+            {
+            resourceId = R_NOT_MMBOX_MSK_BUTTON_MARK;
+            }
+            
+        CEikButtonGroupContainer &cba = ButtonGroupContainer();
+        cba.SetCommandL( KMskPosition, resourceId );
+        cba.DrawDeferred();
+        }
+    else
+        {
+        CEikButtonGroupContainer &cba = ButtonGroupContainer();
+        cba.SetCommandL( KMskPosition, R_NOT_MMBOX_MSK_BUTTON_EMPTY );
+        cba.DrawDeferred();
+        }
+    }
+
+// ---------------------------------------------------------
+// ShowConfirmationQueryL
+// ---------------------------------------------------------
+TInt CMMBoxDialog::ShowConfirmationQueryL(  TInt    aCount,
+                                            TInt    aTotalOnes,                          
+                                            TInt    aResource )
+    {
+    CArrayFixFlat<TInt>* arr = new(ELeave) CArrayFixFlat<TInt>( 2 );
+    CleanupStack::PushL( arr );
+    arr->AppendL( aCount );
+    arr->AppendL( aTotalOnes );
+    HBufC* buf = 
+        StringLoader::LoadL( aResource, *arr, iCoeEnv );
+    CleanupStack::PopAndDestroy( arr );
+    CleanupStack::PushL( buf );
+
+    TInt ret = ShowConfirmationQueryL( *buf, ETrue );
+
+    CleanupStack::PopAndDestroy( buf );
+    return ret;
+    }
+//  End of File