imstutils/imconversationview/imcvuiapp/src/cimcvappviewcontainer.cpp
changeset 0 5e5d6b214f4f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imstutils/imconversationview/imcvuiapp/src/cimcvappviewcontainer.cpp	Tue Feb 02 10:12:18 2010 +0200
@@ -0,0 +1,1306 @@
+/*
+* Copyright (c) 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:
+* Export help related files.
+*
+*/
+
+// INCLUDE FILES
+#include	"cimcvappviewcontainer.h"
+
+#include    "cimcvengine.h"
+#include 	"mimcvenginemessagesreadinterface.h"
+#include 	"mimcvenginemessageswriteinterface.h"
+#include    "cimcvappviewcontrol.h"
+#include 	"cimcvenginemessagecreator.h"
+#include    "mimcvenginemessage.h"
+#include	"cimcvappui.h"
+#include 	"imcvuiappnotemapper.h"
+#include 	"mimcvapplayoutinfo.h"
+#include 	"imcvlogger.h"
+#include 	"cimcvappbitmapmapping.h"
+#include 	"mimcvuiappskinvariant.h"
+#include 	"imcvuiapputils.h"
+#include 	"cimcvappmessageextensionshandler.h"
+#include 	"mimcvenginemessagecontainerinfo.h"
+#include 	"mimcvenginemessagehandler.h"
+#include 	"mimcvrecipientobserver.h"
+#include    "imcvuiapp.hrh"
+//consts
+#include 	"imcvuiliterals.h"
+#include    "imcvuiapp.h"
+#include    <StringLoader.h>
+#include 	<txtrich.h>
+#include    <aknlayout.cdl.h> //cdl 
+#include    <applayout.cdl.h> //cdl 
+#include    <AknsUtils.h>
+#include    <aknlayoutscalable_apps.cdl.h>
+#include    <aknnotewrappers.h>
+#include    <AknFepGlobalEnums.h> // for EAknFepSoftkeySpell
+#include    <AknIconUtils.h>
+
+#include 	<imcvuiapp.rsg>
+#include 	<imerrors.hrh>
+
+#include "conversations.h"
+
+#include "cimcvapplogineventlistener.h"
+#include "cimcvappwaitnote.h"
+#include <aknEditStateIndicator.h>
+#include <AknIndicatorContainer.h>
+
+#include "mimcvenginecchhandler.h"
+#include "mimcvenginemessageswriteinterface.h"
+#include "mimcvenginechatinterface.h"
+
+#include <finditemengine.h>
+
+#include <e32property.h>
+#include "cimcvappview.h"
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// CIMCVAppViewContainer::NewL
+// Symbian constructor can leave.
+// -----------------------------------------------------------------------------
+//
+CIMCVAppViewContainer* CIMCVAppViewContainer::NewL( 
+            const TRect& aRect,
+            CIMCVEngine* aEngine,
+            MIMCVEngineMessageReadInterface* aReadInterface,
+		    MIMCVEngineMessageWriteInterface* aWriteInterface,
+		    CIMCVAppView* aParent,
+            CIMCVAppMessageExtensionsHandler& aMessageHandler,
+			CEikButtonGroupContainer* aCba,
+			const TDesC& aRecipientId,			
+			MIMCVRecipientObserver* aRecipientObserver,
+            CIMCVAppRichTextContainerCache* aRTContainerCache,
+            CGulIcon* aFromMe, CGulIcon* aToMe)
+	{
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::NewL()  start") );
+	CIMCVAppViewContainer* self = new ( ELeave )
+			 CIMCVAppViewContainer(aEngine,aReadInterface,aWriteInterface,
+			aMessageHandler, aCba, aRecipientObserver,*aParent, aRTContainerCache );
+
+	CleanupStack::PushL( self );
+	self->ConstructL( aRect, aParent, aFromMe, aToMe,aRecipientId);
+	CleanupStack::Pop( self );
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::NewL()  end") );
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CIMCVAppViewContainer::CIMCVAppViewContainer
+// Default constructor must not leave
+// -----------------------------------------------------------------------------
+//
+CIMCVAppViewContainer::CIMCVAppViewContainer(CIMCVEngine* aEngine,
+			MIMCVEngineMessageReadInterface* aReadInterface,
+		    MIMCVEngineMessageWriteInterface* aWriteInterface, 
+            CIMCVAppMessageExtensionsHandler& aMessageHandler,
+			CEikButtonGroupContainer* aCba,
+			MIMCVRecipientObserver* aRecipientObserver,
+			CIMCVAppView& aAppView,
+            CIMCVAppRichTextContainerCache* aRTContainerCache):
+            iActiveEngine(aEngine),
+  iReadInterface(aReadInterface),
+  iWriteInterface(aWriteInterface),
+  iMessageExtensionsHandler( aMessageHandler ),
+  iCba( aCba ),
+  iRecipientObserver( aRecipientObserver ),  
+  iAppView(aAppView),
+  iRTContainerCache(aRTContainerCache)
+    {
+    IM_CV_LOGS(TXT("CIMCVAppViewContainer::CIMCVAppViewContainer() start") );
+    // take virtual ownership of interfaces, so that they are not deleted
+    IM_CV_LOGS(TXT("CIMCVAppViewContainer::CIMCVAppViewContainer() end") );
+   	}
+
+// -----------------------------------------------------------------------------
+// CIMCVAppViewContainer::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppViewContainer::ConstructL( const TRect& aRect, 
+                                            MObjectProvider* aParent,                                            
+                                            CGulIcon* aFromMe, CGulIcon* aToMe,
+                                            const TDesC& aRecipientId )
+	{	
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::ConstructL() start") );
+	// for getting mbm path from CIMCVAPPAppUi
+	iRecipientId = aRecipientId.AllocL();
+	
+	iAppUi = static_cast<CIMCVAppUi*>( CEikonEnv::Static()->AppUi() );
+	iAppUi->AddLayoutChangeObserver( this );
+
+	// This must be done first.
+	SetMopParent( aParent );
+	CreateWindowL();
+
+	iSkinVaiant = iAppUi->SkinVariantL();
+
+	iFromMe = aFromMe;
+	iToMe = aToMe;
+	//Load from-me and to-me icons
+	if(!iFromMe)
+	    {
+	    iFromMe = LoadBitmapL(KEMbmImcvuiappQgnpropimfrom,EMbmImcvuiappQgn_prop_im_from,EMbmImcvuiappQgn_prop_im_from_mask);
+	    }
+	if(!iToMe)
+	    {
+	    iToMe = LoadBitmapL(KEMbmImcvuiappQgnpropimtome,EMbmImcvuiappQgn_prop_im_tome,EMbmImcvuiappQgn_prop_im_tome_mask );
+	    }
+
+
+	iMsgEditor = CIMCVAppMessageEditor::NewL(this, iAppUi->MbmFullPath(), iAppView,
+	        iMessageExtensionsHandler );
+	iMsgEditor->SetMessageEditorObserver(this);
+	//Sets the previously typed message in the editor
+	iMsgEditor->SetTextL( iReadInterface->GetEditerMessage() );
+	iChatView = CIMCVAppViewControl::NewL( aRect,
+                            	        *this,
+                            	        *iReadInterface,
+                            	        iMessageExtensionsHandler,
+                            	        iFromMe, 
+                            	        iToMe,
+                            	        *iRTContainerCache,
+                            	        *iActiveEngine );
+	iChatView->SetObserver( this );
+	iMsgEditor->SetObserver( this );
+
+	iAppUi->LayoutInfo()->SetLayoutID( TChatListBoxLayout::EWithEditor );
+	iAppUi->LayoutInfo()->SetEditorVisibility( ETrue );
+
+	SetRect( aRect );
+	
+	iMsgEditor->Editor().SetCursorPosL(0, EFalse);
+	iChatView->SetFocus( EFalse );
+	iMsgEditor->SetFocus(EFalse);
+
+	ActivateL();
+
+	iChatView->SetTapObserver( this, EMessageList );
+	iMsgEditor->SetTapObserver( this, EMessageEditor );
+
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::ConstructL() end") );
+	}
+
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::~CIMCVAppViewContainer()
+// ---------------------------------------------------------
+//
+CIMCVAppViewContainer::~CIMCVAppViewContainer()
+    {
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::DESTRUCTING() DESTRUCTER GETTING CALLED end") );    
+    if(iChatView)
+        {
+        delete iChatView;
+        }
+    if(iEditorMessage)
+        {
+        delete iEditorMessage;
+        }
+    delete iMsgEditor;
+    if( iAppUi )
+        {
+        if( !iAppUi->IsUnderDestruction() )
+            {
+            iAppUi->LayoutInfo()->SetEditorVisibility( EFalse );
+            iAppUi->RemoveLayoutChangeObserver( this );
+            }
+        }	
+    }
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::SetServiceParametersL()
+// This method is called when scrolling is started again
+// ---------------------------------------------------------
+//          
+void CIMCVAppViewContainer::SetServiceParametersL( 
+                                CIMCVEngine* aNewEngine )
+    {
+    iActiveEngine = aNewEngine;
+    }
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::StartScrollingL()
+// This method is called when scrolling is started again
+// ---------------------------------------------------------
+//
+void CIMCVAppViewContainer::StartScrollingL()
+	{
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::StartScrollingL() start") );
+	// disable highlight and set focus to editor
+    if( iChatView->Highlighted() )
+        {
+        iChatView->DisableHighlightL();
+        }       
+    iMsgEditor->SetFocus( ETrue, EDrawNow );
+    iMsgEditor->DrawDeferred();
+    UpdateCbaL();
+    iAppView.UpdateToolbarButtonsStateL();
+    IM_CV_LOGS(TXT("CIMCVAppViewContainer::StartScrollingL() end") );
+	}
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::StopScrollingL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppViewContainer::StopScrollingL()
+	{
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::StopScrollingL() start") );
+	// unfocus editor (highlighting is enabled 
+	// automatically in OfferKeyEvent of ChatView)
+	iMsgEditor->SetFocus( EFalse, EDrawNow );
+	iMsgEditor->DrawDeferred();
+    // Set editor cursor pos to end of text
+	iMsgEditor->Editor().SetCursorPosL( iMsgEditor->TextLength(), EFalse );
+    UpdateCbaL();
+    iAppView.UpdateToolbarButtonsStateL();
+    IM_CV_LOGS(TXT("CIMCVAppViewContainer::StopScrollingL() end") );
+	}
+
+void CIMCVAppViewContainer :: SmileyDialogLaunched (TBool aLaunched)
+    {
+    iChatView->SmileyDialogLaunched (aLaunched);
+    }
+void CIMCVAppViewContainer :: UpdateChatViewL ()
+    {
+    iChatView->UpdateChatViewL ();
+    }
+	
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::UpdateCbaL()
+// ---------------------------------------------------------
+//
+void CIMCVAppViewContainer::UpdateCbaL()
+    {
+    IM_CV_LOGS(TXT("CIMCVAppViewContainer::UpdateCbaL() start") );
+    if( iChatView->Highlighted() )
+        {
+        // focus on chatview
+        HBufC* item = iChatView->SelectedItemL();
+        CleanupStack::PushL( item );
+        if( item && item->Length() > 0 )
+            {
+            // automatic find item selected
+            TInt cbaRes = R_CV_SOFTKEYS_OPTIONS_BACK__CONTEXTOPTIONS;
+            iCba->SetCommandSetL( cbaRes );
+            iCba->DrawNow();
+            }
+        CleanupStack::PopAndDestroy( item );        
+        }
+    
+    IM_CV_LOGS(TXT("CIMCVAppViewContainer::UpdateCbaL() end") );    
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::HandleMessageEditorEventL()
+// ---------------------------------------------------------
+//
+void CIMCVAppViewContainer::HandleMessageEditorEventL( TEditorEvent aEvent )
+	{
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::HandleMessageEditorEventL() start") );
+	
+	switch( aEvent )
+        {
+	    case EEditorContentCleared: 
+	        {	        
+	        // Call StartScrollingL to update CBA if needed
+	        StartScrollingL();
+	        break;	
+	        }
+	    case EEditorContentChanged:
+	        {            
+	        // Call StartScrollingL to update CBA if needed
+	        if(!iMsgEditor->IsFocused())//!iEditor->IsFocused())
+	            {
+	            StartScrollingL();	
+	            }
+	        break;
+	        }
+	    default:
+	        {
+	        break;
+	        }
+        }    
+    // need to implements	
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::HandleMessageEditorEventL() end") );	
+	}
+
+
+void CIMCVAppViewContainer::StartConversationL()
+	{
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::StartConversationL() start") );
+	// start a conversation with selected user id,
+	// exist cache info fetch that
+	
+	iActiveEngine->MessageHandler().StartNewConversationL( *iRecipientId );
+	
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::StartConversationL() end") );
+	}
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::CloseConversationL()
+// This method handles message sending to engine
+// ---------------------------------------------------------
+//
+TInt CIMCVAppViewContainer::CloseConversationL(const TDesC& aBuddyId )
+	{
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::CloseConversationL()") );
+	// close the conversation with selected user id,
+	// exist cache info fetch that
+	iRTContainerCache->DeleteContainer(iReadInterface->Name() ,iActiveEngine->GetServiceId()  );
+	return iActiveEngine->MessageHandler().CloseConversationL( aBuddyId );
+	}
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::DeactivateConversationL()
+// This method handles message sending to engine
+// ---------------------------------------------------------
+//
+TInt CIMCVAppViewContainer::DeactivateConversationL()
+	{
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::DeactivateConversationL()") );
+	// start a conversation with selected user id,
+	// exist cache info fetch that
+	return iActiveEngine->MessageHandler().DeactivateConversationL();
+	}	
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::SendMessageL()
+// This method handles message sending to engine
+// ---------------------------------------------------------
+//
+void CIMCVAppViewContainer::SendMessageL()
+	{
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::SendMessageL() start") );
+	
+	TBool loggedIn = IsLoggedIn();
+	if( !loggedIn )
+		{
+		// load the promp from lOC file + server name
+		HBufC* prompt = StringLoader::LoadLC( R_SERVTAB_CONNECTION_NEEDED_TO, 
+		        iActiveEngine->ServiceName() );
+
+	    TInt ret = IMCVUiAppNoteMapper::DisplayQueryDialogL( R_GENERIC_YES_NO_CONFIRMATION_QUERY,
+	    												 *prompt );
+	    												 
+	    CleanupStack::PopAndDestroy( prompt );
+	    
+
+    	if( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) )
+	    	{
+			// load the promp from lOC file + server name
+			HBufC* prompt = StringLoader::LoadLC( R_SERVTAB_LOGIN_ONGOING, 
+			        iActiveEngine->ServiceName() );
+
+			CIMCVAppWaitNote* waitDialog = CIMCVAppWaitNote::ShowWaitNoteL( 
+			        *prompt, 
+			        ETrue );         
+						        
+			CleanupStack::PushL(waitDialog);
+			
+			// start capturing the events
+			iAppUi->CaptureEventsL();
+			
+			IM_CV_LOGS(TXT("CIMCVAppViewContainer::SendMessageL() BEFORE CALLING LOGIN") );
+			TRAPD(error, iActiveEngine->LoginL());
+			IM_CV_LOGS(TXT("CIMCVAppViewContainer::SendMessageL() AFTER CALLING LOGIN") );					
+			// stop capturing the events
+    		iAppUi->ReleaseCapturingL(); 
+			
+			IM_CV_LOGS(TXT("CIMCVAppViewContainer::SendMessageL() start") );
+			loggedIn = IsLoggedIn();
+			if (KErrNone != error)
+				{
+				IMCVUiAppNoteMapper::ShowNoteL( KImErrServiceGeneralError , KNullDesC );				
+				}
+			else
+			    {
+			    // subscribe for presence notification
+			    iActiveEngine->MessageHandler().SubscribePresenceL( *iRecipientId );
+			    }
+						
+			CleanupStack::PopAndDestroy(); //waitDialog
+			CleanupStack::PopAndDestroy(); //prompt
+	    	}		    	
+		}
+	
+	if( loggedIn )
+		{
+		if(iEditorMessage)
+			{
+			delete iEditorMessage;
+			iEditorMessage = NULL;	
+			}
+		iEditorMessage = iMessageExtensionsHandler.ProcessMessageLC( iMsgEditor->Editor(),
+		        iActiveEngine->GetServiceId() );
+		
+	    TPtr msgPtr( iEditorMessage->Des() );
+	    CleanupStack::Pop();//iEditorMessage   
+		
+		if( msgPtr.Length() == 0 )
+			{
+			return;	
+			}
+		
+		TPtrC ownUserId = iActiveEngine->GetLoggedInUserId() ;
+		
+		MIMCVEngineMessageCreator::SMessageData data =
+											{
+											KMessageDataVersion,
+											ownUserId,
+											*iRecipientId, // Recipient
+											msgPtr,
+											MIMCVEngineMessage::EContentText,
+											MIMCVEngineMessage::EMessageSent            
+											};
+	    MIMCVEngineMessage* message = iActiveEngine->MessageHandler().MessageCreator().CreateMessageL( data );
+	    
+	    iWriteInterface->AppendL(message );
+	   		
+	    iActiveEngine->MessageHandler().SendMessageL( *message );
+		
+		ResetAfterSendL();
+		StopScrollingL();
+		}
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::SendMessageL() end") );
+	}
+
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::InsertStatusChangedMessageL()
+// This method handles message sending to engine
+// ---------------------------------------------------------
+//
+void CIMCVAppViewContainer::InsertStatusChangedMessageL(CIMCVEngine& aEngine ,
+                                                        TInt aServiceId, 
+                                                        const TDesC& aBuddyId )
+	{
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::InsertStatusChangedMessageL() start") );
+	
+	TIMCVOnlineStatus status = 	aEngine.MessageHandler().GetPresenceStatus();
+	TInt resourceId(0);
+	switch( status ) 
+		{
+		case EOnline:
+			{
+			resourceId = R_SERVTAB_STATUS_CHANGE_ONLINE;
+			break;	
+			}
+		case EInvisible:
+			{
+			resourceId = R_SERVTAB_STATUS_CHANGE_ONTHEPHONE;
+			break;	
+			}
+		case EAway:
+			{
+			resourceId = R_SERVTAB_STATUS_CHANGE_AWAY;	
+			break;	
+			}
+		case EBusy:
+			{
+			resourceId = R_SERVTAB_STATUS_CHANGE_DND;
+			break;	
+			}
+		case EOnPhone:
+			{
+			resourceId = R_SERVTAB_STATUS_CHANGE_ONTHEPHONE;
+			break;	
+			}
+		case EDoNotDisturb:
+			{
+			resourceId = R_SERVTAB_STATUS_CHANGE_DND;
+			break;	
+			}
+		case EBlock:
+		    {
+		    resourceId = R_SERVTAB_STATUS_CHANGE_BLOCKED;
+		    break;
+		    }
+		case EOffline :
+		default:
+			{
+			resourceId = R_SERVTAB_STATUS_CHANGE_OFFLINE;
+			// default offline always
+			}
+		}
+	// not owned , chat interface
+	MIMCVEngineChatInterface* chatInterface = &(aEngine.ChatInterface() );
+	MIMCVEngineMessageReadInterface& readInterface =  chatInterface->MessageReadInterfaceL( aServiceId, aBuddyId ); 
+	
+	// cleanup stack
+	HBufC* textmessage = StringLoader::LoadLC( resourceId, readInterface.Name()  );
+	TPtrC textmessagePtr( textmessage->Des() );
+	
+	TPtrC ownUserId = aEngine.GetLoggedInUserId() ;
+	MIMCVEngineMessageCreator::SMessageData data =
+										{
+										KMessageDataVersion,
+										ownUserId,
+										aBuddyId, // Recipient
+										textmessagePtr,
+										MIMCVEngineMessage::EContentText,
+										MIMCVEngineMessage::EMessageOther            
+										};
+    MIMCVEngineMessage* message = aEngine.MessageHandler().MessageCreator().CreateMessageL( data );
+    
+    MIMCVEngineMessageWriteInterface& writeInterface =  chatInterface->MessageWriteInterfaceL( aServiceId, aBuddyId );
+    writeInterface.AppendL( message );
+  	
+   	// append message to cache , this is not sent/recieve message
+   	// based on status change message is automatically created
+  	aEngine.MessageHandler().AppendToCacheL( aBuddyId, textmessagePtr );
+   		
+	CleanupStack::PopAndDestroy();// textmessage
+		
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::InsertStatusChangedMessageL() end") );
+	}
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::ResetAfterSendL()
+// Resets arrays, lines and nick length after send
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppViewContainer::ResetAfterSendL()
+	{
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::ResetAfterSendL() start") );	
+	iMsgEditor->SetTextL(KNullDesC());
+	StartScrollingL();  // Call to update CBA
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::ResetAfterSendL() end") );
+	}
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::IsLoggedIn()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CIMCVAppViewContainer::IsLoggedIn() const
+	{
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::IsLoggedIn() ") );
+	
+	if (!iActiveEngine->IsLoggedIn()) 
+		{
+		return EFalse;
+		}
+
+	return ETrue;
+	}
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::IsStopped()
+// This method checks if scroll mode is on or off
+// ---------------------------------------------------------
+//
+TBool CIMCVAppViewContainer::IsStopped() const
+	{
+	return iChatView->Highlighted();
+	}
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::DisplayInfoNoteL()
+// Displays info note for corresponding resource id
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppViewContainer::DisplayInfoNoteL( const TInt aResourceId )
+	{
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::DisplayInfoNoteL() start") );
+	CAknNoteDialog* infoNote = new (ELeave) CAknNoteDialog( CAknNoteDialog::
+			EConfirmationTone,CAknNoteDialog::EShortTimeout );
+
+	infoNote->ExecuteLD( aResourceId );
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::DisplayInfoNoteL() end") );
+	}
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::LayoutChangedL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppViewContainer::LayoutChangedL( TInt aType )
+	{
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::LayoutChangedL() start") );
+    TRect mainPaneRect;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );
+    SetRect( mainPaneRect );    
+    // Update skin context of editor
+    if ( iMsgEditor )
+        {
+        iMsgEditor->HandleFindSizeChanged();
+        }        
+	if (iRTContainerCache && aType == KAknsMessageSkinChange)
+		{
+		iRTContainerCache->UpdateSkinTextColorL ();
+		}
+    CCoeControl::HandleResourceChange( aType );
+    IM_CV_LOGS(TXT("CIMCVAppViewContainer::LayoutChangedL() end") );
+	}
+
+    
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::SelectedItem()
+// ---------------------------------------------------------
+//
+HBufC* CIMCVAppViewContainer::SelectedItemL()
+    {
+    return iChatView->SelectedItemL();
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppViewContainer::SelectedItemType
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CIMCVAppViewContainer::SelectedItemType()
+    {
+    return iChatView->SelectedItemType();
+    }
+// -----------------------------------------------------------------------------
+// CIMCVAppViewContainer::SetItemHighlightL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppViewContainer::SetItemHighlightL( TBool aHighlight )
+    {
+    iChatView->SetHighlight( aHighlight );
+	DrawNow ();
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::HandleEdwinSizeEventL( CEikEdwin* aEdwin,
+// TEdwinSizeEvent aEventType, TSize aDesirableEdwinSize )
+// This method is called when editor is extended to two lines
+// ---------------------------------------------------------
+//
+TBool CIMCVAppViewContainer::HandleEdwinSizeEventL( CEikEdwin* /*aEdwin*/,
+			TEdwinSizeEvent aEventType, TSize /*aDesirableEdwinSize*/ )
+	{
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::HandleEdwinSizeEventL() start") );
+	if (aEventType == EEventSizeChanging )
+		{		
+		iMsgEditor->HandleFindSizeChanged();
+		DrawNow();
+		return ETrue;
+		}
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::HandleEdwinSizeEventL() end") );
+	return EFalse;
+	}
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::HandleControlEventL
+// ---------------------------------------------------------
+//    
+void CIMCVAppViewContainer::HandleControlEventL( CCoeControl* aControl,
+                                                     TCoeEvent aEventType )
+    {
+   
+    IM_CV_LOGS(TXT("CIMCVAppViewContainer::HandleControlEventL() start") );
+    if( EEventRequestFocus == aEventType )
+        {
+        if( aControl == static_cast<CCoeControl*>(iMsgEditor) )
+            {
+            // Focus to editor
+            StartScrollingL();
+            }
+        else // aControl == iChatView
+            {
+            // Focus to messagelist
+            StopScrollingL();
+            }
+        }
+
+    if( IMCVUiAppUtils::PenEnabled() )
+        {
+        if( EEventStateChanged == aEventType )
+            {
+            if( aControl == (CCoeControl*)iMsgEditor )
+                {
+                // Update MSK - When using virtual keyboard
+                // on touch enabled devices, one is bound to receive
+                // EEventStateChanged. Hence handle the same
+                UpdateCbaL();
+                }        
+            }
+        }
+
+    IM_CV_LOGS(TXT("CIMCVAppViewContainer::HandleControlEventL() end") );
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::SizeChanged()
+// Called by framework when the view size is changed
+// ---------------------------------------------------------
+//
+void CIMCVAppViewContainer::SizeChanged()
+    {
+    IM_CV_LOGS(TXT("CIMCVAppViewContainer::SizeChanged() start") );
+
+    TAknLayoutRect rp;
+
+    rp.LayoutRect( Rect(), AknLayoutScalable_Apps::im_reading_pane(
+                   TChatListBoxLayout::EWithEditor2Lines) );	
+    // Set icon sizes, do this before setting the rect for 
+    // chat view to prevent icon sizes from changing after chat
+	
+    // view rect is set.
+	ResizeIcons( TextRect() );
+	
+	// set rect for chat view
+	iChatView->SetRect( rp.Rect() );	
+    // and editor	
+	iMsgEditor->HandleFindSizeChanged();
+    DrawNow();
+    IM_CV_LOGS(TXT("CIMCVAppViewContainer::SizeChanged() end") );
+	}
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::CountComponentControls() const
+// ---------------------------------------------------------
+//
+TInt CIMCVAppViewContainer::CountComponentControls() const
+    {
+	// We have 2 controls
+	return 2;
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::ComponentControl(TInt aIndex) const
+// ---------------------------------------------------------
+//
+CCoeControl* CIMCVAppViewContainer::ComponentControl( TInt aIndex ) const
+    {
+	//returns control with aIndex
+	switch ( aIndex )
+		{
+		case 0:
+			{
+			return iChatView;
+			}
+		case 1:
+			{
+			return iMsgEditor;
+			}
+		default:
+			{
+			return NULL;
+			}
+		}
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::Draw(const TRect& aRect) const
+// ---------------------------------------------------------
+//
+void CIMCVAppViewContainer::Draw( const TRect& aRect ) const
+    {
+    IM_CV_LOGS(TXT("CIMCVAppViewContainer::Draw() const start") );
+  	CWindowGc& gc = SystemGc();  	  	 	
+    
+    iSkinVaiant->ClearChatListBoxBackGround( 
+                                    gc, aRect, 
+                                    iSkinVaiant->MainPaneBackgroundContext() );
+	
+	IM_CV_LOGS(TXT("CIMCVAppViewContainer::Draw() const end") );
+	}
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+//												  TEventCode aType )
+// Handles keyevents
+// ---------------------------------------------------------
+//
+TKeyResponse CIMCVAppViewContainer::OfferKeyEventL( 
+            const TKeyEvent& aKeyEvent,
+			TEventCode aType )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppViewContainer::OfferKeyEventL() start") );   
+    IM_CV_LOGS(TXT("CIMCVAppViewContainer::OfferKeyEventL() is EKeyPhoneSend Event = %d") , aKeyEvent.iCode );
+
+    //Consume the EEventKeyUp event for send key so that it will not launch the dialler before sending the actual message.
+    if ( aKeyEvent.iScanCode == EStdKeyYes && aType != EEventKey )
+        {
+        return EKeyWasConsumed;
+        }
+   
+    if( (iChatView->Highlighted() ) || ( !iMsgEditor->IsFocused()) )
+        {
+        if( (aKeyEvent.iScanCode >= '0' && aKeyEvent.iScanCode <= '9') ||
+            (aKeyEvent.iScanCode >= 'a' && aKeyEvent.iScanCode <= 'z') ||
+            (aKeyEvent.iScanCode >= 'A' && aKeyEvent.iScanCode <= 'Z') ||
+            (aKeyEvent.iScanCode >= EStdKeyComma && aKeyEvent.iScanCode <= EStdKeyNkpPlus) ||
+            aKeyEvent.iScanCode == EStdKeySpace || aKeyEvent.iScanCode == EStdKeyLeftShift )
+            {
+            // stop the automatic scrolling and start manual 
+            // if user presses any of the number keys (0-9)
+			// or user presses any key on the QWERT - key pad
+            StartScrollingL();
+            return EKeyWasConsumed;
+            }
+        }
+    
+    
+    switch( aKeyEvent.iCode )
+        {
+        // flowthrough
+        case EKeyEnter:
+        case EKeyOK:
+        case EKeyPhoneSend:
+            {
+            if( iMsgEditor->IsFocused() )
+			    {
+			    IM_CV_LOGS(TXT("CIMCVAppViewContainer::OfferKeyEventL() message editor Focused ") );   
+                // trapping error so that focus can be returned to editor
+                SendMessageL() ;
+                IM_CV_LOGS(TXT("CIMCVAppViewContainer::OfferKeyEventL() message Sent ") ); 
+                iMsgEditor->SetFocus( ETrue );
+			    }
+            else if( aKeyEvent.iCode == EKeyEnter || aKeyEvent.iCode == EKeyOK                    
+                     && iChatView->Highlighted() && iChatView->SelectedItemType()
+                     != CFindItemEngine::EFindItemSearchPhoneNumberBin )
+                {
+                StopScrollingL();
+                iRecipientObserver->ShowPopUpMenuL();
+                }
+            else if ( aKeyEvent.iCode == EKeyPhoneSend
+                                && iChatView->Highlighted()
+                                && (iChatView->SelectedItemType()
+                                    == (CFindItemEngine::EFindItemSearchPhoneNumberBin)
+                                    ||(CFindItemEngine::EFindItemSearchMailAddressBin)) )
+                {
+                 // Phone number highlighted, send key pressed -> call
+                 iAppUi->ProcessCommandL( EIMCVCmdCall );
+                }
+            //iAppView.UpdateToolbarButtonsStateL();
+            StopScrollingL();
+		    return EKeyWasConsumed;
+            }
+
+        case EKeyBackspace:
+            {
+			// if bitmap is selected, it is deleted "normally" in
+			// iEditor's OfferKeyEvent
+            if( iMsgEditor->Editor().SelectionLength() > 0 )
+				{
+				break;
+				}
+
+            TInt cursorPos( iMsgEditor->Editor().CursorPos() );
+			if( cursorPos > 0 ) // at least one char in editor
+				{
+                TPtrC ptr = iMsgEditor->Editor().RichText()->Read( ( cursorPos - 1 ), 1 );
+    			// if a char to be "backspaced" is a picture
+    			if( ptr[ 0 ] == CEditableText::EPictureCharacter )
+    				{
+                    iMessageExtensionsHandler.DeleteExtensionL( iMsgEditor->Editor(), iActiveEngine->GetServiceId(),
+                            EMessageExtensionSmiley, cursorPos - 1 );
+                    iAppView.UpdateToolbarButtonsStateL();
+					return EKeyWasConsumed;
+					}
+				}
+
+			if( cursorPos < 2 )
+				{
+				cursorPos = 2;
+				}
+		
+            break;
+            }
+
+        // flowthrough
+        case EKeyLeftArrow:
+        case EKeyRightArrow:
+            {
+            if( !iMsgEditor->IsFocused() )
+                {
+                iAppView.UpdateToolbarButtonsStateL();
+                return iAppView.OfferTabEventL(aKeyEvent, aType);
+                }
+            break;
+            }
+
+        case EKeyDownArrow: // flowthrough
+        case EKeyUpArrow:
+            {
+            if( iMsgEditor->IsFocused() )
+                {
+                iAppView.UpdateToolbarButtonsStateL();
+                // editor is focused, try to offer the key
+                if( iMsgEditor->OfferKeyEventL( aKeyEvent, aType ) 
+                        == EKeyWasConsumed )
+                    {
+                    // editor took it
+                    return EKeyWasConsumed;
+                    }
+                }
+                
+            // offer the key to our chat control
+            TKeyResponse res = static_cast<CCoeControl*>(iChatView)
+                                        ->OfferKeyEventL( aKeyEvent, aType );
+            
+            if( iChatView->Highlighted() )
+                {
+                // change the cba
+                StopScrollingL();
+                }
+            else
+                {
+                // change the cba
+                StartScrollingL();
+                }
+            iAppView.UpdateToolbarButtonsStateL();
+            return res;
+            }
+
+        default:
+            {
+            break;
+            }
+        }
+    if ( iMsgEditor->IsFocused() )
+        {           
+
+        TKeyResponse res = iMsgEditor->OfferKeyEventL( aKeyEvent, aType );
+        iAppView.UpdateToolbarButtonsStateL();        
+        // Update CBA only when there is not a shift held down        
+        if ( !( aKeyEvent.iModifiers & EModifierShift ) )
+            {
+            UpdateCbaL();
+            }
+        //If focus is on editer and its empty, and if user presses left arrow or right arrow keys. 
+        //Move the focus to Message list to switch the tabs
+        if((res == EKeyWasNotConsumed)&& (iMsgEditor->TextLength() == 0) && (aType == EEventKeyDown) &&
+                ((aKeyEvent.iScanCode == EStdKeyLeftArrow) || (aKeyEvent.iScanCode == EStdKeyRightArrow)))
+            {
+            StopScrollingL();       //Move the focus to Message list 
+            }              
+        iAppView.UpdateToolbarButtonsStateL();
+        return res;
+        }
+    return EKeyWasNotConsumed;
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::Editor
+// Handles operation completion
+//	
+CIMCVAppMessageEditor& CIMCVAppViewContainer::Editor()	const
+	{
+	return *iMsgEditor;
+	}
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::RefreshEditorL
+// Handles operation completion
+//
+void CIMCVAppViewContainer::RefreshEditorL()
+    {
+    //iMsgEditor->Editor().TextView()->HandleCharEditL(CTextLayout::EFCharacterInsert) ;
+    iMsgEditor->Editor().DrawDeferred();
+    iAppView.UpdateToolbarButtonsStateL();
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppSmileIconUtility::LoadBitmapL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CGulIcon* CIMCVAppViewContainer::LoadBitmapL(const TDesC8& /*aId*/,const TInt aBitmapId,const TInt aMaskId)
+	{
+    
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconUtility::LoadBitmapL() start") );
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* mask = NULL;
+    CGulIcon* gulIcon;
+    
+    if(0)
+        {
+        /* PPARTH
+    	TRAPD(err_bitmap, iBrandingAccess->GetBitmapL( aId, bitmap, mask ));
+		if(KErrNone != err_bitmap)
+			{
+			User::Leave( err_bitmap );
+			}
+		gulIcon = CGulIcon::NewL(bitmap,mask);
+         */
+        }
+    else
+    	{
+		TRgb* aCustomColor = NULL;
+
+		MAknsSkinInstance* skin = AknsUtils::SkinInstance();	
+
+		TAknsItemID itemId( KAknsIIDNone );
+		TInt colorGroupId( 0 );
+
+		MapFromBitmapIdToAknsItemId( aBitmapId, itemId, colorGroupId );
+
+		if( colorGroupId == 0 )
+			{
+
+			// Special case, these icons are using the same color 
+			// and color group as text
+			if ( aCustomColor )
+				{
+				// If user has set a special color for text
+				AknIconUtils::CreateIconLC( bitmap, mask,  iAppUi->MbmFullPath() , 
+				        aBitmapId, aMaskId );                
+				AknIconUtils::SetIconColor( bitmap, *aCustomColor );		                                    
+				}
+			else
+				{
+				AknsUtils::CreateColorIconLC( skin, 
+								itemId, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6, 
+								bitmap, mask,  iAppUi->MbmFullPath() , 
+								aBitmapId, 
+								aMaskId, 
+								KRgbBlack );		        
+				}
+		
+			}
+		else
+			{
+			AknsUtils::CreateIconLC( skin, 
+							itemId, 
+							bitmap, mask, iAppUi->MbmFullPath(), 
+							aBitmapId,
+							aMaskId );    
+			}
+       	gulIcon = CGulIcon::NewL( bitmap, mask );
+        CleanupStack::Pop( 2 ); // bitmap, mask
+    	}
+
+       IM_CV_LOGS(TXT("CIMCVAppSmileIconUtility::LoadBitmapL() End") );
+    return gulIcon;
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// CIMCVAppViewContainer::MapFromBitmapIdToAknsItemId
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppViewContainer::MapFromBitmapIdToAknsItemId( TInt aBitmapId, 
+                                TAknsItemID& aItemId, TInt& aColorGroupId )
+	{
+    for( TInt i( 0 ); KCABitmaps[i].iBitmapId != KErrNotFound; i++ )
+        {
+        if( KCABitmaps[ i ].iBitmapId == aBitmapId )
+            {
+            // found it
+            
+            aItemId = *(KCABitmaps[ i ].iItemId);
+            aColorGroupId = KCABitmaps[ i ].iColorGroupId;
+            return;
+            }
+        }
+    
+    // not found
+    
+    IM_CV_LOGS(TXT("!!!!!!!! every bitmap enumeration should be found from \
+                  CABitmapMapping.h !!!!!!!! ") );  
+    
+    }
+    
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::ResizeIcons
+// ---------------------------------------------------------
+//
+void CIMCVAppViewContainer::ResizeIcons( TRect aParentRect )   
+    {
+	TSize size( aParentRect.Height(), aParentRect.Height() );
+	AknIconUtils::SetSize( iFromMe->Bitmap(), size );
+	AknIconUtils::SetSize( iToMe->Bitmap(), size );
+	
+	iMessageExtensionsHandler.SizeChanged( size, iActiveEngine->GetServiceId() );	    
+    }
+
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::TextRect
+// ---------------------------------------------------------
+//    
+const TRect CIMCVAppViewContainer::TextRect() const
+    
+    {
+    TAknLayoutRect rp;    
+    rp.LayoutRect( Rect(), AknLayoutScalable_Apps::im_reading_pane(
+            TChatListBoxLayout::EWithEditor2Lines ) );
+    TAknLayoutText text;
+    text.LayoutText( rp.Rect(),
+            AknLayoutScalable_Apps::im_reading_pane_t1( 1 ).LayoutLine() );
+    
+    return text.TextRect();
+    }    
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::HandleTapEventL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppViewContainer::HandleTapEventL( TTapEvent aEvent, 
+                                                 TUint aControlId )
+    {
+    // Handle the tap events which occur in our child controls:
+    // Message list and Message editor.
+    switch( aControlId )
+        {
+        case EMessageList:
+            {
+            // Focused message was double tapped
+            if( aEvent == MIMCVTapEventObserver::EDoubleTap )
+                {
+                // To be implemented later
+                }
+            // Message or item was tapped
+            else if( aEvent == MIMCVTapEventObserver::ESingleTap 
+                    || aEvent == MIMCVTapEventObserver::EStartTap)
+                {
+                StopScrollingL();
+                // Find objects activate with single tap
+                iRecipientObserver->ShowPopUpMenuL();
+                }
+            break;
+            }
+        case EMessageEditor:
+            {
+            // Nothing to do here ATM.
+            // Focus transition is handled in HandleControlEventL
+            iMsgEditor->SetFocus(ETrue, EDrawNow);
+            iAppView.UpdateToolbarButtonsStateL();
+            break;
+            }
+        default:
+            {
+			break;
+            }
+        }
+    }
+
+//added for multitab support
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::SwitchViewL
+// ---------------------------------------------------------
+// 
+void CIMCVAppViewContainer::SwitchViewL( MIMCVEngineMessageReadInterface* aReadInterface,
+											MIMCVEngineMessageWriteInterface*  aWriteInterface,
+											const TDesC& aRecipientId )
+	{
+	if(iEditorMessage)
+        {
+        delete iEditorMessage;
+        iEditorMessage = NULL;  
+        }
+    iEditorMessage = iMessageExtensionsHandler.ProcessMessageLC( iMsgEditor->Editor(),iActiveEngine->GetServiceId() );
+    CleanupStack::Pop();  //  iEditorMessage
+    iReadInterface->StoreEditerMessageL( *iEditorMessage );
+    
+	//Clears any highlght from the chat before switching away from it
+    if( iChatView->Highlighted() )
+        {
+        iChatView->DisableHighlightL();
+        } 
+    
+	delete iChatView;
+	//iChatView is assigned NULL as NewL may leave
+	iChatView = NULL;
+	
+	iReadInterface = aReadInterface;
+	iWriteInterface = aWriteInterface;
+	
+	delete iRecipientId;
+	iRecipientId = NULL;
+	iRecipientId = aRecipientId.AllocL();
+	
+	iChatView = CIMCVAppViewControl::NewL( Rect(),
+									*this,
+									*iReadInterface,
+									iMessageExtensionsHandler,
+									iFromMe, 
+									iToMe,
+									*iRTContainerCache,
+									*iActiveEngine );
+		                
+    iChatView->SetObserver( this );        
+    
+    // Fix of TSW Bug Id - EJWU-72CB2C
+    UpdateCbaL(); 
+    
+    SizeChanged();
+    
+    // Observe tap events
+    iChatView->SetTapObserver( this, EMessageList );
+        
+    iAppUi->LayoutInfo()->SetLayoutID( TChatListBoxLayout::EWithEditor );
+	iAppUi->LayoutInfo()->SetEditorVisibility( ETrue );
+		
+	iActiveEngine->MessageHandler().StartNewConversationL( *iRecipientId );
+
+	const TDesC& message = iReadInterface->GetEditerMessage();
+
+	iMsgEditor->SetTextL( message);
+
+	iAppView.UpdateToolbarButtonsStateL();
+	}
+
+// ---------------------------------------------------------
+// CIMCVAppViewContainer::FetchMessages
+// ---------------------------------------------------------
+//
+void CIMCVAppViewContainer::FetchMessages( TBool aFetch )
+    {
+    if(iActiveEngine->IsLoggedIn())
+	    {
+    	iChatView->FetchMessages( aFetch );
+	    }
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppViewContainer: StoreEditorMessage
+// -----------------------------------------------------------------------------
+//TODO: move this function to cimcvappviewcontainer
+void CIMCVAppViewContainer::StoreEditorMessageL()
+    {
+    // save message typed in the editor.
+/*    HBufC* EditorMessage = NULL;
+    CIMCVAppMessageEditor& MsgEditor = iContainer->Editor();
+    EditorMessage = iExtensionHandler->ProcessMessageLC( MsgEditor.Editor(), iActiveEngine->GetServiceId() );
+    
+    // Getting the readInterface
+    MIMCVEngineMessageReadInterface& readInterface = 
+                iActiveChatInterface->MessageReadInterfaceL( iServiceId, *iRecipientUserId );
+    readInterface.StoreEditerMessageL( *EditorMessage );
+    
+    CleanupStack::PopAndDestroy();// EditorMessage*/
+    
+    if(iEditorMessage)
+        {
+        delete iEditorMessage;
+        iEditorMessage = NULL;  
+        }
+    iEditorMessage = iMessageExtensionsHandler.ProcessMessageLC( iMsgEditor->Editor(),iActiveEngine->GetServiceId() );
+    CleanupStack::Pop();  //  iEditorMessage
+    iReadInterface->StoreEditerMessageL( *iEditorMessage );
+    }
+
+
+
+//  End of File
+