emailuis/emailui/src/ncssubjectfield.cpp
changeset 0 8466d47a6819
child 1 12c456ceeff2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/src/ncssubjectfield.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,628 @@
+/*
+* Copyright (c) 2007 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:  compose view container
+*
+*/
+
+
+
+#include "emailtrace.h"
+#include <AknIconUtils.h>
+#include <avkon.hrh>
+#include <eiklabel.h>
+#include <eikimage.h>
+#include <eikenv.h>
+#include <AknsDrawUtils.h>
+#include <AknUtils.h>
+#include <StringLoader.h>
+#include <s32mem.h>
+#include <txtrich.h>
+#include <FreestyleEmailUi.rsg>
+#include <freestyleemailui.mbg>
+#include "FreestyleEmailUiLayoutData.h"
+#include "FreestyleEmailUiLayoutHandler.h"
+#include "FreestyleEmailUiAppui.h"
+#include "FreestyleEmailUiTextureManager.h"
+#include "ncssubjectfield.h"
+#include "ncsconstants.h"
+#include "ncsfieldsizeobserver.h"
+#include "ncsutility.h"
+#include "ncsheadercontainer.h"
+
+// ---------------------------------------------------------------------------
+// CNcsSubjectField::CNcsSubjectField()
+// ---------------------------------------------------------------------------
+//
+CNcsSubjectField::CNcsSubjectField( MNcsFieldSizeObserver* aSizeObserver,
+        CNcsHeaderContainer* aParentControl ):
+	MNcsControl( aSizeObserver ),
+	iParentControl( aParentControl )
+    {
+    FUNC_LOG;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CNcsSubjectField* CNcsSubjectField::NewL( TInt aLabelTextId,
+	MNcsFieldSizeObserver* aSizeObserver, CNcsHeaderContainer* aParentControl )
+    {
+    FUNC_LOG;
+    CNcsSubjectField* self =
+        new ( ELeave ) CNcsSubjectField( aSizeObserver, aParentControl );
+    CleanupStack::PushL( self );
+    self->ConstructL( aLabelTextId );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CNcsSubjectField::ConstructL( TInt aLabelTextId )
+    {
+    FUNC_LOG;
+    // Create label
+	HBufC* aTextBuf = StringLoader::LoadLC( aLabelTextId );
+    iLabel = new ( ELeave ) CNcsLabel( *this, NULL );
+    iLabel->SetTextL( aTextBuf->Des() );
+	CleanupStack::PopAndDestroy( aTextBuf );
+	// S60 Skin support
+	iLabel->SetBrushStyle(CWindowGc::ENullBrush);
+
+    iTextEditor = new ( ELeave ) CNcsEditor( iSizeObserver, ETrue, ENcsEditorSubject );
+    // iTextEditor is not completely constructed until in SetContainerWindowL()
+    iFocusChangeHandler = new (ELeave) CAsyncCallBack( CActive::EPriorityStandard );
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CNcsSubjectField::~CNcsSubjectField()
+    {
+    FUNC_LOG;
+    delete iTextEditor;
+    delete iLabel;
+    // Platform layout change
+    /*if ( iFont )
+        {
+        ControlEnv()->ScreenDevice()->ReleaseFont( iFont );
+        iFont = NULL;
+        }*/
+
+    delete iFocusChangeHandler;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::SetContainerWindowL() const
+// -----------------------------------------------------------------------------
+//
+void CNcsSubjectField::SetContainerWindowL(const CCoeControl& aContainer)
+	{
+    FUNC_LOG;
+	CCoeControl::SetContainerWindowL(aContainer);
+
+	// Create the component array
+    InitComponentArrayL();
+	CCoeControlArray& controls = Components();
+	controls.SetControlsOwnedExternally(ETrue);
+	controls.AppendLC(iLabel);
+	CleanupStack::Pop(iLabel);
+	controls.AppendLC(iTextEditor);
+    CleanupStack::Pop(iTextEditor);
+
+    // Setup text editor
+    iTextEditor->ConstructL( &aContainer, KMaxAddressFieldLines, 0 );
+	iTextEditor->SetBorder( TGulBorder::ENone );
+    iTextEditor->SetAknEditorInputMode( EAknEditorTextInputMode );
+	iTextEditor->CreateScrollBarFrameL()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOff );
+    iTextEditor->SetEdwinSizeObserver( this );
+    iTextEditor->SetupEditorL();
+    // Setup label
+    UpdateFontSize();
+    UpdateColors();
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::Draw() const
+// Draws the display
+// -----------------------------------------------------------------------------
+//
+void CNcsSubjectField::Draw( const TRect& /*aRect*/ ) const
+    {
+    FUNC_LOG;
+    CWindowGc& gc = SystemGc();
+    gc.SetBrushStyle( CGraphicsContext::ENullBrush );
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::GetMinLabelLength()
+// -----------------------------------------------------------------------------
+//
+TInt CNcsSubjectField::GetMinLabelLength() const
+	{
+    FUNC_LOG;
+    return iLabel->Font()->TextWidthInPixels( *iLabel->Text() );
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::SizeChanged()
+// set size
+// -----------------------------------------------------------------------------
+//
+void CNcsSubjectField::SizeChanged()
+    {
+    FUNC_LOG;
+	
+    const TRect rect( Rect() );
+    NcsUtility::LayoutCaptionLabel( iLabel, rect );
+    NcsUtility::LayoutDetailEdwinTouch( iTextEditor, rect, iEditorLineCount, EFalse );  
+    
+    if (iTextEditor->ScrollBarFrame())
+        {
+        TRect rc = iTextEditor->Rect();
+        if (AknLayoutUtils::LayoutMirrored())
+            {
+            rc.iTl.iX += iTextEditor->ScrollBarFrame()->ScrollBarBreadth(CEikScrollBar::EVertical);
+            }
+        else
+            {
+            rc.iBr.iX -= iTextEditor->ScrollBarFrame()->ScrollBarBreadth(CEikScrollBar::EVertical);
+            }
+        iTextEditor->SetRect(rc);
+        }
+
+    // Setup text alignment according the mirrored/normal layout.
+    if ( AknLayoutUtils::LayoutMirrored() )
+        {
+        iLabel->SetAlignment( EHLeftVCenter );
+        iLabel->SetLabelAlignment( ELayoutAlignLeft );
+        iTextEditor->SetAlignment( EAknEditorAlignRight );
+        }
+    else
+        {
+        iLabel->SetAlignment( EHRightVCenter );
+        iLabel->SetLabelAlignment( ELayoutAlignRight );
+        iTextEditor->SetAlignment( EAknEditorAlignLeft );
+        }
+    
+	UpdateFontSize();
+
+	iTextEditor->UpdateCustomDrawer();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::PositionChanged()
+// set size
+// -----------------------------------------------------------------------------
+//
+void CNcsSubjectField::PositionChanged()
+    {
+    FUNC_LOG;
+    //SizeChanged();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::OfferKeyEventL()
+// Handles key events
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CNcsSubjectField::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    FUNC_LOG;
+	TKeyResponse ret( EKeyWasNotConsumed );
+
+	ret = iTextEditor->OfferKeyEventL( aKeyEvent, aType );
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsAddressInputField::HandlePointerEventL()
+// Handles pointer events
+// -----------------------------------------------------------------------------
+//
+void CNcsSubjectField::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+    {
+	FUNC_LOG;
+    iTextEditor->HandlePointerEventL( aPointerEvent );
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::FocusChanged()
+// -----------------------------------------------------------------------------
+//
+void CNcsSubjectField::FocusChanged( TDrawNow aDrawNow )
+	{
+    FUNC_LOG;
+	// The focus change gaining handling needs to be deferred until AknFep is fully
+	// initialised. Otherwise there will be problems when moving focus from
+	// body to subject. Focus losing can be handled immediately
+	iDrawAfterFocusChange = aDrawNow;
+	if ( IsFocused() )
+	    {
+	TCallBack callback( DoHandleFocusChanged, this );
+	iFocusChangeHandler->Cancel();
+	iFocusChangeHandler->Set( callback );
+	iFocusChangeHandler->CallBack();
+	}
+	else
+	    {
+	    DoHandleFocusChanged( this );
+	    }
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::HandleFocusChangedL()
+// -----------------------------------------------------------------------------
+//
+void CNcsSubjectField::HandleFocusChangedL()
+    {
+    FUNC_LOG;
+    if ( IsFocused() )
+        {
+        iTextEditor->SetFocus( ETrue );
+        iTextEditor->SetCursorPosL( iTextEditor->TextLength(), EFalse );
+
+        // make sure that control is visible on screen
+        if ( Rect().iTl.iY < 0 )
+            {
+            TPoint pt = TPoint( 0, 0 );
+            Reposition( pt, Rect().Width() );
+            iSizeObserver->UpdateFieldPosition( this );
+            }
+        else
+            {
+            TPoint pos = PositionRelativeToScreen();
+            pos.iY += Size().iHeight;
+            CWsScreenDevice* screenDev = ControlEnv()->ScreenDevice();
+            TPixelsAndRotation pix;
+            screenDev->GetDefaultScreenSizeAndRotation( pix );
+            const TInt h = pix.iPixelSize.iHeight;
+            if ( pos.iY >= h - h / 3 )
+                {
+                TPoint pt = TPoint( 0, h / 3 );
+                Reposition( pt, Rect().Width() );
+                iSizeObserver->UpdateFieldPosition( this );
+                }
+            }
+
+        if ( iParentControl )
+            {
+            iParentControl->SetMskL();
+            }
+        }
+    else
+        {
+        iTextEditor->HandleTextChangedL();
+        iTextEditor->SetFocus( EFalse );
+        }
+
+    if ( iDrawAfterFocusChange )
+        {
+        DrawNow();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::DoHandleFocusChanged()
+// -----------------------------------------------------------------------------
+//
+TInt CNcsSubjectField::DoHandleFocusChanged( TAny* aSelfPtr )
+    {
+    FUNC_LOG;
+    CNcsSubjectField* self = static_cast<CNcsSubjectField*>( aSelfPtr );
+    TRAPD( err, self->HandleFocusChangedL() );
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::MinimumHeight()
+// return height of subject control
+// -----------------------------------------------------------------------------
+//
+TInt CNcsSubjectField::MinimumHeight()
+    {
+    FUNC_LOG;
+    // Platform layout changes
+    /*
+    TNcsMeasures m = NcsUtility::Measures();
+	TInt height = m.iAifHeight - m.iAifEditorHeight + iEditorMinimumHeight + m.iSubjectExtraHeightBottom;
+	TInt height2 = m.iAifHeight + m.iSubjectExtraHeightBottom;
+	// if followup icon and priority icon are both visible increase the subject field height
+	if ( iFollowUp && iPriority != EMsgPriorityNormal )
+	    {
+	    height2 += KIconHeightFollowUp;
+	    }
+    return Max( height, height2 );
+    */
+    //return NcsUtility::MinimumHeaderSize( Rect(), iEditorLineCount ).iHeight;
+    // Platform layout changes
+    return 0;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::SetSubjectL()
+// -----------------------------------------------------------------------------
+//
+void CNcsSubjectField::SetSubjectL( const TDesC& aSubject )
+    {
+    FUNC_LOG;
+    if ( &aSubject && aSubject.Length() > 0 )
+    	{
+	    RMemReadStream inputStream( aSubject.Ptr(), aSubject.Size() );
+	    CleanupClosePushL( inputStream );
+
+	  	iTextEditor->RichText()->ImportTextL( 0, inputStream, CPlainText::EOrganiseByParagraph );
+
+		// Activating the field will set the control to the end of the text
+	    iTextEditor->ActivateL();
+	    iTextEditor->SetCursorPosL(0,EFalse);
+
+	    CleanupStack::PopAndDestroy( &inputStream );
+    	}
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::HandleEdwinSizeEventL()
+// -----------------------------------------------------------------------------
+//
+TBool CNcsSubjectField::HandleEdwinSizeEventL( CEikEdwin* /*aEdwin*/,
+	TEdwinSizeEvent /*aEventType*/, TSize aDesirableEdwinSize )
+    {
+    FUNC_LOG;
+    //  Platform layout chage
+    /*
+    TInt ret( EFalse );
+    TInt htLine = iTextEditor->GetLineHeightL();
+    TInt numLinesDesired = aDesirableEdwinSize.iHeight / htLine;
+
+    if ( numLinesDesired < KMaxAddressFieldLines &&
+         iEditorMinimumHeight != aDesirableEdwinSize.iHeight )
+        {
+        iEditorMinimumHeight = aDesirableEdwinSize.iHeight;
+        iTextEditor->CreateScrollBarFrameL()->SetScjrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOff );
+        if ( iSizeObserver )
+            {
+            ret = iSizeObserver->UpdateFieldSizeL();
+            }
+        }
+    else if ( iEditorMinimumHeight != htLine * KMaxAddressFieldLines )
+        {
+        //We may still need to resize the controll.
+        iEditorMinimumHeight = htLine * KMaxAddressFieldLines;
+        iTextEditor->CreateScrollBarFrameL()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOn );
+        if ( iSizeObserver )
+            {
+            ret = iSizeObserver->UpdateFieldSizeL();
+            }
+        }
+    */
+
+    TInt ret( EFalse );
+    TInt htLine = iTextEditor->GetLineHeightL();
+    TInt numLinesDesired = aDesirableEdwinSize.iHeight / htLine;
+    CEikScrollBarFrame& scrollBarFrame( *iTextEditor->CreateScrollBarFrameL() );
+    iEditorLineCount = numLinesDesired;
+    scrollBarFrame.SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOff );
+    if ( iSizeObserver )
+        {
+        ret = iSizeObserver->UpdateFieldSizeL();
+        }
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::SelectAllTextL()
+// -----------------------------------------------------------------------------
+//
+void CNcsSubjectField::SelectAllTextL()
+	{
+    FUNC_LOG;
+	iTextEditor->SelectAllL();
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::Editor
+// -----------------------------------------------------------------------------
+CNcsEditor* CNcsSubjectField::Editor() const
+	{
+    FUNC_LOG;
+	return iTextEditor;
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::LineCount
+// -----------------------------------------------------------------------------
+TInt CNcsSubjectField::LineCount() const
+	{
+    FUNC_LOG;
+	return iTextEditor->LineCount();
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::CursorLineNumber
+// -----------------------------------------------------------------------------
+TInt CNcsSubjectField::CursorLineNumber() const
+	{
+    FUNC_LOG;
+	return iTextEditor->CursorLineNumber();
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::CursorPosition
+// -----------------------------------------------------------------------------
+TInt CNcsSubjectField::CursorPosition() const
+	{
+    FUNC_LOG;
+	TInt pos = iTextEditor->CursorPosition();
+	//Add the delta between the top of the edit control
+	//and the top of the parent control
+	pos += iTextEditor->Rect().iTl.iY - Rect().iTl.iY;
+	return pos;
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::ScrollableLines
+// -----------------------------------------------------------------------------
+TInt CNcsSubjectField::ScrollableLines() const
+	{
+    FUNC_LOG;
+	return iTextEditor->ScrollableLines();
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::GetNumChars
+// -----------------------------------------------------------------------------
+TInt CNcsSubjectField::GetNumChars() const
+	{
+    FUNC_LOG;
+	return iTextEditor->GetNumChars();
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::GetLabelText
+// -----------------------------------------------------------------------------
+const TDesC& CNcsSubjectField::GetLabelText() const
+	{
+    FUNC_LOG;
+	return KNullDesC;
+	}
+
+// Platform layout change
+// ---------------------------------------------------------------------------
+// CNcsSubjectField::LayoutLineCount
+// ---------------------------------------------------------------------------
+//
+TInt CNcsSubjectField::LayoutLineCount() const
+    {
+    FUNC_LOG;
+    return ( IsVisible() ? Max( 1, iEditorLineCount ) : 0 );
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::Reposition
+// -----------------------------------------------------------------------------
+void CNcsSubjectField::Reposition(TPoint& aPt, TInt /*aWidth*/)
+	{
+    FUNC_LOG;
+    /*
+	const TSize size( aWidth, MinimumHeight() );
+    SetExtent( aPt, size );
+    aPt.iY += size.iHeight;
+    */
+    SetPosition( aPt );
+    // Platform layout changes
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::GetLineRectL
+// -----------------------------------------------------------------------------
+void CNcsSubjectField::GetLineRectL( TRect& aLineRect ) const
+	{
+    FUNC_LOG;
+    return iTextEditor->GetLineRectL( aLineRect );
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::SetMaxLabelLength
+// -----------------------------------------------------------------------------
+void CNcsSubjectField::SetMaxLabelLength( TInt aMaxLength )
+	{
+    FUNC_LOG;
+	iMaximumLabelLength = aMaxLength;
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsSubjectField::SetTextColorL
+// -----------------------------------------------------------------------------
+void CNcsSubjectField::SetTextColorL( TLogicalRgb aColor )
+	{
+    FUNC_LOG;
+	iTextEditor->SetTextColorL( aColor );
+	}
+
+// ---------------------------------------------------------------------------
+// CNcsSubjectField::UpdateColors()
+// ---------------------------------------------------------------------------
+//
+void CNcsSubjectField::UpdateColors()
+    {
+	FUNC_LOG;
+    // Platform layout change
+    TRgb textColor = KRgbBlack;
+    if ( AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), textColor,
+        KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 ) != KErrNone )
+        {
+        textColor = KRgbBlack;
+        }
+    TRAP_IGNORE( iLabel->OverrideColorL( EColorLabelText, textColor ) );
+    // Platform layout change
+
+    CFreestyleEmailUiAppUi* appUi =
+        static_cast<CFreestyleEmailUiAppUi*>( ControlEnv()->AppUi() );
+    iBorderColor = appUi->LayoutHandler()->ComposerFieldBorderColor();
+    iBgColor = appUi->LayoutHandler()->ComposerFieldBackgroundColor();
+    }
+
+// Platform layout changes
+// ---------------------------------------------------------------------------
+// CNcsSubjectField::UpdateFontSize()
+// ---------------------------------------------------------------------------
+//
+void CNcsSubjectField::UpdateFontSize()
+	{
+    FUNC_LOG;
+    /*if ( iFont )
+        {
+        ControlEnv()->ScreenDevice()->ReleaseFont( iFont );
+        iFont = NULL;
+        }
+
+	TNcsMeasures m = NcsUtility::Measures();
+	if ( !iFont )
+	    {
+	    TRAP_IGNORE( iFont = NcsUtility::GetNearestFontL(EAknLogicalFontPrimarySmallFont,
+	    m.iLabelFontHeightPx) );
+	    }*/
+	iFont = NcsUtility::GetLayoutFont( iLabel->Rect(), NcsUtility::ENcsHeaderCaptionFont );
+	iLabel->SetFont( iFont );
+	iTextEditor->UpdateFontSize();
+	UpdateColors();
+	}
+
+// ---------------------------------------------------------------------------
+// CNcsSubjectField::HandleResourceChange()
+// ---------------------------------------------------------------------------
+//
+void CNcsSubjectField::HandleResourceChange( TInt aType )
+    {
+    FUNC_LOG;
+    CCoeControl::HandleResourceChange( aType );
+    if ( aType == KAknsMessageSkinChange ||
+         aType == KEikMessageColorSchemeChange )
+        {
+        UpdateFontSize();
+        UpdateColors();
+        // Platform layout changes
+        iTextEditor->HandleResourceChange( aType ) ;//CreateScrollBarFrameL()->DrawScrollBarsNow();
+        // Platform layout changes
+        }
+    }
+