diff -r 6ca72c0fe49a -r a941bc465d9f wvuing/wvuiave/AppSrc/CCAChatViewControl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuiave/AppSrc/CCAChatViewControl.cpp Wed Sep 01 12:31:13 2010 +0100 @@ -0,0 +1,518 @@ +/* +* 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: Text viewer component +* +*/ + + + +// INCLUDE FILES +#include "CCAChatViewControl.h" +#include "MCAMessageFlowHandlerPC.h" + +#include "CCACustomDraw.h" +#include "CCAPicture.h" +#include "CCAAppUi.h" +#include "mcatapeventobserver.h" +#include "MCASettingsPC.h" + +#include +#include +#include +#include +#include +#include + +#include "MCAProcessManager.h" +#include "IMMessageUtilsPC.h" + +#include "MCAMsgAddedToRichTxtCtrlObserver.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::CCAChatViewControl +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CCAChatViewControl::CCAChatViewControl() + { + } +// ----------------------------------------------------------------------------- +// CCAChatViewControl::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CCAChatViewControl::ConstructL( const TRect& aRect, + const CCoeControl& aParent, + MCAGroupPC& aMsgRWInterfacePC, + MCASettingsPC& aSettingsInterface, + CCAMessageExtensionsHandler& aExtensionsHandler, + CGulIcon*& aFromMe, + CGulIcon*& aToMe, + CGulIcon*& aUnsupported, + CGulIcon*& aCorrupted, + TBool aScrollOver, + MCAMsgAddedToRichTxtCtrlObserver* aAddMsgObserver ) + { + // get the graphics device + CWindowGc& gc = SystemGc(); + CBitmapDevice* device = static_cast( gc.Device() ); + + // text container + iTextContainer = CCARichTextContainer::NewL( + static_cast( *iEikonEnv->AppUi() ), + aSettingsInterface, *this, + aExtensionsHandler, + aFromMe, aToMe, aUnsupported, + aCorrupted, + *device, aScrollOver, + aAddMsgObserver ); + + // construct base class + CCATextViewControl::ConstructL( aRect, aParent, + iTextContainer->TextLayout() ); + + // Initialise flow handler and fetch messages + iFlowHandlerPC = IMMessageUtilsPC::CreateInstanceL( *iTextContainer, + aMsgRWInterfacePC, + !aScrollOver ) ; + + // We want to handle all the events which occur inside the text area. + // Rest is done by the base class. + SetPenBehaviour( EPenProcessEvent ); + } +// ----------------------------------------------------------------------------- +// CCAChatViewControl::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CCAChatViewControl::ConstructL( const TRect& aRect, + const CCoeControl& aParent, + MCAConversationPC& aMsgRWInterfacePC, + MCASettingsPC& aSettingsInterface, + CCAMessageExtensionsHandler& aExtensionsHandler, + CGulIcon*& aFromMe, + CGulIcon*& aToMe, + CGulIcon*& aUnsupported, + CGulIcon*& aCorrupted, + TBool aScrollOver, + MCAMsgAddedToRichTxtCtrlObserver* aAddMsgObserver ) + { + // get the graphics device + CWindowGc& gc = SystemGc(); + CBitmapDevice* device = static_cast( gc.Device() ); + + // text container + iTextContainer = CCARichTextContainer::NewL( + static_cast( *iEikonEnv->AppUi() ), + aSettingsInterface, *this, + aExtensionsHandler, + aFromMe, aToMe, aUnsupported, + aCorrupted, + *device, aScrollOver, + aAddMsgObserver ); + + // construct base class + CCATextViewControl::ConstructL( aRect, aParent, + iTextContainer->TextLayout() ); + + // Initialise flow handler and fetch messages + iFlowHandlerPC = IMMessageUtilsPC::CreateInstanceL( *iTextContainer, + aMsgRWInterfacePC, + !aScrollOver ) ; + + // We want to handle all the events which occur inside the text area. + // Rest is done by the base class. + SetPenBehaviour( EPenProcessEvent ); + } + +void CCAChatViewControl::ConstructL( const TRect& aRect, + const CCoeControl& aParent, + MCARecordedChatsPC& aRecordedChatsPC, + MCASettingsPC& aSettingsInterface, + CCAMessageExtensionsHandler& aExtensionsHandler, + CGulIcon*& aFromMe, + CGulIcon*& aToMe, + CGulIcon*& aUnsupported, + CGulIcon*& aCorrupted, + TBool aScrollOver, + MCAMsgAddedToRichTxtCtrlObserver* aAddMsgObserver ) + { + // get the graphics device + CWindowGc& gc = SystemGc(); + CBitmapDevice* device = static_cast( gc.Device() ); + + // text container + iTextContainer = CCARichTextContainer::NewL( + static_cast( *iEikonEnv->AppUi() ), + aSettingsInterface, *this, + aExtensionsHandler, + aFromMe, aToMe, aUnsupported, + aCorrupted, + *device, aScrollOver, aAddMsgObserver ); + + // construct base class + CCATextViewControl::ConstructL( aRect, aParent, + iTextContainer->TextLayout() ); + + // Initialise flow handler and fetch messages + iFlowHandlerPC = IMMessageUtilsPC::CreateInstanceL( *iTextContainer, + aRecordedChatsPC, + !aScrollOver ) ; + + // We want to handle all the events which occur inside the text area. + // Rest is done by the base class. + SetPenBehaviour( EPenProcessEvent ); + } + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCAChatViewControl* CCAChatViewControl::NewL( const TRect& aRect, + const CCoeControl& aParent, + MCAGroupPC& aMsgRWInterfacePC, + MCASettingsPC& aSettingsInterface, + CCAMessageExtensionsHandler& aExtensionsHandler, + CGulIcon*& aFromMe, + CGulIcon*& aToMe, + CGulIcon*& aUnsupported, + CGulIcon*& aCorrupted, + TBool aScrollOver /*= ETrue*/, + MCAMsgAddedToRichTxtCtrlObserver* aAddMsgObserver /*=NULL*/ ) + { + CCAChatViewControl* self = new( ELeave ) CCAChatViewControl; + CleanupStack::PushL( self ); + self->ConstructL( aRect, aParent, aMsgRWInterfacePC, aSettingsInterface, + aExtensionsHandler, aFromMe, aToMe, + aUnsupported, aCorrupted, + aScrollOver, aAddMsgObserver ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCAChatViewControl* CCAChatViewControl::NewL( const TRect& aRect, + const CCoeControl& aParent, + MCAConversationPC& aMsgRWInterfacePC, + MCASettingsPC& aSettingsInterface, + CCAMessageExtensionsHandler& aExtensionsHandler, + CGulIcon*& aFromMe, + CGulIcon*& aToMe, + CGulIcon*& aUnsupported, + CGulIcon*& aCorrupted, + TBool aScrollOver /*= ETrue*/, + MCAMsgAddedToRichTxtCtrlObserver* aAddMsgObserver /*=NULL*/ ) + { + CCAChatViewControl* self = new( ELeave ) CCAChatViewControl; + CleanupStack::PushL( self ); + self->ConstructL( aRect, aParent, aMsgRWInterfacePC, aSettingsInterface, + aExtensionsHandler, aFromMe, aToMe, + aUnsupported, aCorrupted, + aScrollOver, aAddMsgObserver ); + CleanupStack::Pop( self ); + return self; + } + +CCAChatViewControl* CCAChatViewControl::NewL( const TRect& aRect, + const CCoeControl& aParent, + MCARecordedChatsPC& aRecordedChatsPC, + MCASettingsPC& aSettingsInterface, + CCAMessageExtensionsHandler& aExtensionsHandler, + CGulIcon*& aFromMe, + CGulIcon*& aToMe, + CGulIcon*& aUnsupported, + CGulIcon*& aCorrupted, + TBool aScrollOver /*= ETrue*/, + MCAMsgAddedToRichTxtCtrlObserver* aAddMsgObserver /*= NULL*/ ) + { + CCAChatViewControl* self = new( ELeave ) CCAChatViewControl; + CleanupStack::PushL( self ); + self->ConstructL( aRect, aParent, aRecordedChatsPC, aSettingsInterface, + aExtensionsHandler, aFromMe, aToMe, + aUnsupported, aCorrupted, + aScrollOver, aAddMsgObserver ); + CleanupStack::Pop( self ); + return self; + } + + +// Destructor +CCAChatViewControl::~CCAChatViewControl() + { + delete iTextContainer; + delete iFlowHandlerPC; + } + + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::FetchMessages +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCAChatViewControl::FetchMessages( TBool aFetch ) + { + iFlowHandlerPC->FetchMessages( aFetch ); + } + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::SelectedMessage +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +MCAConversationMessage* CCAChatViewControl::SelectedMessage() + { + return iTextContainer->SelectedMessage(); + } + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::SelectedItem +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +HBufC* CCAChatViewControl::SelectedItemL() + { + return iTextContainer->SelectedItemL(); + } + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::SelectedItemType +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCAChatViewControl::SelectedItemType() + { + return iTextContainer->SelectedItemType(); + } + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::SetHighlight +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCAChatViewControl::SetHighlight( TBool aHighlight ) + { + iTextContainer->SetItemHighlight( aHighlight ); + } + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::DisableHighlightL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCAChatViewControl::DisableHighlightL() + { + iTextContainer->DisableHighlightL(); + } + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::Highlighted +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CCAChatViewControl::Highlighted() + { + return iTextContainer->Highlighted(); + } + + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::OfferKeyEventL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TKeyResponse CCAChatViewControl::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + if ( aType != EEventKey ) + { + return EKeyWasNotConsumed; + } + + CCARichTextContainer::THighlightMovement movement( + CCARichTextContainer::ENext ); + + switch ( aKeyEvent.iCode ) + { + case EKeyUpArrow: + { + movement = CCARichTextContainer::EPrevious; + // flowthrough + } + case EKeyDownArrow: + { + return iTextContainer->MoveHighlightL( movement ) == KErrNone ? + EKeyWasConsumed : EKeyWasNotConsumed; + } + + default: + { + // No handling for other events + break; + } + } + + return EKeyWasNotConsumed; + } + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::ProcessStylusEventL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCAChatViewControl::ProcessStylusEventL( + const TPointerEvent& aPointerEvent ) + { + // 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; + iStylusOutsideMessage = EFalse; + } + + 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; + } + } + else + { + // Stylus was moved/activated outside text elements + iStylusOutsideMessage = ETrue; + } + } + + // Notify Observers + if ( iTapObserver ) + { + if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + // Start + iTapObserver->HandleTapEventL( + MCATapEventObserver::EStartTap, iTapControlId ); + } + else if ( aPointerEvent.iType == TPointerEvent::EButton1Up ) + { + // Release + iTapObserver->HandleTapEventL( + MCATapEventObserver::EReleaseTap, iTapControlId ); + if ( iWaitForSingleTap && !iStylusOutsideMessage ) + { + // Single tap + iTapObserver->HandleTapEventL( + MCATapEventObserver::ESingleTap, iTapControlId ); + } + if ( iWaitForDoubleTap && !iStylusOutsideMessage ) + { + // Double Tap + iTapObserver->HandleTapEventL( + MCATapEventObserver::EDoubleTap, iTapControlId ); + } + } + } + } + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::SizeChanged +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCAChatViewControl::SizeChanged() + { + SetHighlighted( Highlighted() ); + CCATextViewControl::SizeChanged(); + } + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::MoveHighlightL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCAChatViewControl::MoveHighlightL( + CCARichTextContainer::THighlightMovement aMovement ) + { + iWaitForSingleTap = ETrue; + iTextContainer->MoveHighlightL( aMovement ); + } + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::SetTapObserver +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCAChatViewControl::SetTapObserver( MCATapEventObserver* aObserver, TUint aId ) + { + iTapObserver = aObserver; + iTapControlId = aId; + } + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::IsDeleted +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CCAChatViewControl::IsDeleted() const + { + return iTextContainer->IsDeleted(); + } + + +// ----------------------------------------------------------------------------- +// CCAChatViewControl::GetMessageCount +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCAChatViewControl::GetMessageCount() + { + return iTextContainer->GetMessageCount(); + } + +//when user navigate among tab. +// ----------------------------------------------------------------------------- +// CCAChatViewControl::UnRegisterRichTxtCtrlObserver +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCAChatViewControl::UnRegisterRichTxtCtrlObserver() + { + return iTextContainer->UnRegisterRichTxtCtrlObserver(); + } + +// End of File