idlehomescreen/xmluirendering/renderingplugins/xntexteditorfactory/src/xntexteditoradapter.cpp
changeset 0 f72a12da539e
child 9 f966699dea19
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/xmluirendering/renderingplugins/xntexteditorfactory/src/xntexteditoradapter.cpp	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,505 @@
+/*
+* 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 <txtglobl.h>
+#include <txtfmlyr.h>
+#include <txtfrmat.h>
+#include <txtrich.h>
+#include <gdi.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"
+
+const TInt KMaxLength = 100;
+
+_LIT8( KCpsPublishing, "cpspublishing" );
+_LIT8( KMaxLineAmount, "max-line-amount" );
+_LIT8( KMaxCharAmount, "max-char-amount" );
+
+_LIT( KEnterChar, "\x2029" );
+
+// Local macros
+#define IS_ARROW_KEY( k ) \
+    ( k == EStdKeyLeftArrow || k == EStdKeyRightArrow || \
+      k == EStdKeyUpArrow || k == EStdKeyDownArrow ) 
+
+// ============================ LOCAL FUNCTIONS ================================   
+
+// ============================ 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 ( 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();
+
+    // 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 );
+    
+    // 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 );
+    
+    iEditor->SetSuppressBackgroundDrawing( ETrue );
+                      
+    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 )
+    {
+    CXnAppUiAdapter* appui( 
+        static_cast< CXnAppUiAdapter* >( iAvkonAppUi ) );
+    
+    TBool isFocused( IsFocused() ? ETrue : EFalse );
+      
+    TInt value;
+
+    if ( isFocused )
+        {      
+        value = EPSAiDontForwardNumericKeysToPhone;
+                       
+        TRAP_IGNORE( appui->AddToStackL( appui->View(), iEditor ) );
+        
+        // AddToStackL calls iEditor->SetFocus( ETrue ); 
+        }
+    else
+        {
+        value = EPSAiForwardNumericKeysToPhone;
+                                      
+        appui->RemoveFromStack( iEditor );
+        
+        iEditor->SetFocus( EFalse, aDrawNow );
+        }
+    
+    iRefusesFocusLoss = isFocused;
+    
+    RProperty::Set( KPSUidAiInformation,            
+                    KActiveIdleForwardNumericKeysToPhone,
+                    value );    
+    }
+    
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::Draw
+// Draws the editor component
+// -----------------------------------------------------------------------------
+//
+void CXnTextEditorAdapter::Draw( const TRect& aRect ) const
+    {                           
+    CXnControlAdapter::Draw( aRect );
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::HandleControlEventL
+// 
+// -----------------------------------------------------------------------------
+//    
+void CXnTextEditorAdapter::HandleControlEventL( CCoeControl* aControl, 
+    TCoeEvent aEventType )
+    {
+    if ( aControl == iEditor )
+        {
+        // If background drawing is suppressed, then we need to call draw here
+        if ( aEventType == EEventStateChanged )
+            {
+            DrawNow();                                    
+            }        
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CXnTextEditorAdapter::SetTextL
+// Sets the new content to the underlying CEikEdwin
+// -----------------------------------------------------------------------------
+//
+void CXnTextEditorAdapter::SetTextL( const TDesC& aText )
+    {
+    iEditor->SetTextL( &aText );
+    }
+    
+// -----------------------------------------------------------------------------
+// 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::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;                
+                }
+            }
+        }    
+    
+    CCharFormatLayer *pCharFL = CCharFormatLayer::NewL(cf,cfm);
+    iEditor->SetCharFormatLayer(pCharFL);
+    iEditor->SetTextBaselineSpacing( 2 );
+    }
+
+// End of file