diff -r 000000000000 -r 094583676ce7 wvuing/wvuiave/AppSrc/CCARecordedChatsContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuiave/AppSrc/CCARecordedChatsContainer.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,923 @@ +/* +* 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: Container for recorded chat view +* +*/ + + + +// INCLUDE FILES +#include "MCARecordedChatsPC.h" +#include "MCARecordedChatsArrayPC.h" +#include "IMUtils.h" +#include "MCAConversationMessage.h" +#include "CCAGroupUtils.h" + +#include "CCARecordedChatsContainer.h" +#include "CCAChatViewControl.h" +#include "MCARecordedChatProvider.h" +#include "CCAContactSelectionDialog.h" +#include "CCAUISessionManager.h" +#include "MCAProcessManager.h" +#include "MCASettingsPC.h" +#include "MCAServerContactsArrayPC.h" + +#include "CCAMessageExtensionsHandler.h" +#include "CAExternalInterface.h" +#include "CCAAppUi.h" +#include "CCAApp.h" +#include "CCAStatusPaneHandler.h" +#include "MCASkinVariant.h" +#include "CCAVariantFactory.h" +#include "TCAChatListBoxLayout.h" +#include "MCALayoutInfo.h" +#include "ChatDebugPrint.h" +#include "IMDialogUtils.h" +#include "mcarecipientobserver.h" +#include "chatngclient.hrh" +#include "imnginternalcrkeys.h" +#include "IMPrivateCRKeys.h" +#include "IMVariant.hrh" + + +#include +#include +#include +#include +#include +#include +#include //cdl +#include //cdl +#include +#include +#include + +#include "CATouchUtils.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" + + +// ================= MEMBER FUNCTIONS ======================= +// ----------------------------------------------------------------------------- +// CCARecordedChatsContainer::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCARecordedChatsContainer* CCARecordedChatsContainer::NewL( + const TRect& aRect, + MCAViewSwitcher& aViewSwitcher, + MCARecordedChatProvider& aRecChatArrayProvider, + MCARecipientObserver& aRecipientObserver, + MObjectProvider& aObjectProvider, + MCASettingsPC& aSettingsPC, + CCAAppUi* aAppUi, + MCARecordedChatsPC& aRecordedChatsPC ) + { + CCARecordedChatsContainer* self = + new ( ELeave ) CCARecordedChatsContainer( aRecChatArrayProvider, + aViewSwitcher, + aRecipientObserver, + aSettingsPC, + aAppUi, + aRecordedChatsPC ); + CleanupStack::PushL( self ); + self->ConstructL( aRect, aObjectProvider ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::CCARecordedChatsContainer +// Symbian OS default constructor +// --------------------------------------------------------- +// +CCARecordedChatsContainer::CCARecordedChatsContainer( + MCARecordedChatProvider& aRecChatArrayProvider, + MCAViewSwitcher& aViewSwitcher, + MCARecipientObserver& aRecipientObserver, + MCASettingsPC& aSettingsPC, + CCAAppUi* aAppUi, + MCARecordedChatsPC& aRecordedChatsPC +) + : iRecordedChatArrayProvider( aRecChatArrayProvider ), + iRecordedChatsPC( aRecordedChatsPC ), + iViewSwitcher( aViewSwitcher ), + iRecipientObserver( aRecipientObserver ), + iSettingsPC( aSettingsPC ) + { + iAppUI = aAppUi ; + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::ConstructL(const TRect& aRect) +// Symbian OS two phased constructor +// --------------------------------------------------------- +// +void CCARecordedChatsContainer::ConstructL( const TRect& aRect, + MObjectProvider& aObjectProvider ) + { + SetMopParent( &aObjectProvider ); + + CreateWindowL(); + + CCAApp* myApp = static_cast( iAppUI->Application() ); + iSkinVar = myApp->VariantFactory()->SkinVariantL(); + + iAppUI->AddLayoutChangeObserver( this ); + + // Create chat view + LoadBitmapsL(); + + iChatView = CCAChatViewControl::NewL( aRect , *this, + iRecordedChatsPC, + iSettingsPC, + iAppUI->MessageHandler(), + iFromMe, + iToMe, + iUnsupported, + iCorrupted, EFalse, this ); + + iChatView->SetObserver( this ); + + iChatView->SetTapObserver( this, 0 ); + + iAppUI->LayoutInfo()->SetLayoutID( TChatListBoxLayout::EWithoutEditor ); + iAppUI->LayoutInfo()->SetEditorVisibility( EFalse ); + + iSendkeyInMsgList = ( IMUtils::CRKeyL( KCRUidIMVariation, KIMVariationKey ) + & EIMFeatSendkeyInMsgList ); + + SetRect( aRect ); + UpdateCbaL(); + ActivateL(); + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsContainer::LayoutChangedL +// +// ----------------------------------------------------------------------------- +// +void CCARecordedChatsContainer::LayoutChangedL( TInt aType ) + { + LoadBitmapsL(); + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect ); + SetRect( mainPaneRect ); + CCoeControl::HandleResourceChange( aType ); + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsContainer::~CCARecordedChatsListViewContainer +// destructor +// ----------------------------------------------------------------------------- +// +CCARecordedChatsContainer::~CCARecordedChatsContainer() + { + delete iFromMe; + delete iToMe; + delete iUnsupported; + delete iCorrupted; + if ( iAppUI && !iAppUI->IsUnderDestruction() ) + { + iAppUI->RemoveLayoutChangeObserver( this ); + } + delete iChatView; + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::SetDefaultTitleL() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCARecordedChatsContainer::SetDefaultTitleL() + { + iViewSwitcher.CAStatusPane()->SetTitleL( iEikonEnv, + R_CHATCLIENT_RECORDEDCHATLIST_VIEW_TITLE ); + iViewSwitcher.CAStatusPane()->ShowTabGroupL( KUidRecordedChatListView ); + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::SizeChanged() +// Called by framework when the view size is changed +// --------------------------------------------------------- +// +void CCARecordedChatsContainer::SizeChanged() + { + TAknLayoutRect rp; + + rp.LayoutRect( Rect(), AknLayoutScalable_Apps::im_reading_pane( + TChatListBoxLayout::EWithoutEditor ) ); + + // set rect for chat view + if ( iChatView ) + { + iChatView->SetRect( rp.Rect() ); + } + DrawNow(); + } + +// --------------------------------------------------------- +// CCAConversationsContainer::Draw(const TRect& aRect) const +// --------------------------------------------------------- +// +void CCARecordedChatsContainer::Draw( const TRect& aRect ) const + { + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + CWindowGc& myGc = SystemGc(); + + if ( !AknsDrawUtils::Background( skin, + iSkinVar->MainPaneBackgroundContext(), + myGc, aRect ) ) + { + myGc.Clear( aRect ); + } + } + + +// --------------------------------------------------------- +// CCARecordedChatsContainer::CountComponentControls() const +// Number of components +// --------------------------------------------------------- +// +TInt CCARecordedChatsContainer::CountComponentControls() const + { + return iChatView ? 1 : 0; // return nbr of controls inside this container + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::ComponentControl(TInt aIndex) const +// return component by index +// --------------------------------------------------------- +// +CCoeControl* CCARecordedChatsContainer::ComponentControl( TInt aIndex ) const + { + switch ( aIndex ) + { + case 0: + { + return iChatView; + } + default: + { + return NULL; + } + } + } + + +// --------------------------------------------------------- +// CCARecordedChatsContainer::OfferKeyEventL() +// Handles key events +// (other items were commented in a header). +// --------------------------------------------------------- +// +TKeyResponse CCARecordedChatsContainer::OfferKeyEventL( + const TKeyEvent& aEvent, TEventCode aType ) + { + if ( aType != EEventKey ) + { + return EKeyWasNotConsumed; + } + + switch ( aEvent.iCode ) + { + // flowthrough + case EKeyLeftArrow: + case EKeyRightArrow: + { + return EKeyWasConsumed; + } + case EKeyBackspace: + { + if ( iRecordedChatArrayProvider.DeleteChatL() ) + { + iViewSwitcher.SwitchViewL( KUidRecordedChatListView ); + } + return EKeyWasConsumed; + } + + // flowthrough + case EKeyEnter: + case EKeyOK: + { + ShowContextMenuL( EKeyActivation ); + return EKeyWasConsumed; + } + case EKeyPhoneSend: + { + if ( iSendkeyInMsgList ) + { + if ( aEvent.iCode == EKeyPhoneSend + && iChatView->Highlighted() + && iChatView->SelectedItemType() + == CFindItemEngine::EFindItemSearchPhoneNumberBin ) + { + // Phone number highlighted, send key pressed -> call + iAppUI->ProcessCommandL( EChatClientCall ); + } + } + return EKeyWasConsumed; + } + default: + { + TKeyResponse res = EKeyWasNotConsumed; + if ( iChatView ) + { + res = static_cast( iChatView )->OfferKeyEventL( aEvent, aType ); + } + + if ( aEvent.iCode == EKeyDownArrow || aEvent.iCode == EKeyUpArrow ) + { + UpdateCbaL(); + } + + return res; + } + } + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::GetHelpContext +// This function is called when Help application is launched +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCARecordedChatsContainer::GetHelpContext( + TCoeHelpContext& aContext ) const + { + aContext.iMajor = KUidChatClient; + aContext.iContext = KIMNG_HLP_SAVED_VIEW ; + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::HandleTapEventL +// --------------------------------------------------------- +// +void CCARecordedChatsContainer::HandleTapEventL( TTapEvent aEvent, + TUint /*aControlId*/ ) + { + // Forward taps to ShowContextMenuL() + if ( aEvent == MCATapEventObserver::EDoubleTap ) + { + ShowContextMenuL( EDoubleClick ); + } + else if ( aEvent == MCATapEventObserver::ESingleTap ) + { + ShowContextMenuL( ESingleClick ); + } + } + + +// --------------------------------------------------------- +// CCARecordedChatsContainer::LoadBitmapsL +// --------------------------------------------------------- +// +void CCARecordedChatsContainer::LoadBitmapsL() + { + //load "from me" icon + TBool overrideBrand( AknLayoutUtils::LayoutMirrored() ); + + CGulIcon* iconTemp; + + iconTemp = iSkinVar->LoadBitmapL( EMbmChatngQgn_prop_im_from, + EMbmChatngQgn_prop_im_from_mask, + iAppUI->MbmFullPath(), + overrideBrand ); + CleanupStack::PushL( iconTemp ); + IMUtils::UpdateIcon( iFromMe, iconTemp ); + //iconTemp is removed from CleanupStack and does not have valid value + + //it can be safely reused + iconTemp = iSkinVar->LoadBitmapL( EMbmChatngQgn_prop_im_tome, + EMbmChatngQgn_prop_im_tome_mask, + iAppUI->MbmFullPath(), + overrideBrand ); + CleanupStack::PushL( iconTemp ); + IMUtils::UpdateIcon( iToMe, iconTemp ); + //iconTemp is removed from CleanupStack and does not have valid value + + + //it can be safely reused + iconTemp = iSkinVar->LoadBitmapL( EMbmChatngQgn_prop_image_corrupted, + EMbmChatngQgn_prop_image_corrupted_mask, + iAppUI->MbmFullPath() ); + CleanupStack::PushL( iconTemp ); + IMUtils::UpdateIcon( iCorrupted, iconTemp ); + //iconTemp is removed from CleanupStack and does not have valid value + + //it can be safely reused + iconTemp = iSkinVar->LoadBitmapL( EMbmChatngQgn_prop_unknown, + EMbmChatngQgn_prop_unknown_mask, + iAppUI->MbmFullPath() ); + CleanupStack::PushL( iconTemp ); + IMUtils::UpdateIcon( iUnsupported, iconTemp ); + //iconTemp is removed from CleanupStack and does not have valid value + + TAknLayoutRect rp; + + /*The argument 2: TChatListBoxLayout::EWithoutEditor*/ + rp.LayoutRect( Rect(), AknLayoutScalable_Apps::im_reading_pane( 2 ) ); + + TAknLayoutText text; + text.LayoutText( rp.Rect(), + AknLayoutScalable_Apps::im_reading_pane_t1( 1 ).LayoutLine() ); + + TSize size( text.TextRect().Height(), text.TextRect().Height() ); + AknIconUtils::SetSize( iFromMe->Bitmap(), size ); + AknIconUtils::SetSize( iToMe->Bitmap(), size ); + iAppUI->MessageHandler().SizeChanged( size ); + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::IsStopped() +// This method checks if scroll mode is on or off +// --------------------------------------------------------- +// +TBool CCARecordedChatsContainer::IsStopped() const + { + return iChatView ? iChatView->Highlighted() : EFalse; + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::SelectedItem() +// --------------------------------------------------------- +// +HBufC* CCARecordedChatsContainer::SelectedItemL() + { + return iChatView ? iChatView->SelectedItemL() : KNullDesC().AllocL(); + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsContainer::SelectedItemType +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCARecordedChatsContainer::SelectedItemType() + { + return iChatView ? iChatView->SelectedItemType() : KErrNotFound; + } + +// logic: +// 1. no groups/groups not supported --> hide "to group" +// 2. no contacts --> hide "to contact" +// 3. 1 and 2 --> hide forward menu completely +// 4. contacts, but no online contacts, show All contacts are Offline +// 5. skip always the current contact we're conversing with + +// --------------------------------------------------------- +// CCARecordedChatsContainer::FwdContactVisible +// --------------------------------------------------------- +// +TBool CCARecordedChatsContainer::FwdContactVisible() + { + TInt numContacts( iRecordedChatsPC.StoredContactsCount() ); + + TBool showFwdToContact = numContacts > 0; + + CHAT_DP( D_CHAT_LIT( "CCARecordedChatsContainer::FwdContactVisible\ + - contacts %d, show %d" ), + numContacts, showFwdToContact ); + + return showFwdToContact; + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::FwdGroupVisible +// --------------------------------------------------------- +// +TBool CCARecordedChatsContainer::FwdGroupVisible() + { + // groups + TBool groupsSupported = iAppUI->UISessionManager().IsSupported( + CCAUISessionManager::EGroup ); + + TInt numGroups( 0 ); + TRAPD( err, numGroups = iRecordedChatsPC.GroupCountL( ETrue ) ); + if ( err != KErrNone ) + { + CActiveScheduler::Current()->Error( err ); + } + + // we have to have groups supported and visible to show the forward-menu + TBool showFwdToGroup = groupsSupported && ( numGroups > 0 ); + + CHAT_DP( D_CHAT_LIT( "CCARecordedChatsContainer::\ + FwdGroupVisible - fwd show group: %d" ), + ( TInt ) showFwdToGroup ); + + return showFwdToGroup; + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::IsObjectSelected +// --------------------------------------------------------- +// +TBool CCARecordedChatsContainer::IsObjectSelected( TBool& aIsOpenable, TBool& aSavePossible ) + { + MCAConversationMessage* msg = iChatView ? iChatView->SelectedMessage() : NULL; + if ( !msg ) + { + // Nothing selected + return EFalse; + } + + TBool object = EFalse; + + if ( msg->ContentType() == TEnumsPC::EContentPicture || + msg->ContentType() == TEnumsPC::EContentOther ) + { + // We have object + object = ETrue; + } + + + switch ( msg->ContentProcessState() ) + { + case TEnumsPC::EContentNotSupported: + case TEnumsPC::EContentCorrupted: + case TEnumsPC::EContentNotSupportedDrm: + { + // Not supported or corrupted, can't open + aIsOpenable = EFalse; + break; + } + case TEnumsPC::EThumbnailReady: + default: + { + if ( msg->ContentData().Length() == 0 ) + { + // No content, don't allow opening + aIsOpenable = EFalse; + } + else + { + // Allow opening + aIsOpenable = ETrue; + + //fix - refer Ui Spec Approved Version 1.0 + //(Instant Messaging NG 001 151006.pdf) + //Section 10.2.10 Pg 131 - + //"In case user has saved the image already or sent it + //by himself, this option(save) is not available." + aSavePossible = ( ( msg->MessagerType() == TEnumsPC::EMessageSent ) + || ( msg->IsImageSaved() ) ) + ? EFalse : ETrue ; + } + } + } + + return object; + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::SelectedMessage +// --------------------------------------------------------- +// +MCAConversationMessage* CCARecordedChatsContainer::SelectedMessage() + { + return iChatView ? iChatView->SelectedMessage() : NULL; + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::ForwardToGroupL() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCARecordedChatsContainer::ForwardToGroupL() + { + MCAConversationMessage* message = SelectedMessage(); + if ( !message ) + { + // nothing selected + return; + } + + + /** + * 1) PairsArray is Owned. Ownership is transferred from + * 2) There's no need to skip groups in this case. but we do need to make sure + the pairs are in correct order after sorting + * 3) We can use CCAServerContactsArray, as we deal with descriptor tuple + just as with contacts. the class naming is a bit misleading + */ + MCAServerContactsArrayPC* pairsArray + = iRecordedChatsPC.GetPairArrayForServerContactsArrayLC(); + + + HBufC* emptyText = iEikonEnv->AllocReadResourceLC( + R_CHAT_IBOX_FRIENDS_OFFLINE ); + HBufC* title = iEikonEnv->AllocReadResourceLC( + R_PRIVATE_CHAT_FORWARD_TITLE_GROUP ); + + TInt selectedIndex( 0 ); + TInt retVal( IMDialogUtils::DisplayListQueryDialogL( &selectedIndex, + pairsArray, + R_PRIVATE_CHAT_LIST_SELECT_RECIP_DLG, + *title, + *emptyText, ETrue ) ); + + CleanupStack::PopAndDestroy( 2, emptyText ); // title, emptyText + + if ( retVal == EAknSoftkeyOk || retVal == EAknSoftkeyDone + || retVal == EAknSoftkeySelect ) + { + // Check if there is highlighted item + HBufC* item = SelectedItemL(); + CleanupStack::PushL( item ); + + if ( item->Length() > 0 ) + { + // Set forwarded message + message->SetForwardPartL( item ); + } + else + { + // Clear previous forward part + message->SetForwardPartL( NULL ); + } + + CleanupStack::PopAndDestroy( item ); //item + //Bound checking on pairsArray + if ( selectedIndex >= 0 && selectedIndex < pairsArray->MdcaCount() ) + { + TInt err( iAppUI->GroupUtils()->JoinGroupL( EFalse, + pairsArray->WVIdL( selectedIndex )->iWVID, + KNullDesC, message ) ); + + if ( TEnumsPC::EUnregistered == iAppUI->RetForwardTo() ) + { + iAppUI->SetResetForwardTo( TEnumsPC::ERegister ); + iAppUI->GroupUtils()->PrepareToSwitchBackL( iRecordedChatArrayProvider.RecordedChatName(), + KUidRecordedChatView, + KUidChatView ); + } + else if ( TEnumsPC::ERegister == iAppUI->RetForwardTo() ) + { + iAppUI->SetResetForwardTo( TEnumsPC::EAlreadyRegistered ); + } + if ( err ) + { + CActiveScheduler::Current()->Error( err ); + } + } + + } + + //always dont use CleanupStack::PopAndDestroy(pairsArray) + //because there might be a object slicing happening + //when the pairsArray is transferred from the creator + //to the caller. Hence one will end up deleting the wrong ptr. + //Hence it is better to use CleanupStack::PopAndDestroy(), as + //we dont know wat the creator has pushed onto the CleanupStack + CleanupStack::PopAndDestroy(); //pairsArray + } + + +// --------------------------------------------------------- +// CCARecordedChatsContainer::ForwardToContactL() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCARecordedChatsContainer::ForwardToContactL() + { + MCAConversationMessage* message = SelectedMessage(); + if ( !message ) + { + // nothing selected + return; + } + CDesCArray* selectedContacts = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( selectedContacts ); + + CDesCArray* selectedIdentifications = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( selectedIdentifications ); + + MCASkinVariant* skinVar = static_cast( iAppUI->Application() ) + ->VariantFactory()->SkinVariantL(); + + // show selection dialog + if ( !CCAContactSelectionDialog::ShowDialogL( + *selectedContacts, + *( iAppUI->GetProcessManager().GetArrayInterface() ), + *skinVar, + *( iAppUI->GetProcessManager().GetSettingsInterface() ), + iAppUI->MbmFullPath(), + TEnumsPC::ESingleSelect, + R_CONTACT_SELECTION_DIALOG, + *iViewSwitcher.CAStatusPane(), + selectedIdentifications ) ) + { + // no contacts + CleanupStack::PopAndDestroy( 2, selectedContacts ); // selectedContacts,selectedIdentifications + return; + } + + + // handle selected contact (if any) + if ( selectedContacts->MdcaCount() == 1 ) + { + TPtrC wvid( selectedContacts->MdcaPoint( 0 ) );//User ID + + // User made selection -> set temporary identification for the wv id + // Get identification through temp identification handler + // code merge 14 nov, 2006 + MCAMainViewArrayPC* mainViewArrayPC = iAppUI->GetProcessManager().GetArrayInterface(); + + + //Add the conversation item to open chats array before switching the view + mainViewArrayPC->InsertConversationItemL( wvid, + selectedIdentifications->MdcaPoint( 0 ) ); + + // Check if there is highlighted item + HBufC* item = SelectedItemL(); + CleanupStack::PushL( item ); + + if ( item->Length() > 0 ) + { + // Set forwarded message + message->SetForwardPartL( item ); + } + else + { + // Clear previous forward part + message->SetForwardPartL( NULL ); + } + + CleanupStack::PopAndDestroy( item ); + + // Store message, in case it gets deleted. + iAppUI->SetForwardMessageL( message ); + + TCADnlConvView dnlConView; + dnlConView.iWVID = wvid; + dnlConView.iIsForwarded = ETrue; + dnlConView.iForwardedMessage = iAppUI->ForwardMessage(); + dnlConView.iSAPChanged = EFalse; + dnlConView.iSwitchTab = EFalse; + TCADnlConvViewBuf convMsgBuf( dnlConView ); + CHAT_DP( D_CHAT_LIT( "**forward \"%S\" to contact %S" ), + &dnlConView.iForwardedMessage, &dnlConView.iWVID ); + + // prevent AppShell from flashing during view switch, + // flash the main view instead + // if refresh is required refreshview can be called. + iViewSwitcher.SwitchViewL( KUidConversationsView, KUidConvViewMsgId, + convMsgBuf ); + + + if ( TEnumsPC::EUnregistered == iAppUI->RetForwardTo() ) + { + iAppUI->SetResetForwardTo( TEnumsPC::ERegister ); + iAppUI->GroupUtils()->PrepareToSwitchBackL( iRecordedChatArrayProvider.RecordedChatName(), + KUidRecordedChatView, + KUidConversationsView ); + } + else if ( TEnumsPC::ERegister == iAppUI->RetForwardTo() ) + { + iAppUI->SetResetForwardTo( TEnumsPC::EAlreadyRegistered ); + } + + } + + CleanupStack::PopAndDestroy( 2, selectedContacts ); // selectedContacts, selectedIdentifications + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsContainer::SetItemHighlightL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCARecordedChatsContainer::SetItemHighlightL( TBool aHighlight ) + { + if ( iChatView ) + { + iChatView->SetHighlight( aHighlight ); + } + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::FreeMemoryForViewSwitch +// --------------------------------------------------------- +// +void CCARecordedChatsContainer::FreeMemoryForViewSwitch() + { + delete iChatView; + iChatView = NULL; + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::UpdateCbaL +// --------------------------------------------------------- +// +void CCARecordedChatsContainer::UpdateCbaL() + { + TInt cbaRes = R_CHAT_SOFTKEYS_OPTIONS_BACK__EMPTY; // Default: Options/Back + TBool ignore; + TBool unUsedParamSave = EFalse; + HBufC* item = iChatView ? iChatView->SelectedItemL() : NULL; + CleanupStack::PushL( item ); + + if ( IsObjectSelected( ignore , unUsedParamSave ) ) + { + // Options/Back/Open + cbaRes = R_CHAT_SOFTKEYS_OPTIONS_BACK__OPEN; + } + else if ( item && item->Length() > 0 ) + { + // automatic find item selected + cbaRes = R_CHAT_SOFTKEYS_OPTIONS_BACK__CONTEXTOPTIONS; + } + CleanupStack::PopAndDestroy( item ); + + CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current(); + cba->SetCommandSetL( cbaRes ); + cba->DrawNow(); + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::OpenContextMenuL +// --------------------------------------------------------- +// +void CCARecordedChatsContainer::ShowContextMenuL( + TContextLaunchEvent aLaunchEvent ) + { + if ( IMUtils::CRKeyL( KCRUidIMVariation, + KIMVariationKey ) & EIMFeatRecordedChatOptions ) + { + // New options + TBool ignore; + TBool unUsedParamSave( EFalse ); + if ( IsObjectSelected( ignore , unUsedParamSave ) ) + { + // Single click don't open objects + if ( aLaunchEvent != ESingleClick ) + { + iAppUI->ProcessCommandL( EChatClientOpenObject ); + } + } + else + { + // Double click don't open find menu + if ( SelectedItemType() != KErrNotFound && + aLaunchEvent != EDoubleClick ) + { + iRecipientObserver.ShowPopUpMenuL(); + } + } + } + else if ( aLaunchEvent == EDoubleClick || + aLaunchEvent == EKeyActivation ) + { + // Old options + iRecipientObserver.ShowPopUpMenuL(); + } + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::HandleControlEventL +// --------------------------------------------------------- +// +void CCARecordedChatsContainer::HandleControlEventL( CCoeControl* aControl, + TCoeEvent aEventType ) + { + if ( CATouchUtils::PenEnabled() ) + { + + if ( EEventRequestFocus == aEventType ) + { + if ( aControl == ( CCoeControl* )iChatView ) + { + // Focus to editor + UpdateCbaL(); + } + } + } + } + +// --------------------------------------------------------- +// CCARecordedChatsContainer::HandleMessageAddedL +// --------------------------------------------------------- +// +void CCARecordedChatsContainer::HandleMessageAddedL( const TInt /*aMessageCount*/ ) + { + UpdateCbaL(); + + iChatView->UnRegisterRichTxtCtrlObserver(); + } + +// End of File +