meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrsubjectfield.cpp
branchRCL_3
changeset 12 4ce476e64c59
parent 0 8466d47a6819
child 16 b5fbb9b25d57
--- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrsubjectfield.cpp	Mon Mar 15 12:39:10 2010 +0200
+++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrsubjectfield.cpp	Wed Mar 31 21:08:33 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). 
+* 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"
@@ -15,23 +15,25 @@
  *
 */
 
-#include "emailtrace.h"
 #include "cesmrsubjectfield.h"
-
-#include <calentry.h>
-#include <StringLoader.h>
-#include <gulfont.h>
-#include <AknsConstants.h>
-#include <AknUtils.h>
-#include <AknsDrawUtils.h>
-#include <AknsFrameBackgroundControlContext.h>
-#include "esmrfieldbuilderdef.h"
-
-#include <esmrgui.rsg>
-
+#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 ========
 
@@ -39,11 +41,10 @@
 // CESMRSubjectField::CESMRSubjectField
 // ---------------------------------------------------------------------------
 //
-CESMRSubjectField::CESMRSubjectField( )
-:   CESMRIconField()
+CESMRSubjectField::CESMRSubjectField()
     {
     FUNC_LOG;
-    //do nothing
+    SetFocusType( EESMRHighlightFocus );
     }
 
 // ---------------------------------------------------------------------------
@@ -53,7 +54,9 @@
 CESMRSubjectField::~CESMRSubjectField( )
     {
     FUNC_LOG;
-    delete iFrameBgContext;
+    delete iFieldIcon;
+    delete iBgControlContext;
+    delete iPriorityIcon;
     }
 
 // ---------------------------------------------------------------------------
@@ -61,24 +64,41 @@
 // ---------------------------------------------------------------------------
 //
 void CESMRSubjectField::ConstructL( TESMREntryFieldId aId, TInt aTextId,
-        TAknsItemID aIconID )
+        NMRBitmapManager::TMRBitmapId aIconID )
     {
     FUNC_LOG;
-    SetFieldId ( aId );
-    SetExpandable ( );
+    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 );
 
-    iBackground = AknsDrawUtils::ControlContext( this );
-
-    CESMRIconField::ConstructL ( aIconID, iSubject );
+    TRect initialisationRect( 0, 0, 0, 0 );
+    iBgControlContext = 
+                CAknsBasicBackgroundControlContext::NewL( 
+                        bitmapStruct.iItemId,
+                        initialisationRect, 
+                        EFalse );
+                
+    iSubject->SetSkinBackgroundControlContextL( iBgControlContext );
+    
+    iCurrentPriority = EFSCalenMRPriorityNormal;
     }
 
 // ---------------------------------------------------------------------------
@@ -88,32 +108,60 @@
 CESMRSubjectField* CESMRSubjectField::NewL( TFieldType aType )
     {
     FUNC_LOG;
-    CESMRSubjectField* self = new (ELeave) CESMRSubjectField;
+    CESMRSubjectField* self = new( ELeave )CESMRSubjectField;
     CleanupStack::PushL ( self );
     if ( aType == ETypeSubject )
         {
-        self->ConstructL (EESMRFieldSubject,
+        self->ConstructL( EESMRFieldSubject,
         R_QTN_MEET_REQ_SUBJECT_FIELD,
-        KAknsIIDQgnFscalIndiSubject );
+        NMRBitmapManager::EMRBitmapSubject );
         }
     else
         {
-        self->ConstructL (EESMRFieldOccasion,
+        self->ConstructL( EESMRFieldOccasion,
         R_QTN_CALENDAR_ANNIVERSARY_TYPE_OCCASION,
-        KAknsIIDQgnFscalIndiOccasion );
+        NMRBitmapManager::EMRBitmapOccasion );
         }
-    CleanupStack::Pop ( self );
+    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;
-    iSubject->SetFontL( iLayout->Font( iCoeEnv, iFieldId ), iLayout );
+    // Do nothing
     }
 
 // ---------------------------------------------------------------------------
@@ -136,10 +184,16 @@
             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);
+    iSubject->FocusChanged( EDrawNow );
 
     CleanupStack::PopAndDestroy ( subject );
     }
@@ -152,7 +206,9 @@
     {
     FUNC_LOG;
     HBufC* subject = iSubject->GetTextInHBufL ( );
-
+    
+    CCalEntry& entry = aEntry.Entry();
+    
     if ( subject )
         {
         CleanupStack::PushL ( subject );
@@ -160,20 +216,19 @@
         // 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 )
+        if ( iSubject->DefaultText().Compare (*subject )!= 0 )
             {
-            CCalEntry& entry = aEntry.Entry ( );
-            entry.SetSummaryL ( *subject );
+            entry.SetSummaryL( *subject );
             }
 
-       CleanupStack::PopAndDestroy ( subject );
+        CleanupStack::PopAndDestroy( subject );
         }
     else
         {
-        CCalEntry& entry = aEntry.Entry ( );
         entry.SetSummaryL( KNullDesC );
         }
+
+    entry.SetPriorityL( iCurrentPriority );
     }
 
 // ---------------------------------------------------------------------------
@@ -185,27 +240,9 @@
     FUNC_LOG;
     CESMRField::SetOutlineFocusL ( aFocus );
 
-    if (aFocus) //Focus is gained on the field
+    if ( aFocus ) //Focus is gained on the field
         {
-        ChangeMiddleSoftKeyL(EESMRCmdSaveMR,R_QTN_MSK_SAVE);
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CESMRSubjectField::ExpandedHeight
-// ---------------------------------------------------------------------------
-//
-TInt CESMRSubjectField::ExpandedHeight( ) const
-    {
-    FUNC_LOG;
-    TInt height = iLayout->FieldSize( FieldId() ).iHeight;
-    if( iSize.iHeight < height )
-        {
-        return height - KEditorDifference;
-        }
-    else
-        {
-        return iSize.iHeight;
+        ChangeMiddleSoftKeyL( EESMRCmdSaveMR,R_QTN_MSK_SAVE );
         }
     }
 
@@ -213,31 +250,32 @@
 // CESMRSubjectField::HandleEdwinSizeEventL
 // ---------------------------------------------------------------------------
 //
-TBool CESMRSubjectField::HandleEdwinSizeEventL(CEikEdwin* /*aEdwin*/,
+TBool CESMRSubjectField::HandleEdwinSizeEventL( CEikEdwin* aEdwin,
         TEdwinSizeEvent /*aType*/, TSize aSize )
     {
     FUNC_LOG;
-    iSize = aSize;
-    iSize.iHeight -= KEditorDifference;
-
-    if (iLayout->CurrentFontZoom() == EAknUiZoomSmall ||
-        iLayout->CurrentFontZoom() == EAknUiZoomVerySmall)
-        {
-        iSize.iHeight -= KEditorDifference;
-        }
-
-    if ( iObserver )
+    TBool reDraw( EFalse );
+    
+    if( iSize != aSize )
         {
-        iObserver->ControlSizeChanged ( this );
+        // 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();
+            }
         }
-
-    if( iFrameBgContext )
-        {
-        TRect visibleRect = CalculateVisibleRect( iSubject->Rect() );
-        iFrameBgContext->SetFrameRects( visibleRect, visibleRect );
-        }
-
-    return ETrue;
+    return reDraw;
     }
 
 // ---------------------------------------------------------------------------
@@ -260,9 +298,9 @@
             
             TInt textLength( text->Length() );
             if ( iSubject->GetLimitLength() <= textLength )
-            	{
-            	NotifyEventAsyncL( EESMRCmdSizeExceeded );
-            	}  
+                {
+                NotifyEventAsyncL( EESMRCmdSizeExceeded );
+                }  
             
             CleanupStack::PopAndDestroy( text );
             }
@@ -284,54 +322,14 @@
     }
 
 // ---------------------------------------------------------------------------
-// CESMRSubjectField::PositionChanged()
+// CESMRSubjectField::GetCursorLineVerticalPos
 // ---------------------------------------------------------------------------
 //
-void CESMRSubjectField::PositionChanged()
+void CESMRSubjectField::GetCursorLineVerticalPos(TInt& aUpper, TInt& aLower)
     {
-    FUNC_LOG;
-    CCoeControl::PositionChanged();
-    if( iFrameBgContext )
-        {
-        TRect visibleRect = CalculateVisibleRect( iSubject->Rect() );
-        iFrameBgContext->SetFrameRects( visibleRect, visibleRect );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CESMRSubjectField::GetVerticalFocusPosition
-// ---------------------------------------------------------------------------
-//
-void CESMRSubjectField::GetMinimumVisibleVerticalArea(TInt& aUpper, TInt& aLower)
-    {
-    FUNC_LOG;
     aLower = iSubject->CurrentLineNumber() * iSubject->RowHeight();
     aUpper = aLower - iSubject->RowHeight();
     }
-// ---------------------------------------------------------------------------
-// CESMRSubjectField::ActivateL
-// ---------------------------------------------------------------------------
-//
-void CESMRSubjectField::ActivateL()
-    {
-    FUNC_LOG;
-    CCoeControl::ActivateL();
-    TRect rect(TPoint(iSubject->Position()), iSubject->Size());
-    TRect inner(rect);
-    TRect outer(rect);
-
-    iSubject->SetSize( TSize( iSubject->Size().iWidth, iLayout->FieldSize( FieldId() ).iHeight ));
-
-    delete iFrameBgContext;
-    iFrameBgContext = NULL;
-    iFrameBgContext = CAknsFrameBackgroundControlContext::NewL( KAknsIIDQsnFrInput, outer, inner, EFalse ) ;
-
-    iFrameBgContext->SetParentContext( iBackground );
-    iSubject->SetSkinBackgroundControlContextL(iFrameBgContext);
-
-    // update base class rects and redraw:
-    SizeChanged();
-    }
 
 // ---------------------------------------------------------------------------
 // CESMRSubjectField::ListObserverSet
@@ -347,35 +345,264 @@
 // CESMRSubjectField::ExecuteGenericCommandL
 // ---------------------------------------------------------------------------
 //
-void CESMRSubjectField::ExecuteGenericCommandL( 
-		TInt aCommand )
-	{
+TBool CESMRSubjectField::ExecuteGenericCommandL(
+        TInt aCommand )
+    {
     FUNC_LOG;
-	if ( EESMRCmdSizeExceeded == aCommand )
-		{
-		CESMRGlobalNote::ExecuteL ( 
-				CESMRGlobalNote::EESMRCannotDisplayMuchMore );
+    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() );
 
-		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 );	
-		}
-	}
+    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, 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