idlehomescreen/xmluirendering/renderingplugins/xntexteditorfactory/src/xntexteditoradapter.cpp
branchRCL_3
changeset 83 5456b4e8b3a8
child 88 3321d3e205b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/xmluirendering/renderingplugins/xntexteditorfactory/src/xntexteditoradapter.cpp	Wed Sep 01 12:32:46 2010 +0100
@@ -0,0 +1,762 @@
+/*
+* Copyright (c) 2005-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:  Implementation wrapper for CEikEdwin
+*
+*/
+
+// System includes
+#include <e32base.h>
+#include <e32const.h>
+#include <e32property.h>
+
+#include <eikedwin.h>
+#include <AknUtils.h>
+#include <AknsUtils.h>
+#include <aknview.h>
+#include <aknedsts.h>
+#include <AknPriv.hrh>
+#include <txtglobl.h>
+#include <txtfmlyr.h>
+#include <txtfrmat.h>
+#include <txtrich.h>
+#include <gdi.h>
+#include <gulutil.h>
+
+#include <activeidle2domainpskeys.h>
+
+// User includes
+#include "xnappuiadapter.h"
+#include "xndompropertyvalue.h"
+#include "xndomlist.h"
+#include "xndomproperty.h"
+#include "xnproperty.h"
+#include "xnnodepluginif.h"
+#include "xncontroladapter.h"
+#include "xntexteditoradapter.h"
+#include "xntexteditorpublisher.h"
+#include "xnnodepluginif.h"
+#include "xneditmode.h"
+#include "c_xnutils.h"
+#include "xntexteditor.h" 
+
+const TInt KMaxLength = 100;
+
+enum TSplitInputState
+    {
+    ESplitInputEnabled = 1,   
+    ESplitInputOpen = 2,
+    ESplitInputEditorInStack = 4,
+    EScreenDeviceChanged = 8
+    };
+
+_LIT8( KCpsPublishing, "cpspublishing" );
+_LIT8( KMaxLineAmount, "max-line-amount" );
+_LIT8( KMaxCharAmount, "max-char-amount" );
+_LIT8( KEnablePartialInput, "splitinputenabled" );
+_LIT8( KSplitScreenEnabledTrigger , "splitscreenenabled" );
+_LIT8( KSplitScreenDisabledTrigger, "splitscreendisabled" );
+
+_LIT( KEnterChar, "\x2029" );
+
+// Local macros
+#define IS_ARROW_KEY( k ) \
+    ( k == EStdKeyLeftArrow || k == EStdKeyRightArrow || \
+      k == EStdKeyUpArrow || k == EStdKeyDownArrow ) 
+
+// ============================ LOCAL FUNCTIONS ================================   
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TBool IsFlagSet( TInt aFlags, TInt aFlag )
+    {
+    return aFlags & aFlag;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void SetFlag( TInt& aFlags, TInt aFlag )
+    {
+    aFlags |= aFlag;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void ClearFlag( TInt& aFlags, TInt aFlag )
+    {
+    aFlags &= ~aFlag;
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::NewL
+// Symbian static 1st phase constructor
+// -----------------------------------------------------------------------------
+//
+CXnTextEditorAdapter* CXnTextEditorAdapter::NewL( CXnControlAdapter* aParent, 
+    CXnNodePluginIf& aNode )
+    {
+	CXnTextEditorAdapter* self = 
+        new( ELeave ) CXnTextEditorAdapter( aParent, aNode );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;	
+    }
+    
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::CXnTextEditorAdapter
+// C++ default constructor
+// -----------------------------------------------------------------------------
+//
+CXnTextEditorAdapter::CXnTextEditorAdapter( CXnControlAdapter* aParent, 
+    CXnNodePluginIf& aNode )
+    : iParent( aParent ), iNode( aNode )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::~CXnTextEditorAdapter
+// C++ destructor
+// -----------------------------------------------------------------------------
+//
+CXnTextEditorAdapter::~CXnTextEditorAdapter()
+    {  
+    if( IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )    
+        {
+        if( iUiEngine )
+            {
+            iUiEngine->EnablePartialTouchInput( iNode, EFalse );    
+            }
+        }
+
+    if ( iAvkonAppUi )
+        {
+        iAvkonAppUi->RemoveFromStack( iEditor );
+        }
+    
+    if( iFont && iReleaseFont )
+        {
+        CWsScreenDevice* dev( iCoeEnv->ScreenDevice() );
+        dev->ReleaseFont( iFont );
+        }
+
+    delete iEditorPublisher;
+    delete iEditor;   
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CXnTextEditorAdapter::ConstructL()
+    {
+    CXnControlAdapter::ConstructL( iNode );    
+    iUiEngine = iNode.UiEngineL();
+
+    iAppui = static_cast< CXnAppUiAdapter* >( iAvkonAppUi );
+    
+    // Max line amount
+    iMaxLines = 0;
+    
+    CXnProperty* maxlinesProp( iNode.GetPropertyL( KMaxLineAmount ) );
+        
+    if ( maxlinesProp )
+        {
+        iMaxLines = maxlinesProp->FloatValueL();
+        }
+
+    // Max char amount
+    TInt maxChars( KMaxLength );
+    
+    CXnProperty* maxcharsProp( iNode.GetPropertyL( KMaxCharAmount ) );    
+    
+    if ( maxcharsProp )
+        {
+        maxChars = maxcharsProp->FloatValueL();
+        }
+    
+    iEditor = new ( ELeave ) CEikEdwin;
+
+    iEditor->SetContainerWindowL( *iParent );
+    iEditor->ConstructL( 0, maxChars, maxChars, iMaxLines );
+    iEditor->SetBackground( this );
+    
+    // Set allowed input modes
+    iEditor->SetAknEditorAllowedInputModes( EAknEditorAllInputModes );
+
+    // Set the default input mode
+    iEditor->SetAknEditorInputMode( 
+        EAknEditorTextInputMode | EAknEditorNumericInputMode );
+                                    
+    // Set allowed case modes
+    iEditor->SetAknEditorPermittedCaseModes( EAknEditorAllCaseModes );
+
+    // Set the default case mode
+    iEditor->SetAknEditorCase( EAknEditorTextCase );
+        
+    iEditor->AddFlagToUserFlags( 
+        CEikEdwin::ENoAutoSelection | CEikEdwin::EAllowUndo );
+                                     
+    // Set numeric keymap
+    iEditor->SetAknEditorNumericKeymap( EAknEditorPlainNumberModeKeymap );
+
+    // Enable partial Screen
+    CXnProperty* enablepartialinput( iNode.GetPropertyL( KEnablePartialInput ) );
+    iSplitInputFlags = 0;
+     
+    if ( enablepartialinput && 
+         enablepartialinput->StringValue() == XnPropertyNames::KTrue )
+        {
+        iEditor->SetAknEditorFlags( EAknEditorFlagEnablePartialScreen );
+        SetFlag( iSplitInputFlags, ESplitInputEnabled );
+        }
+
+    // for RTL languages
+    iEditor->SetAknEditorLocalLanguage( User::Language() );
+    ( AknLayoutUtils::LayoutMirrored() ? 
+                        iEditor->SetAlignment( EAknEditorAlignRight ) : 
+                        iEditor->SetAlignment( EAknEditorAlignLeft ) );
+
+    iEditor->SetObserver( this );
+                                        
+    // Default not focused                                  
+    iEditor->SetFocus( EFalse );                              
+        
+    SetPropertiesL();
+	}
+ 
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::CountComponentControls
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//  
+TInt CXnTextEditorAdapter::CountComponentControls() const
+    {
+    if( iEditor )
+        {
+        return 1;
+        }
+        
+    return 0;        
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::ComponentControl
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+CCoeControl* CXnTextEditorAdapter::ComponentControl( TInt aIndex ) const
+    {
+    if( aIndex == 0 )
+        {
+        return iEditor;
+        }
+        
+    return NULL;        
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::SizeChanged
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+void CXnTextEditorAdapter::SizeChanged()
+    {        
+    iEditor->SetRect( iNode.Rect() );  
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::OfferKeyEventL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+TKeyResponse CXnTextEditorAdapter::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+    TEventCode aType )
+    {
+    TKeyResponse ret( EKeyWasNotConsumed );
+
+    if ( !IsFocused() )
+        {
+        return ret;
+        }
+
+    ret = iEditor->OfferKeyEventL( aKeyEvent, aType );                    
+
+    if ( IS_ARROW_KEY( aKeyEvent.iScanCode ) )    
+        {                        
+        if ( ret == EKeyWasNotConsumed && aType == EEventKey )
+            {            
+            iRefusesFocusLoss = EFalse;
+            
+            ret = CXnControlAdapter::OfferKeyEventL( aKeyEvent, aType );
+            }                    
+        }
+
+    if ( aKeyEvent.iCode == EKeyEnter )
+        {
+        if ( iEditorPublisher && iMaxLines == 1 )
+            {
+            TInt length( iEditor->TextLength() );
+            
+            HBufC* content = HBufC::NewLC( length + 1 );
+            TPtr ptr( content->Des() );
+            
+            iEditor->GetText( ptr );
+            
+            ptr.Append( KEnterChar );
+            
+            iEditorPublisher->PublishTextL( *content );
+            
+            CleanupStack::PopAndDestroy( content );
+            }
+        }
+
+    return ret;        
+    }
+ 
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::RefusesFocusLoss
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+TBool CXnTextEditorAdapter::RefusesFocusLoss() const
+    {    
+    return iRefusesFocusLoss;
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::FocusChanged
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+void CXnTextEditorAdapter::FocusChanged( TDrawNow aDrawNow )
+    {
+    TBool isFocused( IsFocused() ? ETrue : EFalse );
+    TInt value;
+
+    if ( isFocused )
+        {      
+        value = EPSAiDontForwardNumericKeysToPhone;
+
+        if( !IsFlagSet( iSplitInputFlags, ESplitInputEnabled ) )
+            {
+            TRAP_IGNORE( iAppui->AddToStackL( iAppui->View(), iEditor ) );  
+            // AddToStackL calls iEditor->SetFocus( ETrue ); 
+            }
+        else if( !IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )
+            {
+            TRAP_IGNORE( iAppui->AddToStackL( iAppui->View(), iEditor ) ); 
+            SetFlag( iSplitInputFlags, ESplitInputEditorInStack );
+            }
+        }
+    else
+        {
+        value = EPSAiForwardNumericKeysToPhone;
+                                      
+        if( !IsFlagSet( iSplitInputFlags, ESplitInputEnabled ) )
+            {    
+            iAppui->RemoveFromStack( iEditor );            
+            iEditor->SetFocus( EFalse, aDrawNow );
+            }
+        
+        // Remove editor from stack if it has not beed removed AND split screen has been closed
+        else if( IsFlagSet( iSplitInputFlags, ESplitInputEditorInStack ) &&
+                 !IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )
+            {
+            iAppui->RemoveFromStack( iEditor );            
+            iEditor->SetFocus( EFalse, aDrawNow );
+            ClearFlag( iSplitInputFlags, ESplitInputEditorInStack );            
+            }            
+        }
+
+    if( IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )
+        {
+        value = EPSAiDontForwardNumericKeysToPhone;
+        } 
+
+    iRefusesFocusLoss = isFocused;
+    
+    RProperty::Set( KPSUidAiInformation,            
+                    KActiveIdleForwardNumericKeysToPhone,
+                    value );    
+    }
+    
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::Draw
+// Draws the editor component
+// -----------------------------------------------------------------------------
+//
+void CXnTextEditorAdapter::Draw( const TRect& /*aRect*/ ) const
+    { 
+    // Do nothing. 
+    // Background is drawn through MCoeControlBackground of CEikEdwin. 
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::HandleResourceChange
+//
+// -----------------------------------------------------------------------------
+//
+void CXnTextEditorAdapter::HandleResourceChange( TInt aType )
+    {
+    if ( aType == KAknSplitInputEnabled ) 
+        {
+        if( IsFlagSet( iSplitInputFlags, ESplitInputEditorInStack ) && 
+            !IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )
+            {
+            iUiEngine->EnablePartialTouchInput( iNode, ETrue );
+            SetFlag( iSplitInputFlags, ESplitInputOpen );
+            if ( !IsFlagSet( iSplitInputFlags, EScreenDeviceChanged ) )
+                {
+                TRAP_IGNORE( iNode.ReportTriggerEventL( KSplitScreenEnabledTrigger, 
+                    KNullDesC8, KNullDesC8) );
+                }
+            else
+                {
+                ClearFlag( iSplitInputFlags, EScreenDeviceChanged );
+                }
+            }
+        }    
+    
+     if ( aType == KAknSplitInputDisabled ) 
+        {
+        if( IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )    
+            {
+            iUiEngine->EnablePartialTouchInput( iNode, EFalse );
+            ClearFlag( iSplitInputFlags, ESplitInputOpen );
+            
+            // Note that after orientation switch, split screen is first closed and  
+            // then opened again. Therefore these must be discarded
+            if ( !IsFlagSet( iSplitInputFlags, EScreenDeviceChanged ) )
+                {
+                TRAP_IGNORE( iNode.ReportTriggerEventL( KSplitScreenDisabledTrigger, 
+                    KNullDesC8, KNullDesC8) );
+            
+                // If editor is not focused anymore, remove if from stack
+                CXnNodePluginIf* focusedNode( NULL );
+                TRAP_IGNORE( focusedNode = iUiEngine->FocusedNodeL() );
+                if( focusedNode != &iNode && 
+                    IsFlagSet( iSplitInputFlags, ESplitInputEditorInStack ) )
+                    {
+                    iAppui->RemoveFromStack( iEditor );
+                    iEditor->SetFocus( EFalse );
+                    ClearFlag( iSplitInputFlags, ESplitInputEditorInStack );
+    
+                    // Forward keys to phone again    
+                    RProperty::Set( KPSUidAiInformation,            
+                                    KActiveIdleForwardNumericKeysToPhone,
+                                    EPSAiForwardNumericKeysToPhone );
+                    }
+                }
+            }
+        }
+    CCoeControl::HandleResourceChange( aType );
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::HandlePointerEventL
+//
+// -----------------------------------------------------------------------------
+//
+void CXnTextEditorAdapter::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+    {
+    TPointerEvent pointerEvent( aPointerEvent ); 
+    TRect rect( iEditor->TextView()->ViewRect() );
+    TPoint point( aPointerEvent.iPosition );
+    
+    // this opens partial screen also when margin is tapped
+    if( !IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )
+        {
+        if( point.iX < rect.iTl.iX )
+            {
+            pointerEvent.iPosition.iX = rect.iTl.iX;
+            }
+        else if( point.iX > rect.iBr.iX )
+            {
+            pointerEvent.iPosition.iX = rect.iBr.iX;
+            }
+        
+        if( point.iY < rect.iTl.iY )
+            {
+            pointerEvent.iPosition.iY = rect.iTl.iY;
+            }
+        else if( point.iY > rect.iBr.iY )
+            {
+            pointerEvent.iPosition.iY = rect.iBr.iY;
+            }
+        }
+    
+    CXnControlAdapter::HandlePointerEventL( pointerEvent );
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::HandleScreenDeviceChangedL
+//
+// -----------------------------------------------------------------------------
+//
+void CXnTextEditorAdapter::HandleScreenDeviceChangedL()
+    {
+    if( IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )
+        {
+        SetFlag( iSplitInputFlags, EScreenDeviceChanged );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// From MCoeControlBackground
+// CXnTextEditorAdapter::Draw
+// -----------------------------------------------------------------------------
+//
+void CXnTextEditorAdapter::Draw( CWindowGc& aGc, const CCoeControl& aControl, 
+    const TRect& aRect) const
+    {
+    if( &aControl == iEditor )
+        {
+        CXnControlAdapter::Draw( aRect, aGc );    
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::SetTextL
+// Sets the new content to the underlying CEikEdwin
+// -----------------------------------------------------------------------------
+//
+void CXnTextEditorAdapter::SetTextL( const TDesC& aText )
+    {
+    iEditor->SetTextL( &aText );
+    iNode.SetDirtyL();
+    }
+    
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::Text
+// Returns the text contained in the underlying CEikEdwin
+// -----------------------------------------------------------------------------
+//
+HBufC* CXnTextEditorAdapter::Text() const
+    {
+    HBufC* text( NULL );
+    
+    TRAP_IGNORE( text = iEditor->GetTextInHBufL() );
+    
+    // Ownership is transfered to the calller
+    return text;
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::HandleEditorEvent
+// -----------------------------------------------------------------------------
+//
+void CXnTextEditorAdapter::HandleEditorEvent( TInt aReason )
+    {
+    if( aReason == CXnTextEditor::KDeactivateTextEditor &&
+        IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )
+        {
+        iAppui->RemoveFromStack( iEditor );
+        iEditor->SetFocus( EFalse );
+        ClearFlag( iSplitInputFlags, ESplitInputEditorInStack ); 
+        iRefusesFocusLoss = EFalse;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::SetPropertiesL
+// Sets text properties
+// -----------------------------------------------------------------------------
+//
+void CXnTextEditorAdapter::SetPropertiesL()
+    {    
+    // Whether to publish text to CPS
+    CXnProperty* cpspublishingProp( iNode.GetPropertyL( KCpsPublishing ) );
+    CXnProperty* idProp( iNode.IdL() );
+    
+    if ( cpspublishingProp && idProp && 
+        cpspublishingProp->StringValue() == XnPropertyNames::KTrue )
+        {
+        iEditorPublisher = CXnTextEditorPublisher::NewL( 
+                *this, idProp->StringValue() );
+        }    
+
+    // Store current state
+    if ( iFont && iReleaseFont )
+        {
+        CWsScreenDevice* dev( iCoeEnv->ScreenDevice() );
+        dev->ReleaseFont( iFont ); 
+        iFont = NULL;
+        }
+    
+    // Get new font
+    CXnUtils::CreateFontL( iNode, iFont, iReleaseFont );
+    
+    // And set font
+    TCharFormat cf;
+    TCharFormatMask cfm;
+    cfm.SetAttrib( EAttColor );
+    cfm.SetAttrib( EAttFontTypeface );
+    cfm.SetAttrib( EAttFontHeight );
+    cfm.SetAttrib( EAttFontPosture );
+    cfm.SetAttrib( EAttFontStrokeWeight );
+    cfm.SetAttrib( EAttLineSpacing );
+    cfm.SetAttrib( EAttLineSpacingControl );
+    cf.iFontSpec = iFont->FontSpecInTwips();
+
+    // Set linespacing    
+    CXnProperty* lineSpaceProp( 
+        iNode.GetPropertyL( XnPropertyNames::appearance::common::KFontLineSpace ) );
+        
+    if ( lineSpaceProp )
+        {
+        TInt lineSpace = 
+            iUiEngine->VerticalPixelValueL( lineSpaceProp, iNode.Rect().Height() );
+        
+        CParaFormatLayer*pFormatLayer = CEikonEnv::NewDefaultParaFormatLayerL();
+        CleanupStack::PushL(pFormatLayer);
+        CParaFormat* paraformat = CParaFormat::NewLC(); 
+        TParaFormatMask paraFormatMask; 
+        paraFormatMask.SetAttrib(EAttLineSpacing);
+        paraFormatMask.SetAttrib(EAttLineSpacingControl);
+        paraformat->iLineSpacingControl = CParaFormat::ELineSpacingExactlyInTwips;
+        CGraphicsDevice* screenDevice = iEikonEnv->ScreenDevice();
+        TInt lineHeight = screenDevice->VerticalPixelsToTwips( iFont->HeightInPixels() + lineSpace );
+        paraformat->iLineSpacingInTwips = lineHeight;
+        pFormatLayer->SetL(paraformat, paraFormatMask);
+        iEditor->SetParaFormatLayer(pFormatLayer); // Edwin takes the ownership
+        CleanupStack::PopAndDestroy(paraformat);
+        CleanupStack::Pop(pFormatLayer); 
+        }
+ 
+    // Get text color and set it
+    TRgb textColor;
+    CXnProperty* colorProperty( 
+        iNode.GetPropertyL( XnPropertyNames::appearance::common::KColor ) );
+    
+    if ( colorProperty )
+        {
+        CXnDomProperty* domProperty( colorProperty->Property() );
+        
+        if ( domProperty )
+            {
+            TInt error( KErrNotSupported );
+            
+            CXnDomPropertyValue* value = static_cast< CXnDomPropertyValue* >( 
+                domProperty->PropertyValueList().Item( 0 ) );
+
+            if ( value->IsAutoIdent() )
+                {
+                MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
+                error = AknsUtils::GetCachedColor(skinInstance, textColor, KAknsIIDQsnTextColors,
+                EAknsCIQsnTextColorsCG6);
+                }
+            else if ( value->PrimitiveValueType() == CXnDomPropertyValue::ERgbColor )
+                {
+                textColor = value->RgbColorValueL();
+                error = KErrNone;
+                }
+            else
+                {
+                HBufC* colorString = colorProperty->StringValueL();
+                CleanupStack::PushL( colorString );
+                CXnUtils::StripQuotes( colorString );
+                TInt index = 0;
+                TAknsItemID skinID;
+                TBool idResolved = CXnUtils::ResolveSkinItemIDL( colorString->Des(), skinID, index );
+                
+                if ( idResolved )
+                    {
+                    MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
+                    error = AknsUtils::GetCachedColor( skinInstance, textColor, skinID, index );
+                    }
+                else // use auto value if skin id is invalid.
+                    {
+                    MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
+                    error = AknsUtils::GetCachedColor(skinInstance, textColor, KAknsIIDQsnTextColors,
+                    EAknsCIQsnTextColorsCG6);
+                    }
+                
+                CleanupStack::PopAndDestroy( colorString );                 
+                }
+            
+            if ( error == KErrNone )
+                {
+                cf.iFontPresentation.iTextColor = textColor;
+                }
+            else
+                {
+                cf.iFontPresentation.iTextColor = KRgbBlack;                
+                }
+            }
+        }
+    
+    SetEditorMarginPropertiesL();
+    
+    CCharFormatLayer *pCharFL = CCharFormatLayer::NewL(cf,cfm);
+    iEditor->SetCharFormatLayer(pCharFL);
+    iEditor->SetTextBaselineSpacing( 2 );
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::SetEditorMarginPropertiesL
+// Sets text properties
+// -----------------------------------------------------------------------------
+//
+void CXnTextEditorAdapter::SetEditorMarginPropertiesL()
+    {
+    TMargins8 margins;
+    
+    CXnProperty* leftMarginProp( 
+        iNode.GetPropertyL( XnPropertyNames::texteditor::KEditorMarginLeft ) );
+    if( leftMarginProp )
+        {
+        TInt leftValue = iUiEngine->HorizontalPixelValueL( leftMarginProp,
+                iNode.Rect().Width() );
+        margins.iLeft = leftValue;
+        }
+    
+    CXnProperty* rightMarginProp( 
+        iNode.GetPropertyL( XnPropertyNames::texteditor::KEditorMarginRight ) );
+    if( rightMarginProp )
+        {
+        TInt rightValue = iUiEngine->HorizontalPixelValueL( rightMarginProp,
+                iNode.Rect().Width() );
+        margins.iRight = rightValue;
+        }
+    
+    CXnProperty* topMarginProp( 
+        iNode.GetPropertyL( XnPropertyNames::texteditor::KEditorMarginTop ) );
+    if( topMarginProp )
+        {
+        TInt topValue = iUiEngine->VerticalPixelValueL( topMarginProp,
+                iNode.Rect().Width() );
+        margins.iTop = topValue;
+        }
+    
+    CXnProperty* bottomMarginProp( 
+        iNode.GetPropertyL( XnPropertyNames::texteditor::KEditorMarginBottom ) );
+    if( bottomMarginProp )
+        {
+        TInt bottomValue = iUiEngine->VerticalPixelValueL( bottomMarginProp,
+                iNode.Rect().Width() );
+        margins.iBottom = bottomValue;
+        }
+    
+    iEditor->SetBorderViewMargins( margins );
+    }
+
+// End of file