idlehomescreen/xmluirendering/renderingplugins/xntexteditorfactory/src/xntexteditoradapter.cpp
branchRCL_3
changeset 16 9674c1a575e9
parent 15 ff572dfe6d86
child 30 b8fae6b8a148
--- a/idlehomescreen/xmluirendering/renderingplugins/xntexteditorfactory/src/xntexteditoradapter.cpp	Fri Mar 12 15:41:49 2010 +0200
+++ b/idlehomescreen/xmluirendering/renderingplugins/xntexteditorfactory/src/xntexteditoradapter.cpp	Mon Mar 15 12:39:47 2010 +0200
@@ -25,11 +25,13 @@
 #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>
 
@@ -52,10 +54,9 @@
 
 enum TSplitInputState
     {
-    ESplitInputDisabled = 0,   
-    ESplitInputClosed,
-    ESplitInputOpen,
-    ESplitInputRemoveFromStack         
+    ESplitInputEnabled = 1,   
+    ESplitInputOpen = 2,
+    ESplitInputEditorInStack = 4,
     };
 
 _LIT8( KCpsPublishing, "cpspublishing" );
@@ -72,6 +73,30 @@
 
 // ============================ 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 ===============================
 
 // -----------------------------------------------------------------------------
@@ -109,7 +134,15 @@
 // -----------------------------------------------------------------------------
 //
 CXnTextEditorAdapter::~CXnTextEditorAdapter()
-    {    
+    {  
+    if( IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )    
+        {
+        if( iUiEngine )
+            {
+            iUiEngine->EnablePartialTouchInput( iNode, EFalse );    
+            }
+        }
+
     if ( iAvkonAppUi )
         {
         iAvkonAppUi->RemoveFromStack( iEditor );
@@ -135,6 +168,8 @@
     CXnControlAdapter::ConstructL( iNode );    
     iUiEngine = iNode.UiEngineL();
 
+    iAppui = static_cast< CXnAppUiAdapter* >( iAvkonAppUi );
+    
     // Max line amount
     iMaxLines = 0;
     
@@ -183,13 +218,13 @@
 
     // Enable partial Screen
     CXnProperty* enablepartialinput( iNode.GetPropertyL( KEnablePartialInput ) );
-    iSplitInputState = ESplitInputDisabled;
+    iSplitInputFlags = 0;
      
     if ( enablepartialinput && 
          enablepartialinput->StringValue() == XnPropertyNames::KTrue )
         {
         iEditor->SetAknEditorFlags( EAknEditorFlagEnablePartialScreen );
-        iSplitInputState = ESplitInputClosed;
+        SetFlag( iSplitInputFlags, ESplitInputEnabled );
         }
     
     iEditor->SetObserver( this );
@@ -306,50 +341,48 @@
 // 
 void CXnTextEditorAdapter::FocusChanged( TDrawNow aDrawNow )
     {
-    CXnAppUiAdapter* appui( 
-        static_cast< CXnAppUiAdapter* >( iAvkonAppUi ) );
-    
     TBool isFocused( IsFocused() ? ETrue : EFalse );
-      
     TInt value;
 
     if ( isFocused )
         {      
         value = EPSAiDontForwardNumericKeysToPhone;
 
-        if( iSplitInputState == ESplitInputDisabled )
+        if( !IsFlagSet( iSplitInputFlags, ESplitInputEnabled ) )
             {
-            TRAP_IGNORE( appui->AddToStackL( appui->View(), iEditor ) );            
+            TRAP_IGNORE( iAppui->AddToStackL( iAppui->View(), iEditor ) );  
             // AddToStackL calls iEditor->SetFocus( ETrue ); 
             }
-        else if( iSplitInputState == ESplitInputClosed )
+        else if( !IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )
             {
-            iUiEngine->EnablePartialTouchInput(iNode , ETrue);
-            TRAP_IGNORE( appui->AddToStackL( appui->View(), iEditor ) ); 
-            iSplitInputState = ESplitInputOpen;
+            TRAP_IGNORE( iAppui->AddToStackL( iAppui->View(), iEditor ) ); 
+            SetFlag( iSplitInputFlags, ESplitInputEditorInStack );
             }
         }
     else
         {
         value = EPSAiForwardNumericKeysToPhone;
                                       
-        if( iSplitInputState == ESplitInputDisabled )
+        if( !IsFlagSet( iSplitInputFlags, ESplitInputEnabled ) )
             {    
-            appui->RemoveFromStack( iEditor );            
+            iAppui->RemoveFromStack( iEditor );            
             iEditor->SetFocus( EFalse, aDrawNow );
             }
-        else if( iSplitInputState == ESplitInputRemoveFromStack )
+        
+        // Remove editor from stack if it has not beed removed AND split screen has been closed
+        else if( IsFlagSet( iSplitInputFlags, ESplitInputEditorInStack ) &&
+                 !IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )
             {
-            appui->RemoveFromStack( iEditor );            
+            iAppui->RemoveFromStack( iEditor );            
             iEditor->SetFocus( EFalse, aDrawNow );
-            iSplitInputState = ESplitInputClosed;
+            ClearFlag( iSplitInputFlags, ESplitInputEditorInStack );            
             }            
         }
 
-    if( iSplitInputState == ESplitInputOpen )
+    if( IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )
         {
         value = EPSAiDontForwardNumericKeysToPhone;
-        }
+        } 
 
     iRefusesFocusLoss = isFocused;
     
@@ -369,6 +402,50 @@
     }
 
 // -----------------------------------------------------------------------------
+// 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 ( aType == KAknSplitInputDisabled ) 
+        {
+        if( IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )    
+            {
+            iUiEngine->EnablePartialTouchInput( iNode, EFalse );
+            ClearFlag( iSplitInputFlags, ESplitInputOpen );
+            
+            // 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::HandleControlEventL
 // 
 // -----------------------------------------------------------------------------
@@ -418,35 +495,14 @@
 //
 void CXnTextEditorAdapter::HandleEditorEvent( TInt aReason )
     {
-    CXnAppUiAdapter* appui( 
-        static_cast< CXnAppUiAdapter* >( iAvkonAppUi ) );
- 
-    switch( aReason )
-            {           
-            case CXnTextEditor::KDeactivateTextEditor:
-                {
-                if( iSplitInputState == ESplitInputOpen )
-                     {
-                     iUiEngine->EnablePartialTouchInput(iNode, EFalse);
-                     iSplitInputState = ESplitInputClosed;
-                     appui->RemoveFromStack( iEditor );
-                     iEditor->SetFocus( EFalse );
-                     }              
-                break;
-                }
-            case CXnTextEditor::KRemoveSplitInputFromStack:
-                {
-                iSplitInputState = ESplitInputRemoveFromStack;
-                break;
-                }
-            case CXnTextEditor::KKeepSplitInputInStack:
-                {
-                iSplitInputState = ESplitInputOpen;
-                break;
-                }
-            default:                    
-                break;    
-            }
+    if( aReason == CXnTextEditor::KDeactivateTextEditor &&
+        IsFlagSet( iSplitInputFlags, ESplitInputOpen ) )
+        {
+        iAppui->RemoveFromStack( iEditor );
+        iEditor->SetFocus( EFalse );
+        ClearFlag( iSplitInputFlags, ESplitInputEditorInStack ); 
+        iRefusesFocusLoss = EFalse;
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -575,11 +631,61 @@
                 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