mobilemessaging/smum/simdialogplugins/defaultsimdlg/src/smssimdialog.cpp
branchRCL_3
changeset 60 7fdbb852d323
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/smum/simdialogplugins/defaultsimdlg/src/smssimdialog.cpp	Wed Sep 01 12:31:54 2010 +0100
@@ -0,0 +1,1175 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: sms sim dlg implementation
+ *
+ */
+
+
+
+// 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 <avkon.mbg>                    // bitmaps
+#include <akntitle.h>                   // CAknTitlePane
+#include <AknIconArray.h>               // CAknIconArray
+#include <hlplch.h>                     // For HlpLauncher 
+#include <bldvariant.hrh>
+#include <featmgr.h>                    // FeatureManager
+#include <data_caging_path_literals.hrh>
+// message includes
+#include <msvapi.h>                     // for CMsvSession
+#include <akninputblock.h>				// CAknInputBlock
+#include <MsgFolderSelectionDialog.h>   // CMsgFolderSelectionDialog
+#include <MuiuOperationWait.h>          // CMuiuOperationWait
+#include <muiu.mbg>                     // bitmaps
+#include <smscmds.h>                    // for async sms commands
+#include <smutset.h>                    // for TSmsProgress
+
+#include <defaultsimdialog.rsg>                     // for resource ids
+#include <csxhelp/mce.hlp.hrh>
+#include <aknconsts.h>                  // KAvkonBitmapFile
+#include <AknsUtils.h>
+#include <AknIconUtils.h> 				// AknIconUtils::AvkonIconFileName()
+#include <AknsConstants.h>
+#include <AknUtils.h>
+#include <aknnotewrappers.h>              //for displayingnote
+#include <Profile.hrh>                    // for profile state
+#include <ProfileEngineSDKCRKeys.h>
+#include <centralrepository.h>    
+#include <bautils.h>  // BaflUtils
+#include <ConeResLoader.h> // RConeResourceLoader
+
+#include "simdeletecopyoperation.h"    // for CSimDeleteCopyOperation
+#include "SMSU.H"                          // for CSmsMtmUi
+#include "smssimdialog.h"                  // for CSmsSimDialog
+#include "SMSU.HRH"            // for command ids
+//For logging
+#include "SmumLogging.h"
+
+//  LOCAL CONSTANTS AND MACROS
+const TInt KSimMessageBitmapArrayGranularity = 4;
+const TInt KSimMessageTempArrayGranularity = 4;
+const TInt KSmumSimDialogMessageBitmapIndex = 1;
+
+_LIT( KSimDlgResourceFile, "defaultsimdialog.rsc" );
+_LIT( KMuiuBitmapFile, "Muiu.MBM" );
+_LIT( KSmsiMarkReplacement, "1");
+
+//
+//
+// CSimMessageArray
+//
+//
+
+// ----------------------------------------------------
+// CSimMessageArray::CSimMessageArray
+// ----------------------------------------------------
+CSimMessageArray::CSimMessageArray( CMsvSession& aSession ):
+iSession( aSession )
+                    {
+                    }
+
+// ----------------------------------------------------
+// CSimMessageArray::NewL
+// ----------------------------------------------------
+CSimMessageArray* CSimMessageArray::NewL( CMsvSession& aSession )
+    {
+    SMUMLOGGER_ENTERFN(" CSimMessageArray::NewL");
+    CSimMessageArray* self = new (ELeave) CSimMessageArray(aSession);
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    SMUMLOGGER_LEAVEFN(" CSimMessageArray::NewL");
+    return self;
+    }
+
+// ----------------------------------------------------
+// CSimMessageArray::ConstructL
+// ----------------------------------------------------
+void CSimMessageArray::ConstructL()
+    {
+    SMUMLOGGER_ENTERFN(" CSimMessageArray::ConstructL");
+    TMsvSelectionOrdering ordering = TMsvSelectionOrdering(
+            KMsvNoGrouping,
+            EMsvSortByDescription,
+            ETrue );
+
+    iSmsServiceEntry = CMsvEntry::NewL( 
+            iSession, 
+            KMsvRootIndexEntryId, 
+            ordering );
+
+    iListBoxText = HBufC::NewL( KSmumMaxDisplayTextLength );
+    SMUMLOGGER_LEAVEFN(" CSimMessageArray::ConstructL");
+    }
+
+
+// ----------------------------------------------------
+// CSimMessageArray::~CSimMessageArray
+// ----------------------------------------------------
+CSimMessageArray::~CSimMessageArray()
+    {
+    SMUMLOGGER_ENTERFN(" CSimMessageArray::~CSimMessageArray");   
+    delete iSmsServiceEntry;
+    delete iListBoxText;
+    SMUMLOGGER_LEAVEFN(" CSimMessageArray::~CSimMessageArray");
+    }
+
+// ----------------------------------------------------
+// CSimMessageArray::MdcaCount
+// ----------------------------------------------------
+TInt CSimMessageArray::MdcaCount() const
+{
+SMUMLOGGER_ENTERFN(" CSimMessageArray::MdcaCount");
+if ( iSmsServiceEntry->EntryId() == KMsvRootIndexEntryId )
+    {
+    SMUMLOGGER_LEAVEFN(" CSimMessageArray::MdcaCount - 0");
+    return 0;
+    }
+else
+    {
+    SMUMLOGGER_LEAVEFN(" CSimMessageArray::MdcaCount - COUNT");
+    return iSmsServiceEntry->Count();
+    }
+}
+
+// ----------------------------------------------------
+// CSimMessageArray::MdcaPoint
+// ----------------------------------------------------
+TPtrC CSimMessageArray::MdcaPoint(TInt aIndex) const
+{
+SMUMLOGGER_ENTERFN(" CSimMessageArray::MdcaCount(INDEX)");
+// prepare 
+TPtr tempText = iListBoxText->Des();
+tempText.Zero();
+const TMsvEntry* child = NULL;
+child = &(*iSmsServiceEntry)[ aIndex ];
+
+// construct listbox-string
+// bitmap
+tempText.AppendNum( KSmumSimDialogMessageBitmapIndex );
+tempText.Append( KColumnListSeparator );
+// sender-information
+if ( child->iDetails.Length() > KSmumMaxVisibleChars )
+    {
+    tempText.Append( child->iDetails.Left( KSmumMaxVisibleChars-1 ) );
+    tempText.Append( CEditableText::EEllipsis );
+    }
+else
+    {
+    tempText.Append( child->iDetails );
+    }
+
+// msg "subject"
+tempText.Append( KColumnListSeparator );
+if ( child->iDescription.Length() > KSmumMaxVisibleChars )
+    {
+    tempText.Append( child->iDescription.Left( KSmumMaxVisibleChars-1 ) );
+    tempText.Append( CEditableText::EEllipsis );
+    }
+else
+    {
+    tempText.Append( child->iDescription );
+    }
+
+SMUMLOGGER_LEAVEFN(" CSimMessageArray::MdcaCount(INDEX)");
+return tempText;
+}
+
+
+// ----------------------------------------------------
+// CSimMessageArray::EntryId
+// ----------------------------------------------------
+TMsvId CSimMessageArray::EntryId( TInt aIndex ) const
+{
+return (*iSmsServiceEntry)[ aIndex ].Id();
+}
+
+// ----------------------------------------------------
+// CSimMessageArray::RefreshArrayL
+// ----------------------------------------------------
+void CSimMessageArray::RefreshArrayL( TMsvId aFolderId )
+    {
+    iSmsServiceEntry->SetEntryL( KMsvDeletedEntryFolderEntryId );
+    iSmsServiceEntry->SetEntryL( aFolderId );
+    }
+
+
+
+//
+//
+// CSmsSimDialog
+//
+//
+
+// ----------------------------------------------------
+// CSmsSimDialog::CSmsSimDialog
+// ----------------------------------------------------
+CSmsSimDialog::CSmsSimDialog(CSmsMtmUi&  aSmsMtmUi, CMsvSession& aSession, TInt& aExitCode):
+iSmsMtmUi(aSmsMtmUi),
+iSession(aSession),
+iExitCode( aExitCode ),
+iDialogDismissed( EFalse ),
+iHelpFeatureSupported( EFalse ),
+iMsgCountBeforeOperation( 0 ),
+iResourceFileOffset(0),
+iContextCommand(EFalse)
+        {
+        SMUMLOGGER_ENTERFN(" CSmsSimDialog::CSmsSimDialog");
+        iExitCode = KErrNone;
+        iMarkReplacementText.Copy( KSmsiMarkReplacement );
+        SMUMLOGGER_LEAVEFN(" CSmsSimDialog::CSmsSimDialog");
+        }
+
+// ----------------------------------------------------
+// CSmsSimDialog::~CSmsSimDialog
+// ----------------------------------------------------
+CSmsSimDialog::~CSmsSimDialog()
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::~CSmsSimDialog");
+    if( iResourceFileOffset )
+        {
+        CCoeEnv::Static()->DeleteResourceFile( iResourceFileOffset );
+        }
+
+    delete iOldTitleText;
+    delete iEnumerationOperation;
+    delete iCopyOrDeleteOperation;
+    delete iProgressDialog;
+    delete iWaitDialog;
+    delete iMessages;
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::~CSmsSimDialog");
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::NewL
+// ----------------------------------------------------
+CSmsSimDialog* CSmsSimDialog::NewL(CSmsMtmUi&  aSmsMtmUi, CMsvSession& aSession, TInt& aExitCode)
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::NewL");
+    CSmsSimDialog* self= new(ELeave) CSmsSimDialog(aSmsMtmUi, aSession, aExitCode);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::NewL");
+    return self;
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::ConstructL
+// ----------------------------------------------------
+void CSmsSimDialog::ConstructL()
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::ConstructL");
+
+    // Resource loader
+    CEikonEnv* env = CEikonEnv::Static();    
+    TParse fp;
+    fp.Set( KSimDlgResourceFile, &KDC_RESOURCE_FILES_DIR , NULL );
+    TFileName filename = fp.FullName();    
+    BaflUtils::NearestLanguageFile(env->FsSession(), filename);
+    iResourceFileOffset = env->AddResourceFileL(filename); 
+
+    CAknDialog::ConstructL( R_SMS_DEFAULT_SIM_DIALOG_MENUBAR );
+    iMessages = CSimMessageArray::NewL( iSession );
+
+    // Prepare FeatureManager, read values to members and uninitialize FeatureManager
+    FeatureManager::InitializeLibL();
+    iHelpFeatureSupported = FeatureManager::FeatureSupported( KFeatureIdHelp );
+    FeatureManager::UnInitializeLib();
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::ConstructL");
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::PreLayoutDynInitL
+// ----------------------------------------------------
+void CSmsSimDialog::PreLayoutDynInitL()                        
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::PreLayoutDynInitL");
+    CEikColumnListBox* listBox = ListBox();
+    listBox->SetListBoxObserver( this );
+
+    // Create scroll bar
+    listBox->CreateScrollBarFrameL();
+    listBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+
+    // Set data
+    listBox->Model()->SetItemTextArray(iMessages);
+    listBox->Model()->SetOwnershipType(ELbmDoesNotOwnItemArray);
+    HBufC* noMessages = StringLoader::LoadLC( R_SMS_DEFAULT_SIM_DIALOG_EMPTY, iCoeEnv );
+    listBox->View()->SetListEmptyTextL( *noMessages );
+    CleanupStack::PopAndDestroy( noMessages );
+    noMessages = NULL;
+
+    StoreTitleTextAndSetNewL();
+
+    // create icon array
+    CArrayPtr< CGulIcon >* icons = 
+    new( ELeave ) CAknIconArray( KSimMessageBitmapArrayGranularity );
+    CleanupStack::PushL( icons );
+    MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
+
+    TFileName fileName;
+    fileName.Copy( KAvkonBitmapFile );
+    icons->AppendL( 
+            AknsUtils::CreateGulIconL( skinInstance, 
+                    KAknsIIDQgnIndiMarkedAdd,
+                    fileName, 
+                    EMbmAvkonQgn_indi_marked_add, 
+                    EMbmAvkonQgn_indi_marked_add_mask ) );
+    // Parse the filename
+    TParse tp;
+    tp.Set( KMuiuBitmapFile, &KDC_APP_BITMAP_DIR, NULL );
+    fileName.Copy( tp.FullName() );
+    icons->AppendL( 
+            AknsUtils::CreateGulIconL( skinInstance, 
+                    KAknsIIDQgnPropMceSmsRead,
+                    fileName, 
+                    EMbmMuiuQgn_prop_mce_sms_read, 
+                    EMbmMuiuQgn_prop_mce_sms_read_mask ) );
+    // Set the icon array. takes ownership
+    reinterpret_cast<CAknDoubleGraphicStyleListBox*> 
+    (listBox)->ItemDrawer()->FormattedCellData()->SetIconArrayL( icons );
+    CleanupStack::Pop(); // icons
+    // Start the enumeration
+    EnumerateSimMessagesL();
+    iMenuBar->SetContextMenuTitleResourceId( R_SMS_DEFAULT_SIM_DIALOG_CONTEXTMENUBAR );    
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::PreLayoutDynInitL");
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::OkToExitL
+// ----------------------------------------------------
+TBool CSmsSimDialog::OkToExitL(TInt aButtonId)
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::OkToExitL");
+    CAknInputBlock::NewLC(); // Absorb keys
+    TInt returnValue = 0;
+
+    switch(aButtonId)
+        {
+        case EAknSoftkeyEmpty:
+            {
+            returnValue = EFalse;
+            }
+            break;
+        case EAknSoftkeyOptions:
+            {
+            iMenuBar->SetMenuType(CEikMenuBar::EMenuOptions);  
+            iMenuBar->TryDisplayMenuBarL();
+            returnValue = EFalse;
+            }
+            break;
+        case EAknSoftkeyContextOptions:
+            {
+			iContextCommand = ETrue;
+            // Middle softkey was pressed. Display context menu.
+            iMenuBar->SetMenuType(CEikMenuBar::EMenuContext);
+            iMenuBar->TryDisplayContextMenuBarL();
+            returnValue = EFalse;
+            }
+            break;
+        default:
+            {
+            TBool okToExit = CAknDialog::OkToExitL( aButtonId );
+            if ( okToExit )
+                {
+                TRAP_IGNORE( DeleteSimFolderL() );
+                if ( aButtonId != EEikBidCancel )
+                    {
+                    TRAP_IGNORE( RestoreTitleTextL() );
+                    }
+                }
+            returnValue = okToExit;
+            }
+            break;
+
+        }      
+
+    CleanupStack::PopAndDestroy(); // CAknInputBlock
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::OkToExitL");
+    return returnValue;
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::ProcessCommandL
+// ----------------------------------------------------
+void CSmsSimDialog::ProcessCommandL( TInt aCommandId )
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::ProcessCommandL");
+    CAknDialog::ProcessCommandL( aCommandId ) ;
+    CEikColumnListBox* listBox = ListBox();
+    CRepository* repository = CRepository::NewLC( KCRUidProfileEngine );
+    TInt defaultType( EProfileGeneralId );
+    User::LeaveIfError( repository->Get( KProEngActiveProfile, defaultType ) );
+    CleanupStack::PopAndDestroy( repository );
+
+    switch ( aCommandId )
+        {
+        case ESmsMtmUiCommandIdCopy:
+            //General system error pops up when deleting a SIM message in offline mode
+            if ( defaultType == EProfileOffLineId )
+                {            	
+                // Show note and exit 
+                HBufC* noteString = StringLoader::LoadLC( R_QTN_OFFLINE_NOT_POSSIBLE, iCoeEnv );
+                CAknInformationNote* note = new ( ELeave ) CAknInformationNote( ETrue );                
+                note->ExecuteLD( *noteString );
+                CleanupStack::PopAndDestroy(); // noteString 
+                TryExitL( EAknSoftkeyBack );               
+                }
+            else
+                {   	      
+                HandleCopyFromSimToLocalFolderL();
+                }
+            break;
+        case ESmsMtmUiCommandIdDelete:
+            //General system error pops up when deleting a SIM message in offline mode
+            if ( defaultType == EProfileOffLineId )
+                {               
+                // Show note and exit 
+                HBufC* noteString = StringLoader::LoadLC( R_QTN_OFFLINE_NOT_POSSIBLE, iCoeEnv );
+                CAknInformationNote* note = new ( ELeave ) CAknInformationNote( ETrue );                
+                note->ExecuteLD( *noteString );
+                CleanupStack::PopAndDestroy(); // noteString
+                TryExitL( EAknSoftkeyBack );                                
+                }
+            else
+                {    
+                HandleDeleteFromSimL();
+                }
+            break;
+        case ESmsMtmUiCommandIdEditMark:
+            {
+#ifdef _DEBUG
+            RDebug::Print(_L("CSmsSimDialog::ProcessCommandL: mark item %d"), 
+                    listBox->CurrentItemIndex() );
+#endif
+            listBox->View()->SelectItemL( listBox->CurrentItemIndex() );
+            break;
+            }
+        case ESmsMtmUiCommandIdEditUnmark:
+            {
+#ifdef _DEBUG
+            RDebug::Print(_L("CSmsSimDialog::ProcessCommandL: unmark item %d"), 
+                    listBox->CurrentItemIndex() );
+#endif
+            listBox->View()->DeselectItem( listBox->CurrentItemIndex() );
+            break;
+            }
+        case ESmsMtmUiCommandIdEditUnmarkAll:
+            {
+#ifdef _DEBUG
+            RDebug::Print(_L("CSmsSimDialog::ProcessCommandL: unmark all") );
+#endif
+
+            listBox->View()->ClearSelection();
+            break;
+            }
+        case ESmsMtmUiCommandIdEditMarkAll:
+            {
+#ifdef _DEBUG
+            RDebug::Print(_L("CSmsSimDialog::ProcessCommandL: mark all") );
+#endif
+
+            CArrayFixFlat<TInt>* indexArray = new( ELeave ) CArrayFixFlat<TInt>( 
+                    KSimMessageTempArrayGranularity );
+            CleanupStack::PushL( indexArray );
+            const TInt count = listBox->Model()->NumberOfItems();
+            for ( TInt loop = 0; loop < count; loop++ )
+                {
+                indexArray->AppendL( loop );
+                }
+            listBox->View()->SetSelectionIndexesL( indexArray );
+            CleanupStack::PopAndDestroy(); // indexArray
+            break;
+            }
+        case EAknCmdHelp:
+            {
+            LaunchHelpL();                
+            }
+            break;
+        case ESmsSettingsChoiceMenuExit:
+            {
+            iExitCode = EEikCmdExit;
+            TryExitL( EAknCmdExit );
+            }
+            break;
+
+        default :
+            break;
+        }
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::ProcessCommandL");
+    }
+// ----------------------------------------------------
+// CSmsSimDialog::DynInitMenuPaneL
+// ----------------------------------------------------
+void CSmsSimDialog::DynInitMenuPaneL(
+        TInt aResourceId, CEikMenuPane* aMenuPane )
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::DynInitMenuPaneL - 2");
+    if ( aResourceId == R_SMS_DEFAULT_SIM_DIALOG_MENUPANE )
+        {
+        if ( ListBox()->Model()->NumberOfItems() == 0 )
+            {
+            aMenuPane->DeleteMenuItem( ESmsMtmUiCommandIdEdit );
+            }
+
+        aMenuPane->SetItemDimmed( EAknCmdHelp, !iHelpFeatureSupported );                      
+        }
+    else if ( aResourceId == R_MCE_DEFAULT_SIM_DIALOG_EDIT_CASCADE )
+        {
+        DynInitEditMenuL( aMenuPane );
+        }
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::DynInitMenuPaneL - 2");
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::OfferKeyEventL
+// ----------------------------------------------------
+TKeyResponse CSmsSimDialog::OfferKeyEventL(
+        const TKeyEvent& aKeyEvent, 
+        TEventCode aType )
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::OfferKeyEventL");
+    CEikColumnListBox* listBox = ListBox();
+    if ( listBox && aType == EEventKey && aKeyEvent.iCode == EKeyBackspace &&
+            listBox->Model()->NumberOfItems() > 0 )
+        {
+        HandleDeleteFromSimL();
+        return EKeyWasConsumed;
+        }
+    if ( aType == EEventKey && aKeyEvent.iCode == EKeyOK )
+        {
+        if ( ListBox()->Model()->NumberOfItems() )
+            {
+            iMenuBar->SetMenuType(CEikMenuBar::EMenuContext);
+            iMenuBar->TryDisplayContextMenuBarL();                
+            }        	
+        return EKeyWasConsumed;
+        }
+    if( aType == EEventKeyUp )
+        {
+        UpdateMskL( );
+        }
+
+    // Exit if waitnote is cancelled & dismissed
+    if ( iDialogDismissed && iEnumerationOperation )
+        {
+        TryExitL( EAknSoftkeyBack );
+        iDialogDismissed = EFalse;
+        return EKeyWasConsumed;
+        }
+
+    return CAknDialog::OfferKeyEventL( aKeyEvent, aType );
+    }
+
+
+// ----------------------------------------------------
+// CSmsSimDialog::DynInitEditMenuL
+// ----------------------------------------------------
+void CSmsSimDialog::DynInitEditMenuL(  CEikMenuPane* aMenuPane )
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::DynInitEditMenuL(MEUPANE)");
+    CEikColumnListBox* listBox = ListBox();
+
+    // check what state item under "cursor" is
+    const CListBoxView::CSelectionIndexArray* items = 
+    listBox->SelectionIndexes();
+    TKeyArrayFix key(0, ECmpTInt);  
+    TInt count = items->Count();
+    if ( 0 == count )
+        {
+        //if no selection, disable unmarkall
+        aMenuPane->SetItemDimmed( ESmsMtmUiCommandIdEditUnmarkAll, ETrue );
+        }   
+    if ( count == listBox->Model()->NumberOfItems() )
+        {
+        //if all selected, disable markall
+        aMenuPane->SetItemDimmed( ESmsMtmUiCommandIdEditMarkAll, ETrue );
+        } 
+    if(iContextCommand)
+        {
+        aMenuPane->SetItemDimmed( ESmsMtmUiCommandIdEditMark, EFalse );
+        aMenuPane->SetItemDimmed( ESmsMtmUiCommandIdEditUnmark, EFalse );
+        iContextCommand = EFalse;
+        }
+    else
+        {
+        aMenuPane->SetItemDimmed( ESmsMtmUiCommandIdEditMark, ETrue );
+        aMenuPane->SetItemDimmed( ESmsMtmUiCommandIdEditUnmark, ETrue );
+        } 
+    TInt pos;
+    if ( !items->Find(listBox->CurrentItemIndex(), key, pos))
+        {
+        aMenuPane->DeleteMenuItem( ESmsMtmUiCommandIdEditMark );
+        }
+    else
+        {
+        aMenuPane->DeleteMenuItem( ESmsMtmUiCommandIdEditUnmark );
+        }
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::DynInitEditMenuL(MEUPANE)");
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::HandleListBoxEventL
+// ----------------------------------------------------
+void CSmsSimDialog::HandleListBoxEventL(
+        CEikListBox* /*aListBox*/, 
+        TListBoxEvent aEventType )
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::HandleListBoxEventL");
+    switch(aEventType)
+        {
+        case EEventEnterKeyPressed:
+        case EEventItemSingleClicked:
+            iContextCommand = ETrue;
+            TryExitL( EAknSoftkeyContextOptions );
+            break;
+        default:
+            break;
+        }
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::HandleListBoxEventL");
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::DeleteSimFolderL
+// ----------------------------------------------------
+void CSmsSimDialog::DeleteSimFolderL()
+    {
+    if ( iSimFolderId != KMsvNullIndexEntryId )
+        {
+        SMUMLOGGER_ENTERFN(" CSmsSimDialog::DeleteSimFolderL");
+        CMsvEntry* entry = iSession.GetEntryL(iSimFolderId);
+        CleanupStack::PushL(entry);
+        TMsvSelectionOrdering ordering = entry->SortType();
+        ordering.SetShowInvisibleEntries( ETrue );
+        entry->SetSortTypeL( ordering );
+        entry->SetEntryL( entry->OwningService() );   // now entry points to SMS service
+        CAknInputBlock::NewLC();
+        CMuiuOperationWait* waiter =
+        CMuiuOperationWait::NewLC();
+        CMsvOperation* deleteOperation = 
+        entry->DeleteL(iSimFolderId, waiter->iStatus);
+        waiter->Start();
+        delete deleteOperation;
+        CleanupStack::PopAndDestroy(3, entry);  // entry, waiter, CAknInputBlock
+        iSimFolderId = KMsvNullIndexEntryId;
+        }
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::DeleteSimFolderL");
+    }
+
+
+
+// ----------------------------------------------------
+// CSmsSimDialog::HandleCopyFromSimToLocalFolderL
+// ----------------------------------------------------
+void CSmsSimDialog::HandleCopyFromSimToLocalFolderL()
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::HandleCopyFromSimToLocalFolderL");
+
+    TMsvId destinationId = 0;
+    HBufC* title = StringLoader::LoadLC(R_SMS_DEFAULT_SIM_DIALOG_COPY_MESSAGES, iCoeEnv);
+    if ( !CMsgFolderSelectionDialog::SelectFolderL( destinationId, *title ) )
+        {
+        CleanupStack::PopAndDestroy( title );
+        return;
+        }
+
+    CleanupStack::PopAndDestroy( title );
+
+    LaunchNoteAndOperationL( destinationId );
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::HandleCopyFromSimToLocalFolderL");
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::CreateSelectionArrayLC
+// ----------------------------------------------------
+CMsvEntrySelection* CSmsSimDialog::CreateSelectionArrayLC()
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::CreateSelectionArrayLC");
+    CEikColumnListBox* listBox = ListBox();
+    const TInt selectionCount = listBox->View()->SelectionIndexes()->Count();
+
+    CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection();
+    CleanupStack::PushL( selection );
+    if ( selectionCount )
+        {
+        // selected items
+        const CListBoxView::CSelectionIndexArray* items = 
+        listBox->SelectionIndexes();
+        const TInt count = items->Count();
+        for ( TInt loop = 0; loop < count; loop++ )
+            {
+            selection->AppendL( iMessages->EntryId( items->At( loop ) ) );
+            }
+        }
+    else
+        {
+        // item under cursor
+        const TInt index = ListBox()->CurrentItemIndex();
+        selection->AppendL( iMessages->EntryId(index) );
+        }
+#ifdef _DEBUG
+    const TInt count2 = selection->Count();
+    RDebug::Print(_L("CSmsSimDialog::CreateSelectionArrayLC: items %d"), 
+            count2 );
+    for ( TInt loop2 = 0; loop2 < count2; loop2++ )
+        {
+        RDebug::Print(_L("item %d id %d"), 
+                loop2, selection->At( loop2 ) );
+        }
+#endif
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::CreateSelectionArrayLC");
+    return selection;
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::HandleDeleteFromSimL
+// ----------------------------------------------------
+void CSmsSimDialog::HandleDeleteFromSimL()
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::HandleDeleteFromSimL");
+    HBufC* messageText = NULL;
+    const TInt messageCount = ListBox()->View()->SelectionIndexes()->Count();
+    if ( messageCount == 1 || messageCount == 0 )
+        {
+        messageText = StringLoader::LoadL( 
+                R_DEFAULT_SIM_MESSAGE_DELETE_CONFIRMATION_ONE_MESSAGE, iCoeEnv);
+        }
+    else
+        {
+        messageText = StringLoader::LoadL( 
+                R_DEFAULT_SIM_MESSAGE_DELETE_CONFIRMATION_MANY_MESSAGES, 
+                messageCount, 
+                iCoeEnv);
+        }
+    CleanupStack::PushL( messageText );
+    CAknQueryDialog* confDialog = CAknQueryDialog::NewL( );
+    if ( !confDialog->ExecuteLD( R_DEFAULT_SIM_MESSAGE_DELETE_CONFIRMATION, *messageText ) )
+        {
+        CleanupStack::PopAndDestroy( messageText );
+        SMUMLOGGER_LEAVEFN(" CSmsSimDialog::HandleDeleteFromSimL - 1");
+        return;
+        }
+    CleanupStack::PopAndDestroy( messageText );
+
+    LaunchNoteAndOperationL();
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::HandleDeleteFromSimL - 2");
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::UpdateSimMessagesArrayL
+// ----------------------------------------------------
+void CSmsSimDialog::UpdateSimMessagesArrayL()
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::UpdateSimMessagesArrayL");
+    const TInt index = ListBox()->CurrentItemIndex();
+    iMessages->RefreshArrayL( iSimFolderId );
+
+    ListBox()->View()->ClearSelection();
+    const TInt count = iMessages->MdcaCount();
+    if ( iMsgCountBeforeOperation < count )
+        { // msg count increased
+        ListBox()->HandleItemAdditionL();
+        }
+    else if ( iMsgCountBeforeOperation > count )
+        { // msg count decreased
+        if ( index == KErrNotFound && count )
+            {
+            ListBox()->SetCurrentItemIndex( count - 1 );
+            }
+        ListBox()->HandleItemRemovalL();
+        }
+
+    // update msg count
+    iMsgCountBeforeOperation = iMessages->MdcaCount();
+    UpdateMskL();
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::UpdateSimMessagesArrayL");
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::ListBox
+// ----------------------------------------------------
+CEikColumnListBox* CSmsSimDialog::ListBox() const
+{
+return((CEikColumnListBox*)Control(EMsgControlIdSimMessageListBox));
+}
+
+// ----------------------------------------------------
+// CSmsSimDialog::EnumerateSimMessagesL
+// ----------------------------------------------------
+void CSmsSimDialog::EnumerateSimMessagesL()
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::EnumerateSimMessagesL");
+    delete iWaitDialog;
+    iWaitDialog = NULL;
+    iWaitDialog = new (ELeave) CAknWaitDialog(
+            (REINTERPRET_CAST(CEikDialog**, &iWaitDialog)),
+            ETrue
+    );
+    CleanupStack::PushL(TCleanupItem(CleanupWaitDialog, 
+            (TAny**)&iWaitDialog));
+    iWaitDialog->SetCallback( this );
+    iWaitDialog->ExecuteLD( R_DEFAULT_SIM_DIALOG_WAIT_NOTE );
+
+    // Find the service entry
+    CMsvEntry* serviceEntry = iSession.GetEntryL(KMsvRootIndexEntryId);
+    CleanupStack::PushL(serviceEntry);
+    TMsvId serviceId;
+    TSmsUtilities::ServiceIdL(*serviceEntry, serviceId, KUidMsgTypeSMS);
+
+    // Enumerate sim messages
+    CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection();
+    CleanupStack::PushL(selection);
+    selection->AppendL(serviceId);
+
+    CMsvSingleOpWatcher* singleOpWatcher=CMsvSingleOpWatcher::NewL( *this );
+    CleanupStack::PushL(singleOpWatcher);
+    TBuf8<1> foo (KNullDesC8);
+    CAknInputBlock::NewLC();  // no need to store the pointer returned, It's on the Cleanup Stack
+    CMsvOperation* operation = iSmsMtmUi.BaseMtm().InvokeAsyncFunctionL(
+            ESmsMtmCommandEnumeratePhoneStores,
+            *selection, 
+            foo, 
+            singleOpWatcher->iStatus);
+    singleOpWatcher->SetOperation( operation );
+    iEnumerationOperation = singleOpWatcher;
+    CleanupStack::PopAndDestroy(); // CAknInputBlock
+    CleanupStack::Pop( singleOpWatcher );
+    CleanupStack::PopAndDestroy( 2, serviceEntry ); // serviceEntry, selection
+    CleanupStack::Pop(); // TCleanupItem - everything ok so don't delete iWaitDialog
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::EnumerateSimMessagesL");
+    }
+
+
+// ----------------------------------------------------
+// CSmsSimDialog::StoreTitleTextAndSetNewL
+// ----------------------------------------------------
+void CSmsSimDialog::StoreTitleTextAndSetNewL()
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::StoreTitleTextAndSetNewL");
+    CEikStatusPane* sp = ((CAknAppUi*)CEikonEnv::Static()->EikAppUi())
+    ->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_SMS_DEFAULT_SIM_DIALOG_TITLE_TEXT, 
+            iCoeEnv );
+    title->SetTextL( *newTitle );
+    CleanupStack::PopAndDestroy( newTitle );
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::StoreTitleTextAndSetNewL");
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::RestoreTitleTextL
+// ----------------------------------------------------
+void CSmsSimDialog::RestoreTitleTextL()
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::RestoreTitleTextL");
+    CEikStatusPane* sp = ((CAknAppUi*)CEikonEnv::Static()->EikAppUi())
+    ->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;
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::RestoreTitleTextL");
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::OpCompleted
+// ----------------------------------------------------
+void CSmsSimDialog::OpCompleted(
+        CMsvSingleOpWatcher& aOpWatcher,
+        TInt aCompletionCode )
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::OpCompleted");
+    TBool tryToExit = EFalse;
+    CMsvOperation* op=&aOpWatcher.Operation();
+    TRAP_IGNORE( tryToExit = DoOperationCompletedL(op, aCompletionCode ) );  
+    if ( tryToExit )
+        {
+        return;
+        }
+
+    if ( iEnumerationOperation->Operation().Id()==op->Id() )
+        {
+#ifdef _DEBUG
+        RDebug::Print(_L("CSmsSimDialog::OpCompleted, completed enumerate operation") );
+#endif
+        delete iEnumerationOperation;
+        iEnumerationOperation = NULL;
+        }
+    else if ( iCopyOrDeleteOperation->Operation().Id()==op->Id() )
+        {
+#ifdef _DEBUG
+        RDebug::Print(_L("CSmsSimDialog::OpCompleted, completed copy/delete operation") );
+#endif
+        delete iCopyOrDeleteOperation;
+        iCopyOrDeleteOperation = NULL;
+        delete iProgressDialog;
+        iProgressDialog = NULL;
+        }
+
+    if ( !iEnumerationOperation && !iCopyOrDeleteOperation )
+        {
+        delete iWaitDialog;
+        iWaitDialog = NULL;
+        delete iProgressDialog;
+        iProgressDialog = NULL;
+        }
+    ListBox()->DrawDeferred();
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::OpCompleted");
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::DoOperationCompletedL
+// ----------------------------------------------------
+TBool CSmsSimDialog::DoOperationCompletedL(
+        CMsvOperation* aOperation, 
+        TInt /*aCompletionCode*/ )
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::DoOperationCompletedL");
+    if ( !aOperation )
+        {
+        SMUMLOGGER_LEAVEFN(" CSmsSimDialog::DoOperationCompletedL - FALSE -0");
+        return EFalse;
+        }
+
+    TSmsProgressBuf progressBuf;
+    progressBuf.Copy(aOperation->ProgressL());
+    TSmsProgress progress = progressBuf();
+    iSmsMtmUi.DisplayProgressSummary(progressBuf);
+    if ( iEnumerationOperation )
+        {
+#ifdef _DEBUG
+        RDebug::Print(_L("CSmsSimDialog::DoOperationCompletedL, enumeration completed %d"), progress.iError );
+#endif
+        if ( !progress.iError)
+            {
+            iSimFolderId = progress.iEnumerateFolder;
+            UpdateSimMessagesArrayL();
+            }
+        else
+            {
+            delete iWaitDialog;
+            iWaitDialog = NULL;
+            TryExitL( EAknSoftkeyBack );
+            SMUMLOGGER_LEAVEFN(" CSmsSimDialog::DoOperationCompletedL - TRUE");
+            return ETrue;
+            }
+        }
+
+    if ( iCopyOrDeleteOperation )
+        {
+#ifdef _DEBUG
+        RDebug::Print(_L("CSmsSimDialog::DoOperationCompletedL, delete/copy completed %d"), progress.iError );
+#endif
+        EnumerateSimMessagesL();
+        }
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::DoOperationCompletedL - FALSE");
+    return EFalse;
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::CleanupWaitDialog
+// ----------------------------------------------------
+void CSmsSimDialog::CleanupWaitDialog(TAny* aAny)
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::CleanupWaitDialog");
+    CEikDialog** dialog = (CEikDialog**) aAny;
+    if (dialog && *dialog)
+        {
+        delete *dialog;
+        *dialog = NULL;
+        }
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::CleanupWaitDialog");
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::DialogDismissedL
+// ----------------------------------------------------
+void CSmsSimDialog::DialogDismissedL( TInt /*aButtonId*/ )
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::DialogDismissedL");
+    if ( iEnumerationOperation )
+        {
+#ifdef _DEBUG
+        RDebug::Print(_L("CSmsSimDialog::DialogDismissedL, cancelling enumerate operation") );
+#endif
+        iDialogDismissed = ETrue;
+        }
+    else if ( iCopyOrDeleteOperation )
+        {
+#ifdef _DEBUG
+        RDebug::Print(_L("CSmsSimDialog::DialogDismissedL, cancelling copy or delete operation") );
+#endif
+        CSimDeleteCopyOperation* oper = STATIC_CAST(CSimDeleteCopyOperation*, &iCopyOrDeleteOperation->Operation());
+        oper->CancelAfterCurrentCompleted();
+        }
+#ifdef _DEBUG
+    RDebug::Print(_L("CSmsSimDialog::DialogDismissedL, finish") );
+#endif
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::DialogDismissedL");
+    }
+
+// ----------------------------------------------------
+// CSmumMainSettingsDialog::LaunchHelpL
+// launch help using context
+// 
+// ----------------------------------------------------
+void CSmsSimDialog::LaunchHelpL()
+    {   
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::LaunchHelpL");
+    if ( iHelpFeatureSupported )
+        {
+        CCoeAppUi* editorAppUi = STATIC_CAST(CCoeAppUi*, ControlEnv()->AppUi());     
+        CArrayFix<TCoeHelpContext>* helpContext = editorAppUi->AppHelpContextL();   
+        HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), helpContext );
+        }
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::LaunchHelpL");
+    }
+
+
+// ----------------------------------------------------
+// CSmumMainSettingsDialog::GetHelpContext
+// returns helpcontext as aContext
+// 
+// ----------------------------------------------------
+void CSmsSimDialog::GetHelpContext
+(TCoeHelpContext& aContext) const
+{  
+const TUid KUidMce ={0x100058C5};      
+aContext.iMajor = KUidMce;
+aContext.iContext = KMCE_HLP_SIM;         
+}
+
+// ----------------------------------------------------
+// CSmsSimDialog::LaunchNoteAndOperationL
+// ----------------------------------------------------
+void CSmsSimDialog::LaunchNoteAndOperationL( TMsvId aDestinationId )
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::LaunchNoteAndOperationL");
+    // store msg count before operation
+    iMsgCountBeforeOperation = iMessages->MdcaCount();
+
+    delete iProgressDialog;
+    iProgressDialog = NULL;
+    iProgressDialog = new (ELeave) CAknProgressDialog(
+            (REINTERPRET_CAST(CEikDialog**, &iProgressDialog)),
+            ETrue
+    );
+    CleanupStack::PushL(TCleanupItem(CleanupWaitDialog, 
+            (TAny**)&iProgressDialog));
+    iProgressDialog->SetCallback( this );
+    CEikImage* icon = NULL;
+    icon = new (ELeave) CEikImage;
+    CleanupStack::PushL(icon);   
+    TFileName fileName = AknIconUtils::AvkonIconFileName();  //avkon.mbm file name and path
+
+    //select which icon to show   
+    const TInt bitmapIndex = aDestinationId ? 
+        EMbmAvkonQgn_note_copy : EMbmAvkonQgn_note_erased;
+    const TInt maskIndex = aDestinationId ? 
+        EMbmAvkonQgn_note_copy_mask : EMbmAvkonQgn_note_erased_mask;
+
+    const TAknsItemID id = aDestinationId ? 
+        KAknsIIDQgnNoteCopy : KAknsIIDQgnNoteErased;
+
+    CFbsBitmap* targetBitmap;
+    CFbsBitmap* targetBitmapMask;
+    AknsUtils::CreateIconL( AknsUtils::SkinInstance(), id , targetBitmap,
+            targetBitmapMask, fileName, bitmapIndex, maskIndex );
+
+    //set icon
+    icon->SetPicture(targetBitmap, targetBitmapMask);
+    iProgressDialog->SetImageL(icon);
+    CleanupStack::Pop(); // icon   
+    iProgressDialog->ExecuteLD( R_DEFAULT_SIM_DIALOG_PROGRESS_NOTE );
+
+    CMsvEntrySelection* selection = CreateSelectionArrayLC();
+    CAknInputBlock::NewLC(); // no need to store the pointer returned, It's on the Cleanup Stack
+    CMsvSingleOpWatcher* singleOpWatcher=CMsvSingleOpWatcher::NewL( *this );
+    CleanupStack::PushL(singleOpWatcher);
+
+    CMsvOperation* operation = NULL;
+    if ( aDestinationId )
+        { // copy operation 
+        operation = CSimDeleteCopyOperation::NewL(
+                iSession, 
+                iSmsMtmUi, 
+                singleOpWatcher->iStatus, 
+                selection,
+                aDestinationId, 
+                *iProgressDialog, 
+                iCoeEnv );
+        }
+    else
+        { // delete operation
+        operation = CSimDeleteCopyOperation::NewL(
+                iSession, 
+                iSmsMtmUi, 
+                singleOpWatcher->iStatus, 
+                selection,
+                *iProgressDialog, 
+                iCoeEnv );
+        }
+
+    singleOpWatcher->SetOperation( operation );
+    iCopyOrDeleteOperation = singleOpWatcher;
+    CleanupStack::Pop( singleOpWatcher );
+    CleanupStack::PopAndDestroy( 2, selection ); // CAknInputBlock
+    CleanupStack::Pop( ); // CleanupWaitDialog
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::LaunchNoteAndOperationL");
+    }
+
+// ----------------------------------------------------
+// CSmsSimDialog::UpdateMskL
+// ----------------------------------------------------    
+void CSmsSimDialog::UpdateMskL()
+    {
+    SMUMLOGGER_ENTERFN(" CSmsSimDialog::UpdateMskL");
+    TInt resId = 0;
+    const TInt KMskPosition = 3;
+
+    if( ListBox()->Model()->NumberOfItems() == 0 ) 
+        {//show empty button
+        resId = R_DEFAULT_SIM_MSK_BUTTON_EMPTY;
+        }
+    else
+        {
+        resId = R_DEFAULT_SIM_MSK_BUTTON_CONTEXTMENU;
+        }
+
+    CEikButtonGroupContainer &cba = ButtonGroupContainer();
+    cba.SetCommandL( KMskPosition, resId );
+    cba.DrawDeferred();
+    SMUMLOGGER_LEAVEFN(" CSmsSimDialog::UpdateMskL");
+    }
+//  End of File