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