--- /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