--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/wvuiave/AppSrc/CCAContactDetailsDialog.cpp Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,840 @@
+/*
+* Copyright (c) 2006 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: Contact details dialog.
+ *
+*/
+
+
+// INCLUDE FILES
+#include "CCAContactDetailsDialog.h"
+#include "chatngclient.hrh"
+#include "CCAAppUi.h"
+#include "CCAUISessionManager.h"
+#include "CCAAccessArray.h"
+#include "CCAStatusPaneHandler.h"
+#include "ChatDefinitions.h"
+#include "CAExternalInterface.h"
+#include "ChatDebugPrint.h"
+#include "ChatDebugAssert.h"
+#include "IMUtils.h"
+#include "IMDialogUtils.h"
+#include "IMNoteMapper.h"
+#include "CAUtils.h"
+#include "CCAContactEditor.h"
+#include "ccafetchwaiter.h"
+#include "ccasyncchecker.h"
+#include "CCAApp.h"
+#include "CCAContactSelectionDialog.h"
+#include "MCAContactEditPC.h"
+#include "MCAProcessManager.h"
+#include "CCAPCUtils.h"
+#include "CCABlockingUI.h"
+#include "MCABlockingPC.h"
+
+// The Settings have been moved to Cenrep (also retained in the Resource file),
+// so the enums for keys and central repository header is added here
+#include "VariantKeys.h"
+
+
+#include <aknlists.h>
+#include <ChatNG.rsg>
+#include <aknpopup.h>
+#include <AknMessageQueryDialog.h>
+#include <stringloader.h>
+#include <eikmenub.h>
+#include <hlplch.h>
+#include <csxhelp/imng.hlp.hrh>
+#include <featmgr.h>
+#include <IMPSerrors.H>
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CCAContactDetailsDialog::CCAContactDetailsDialog(
+ TBool& aWasSaved,
+ const HBufC* aListId,
+ const TDesC& aNickname,
+ TInt aIndex )
+ : iListId( aListId ),
+ iNickname( aNickname ),
+ iWasSaved( aWasSaved ),
+ iOwnData( EFalse ),
+ iValidContact( ETrue ),
+ iIndexOfContact(aIndex),
+ iMovingFlag( EFalse )
+ {
+ // nothing..
+ }
+
+// ---------------------------------------------------------
+// CCAContactDetailsDialog::NewL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CCAContactDetailsDialog* CCAContactDetailsDialog::NewL(
+ TBool& aWasSaved,
+ TInt aIndex,
+ const TDesC& aListId,
+ const TDesC& aNickname /* = KNullDesC */
+)
+ {
+ HBufC* list = aListId.AllocLC();
+
+ CCAContactDetailsDialog* temp = new ( ELeave ) CCAContactDetailsDialog(
+ aWasSaved,
+ list,
+ aNickname,
+ aIndex
+ );
+
+ CleanupStack::Pop( list );
+
+ CleanupStack::PushL( temp );
+ temp->ConstructL();
+ CleanupStack::Pop( temp );
+ return temp;
+ }
+
+// ---------------------------------------------------------
+// CCAContactDetailsDialog::ConstructL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAContactDetailsDialog::ConstructL()
+ {
+ CAknDialog::ConstructL( R_CHAT_CDETAILS_MENUBAR );
+
+ CCAAppUi* appUi = static_cast<CCAAppUi*>( CCoeEnv::Static()->AppUi() );
+ iTitlePane = appUi->CAStatusPane();
+
+ iItemTextArray = new ( ELeave ) CDesCArrayFlat( 5 );
+
+ iAliasEnabled = IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_HAVE_ALIAS );
+ iNicknameEnabled = IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_HAVE_NICKNAME );
+
+
+ iCCAContactEditPC = appUi->GetProcessManager().GetContactEditInterface();
+
+ iCCAContactEditPC->InitialiseL( *appUi->GetProcessManager().GetArrayInterface(),
+ iIndexOfContact, iOwnData ) ;
+
+
+ //contact should have been initialised
+ if ( ! iCCAContactEditPC->IsContact() )
+ {
+ // can't be NULL. you should use ContactEditor in this case.
+ __CHAT_ASSERT_DEBUG( iCCAContactEditPC->IsContact() );
+ }
+
+ // store contactid so it's possible to verify the contact
+ // without iContact pointer.
+ iContactId = iCCAContactEditPC->GetCurrentContactUserId().AllocL();
+ }
+
+// Destructor
+CCAContactDetailsDialog::~CCAContactDetailsDialog()
+ {
+ // dialog will be gone, so tab groups can be drawn again
+ if ( iTitlePane )
+ {
+ iTitlePane->RestoreNaviPane();
+ }
+
+ if ( iItemTextArray )
+ {
+ iItemTextArray->Reset();
+ }
+ delete iItemTextArray;
+ delete iListId;
+ delete iContactId;
+
+ iIndexToControlIdMapping.Close();
+
+ // reset the iContact and iOwnData
+ iCCAContactEditPC->ReleaseResources();
+ }
+
+// ---------------------------------------------------------
+// CCAContactDetailsDialog::ProcessCommandL( TInt aCommand )
+// This method catches commands
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAContactDetailsDialog::ProcessCommandL( TInt aCommand )
+ {
+ HideMenu();
+
+ // Verify that contact is still logged in
+ switch ( aCommand )
+ {
+ // commands which require login
+ case EChatClientDetailsEdit:
+ case EChatClientDetailsDelete: // fallthrough
+ {
+ CCAAppUi* appUi = static_cast<CCAAppUi*>( CCoeEnv::Static()->AppUi() );
+
+ if ( !appUi->UISessionManager().LoginL( MCAUiLoginCmdCB::EQueryLogin ) )
+ {
+ // Login unsuccessfull. Cannot process command, so returning.
+ // Do not leave because this can happen when login is failed
+ // for some reason like cancel pressed by user etc.
+ return;
+ }
+
+
+ // wait for background fetch
+ if ( !CCASyncChecker::CheckSyncStateL() )
+ {
+ // canceled or not logged in
+ return;
+ }
+
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ switch ( aCommand )
+ {
+ case EEikCmdExit: // falltrough
+ case EChatClientCmdExit:
+ {
+ iEikonEnv->EikAppUi()->HandleCommandL( EAknSoftkeyExit );
+ break;
+ }
+
+ case EChatClientCmdHelp:
+ {
+ HlpLauncher::LaunchHelpApplicationL( CEikonEnv::Static()->WsSession(),
+ ( CCoeEnv::Static()->AppUi() )->AppHelpContextL () );
+ break;
+ }
+
+ case EChatClientDetailsEdit:
+ {
+ // launch contact editor to edit contact
+ // with highlight in the given field
+ LaunchContactEditorL();
+ break;
+ }
+
+ case EChatClientDetailsDelete:
+ {
+ // This will close the dialog on success.
+ DeleteCurrentContactL();
+ break;
+ }
+
+ default:
+ {
+ iEikonEnv->EikAppUi()->HandleCommandL( aCommand );
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAContactDetailsDialog::DynInitMenuPaneL
+// Dynamically initialises menu pane
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAContactDetailsDialog::DynInitMenuPaneL( TInt aResourceId,
+ CEikMenuPane* aMenuPane )
+ {
+ CHAT_DP_TXT( "CCAContactDetailsDialog::DynInitMenuPaneL" );
+
+ if ( !iCCAContactEditPC->IsContact() ||
+ ( aResourceId == R_CHAT_CDETAILS_MENUPANE && iOwnData ) )
+ {
+ // hide Delete menu option
+ aMenuPane->SetItemDimmed( EChatClientDetailsDelete, ETrue );
+ }
+
+ // dim the help menu if it's not supported
+ if ( aResourceId == R_CHATCLIENT_GENERAL_MENU &&
+ !FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+ {
+ // dim the help menu item
+ aMenuPane->SetItemDimmed( EChatClientCmdHelp, ETrue );
+ }
+
+ CHAT_DP_TXT( "CCAContactDetailsDialog::DynInitMenuPaneL ENDS" );
+ }
+
+// ---------------------------------------------------------
+// CCAContactDetailsDialog::PreLayoutDynInitL()
+// Sets the layout for dialog
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAContactDetailsDialog::PreLayoutDynInitL()
+ {
+ // create the listbox
+ CAknDoubleStyleListBox* listBox = static_cast< CAknDoubleStyleListBox* >
+ ( Control( EChatClientControlIdDetails ) );
+
+ listBox->SetListBoxObserver( this );
+
+ listBox->CreateScrollBarFrameL( ETrue );
+ listBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+ CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+
+ listBox->HandleItemAdditionL();
+ listBox->UpdateScrollBarsL();
+
+ listBox->Model()->SetItemTextArray( iItemTextArray );
+ listBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+ // enable marquee
+ listBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue );
+
+ UpdateItemTextArrayL();
+
+ UpdateTitleBarL();
+ }
+
+// ---------------------------------------------------------
+// CCAContactDetailsDialog::OkToExitL( TInt aButtonId )
+// Handles buttonids
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCAContactDetailsDialog::OkToExitL( TInt aButtonId )
+ {
+ if ( aButtonId == EAknSoftkeyOptions )
+ {
+ DisplayMenuL();
+ return EFalse;
+ }
+ if ( aButtonId == EAknSoftkeyContextOptions ) // MSK command, show context
+ // sensitive options menu
+ {
+ // Currently open contact editor with MSK
+ ProcessCommandL( EChatClientDetailsEdit );
+ return EFalse;
+ }
+ return ETrue;
+ }
+
+// ---------------------------------------------------------
+// CCAContactDetailsDialog::OfferKeyEventL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TKeyResponse CCAContactDetailsDialog::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+ TEventCode aType )
+ {
+ switch ( aKeyEvent.iCode )
+ {
+ case EKeyEscape: // Handle dialog shutdown
+ {
+ TryExitL( EAknSoftkeyExit );
+ return EKeyWasNotConsumed;
+ }
+ case EKeyEnter: // Flowthrough
+ case EKeyOK:
+ {
+ ProcessCommandL( EChatClientDetailsEdit );
+ return EKeyWasConsumed;
+ }
+ case EKeyBackspace:
+ {
+ // This will close the dialog on success.
+ ProcessCommandL( EChatClientDetailsDelete );
+ return EKeyWasConsumed;
+ }
+ case EKeyPhoneSend:
+ {
+ return EKeyWasConsumed;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ CAknDoubleStyleListBox* listBox = static_cast< CAknDoubleStyleListBox* >
+ ( Control( EChatClientControlIdDetails ) );
+
+ // pass to the listbox
+ return listBox->OfferKeyEventL( aKeyEvent, aType );
+ }
+
+// ---------------------------------------------------------
+// CCAContactDetailsDialog::HandleListBoxEventL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAContactDetailsDialog::HandleListBoxEventL( CEikListBox* /*aListBox*/,
+ TListBoxEvent /*aEventType*/ )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CCAContactDetailsDialog::UpdateItemTextArrayL
+// -----------------------------------------------------------------------------
+//
+void CCAContactDetailsDialog::UpdateItemTextArrayL()
+ {
+ // The contact given as parameter for us exists always, because we are
+ // viewing or editing it. If it didn't exist (NULL) we should be in
+ // Contact Editor and Contact Details Dialog should not have been
+ // invoked.
+ // The contact can never be NULL once we reach this method
+ __CHAT_ASSERT_DEBUG( iCCAContactEditPC->IsContact() );
+
+ iItemTextArray->Reset();
+ iIndexToControlIdMapping.Reset();
+
+ // online status - can't be empty
+ HBufC* statusString = NULL;
+
+ switch ( iCCAContactEditPC->GetOnlineStatus() )
+ {
+ case TEnumsPC::EUnknown :
+ {
+ statusString =
+ iEikonEnv->AllocReadResourceLC( R_QTN_CHAT_CD_STATUS_UNKNOWN );
+ break;
+ }
+
+ case TEnumsPC::EOffline :
+ {
+ statusString =
+ iEikonEnv->AllocReadResourceLC( R_QTN_CHAT_CD_STATUS_OFFLINE );
+ break;
+ }
+
+ case TEnumsPC::EOnline :
+ {
+ statusString =
+ iEikonEnv->AllocReadResourceLC( R_QTN_CHAT_CD_STATUS_ONLINE );
+ break;
+ }
+
+ case TEnumsPC::EInvisible :
+ {
+ // this can only come for own status item, no need to check since
+ // for other contacts this state is impossible
+ statusString =
+ iEikonEnv->AllocReadResourceLC( R_QTN_CHAT_CD_STATUS_APPEAR_OFFLINE );
+ break;
+ }
+
+ case TEnumsPC::EAway :
+ {
+ statusString =
+ iEikonEnv->AllocReadResourceLC( R_QTN_CHAT_CD_STATUS_AWAY );
+ break;
+ }
+
+ case TEnumsPC::EBusy :
+ {
+ statusString =
+ iEikonEnv->AllocReadResourceLC( R_QTN_CHAT_CD_STATUS_BUSY );
+ break;
+ }
+
+
+ default :
+ {
+ // can't get here
+ break;
+ }
+ }
+ AppendToItemArrayL( *iItemTextArray, R_QTN_CHAT_CD_STATUS, *statusString );
+ iIndexToControlIdMapping.Append( EChatEditDummy ); // no control for changing presence
+ CleanupStack::PopAndDestroy( statusString );
+
+ // status message
+ TPtrC temp( iCCAContactEditPC->GetStatusText() );
+ if ( temp.Length() > 0 )
+ {
+ // show non-empty message
+ AppendToItemArrayL( *iItemTextArray, R_QTN_CHAT_CD_MESSAGE, temp );
+ iIndexToControlIdMapping.Append( EChatEditDummy ); // no control for changing message
+ }
+
+ // device type - can't be empty
+ HBufC* deviceString = NULL;
+
+ switch ( iCCAContactEditPC->GetClientType() )
+ {
+ case TEnumsPC::EUnknownClient :
+ {
+ deviceString =
+ iEikonEnv->AllocReadResourceLC( R_QTN_CHAT_CD_DEVICE_UNKNOWN );
+ break;
+ }
+
+ case TEnumsPC::EMobile :
+ {
+ deviceString =
+ iEikonEnv->AllocReadResourceLC( R_QTN_CHAT_CD_DEVICE_MOBILE );
+ break;
+ }
+
+ case TEnumsPC::EPC :
+ {
+ deviceString =
+ iEikonEnv->AllocReadResourceLC( R_QTN_CHAT_CD_DEVICE_PC );
+ break;
+ }
+
+ default :
+ {
+ // can't get here
+ break;
+ }
+ }
+ AppendToItemArrayL( *iItemTextArray, R_QTN_CHAT_CD_DEVICE, *deviceString );
+ iIndexToControlIdMapping.Append( EChatEditDummy ); // no control for changing device
+ CleanupStack::PopAndDestroy( deviceString );
+
+ // WVID - we always have this
+
+ //To Remove wv and domain part from "WV User Id" Field in Contact Details Dialog
+ TPtrC userIdName = CCAPCUtils::DisplayId( iCCAContactEditPC->GetCurrentContactUserId() );
+ HBufC16* wvID = userIdName.AllocLC();
+ AppendToItemArrayL( *iItemTextArray, R_QTN_CHAT_CD_WV_ID, *wvID );
+ CleanupStack::PopAndDestroy( wvID );
+ iIndexToControlIdMapping.Append( EChatEditWV );
+
+ // alias
+ if ( iAliasEnabled )
+ {
+ temp.Set( iCCAContactEditPC->GetCurrentContactAlias() );
+ if ( temp.Length() > 0 )
+ {
+ // show non-empty alias
+ AppendToItemArrayL( *iItemTextArray, R_QTN_CHAT_CD_ALIAS, temp );
+ iIndexToControlIdMapping.Append( EChatEditAlias );
+ }
+ }
+
+ // nickname
+ if ( ! iOwnData && iNicknameEnabled )
+ {
+ // nickname is not available for "own data" view
+ temp.Set( iCCAContactEditPC->GetCurrentContactNickname() );
+ if ( temp.Length() > 0 )
+ {
+ // show non-empty nickname
+ AppendToItemArrayL( *iItemTextArray, R_QTN_CHAT_CD_NICK,
+ iCCAContactEditPC->GetCurrentContactNickname() );
+ iIndexToControlIdMapping.Append( EChatEditNick );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCAContactDetailsDialog::AppendToItemArrayL
+// -----------------------------------------------------------------------------
+//
+void CCAContactDetailsDialog::AppendToItemArrayL(
+ CDesCArray& aItemTextArray,
+ TInt aStringResource,
+ const TDesC& aText )
+ {
+ // the length should be enough for every string used here. e.g. 50 is
+ // nickname max length. at the same time, it should be generic enough for
+ // alias, nickname, wvid, etc. so let's choose 120
+ HBufC* temp = HBufC::NewLC( 120 );
+ HBufC* label = iEikonEnv->AllocReadResourceLC( aStringResource );
+ TPtr pTemp( temp->Des() );
+ // format properly for the list box
+ pTemp.Append( KTab );
+ pTemp.Append( *label );
+ pTemp.Append( KTab );
+ pTemp.Append( aText );
+ CleanupStack::PopAndDestroy( label );
+ aItemTextArray.AppendL( *temp );
+ CleanupStack::PopAndDestroy( temp );
+ }
+
+// -----------------------------------------------------------------------------
+// CCAContactDetailsDialog::ShowLD
+// -----------------------------------------------------------------------------
+//
+void CCAContactDetailsDialog::ShowLD()
+ {
+ // show and die
+ ExecuteLD( R_CHAT_CEDITOR_DETAILS );
+ }
+
+// -----------------------------------------------------------------------------
+// CCAContactDetailsDialog::MapIndexToControlId
+// -----------------------------------------------------------------------------
+//
+TInt CCAContactDetailsDialog::MapIndexToControlId( TInt aItemIndex )
+ {
+ TInt maxArrayIndex = iIndexToControlIdMapping.Count();
+ TInt index = aItemIndex;
+
+ // sanity
+ __CHAT_ASSERT_DEBUG( index < maxArrayIndex );
+
+ // find suitable position
+ TInt iter = 0;
+ do
+ {
+ if ( iIndexToControlIdMapping[ index ] != EChatEditDummy )
+ {
+ // found a valid id, use it
+ return iIndexToControlIdMapping[ index ];
+ }
+
+ // no available mapping, try to focus on next one
+
+ // wrap to start of array if necessary
+ index = ( index + 1 ) % maxArrayIndex;
+ iter++;
+ }
+ while ( iter < maxArrayIndex ); // prevent infinite loop
+
+ // didn't find it so let the editor decide
+ return EChatEditDummy;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAContactDetailsDialog::UpdateTitleBarL
+// -----------------------------------------------------------------------------
+//
+void CCAContactDetailsDialog::UpdateTitleBarL()
+ {
+ iTitlePane->ClearNaviPaneL();
+
+ // set correct title
+ HBufC* title = NULL;
+ if ( iOwnData )
+ {
+ // "own data"
+ title = iEikonEnv->AllocReadResourceLC( R_QTN_CHAT_CD_OWN_DATA_TITLE );
+ }
+ else
+ {
+ // identification
+ title = iCCAContactEditPC->GetCurrentContactIdentification().AllocLC();
+ }
+
+ iTitlePane->SetTitleL( *title );
+ CleanupStack::PopAndDestroy( title );
+
+ // set own status, but for landscape mode only
+ CCAAppUi* appUi = static_cast<CCAAppUi*>( CCoeEnv::Static()->AppUi() );
+ appUi->UISessionManager().SetStatusPaneIconsL();
+
+ // when the dialog is active, do not show any tabs even if the underlying
+ // view would like to show them
+ iTitlePane->ProhibitTabGroup();
+ }
+
+// -----------------------------------------------------------------------------
+// CCAContactDetailsDialog::DeleteCurrentContactL
+// -----------------------------------------------------------------------------
+//
+TInt CCAContactDetailsDialog::DeleteCurrentContactL()
+ {
+ // can't delete self
+ if ( iOwnData )
+ {
+ return KErrAccessDenied;
+ }
+
+ if ( !iCCAContactEditPC->IsContactValidL( *iListId ) )
+ {
+ // user does not exist anymore
+ IMNoteMapper::ShowNoteL( KErrArgument );
+ return KErrArgument;
+ }
+
+ iMovingFlag = ETrue;
+ CCAAppUi* appUi = static_cast<CCAAppUi*>( CCoeEnv::Static()->AppUi() );
+
+ // Get the name of the friend to be deleted
+ HBufC* contactId = iCCAContactEditPC->GetCurrentContactIdentification().AllocLC();
+
+ // Load and format confirmation string from resource
+ HBufC* prompt = StringLoader::LoadLC( RSC_CHAT_DELETE_CONFIRMATION, *contactId );
+
+ TInt ret( IMDialogUtils::DisplayQueryDialogL(
+ R_GENERIC_YES_NO_CONFIRMATION_QUERY, *prompt ) );
+
+ TInt error( KErrCancel );
+
+ // Check what the user responded
+ if ( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) )
+ {
+ // accepted, lets delete the contact
+ appUi->ShowWaitDialogLC( R_QTN_CHAT_DELETING_CONTACT );
+
+ HBufC* contactUserId = iCCAContactEditPC->GetCurrentContactUserId().AllocLC();
+ // delete contact
+ error = iCCAContactEditPC->RemoveContactL( *iListId,
+ *contactUserId );
+
+ // Dismiss the delete waiting dailog
+ appUi->DismissWaitDialogL( KErrNone );
+
+ if ( error <= Imps_ERROR_BASE )
+ {
+ // server error
+ IMNoteMapper::ShowNoteL( error );
+ }
+
+ if ( error == KErrNone )
+ {
+ // Start
+#ifdef IMPS_BLOCK_AFTER_DELETE
+ TBool blockVariation( IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_BLOCK_QUERY ) );
+ if ( blockVariation )
+ {
+ HBufC* deletePrompt = StringLoader::LoadLC( R_QTN_CHAT_BLOCKING_QUERY, *contactId );
+ // no error and it's a contact
+ TInt block = IMDialogUtils::DisplayYesNoConfirmationDialogL( *deletePrompt );
+ if ( block )
+ {
+ MCABlockingPC* blockingPC = appUi->GetProcessManager().GetBlockingInterface( );
+ CCABlockingUI* blockingUI = CCABlockingUI::NewLC( blockingPC );
+ // block after delete requested
+ blockingUI->BlockUserL( *contactUserId );
+ CleanupStack::PopAndDestroy( blockingUI );
+ }
+ //CodeScanner warning to be ignored
+ CleanupStack::PopAndDestroy( deletePrompt ); // deletePrompt
+ }
+#endif // IMPS_BLOCK_AFTER_DELETE
+ // End
+ // contact was successfully deleted, try to exit this dialog
+ iWasSaved = EFalse;
+ TryExitL( EAknSoftkeyCancel );
+ }
+ CleanupStack::PopAndDestroy( contactUserId ); // contactUserId
+ CleanupStack::PopAndDestroy(); //appUi->DismissWaitDialogL()
+ }
+ CleanupStack::PopAndDestroy( prompt );
+ CleanupStack::PopAndDestroy( contactId );
+ iMovingFlag = EFalse;
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAContactDetailsDialog::LaunchContactEditorL
+// -----------------------------------------------------------------------------
+//
+void CCAContactDetailsDialog::LaunchContactEditorL()
+ {
+ if ( !iCCAContactEditPC->IsContactValidL( *iListId ) )
+ {
+ // user does not exist anymore
+ IMNoteMapper::ShowNoteL( KErrArgument );
+ return;
+ }
+ if( iMovingFlag )
+ {
+ return;
+ }
+ CAknDoubleStyleListBox* listBox = static_cast< CAknDoubleStyleListBox* >
+ ( Control( EChatClientControlIdDetails ) );
+ TInt controlId = MapIndexToControlId( listBox->CurrentItemIndex() );
+
+ // Use local variable in case we get deleted.
+ TBool wasSaved( EFalse );
+
+ //The contact details dialog already intialised the PC component related to ContactEdit
+ //so contact editor need'nt initialise/release PC coponent resources
+ CCAContactEditor* editor = CCAContactEditor::NewL( iIndexOfContact, wasSaved, EFalse );
+ TInt retVal = editor->EditContactLD( controlId, TEnumsPC::EEditContact, *iListId );
+
+ // Don't do anything if we have cancel
+ if ( retVal != 0 )
+ {
+
+ if ( !iCCAContactEditPC->IsContact() )
+ {
+ // contact was deleted -> exit details dialog
+ iWasSaved = EFalse;
+ TryExitL( EAknSoftkeyCancel );
+ }
+
+ // Only update if we have saved. If we got shut down by dialog shutter
+ // we can't use any internal variables.
+ if ( wasSaved )
+ {
+ iWasSaved = wasSaved;
+
+ // Update ID
+ HBufC* id = iCCAContactEditPC->GetCurrentContactUserId().AllocL();
+ delete iContactId;
+ iContactId = id;
+
+ UpdateItemTextArrayL();
+
+ // Ui was getting distorted here
+
+ CAknDoubleStyleListBox* listBox = static_cast< CAknDoubleStyleListBox* >
+ ( Control( EChatClientControlIdDetails ) );
+
+ listBox->HandleItemAdditionL();
+ listBox->UpdateScrollBarsL();
+ listBox->Model()->SetItemTextArray( iItemTextArray );
+ listBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+ UpdateTitleBarL();
+ DrawNow();
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAContactDetailsDialog::SetSizeAndPosition
+// ---------------------------------------------------------
+//
+void CCAContactDetailsDialog::SetSizeAndPosition( const TSize& /* aSize*/ )
+ {
+
+ TRect rect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, rect );
+ SetRect( rect );
+
+ }
+
+/**
+ * Help Key Support
+ * This function is called by the Framework to get the context to launch
+ * Help
+ *
+ * @param aContext The context that contains the appid and the help id.
+ */
+void CCAContactDetailsDialog::GetHelpContext(
+ TCoeHelpContext& aContext ) const
+ {
+ aContext.iMajor = KUidChatClient;
+ if ( iOwnData )
+ {
+ aContext.iContext = KIMNG_HLP_CONT_OWN_DATA ;
+ }
+ else
+ {
+ aContext.iContext = KIMNG_HLP_CONTACTDETAILS ;
+ }
+ }
+// End of File