phoneuis/dialer/src/cdialernumberentry.cpp
branchRCL_3
changeset 62 5266b1f337bd
child 69 8baf28733c3d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneuis/dialer/src/cdialernumberentry.cpp	Wed Sep 01 12:30:10 2010 +0100
@@ -0,0 +1,988 @@
+/*
+* 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:  Manager for numberentry 
+*
+*/
+
+
+// INCLUDE FILES
+#include <eikenv.h>
+#include <eikapp.h>
+#include <gulicon.h>
+#include <w32std.h>
+#include <baclipb.h>            // CClipboard
+#include <dialer.rsg>
+#include <eikimage.h>           // CEikImage
+#include <barsread.h>           // TResourceReader
+#include <featmgr.h>
+#include <eiklabel.h> 
+#include <aknappui.h>
+#include <AknUtils.h>
+#include <AknsDrawUtils.h>
+#include <applayout.cdl.h>
+#include <AknLayoutFont.h>
+#include <AknLayout2Def.h>
+#include <AknPhoneNumberEditor.h>
+#include <AknLayout2ScalableDef.h>
+#include <AknsBasicBackgroundControlContext.h>
+#include <AknsFrameBackgroundControlContext.h>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <layoutmetadata.cdl.h>
+
+#include "cdialernumberentry.h"
+#include "dialercommon.h"
+#include "dialertrace.h"
+#include "dialer.hrh"
+#include "mnumberentry.h"
+#include    <dialingextensioninterface.h>
+#include    <phoneappcommands.hrh>
+
+const TInt KNumberEntryControlCount = 2; //  = number entry, label
+
+_LIT( KPhoneValidChars, "0123456789*#+pwPW" );
+_LIT( KPhoneVanityValidChars, "0123456789*#+pwABCDEFGHIJKLMNOPQRSTUVWXYZ" );
+
+const TInt KKeyCtrlA( 1 );
+const TInt KKeyCtrlC( 3 );
+const TInt KKeyCtrlV( 22 );
+const TInt KKeyCtrlX( 24 );
+
+// ========================= MEMBER FUNCTIONS ================================
+
+// ---------------------------------------------------------------------------
+// NewL
+// Symbian OS two phased constructor
+// 
+// ---------------------------------------------------------------------------
+//
+CDialerNumberEntry* CDialerNumberEntry::NewL( 
+    const CCoeControl& aContainer )
+    {
+    CDialerNumberEntry* self = 
+        new( ELeave )CDialerNumberEntry( aContainer );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();    // self
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// Symbian OS two phased constructor
+// 
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::ConstructL()
+    {   
+    DIALER_PRINT("numberentry::ConstructL<");  
+    BaseConstructL();
+ 
+    // Create number entry editor    
+    iEditor = new( ELeave ) CAknPhoneNumberEditor;
+    iEditor->SetContainerWindowL( *this );
+    iEditor->SetParent( this );
+    iEditor->SetMopParent( this );
+    TResourceReader reader;
+    iCoeEnv->CreateResourceReaderLC( reader, R_INPUTFIELD );
+    ConstructEditorFromResourceL( reader );
+    
+    iFrameContext = CAknsFrameBackgroundControlContext::NewL(
+            KAknsIIDNone, TRect(0,0,4,4), TRect(1,1,3,3), EFalse );
+            
+    iFrameContext->SetFrame( KAknsIIDQsnFrInput );
+    
+    iFrameContext->SetParentContext( 
+        AknsDrawUtils::ControlContextOfParent(this) );
+                
+    CleanupStack::PopAndDestroy();    // reader
+    iEditor->SetObserver( this );
+    
+    iLabel = new( ELeave ) CEikLabel;
+    iLabel->SetContainerWindowL( *this );
+    iLabel->SetParent( this );
+    iLabel->SetMopParent( this ); 
+    iLabel->SetTextL( KNullDesC );
+    iLabel->MakeVisible( EFalse );
+    CheckLabelSkinningColor();
+    
+    iAppUi = iEikonEnv->EikAppUi();
+    __ASSERT_ALWAYS( iAppUi, DialerPanic( EDialerPanicNoApplicationInstance ) );
+    
+    iLateFocuser = CIdle::NewL( CActive::EPriorityIdle );
+    
+    ActivateL();
+    DIALER_PRINT("numberentry::ConstructL>");
+    }
+
+
+// Constructor
+CDialerNumberEntry::CDialerNumberEntry(
+    const CCoeControl& aContainer )
+    : CDialerContainerBase ( const_cast<CCoeControl&>(aContainer)  )
+	{
+	}
+
+
+// Destructor
+CDialerNumberEntry::~CDialerNumberEntry()
+    {
+    AknsUtils::DeregisterControlPosition( this );
+    
+    delete iEditor;
+    delete iFrameContext;
+    delete iLabel;
+    
+    if ( iLateFocuser ) 
+        {
+        iLateFocuser->Cancel();
+        }
+    delete iLateFocuser;
+    
+    }
+
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::SetNumberEntryObserver 
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::SetNumberEntryObserver( 
+                                MNumberEntryObserver& aObserver )
+    {
+    iObserver = &aObserver;
+    }
+        
+// ---------------------------------------------------------------------------
+// Delays the setting of focus or removes the focus
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::SetFocus( TBool aFocus, TDrawNow aDrawNow )
+    {
+    DIALER_PRINT("numberentry::SetFocus<");  
+    
+    TBool vkbOpen = ( iEditor->AknEditorFlags() & EAknEditorFlagTouchInputModeOpened );
+    
+    iLateFocuser->Cancel(); 
+    if ( aFocus && !vkbOpen )
+        {
+        // The setting of focus needs to be delayed, because otherwise
+        // editors cursor is drawn first. Cursor can be seen clearly
+        // when going from landscape mode homescreen to dialer (when
+        // dialer's support for landscape mode has been removed)
+        // The reason behind this is that giving a focus to editor will cause 
+        // enabling of cursor in window server and the window server's
+        // render plugin will draw the cursor first, before the 
+        // dialer gets drawn. The delay in dialer drawing is caused by the
+        // screen rotation from landscape to portrait.
+        iLateFocuser->Start( TCallBack( SetLateFocus, this ) );
+        }
+    else 
+        {       
+        DoSetFocus( aFocus, aDrawNow );
+        }
+    DIALER_PRINT("numberentry::SetFocus>");
+    }
+    
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::SetLateFocus 
+// ---------------------------------------------------------------------------
+//
+TInt CDialerNumberEntry::SetLateFocus( TAny* aThis )
+    {  
+    DIALER_PRINT("numberentry::SetLateFocus<");
+    CDialerNumberEntry* self = static_cast<CDialerNumberEntry*>( aThis );
+
+    self->DoSetFocus( ETrue, ENoDrawNow );
+    
+    DIALER_PRINT("numberentry::SetLateFocus>");
+    return KErrNone;
+    }
+    
+// ---------------------------------------------------------------------------
+// Set the focuss
+// ---------------------------------------------------------------------------
+// 
+void CDialerNumberEntry::DoSetFocus( TBool aFocus, TDrawNow aDrawNow )
+    {
+    DIALER_PRINT("numberentry::DoSetFocus<");  
+    // IsFocused() and iEditor->IsFocused() may return other values besides ETrue
+    // and EFalse. This is why we need to check their return values against zero
+    // and use the result in comparison against aFocus.
+    if ( aFocus != (IsFocused() ? ETrue : EFalse) )
+        {
+        CCoeControl::SetFocus( aFocus, aDrawNow );
+        }
+    
+    if ( aFocus != (iEditor-> IsFocused() ? ETrue : EFalse ) )
+        {
+        iEditor->SetFocus( aFocus );
+        }   
+    DIALER_PRINT("numberentry::DoSetFocus>");  
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::TextLength 
+// ---------------------------------------------------------------------------
+//
+TInt CDialerNumberEntry::TextLength()
+    {
+    return iEditor->TextLength();
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::GetNumberEntry
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CDialerNumberEntry::GetNumberEntry( ) const
+    {
+    return iEditor;
+    }
+    
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::CreateNumberEntry
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::CreateNumberEntry()
+    {
+    iEditor->SetFocus( ETrue );
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::ChangeEditorMode
+// ---------------------------------------------------------------------------
+//
+TInt CDialerNumberEntry::ChangeEditorMode( TBool aDefaultMode )
+    {
+    return iEditor->ChangeEditorMode( aDefaultMode );
+    }
+    
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::GetEditorMode  
+// ---------------------------------------------------------------------------
+//
+TInt CDialerNumberEntry::GetEditorMode() const
+    {
+    return iEditor->GetEditorMode();
+    }
+    
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::SetTextToNumberEntry
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::SetTextToNumberEntry( const TDesC& aDesC )
+    {
+    DIALER_PRINT("numberentry::SetTextToNumberEntry<");
+    
+    iEditor->SetText( aDesC );
+    
+    if ( iEasyDialer && iOperationMode == EModeEasyDialing )
+        {
+        TRAP_IGNORE( iEasyDialer->SetInputL( aDesC ) );
+        }
+    
+    iEditor->DrawNow();
+    
+    DIALER_PRINT("numberentry::SetTextToNumberEntry>");
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::GetTextFromNumberEntry
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::GetTextFromNumberEntry( TDes& aDes )
+    {
+    iEditor->GetText( aDes );
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::Text
+// ---------------------------------------------------------------------------
+//
+TPtrC CDialerNumberEntry::Text() const
+    {
+    return iEditor->Text();
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::ResetEditorToDefaultValues
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::ResetEditorToDefaultValues()
+    {
+    iEditor->SetFocus( EFalse );
+    SetTextToNumberEntry( KNullDesC );
+    iEditor->ResetEditorToDefaultValues();
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::SetNumberEntryPromptTextL
+//  
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::SetNumberEntryPromptTextL( const TDesC& aPromptText )
+    {
+    if ( aPromptText.Length() )
+        {
+        iLabel->MakeVisible( ETrue );
+        }
+    else
+        {
+        iLabel->MakeVisible( EFalse );
+        }
+    
+    iLabel->SetTextL( aPromptText );   
+    }
+
+// ----------------------------------------------------------------------------
+// CDialerNumberEntry::HandleCommandL
+// Handles NE specific commands.
+// ----------------------------------------------------------------------------
+//
+TBool CDialerNumberEntry::HandleCommandL( TDialerCommandId aCommand)
+    {
+    DIALER_PRINTF("numberentry::HandleCommandL<:", aCommand); 
+    
+    TBool handled( ETrue );
+    switch ( aCommand )
+        {
+        case EDialerCmdTouchInput:  // open touch input (VKB)
+            {
+            StartVirtualKeyBoard();
+            }
+            break;
+        default:
+            {
+            handled = EFalse;
+            }
+            break;
+        }
+    
+    DIALER_PRINT("numberentry::HandleCommandL>");         
+    return handled;
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::ClearEditorFlags
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::ClearEditorFlags()
+    {
+    iEditor->ResetEditorToDefaultValues();
+    }
+
+// ---------------------------------------------------------------------------
+//  CDialerNumberEntry::HandleControlEventL
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::HandleControlEventL( CCoeControl* aControl, 
+                                              TCoeEvent aEventType )
+    {
+    DIALER_PRINT("numberentry::HandleControlEventL<"); 
+    
+    if ( aControl == iEditor && aEventType == EEventStateChanged )
+        {
+        HandleEditorFormatting();
+        
+        InformNumberEntryState();
+        
+        iEditor->DrawDeferred();
+        }
+    
+    DIALER_PRINT("numberentry::HandleControlEventL>");
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::OfferKeyEventL
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CDialerNumberEntry::OfferKeyEventL( 
+                                            const TKeyEvent& aKeyEvent, 
+                                            TEventCode aType )
+    {
+    TKeyResponse handled = EKeyWasNotConsumed;
+        
+    // First, offer keyevent to easy dialer.
+    if (iEasyDialer)
+        {
+        handled = iEasyDialer->OfferKeyEventL(aKeyEvent, aType);
+        }
+        
+    // Then to number entry editor. 
+    if (handled == EKeyWasNotConsumed)
+        {
+        // Clipboard support
+        if ( aKeyEvent.iCode == KKeyCtrlA ) // CTRL + A
+            {
+            iEditor->SelectAllL();
+            handled = EKeyWasConsumed;
+            }
+        else if ( aKeyEvent.iCode == KKeyCtrlC ) // CTRL + C
+            {
+            iEditor->CcpuCopyL();
+            handled = EKeyWasConsumed;
+            }
+        else if ( aKeyEvent.iCode == KKeyCtrlV ) // CTRL + V
+            {
+            iEditor->CcpuPasteL();
+            handled = EKeyWasConsumed;
+            }
+        else if ( aKeyEvent.iCode == KKeyCtrlX ) // CTRL + X
+            {
+            iEditor->CcpuCutL();
+            handled = EKeyWasConsumed;
+            }
+        // Key events 1 - 28 can be generated by CTRL + key combinations.
+        // Filter all unwanted key events, only BS is accepted by editor.
+        else if ( aKeyEvent.iCode == EKeyBackspace || aKeyEvent.iCode >= EKeySpace )
+            {
+            handled = iEditor->OfferKeyEventL(aKeyEvent, aType);
+            }
+        }
+    
+    return handled;
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::CountComponentControls 
+// ---------------------------------------------------------------------------
+//
+TInt CDialerNumberEntry::CountComponentControls() const
+    {
+    return KNumberEntryControlCount;
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::ComponentControl
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CDialerNumberEntry::ComponentControl( TInt aIndex ) const
+    {
+    __ASSERT_DEBUG( aIndex < KNumberEntryControlCount, 
+                             User::Panic(_L("Dialer"), KErrArgument) );
+    
+    if ( aIndex == 0 )
+        {
+        return iEditor;
+        }
+    else if ( aIndex == 1 )
+        {
+        return iLabel;
+        }
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::Draw
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::Draw( const TRect& /*aRect*/ ) const
+    {
+    CWindowGc& gc = SystemGc( );
+    gc.SetBrushColor( AKN_LAF_COLOR( 0 /** White - get from layout */ ));
+    TRect rect = Rect();
+    
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    
+    // Draw the skin background of the parent 
+    if ( !AknsDrawUtils::DrawFrame( skin,
+                             (CWindowGc&) gc,  
+                             iOuterRect,
+                             iInnerRect,
+                             KAknsIIDQsnFrInput,
+                             KAknsIIDDefault ))
+        {
+        DIALER_PRINT("numberentry::Draw.Frame.failed"); 
+        }
+                            
+    gc.SetBrushStyle( CGraphicsContext::ENullBrush );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::SetVariety
+// Set variety according to status
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::SetVariety()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::SetLayout
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::SetLayout()
+    {
+    AknsUtils::RegisterControlPosition( this );
+
+    TDialerVariety variety( EDialerVarietyLandscape );
+    if ( !Layout_Meta_Data::IsLandscapeOrientation() )
+        {
+        variety = EDialerVarietyPortrait;
+        }      
+        
+    TRect parentRect( Rect() );
+    TAknTextComponentLayout neLayout = ( iOperationMode == EModeEasyDialing ?
+        AknLayoutScalable_Apps::dia3_numentry_pane_t1( variety ) :
+        AknLayoutScalable_Apps::dialer2_ne_pane_t1( variety ) );
+
+    AknLayoutUtils::LayoutControl(
+        iEditor, parentRect, 
+        neLayout.C(),
+        neLayout.l(),
+        neLayout.t(),
+        neLayout.r(),
+        neLayout.b(),
+        neLayout.W(),
+        neLayout.H()
+        );
+
+    RectFrameInnerOuterRects(
+           parentRect,
+           iOuterRect,
+           iInnerRect );
+
+    UpdateNumberEntryFormats();
+      
+    iFrameContext->SetFrameRects( iOuterRect, iInnerRect );
+                
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    AknsDrawUtils::PrepareFrame( skin,
+                                 iOuterRect,
+                                 iInnerRect,
+                                 KAknsIIDQsnFrInput,
+                                 KAknsIIDDefault ); 
+    // Label layout
+
+    // Portrait variety is temporarily used also in landscape.
+    // Landscape layout data is now unavailable. 
+    TAknTextComponentLayout labelLayout = 
+        AknLayoutScalable_Apps::dialer2_ne_pane_t2( EDialerVarietyPortrait );
+    // Temporary solution 
+    labelLayout.Setl( neLayout.l() );
+    AknLayoutUtils::LayoutLabel( iLabel, parentRect, labelLayout );
+    
+    HandleEditorFormatting();
+    iEditor->DrawDeferred();
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::ConstructEditorFromResourceL 
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::ConstructEditorFromResourceL( 
+                                TResourceReader& aReader )
+    {
+    TInt maxChars = aReader.ReadInt16();
+    TInt maxLines = aReader.ReadInt16();
+    HBufC* truncation = aReader.ReadHBufCL();
+    CleanupStack::PushL( truncation );
+    TInt formatCount = aReader.ReadInt16();
+    iEditor->ConstructL( maxChars, maxLines, formatCount, *truncation );
+    CleanupStack::PopAndDestroy( truncation );
+    iFormatCount = formatCount;
+
+    for ( TInt ii = 0; ii < iFormatCount; ii++ )
+        {
+        CAknPhoneNumberEditor::TFormat format( aReader );
+        CalculateLayout( format, ii );
+        iEditor->AddFormat( format );
+        }
+
+    iEditor->SetFormat( KDialerNELayoutLargeFont );
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::UpdateNumberEntryFormats
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::UpdateNumberEntryFormats( )
+    {
+    DIALER_PRINT("numberentry::UpdateNumberEntryFormats<");
+    TInt currentFormat = iEditor->CurrentFormatIndex();
+
+    for ( TInt ii = 0; ii < iFormatCount; ii++ )
+        {
+        CAknPhoneNumberEditor::TFormat format( iEditor->Format( ii ) );
+        CalculateLayout( format, ii );
+        iEditor->Format( ii ) = format;
+        }
+
+    iEditor->SetFormat( currentFormat );
+    DIALER_PRINT("numberentry::UpdateNumberEntryFormats>");
+    }
+    
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::CalculateLayout
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::CalculateLayout( 
+        CAknPhoneNumberEditor::TFormat& aFormat, TInt aNEVariety )
+    {
+    TAknLayoutText textsLine1Text;
+    TAknLayoutText textsLine2Text;
+
+    if ( iOperationMode == EModeEasyDialing )
+        {
+        TInt variety = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+        textsLine1Text.LayoutText( Rect(), AknLayoutScalable_Apps::dia3_numentry_pane_t1(variety) );        
+        textsLine2Text = textsLine1Text;
+        }
+    else
+        {
+        TInt variety = 0;
+        if ( aNEVariety == KDialerNELayoutLargeFont )
+            {
+            variety = Layout_Meta_Data::IsLandscapeOrientation() ? 2 : 0;
+            }
+        else
+            {
+            variety = Layout_Meta_Data::IsLandscapeOrientation() ? 3 : 1;
+            }
+
+        //Line 1
+        textsLine1Text.LayoutText( Rect(), 
+            AknLayoutScalable_Apps::dialer2_ne_pane_t1( variety, 0, 0 ) );  
+        //Line 2     
+        textsLine2Text.LayoutText( Rect(), 
+            AknLayoutScalable_Apps::dialer2_ne_pane_t1( variety, 0, 1 ) );
+        }
+    
+    //take font from line 1
+    aFormat.iFont = textsLine1Text.Font();
+    const CAknLayoutFont* layoutFont = CAknLayoutFont::AsCAknLayoutFontOrNull( aFormat.iFont );
+    aFormat.iBottomBaselineOffset = layoutFont->BaselineToTextPaneBottom();
+
+    // Calculate baselineSeparation from the difference of the second 
+    // line and the first line bottom right Y coordinates.
+    TInt baselineSeparation = 
+        textsLine2Text.TextRect().iBr.iY - textsLine1Text.TextRect().iBr.iY;
+    aFormat.iBaselineSeparation = baselineSeparation;
+
+    // Outer rect of the text editor is the inner rect of the whole text box
+    aFormat.iOuterRect = iInnerRect;
+    
+    aFormat.iNumLines = 1;
+    
+    // If multiline layout is to be used, the exact number of lines is calculated 
+    // based on available area and the row height (i.e. baselineSeparation)
+    if ( baselineSeparation > 0 && baselineSeparation < iInnerRect.Height() )
+        {
+        aFormat.iNumLines = ( iInnerRect.Height() / baselineSeparation );
+
+        // Center editor vertically to the available area.
+        TInt editorHeight = aFormat.iNumLines * baselineSeparation;
+        TInt deltaHeight = ( iInnerRect.Height() - editorHeight ) / 2;
+        aFormat.iOuterRect.Shrink( 0, deltaHeight );
+        }
+	}
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::HandleResourceChange  
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::HandleResourceChange( TInt aType )
+    {
+    CCoeControl::HandleResourceChange( aType );
+    
+    if ( aType == KAknsMessageSkinChange )
+        {
+        CheckLabelSkinningColor(); 
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::HandlePointerEventL  
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+    {
+    // Normal pointer event handling and delegation to editor component 
+    // happens only if we are already in focus. Otherwise we just take the
+    // focus. This is to prevent accidental cursor movements as putting the
+    // cursor back to the end of the text is difficult for right-aligned
+    // text.
+    if ( iEditor->IsFocused() )
+        {
+        // If user hits the margin area between this control and the actual editor
+        // control, then the event position is moved to be inside the editor region.
+        // This makes it easier to move cursor with finger touch, especially in
+        // both ends of the number field.
+        TPoint eventPos( aPointerEvent.iPosition );
+        TRect editorRect( iEditor->Rect() );
+        editorRect.Shrink( 1, 1 ); // take rect which is fully inside the editor rect
+        eventPos.iX = Min( eventPos.iX, editorRect.iBr.iX );
+        eventPos.iX = Max( eventPos.iX, editorRect.iTl.iX );
+        eventPos.iY = Min( eventPos.iY, editorRect.iBr.iY );
+        eventPos.iY = Max( eventPos.iY, editorRect.iTl.iY );
+    
+        TPointerEvent modEvent( aPointerEvent );
+        modEvent.iPosition = eventPos;
+        
+        CCoeControl::HandlePointerEventL( modEvent );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::HandleEditorFormatting  
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::HandleEditorFormatting()
+    {
+    TInt format( KDialerNELayoutLargeFont );
+  
+    if ( !iEditor->WouldTextFitInFormat( KDialerNELayoutLargeFont )  )
+        {
+        format = KDialerNELayoutSmallFont;
+        }
+   
+    if ( iEditor->CurrentFormatIndex() != format )
+        {
+        iEditor->DrawDeferred();
+        iEditor->SetFormat( format );
+        iFrameContext->SetRect( Rect() );
+        }
+    
+    }
+
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::StartVirtualKeyBoard 
+// ---------------------------------------------------------------------------
+//
+void CDialerNumberEntry::StartVirtualKeyBoard( )
+    {
+    // To change focus to VKB, if not called VKB will not come visible
+    iLateFocuser->Cancel();
+    DoSetFocus( ETrue, ENoDrawNow );
+    iEikonEnv->SyncNotifyFocusObserversOfChangeInFocus();
+    iEditor->OpenVKB();
+    }
+  
+// ---------------------------------------------------------------------------
+// CDialerNumberEntry::MopSupplyObject
+// ---------------------------------------------------------------------------
+//
+TTypeUid::Ptr CDialerNumberEntry::MopSupplyObject( TTypeUid aId )  
+    {
+    if ( aId.iUid == MAknsControlContext::ETypeId && iFrameContext )
+        {
+        return MAknsControlContext::SupplyMopObject( aId, iFrameContext );
+        }
+    else
+        {
+        return CCoeControl::MopSupplyObject( aId );
+        } 
+    }    
+    
+// -----------------------------------------------------------------------------
+// CDialerNumberEntry::RectFrameInnerOuterRects
+// -----------------------------------------------------------------------------
+//
+void CDialerNumberEntry::RectFrameInnerOuterRects( const TRect& aFrameRect,
+                                              TRect& aOuterRect,
+                                              TRect& aInnerRect )
+    {
+    if ( iOperationMode == EModeEasyDialing )
+        {
+        aOuterRect = aFrameRect;
+        TAknLayoutRect innerRectLayout;
+        innerRectLayout.LayoutRect( aOuterRect, AknLayoutScalable_Apps::bg_dia3_numentry_pane_g1() );
+        aInnerRect = innerRectLayout.Rect();
+        
+        // Add a bit of margin to left and right ends of the entry field if layout
+        // doens't define enough. This is to enhance the touch usability.
+        static const TInt KMinMargin( 15 );
+        aInnerRect.iTl.iX = Max( aInnerRect.iTl.iX, aOuterRect.iTl.iX + KMinMargin );
+        aInnerRect.iBr.iX = Min( aInnerRect.iBr.iX, aOuterRect.iBr.iX - KMinMargin );
+        }
+    else
+        {
+        if ( Layout_Meta_Data::IsMirrored() )
+            {
+            TAknLayoutRect frameTopRight;
+            frameTopRight.LayoutRect( 
+                aFrameRect, 
+                AknLayoutScalable_Apps::bg_popup_call2_rect_pane_g3().LayoutLine() );
+                    
+            TAknLayoutRect frameBottomLeft;
+            frameBottomLeft.LayoutRect( 
+                aFrameRect, 
+                AknLayoutScalable_Apps::bg_popup_call2_rect_pane_g4().LayoutLine() );
+    
+            aOuterRect = TRect( frameTopRight.Rect().iTl, 
+                                frameBottomLeft.Rect().iBr );
+                    
+            aInnerRect = TRect( frameTopRight.Rect().iBr, 
+                                frameBottomLeft.Rect().iTl );
+            }
+        else
+            {
+            TAknLayoutRect frameTopLeft;
+            frameTopLeft.LayoutRect( 
+                aFrameRect, 
+                AknLayoutScalable_Apps::bg_popup_call2_rect_pane_g2().LayoutLine() );
+    
+            TAknLayoutRect frameBottomRight;
+            frameBottomRight.LayoutRect( 
+                aFrameRect, 
+                AknLayoutScalable_Apps::bg_popup_call2_rect_pane_g5().LayoutLine() );
+            
+            aOuterRect = TRect( frameTopLeft.Rect().iTl, 
+                                frameBottomRight.Rect().iBr );
+            aInnerRect = TRect( frameTopLeft.Rect().iBr, 
+                                frameBottomRight.Rect().iTl );
+            }
+        }
+    }    
+    
+// -----------------------------------------------------------------------------
+// CDialerNumberEntry::InformNumberEntryState()
+// -----------------------------------------------------------------------------
+//
+void CDialerNumberEntry::InformNumberEntryState()
+    {
+    if ( !iNumberContents && iEditor->TextLength() )
+        {
+        // Hide prompt text
+        if ( iLabel->Text()->Length() )
+            {
+            iLabel->MakeVisible( EFalse );
+            }         
+        iNumberContents = ETrue;
+        }
+    else if ( iNumberContents && !iEditor->TextLength() )
+        {  
+        // Show prompt text
+        if ( iLabel->Text()->Length() )
+            {
+            iLabel->MakeVisible( ETrue );
+            } 
+        iNumberContents = EFalse;
+        } 
+
+    if ( iPreviousNumberEntryContent.Compare( iEditor->Text() ) != 0 )
+        {
+        iPreviousNumberEntryContent.Zero();
+        iEditor->GetText( iPreviousNumberEntryContent );
+
+        // The following stores the information of validity of the number for normal calls.
+        // This information is needed so that we don't show call items for invalid numbers.
+        TBool validPhoneNumber = Validate( iEditor->Text() );
+        TInt commandId = validPhoneNumber ? EPhoneDialerValidNumber : EPhoneDialerInvalidNumber;
+        
+        TRAP_IGNORE( iAppUi->HandleCommandL( commandId ) );
+    
+        if ( iEasyDialer && iOperationMode == EModeEasyDialing )
+            {
+            TRAP_IGNORE( iEasyDialer->SetInputL( iEditor->Text() ) );
+            }
+
+        if ( iObserver )
+            {
+            iObserver->NumberEntryStateChanged( iNumberContents );
+            }
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CDialerNumberEntry::CheckLabelSkinningColor()
+// -----------------------------------------------------------------------------
+//
+void CDialerNumberEntry::CheckLabelSkinningColor()
+    {
+    // Check skinning colour for the prompt text:
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    TRgb skinColor;
+    TInt error = 
+        AknsUtils::GetCachedColor( 
+            skin, 
+            skinColor, 
+            KAknsIIDQsnTextColors,
+            EAknsCIQsnTextColorsCG51 );
+            
+    if ( error == KErrNone )
+        {
+        // Ignore error
+        TRAP_IGNORE( iLabel->OverrideColorL( EColorLabelText, skinColor ) );
+        }   
+    }
+
+// -----------------------------------------------------------------------------
+// CDialerNumberEntry::MakeVisible( TBool aVisible )
+// -----------------------------------------------------------------------------
+//	
+void CDialerNumberEntry::MakeVisible( TBool aVisible )
+	{
+	CCoeControl::MakeVisible( aVisible );
+	iEditor->MakeVisible( aVisible );
+	}
+
+// -----------------------------------------------------------------------------
+// CDialerNumberEntry::SetEasyDialingPlugin
+// -----------------------------------------------------------------------------
+//
+void CDialerNumberEntry::SetEasyDialingPlugin(CDialingExtensionInterface* aEasyDialer)
+    {
+    DIALER_PRINT("numberentry::SetEasyDialingPlugin");
+    iEasyDialer = aEasyDialer;
+    }
+
+// -----------------------------------------------------------------------------
+// CDialerNumberEntry::SetOperationMode
+// -----------------------------------------------------------------------------
+//
+void CDialerNumberEntry::SetOperationMode( TDialerOperationMode aMode )
+    {
+    iOperationMode = aMode;
+    }
+
+// -----------------------------------------------------------------------------
+// CDialerNumberEntry::Validate
+// -----------------------------------------------------------------------------
+//
+TBool CDialerNumberEntry::Validate( const TDesC& aString )
+    {
+    DIALER_PRINT("numberentry::Validate");
+    
+    if ( aString.Length() == 0 )
+        {
+        return EFalse;
+        }
+    
+    // check first character
+    TPtrC valid( KPhoneValidChars );
+    if ( valid.Locate( aString[0] ) == KErrNotFound )
+        {
+        return EFalse;
+        }
+    
+    // if vanitydialing feature is enabled, also capital A-Z are accepted after first character
+    if ( FeatureManager::FeatureSupported( KFeatureIdFfHomeScreenVanityDialing ) )
+        {
+        valid.Set( KPhoneVanityValidChars );
+        }
+    
+    // check rest of the string
+    for ( TInt i = 1; i < aString.Length(); i++ )
+        {
+        if ( valid.Locate( aString[i] ) == KErrNotFound )
+            {
+            return EFalse;
+            }
+        }
+    
+    return ETrue;
+    }
+
+// End of File