messagingappbase/mcesettings/src/MceSettingsMtmServicesDialog.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/mcesettings/src/MceSettingsMtmServicesDialog.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,479 @@
+/*
+* 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:  
+*     Dialog for handling services of certain mtm (if possible to create services).
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include <msvids.h>
+#include <MsgArrays.h>      // CUidNameArray
+#include <eikmenup.h>       // CEikMenuPane, CEikMenuPaneItem
+#include <StringLoader.h>   // StringLoader
+#include <aknViewAppUi.h>
+
+#include <aknlists.h>       // CAknPopupSingle1StyleListBox
+#include <MceSettings.rsg>
+#include "MceSettingsMtmServicesDialog.h"
+#include "MceSettingsIds.hrh"
+#include "MceSettingsAccountManager.h"
+#include "MceSettingsArrays.h"
+
+#include "MceSettingsMultipleServicesDialog.h"
+
+#include <featmgr.h>
+#include <hlplch.h>             // For HlpLauncher
+#include <csxhelp/mbxs.hlp.hrh>
+
+#include <bldvariant.hrh>
+#include <SenduiMtmUids.h>
+
+#include <ImumInternalApi.h>
+#include <ImumInHealthServices.h>
+#include <ImumInMailboxUtilities.h>
+
+#include "MceSettingsUtils.h"
+#include <muiuflags.h>
+
+// CONSTANTS
+
+#define KMceApplicationUidValue         0x100058C5
+const TUid KMceApplicationUid       = {KMceApplicationUidValue};
+
+
+const TInt KMceVisibleTextLength = KHumanReadableNameLength;
+
+// The position of the middle soft key
+const TInt KMSKPosition = 3;
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code that
+// might leave.
+//
+// ----------------------------------------------------
+// CMceSettingsMtmServicesDialog::Constructor
+// ----------------------------------------------------
+CMceSettingsMtmServicesDialog::CMceSettingsMtmServicesDialog(
+    TUid                aMtmType,
+    MMceSettingsAccountManager& aManager,
+    CMsvSession*        aSession,
+    CMceSettingsMultipleServicesDialog& aParent )
+    :
+    CMceSettingsTitlePaneHandlerDialog(),
+    iMtmType( aMtmType ),    
+    iAccountManager( aManager ),
+    iSession( aSession ),
+    iParentDialog( aParent ),
+    iCurrentMailAccountId( KErrNotFound )
+    {
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMtmServicesDialog::Destructor
+// ----------------------------------------------------
+CMceSettingsMtmServicesDialog::~CMceSettingsMtmServicesDialog()
+    {
+    if ( iSessionObserverAdded )
+        {
+        iAccountManager.Session().RemoveObserver( *this );
+        }
+    delete iAccountArray;
+    delete iEmailApi;
+    iEmailApi = NULL;   
+    iMailboxArray.Reset();
+    }
+
+
+// ----------------------------------------------------
+// CMceSettingsMtmServicesDialog::OkToExitL
+// ----------------------------------------------------
+TBool CMceSettingsMtmServicesDialog::OkToExitL( TInt aButtonId )
+    {
+    TBool okToExit = CAknDialog::OkToExitL( aButtonId );
+    if ( aButtonId == EMceSettingsCmdSettingsDialogOpen ||
+         aButtonId == EMceSettingsCmdSettingsDialogCreateNewEmpty )
+        {
+        ProcessCommandL( aButtonId );
+        okToExit = EFalse;  // Cannot exit, since MSK was pressed
+        }
+    else if ( aButtonId != EEikBidCancel && okToExit )
+        {
+        RestoreTitleTextL();
+        }
+        
+    if ( okToExit && aButtonId == EEikBidCancel )
+        {
+        // Let's inform parent that we are closed
+        iParentDialog.SubdialogClosed();
+        }
+
+    return okToExit;
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMtmServicesDialog::HandleListBoxEventL
+// ----------------------------------------------------
+void CMceSettingsMtmServicesDialog::HandleListBoxEventL(
+    CEikListBox* /*aListBox*/,
+    TListBoxEvent aEventType )
+    {
+    switch(aEventType)
+        {
+        case EEventEnterKeyPressed:
+        case EEventItemSingleClicked:
+            ProcessCommandL( EMceSettingsCmdSettingsDialogOpen );
+            break;
+        default:
+            break;
+        }
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMtmServicesDialog::ProcessCommandL
+// ----------------------------------------------------
+void CMceSettingsMtmServicesDialog::ProcessCommandL( TInt aCommandId )
+    {
+    CAknDialog::ProcessCommandL( aCommandId ); // hides menu
+    if ( aCommandId == EMceSettingsCmdSettingsDialogExit )
+        {
+        if (iAvkonViewAppUi->ExitHidesInBackground()) 
+            { 
+            iAvkonViewAppUi->ProcessCommandL( EAknCmdHideInBackground );
+            }
+        else
+            {
+            iAvkonViewAppUi->ProcessCommandL( EAknCmdExit );
+            }
+        return;
+        }
+
+    
+    CEikTextListBox* list=STATIC_CAST( CEikTextListBox*, 
+        Control( EMceSettingsMtmServicesDialogChoiceList ) );
+    const TInt choice = list->CurrentItemIndex();
+    TInt count = iAccountArray->Count();
+
+    switch ( aCommandId )
+        {
+        case EMceSettingsCmdSettingsDialogOpen:
+            if ( choice >= 0 && choice < count )
+                {
+                iCurrentMailAccountId = (*iAccountArray)[choice].iUid.iUid;
+                iAccountManager.EditAccountL( iCurrentMailAccountId );
+                }
+            break;
+
+        case EMceSettingsCmdSettingsDialogCreateNewEmpty:
+            iMailboxCreationOn = ETrue;
+            iAccountManager.CreateNewAccountL( iMtmType, KMsvNullIndexEntryId );
+            iMailboxCreationOn = EFalse;
+            break;
+
+        case EMceSettingsCmdSettingsDialogDelete:
+            if ( choice >= 0 && choice < count )
+                {
+                iAccountManager.DeleteAccountL( (*iAccountArray)[choice].iUid.iUid );
+                }
+            break;
+       
+        case EAknCmdHelp:
+            {
+            LaunchHelpL();                
+            }
+            break;            
+
+        default :
+            break;
+        }
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMtmServicesDialog::DynInitMenuPaneL
+// ----------------------------------------------------
+void CMceSettingsMtmServicesDialog::DynInitMenuPaneL( TInt aResourceId, 
+                                                       CEikMenuPane* aMenuPane )
+    {
+    if ( aResourceId == R_MCE_SETTINGS_MTM_SERVICES_DIALOG_MENUPANE )
+        {
+        aMenuPane->SetItemDimmed( EMceSettingsCmdSettingsDialogHelp,
+            !FeatureManager::FeatureSupported( KFeatureIdHelp ) );  
+
+        if ( iAccountArray->Count() == 0 )
+            {
+            aMenuPane->DeleteMenuItem( EMceSettingsCmdSettingsDialogOpen );
+            aMenuPane->DeleteMenuItem( EMceSettingsCmdSettingsDialogDelete );
+            if ( iSelectionKeyPressedToOpenOptionMenu )
+                {
+                aMenuPane->DeleteMenuItem( EMceSettingsCmdSettingsDialogExit );
+                aMenuPane->DeleteMenuItem( EAknCmdHelp );
+                iSelectionKeyPressedToOpenOptionMenu = EFalse;
+                }
+            }
+        if ( iNumberOfMailboxes >= KMceMaxNumberOfMailboxes )
+            {
+            aMenuPane->DeleteMenuItem( EMceSettingsCmdSettingsDialogCreateNewEmpty );
+            }
+        else
+            {
+            // no action
+            }
+
+        }
+    }
+  
+// ---------------------------------------------------------------------------
+// CMceSettingsMtmServicesDialog::UpdateMailboxDataL()
+// ---------------------------------------------------------------------------
+//
+void CMceSettingsMtmServicesDialog::UpdateMailboxDataL()
+    {
+    const MImumInHealthServices* healthApi = &iEmailApi->HealthServicesL();
+    
+    // Get the array of the mailboxes for the current view
+    MceSettingsUtils::GetHealthyMailboxListL( 
+        *healthApi,
+        iMailboxArray,
+        iMtmType != KSenduiMtmSyncMLEmailUid,
+        iMtmType != KSenduiMtmSyncMLEmailUid,
+        iMtmType == KSenduiMtmSyncMLEmailUid,
+        EFalse );
+    iNumberOfMailboxes = iMailboxArray.Count();
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMtmServicesDialog::UpdateForArrayChangeL
+// ----------------------------------------------------
+void CMceSettingsMtmServicesDialog::UpdateServicesArrayL()
+    {        
+    CEikTextListBox* list=STATIC_CAST( CEikTextListBox*, 
+        Control( EMceSettingsMtmServicesDialogChoiceList ) );
+    TInt selectedIndex = list->CurrentItemIndex();
+    const TInt count = iAccountArray->Count();
+
+    iAccountArray->Reset();
+
+    UpdateMailboxDataL();
+    for ( TInt loop=0; loop<iMailboxArray.Count(); loop++ )
+        {
+        TMsvEntry tentry = iEmailApi->MailboxUtilitiesL().GetMailboxEntryL( 
+            iMailboxArray[loop],
+            MImumInMailboxUtilities::ERequestSending );
+
+        TUid tmpUid = {iMailboxArray[loop]};
+        TUidNameInfo info(
+            tmpUid,
+            tentry.iDetails.Left( KMceVisibleTextLength ) );
+        iAccountArray->AppendL( info );                
+        if ( iCurrentMailAccountId == tmpUid.iUid )
+            {
+            selectedIndex = loop;
+            iCurrentMailAccountId = KErrNotFound;
+            }
+        }
+
+    TInt newCount = iAccountArray->Count();
+    if ( newCount > count )
+        {
+        list->HandleItemAdditionL();
+        }
+    else if ( newCount < count )
+        {
+        list->HandleItemRemovalL();
+        }
+    else
+        {
+        // no action
+        }
+
+    if ( newCount > 0 )
+        {
+        if ( selectedIndex >= 0 && selectedIndex < newCount )
+            {
+            list->SetCurrentItemIndex( selectedIndex );
+            }
+        else if ( selectedIndex >= newCount )
+            {
+            list->SetCurrentItemIndex( newCount - 1 );
+            }
+        else
+            {
+            list->SetCurrentItemIndex( 0 );
+            }
+        }
+    if ( newCount == 0 )
+        {
+        SetSpecialMSKButtonL(R_MCE_MSK_BUTTON_CREATE_NEW_EMPTY);
+        }
+    else
+    	{
+    	SetSpecialMSKButtonL( R_MCE_MSK_BUTTON_OPEN );
+    	}        
+    list->DrawNow();
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMtmServicesDialog::PreLayoutDynInitL
+// ----------------------------------------------------
+void CMceSettingsMtmServicesDialog::PreLayoutDynInitL()
+    {    
+    CEikTextListBox* list=STATIC_CAST( CEikTextListBox*, 
+        Control( EMceSettingsMtmServicesDialogChoiceList ) );
+
+    // Setting scrollbar-indicators on
+    list->CreateScrollBarFrameL( ETrue );
+    list->ScrollBarFrame()->SetScrollBarVisibilityL(
+        CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+
+    if ( !iAccountArray )
+        {
+        iAccountArray = CMceUidNameArray::NewL( CMceUidNameArray::EServicesList );
+        }
+
+    if ( !iEmailApi )
+        {
+        iEmailApi = CreateEmailApiL( iSession );
+        }       
+
+    CTextListBoxModel* model= list->Model();
+    model->SetItemTextArray( iAccountArray );
+    model->SetOwnershipType( ELbmDoesNotOwnItemArray );
+    list->SetListBoxObserver(this);    
+
+    THumanReadableName mtmName = iAccountManager.MtmName( iMtmType );    
+    if ( iMtmType == KSenduiMtmSmtpUid )
+        {
+        // email
+        HBufC* text = StringLoader::LoadL( R_MCE_SETTINGS_NO_MAILBOXES, iEikonEnv );
+        CleanupStack::PushL( text );
+        list->View()->SetListEmptyTextL( *text );
+        CleanupStack::PopAndDestroy( text ); // text
+        HBufC* title = StringLoader::LoadLC( R_MCE_SETTINGS_MTM_SERVICES_DIALOG_TITLE, 
+                                                                  iEikonEnv );
+        StoreTitleTextAndSetNewL( *title );
+        CleanupStack::PopAndDestroy( title ); // title
+        }
+    else if ( iMtmType == KSenduiMtmSyncMLEmailUid )
+        {
+        // syncML
+        HBufC* text = StringLoader::LoadL( R_MCE_SETTINGS_NO_SYNCBOX, iEikonEnv );
+        CleanupStack::PushL( text );
+        list->View()->SetListEmptyTextL( *text );
+        CleanupStack::PopAndDestroy( text ); // text
+        HBufC* title = StringLoader::LoadLC( R_MCE_SETTINGS_SYNCMAIL_TITLE, iEikonEnv );
+        StoreTitleTextAndSetNewL( *title );
+        CleanupStack::PopAndDestroy( title ); // title
+        }
+    else
+        {
+        // not email/syncML
+        HBufC* text = StringLoader::LoadLC( 
+        R_MCE_MTM_NOT_DEFINED, mtmName, iEikonEnv );
+        list->View()->SetListEmptyTextL( *text );
+        CleanupStack::PopAndDestroy( text ); // text
+        StoreTitleTextAndSetNewL( mtmName );
+        }
+
+    iAccountManager.Session().AddObserverL( *this );
+    iSessionObserverAdded = ETrue;
+
+    UpdateServicesArrayL();
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMtmServicesDialog::OfferKeyEventL
+// ----------------------------------------------------
+TKeyResponse CMceSettingsMtmServicesDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent,
+                                                          TEventCode aType)
+    {
+    if ( aType == EEventKey && aKeyEvent.iCode == EKeyBackspace )
+        {
+        if( !iEmailApi->IsEmailFeatureSupportedL( 
+            CImumInternalApi::EMailLockedSettings ) ) 
+            {
+            ProcessCommandL( EMceSettingsCmdSettingsDialogDelete );                    
+            }
+        return EKeyWasConsumed;
+        }
+    return CAknDialog::OfferKeyEventL( aKeyEvent, aType );
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMtmServicesDialog::HandleSessionEventL
+// ----------------------------------------------------
+void CMceSettingsMtmServicesDialog::HandleSessionEventL(
+    TMsvSessionEvent aEvent, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/)
+    {
+    switch ( aEvent )
+        {
+        case EMsvEntriesCreated:
+        case EMsvEntriesChanged:
+        case EMsvEntriesDeleted:
+            if ( !iMailboxCreationOn )
+                {
+                UpdateServicesArrayL();                    
+                }
+            break;        
+        default:
+            // just ignore
+            break;
+        }
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMtmServicesDialog::GetHelpContext
+// returns helpcontext as aContext
+//
+// ----------------------------------------------------
+void CMceSettingsMtmServicesDialog::GetHelpContext
+        (TCoeHelpContext& aContext) const
+    {
+    aContext.iMajor = KMceApplicationUid;
+    if ( iMtmType != KSenduiMtmSyncMLEmailUid )
+        { 
+        /*aContext.iContext = KMCE_HLP_SETT_SMAILBLIST;
+        }
+        else
+        {*/
+        aContext.iContext = KMCE_HLP_SETT_MAILBLIST;
+        }
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMtmServicesDialog::LaunchHelpL
+// Launch help using context
+// 
+// ----------------------------------------------------
+void CMceSettingsMtmServicesDialog::LaunchHelpL() const
+    { 
+    CCoeAppUi* appUi = STATIC_CAST(CCoeAppUi*, ControlEnv()->AppUi());       
+    CArrayFix<TCoeHelpContext>* helpContext = appUi->AppHelpContextL();   
+    HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), helpContext );
+    }
+
+// ----------------------------------------------------
+// CMceSettingsMtmServicesDialog::SetSpecialMSKButtonL
+// ----------------------------------------------------
+void CMceSettingsMtmServicesDialog::SetSpecialMSKButtonL( TInt aResourceId )
+    { 
+    CEikButtonGroupContainer& cba = ButtonGroupContainer();
+    cba.SetCommandL( KMSKPosition, aResourceId );
+    cba.DrawNow();
+    }
+
+//  End of File