imstutils/imconversationview/imcvuiapp/src/cimcvappmessageeditor.cpp
branchRCL_3
changeset 23 9a48e301e94b
parent 0 5e5d6b214f4f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imstutils/imconversationview/imcvuiapp/src/cimcvappmessageeditor.cpp	Wed Sep 01 12:33:36 2010 +0100
@@ -0,0 +1,446 @@
+/*
+* 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:  message editer
+*
+*/
+
+// INCLUDE FILES
+#include <AknsBasicBackgroundControlContext.h>
+#include "cimcvappmessageeditor.h"
+#include <eikmenub.h>
+#include <eikdef.h>
+#include <akninfrm.h>
+#include <eikon.rsg>
+#include <eikenv.h>
+#include <txtglobl.h>
+#include <gulfont.h>
+#include <txtfrmat.h>
+#include <eikrted.h>
+#include <aknconsts.h>
+#include <aknEditStateIndicator.h>
+#include <featmgr.h>
+#include <fepbase.h>
+#include <AknUtils.h>
+#include <aknappui.h>
+#include <imcvuiapp.mbg>
+#include <eikcolib.h>               //CEikAppUiFactory
+#include <avkon.mbg>
+#include <skinlayout.cdl.h>
+#include <txtrich.h>
+#include <eikedwin.h>
+#include "cimcvappview.h"
+#include "mimcvtapeventobserver.h"
+#include "cimcvappmessageextensionshandler.h"
+#include <aknlayoutscalable_avkon.cdl.h>
+using namespace SkinLayout;
+
+
+// CONSTANTS
+const TInt KChatKeyEventHotkeyLimit = 100;
+const TInt KChatResourceBufferSize = 24;
+const TInt KMaxMsgLength = 400;
+
+
+
+
+// ---------------------------------------------------------------------------
+// CIMCVAppMessageEditor::NewL
+// ---------------------------------------------------------------------------
+//
+CIMCVAppMessageEditor* CIMCVAppMessageEditor::NewL(const CCoeControl* aParent, 
+        TDesC& mbmPath,
+        CIMCVAppView& aAppView,
+        CIMCVAppMessageExtensionsHandler& aExtensionsHandler)
+    {
+    CIMCVAppMessageEditor* msgEditor = new(ELeave)CIMCVAppMessageEditor(aAppView,
+            aExtensionsHandler);
+    CleanupStack::PushL( msgEditor );
+    msgEditor->ConstructL( aParent, mbmPath );   
+    msgEditor->SetFocus( ETrue );
+    CleanupStack::Pop();    // msgEditor
+    return msgEditor;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CIMCVAppMessageEditor::~CBrowserGotoPane
+// ---------------------------------------------------------------------------
+//
+CIMCVAppMessageEditor::~CIMCVAppMessageEditor()
+    { 
+    if(iBgContext)
+     {
+    delete iBgContext;
+     }
+    delete iEditor;
+    delete iInputFrame;   
+    iEditorObserver = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CIMCVAppMessageEditor::CIMCVAppMessageEditor
+// ---------------------------------------------------------------------------
+//
+CIMCVAppMessageEditor::CIMCVAppMessageEditor(CIMCVAppView& aAppView,
+        CIMCVAppMessageExtensionsHandler& aExtensionHandler):
+    iAppView (aAppView),
+    iExtensionHandler(aExtensionHandler)
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CIMCVAppMessageEditor::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CIMCVAppMessageEditor::ConstructL ( const CCoeControl* aParent, TDesC& mbmPath )
+    {
+    CreateWindowL();
+    
+    // remove 'const' modifier and set parent control
+    SetMopParent( CONST_CAST( CCoeControl*, aParent ) );
+
+    iEditor = new (ELeave) CEikRichTextEditor;
+
+    iInputFrame = CAknInputFrame::NewL(
+                                        iEditor,
+                                        EFalse,
+                                        mbmPath,
+                                        EMbmImcvuiappQgn_indi_im_msg_editor,
+                                        EMbmImcvuiappQgn_indi_im_msg_editor_mask,
+                                        0 );
+
+    iInputFrame->SetContainerWindowL( *this );
+
+    AknEditUtils::ConstructEditingL (   iEditor,
+                                        KMaxMsgLength,
+                                        1,
+                                        EAknEditorCharactersLowerCase,
+                                        EAknEditorAlignRight,
+                                        EFalse,
+                                        ETrue,
+                                        EFalse );
+
+    iEditor->SetContainerWindowL( *this );
+    iEditor->SetObserver( this );
+    iEditor->SetBorder( TGulBorder::ENone );
+    iEditor->SetAknEditorCase( EAknEditorLowerCase );
+    iEditor->SetAknEditorInputMode( EAknEditorAllInputModes );
+    iEditor->SetAllowPictures(ETrue);    
+   // iEditor->SetAknEditorFlags(CEikRichTextEditor::ENoTextParsers);
+    iEditor->SetAknEditorPermittedCaseModes ( EAknEditorAllCaseModes );    
+    iEditor->CreateTextViewL();     
+    TRect screen( 0,0,0,0 );
+            
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screen );
+    //get the background skin context
+    iBgContext = CAknsBasicBackgroundControlContext::NewL( 
+            KAknsIIDQsnBgAreaMain, screen, EFalse );
+    //set the editor background color to background skin context
+    iEditor->SetSkinBackgroundControlContextL( iBgContext );   
+    iEditor->OverrideColorL(EColorControlSurroundBackground,KRgbRed);
+    iEditor->EnableCcpuSupportL(ETrue);
+    iEditor->SetEdwinObserver(this);
+    iServiceId = iAppView.ActiveEngine().GetServiceId();
+	ActivateL();
+    }
+
+// ---------------------------------------------------------------------------
+// CIMCVAppMessageEditor::HandleControlEventL
+// ---------------------------------------------------------------------------
+//
+void CIMCVAppMessageEditor::HandleControlEventL ( CCoeControl* /*aControl*/,
+        TCoeEvent aEventType )
+    {
+    switch (aEventType)
+        {        
+        case EEventStateChanged:
+            {
+            iEditor->DrawNow();
+            iAppView.UpdateToolbarButtonsStateL();
+            break;
+            }
+        case EEventRequestFocus:
+            {
+            FocusChanged( EDrawNow );
+            break;
+            }
+        default:
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CIMCVAppMessageEditor::HandleControlEventL
+// ---------------------------------------------------------------------------
+//
+void CIMCVAppMessageEditor::HandleEdwinEventL(CEikEdwin* /*aEdwin*/,
+        TEdwinEvent /*aEventType*/)
+    {
+    iEditor->DrawNow();
+    }
+// -----------------------------------------------------------------------------
+// CIMCVAppMessageEditor::NotifyObserverIfNeededL
+// Called to force refresh of editor contents after inserting a smiley
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppMessageEditor::NotifyObserverIfNeededL( TInt aOldLen, TInt aCurLen ) const
+    {
+    if ( iEditorObserver )
+        {        
+        if ( aCurLen == 0 && aOldLen > 0 )
+            {
+            iEditorObserver->HandleMessageEditorEventL(
+                MIMCVAppMessageEditorObserver::EEditorContentCleared );
+            
+            return;
+            }
+        if (aOldLen != aCurLen)
+            {
+            iEditorObserver->HandleMessageEditorEventL(
+                MIMCVAppMessageEditorObserver::EEditorContentChanged );            
+            return;
+            }
+        }
+    
+    }
+// ----------------------------------------------------------------------------
+// CIMCVAppMessageEditor::OfferKeyEventL
+// ----------------------------------------------------------------------------
+//
+TKeyResponse CIMCVAppMessageEditor::OfferKeyEventL
+( const TKeyEvent& aKeyEvent, TEventCode aType )
+    {    
+    TInt oldLen = iEditor->TextLength();	    
+    if ( iEditor->TextLength() == iEditor->MaxLength() )
+        {
+        if(( aType == EEventKey && 
+                ( aKeyEvent.iCode != EKeyBackspace && 
+                  aKeyEvent.iCode < EKeyDelete ) 
+           ) ||
+           ( aType == EEventKeyUp && 
+            aKeyEvent.iScanCode >= '0' && 
+            aKeyEvent.iScanCode <= '9'
+           )
+          )
+            {
+
+            return EKeyWasConsumed;
+            }
+        }
+
+    TKeyResponse res = EKeyWasNotConsumed;
+    
+    // This logic comes from CEikEdwin
+    // We need to handle hot keys cut and copy
+    TBool select = aKeyEvent.iModifiers & EModifierShift;
+    TBool magnify = aKeyEvent.iModifiers & EModifierCtrl;
+    if ( magnify && aKeyEvent.iCode < KChatKeyEventHotkeyLimit
+            && aKeyEvent.iCode != ' ' )
+        {
+        TBuf<KChatResourceBufferSize> buf;
+        if ( select )
+            {
+            iCoeEnv->ReadResourceL( buf, R_EIK_EDWIN_SHIFT_CTRL_HOTKEYS );
+            }           
+        else
+            {
+            iCoeEnv->ReadResourceL( buf, R_EIK_EDWIN_CTRL_HOTKEYS );
+            }
+
+        const TInt ret = buf.Locate( TChar( aKeyEvent.iCode + 'a' - 1 ) );
+        switch( ret )
+            {            
+            case CEikEdwin::EHotKeyCut:
+                {
+                iEditor->CcpuCutL();
+                res = EKeyWasConsumed;
+                break;
+                }
+            case CEikEdwin::EHotKeyCopy:
+                {
+                iEditor->CcpuCopyL();
+                res = EKeyWasConsumed;
+                break;
+                }                
+            default:
+                {
+                // No need to handle other hot keys here
+                break;
+                }
+            }
+        }
+    // --------------------
+
+    if ( res != EKeyWasConsumed )
+        {        
+        res = iEditor->OfferKeyEventL( aKeyEvent, aType );
+        }
+    
+    NotifyObserverIfNeededL(oldLen, iEditor->TextLength());
+    return res;
+
+    }
+
+// ----------------------------------------------------------------------------
+// CIMCVAppMessageEditor::HandlePointerEventL
+// ----------------------------------------------------------------------------
+//
+void CIMCVAppMessageEditor::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+    {
+    if( !AknLayoutUtils::PenEnabled() )
+        {
+        return;
+        }
+    iEditor->HandlePointerEventL( aPointerEvent );
+    }
+
+// ----------------------------------------------------------------------------
+// CIMCVAppMessageEditor::CountComponentControls
+// ----------------------------------------------------------------------------
+//
+TInt CIMCVAppMessageEditor::CountComponentControls() const
+    {
+    return 2;   // iEditor and input frame
+    }
+
+// ----------------------------------------------------------------------------
+// CIMCVAppMessageEditor::ComponentControl
+// ----------------------------------------------------------------------------
+//
+CCoeControl* CIMCVAppMessageEditor::ComponentControl ( TInt aIndex ) const
+    {
+    switch(aIndex)
+        {
+        case 0:
+            {
+			return iInputFrame;
+            }
+        case 1:
+            {
+            return iEditor;
+            }
+        default:
+            return NULL;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIMCVAppMessageEditor::SizeChanged
+// ----------------------------------------------------------------------------
+//
+void CIMCVAppMessageEditor::SizeChanged()
+    {
+    TAknLayoutRect layoutRectTemp;
+    TAknWindowLineLayout windowLayoutTmp, windowLayoutTmp2;
+
+    windowLayoutTmp = AknLayout::Find_pane_elements_Line_4();
+    windowLayoutTmp2 = windowLayoutTmp;
+    layoutRectTemp.LayoutRect( Rect(), windowLayoutTmp2 );
+    iEditor->SetRect( layoutRectTemp.Rect() );
+    iInputFrame->SetRect( Rect() );    
+    }
+
+// ----------------------------------------------------------------------------
+// CIMCVAppMessageEditor::FocusChanged
+// ----------------------------------------------------------------------------
+//
+void CIMCVAppMessageEditor::FocusChanged( TDrawNow aDrawNow )
+    {
+    iEditor->SetFocus( IsFocused(), aDrawNow );
+    }
+
+// ----------------------------------------------------------------------------
+// CIMCVAppMessageEditor::TextLength
+// ----------------------------------------------------------------------------
+//
+TInt CIMCVAppMessageEditor::TextLength() const
+    {
+    return iEditor->TextLength();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMCVAppMessageEditor::SetTextL
+// ----------------------------------------------------------------------------
+//
+void CIMCVAppMessageEditor::SetTextL( const TDesC& aTxt )
+    {
+    iEditor->SetTextL( &aTxt );
+    TInt curPos = TextLength();
+    // Cursor to end, no selection.
+    iEditor->SetSelectionL( curPos, curPos );
+	iEditor->DrawNow();
+    }
+
+
+// ----------------------------------------------------------------------------
+// CIMCVAppMessageEditor::Editor
+// ----------------------------------------------------------------------------
+CEikRichTextEditor& CIMCVAppMessageEditor::Editor() const
+    {
+    return *iEditor;
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppMessageEditor::SetMessageEditorObserver
+// Called to force refresh of editor contents after inserting a smiley
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppMessageEditor::SetMessageEditorObserver( MIMCVAppMessageEditorObserver* aObserver )
+    {    
+    iEditorObserver = aObserver;    
+    }
+
+// ---------------------------------------------------------------------------
+// CIMCVAppMessageEditor::HandleFindSizeChanged
+// ---------------------------------------------------------------------------
+//
+void CIMCVAppMessageEditor::HandleFindSizeChanged()
+    {    
+    // Lay out Goto Pane as if it was the old Find Pane.    
+    TRect rect;
+    AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,rect);
+    TAknWindowLineLayout msgPane=AknLayoutScalable_Avkon::find_pane();
+
+    
+    AknLayoutUtils::LayoutControl( this, rect, msgPane ); 
+       
+    SizeChanged();
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppMessageEditor::SetTapObserver
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppMessageEditor::SetTapObserver( MIMCVTapEventObserver* aObserver, TUint aId )
+    {
+    iTapObserver = aObserver;
+    iTapControlId = aId;    
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppMessageEditor::MopSupplyObject
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TTypeUid::Ptr CIMCVAppMessageEditor::MopSupplyObject( TTypeUid aId )
+    {
+    if( aId.iUid == MAknsControlContext::ETypeId && iBgContext )
+        {
+        return MAknsControlContext::SupplyMopObject( aId, iBgContext );
+        }
+    return CCoeControl::MopSupplyObject(aId);
+    }
+
+//  END OF FILE