diff -r 000000000000 -r 094583676ce7 wvuing/IMPSServiceSettingsUI/Src/CWVSettingsUIServerListDialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/IMPSServiceSettingsUI/Src/CWVSettingsUIServerListDialog.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,1047 @@ +/* +* Copyright (c) 2003 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 displaying servers +* +*/ + +// INCLUDE FILES +#include "CWVSettingsUIServerListDialog.h" +#include "CWVSettingsUI.hrh" +#include "CWVSettingsUIServersArray.h" +#include "CWVSettingsUIServerSelector.h" +#include "MWVSettingsObserverng.h" +#include "CWVSettingsUIDialogTitlePaneHandler.h" + +#include + +#include +#include +#include // StringLoader +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "CAExternalInterface.h" +#include +#include +#include "VariantKeys.h" + +//FORWARD DECLARATION +class CIMPSSAPSettingsStore; + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CWVSettingsUIServerListDialog::CWVSettingsUIServerListDialog( + CIMPSSAPSettingsStore& aSAPSettingsStore, + MWVSettingsObserver& aObserver, + CWVSettingsUIDialogTitlePaneHandler& aTitlePaneHandler, + CWVSettingsUIDialogImp& aDialog, + CIMPSPresenceConnectionUi* aConnectionUi ) + : iSAPSettingsStore( &aSAPSettingsStore ), + iObserver( &aObserver ), + iProtectedServers( 4 ), // granularity = 4, because it's not likely that there are more protected servers + iTitlePaneHandler( &aTitlePaneHandler ), + iDialog( &aDialog ), + iConnectionUI( aConnectionUi ), + iEditorActive( EFalse ), + iAdded( EFalse ) + , iIsOpenedTargettDlg( EFalse ) + { + } + +// Destructor +CWVSettingsUIServerListDialog::~CWVSettingsUIServerListDialog() + { + if ( iSAPSettingsStore ) + { + iSAPSettingsStore->RemoveObserver( this ); + } + delete iTitle; + iProtectedServers.Close(); + delete iSAP; + if ( iDlgLauncher && iDlgLauncher->IsActive() ) + { + iDlgLauncher->Cancel(); + } + delete iDlgLauncher; + // to cancel all request when dialog shut + CCoeEnv* env = CCoeEnv::Static(); + if ( env->IsActive() ) + { + env->Cancel(); + } + + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::RefreshTitleL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIServerListDialog::RefreshTitleL() + { + if ( !iTitle ) + { + iTitle = iEikonEnv->AllocReadResourceL( RSC_WVSETTINGSVIEW_SERVERLIST_TITLE ); + } + + iTitlePaneHandler->SetTitlePaneTextL ( *iTitle ); + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::DisplayServerEditorDialogL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TWVSettingsDialogReturnValue CWVSettingsUIServerListDialog::DisplayServerEditorDialogL( + CWVSettingsUIDefineNewServerDialog::TEditMode aEditMode ) + { + TInt exitReason( 0 ); + if ( iSAP ) + { + iCurrent = iSAP->Uid(); + } + + CWVSettingsUIDefineNewServerDialog* defineNewServerDialog = new ( ELeave ) + CWVSettingsUIDefineNewServerDialog( + exitReason, + *iSAPSettingsStore, + aEditMode, + *iObserver, + *iTitlePaneHandler, + iDialog, + iNewUid, + iConnectionUI, + iSAP ); + + // the ownership of iSAP has now been transferred to define new server dialog + iSAP = NULL; + + CleanupStack::PushL( defineNewServerDialog ); + defineNewServerDialog->ConstructL( R_WVSETTINGSVIEW_DEFNEWSERVER_MENUBAR ); + CleanupStack::Pop( defineNewServerDialog ); + + iEditorActive = ETrue; + TInt returnValue ( defineNewServerDialog->ExecuteLD( R_WVSETTINGSVIEW_DEFNEWSERVER_DLG ) ); + iEditorActive = EFalse; + + // Dialog was canceled. + if ( returnValue == EEikBidCancel ) + { + // Dialog was shut down by a dialog shutter and we need to return + // quickly without touching any internal variables. + return EWVSettingsViewForceExit; + } + + if ( ( exitReason == EMissingCompulsory ) + && aEditMode == CWVSettingsUIDefineNewServerDialog::EEditServer ) + { + CIMPSSAPSettings* sap = GetSAPL( iListBox->CurrentItemIndex() ); + + if ( sap ) + { + CleanupStack::PushL( sap ); + // show note that prevents user from deleting protected server + if ( sap->Protection() == ESAPBrandProtection ) + { + // show note + ShowBrandProtectionNoteL(); + CleanupStack::PopAndDestroy( sap ); + } + else + { + // there is no brand protection for this server, it's ok to delete it + // delete the server + TRAPD( err, iSAPSettingsStore->DeleteSAPL( sap->Uid() ) ); + + if ( err == KErrNone ) + { + TInt index( iListBox->CurrentItemIndex() ); + + // the index cannot go below zero in any case + if ( --index < 0 ) + { + index = 0; + } + // we must set the current item index to the next + // item, unless this is the last one + if ( index + 1 < iListBox->BottomItemIndex() ) + { + // this is not the last item, we need to add one + index++; + } + // Remove data also from internal buffer + UpdateModelL(); + + iListBox->HandleItemRemovalL(); + // if the list is empty index is set to 0 above + iListBox->SetCurrentItemIndexAndDraw( index ); + iListBox->DrawNow(); + } + CleanupStack::PopAndDestroy( sap ); + } + } + } + + iListBox->View()->DrawItem( iListBox->CurrentItemIndex() ); + + if ( returnValue == EWVSettingsViewCmdExit ) + { + return EWVSettingsViewExitCalled; + } + else + { + return EWVSettingsViewOk; + } + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::DeleteSelectedServerL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIServerListDialog::DeleteSelectedServerL() + { + // get the current sap + CIMPSSAPSettings* sap = GetSAPL( iListBox->CurrentItemIndex() ); + + // Get default sap's uid + TUint32 defaultSapUid; + iSAPSettingsStore->GetDefaultL( defaultSapUid, EIMPSIMAccessGroup ); + + // Check if we are trying to delete default sap + TBool isDefaultSap = sap->Uid() == defaultSapUid; + + TInt sapCount = iSAPSettingsStore->SAPCountL( EIMPSIMAccessGroup ); + + if ( sap ) + { + CleanupStack::PushL( sap ); + // show note that prevents user from deleting protected server + if ( sap->Protection() == ESAPBrandProtection ) + { + // show note + ShowBrandProtectionNoteL(); + CleanupStack::PopAndDestroy( sap ); // sap + return; + } + + CPEngNWSessionSlotID2* sessionSlotID = NULL; + TRAPD( err, sessionSlotID = iConnectionUI->GetActiveNWSessionSlotIDL( EIMPSConnClientIM ) ); + CleanupStack::PushL( sessionSlotID ); + + if ( !err ) + { + // check if IM or PEC is connected to this server + CIMPSSAPSettings* loggedInSap = CIMPSSAPSettings::NewLC(); + TInt returnValue = iConnectionUI->GetLoggedInSapL( *sessionSlotID, *loggedInSap ); + CleanupStack::Pop( loggedInSap ); + CleanupStack::PopAndDestroy( sessionSlotID ); + CleanupStack::PushL( loggedInSap ); + + TIMPSConnectionOperation connOperation( EIMPSConnOppUnknown ); + + // if returnValue is anything except KErrNone, nobody is logged in at the moment + // but we must check if the login is ongoing at this moment + if ( returnValue != KErrNone ) + { + // we were not logged in + // check if the log in is ongoing + HBufC* buffer = NULL; + connOperation = iConnectionUI->CurrentConnectionOperationL( buffer ); + if ( connOperation == EIMPSConnOppClientLogin ) + { + // login ongoing, set the sap name for later checks + CleanupStack::PushL( buffer ); + loggedInSap->SetSAPNameL( *buffer ); + CleanupStack::PopAndDestroy( buffer ); + } + } + + // if there is an active connection or ongoing login operation + if ( ( returnValue == KErrNone ) || ( connOperation == EIMPSConnOppClientLogin ) ) + { + // check if the active connection is to the current sap + if ( loggedInSap->SAPName().CompareF ( sap->SAPName() ) == 0 ) + { + // the active connection or the ongoing login operation was to the current sap + if ( connOperation == EIMPSConnOppClientLogin ) + { + // a login operation is ongoing, we cannot let the user edit the settings + HBufC* prompt = StringLoader::LoadLC( + R_QTN_CHAT_LOGIN_ONGOING_NOTE, + loggedInSap->SAPName(), + iCoeEnv ); + CAknErrorNote* dlg = new ( ELeave ) CAknErrorNote( ETrue ); + dlg->ExecuteLD( *prompt ); + CleanupStack::PopAndDestroy( prompt ); + CleanupStack::PopAndDestroy( loggedInSap ); + CleanupStack::PopAndDestroy( sap ); + return; + } + // this is the server we are logged in to + else if ( !ConfirmLogoutL() ) + { + // user declined logout, we cannot delete this server + CleanupStack::PopAndDestroy( 2 ); // loggedInSap, sap + return; + } + } + } + CleanupStack::PopAndDestroy( loggedInSap ); + } + // ignore not found error, since then there cannot be active connection to disconnect + else if ( err != KErrNotFound ) + { + User::Leave( err ); + } + else + { + CleanupStack::PopAndDestroy( sessionSlotID ); + } + + // Ask confirmation from user about deletion + HBufC* prompt = prompt = StringLoader::LoadLC( + R_QTN_CHAT_DELETE_COMMUNITY, + sap->SAPName() ); + + // Ask common confirmation + TInt confirmationResult = ExecuteConfirmationDialogL( *prompt ); + if ( confirmationResult == 0 ) + { + CleanupStack::PopAndDestroy( 2, sap ); // prompt, sap + return; + } + + CleanupStack::PopAndDestroy( prompt ); + prompt = NULL; + + if ( isDefaultSap && sapCount > 1 ) + + { + // If current server is deleted, we need new server to use. + // The default SAP cannot be deleted from SAP settings store so + // we have to query this before the actual deletion + CWVSettingsUIServerSelector::ExecuteSelectionQueryLD( + *iSAPSettingsStore, *iDialog, EFalse, ETrue ); + } + + // do the actual deletion + iSAPSettingsStore->DeleteSAPL( sap->Uid() ); + + // set the current index + TInt index( iListBox->CurrentItemIndex() ); + + if ( --index < 0 ) + { + index = 0; + } + else if ( index + 1 < iListBox->BottomItemIndex() ) + { + // this is not the last item, we need to add one + index++; + } + // Remove data also from internal buffer + UpdateModelL(); + + iListBox->HandleItemRemovalL(); + iListBox->SetCurrentItemIndexAndDraw( index ); + + if ( iListBox->Model()->NumberOfItems() == 0 ) + { + // Update CBA + CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current(); + cba->SetCommandSetL( R_WVSETTINGSVIEW_SOFTKEYS_OPTIONS_BACK__EMPTY ); + cba->DrawNow(); + } + + DrawNow(); + } + + CleanupStack::PopAndDestroy( sap ); + } +// } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::ShowBrandProtectionNoteL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIServerListDialog::ShowBrandProtectionNoteL() + { + HBufC* noteText = iEikonEnv->AllocReadResourceLC( R_QTN_WVSETTINGSVIEW_BRAND_SERVER_DELNOTE ); + CAknInformationNote* dlg = new ( ELeave ) CAknInformationNote( ETrue ); + dlg->ExecuteLD( *noteText ); + CleanupStack::PopAndDestroy( noteText ); // noteText + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::ConfirmLogoutL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CWVSettingsUIServerListDialog::ConfirmLogoutL() + { + // check if pec and chat are logged in + TBool pecLogged ( iConnectionUI->LoggedInL( EIMPSConnClientPEC ) ); + TBool imLogged ( iConnectionUI->LoggedInL( EIMPSConnClientIM ) ); + + if ( pecLogged || imLogged ) + { + // ask confirmation about logging out + CAknQueryDialog* dlg = new ( ELeave ) CAknQueryDialog( CAknQueryDialog::ENoTone ); + CleanupStack::PushL( dlg ); + // Set prompt + HBufC* text = CEikonEnv::Static()->AllocReadResourceLC( + R_WVSETTINGSVIEW_ERROR_ID_ACTIVE_CONNECTION ); + dlg->SetPromptL( *text ); + CleanupStack::PopAndDestroy( text ); + CleanupStack::Pop( dlg ); + TInt ret( dlg->ExecuteLD( R_ACTIVE_CONNECTION_CONFIRMATION_QUERY ) ); + + if ( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) ) + { + iDialog->ChangeToManualL(); + // user confirmed logout -> disconnect all open connections + CPEngNWSessionSlotID2* sessionSlotID = + iConnectionUI->GetActiveNWSessionSlotIDL( EIMPSConnClientIM ); + CleanupStack::PushL( sessionSlotID ); + User::LeaveIfError( iConnectionUI->LogoutL( *sessionSlotID ) ); + CleanupStack::PopAndDestroy( sessionSlotID ); + return ETrue; + } + else + { + // the user declined the logout, we can just return EFalse + return EFalse; + } + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::ExecuteConfirmationDialogL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CWVSettingsUIServerListDialog::ExecuteConfirmationDialogL( const TDesC& aPrompt ) + { + // Show confirmation + CAknQueryDialog* dlg = new ( ELeave ) CAknQueryDialog( CAknQueryDialog::ENoTone ); + CleanupStack::PushL( dlg ); + dlg->SetPromptL( aPrompt ); + CleanupStack::Pop( dlg ); + return dlg->ExecuteLD( R_WVSETTINGSVIEW_CONFIRMATION_QUERY ); + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::GetSAPL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CIMPSSAPSettings* CWVSettingsUIServerListDialog::GetSAPL( TInt aIndex ) + { + // the index cannot be less than zero + if ( aIndex < 0 ) + { + User::Leave( KErrNotFound ); + } + TPtrC name( iServerListAdapter->RawDataMdcaPoint( aIndex ) ); + + CIMPSSAPSettingsList* sapList = CIMPSSAPSettingsList::NewLC(); + CIMPSSAPSettings* sap = CIMPSSAPSettings::NewLC(); + iSAPSettingsStore->PopulateSAPSettingsListL( *sapList, EIMPSIMAccessGroup ); + TInt index( 0 ); + + if ( sapList->FindNameL( name, index ) == 0 ) + { + TUint32 uid( sapList->UidForIndex( index ) ); + const CIMPSSAPSettingsListItem* sapItem = sapList->ListItemForUid( uid ); + iSAPSettingsStore->GetSAPL( sapItem->Uid(), sap ); + CleanupStack::Pop( sap ); + } + else + { + CleanupStack::PopAndDestroy( sap ); + sap = NULL; + } + + CleanupStack::PopAndDestroy( sapList ); + + return sap; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::UpdateModelL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIServerListDialog::UpdateModelL() + { + + CIMPSSAPSettingsList* newList = CIMPSSAPSettingsList::NewLC(); + iSAPSettingsStore->PopulateSAPSettingsListL( *newList, EIMPSIMAccessGroup ); + TInt index( newList->IndexForUid( iCurrent ) ); + iCurrent = 0; + if ( iAdded ) + { + iAdded = EFalse; + TInt newIndex = newList->IndexForUid( iNewUid ); + if ( newIndex > KErrNotFound ) + { + index = newIndex; + } + } + + // ReplaceModel can only leave if newList is NULL, so we can pop the newList here + CleanupStack::Pop( newList ); + + // Ownership of newList is transferred to iServerListAdapter + iServerListAdapter->ReplaceModelL( newList ); + + // we don't want to go below zero + if ( index < 0 ) + { + index = 0; + } + + // set the correct focus + iListBox->SetCurrentItemIndex( index ); + + if ( newList ) + { + if ( newList->Count() > 0 ) + { + // check that the focus stays on the screen + if ( iListBox->CurrentItemIndex() > ( newList->Count() - 1 ) ) + { + iListBox->SetCurrentItemIndex( newList->Count() - 1 ); + } + } + } + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::LoadListboxIconArrayL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIServerListDialog::LoadListboxIconArrayL() + { + + // Create array for listbox graphics + CAknIconArray* icons = new ( ELeave ) CAknIconArray( 1 ); // one icon in array + CleanupStack::PushL( icons ); + + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + + TFileName bitmapfilepath; + bitmapfilepath.Append( TParsePtrC( PathInfo::RomRootPath() ).Drive() ); + bitmapfilepath.Append( KDC_APP_BITMAP_DIR() ); + bitmapfilepath.Append( KBitmapFile() ); + + AknsUtils::CreateIconLC( AknsUtils::SkinInstance(), + KAknsIIDQgnIndiSettProtectedAdd, + bitmap, mask, bitmapfilepath, + EMbmApsettingsQgn_indi_sett_protected_add, + EMbmApsettingsQgn_indi_sett_protected_add_mask ); + + icons->AppendL( CGulIcon::NewL( bitmap, mask ) ); + CleanupStack::Pop( 2 ); // mask, bitmap + + // Transfer ownership to listbox + iListBox->ItemDrawer()->ColumnData()->SetIconArray( icons ); + CleanupStack::Pop( icons ); + } + + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::ProcessCommandL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIServerListDialog::ProcessCommandL( TInt aCommand ) + { + HideMenu(); + + switch ( aCommand ) + { + case EAknSoftkeyEdit: // Flowthrough, MSK command + case EWVSettingsViewServerlistNew: // Flowthrough + case EWVSettingsViewServerlistEdit: + { + LaunchCorrectDialog( aCommand ); + break; + } + + case EWVSettingsViewServerlistDelete: + { + DeleteSelectedServerL(); + break; + } + // Help key support EWVSettingsViewCmdHelp is assigned EAknCmdHelp in + // CWSettingsUI.hrh + case EWVSettingsViewCmdHelp: + { + HlpLauncher::LaunchHelpApplicationL( CEikonEnv::Static()->WsSession(), + ( CCoeEnv::Static()->AppUi() )->AppHelpContextL () ); + break; + } + + case EWVSettingsViewCmdExit: + { + TryExitL( aCommand ); + break; + } + default: + { + CEikonEnv::Static()->EikAppUi()->HandleCommandL( aCommand ); + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::HandleListBoxEventL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIServerListDialog::HandleListBoxEventL( CEikListBox* aListBox, + TListBoxEvent aEventType ) + { + if ( aEventType != EEventEnterKeyPressed && + aEventType != EEventItemDoubleClicked ) + { + return; + } + + if ( aListBox == iListBox ) + { + ProcessCommandL( EWVSettingsViewServerlistEdit ); + } + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::OfferKeyEventL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TKeyResponse CWVSettingsUIServerListDialog::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + + if ( aType == EEventKey && ( aKeyEvent.iCode == EKeyOK || aKeyEvent.iCode == EKeyEnter ) ) + { + HandleListBoxEventL( iListBox, EEventEnterKeyPressed ); + return EKeyWasConsumed; + } + else if ( aType == EEventKey && aKeyEvent.iCode == EKeyBackspace ) + { + if ( iListBox->Model()->NumberOfItems() == 0 ) + { + return EKeyWasConsumed; + } + DeleteSelectedServerL(); + return EKeyWasConsumed; + } + + return CEikDialog::OfferKeyEventL( aKeyEvent, aType ); + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::DynInitMenuPaneL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIServerListDialog::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ) + { + + // if we're displaying general menu and help feature is not supported.. + if ( aResourceId == R_WVSETTINGSVIEW_GENERAL_MENU && + !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + // dimm the help menu item + aMenuPane->SetItemDimmed( EWVSettingsViewCmdHelp, ETrue ); + } + else if ( aResourceId == R_WVSETTINGSVIEW_SERVERLIST_MENUPANE ) + { + // + // Based on Variation flag, Enable Locking Server Setting which removes + // adding/deleting New Server option in Settings View. + TBool lockServerSettings = IntResourceValueL( RSC_CHAT_VARIATION_IMPSCU_LOCK_SERVER_SETTING ); + + if ( iServerListAdapter->MdcaCount() == 0 ) + { + aMenuPane->DeleteMenuItem( EWVSettingsViewServerlistEdit ); + aMenuPane->DeleteMenuItem( EWVSettingsViewServerlistDelete ); + } + else if ( lockServerSettings ) + { + aMenuPane->DeleteMenuItem( EWVSettingsViewServerlistNew ); + aMenuPane->DeleteMenuItem( EWVSettingsViewServerlistDelete ); + } + } + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::PreLayoutDynInitL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIServerListDialog::PreLayoutDynInitL() + { + RefreshTitleL(); + + iSAPSettingsStore->AddObserverL( this, EIMPSIMAccessGroup ); + + CIMPSSAPSettingsList* sapList = CIMPSSAPSettingsList::NewLC(); + iSAPSettingsStore->PopulateSAPSettingsListL( *sapList, EIMPSIMAccessGroup ); + // Ownership of sapList is transferred to iServerListAdapter + CleanupStack::Pop( sapList ); + // after this iProtectedServers contain protected servers' indexes + + iServerListAdapter = CWVSettingsUIServersArray::NewL( *sapList, iProtectedServers ); + + iListBox = + static_cast< CAknSingleStyleListBox* >( Control( EWVSettingsViewControlIdServerList ) ); + LoadListboxIconArrayL(); + HBufC* emptyText = iEikonEnv->AllocReadResourceLC( R_WVSETTINGSVIEW_SERVERLIST_NOSERV ); + + iListBox->Model()->SetItemTextArray( iServerListAdapter ); + iListBox->Model()->SetOwnershipType( ELbmOwnsItemArray ); + iListBox->CreateScrollBarFrameL( ETrue ); + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EAuto ); + iListBox->HandleItemAdditionL(); + iListBox->SetListBoxObserver( this ); + iListBox->UpdateScrollBarsL(); + iListBox->View()->SetListEmptyTextL( *emptyText ); + + iDlgLauncher = new ( ELeave ) CAsyncCallBack( + TCallBack( LaunchDlgCallback, this ), + CActive::EPriorityStandard ); + + CleanupStack::PopAndDestroy( emptyText ); + } + +// --------------------------------------------------------- +// CWVSettingsUIServerListDialog::HandleActiveDbEvent() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CWVSettingsUIServerListDialog::HandleSAPEvent( TSAPEvent aEvent ) + { +// Waiting for SAP Settings store improvementes in event handling + + if ( aEvent == ESAPSettingChanged ) + { + // we have to refresh the view + // if editor is active, we should not refresh + // when editor is exited the view will be refresed anyway + CIMPSSAPSettings* sap = NULL; + // we cannot leave here + TRAPD( ignore, sap = GetSAPL( iListBox->CurrentItemIndex() ) ); + + if ( sap ) + { + iCurrent = sap->Uid(); + delete sap; + } + + if ( !iEditorActive ) + { + // we cannot leave here, the display just wont be up-to-date + TRAP( ignore, UpdateModelL() ); + } + } + } + +// --------------------------------------------------------- +// CWVSettingsUIServerListDialog::MappedCommandId() +// (other items were commented in a header). +// --------------------------------------------------------- +// +TInt CWVSettingsUIServerListDialog::MappedCommandId( TInt aButtonId ) + { + // change cancel id so avkon don't remap it to 0 + if ( aButtonId == EEikBidCancel ) + { + return KErrDied; + } + return aButtonId; + } + +// --------------------------------------------------------- +// CWVSettingsUIServerListDialog::OkToExitL() +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CWVSettingsUIServerListDialog::OkToExitL( TInt aButtonId ) + { + if ( aButtonId == EAknSoftkeyEmpty ) + { + return EFalse; + } + if ( iEditorActive ) + { + return EFalse; + } + if ( aButtonId == EAknSoftkeyEdit ) + { + // MSK command + ProcessCommandL( aButtonId ); + return EFalse; + } + + return CAknDialog::OkToExitL( aButtonId ); + } + +// --------------------------------------------------------- +// CWVSettingsUIServerListDialog::LaunchCorrectDialog() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CWVSettingsUIServerListDialog::LaunchCorrectDialog( TInt aCommand ) + { + + if ( GetTargetDlgFlag() ) + { + return; + } + + if ( !iDlgLauncher->IsActive() ) + { + iDlgCommand = aCommand; + iDlgLauncher->Call(); + } + } + +// --------------------------------------------------------- +// CWVSettingsUIServerListDialog::LaunchDlgCallback() +// (other items were commented in a header). +// --------------------------------------------------------- +// +TInt CWVSettingsUIServerListDialog::LaunchDlgCallback( TAny* aDlg ) + { + CWVSettingsUIServerListDialog* dlg = + static_cast( aDlg ); + + + dlg->SetTargetDlgFlag( ETrue ); + TRAP_IGNORE( dlg->DoLaunchCorrectDialogL() ); + dlg->SetTargetDlgFlag( EFalse ); + return EFalse; + } + +// --------------------------------------------------------- +// CWVSettingsUIServerListDialog::DoLaunchCorrectDialogL() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CWVSettingsUIServerListDialog::DoLaunchCorrectDialogL() + { + switch ( iDlgCommand ) + { + case EWVSettingsViewServerlistNew: + { + TWVSettingsDialogReturnValue returnValue( DisplayServerEditorDialogL( + CWVSettingsUIDefineNewServerDialog::ENewServer ) ); + // If dialog was shutdown by a dialog shutter. don't touch internal variables. + if ( returnValue != EWVSettingsViewForceExit ) + { + iAdded = ETrue; + UpdateModelL(); + RefreshTitleL(); + iListBox->HandleItemAdditionL(); + if ( returnValue == EWVSettingsViewExitCalled ) + { + TryExitL ( EWVSettingsViewCmdExit ); + } + } + else + { + TryExitL ( EAknSoftkeyCancel ); + } + break; + } + + case EAknSoftkeyEdit: // Flowthrough, MSK command + case EWVSettingsViewServerlistEdit: + { + TInt listboxIndex = iListBox->CurrentItemIndex(); + // if there are no items in the list, we can just return + if ( listboxIndex < 0 ) + { + return; + } + delete iSAP; + iSAP = NULL; + iSAP = GetSAPL( iListBox->CurrentItemIndex() ); + + // If a matching SAP for current item index can't be found a SAP then + // we have a synchronization problem + + if ( iSAP ) + { + TWVSettingsDialogReturnValue returnValue = DisplayServerEditorDialogL( + CWVSettingsUIDefineNewServerDialog::EEditServer ); + // If dialog was shutdown by a dialog shutter. don't touch internal variables. + if ( returnValue != EWVSettingsViewForceExit ) + { + UpdateModelL(); + RefreshTitleL(); + iListBox->HandleItemAdditionL(); + if ( iListBox->Model()->NumberOfItems() == 0 ) + { + // Update CBA + CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current(); + cba->SetCommandSetL( R_WVSETTINGSVIEW_SOFTKEYS_OPTIONS_BACK__EMPTY ); + cba->DrawNow(); + } + if ( returnValue == EWVSettingsViewExitCalled ) + { + ProcessCommandL( EWVSettingsViewCmdExit ); + } + } + else + { + TryExitL ( EAknSoftkeyCancel ); + } + } + else + { + iListBox->HandleItemRemovalL(); + } + + break; + } + default: + { + // nothing to do + } + } + } + + +// --------------------------------------------------------- +// CWVSettingsUIDialogImp::SetTargetDlgFlag() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CWVSettingsUIServerListDialog::SetTargetDlgFlag( TBool aFlag ) + { + iIsOpenedTargettDlg = aFlag; + } + + +// --------------------------------------------------------- +// CWVSettingsUIDialogImp::SetTargetDlgFlag() +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CWVSettingsUIServerListDialog::GetTargetDlgFlag() + { + return iIsOpenedTargettDlg; + } + +/** + * Help key support - GetHelpContext is called by the framework on + * event EAknCmdHelp + * -------------------------------------------------------------------------------- + * CWVSettingsUIDefineNewServerDialog::GetHelpContext + * @param aContext The context dependent on the current view is passed by the framework. + */ +void CWVSettingsUIServerListDialog::GetHelpContext( + TCoeHelpContext& aContext ) const + { + aContext.iMajor = KUidChatClient; + aContext.iContext = KIMNG_HLP_SERVLISTSETT_IM ; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIServerListDialog::IntResourceValueL() +// @param aResourceId The resource ID to be fetched from Cenrep (if present) or else from the variation file +// ----------------------------------------------------------------------------- +// +TInt CWVSettingsUIServerListDialog::IntResourceValueL( TInt aResourceId ) + { + + TInt val( 0 ); + TInt err ( KErrNone ); + CRepository* rep = 0; + + TRAP( err, rep = CRepository::NewL( KCRUidIMNG ) ); + + if ( err == KErrNone ) + { + TInt key = aResourceId + KIMCUStartVariationID; + + err = rep->Get( key, val ); + + delete rep; + } + + if ( err != KErrNone ) + { + + TResourceReader reader; + + aResourceId = aResourceId + RSC_CRRSS_CHAT_VARIATION_IMPSCU_START_ID; + + CCoeEnv::Static()->CreateResourceReaderLC( + reader, + aResourceId ); + val = reader.ReadInt32(); + CleanupStack::PopAndDestroy(); // reader + + } + + return val; + + } +// End of File