mobilemessaging/smum/src/SmumServiceCentreItemDialog.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/smum/src/SmumServiceCentreItemDialog.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,551 @@
+/*
+* Copyright (c) 2002-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:  
+*     A dialog for adding new and editing old service centres.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <SMUM.rsg>                     // resource identifiers
+#include <smutset.h>                    // CSmsSettings
+#include <aknappui.h>                   // CEikStatusPane
+#include <akntitle.h>                   // CAknTitlePane
+#include <StringLoader.h>               // StringLoader
+#include <commonphoneparser.h>          // CommonPhoneParser
+#include <aknnotewrappers.h>
+#include <eikmenup.h>                   // CEikMenuPane
+#include <hlplch.h>                     // For HlpLauncher
+#include <bldvariant.hrh>
+#include <csxhelp/mce.hlp.hrh>
+// locals
+#include "SmumSettingsDialogGSM.h"         // KStringLength
+#include "SmumServiceCentreItemDialog.h"// CSmumAddEditServiceCentreDialog
+#include "SMSU.HRH"                     // resource header
+#include "SmumServiceCentresDialog.h"   // CSmsServiceCentresDialog
+#include "SmumUtil.h"                   // SmumUtil
+#include "smsui.pan"
+#include "smum.loc"                      
+
+//For logging
+#include "SmumLogging.h"
+
+// CONSTANTS
+const TInt KSCNameLength = 100;
+const TInt KSmumGranularity = 4;
+const TInt KSmumReplaceCharacterCount = 2;
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ constructor can NOT contain any code, that
+// might leave.
+CSmumAddEditServiceCentreDialog::CSmumAddEditServiceCentreDialog(
+    TDes&           aName, 
+    TDes&           aNumber,
+    TInt&           aExitCode,
+    TBool           aHelpFeatureSupported,
+    CSmumSCArray*   aSCDlgsAddressesList,
+    TBool			aSimSCsOnly ) 
+        :iName                  ( aName ), 
+        iNumber                 ( aNumber ),
+        iExitCode               ( aExitCode ),
+        iHelpFeatureSupported   ( aHelpFeatureSupported ),
+        iSCDlgsAddressesList    ( aSCDlgsAddressesList ),
+        iSimSCsOnly				( aSimSCsOnly )
+    {
+    }
+
+// Destructor
+CSmumAddEditServiceCentreDialog::~CSmumAddEditServiceCentreDialog()
+    {
+    SMUMLOGGER_ENTERFN(" CSmumAddEditServiceCentreDialog::~CSmumAddEditServiceCentreDialog");
+    if ( iListBox )
+        {
+        iListBox->SetScrollBarFrame( NULL, CEikListBox::EOwnedExternally );
+        }
+    delete iPreviousTitleText;
+    // iSettingsArray, iListBox, iSCDlgsAddressesList, iTitlePane are
+    // plain pointers to objects owned by other classes which take
+    // care also about deletion.
+    SMUMLOGGER_LEAVEFN(" CSmumAddEditServiceCentreDialog::~CSmumAddEditServiceCentreDialog");
+    }
+
+// ----------------------------------------------------
+// CSmumAddEditServiceCentreDialog::OkToExitL
+//
+// ----------------------------------------------------
+TInt CSmumAddEditServiceCentreDialog::OkToExitL( TInt aButtonId )
+    {
+    SMUMLOGGER_ENTERFN(" CSmumAddEditServiceCentreDialog::OkToExitL");
+    TInt returnValue;
+
+    switch( aButtonId )
+        {
+        case ESmsSettingsChoiceMenuChange:
+	        {
+	        ProcessCommandL( aButtonId );
+	        returnValue = EFalse; // Cannot exit, since MSK was pressed
+	        }     
+	        break;
+        // menu / system exit
+        case EAknSoftkeyCancel: 
+            {
+            if ( iExitCode != ESmumSmsSettingsMenuExit &&
+                iExitCode != ESmumSmsSettingsSystemExit )
+                {
+                // system exit
+                iExitCode = ESmumSmsSettingsSystemExit;
+                }
+            TRAP_IGNORE( ClosingSCItemDialogL() ); 
+            returnValue = ETrue; // to be sure of not leaving and exiting
+            }
+            break;
+        case EAknSoftkeyBack:
+            {
+            iExitCode = ESmumSmsSettingsBack;
+            returnValue = ClosingSCItemDialogL();
+            }
+            break;
+        default :
+            returnValue = CAknDialog::OkToExitL( aButtonId );
+            break;
+        }
+
+    SMUMLOGGER_LEAVEFN(" CSmumAddEditServiceCentreDialog::OkToExitL");
+    return returnValue;
+    }
+
+// ----------------------------------------------------
+// CSmumAddEditServiceCentreDialog::HandleListBoxEventL
+//
+// ----------------------------------------------------
+void CSmumAddEditServiceCentreDialog::HandleListBoxEventL(
+    CEikListBox* /*aListBox*/, 
+    TListBoxEvent aEventType )
+    {
+    SMUMLOGGER_ENTERFN(" CSmumAddEditServiceCentreDialog::HandleListBoxEventL");
+    switch( aEventType )
+        {
+        case EEventEnterKeyPressed:
+        case EEventItemSingleClicked:
+            //for touch input
+            OpenSettingPageL( ETrue );            
+            break;
+        default :
+            // panic
+            break;
+        }
+    SMUMLOGGER_LEAVEFN(" CSmumAddEditServiceCentreDialog::HandleListBoxEventL");
+    }
+
+// ----------------------------------------------------
+// CSmumAddEditServiceCentreDialog::OfferKeyEventL
+//
+// ----------------------------------------------------
+TKeyResponse CSmumAddEditServiceCentreDialog::OfferKeyEventL(
+    const TKeyEvent& aKeyEvent,
+    TEventCode aType )
+    {
+    TKeyResponse returnValue = CAknDialog::OfferKeyEventL( aKeyEvent, aType );
+    return returnValue;
+    }
+
+// ----------------------------------------------------
+// CSmumAddEditServiceCentreDialog::ProcessCommandL
+//
+// ----------------------------------------------------
+void CSmumAddEditServiceCentreDialog::ProcessCommandL(
+    TInt aCommandId )
+    {
+    SMUMLOGGER_ENTERFN(" CSmumAddEditServiceCentreDialog::ProcessCommandL");
+    CAknDialog::ProcessCommandL( aCommandId ) ;
+    switch ( aCommandId )
+        {
+        case ESmsSettingsChoiceMenuChange:
+            OpenSettingPageL( EFalse );
+        break;
+        case EAknCmdHelp:           
+            LaunchHelpL();            
+            break;
+        case ESmsSettingsChoiceMenuExit:
+            { 
+            iExitCode = ESmumSmsSettingsMenuExit;
+            TryExitL( EAknSoftkeyCancel );
+            }
+            break;
+        default :
+            // panic
+            break ;
+        }
+    SMUMLOGGER_LEAVEFN(" CSmumAddEditServiceCentreDialog::ProcessCommandL");
+    }
+
+// ----------------------------------------------------
+// CSmumAddEditServiceCentreDialog::OpenSettingPageL
+//
+// ----------------------------------------------------
+void CSmumAddEditServiceCentreDialog::OpenSettingPageL(
+    TBool aEnterPressed )
+    {
+    SMUMLOGGER_ENTERFN(" CSmumAddEditServiceCentreDialog::OpenSettingPageL");
+    TInt index = iListBox->CurrentItemIndex();
+    __ASSERT_DEBUG( index >= 0 , Panic( ESmsetdlgInvalidIndex ));
+	
+	if ( iSimSCsOnly ) // Only Sim SC's variation is on
+	    {
+		SmumUtil::ShowInformationNoteL( R_QTN_SMS_EMAIL_SETT_CANNOT_CHANGE );
+		return;
+	    }    
+    if ( KErrNotFound != index )//check we have something in listbox
+        {
+        // Launched from CSmsMainSettingsDialog (no centres), 
+        // so complex checking of names not needed.
+        if ( !iSCDlgsAddressesList && ESmumServiceCentreName == index )
+            {
+            iSettingsArray->EditItemL( index, aEnterPressed );
+            //Clear unwanted characters
+            ReplaceCharacters( 
+                iSettingsArray->At( ESmumServiceCentreName ).iUserText );
+            // Update title to show service centre name
+            iTitlePane->SetTextL(
+                iSettingsArray->At( ESmumServiceCentreName ).iUserText );
+            }
+        // ESmumServiceCentreName is to be modified ? 
+        else if ( ESmumServiceCentreName == index )
+            {
+            ModifyScNameL( aEnterPressed, index );
+            }
+        else{ // No, ESmumServiceCentreNumber is to be modified 
+            ModifyScNumberL( aEnterPressed, index );
+            }
+        iListBox->DrawNow();
+        }
+    SMUMLOGGER_LEAVEFN(" CSmumAddEditServiceCentreDialog::OpenSettingPageL");
+    }
+
+// ---------------------------------------------------------
+// CSmumAddEditServiceCentreDialog::DynInitMenuPaneL
+//
+// ---------------------------------------------------------
+void CSmumAddEditServiceCentreDialog::DynInitMenuPaneL(
+    TInt aMenuId, 
+    CEikMenuPane* aMenuPane)
+    {
+    SMUMLOGGER_ENTERFN(" CSmumAddEditServiceCentreDialog::DynInitMenuPaneL");
+    switch ( aMenuId )
+        {
+        case R_SMS_SERVICECENTRE_ITEM_CHOICE_MENUPANE:
+        	if ( iSimSCsOnly ) // Only Sim SC's variation is on
+                {
+	            aMenuPane->SetItemDimmed( ESmsSettingsChoiceMenuChange, ETrue );    	
+	            }  
+            // Help handling
+            aMenuPane->SetItemDimmed( EAknCmdHelp, !iHelpFeatureSupported );
+            break;
+        default :
+            // panic
+            break;
+        }
+    SMUMLOGGER_LEAVEFN(" CSmumAddEditServiceCentreDialog::DynInitMenuPaneL");
+    }
+
+// ----------------------------------------------------
+// CSmumAddEditServiceCentreDialog::ModifyScNameL
+//
+// ----------------------------------------------------
+void CSmumAddEditServiceCentreDialog::ModifyScNameL( TBool aEnterPressed, TInt aIndex )
+    {
+    SMUMLOGGER_ENTERFN(" CSmumAddEditServiceCentreDialog::ModifyScNameL");
+    TBuf<KSmumStringLength> name;
+    TBool canExit = EFalse;
+    TBool found = EFalse;
+    const TInt lBoxCount = iSCDlgsAddressesList->Count();
+    // Take the original name safe
+    TBuf<KSCNameLength> origName = iSettingsArray->At( ESmumServiceCentreName ).iUserText;
+    
+    // Check for dublicates
+    while ( !canExit )
+        {
+        // Did user press ok in setting page ?
+        if ( iSettingsArray->EditItemL( aIndex, aEnterPressed ))
+            {
+            // yes, ok pressed
+            ReplaceCharacters( iSettingsArray->At( ESmumServiceCentreName ).iUserText );
+            iSettingsArray->At( ESmumServiceCentreName ).iUserText.Trim();
+            name = iSettingsArray->At( ESmumServiceCentreName ).iUserText;
+            found = EFalse;
+            // Do we have many service centres defined ?
+            if ( lBoxCount )
+                {
+                // Loop lBoxCount through for duplicates
+                for ( TInt loop=0; loop < lBoxCount && !found; loop++ )
+                    {
+                    if ( name != iSCDlgsAddressesList->SCNameInfo( loop ).Name()
+                        || name == iName )
+                        {                
+                        canExit = ETrue;
+                        // Update title to show service centre name
+                        iTitlePane->SetTextL(
+                            iSettingsArray->At( ESmumServiceCentreName ).iUserText);
+                        }
+                    else 
+                        {
+                        // Show "already in use"-query
+                        HBufC* errorText = StringLoader::LoadLC(
+                            R_QTN_FLDR_RENAME_QUERY, name, iCoeEnv );
+                        CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+                        if ( !( dlg->ExecuteLD(R_SC_NAME_ALREADY_IN_USE_QUERY, *errorText )))
+                            {// Rename? -> No, so cancelling name changing operation
+                            CleanupStack::PopAndDestroy(); // errorText
+                            iSettingsArray->At( ESmumServiceCentreName ).iUserText = origName;
+                            return;
+                            }
+                        
+                        CleanupStack::PopAndDestroy(); // errorText
+                        
+                        found = ETrue;
+                        canExit = EFalse;
+                        }
+                    }
+                }
+            else // no service centres, so no need to check for duplicates, can exit 
+                {
+                canExit = ETrue;
+                // Update title to show service centre name
+                iTitlePane->SetTextL(
+                    iSettingsArray->At( ESmumServiceCentreName ).iUserText);
+                }
+            }
+        else
+            {
+            // no, cancel pressed
+            canExit = ETrue;
+            iSettingsArray->At( ESmumServiceCentreName ).iUserText = origName;
+            }
+        }
+    SMUMLOGGER_LEAVEFN(" CSmumAddEditServiceCentreDialog::ModifyScNameL");
+    }
+
+// ----------------------------------------------------
+// CSmumAddEditServiceCentreDialog::ModifyScNumberL
+//
+// ----------------------------------------------------
+void CSmumAddEditServiceCentreDialog::ModifyScNumberL( TBool aEnterPressed, TInt aIndex )
+    {
+    SMUMLOGGER_ENTERFN(" CSmumAddEditServiceCentreDialog::ModifyScNumberL");
+    TBool validNumber = EFalse;
+    TBool canExit = EFalse;
+
+    // Take the original number safe
+    TBuf<KSCNameLength> origNumber = iSettingsArray->At( ESmumServiceCentreNumber ).iUserText;
+    
+    // Check for dublicates
+    while ( !canExit )
+        {
+        // Did user press ok in setting page ?
+        if ( iSettingsArray->EditItemL( aIndex, aEnterPressed ))
+            {
+            // yes, ok pressed
+            
+            // Check number with commonphoneparser
+            validNumber = CommonPhoneParser::ParsePhoneNumber( 
+                iSettingsArray->At(ESmumServiceCentreNumber).iUserText,
+                CommonPhoneParser::ESMSNumber );
+            
+            if ( validNumber )
+                {                
+                canExit = ETrue;
+                }
+            else 
+                {
+                // Show "invalid number"-note
+                CAknInformationNote* note = new ( ELeave ) CAknInformationNote( ETrue ); // Wait-flag on 
+                HBufC* text = StringLoader::LoadLC( R_QTN_INFO_INVALID_NUMBER, iCoeEnv );
+                note->ExecuteLD( *text );
+                CleanupStack::PopAndDestroy(); // text
+                canExit = EFalse;
+                }            
+            }
+        else
+            {
+            // no, cancel pressed
+
+            // In case of cancel, restore the value
+            iSettingsArray->At( ESmumServiceCentreNumber ).iUserText = origNumber;
+            canExit = ETrue;
+            }
+        }
+    SMUMLOGGER_LEAVEFN(" CSmumAddEditServiceCentreDialog::ModifyScNumberL");
+    }
+
+// ----------------------------------------------------
+// CSmumAddEditServiceCentreDialog::PreLayoutDynInitL
+//
+// ----------------------------------------------------
+void CSmumAddEditServiceCentreDialog::PreLayoutDynInitL()
+    {
+    SMUMLOGGER_ENTERFN(" CSmumAddEditServiceCentreDialog::PreLayoutDynInitL");
+    // Setting arrays in order
+    iListBox = STATIC_CAST( CEikTextListBox*, Control( ESmsSCAddEditId ));
+    iSettingsArray = CMuiuSettingsArray::NewL( R_SERVICECENTRE_ITEMS );
+
+    // Arabic-indic conversion not to be done to SMSC Name
+    (*iSettingsArray)[0].iLangSpecificNumConv = EFalse;
+
+    // Are we adding a new SC? If so let's get a default name for it.
+    if ( !iName.Size())
+        {
+        // Do we have a list of names?
+        if ( iSCDlgsAddressesList )
+            { // Yes, let's make a nameArray and provide it to FindDefaultNameForSCL
+            CDesCArrayFlat* nameArray = new ( ELeave ) CDesCArrayFlat( KSmumGranularity );
+            CleanupStack::PushL( nameArray );
+            
+            TInt amountOfSCs = iSCDlgsAddressesList->Count();
+            for ( TInt loop = 0 ; loop < amountOfSCs; loop++ )
+                {
+                nameArray->AppendL( iSCDlgsAddressesList->SCNameInfo( loop ).Name());
+                }
+            
+            SmumUtil::FindDefaultNameForSCL( iName, EFalse, nameArray );
+            CleanupStack::PopAndDestroy();// nameArray
+            }
+        else
+            {// No, so this have to be first SC.
+            SmumUtil::FindDefaultNameForSCL( iName, EFalse );
+            }
+        }
+
+    iSettingsArray->At( ESmumServiceCentreName ).iUserText.Copy( iName );
+    iSettingsArray->At( ESmumServiceCentreNumber ).iUserText.Copy( iNumber );
+
+    iListBox->SetListBoxObserver( this );
+
+    CTextListBoxModel* model = iListBox->Model();
+    model->SetItemTextArray( iSettingsArray );
+    // scroll bars
+    iListBox->CreateScrollBarFrameL( ETrue );
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+        CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+
+    // Fetch pointer to titlepane
+    CEikStatusPane *sp =  ( STATIC_CAST(
+        CAknAppUi*, ( CEikonEnv::Static()->EikAppUi())))->StatusPane();
+    iTitlePane = STATIC_CAST (
+        CAknTitlePane*, sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle )));
+
+    // Take old titlepane text safe and replace with current sc name
+    iPreviousTitleText = ( *iTitlePane->Text()).Alloc();
+    iTitlePane->SetTextL( iName, ETrue );
+    SMUMLOGGER_LEAVEFN(" CSmumAddEditServiceCentreDialog::PreLayoutDynInitL");
+    }
+
+// ----------------------------------------------------
+// CSmumAddEditServiceCentreDialog::ClosingSCItemDialogL
+//
+// ----------------------------------------------------
+TBool CSmumAddEditServiceCentreDialog::ClosingSCItemDialogL()
+    {
+    SMUMLOGGER_ENTERFN(" CSmumAddEditServiceCentreDialog::ClosingSCItemDialogL");
+    TBool retValue = EFalse;
+
+    // Did user left empty fields?
+    if ( !iSettingsArray->At( ESmumServiceCentreNumber ).iUserText.Size() ||
+        !iSettingsArray->At( ESmumServiceCentreName ).iUserText.Size())
+        { // Yes, we have empty fields
+        if ( iExitCode == ESmumSmsSettingsMenuExit ||
+             iExitCode == ESmumSmsSettingsSystemExit ) // Are we exiting?
+            { // Exiting fast without any queries or titlepane updates
+            iNumber.Zero();
+            iName.Zero();
+            retValue = ETrue;
+            }
+        else 
+            {
+            // do we delete it?
+            CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+            if ( dlg->ExecuteLD( R_SC_WITHOUT_ALL_FIELDS_DELETE_QUERY ))
+                {// Yes
+                
+                // reset values
+                iNumber.Zero();
+                iName.Zero();
+                retValue = ETrue;
+                }
+            }
+        
+        }
+    else{ // no empty fields
+        iNumber.Copy( iSettingsArray->At( ESmumServiceCentreNumber ).iUserText);
+        iName.Copy( iSettingsArray->At( ESmumServiceCentreName ).iUserText);
+        retValue = ETrue;
+        }
+    
+    if ( retValue && iExitCode == ESmumSmsSettingsBack )
+        {
+        // Replace title with old title text
+        iTitlePane->SetTextL( *iPreviousTitleText );
+        }
+
+    SMUMLOGGER_LEAVEFN(" CSmumAddEditServiceCentreDialog::ClosingSCItemDialogL");
+    return retValue;
+    }
+
+// ----------------------------------------------------
+// CSmumAddEditServiceCentreDialog::ReplaceCharacters
+//
+// ----------------------------------------------------
+void CSmumAddEditServiceCentreDialog::ReplaceCharacters( TDes& aText )
+    {
+    TBuf<KSmumReplaceCharacterCount> replaceChars;
+    replaceChars.Zero();
+    replaceChars.Append( CEditableText::EParagraphDelimiter );
+    replaceChars.Append( CEditableText::ETabCharacter );
+    AknTextUtils::ReplaceCharacters(
+        aText, 
+        replaceChars, 
+        CEditableText::ESpace );
+    }
+
+// ----------------------------------------------------
+// CSmumAddEditServiceCentreDialog::LaunchHelpL
+// launch help using context
+//
+// ----------------------------------------------------
+void CSmumAddEditServiceCentreDialog::LaunchHelpL()
+    {
+    if ( iHelpFeatureSupported )
+        {
+        CCoeAppUi* editorAppUi = STATIC_CAST(CCoeAppUi*, ControlEnv()->AppUi());
+        CArrayFix<TCoeHelpContext>* helpContext = editorAppUi->AppHelpContextL();
+        HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), helpContext );
+        }
+    }
+
+// ----------------------------------------------------
+// CSmumAddEditServiceCentreDialog::GetHelpContext
+// returns helpcontext as aContext
+//
+// ----------------------------------------------------
+void CSmumAddEditServiceCentreDialog::GetHelpContext
+        (TCoeHelpContext& aContext) const
+    {    
+    const TUid KUidMce ={0x100058C5};      
+    aContext.iMajor = KUidMce;
+    aContext.iContext = KSMS_HLP_SETTINGS_SCENTRES_EDIT;
+    }
+
+//  End of File  
+