notepad/notepad1/LibSrc/NpdListDialog.cpp
changeset 0 f979ecb2b13e
child 14 21239b3bcd78
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/notepad/notepad1/LibSrc/NpdListDialog.cpp	Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,1681 @@
+/*
+* Copyright (c) 2002 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 List of Memos/Templates mode.
+*
+*/
+
+
+// INCLUDE FILES
+
+#include <bldvariant.hrh>
+#include <eikmenup.h>
+#include <eikclbd.h>
+#include <eikapp.h>
+#include <aknlists.h>
+#include <bacntf.h>
+#include <sendui.h>
+#include <Sendnorm.rsg>
+#include <txtglobl.h>
+#include <AknIconArray.h>
+#include <StringLoader.h>
+#include <AknDlgShut.h>
+#include <AknProgressDialog.h>
+#include <eikprogi.h>
+#include <eikimage.h>
+
+#include <AvkonIcons.hrh>
+#include <avkon.mbg>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <gulicon.h>
+#include <aknconsts.h>
+#include <hlplch.h>
+#include <featmgr.h>
+#include <StringLoader.h>
+#include <NpdLib.rsg>
+#include <AiwCommon.hrh>
+#include <AiwGenericParam.h>
+#include <CMessageData.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <vwsdefpartner.h>
+#endif
+#include "NpdLib.hrh"
+#include "NpdListDialog.h"
+#include "NpdEditorDialog.h"
+#include "NpdModel_platsec.h"
+#include "NpdLib.h"
+#include "NpdListBox.h"
+
+#include <csxhelp/nmake.hlp.hrh>
+#include <csxhelp/mce.hlp.hrh>
+
+// Next is for KNotepadPseudoKeyIdForNewNote
+//
+#include "NpdApi.h"
+#include "NpdLibPanic.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::NewL
+// Constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CNotepadListDialog* CNotepadListDialog::NewL(
+    TInt aResId,             // Resource Id of type NOTEPAD_LIST_DIALOG
+    CEikDialog** aSelfPtr )
+    {
+    CNotepadListDialog* self = new(ELeave) CNotepadListDialog();
+    self->iSelfPtr = aSelfPtr;
+    CleanupStack::PushL(self);
+    TResourceReader rr;
+    self->iCoeEnv->CreateResourceReaderLC(rr, aResId); // Push rr
+    self->ConstructL( rr );
+    CleanupStack::PopAndDestroy(); // rr
+    CleanupStack::Pop(); // self
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::~CNotepadListDialog
+// Destructor.
+//
+// In destructor of CNotepadEditorDialog, 
+// CNotepadListDialog::iEditorDialog (pointer to the object) will be
+// NULLed using CNotepadListDialog::EditorDeleted().
+// So it is guaranteed that iEditorDialog is NULL iff the object is alive.
+//
+// *1* It seems that 'delete iProgressDialog must precceed delete iModel
+// to avoid a crash when PowerOff while deleting or adding to pinboard.
+// Because the focus is changed in deleting iProgressDialog 
+// (caused by RemoveFromStack).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CNotepadListDialog::~CNotepadListDialog()
+    {
+    delete iIdle;
+    delete iProgressDialog; // *1*
+    delete iEditorDialog;
+    if ( iFlags & ENotepadObserveView )
+        {
+        iEikonEnv->EikAppUi()->RemoveViewObserver(this);
+        }
+    delete iModel;
+    delete iSendUi;
+    iSavedSelectedKeys.Close();
+    iSavedKeysAboveCurrent.Close();
+    delete iEnvironmentChangeNotifier;
+    if ( iServiceHandler )
+    	{
+    	    	
+		delete iServiceHandler;
+		iServiceHandler = NULL;
+    	}
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::EditByKeyL
+// Called from CNotepadAppUi.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CNotepadListDialog::EditByKeyL(const TInt aKey)
+    {
+    __ASSERT_DEBUG( IsNotepad(), 
+        Panic(ENotepadLibraryPanicOnlySupportedInNotepad) );
+    if ( iBaseAppUi == iEikonEnv->EikAppUi() // SendUi is not running
+        /*&& !iBaseAppUi->IsDisplayingDialog()*/  // Dialog is not running
+       	&& !iModel->IsDeleting() )
+        {
+        DoEditByKeyL(aKey);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::SaveL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CNotepadListDialog::SaveL()
+    {
+    if ( iEditorDialog )
+        {
+        iEditorDialog->SaveOnExitL(EFalse);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::HandleEditorExitL
+// This function is called from CNotepadEditorDialog.
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::HandleEditorExitL(
+    TInt aStatOfSave, 
+    const TInt aKey,
+    const TBool aEagerSync )
+    {
+    	iEditorFlag= EFalse;
+    if ( aKey != KNotepadPseudoKeyIdForNewNote )
+        {
+        iSavedKey = aKey;
+        }
+    if ( aStatOfSave == CNotepadModel::ENotepadModelRowAdded )
+        {
+        iFlags |= ENotepadItemAdded;
+        }
+    else 
+        {
+        iFlags &= ~ENotepadItemAdded;
+        }
+    if ( aEagerSync )
+        {
+        if(iClockValueChange)
+        	{
+        	iModel->SetItemArrayFlags();
+        	iClockValueChange = EFalse;
+        	}
+        iModel->SyncL(EFalse);
+        RestoreCurrentAndSelectionsL();
+        DrawNow();
+        }
+    if (aStatOfSave == CNotepadModel::ENotepadModelRowDeleted)
+    	{
+    	iListBox->HandleItemRemovalL();
+    	DrawNow();
+    	}
+        // MSK 
+        MiddleSoftKeyL();
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::EditorDeleted
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::EditorDeleted()
+    {
+    iEditorDialog = NULL;
+    iModel->SetNotepadModelObserver(this); 
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::ConstructL
+// private second-phase constructor
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::ConstructL( TResourceReader& aReader )
+    {
+    iNeedSave = EFalse;
+    iSavedKey = KNotepadInvalidKeyId;
+    iSendingEmail = EFalse;
+    CNotepadDialogBase::ConstructL( aReader ); // menubar, dialog
+    TInt modelResId(aReader.ReadInt32());        // LLINK model;
+    iModel = CNotepadModel::NewL(
+        iCoeEnv->FsSession(), modelResId );
+    iEditorResId = aReader.ReadInt32();         // LLINK editor_dialog
+    TPtrC ptr = aReader.ReadTPtrC();               // LTEXT title
+    if ( ptr.Length() )
+        {
+        SetTitleL(&ptr);
+        }
+
+    iSendUi = CSendUi::NewL();
+    if ( IsNotepad() )
+        {
+        TCallBack callback(HandleEnvironmentChangedL, this);
+        iEnvironmentChangeNotifier = CEnvironmentChangeNotifier::NewL(
+            EActivePriorityLogonA, callback);
+        iEnvironmentChangeNotifier->Start();
+        }
+    iEikonEnv->EikAppUi()->AddViewObserverL(this);
+    iFlags |= ENotepadObserveView;
+    iClockValueChange = EFalse;
+    iBaseAppUi = iAvkonAppUi;
+    iModel->SetNotepadModelObserver(this);
+    iBaseLevelOfActiveScheduler = LevelOfActiveScheduler() + 1;
+    // Create instance of CAiwServiceHandler
+	iServiceHandler = CAiwServiceHandler::NewL();
+	// Attach menu services
+	iServiceHandler->AttachMenuL( R_NOTEPAD_LIST_MENU_SECOND, R_NOTEPAD_APP_INTEREST );
+    if ( FeatureManager::FeatureSupported( KFeatureIdFfEnablePrintingFramework ) )
+        {
+        iServiceHandler->AttachMenuL( R_NOTEPAD_LIST_MENU_FIRST, R_PS_AIW_INTEREST );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::StartEditorL
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::StartEditorL()
+    {
+    iEditorFlag=ETrue;
+    HideMenu();
+    __ASSERT_DEBUG(iEditorResId, User::Invariant());
+    
+    iEditorDialog = CNotepadEditorDialog::NewL(iEditorResId, iModel, this,
+            iSendUi);
+
+    iEditorDialog->ExecuteLD();
+    iListBox->ClearSelection();
+    ClearSavedCurrentAndSelections();
+    SaveCurrentAndSelectionsL();
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::OnCmdAddL
+// -----------------------------------------------------------------------------
+//
+	void CNotepadListDialog::OnCmdAddL()
+    {
+    StartEditorL();
+    iEditorDialog->SwitchTextL(KNotepadPseudoKeyIdForNewNote);
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::OnCmdOpenL
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::OnCmdOpenL(TInt aIndex)
+    {
+    if ( iModel->MdcaCount() == 0 )
+        {
+    	  return;
+        }
+    StartEditorL();
+    iEditorDialog->SwitchTextL(iModel->Key(aIndex));
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::ConfirmDeleteL
+// -----------------------------------------------------------------------------
+//
+TBool CNotepadListDialog::ConfirmDeleteL(TInt aMemos)
+    {
+    TBool isConfirmed(ETrue);
+    if ( aMemos >= 2 )
+        {
+        HBufC* prompt = StringLoader::LoadLC(
+            QueryDeleteMultipleResId(), aMemos, iCoeEnv);
+        isConfirmed = ExecuteConfirmationQueryL(prompt);
+        CleanupStack::PopAndDestroy(); // prompt
+        }
+    else 
+        {
+        isConfirmed = ExecuteConfirmationQueryL(QueryDeleteSingleResId());
+        }
+    return isConfirmed;
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::CreateKeyArrayOfSelectionsL
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::CreateKeyArrayOfSelectionsL()
+    {
+    const CListBoxView::CSelectionIndexArray* selections = 
+        iListBox->SelectionIndexes();
+    const TInt markCount( selections->Count() );
+    iSavedSelectedKeys.Reset();
+    for (TInt i(0); i < markCount; i++)
+        {
+        User::LeaveIfError(
+            iSavedSelectedKeys.Append(iModel->Key((*selections)[i])) );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::OnCmdDeleteL
+//
+//                  IsNotepad    IsTemplates
+// markCount >= 2     **A**(1)      **A**(2)
+// markCount == 1     **C**         **A**(3)
+// markCOunt == 0     **C**         **B**(3)
+//
+// According to UI specs (Notepad and Message Centre),
+// in the case of the block **C**, no progress note is needed but 
+// we must show a progress note if markCount>=2 or IsTempates
+// (block **A** or **B**).
+//
+// And there are 3 different labels defined;
+//   (1) "Deleting" 
+//   (2) "Deleting template %0N of %1N"
+//   (3) "Deleting template"
+// Block **B** also create the progress note, but it is different from **A**
+// in the point that it must create a KeyArray by itself.
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::OnCmdDeleteL()
+    {
+    if ( iModel->MdcaCount() == 0 ) // this is posible when clear key
+        {
+        return;
+        }
+    ClearSavedCurrentAndSelections();
+    SaveCurrentAndSelectionsL();
+    TInt markCount( iListBox->SelectionIndexes()->Count() );
+    TInt deleteCount( markCount > 0 ? markCount : 1 ); 
+    if ( ConfirmDeleteL( deleteCount ) )
+        {
+        //be sure that the marks or the items might have gone while confirming
+        //
+        if ( markCount > 0 ? 
+            ( deleteCount = iListBox->SelectionIndexes()->Count() ) > 0 :
+            iModel->MdcaCount() > 0 )
+            {
+            // assert "deleteCount >= 1"
+            if ( deleteCount >= 2 || ( IsTemplates() && markCount ) )
+                { //**A**
+                // Both Notepad and MCE specs require ProgressDialog
+                // in deleting multiple items.
+                // Only MCE shows ProgressDialog even in deleting one item.
+                //
+                CreateProgressDialogL(deleteCount,
+                    deleteCount == 1 ? // when just one template is marked
+                    R_NOTEPAD_MCE_WAIT_NOTE_DELETE_TEMPLATE :
+                    ( IsTemplates() ? // when two or more templates are marked
+                        R_NOTEPAD_MCE_WAIT_NOTE_DELETE_TEMPLATES :
+                        0 )); // default label for Notepad
+                iModel->DeleteByKeysL(iSavedSelectedKeys); // start CIdle
+                }
+            else if ( IsTemplates() ) // MCE, delete a focused item
+                { //**B**
+                // MCE spec requires ProgressDialog even in deleting one item
+                //
+                RArray<TInt> keys(1);
+                CleanupClosePushL(keys);
+                User::LeaveIfError(keys.Append(iSavedKey));
+                CreateProgressDialogL( deleteCount, 
+                    R_NOTEPAD_MCE_WAIT_NOTE_DELETE_TEMPLATE );
+                iModel->DeleteByKeysL(keys); // start CIdle
+                CleanupStack::PopAndDestroy();// keys
+                }
+            else 
+                { //**C**
+                // Notepad spec doesn't require ProgressDialog 
+                // in deleting a single item
+                //
+                iModel->DeleteL( markCount == 0 ? iSavedKey : 
+                    iSavedSelectedKeys[0] );
+                }
+            }
+        }
+        iModel->SyncL(EFalse); // sync might be delayed while confirming
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::OnCmdSendL
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::OnCmdSendL(TInt aCommandId)
+    {
+    if ( iModel->MdcaCount() == 0 )
+        {
+    	  return;
+        }    
+    if ( iListBox->SelectionIndexes()->Count() > 0 )
+        {
+        ClearSavedCurrentAndSelections();
+        SaveCurrentAndSelectionsL();
+        TUid serviceUid = SendByKeysL(*iSendUi, aCommandId, *iModel, iSavedSelectedKeys);
+        iModel->SyncL(EFalse); // sync might be delayed while SendAsL.
+        RestoreCurrentAndSelectionsL();
+        //RestoreCurrent();
+        TUid EmailUid = {0x10001028};
+        if ( serviceUid == EmailUid )
+        	{
+        	iSendingEmail = ETrue;
+        	}
+       
+        }
+    else
+        {
+        HBufC* text = iModel->ContentL(iListBox->CurrentItemIndex());
+        CleanupStack::PushL(text);
+        iSavedKey = iModel->Key(iListBox->CurrentItemIndex());
+        SendAsL( *iSendUi, aCommandId, EFalse, text );
+        CleanupStack::PopAndDestroy(); // text
+        iModel->SyncL(EFalse); // sync might be delayed while SendAsL.
+        RestoreCurrentAndSelectionsL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::CreateProgressDialogL
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::CreateProgressDialogL(
+    const TInt aCount,
+    const TInt aLabelResId )
+    {
+    __ASSERT_DEBUG( aCount >= 1, 
+        Panic(ENotepadLibraryPanicInvalidFinalValueOfProgressNote) );
+    delete iProgressDialog;
+    iProgressDialog = NULL;
+    iProgressDialog = new(ELeave) CNotepadProgressDialog(
+        REINTERPRET_CAST( CEikDialog**, &iProgressDialog ), EFalse);
+      		
+    iProgressDialog->SetMopParent(this);
+        
+    iProgressDialog->PrepareLC(R_NOTEPAD_DELETE_PROGRESS_NOTE);    
+        
+    iProgressDialog->PrepareL(aCount, aLabelResId);
+    iProgressDialog->ProgressInfo()->SetFinalValue( 
+        aLabelResId == 0 ? 
+            aCount * 2 // In Notepad deleting a item is done by 2 steps
+            : aCount );
+     iProgressDialog->SetCallback(this);   
+    iProgressDialog->RunLD();
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::DoEditByKeyL
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::DoEditByKeyL(const TInt aKey)
+    {
+    iModel->SyncL(EFalse);
+    if ( iEditorDialog )
+        {
+        iEditorDialog->EditByKeyL(aKey, *iBaseAppUi);
+        }
+	else if ( aKey != KNotepadPseudoKeyIdForNewNote 
+				&& iModel->SeekKey(aKey) == 0 )
+		{
+		// Open the memo with the given key (aKey)
+		OnCmdOpenL( iModel->IndexOf(aKey) );
+		}
+    else
+        {
+        // Launch empty editor (pinned number -1 means "Write a Note")
+       	OnCmdAddL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::HandleEnvironmentChangedL
+// private static function.
+// -----------------------------------------------------------------------------
+//
+TInt CNotepadListDialog::HandleEnvironmentChangedL( TAny* aThisPtr )
+    {
+    return STATIC_CAST(CNotepadListDialog*, 
+        aThisPtr)->DoHandleEnvironmentChangedL();
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::DoHandleEnvironmentChangedL
+//
+// Just after first time iCrossoverNotifier->Start() is called,
+// HandleDateChanged seems to be called.
+// To avoid calling ForceListSync at the first callback,
+// we use a flag ENotepadEverEnvironmentChanged.
+// When this function is called at first, the flag is off and so
+// ForceListSync is blocked by condition 
+//   ( iFlags & ENotepadEverEnvironmentChanged )
+// and then the flag is set to be on.
+//
+// Even if this function may LEAVE, the notification will not be 
+// cancelled (ie. the callback is made on further EnvironmentChange. 
+// -----------------------------------------------------------------------------
+//
+TInt CNotepadListDialog::DoHandleEnvironmentChangedL()
+    {
+    iClockValueChange = ((iEnvironmentChangeNotifier->Change() 
+            & ( EChangesMidnightCrossover | EChangesLocale | EChangesSystemTime )) != 0);
+            
+    if ( ( iFlags & ENotepadEverEnvironmentChanged ) && iClockValueChange)
+        {
+        iModel->HandleDateChangedL((iFlags & ENotepadIsBackground));
+        }
+    iFlags |= ENotepadEverEnvironmentChanged;
+    
+    return TRUE; // callback should be called again.
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::SaveCurrentAndSelectionsL
+// does nothing if already saved.
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::SaveCurrentAndSelectionsL()
+    {
+    if ( iSavedKey != KNotepadInvalidKeyId ) // ie. already saved
+        {
+        return;
+        }
+    if ( iModel->MdcaCount() == 0 ) // empty
+        {
+        ClearSavedCurrentAndSelections();
+        }
+    else
+        {
+        // save current
+        //
+        TInt currentIndex( iListBox->CurrentItemIndex() );
+        iSavedKey = iModel->Key(currentIndex);
+        iSavedKeysAboveCurrent.Reset();
+        for ( TInt i(0); i < currentIndex; i++ )
+            {
+            User::LeaveIfError(
+                iSavedKeysAboveCurrent.Append(iModel->Key(i)));
+            }
+        // save selections
+        //
+        CreateKeyArrayOfSelectionsL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::RestoreCurrentAndSelectionsL
+// 
+// The case **1** is posible, eg. in following case;
+//  1. Launch Notepad and suspend it by Application key in empty List mode,
+//  2. Save a certain file as a memo using NpdTest.app,
+//  3. Launch Pinboard and select "Write a note",
+//  then crash (if **1** were not done).
+//
+// Why this function TRAP RestoreSelectionsL?
+//  1. We must do SetDisableRedraw(EFalse) even if LEAVE,
+//  2. We must do ClearSavedCurrentAndSelections even if LEAVE.
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::RestoreCurrentAndSelectionsL()
+    {
+    const TBool isEmpty( iModel->MdcaCount() == 0 );
+    if ( !isEmpty && iListBox->CurrentItemIndex() < 0 ) // **1**
+        {
+        iListBox->SetCurrentItemIndex(0);
+        }
+    if ( iSavedKey != KNotepadInvalidKeyId ) // ie. has saved
+        {
+        TInt err(KErrNone);
+        if ( !isEmpty ) // not empty
+            {
+            TBool redrawDisabledByThisFunction(EFalse);
+            if ( !iListBox->View()->RedrawDisabled() )
+                {
+                iListBox->View()->SetDisableRedraw(ETrue);
+                redrawDisabledByThisFunction = ETrue;
+                }
+            RestoreCurrent();
+            AdjustTopItemIfNeed();
+
+            TRAP(err, RestoreSelectionsL();); // LEAVE should be postponed
+            if ( redrawDisabledByThisFunction )
+                {
+                iListBox->View()->SetDisableRedraw(EFalse);
+                }
+            }
+        ClearSavedCurrentAndSelections();
+        if (iNeedSave)
+			{
+			SaveCurrentAndSelectionsL();
+			iNeedSave = EFalse;
+			}
+        User::LeaveIfError(err);
+  /*      iListBox->ScrollBarFrame()->MoveVertThumbTo(
+            iListBox->CurrentItemIndex());*/
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::RestoreCurrent
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::RestoreCurrent()
+    {
+    __ASSERT_DEBUG( iModel->MdcaCount() > 0, 
+        Panic(ENotepadLibraryPanicNoItem) );
+    TInt resultIndex( iModel->IndexOf( iSavedKey ) );
+    if ( resultIndex == KNotepadModelInvalidIndex ) // not found
+        {
+        const TInt savedIndex( iSavedKeysAboveCurrent.Count() );
+        if ( savedIndex == 0 )
+            {
+            resultIndex = 0;
+            }
+        else
+            {
+            for ( TInt i(savedIndex - 1); i >= 0; --i )
+                {
+                TInt index( iModel->IndexOf(iSavedKeysAboveCurrent[i]) );
+                if ( index == KNotepadModelInvalidIndex || 
+                    index >= savedIndex )
+                    {
+                    //the key no longer exists above current
+                    iSavedKeysAboveCurrent.Remove(i);
+                    }
+                }
+            resultIndex = iSavedKeysAboveCurrent.Count();
+            if ( resultIndex >= iModel->MdcaCount() )
+                {
+                resultIndex = iModel->MdcaCount() - 1; // assert "count>0"
+                }
+            }
+        }
+    iListBox->View()->CalcBottomItemIndex(); // to avoid crash in next line
+    iListBox->SetCurrentItemIndex( resultIndex );
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::RestoreSelectionsL
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::RestoreSelectionsL()
+    {
+    iListBox->ClearSelection();
+    for ( TInt i(0); i < iSavedSelectedKeys.Count() ; i++ )
+        {
+        TInt selectedIndex( iModel->IndexOf(iSavedSelectedKeys[i]) );
+        if ( selectedIndex != KNotepadModelInvalidIndex ) // found
+            {
+            iListBox->View()->SelectItemL(selectedIndex);
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::ClearSavedCurrentAndSelections
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::ClearSavedCurrentAndSelections()
+    {
+    iSavedKey = KNotepadPseudoKeyIdForNewNote;
+    iSavedKeysAboveCurrent.Reset();
+    iSavedKeysAboveCurrent.Compress();
+    iSavedSelectedKeys.Reset();
+    iSavedSelectedKeys.Compress();
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::AdjustTopItemIfNeed
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::AdjustTopItemIfNeed()
+    {
+    __ASSERT_DEBUG( iModel->MdcaCount() > 0, 
+        Panic(ENotepadLibraryPanicNoItem) );
+    if ( iFlags & ENotepadItemAdded )
+        {
+        iFlags &= ~ENotepadItemAdded;
+        const TInt count( iModel->MdcaCount() );
+        const TInt index( iListBox->CurrentItemIndex() );
+        const TInt lines( iListBox->View()->NumberOfItemsThatFitInRect(
+            iListBox->View()->ViewRect() ) );
+        iListBox->View()->SetTopItemIndex( 
+            (count - lines) >= index ? index :
+                ( count > lines ? count - lines : 0 ) );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::AvoidSyncing
+// -----------------------------------------------------------------------------
+//
+TBool CNotepadListDialog::AvoidSyncing() const
+    {
+        return (((iEditorDialog != NULL) && iEditorDialog->IsFocused()) || iModel->IsDeleting()
+        || (LevelOfActiveScheduler() != iBaseLevelOfActiveScheduler)
+        || ((iFlags & ENotepadIsBackground) && !iClockValueChange)
+        || (iBaseAppUi != iEikonEnv->EikAppUi()));
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::DoHandleViewEventL
+//
+// When launching Notepad application, 
+// the event TVwsViewEvent::EVwsActivateView occurs
+// but we have nothing to do at that time 
+// (because all operations are for resuming).
+// In order to avoid doing such needless operations,
+// we use the flag ENotepadEverViewDeactivated which denotes
+// whether the view has deactivated.
+// This flag is set first time TVwsViewEvent::EVwsDeactivateView,
+// and will never be cleared in this object's lifetime.
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::DoHandleViewEventL(const TVwsViewEvent& aEvent)
+    {
+    TLocale local;
+    switch ( aEvent.iEventType )
+        {
+        case TVwsViewEvent::EVwsActivateView:
+            iFlags &= ~ENotepadIsBackground;
+            if ( iFlags & ENotepadEverViewDeactivated )
+                {
+                iCurrentTimeFormat = local.TimeFormat();
+                if ( !AvoidSyncing()||( iCurrentTimeFormat != iPreTimeFormat )||(iModel->ItemArrayFlags())& CNotepadModel::ENotepadRequireDbViewUpdate )
+                    {
+                    iModel->SetItemArrayFlags();
+                    iModel->SyncL(EFalse);
+                    iNeedSave = ETrue;
+                    if (iEditorFlag)
+                    {
+                    RestoreCurrentAndSelectionsL();
+                    }                    
+                    if( iCurrentTimeFormat!= iPreTimeFormat )
+                    	{
+                    	break;
+                    	}
+                    iListBox->DrawNow();
+                    }
+                }
+            break;
+        case TVwsViewEvent::EVwsDeactivateView:
+            iPreTimeFormat = local.TimeFormat();
+            iFlags |= ENotepadIsBackground;
+            iFlags |= ENotepadEverViewDeactivated;
+           		if ( !iEditorDialog 
+                && LevelOfActiveScheduler() == iBaseLevelOfActiveScheduler
+                && iBaseAppUi == iEikonEnv->EikAppUi() //SendUi isn't running
+                && !iModel->IsDeleting() )
+                {
+                ClearSavedCurrentAndSelections();
+                if ( !iSendingEmail )
+                	{
+					SaveCurrentAndSelectionsL();
+                	}
+				iSendingEmail = EFalse;
+                }
+            break;
+        default:
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::HandleNotepadModelEventL
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::HandleNotepadModelEventL(
+    TEvent aEvent, 
+    TInt aParam )
+    {
+    switch ( aEvent )
+        {
+        case EDatabaseChanged:
+            if ( !AvoidSyncing() )
+                {
+                if(iClockValueChange)
+                	{
+                	iModel->SetItemArrayFlags();
+                	iClockValueChange = EFalse;
+                	}
+                iModel->SyncL(EFalse);
+                }
+            break;
+        case EAbortDeletion:
+            // no need for DialogDismissedL, so no need for ProcessFinishedL
+            delete iProgressDialog;
+            iProgressDialog = NULL;
+            break;
+        case ECompleteDeletion:
+            if ( iProgressDialog )
+                {
+                iProgressDialog->ProcessFinishedL();
+                }
+            break;
+        case EProgressDeletion:
+            if ( iProgressDialog && aParam > 0 )
+                {
+                iProgressDialog->IncrementL(aParam);
+                }
+            break;
+        case EStartItemArrayChange:
+            SaveCurrentAndSelectionsL();
+            break;
+        case EAbortItemArrayChange:
+            iListBox->View()->SetDisableRedraw(EFalse);
+            iListBox->Reset();
+            iListBox->DrawDeferred();
+            //MSK  			
+			MiddleSoftKeyL();
+            break;
+        case EProgressItemArrayChange:
+            // skip RestoreCurrentAndSelectionsL
+            iListBox->View()->SetDisableRedraw(EFalse);
+            iListBox->DrawDeferred();
+            break;
+        case ECompleteItemArrayChange:
+            iListBox->HandleItemRemovalL();
+            iNeedSave = ETrue;
+            RestoreCurrentAndSelectionsL();
+            iListBox->View()->SetDisableRedraw(EFalse);
+            iListBox->DrawNow();
+			//MSK  			
+			MiddleSoftKeyL();
+            break;
+        default:
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::DynInitMenuPaneL
+// from MEikMenuObserver
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::DynInitMenuPaneL(
+    TInt aResourceId,
+    CEikMenuPane* aMenuPane )
+    {
+    __ASSERT_DEBUG( aResourceId > 0, 
+        Panic(ENotepadLibraryPanicNoMenuResource) );
+    __ASSERT_DEBUG( aMenuPane, Panic(ENotepadLibraryPanicNullMenuPane) );
+    __ASSERT_DEBUG( iListBox, Panic(ENotepadLibraryPanicNullListControl) );
+    __ASSERT_DEBUG( iModel, Panic(ENotepadLibraryPanicNoModel) );
+	if ( iServiceHandler->HandleSubmenuL( *aMenuPane ) )
+		{
+		return;
+		}
+    iModel->SyncL(EFalse);
+    CNotepadDialogBase::DynInitMenuPaneL( aResourceId, aMenuPane );
+    const TInt memoCount( iModel->MdcaCount() );
+   	const TInt markCount( iListBox->SelectionIndexes()->Count() );
+    TInt index;
+    switch ( aResourceId )
+        {
+        case R_SENDUI_MENU:
+            index = 2;
+			iSendUi->AddSendMenuItemL(*aMenuPane, index, ENotepadCmdSend );
+            break;
+        case R_NOTEPAD_LIST_MENU_SECOND:
+            if( !(iFlags & ENotepadMenuByOkKey) || (memoCount && !markCount))
+            	{
+            	iServiceHandler->InitializeMenuPaneL( *aMenuPane, aResourceId, ECmdLast, iServiceHandler->InParamListL() );	
+            	}
+            	if ( iFlags & ENotepadMenuByOkKey )
+                {
+               	if ( !memoCount || markCount )
+               		{
+               		  aMenuPane->DeleteMenuItem(ECmdAiwPlaceholder);
+               		}
+                }
+            // go through into next case
+        case R_NOTEPAD_TEMPLATE_LIST_MENU_SECOND:
+        	{
+			if(!FeatureManager::FeatureSupported(KFeatureIdHelp))
+				{
+				aMenuPane->DeleteMenuItem(EAknCmdHelp);
+				}
+            if ( iFlags & ENotepadMenuByOkKey )
+                {
+               	if ( !memoCount || markCount )
+               		{
+               		if( markCount )
+               			aMenuPane->DeleteMenuItem(ENotepadCmdAdd);
+               		}
+				if(FeatureManager::FeatureSupported(KFeatureIdHelp))
+					{
+               	aMenuPane->DeleteMenuItem(EAknCmdHelp);
+					}
+               	aMenuPane->DeleteMenuItem(EAknCmdExit);
+                }
+        	}
+            break;
+        case R_NOTEPAD_LIST_MENU_FIRST:
+        case R_NOTEPAD_TEMPLATE_LIST_MENU_FIRST:
+            {
+            if ( IsNotepad() )
+                {
+                if ( FeatureManager::FeatureSupported( KFeatureIdFfEnablePrintingFramework ) )
+                    {
+                    // Initiliaze menu
+                    if ( memoCount )
+                        {
+                        iServiceHandler->InitializeMenuPaneL( *aMenuPane,
+                                                              aResourceId,
+                                                              ENotepadCmdPrint,
+                                                              iServiceHandler->InParamListL()
+                                                            );
+                        }
+                        else
+                        // If listbox is empty, delete Print AIW menu item.
+                        {
+                        aMenuPane->DeleteMenuItem( ENotepadCmdPrint );
+                        }
+                    } // KFeatureIdFfEnablePrintingFramework
+                else
+                    {
+                    aMenuPane->DeleteMenuItem( ENotepadCmdPrint );
+                    } 
+                }
+            TInt currIndex = iListBox->CurrentItemIndex();
+            TKeyArrayFix itemKey(0,ECmpTUint);
+            TInt ignore;
+            TInt itemMarked = iListBox->SelectionIndexes()->Find( currIndex, itemKey, ignore );
+            if ( memoCount > 0 && 
+                ( markCount == 0 || IsNotepad() ) )
+                {
+                // this must preceed DeleteMenuItem(ENotepadCmdOpen)
+                InsertSendMenuItemAfterL( *iSendUi, *aMenuPane, 
+                    ENotepadCmdOpen );
+                }
+            if ( memoCount == 0 )
+                {
+                aMenuPane->DeleteMenuItem(ENotepadCmdDelete);
+                }
+            if ( (memoCount == 0) ||  ( markCount >= 1  ) )
+                {
+                // this must after InsertSendMenuItemAfterL
+                aMenuPane->DeleteMenuItem(ENotepadCmdOpen);
+                }
+            }
+            break;
+        default:
+            AknSelectionService::HandleMarkableListDynInitMenuPane(
+                aResourceId, aMenuPane, iListBox);
+            break;
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::DynInitMenuBarL
+// from MEikMenuObserver
+// -----------------------------------------------------------------------------
+//    
+void CNotepadListDialog::DynInitMenuBarL(
+    TInt aResourceId,
+    CEikMenuBar* aMenuBar )
+    
+{
+	
+	__ASSERT_DEBUG( aResourceId > 0, 
+        Panic(ENotepadLibraryPanicNoMenuResource) );
+    __ASSERT_DEBUG( aMenuBar, Panic(ENotepadLibraryPanicNoMenuResource) );
+   
+    if (iMskFlag)
+    {
+    	
+    aMenuBar->SetMenuType(CEikMenuBar::EMenuContext);
+    iMskFlag= EFalse;
+    }
+    else
+    {
+    	aMenuBar->SetMenuType(CEikMenuBar::EMenuOptions);
+    }
+    
+	
+}
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::ProcessCommandL
+// from MEikCommandObserver
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::ProcessCommandL(TInt aCommandId)
+    {
+    HideMenu();
+    switch ( aCommandId )
+        {
+        case ENotepadCmdOpen: // Open memo
+            OnCmdOpenL(iListBox->CurrentItemIndex());
+            break;
+        case ENotepadCmdAdd:
+           OnCmdAddL();
+            break;
+        case ENotepadCmdDelete:
+            OnCmdDeleteL();
+            break;
+        case ENotepadCmdSend:
+        	OnCmdSendL(aCommandId);
+        	break;
+        default:
+            {
+            const TInt aiwServiceCmd( iServiceHandler ? iServiceHandler->ServiceCmdByMenuCmd( aCommandId ) : 0 );                
+            if ( aiwServiceCmd == KAiwCmdPrint )
+                {
+                CAiwGenericParamList& inParams = iServiceHandler->InParamListL();
+
+                // Note index
+                TAiwGenericParam noteParam( EGenericParamNoteItem );
+                const TInt32 noteKey = iModel->Key( iListBox->CurrentItemIndex() );
+                noteParam.Value().Set( noteKey );
+                inParams.AppendL( noteParam );
+
+                // Application uid
+                const TUid uid( KUidNotepad ); // Notepad Uid3
+                TAiwGenericParam uidParam( EGenericParamApplication );
+                uidParam.Value().Set( uid );
+                inParams.AppendL( uidParam );
+
+                // Execute service command with given parameters
+                iServiceHandler->ExecuteMenuCmdL( aCommandId,
+                                                  inParams,
+                                                  iServiceHandler->OutParamListL(),
+                                                  0,
+                                                  this
+                                                );
+                break;
+                }
+
+            AknSelectionService::HandleMarkableListProcessCommandL(
+                aCommandId, iListBox);
+            CNotepadDialogBase::ProcessCommandL(aCommandId);
+			TInt appid = EGenericParamContactItem;
+			CAiwGenericParamList* list = AiwSyncParamListLC( appid );
+			iServiceHandler->ExecuteMenuCmdL( aCommandId, *list, iServiceHandler->OutParamListL() );
+			CleanupStack::PopAndDestroy(list);
+			//MSK 			
+			MiddleSoftKeyL();
+            break;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::AiwSyncParamListLC
+// -----------------------------------------------------------------------------
+//
+CAiwGenericParamList* CNotepadListDialog::AiwSyncParamListLC(TInt /*aApplicationId*/)
+    {
+    TAiwVariant variant;
+    variant.Set(KNullDesC);
+    TAiwGenericParam param(EGenericParamNoteItem, variant);
+    CAiwGenericParamList* list = CAiwGenericParamList::NewLC();
+    list->AppendL(param);
+    return list;
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::HandleViewEventL
+// from MCoeViewObserver
+// It seems that observing a view is canceled once this function leave,
+// So we decide to avoid leaving in this function.
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::HandleViewEventL(const TVwsViewEvent& aEvent)
+    {
+    if ( aEvent.iViewOneId.iAppUid.iUid != aEvent.iViewTwoId.iAppUid.iUid )
+        {
+        TRAPD(err, DoHandleViewEventL(aEvent); );
+        if ( err != KErrNone )
+            {
+            iCoeEnv->HandleError(err);
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::DialogDismissedL
+// From MProgressDialogCallback.
+//
+// MProgressDialogCallback::DialogDismissedL is called from
+// CAknProgressDialog::OkToExitL.
+// This means that if DialogDismissedL LEAVEs, CAknProgressDialog fails to
+// exit.
+// We want to kill our ProgressDialog even though SyncL leaves,
+// so we decide to TRAP SyncL.
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::DialogDismissedL( TInt /*aButtonId*/ )
+    {
+    iModel->CancelDeletion();
+    DrawDeferred();
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::PreLayoutDynInitL
+// from CEikDialog
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::PreLayoutDynInitL()
+    {
+    iListBox = STATIC_CAST(CAknColumnListBox*, Control(ENotepadIdListBox));
+    __ASSERT_DEBUG( iListBox, Panic(ENotepadLibraryPanicNullListControl) );
+    iListBox->SetListBoxObserver(this);
+    if ( IsTemplates() )
+        {
+        HBufC* text = iCoeEnv->AllocReadResourceLC(R_NOTEPAD_MCE_EMPTY_LIST);
+        iListBox->View()->SetListEmptyTextL(*text);
+        CleanupStack::PopAndDestroy(); // text
+        }
+	else
+		{
+		HBufC* primaryText = iCoeEnv->AllocReadResourceLC(R_NOTEPAD_EMPTY_LIST_PRIMARY_TEXT);
+		HBufC* secondaryText; 
+		if(AknLayoutUtils::PenEnabled())
+	 	{	
+	 		secondaryText = iCoeEnv->AllocReadResourceLC(R_NOTEPAD_EMPTY_LIST_SECONDARY_TEXT);	 			 		
+	 	}
+	 	else
+	 	{
+	 		secondaryText = iCoeEnv->AllocReadResourceLC(R_NOTEPAD_EMPTY_LIST_SECONDARY_TEXT_NONTOUCH);	
+	 	}
+		HBufC* buf = HBufC::NewLC(KMaxFileName);
+        TPtr16 ptr = buf->Des();
+        ptr.Append(*primaryText);
+        ptr.Append(KNewLine);
+        ptr.Append(*secondaryText);
+
+        iListBox->View()->SetListEmptyTextL(ptr);
+        
+        CleanupStack::PopAndDestroy(buf); 
+        CleanupStack::PopAndDestroy(secondaryText); 
+        CleanupStack::PopAndDestroy(primaryText); 
+		}	
+    (iListBox->Model())->SetItemTextArray(iModel);
+    (iListBox->Model())->SetOwnershipType(ELbmDoesNotOwnItemArray);
+    CAknIconArray* iconArray = new(ELeave) CAknIconArray(1);
+    CleanupStack::PushL(iconArray);
+    CFbsBitmap* markBitmap = NULL;
+    CFbsBitmap* markBitmapMask = NULL;
+    
+    //CListItemDrawer is using this logical color as default for its marked icons
+    TRgb defaultColor;
+    defaultColor = CEikonEnv::Static()->Color(EColorControlText);
+
+    AknsUtils::CreateColorIconL(AknsUtils::SkinInstance(),
+    			KAknsIIDQgnIndiMarkedAdd,
+    			KAknsIIDQsnIconColors,
+    			EAknsCIQsnIconColorsCG13,
+    			markBitmap,
+    			markBitmapMask,
+    			KAvkonBitmapFile,
+    			EMbmAvkonQgn_indi_marked_add,
+    			EMbmAvkonQgn_indi_marked_add_mask,
+    			defaultColor
+    			);
+    
+    CGulIcon* markIcon = CGulIcon::NewL(markBitmap,markBitmapMask);
+    iconArray->AppendL(markIcon);			
+    if ( IsTemplates() )
+        {
+        iconArray->AppendFromResourceL(R_NOTEPAD_TEMPLATE_ICON_ARRAY);
+        }
+    CleanupStack::Pop(); // iconArray
+    iListBox->ItemDrawer()->ColumnData()->SetIconArray(iconArray);
+    iListBox->CreateScrollBarFrameL(ETrue);
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+        CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+    // MSK 
+     MiddleSoftKeyL();
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::PostLayoutDynInitL
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::PostLayoutDynInitL()
+    {
+    iListBox->UpdateScrollBarsL(); // indispensable
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::OkToExitL
+// -----------------------------------------------------------------------------
+//
+TBool CNotepadListDialog::OkToExitL( TInt aButtonId )
+    {
+    iFlags &= ~ENotepadMenuByOkKey;
+    TBool isOk(ETrue);
+    iMskFlag=EFalse;
+    //if txt file is more than 1M, editor will exit, so iEditorFlag should be set false.
+    if (iEditorDialog == NULL)
+		{
+		iEditorFlag = EFalse;
+		}
+    switch ( aButtonId )
+        {
+        case EAknSoftkeyContextOptions:
+	   		{
+	   		iMskFlag=ETrue;
+	   		if(shiftflag)
+	   			{
+	   			 shiftflag =EFalse;
+	   			 iListBox->View()->ToggleItemL(iListBox->View()->CurrentItemIndex());
+		   		 MiddleSoftKeyL();
+		   		 isOk= EFalse;
+		   		 break;
+	   			}
+	   		if(iModel->MdcaCount() == 0 || iListBox->SelectionIndexes()->Count())
+	   			{
+	   			iFlags |= ENotepadMenuByOkKey;
+	   			DisplayMenuL();
+	   			isOk= EFalse;
+	   			}
+	   		else
+	   		    {
+	   		     ProcessCommandL(ENotepadCmdOpen); 
+	   		     isOk= EFalse;
+	   		    }	
+	   		}
+	   		break;
+	   	case ENotepadCmdOpen:
+	   		if(shiftflag)
+	   			{
+	   			 shiftflag =EFalse;
+	   			 iListBox->View()->ToggleItemL(iListBox->View()->CurrentItemIndex());
+	   			 MiddleSoftKeyL();
+	   			 isOk= EFalse;
+	   		     break;
+	   			}
+	   		ProcessCommandL(ENotepadCmdOpen);
+	   		isOk= EFalse;
+	   		break;
+        case ENotepadCmdAdd:
+             
+             OnCmdAddL();
+             isOk= EFalse;
+             break; 
+        case EAknSoftkeyExit: // list of memos
+            iAvkonAppUi->ProcessCommandL(EAknCmdExit);
+            isOk = EFalse;
+            break;
+        case EAknSoftkeyBack: // list of templates
+            isOk = ETrue; 
+             break;
+        default:
+        	if ( !iEditorFlag )
+        		{
+                isOk = CNotepadDialogBase::OkToExitL( aButtonId );
+        		}
+        	else
+        		{
+        		isOk = EFalse;
+        		}
+            break;
+        }
+    return isOk;
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::HandleListBoxEventL
+// from MEikListBoxObserver
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::HandleListBoxEventL(
+    CEikListBox* aListBox, 
+    TListBoxEvent aEventType )
+    {
+    switch(aEventType)
+        {
+        case EEventEnterKeyPressed:
+            OnCmdOpenL(aListBox->CurrentItemIndex());
+            break;
+        case EEventItemSingleClicked:
+            if ( aListBox->Model()->NumberOfItems() != 0 
+                && aListBox->SelectionIndexes()->Count() == 0 )
+                {
+                HandleListBoxPointerEventL( CNotepadListDialog::EOpenListBoxItem );
+                }
+            else
+                {
+                HandleListBoxPointerEventL( CNotepadListDialog::EOpenListBoxContextMenu );
+                }
+            if(  IsTemplates() && AknLayoutUtils::PenEnabled() ) 
+                {
+                  if( !aListBox->SelectionIndexes()->Count()  )
+                    {
+                     OnCmdOpenL(aListBox->CurrentItemIndex());       
+                    }
+                  else
+                    { 
+                      iFlags |= ENotepadMenuByOkKey;
+                      iMskFlag=ETrue;
+                      DisplayMenuL();
+                    }  
+                }
+        default:
+            break;
+        }
+     MiddleSoftKeyL();   
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::GetHelpContext
+// from CCoeControl
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::GetHelpContext(TCoeHelpContext& aContext) const
+    {
+    switch ( iResId )
+        {
+        case R_NOTEPAD_LIST_DIALOG_ORG:
+            aContext.iMajor = KUidNotepad;
+            aContext.iContext = KNMAKE_HLP_MEMO_LIST;
+            break;
+        case R_NOTEPAD_TEMPLATE_LIST_DIALOG_ORG:
+            aContext.iMajor = KUidMce;
+            aContext.iContext = KMCE_HLP_TEMPLATES;
+            break;
+        default:
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::OfferKeyEventL
+// from CCoeControl
+//
+// Notepad specification says that 
+// in pushing numeric keys in list mode, Notepad will change into 
+// edit mode for a new memo and 
+// the numeric key code is insert in the opened editor.
+// The problem is that Multi-tap FEP requires 
+// KeyDown event to start FepInlineEdit. If Multi-tap FEP catch KeyIn event 
+// without any preceeding KeyDown event, it will crash.
+// So we decide to add simulated KeyDown event for multi-tap FEP.
+// This is done in CNotepadEditorDialog.
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CNotepadListDialog::OfferKeyEventL(
+    const TKeyEvent& aKeyEvent,
+    TEventCode aType )
+    {
+    TBool hashKey =  (aKeyEvent.iScanCode ==  EStdKeyHash ) ? ETrue : EFalse;
+    shiftflag =EFalse;
+    TKeyResponse keyResponse(EKeyWasConsumed);
+    if ( MenuShowing() || aType != EEventKey || 
+        ( aKeyEvent.iModifiers & EAllStdModifiers ) )
+        {
+        keyResponse = CAknDialog::OfferKeyEventL(aKeyEvent, aType);
+        if((aKeyEvent.iModifiers & EModifierShift) && (aType & EEventKeyDown))
+        	{
+        	 shiftflag = ETrue;
+           	 MiddleSoftKeyL();
+        	}
+        	 
+        if(aType == EEventKeyUp && hashKey)
+            {
+              MiddleSoftKeyL();
+            }
+         }
+    else if ( aKeyEvent.iCode  == EKeyBackspace )
+        {
+        // Clear key make deletion
+        //
+        OnCmdDeleteL();
+        }
+    else if ( (aKeyEvent.iCode  == EKeyOK || aKeyEvent.iCode == EKeyEnter) && 
+        (iModel->MdcaCount() == 0
+					|| iListBox->SelectionIndexes()->Count()))
+		{
+		iFlags |= ENotepadMenuByOkKey;
+		DisplayMenuL();
+        return keyResponse;
+        }
+    else if ( TChar(aKeyEvent.iCode).IsAlphaDigit() )
+        {
+        OnCmdAddL();
+        iEditorDialog->SetInitialKeyEventL(aKeyEvent);
+        }
+    else
+        {
+        keyResponse = CAknDialog::OfferKeyEventL(aKeyEvent, aType);
+        }
+    return keyResponse;
+    }
+
+// ---------------------------------------------------------
+// CNotepadListDialog::HandleResourceChange
+// Notifier for changing orientation
+// ---------------------------------------------------------
+//
+void CNotepadListDialog::HandleResourceChange(TInt aType)
+    {
+    if (aType == KEikDynamicLayoutVariantSwitch)
+        {
+		SetRect(iAvkonAppUi->ClientRect());
+		iListBox->HandleResourceChange(aType);
+		iListBox->DrawDeferred();
+		}
+    else
+        {
+        CAknDialog::HandleResourceChange(aType);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::ClearSavedMarkListItems()
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::ClearSaveOrMarkedListItemsL(TBool aFlag)
+    {
+       if( aFlag )
+        {
+          iListBox->ClearSelection(); 
+          iListBox->DrawDeferred();
+          MiddleSoftKeyL();
+        }
+       
+       ClearSavedCurrentAndSelections();
+    }
+// CNotepadListDialog::CNotepadListDialog_Reserved
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CNotepadListDialog::CNotepadListDialog_Reserved()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::CNotepadIdle::NewLC
+// -----------------------------------------------------------------------------
+//
+CNotepadListDialog::CNotepadIdle* CNotepadListDialog::CNotepadIdle::NewLC(
+    TBool aIsAddingFocusedItem )
+    {
+    CNotepadIdle* self = new(ELeave) CNotepadIdle(aIsAddingFocusedItem);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self; // self stays on CleanupStack
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::CNotepadIdle::~CNotepadIdle
+// -----------------------------------------------------------------------------
+//
+CNotepadListDialog::CNotepadIdle::~CNotepadIdle()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::CNotepadIdle::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::CNotepadIdle::ConstructL()
+    {
+    CActiveScheduler::Add(this);
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::CNotepadProgressDialog::CNotepadProgressDialog
+// -----------------------------------------------------------------------------
+//
+CNotepadListDialog::CNotepadProgressDialog::CNotepadProgressDialog(
+    CEikDialog** aSelfPtr,
+    TBool aVisibilityDelayOff )
+    :CAknProgressDialog(aSelfPtr, aVisibilityDelayOff)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::CNotepadProgressDialog::~CNotepadProgressDialog
+// -----------------------------------------------------------------------------
+//
+CNotepadListDialog::CNotepadProgressDialog::~CNotepadProgressDialog()
+    {
+    delete iInts;
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::CNotepadProgressDialog::PrepareL
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::CNotepadProgressDialog::PrepareL(
+    const TInt aCount,
+    const TInt aLabelResId )
+    {
+    iProgressInfo = GetProgressInfoL();
+    switch ( aLabelResId )
+        {
+        case R_NOTEPAD_MCE_WAIT_NOTE_DELETE_TEMPLATE: // delete one template
+            {
+			HBufC* buf = StringLoader::LoadLC(R_NOTEPAD_MCE_WAIT_NOTE_DELETE_TEMPLATE);
+            SetTextL(*buf);
+            CleanupStack::PopAndDestroy(buf);
+            }
+            break;
+        case R_NOTEPAD_MCE_WAIT_NOTE_DELETE_TEMPLATES: // delete templates
+            {
+            iInts = new(ELeave) CArrayFixFlat<TInt>(2);
+            iInts->AppendL(0);
+            iInts->AppendL(aCount);
+            IncrementL(0); // SetTextL
+            }
+            break;
+        default:
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::CNotepadProgressDialog::IncrementL
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::CNotepadProgressDialog::IncrementL(
+    const TInt aIncrement)
+    {
+    __ASSERT_DEBUG(iProgressInfo, 
+        Panic(ENotepadLibraryPanicProgressDialogNotReady));
+    if ( iInts ) // IsTemplates
+        {
+        (*iInts)[0] = aIncrement + iProgressInfo->CurrentValue();
+        HBufC* prompt = StringLoader::LoadLC(
+            R_NOTEPAD_MCE_WAIT_NOTE_DELETE_TEMPLATES, *iInts, iCoeEnv );
+        SetTextL(prompt->Des());
+        CleanupStack::PopAndDestroy(); // prompt
+        }
+    iProgressInfo->IncrementAndDraw(aIncrement);
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::CNotepadProgressDialog::ProcessFinishedL
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::CNotepadProgressDialog::ProcessFinishedL()
+    {
+    iProgressInfo->SetAndDraw(iProgressInfo->Info().iFinalValue);
+    CAknProgressDialog::ProcessFinishedL();
+    }
+
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::HandleListBoxPointerEventL
+// -----------------------------------------------------------------------------
+//
+void CNotepadListDialog::HandleListBoxPointerEventL(TNotepadListBoxEvent aEvent)
+	{
+	if(aEvent == EOpenListBoxContextMenu && !MenuShowing())
+		{
+		if(iEditorFlag==EFalse)
+		{
+		iFlags |= ENotepadMenuByOkKey;
+		iMskFlag=ETrue;
+		DisplayMenuL();	
+		}
+		}
+	else if(aEvent == EOpenListBoxItem)
+		{
+        if ( !iEditorDialog&& !IsTemplates() )
+            {
+            OnCmdOpenL( iListBox->CurrentItemIndex() );
+            }
+		}
+	}
+	
+// -----------------------------------------------------------------------------
+// CNotepadListDialog::MiddleSoftKeyL()
+// -----------------------------------------------------------------------------
+//
+
+void CNotepadListDialog::MiddleSoftKeyL()
+    {	
+    const TInt markCount( iListBox->SelectionIndexes()->Count() );
+    
+    if( !IsTemplates() ) // Notepad ListView
+        {
+            if( (iModel->MdcaCount() == 0))
+            {
+              ButtonGroupContainer().SetCommandSetL( R_NOTEPAD_SOFTKEYS_OPTIONS_EXIT_NEW );
+            }
+            else
+            {
+              if( markCount > 0 )
+                {
+                   ButtonGroupContainer().SetCommandSetL( R_NOTEPAD_SOFTKEYS_OPTIONS_EXIT_CONTEXTOPTIONS );     
+                }
+              else 
+                {
+                   ButtonGroupContainer().SetCommandSetL( R_NOTEPAD_SOFTKEYS_OPTIONS_OPEN_EXIT );
+                }
+            } 
+        }
+    else   // Messaging Templates Listview (Notepad view)
+        {
+            if( (iModel->MdcaCount() == 0))
+            {
+            
+            ButtonGroupContainer().SetCommandSetL( R_NOTEPAD_SOFTKEYS_OPTIONS_BACK_NEW );
+            }
+            else
+            {
+             if(markCount > 0 )
+                {
+                  ButtonGroupContainer().SetCommandSetL( R_NOTEPAD_SOFTKEYS_OPTIONS_BACK_CONTEXTOPTIONS ); 
+                }
+             else
+                {
+                  ButtonGroupContainer().SetCommandSetL( R_NOTEPAD_SOFTKEYS_OPTIONS_OPEN_BACK );        
+                }   
+            } 
+        }    
+    
+    ButtonGroupContainer().DrawNow();
+    }
+
+// ----------------------------------------------------------------------------
+// CNotepadListDialog::HandleNotifyL
+// (may leave)
+// ----------------------------------------------------------------------------
+//
+TInt CNotepadListDialog::HandleNotifyL( TInt /* aCmdId */,
+                                        TInt /* aEventId */,
+                                        CAiwGenericParamList& /* aEventParamList */,
+                                        const CAiwGenericParamList& aInParamList
+                                      )
+    {
+#if 0
+    // Extract service command
+    const TAiwGenericParam* errorParam = NULL;
+    TInt index = 0;
+    errorParam = aInParamList.FindFirst( index,
+                                         EGenericParamError,
+                                         EVariantTypeTInt32
+                                       );
+    TInt error = KErrNone;
+    if ( errorParam )
+        {
+        error = errorParam->Value().AsTInt32();
+        }
+
+    if ( error != KErrNone )
+        {
+        // Error handling here
+        }
+#endif // 0
+
+    return KErrNone;
+    }
+    
+// End of File  
+
+