meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrsubjectfield.cpp
branchRCL_3
changeset 64 3533d4323edc
child 80 726fba06891a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrsubjectfield.cpp	Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,610 @@
+/*
+* 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:  ESMR subject field implementation
+ *
+*/
+
+#include "cesmrsubjectfield.h"
+#include "cmrimage.h"
+#include "nmrlayoutmanager.h"
+#include "cesmreditor.h"
+#include "mesmrtitlepaneobserver.h"
+#include "cesmrglobalnote.h"
+#include "esmrfieldbuilderdef.h"
+#include "nmrcolormanager.h"
+#include "nmrbitmapmanager.h"
+#include "mesmrlistobserver.h"
+
+#include <calentry.h>
+#include <StringLoader.h>
+#include <AknsConstants.h>
+#include <esmrgui.rsg>
+#include <AknsBasicBackgroundControlContext.h>
+#include <eikmfne.h>
+
+#include "emailtrace.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::CESMRSubjectField
+// ---------------------------------------------------------------------------
+//
+CESMRSubjectField::CESMRSubjectField()
+    {
+    FUNC_LOG;
+    SetFocusType( EESMRHighlightFocus );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::~CESMRSubjectField
+// ---------------------------------------------------------------------------
+//
+CESMRSubjectField::~CESMRSubjectField( )
+    {
+    FUNC_LOG;
+    delete iFieldIcon;
+    delete iBgControlContext;
+    delete iPriorityIcon;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CESMRSubjectField::ConstructL( TESMREntryFieldId aId, TInt aTextId,
+        NMRBitmapManager::TMRBitmapId aIconID )
+    {
+    FUNC_LOG;
+    SetFieldId( aId );
+
+    iFieldIcon = CMRImage::NewL( aIconID );
+    iFieldIcon->SetParent( this );
+    
+    iSubject = CESMREditor::NewL ( this, 1, KMaxTextLength,
+            CEikEdwin::EResizable | CEikEdwin::EAvkonEditor | EAknEditorFlagNoLRNavigation);
+    iSubject->SetEdwinSizeObserver ( this );
+    iSubject->SetEdwinObserver( this );
+    iSubject->SetParent( this );
+
+    CESMRField::ConstructL( iSubject );  // iSubject ownership transfered
+
+    HBufC* buf = StringLoader::LoadLC ( aTextId );
+    iSubject->SetDefaultTextL( buf ); // ownership transferred
+    CleanupStack::Pop( buf );
+    
+    // Setting background instead of theme skin  
+    NMRBitmapManager::TMRBitmapStruct bitmapStruct;
+    bitmapStruct = NMRBitmapManager::GetBitmapStruct( 
+            NMRBitmapManager::EMRBitmapInputCenter );
+
+    TRect initialisationRect( 0, 0, 0, 0 );
+    iBgControlContext = 
+                CAknsBasicBackgroundControlContext::NewL( 
+                        bitmapStruct.iItemId,
+                        initialisationRect, 
+                        EFalse );
+                
+    iSubject->SetSkinBackgroundControlContextL( iBgControlContext );
+    
+    iCurrentPriority = EFSCalenMRPriorityNormal;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::NewL
+// ---------------------------------------------------------------------------
+//
+CESMRSubjectField* CESMRSubjectField::NewL( TFieldType aType )
+    {
+    FUNC_LOG;
+    CESMRSubjectField* self = new( ELeave )CESMRSubjectField;
+    CleanupStack::PushL ( self );
+    if ( aType == ETypeSubject )
+        {
+        self->ConstructL( EESMRFieldSubject,
+        R_QTN_MEET_REQ_SUBJECT_FIELD,
+        NMRBitmapManager::EMRBitmapSubject );
+        }
+    else
+        {
+        self->ConstructL( EESMRFieldOccasion,
+        R_QTN_CALENDAR_ANNIVERSARY_TYPE_OCCASION,
+        NMRBitmapManager::EMRBitmapOccasion );
+        }
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::MinimumSize
+// ---------------------------------------------------------------------------
+//
+TSize CESMRSubjectField::MinimumSize()
+    {
+    TRect parentRect( Parent()->Rect() );
+    
+    TRect fieldRect = 
+       NMRLayoutManager::GetFieldLayoutRect( parentRect, 1 ).Rect();
+
+    TRect editorRect( NMRLayoutManager::GetLayoutText( 
+       fieldRect, 
+       NMRLayoutManager::EMRTextLayoutTextEditor ).TextRect() );
+    
+    if( iPriorityIcon )
+        {
+		editorRect = NMRLayoutManager::GetLayoutText( 
+			   fieldRect, 
+			   NMRLayoutManager::EMRTextLayoutSingleRowEditorText ).TextRect();
+        }
+ 
+    // Adjust field size so that there's room for expandable editor.
+    fieldRect.Resize( 0, iSize.iHeight - editorRect.Height() );
+    
+    return fieldRect.Size();
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::InitializeL
+// ---------------------------------------------------------------------------
+//
+void CESMRSubjectField::InitializeL()
+    {
+    FUNC_LOG;
+    // Do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::InternalizeL
+// ---------------------------------------------------------------------------
+//
+void CESMRSubjectField::InternalizeL( MESMRCalEntry& aEntry )
+    {
+    FUNC_LOG;
+    CCalEntry& entry = aEntry.Entry ( );
+    HBufC* subject = entry.SummaryL().AllocLC ( );
+
+    // if there is no text available, don't overwrite the default text
+    // with empty descriptor.
+    if ( subject->Length ( )> 0 )
+        {
+        iSubject->ClearSelectionAndSetTextL ( *subject );
+        if ( iTitlePaneObserver )
+            {
+            iTitlePaneObserver->UpdateTitlePaneTextL( *subject );
+            }
+        }
+    
+    if( entry.PriorityL() != EFSCalenMRPriorityNormal &&
+            entry.EntryTypeL() == CCalEntry::EAppt )
+        {
+        SetPriorityIconL( entry.PriorityL() );
+        }
+
+    // this is needed to be re-called here, otherwise the CEikEdwin
+    // does not get correctly instantiated with default text
+    iSubject->FocusChanged( EDrawNow );
+
+    CleanupStack::PopAndDestroy ( subject );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::ExternalizeL
+// ---------------------------------------------------------------------------
+//
+void CESMRSubjectField::ExternalizeL( MESMRCalEntry& aEntry )
+    {
+    FUNC_LOG;
+    HBufC* subject = iSubject->GetTextInHBufL ( );
+    
+    CCalEntry& entry = aEntry.Entry();
+    
+    if ( subject )
+        {
+        CleanupStack::PushL ( subject );
+
+        // externalize the text only if it differs from the
+        // default text. In other words, default text is not
+        // externalized.
+        if ( iSubject->DefaultText().Compare (*subject )!= 0 )
+            {
+            entry.SetSummaryL( *subject );
+            }
+
+        CleanupStack::PopAndDestroy( subject );
+        }
+    else
+        {
+        entry.SetSummaryL( KNullDesC );
+        }
+
+    entry.SetPriorityL( iCurrentPriority );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::SetOutlineFocusL
+// ---------------------------------------------------------------------------
+//
+void CESMRSubjectField::SetOutlineFocusL( TBool aFocus )
+    {
+    FUNC_LOG;
+    CESMRField::SetOutlineFocusL ( aFocus );
+
+    if ( aFocus ) //Focus is gained on the field
+        {
+        ChangeMiddleSoftKeyL( EESMRCmdSaveMR,R_QTN_MSK_SAVE );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::HandleEdwinSizeEventL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRSubjectField::HandleEdwinSizeEventL( CEikEdwin* aEdwin,
+        TEdwinSizeEvent /*aType*/, TSize aSize )
+    {
+    FUNC_LOG;
+    TBool reDraw( EFalse );
+    
+    if( iSize != aSize )
+        {
+        // Let's save the required size for the iSubject
+        iSize = aSize;
+            
+        if ( iObserver && aEdwin == iSubject )
+           {
+           iObserver->ControlSizeChanged( this );
+           reDraw = ETrue;
+           }
+        
+        if( iSubject->LineCount() != iLineCount )
+            {
+            // Line count has changed, the whole component needs
+            // to be redrawn
+            DrawDeferred();
+            iLineCount = iSubject->LineCount();
+            }
+        }
+    return reDraw;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::HandleEdwinEventL
+// ---------------------------------------------------------------------------
+//
+void CESMRSubjectField::HandleEdwinEventL( CEikEdwin *aEdwin, TEdwinEvent aEventType )
+    {
+    FUNC_LOG;
+    if ( iTitlePaneObserver &&
+         aEdwin == iSubject &&
+         aEventType == EEventTextUpdate )
+        {
+        HBufC* text = iSubject->GetTextInHBufL();
+        if ( text )
+            {
+            CleanupStack::PushL( text );
+            
+            iTitlePaneObserver->UpdateTitlePaneTextL( *text );
+            
+            TInt textLength( text->Length() );
+            if ( iSubject->GetLimitLength() <= textLength )
+                {
+                NotifyEventAsyncL( EESMRCmdSizeExceeded );
+                }  
+            
+            CleanupStack::PopAndDestroy( text );
+            }
+        else
+            {
+            iTitlePaneObserver->UpdateTitlePaneTextL( KNullDesC );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::SetTitlePaneObserver
+// ---------------------------------------------------------------------------
+//
+void CESMRSubjectField::SetTitlePaneObserver( MESMRTitlePaneObserver* aObserver )
+    {
+    FUNC_LOG;
+    iTitlePaneObserver = aObserver;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::GetCursorLineVerticalPos
+// ---------------------------------------------------------------------------
+//
+void CESMRSubjectField::GetCursorLineVerticalPos(TInt& aUpper, TInt& aLower)
+    {
+    aLower = iSubject->CurrentLineNumber() * iSubject->RowHeight();
+    aUpper = aLower - iSubject->RowHeight();
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::ListObserverSet
+// ---------------------------------------------------------------------------
+//
+void CESMRSubjectField::ListObserverSet()
+    {
+    FUNC_LOG;
+    iSubject->SetListObserver( iObserver );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::ExecuteGenericCommandL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRSubjectField::ExecuteGenericCommandL(
+        TInt aCommand )
+    {
+    FUNC_LOG;
+    TBool isUsed( EFalse );
+    switch ( aCommand )
+        {
+        case EESMRCmdPriorityHigh:
+            {
+            SetPriorityIconL( EFSCalenMRPriorityHigh );
+            isUsed = ETrue;
+            break;
+            }
+        case EESMRCmdPriorityNormal:
+            {
+            SetPriorityIconL( EFSCalenMRPriorityNormal );
+            isUsed = ETrue;
+            break;
+            }
+        case EESMRCmdPriorityLow:
+            {
+            SetPriorityIconL( EFSCalenMRPriorityLow );
+            isUsed = ETrue;
+            break;
+            }
+            
+        case EESMRCmdSizeExceeded:
+            {
+            CESMRGlobalNote::ExecuteL ( 
+                    CESMRGlobalNote::EESMRCannotDisplayMuchMore );
+            
+            HBufC* text = iSubject->GetTextInHBufL();
+            CleanupDeletePushL( text );
+            if ( text )
+                {    
+                TInt curPos = iSubject->CursorPos();        
+                if( curPos > iSubject->GetLimitLength() - 1 )
+                    curPos = iSubject->GetLimitLength() - 1;
+                HBufC* newText = 
+                    text->Des().Mid( 0, iSubject->GetLimitLength() - 1 ).AllocLC();     
+                
+                iSubject->SetTextL ( newText );
+                CleanupStack::PopAndDestroy( newText );
+                newText = NULL;
+                
+                iSubject->SetCursorPosL (curPos, EFalse );
+                iSubject->HandleTextChangedL();
+                iSubject->UpdateScrollBarsL();
+                SetFocus(ETrue);
+                }
+            CleanupStack::PopAndDestroy( text );
+            isUsed = ETrue;
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+    return isUsed;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::CountComponentControls
+// ---------------------------------------------------------------------------
+//
+TInt CESMRSubjectField::CountComponentControls() const
+    {
+    TInt count( 0 );
+    if ( iFieldIcon )
+        {
+        ++count;
+        }
+
+    if ( iSubject )
+        {
+        ++count;
+        }
+    
+    if ( iPriorityIcon )
+        {
+        ++count;
+        }
+    return count;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::ComponentControl
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CESMRSubjectField::ComponentControl( 
+        TInt aIndex ) const
+    {
+    switch ( aIndex )
+        {
+        case 0:
+            return iFieldIcon;
+        case 1:
+            return iSubject;
+        case 2:
+            return iPriorityIcon;
+        default:
+            return NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::SizeChanged
+// ---------------------------------------------------------------------------
+//
+void CESMRSubjectField::SizeChanged( )
+    {
+    TRect rect( Rect() );
+
+    TAknLayoutRect rowLayoutRect( 
+            NMRLayoutManager::GetFieldRowLayoutRect( rect, 1 ) );
+    TRect rowRect( rowLayoutRect.Rect() );
+    
+    // Layouting field icon
+    if( iFieldIcon )
+        {
+        TAknWindowComponentLayout iconLayout( 
+            NMRLayoutManager::GetWindowComponentLayout( 
+                    NMRLayoutManager::EMRLayoutSingleRowAColumnGraphic ) );
+        AknLayoutUtils::LayoutControl( iFieldIcon, rowRect, iconLayout );
+        }
+    
+    // Layouting priority icon
+    if( iPriorityIcon )
+        {
+        TAknWindowComponentLayout iconLayout( 
+                NMRLayoutManager::GetWindowComponentLayout( 
+                    NMRLayoutManager::EMRLayoutSingleRowDColumnGraphic ) );
+        AknLayoutUtils::LayoutImage( iPriorityIcon, rowRect, iconLayout );
+        }
+
+    TAknLayoutText editorLayoutText;
+
+    if( iPriorityIcon )
+        {
+        editorLayoutText = NMRLayoutManager::GetLayoutText( rowRect, 
+                    NMRLayoutManager::EMRTextLayoutSingleRowEditorText );
+        }
+    else
+        {
+        editorLayoutText = NMRLayoutManager::GetLayoutText( rowRect, 
+                    NMRLayoutManager::EMRTextLayoutTextEditor );
+        }
+    
+    // Layouting editor field
+    TRect editorRect( editorLayoutText.TextRect() );
+
+    // Resize height according to actual height required by edwin.
+    editorRect.Resize( 0, iSize.iHeight - editorRect.Height() );
+    iSubject->SetRect( editorRect );  
+    
+    // Try setting font. Failures are ignored.
+    TRAP_IGNORE( iSubject->SetFontL( editorLayoutText.Font() ) );
+    
+    // Layouting focus
+    TRect bgRect( TPoint( editorRect.iTl.iX, editorRect.iTl.iY ), 
+            editorRect.Size() );
+    
+    // Move focus rect so that it's relative to field's position.
+    bgRect.Move( -Position() );
+    SetFocusRect( bgRect );    
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::SetContainerWindowL
+// ---------------------------------------------------------------------------
+//
+void CESMRSubjectField::SetContainerWindowL( 
+        const CCoeControl& aContainer )
+    {
+    CCoeControl::SetContainerWindowL( aContainer );
+    iSubject->SetContainerWindowL( aContainer );
+    
+    iSubject->SetParent( this );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::OfferKeyEventL()
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CESMRSubjectField::OfferKeyEventL(
+        const TKeyEvent& aEvent,
+        TEventCode aType )
+    {
+    FUNC_LOG;
+    TKeyResponse response( EKeyWasNotConsumed);
+    response = iSubject->OfferKeyEventL ( aEvent, aType );
+
+    if ( aType == EEventKey && 
+    		( aEvent.iScanCode != EStdKeyUpArrow &&
+			  aEvent.iScanCode != EStdKeyDownArrow ))
+    	{       
+        iSubject->DrawDeferred();
+    	}
+    return response;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRSubjectField::SetPriorityIconL
+// ---------------------------------------------------------------------------
+//
+void CESMRSubjectField::SetPriorityIconL( TUint aPriority )
+    {
+    switch ( aPriority )
+        {
+        case EFSCalenMRPriorityHigh:
+            {
+            delete iPriorityIcon;
+            iPriorityIcon = NULL;
+            
+            iPriorityIcon = CMRImage::NewL( 
+                  NMRBitmapManager::EMRBitmapPriorityHigh,
+                  this,
+                  ETrue );
+            iPriorityIcon->SetParent( this );
+            if( iCurrentPriority == EFSCalenMRPriorityNormal )
+            	{
+				SizeChanged();
+            	}
+            iCurrentPriority = EFSCalenMRPriorityHigh;
+            break;
+            }
+          
+        case EFSCalenMRPriorityNormal:
+            {
+            delete iPriorityIcon;
+            iPriorityIcon = NULL;
+            if( iCurrentPriority != EFSCalenMRPriorityNormal )
+				{
+				SizeChanged();
+				}
+            iCurrentPriority = EFSCalenMRPriorityNormal;
+            break;
+            }
+          
+        case EFSCalenMRPriorityLow:
+            {
+            delete iPriorityIcon;
+            iPriorityIcon = NULL;
+            
+            iPriorityIcon = CMRImage::NewL( 
+                  NMRBitmapManager::EMRBitmapPriorityLow );
+            iPriorityIcon->SetParent( this );  
+            if( iCurrentPriority == EFSCalenMRPriorityNormal )
+				{
+				SizeChanged();
+				}
+            iCurrentPriority = EFSCalenMRPriorityLow;
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+    }
+
+// EOF