imstutils/imconversationview/imcvuiapp/src/cimcvappviewcontrol.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 10:12:18 +0200
changeset 0 5e5d6b214f4f
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2007-2008 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:  text view control container 
*
*/


// INCLUDE FILES
#include    "cimcvappviewcontrol.h"

#include    "cimcvapprichtextcontainer.h"
#include 	"cimcvappui.h"
#include	"cimcvappmessageflowhandler.h"
#include    <AknUtils.h>
#include    <AknSettingCache.h>
#include    <aknenv.h>
#include    <aknconsts.h>
#include    <avkon.mbg>
#include    <eikrted.h>
#include 	"imcvlogger.h"
#include	"mimcvtapeventobserver.h"
#include    "mimcvenginemessagesreadinterface.h"
#include    "mimcvenginemessagecontainerinfo.h"
// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CIMCVAppViewControl::CIMCVAppViewControl
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CIMCVAppViewControl::CIMCVAppViewControl()
    {
    }

// -----------------------------------------------------------------------------
// CIMCVAppViewControl::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CIMCVAppViewControl::ConstructL( const TRect& aRect, 
                        const CCoeControl& aParent,
                        MIMCVEngineMessageReadInterface& aReadInterface,
                        CIMCVAppMessageExtensionsHandler& aExtensionsHandler,
                        CGulIcon* aFromMe,
                        CGulIcon* aToMe,
                        CIMCVAppRichTextContainerCache& aRTContainerCache,
                        CIMCVEngine& aActiveEngine,
                        TBool aScrollOver )
    {
	IM_CV_LOGS(TXT("CIMCVAppViewContainer::ConstructL() start") );   
	 
	CWindowGc& gc = SystemGc();
	CBitmapDevice* device = static_cast<CBitmapDevice*>( gc.Device() ); 

	TInt serviceId = aActiveEngine.GetServiceId();
	// text container
	// Load the container from the cache
	iTextContainer = aRTContainerCache.LoadContainer(serviceId, aReadInterface.TargetId().Target() );
	if(NULL == iTextContainer )
	    {
		//If container not found in cache, create a new and add it to cache
	    iTextContainer = CIMCVAppRichTextContainer::NewL(static_cast<CIMCVAppUi*>( iEikonEnv->AppUi() ),
	            this, 
	            &aExtensionsHandler,
	            aFromMe, aToMe,device, 
	            aReadInterface.TargetId().Target(),
	            serviceId,
	            aScrollOver
	             );
	    
	    aRTContainerCache.StoreContainer(iTextContainer);
	    }
	else
	    {
		//If container is loaded from the cache, Then Provide it with the Parent's object address
	    iTextContainer->Initialize( static_cast<CIMCVAppUi*>( iEikonEnv->AppUi() ),
                this, 
                &aExtensionsHandler,
                aFromMe, aToMe,device, 
                aScrollOver );
	    }


	// construct base class
	CIMCVAppTextViewControl::ConstructL( aRect, aParent, 
	                                iTextContainer->TextLayout() );

	// create flow handler and fetch messages
	// Use aScrollOver to determine is this recorded chat or not,
	// it is EFalse only with recorded chats.
	SetPenBehaviour( EPenProcessEvent );
	iFlowHandler = CIMCVAppMessageFlowHandler::NewL( *iTextContainer,
												aReadInterface,
												aActiveEngine,
												!aScrollOver );
	IM_CV_LOGS(TXT("CIMCVAppViewContainer::ConstructL() end") );   
    }

// -----------------------------------------------------------------------------
// CIMCVAppViewControl::SetTapObserver
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CIMCVAppViewControl::SetTapObserver( MIMCVTapEventObserver* aObserver, TUint aId )
    {
    iTapObserver = aObserver;
    iTapControlId = aId;
    }


// -----------------------------------------------------------------------------
// CIMCVAppViewControl::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CIMCVAppViewControl* CIMCVAppViewControl::NewL( const TRect& aRect, 
                        const CCoeControl& aParent,
                        MIMCVEngineMessageReadInterface& aReadInterface,
                        CIMCVAppMessageExtensionsHandler& aExtensionsHandler,
                        CGulIcon* aFromMe,
                        CGulIcon* aToMe,
                        CIMCVAppRichTextContainerCache& aRTContainerCache,
                        CIMCVEngine& aActiveEngine,
                        TBool aScrollOver /*= ETrue*/ )
    {
    IM_CV_LOGS(TXT("CIMCVAppViewContainer::NewL() start") );   
    CIMCVAppViewControl* self = new( ELeave ) CIMCVAppViewControl;
    CleanupStack::PushL( self );
    self->ConstructL( aRect, aParent, aReadInterface,  
                      aExtensionsHandler,aFromMe, aToMe,aRTContainerCache,
                      aActiveEngine,
                      aScrollOver );
    CleanupStack::Pop( self );
    IM_CV_LOGS(TXT("CIMCVAppViewContainer::NewL() end") );   
    return self;
    }

// -----------------------------------------------------------------------------
// CIMCVAppViewControl::~CIMCVAppViewControl
//  Destructor
// -----------------------------------------------------------------------------

CIMCVAppViewControl::~CIMCVAppViewControl()
    {
    delete iFlowHandler;
    }

    

// -----------------------------------------------------------------------------
// CIMCVAppViewControl::SelectedItem
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
HBufC* CIMCVAppViewControl::SelectedItemL()
    {
    return iTextContainer->SelectedItemL();
    }
    
// -----------------------------------------------------------------------------
// CIMCVAppViewControl::SelectedItemType
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CIMCVAppViewControl::SelectedItemType()
    {
    return iTextContainer->SelectedItemType();
    }


// -----------------------------------------------------------------------------
// CIMCVAppViewControl::DisableHighlightL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CIMCVAppViewControl::DisableHighlightL()
    {
    IM_CV_LOGS(TXT("CIMCVAppViewContainer::DisableHighlightL()	start") );   
    iTextContainer->DisableHighlightL();
    IM_CV_LOGS(TXT("CIMCVAppViewContainer::DisableHighlightL()	end") );   
    }
    
// -----------------------------------------------------------------------------
// CIMCVAppViewControl::Highlighted
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TBool CIMCVAppViewControl::Highlighted()
    {
    IM_CV_LOGS(TXT("CIMCVAppViewContainer::Highlighted()	start") );
    
    IM_CV_LOGS(TXT("CIMCVAppViewContainer::Highlighted()	end") );      
    return iTextContainer->Highlighted();
    }

// -----------------------------------------------------------------------------
// CIMCVAppViewControl::SetHighlight
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CIMCVAppViewControl::SetHighlight( TBool aHighlight )
    {
    iTextContainer->SetItemHighlight( aHighlight );
    }

// -----------------------------------------------------------------------------
// CIMCVAppViewControl::OfferKeyEventL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TKeyResponse CIMCVAppViewControl::OfferKeyEventL( const TKeyEvent& aKeyEvent, 
                                                 TEventCode aType )
    {
    IM_CV_LOGS(TXT("CIMCVAppViewContainer::OfferKeyEventL()	start") );   
    if( aType != EEventKey )
        {
        return EKeyWasNotConsumed;
        }

    CIMCVAppRichTextContainer::THighlightMovement movement( 
                                                CIMCVAppRichTextContainer::ENext );
    
    switch( aKeyEvent.iCode )
        {
        case EKeyUpArrow:
            {
            movement = CIMCVAppRichTextContainer::EPrevious;
            // flowthrough
			}
        case EKeyDownArrow:
            {                        
            return iTextContainer->MoveHighlightL( movement ) == KErrNone ? 
                        EKeyWasConsumed : EKeyWasNotConsumed;
            }

        default:
            {
            // No handling for other events
            break;
            }
        }
    IM_CV_LOGS(TXT("CIMCVAppViewContainer::OfferKeyEventL()	end") );   
    return EKeyWasNotConsumed;
    }

// -----------------------------------------------------------------------------
// CIMCVAppViewControl::ProcessStylusEventL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CIMCVAppViewControl::ProcessStylusEventL( 
    const TPointerEvent& aPointerEvent )
    {
    IM_CV_LOGS(TXT("CIMCVAppViewContainer::ProcessStylusEventL()	start") );   
    // We end up here only if the pointer event started inside
    // the text area.
    if( aPointerEvent.iType == TPointerEvent::EButton1Down ||
        aPointerEvent.iType == TPointerEvent::EDrag )
        {
        // Reset poiter flags
        if( aPointerEvent.iType == TPointerEvent::EButton1Down )
            {
            iWaitForDoubleTap = iWaitForSingleTap;
            iWaitForSingleTap = ETrue;
             }
        
        TInt pos = FindDocPos( aPointerEvent.iPosition );
        if( pos != KErrNotFound )
            {
            TInt res = iTextContainer->HighlightItemAtPosL( pos );
            if( res == KErrNone )  
                
                {
                // New item/message was highlighted 
                if( aPointerEvent.iType == TPointerEvent::EDrag )
                    {
                    // Single tap is not possible if highlight was changed
                    // with draging
                    iWaitForSingleTap = EFalse;
                    }
                // doubletap is not possible for now
                iWaitForDoubleTap = EFalse;
                }
            }
         }
    
    if( iTapObserver )
        {
        if( aPointerEvent.iType == TPointerEvent::EButton1Down )
            {
            // Start
            iTapObserver->HandleTapEventL( 
                MIMCVTapEventObserver::EStartTap, iTapControlId );
            }
        }
    
   	IM_CV_LOGS(TXT("CIMCVAppViewContainer::ProcessStylusEventL()	end") );   
    }

// -----------------------------------------------------------------------------
// CIMCVAppViewControl::SizeChanged
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CIMCVAppViewControl::SizeChanged()
    {
    IM_CV_LOGS(TXT("CIMCVAppViewContainer::SizeChanged()	start") );   
    SetHighlighted( Highlighted() );
    CIMCVAppTextViewControl::SizeChanged();
    IM_CV_LOGS(TXT("CIMCVAppViewContainer::SizeChanged()	end") );   
    }

// -----------------------------------------------------------------------------
// CIMCVAppViewControl::MoveHighlightL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CIMCVAppViewControl::MoveHighlightL( 
                            CIMCVAppRichTextContainer::THighlightMovement aMovement)
    {
    IM_CV_LOGS(TXT("CIMCVAppViewContainer::MoveHighlightL()	start") );   
    iWaitForSingleTap = ETrue;
    iTextContainer->MoveHighlightL( aMovement );
    IM_CV_LOGS(TXT("CIMCVAppViewContainer::MoveHighlightL()	end") );   
    }
// -----------------------------------------------------------------------------
// CIMCVAppViewControl::GetMessageCount
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CIMCVAppViewControl::GetMessageCount()
	{
	return iTextContainer->GetMessageCount();	
	}

// -----------------------------------------------------------------------------
// CIMCVAppViewControl::FetchMessages
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CIMCVAppViewControl::FetchMessages( TBool aFetch )
    {
    iFlowHandler->FetchMessages( aFetch );
    }

//  End of File