phoneuis/BubbleManager/Src/BMBubbleOutlookNE.cpp
changeset 0 5f000ab63145
child 9 8871b09be73b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneuis/BubbleManager/Src/BMBubbleOutlookNE.cpp	Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,1188 @@
+/*
+* Copyright (c) 2002-2005 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:  Outlook Number Entry
+*
+*/
+
+
+// INCLUDE FILES
+#include    "BMBubbleManager.h" 
+#include    "BMBubbleOutlookNE.h"
+#include    "BMBubbleImageManager.h"
+#include    "BMBubbleHeader.h"
+#include    "BMUtils.h"
+#include    "BMResourceManager.h"
+#include    "BMLayout.h"
+#include    "BMLayout2.h"
+
+#include    <eiklabel.h>
+#include    <eikimage.h>
+#include    <eikenv.h>
+#include    <AknPhoneNumberEditor.h>
+#include    <AknsBasicBackgroundControlContext.h>
+#include    <AknsFrameBackgroundControlContext.h>
+#include    <AknsDrawUtils.h>
+#include    <AknLayoutFont.h>
+#include    <applayout.cdl.h>
+#include    <aknappui.h>
+#include    <eikspane.h>
+#include    <AknStatuspaneUtils.h>
+
+//for resources
+#include    <barsread.h>
+#include    <Bubblemanager.rsg>
+
+// CONSTANTS
+const TUint8 KBubbleNE1LongLineFormat = 0;
+const TUint8 KBubbleNE2LongLineFormat = 1;
+const TUint8 KBubbleNE1ShortLineFormat = 2;
+const TUint8 KBubbleNE2ShortLineFormat = 3;
+const TUint8 KBubbleNEIdleStateFormat = 4;
+
+const TInt KBubbleNEFormatOffsetIfNoStatusPane = 5;
+
+
+
+// ========================= MEMBER FUNCTIONS ================================
+
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::CBubbleOutlookNumberEntry
+//
+//  
+// ---------------------------------------------------------------------------
+//
+CBubbleOutlookNumberEntry::CBubbleOutlookNumberEntry( 
+                                    CBubbleManager& aBubbleManager,
+                                    const CCoeControl& aMutedImage )
+: CBubbleOutlook( aBubbleManager ) , iMutedImage( aMutedImage )
+
+    {
+
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::ConstructL
+// 
+// ---------------------------------------------------------------------------
+//
+
+void CBubbleOutlookNumberEntry::ConstructL()
+    {
+    iPlace = ENENone;
+    iIsUsed = EFalse;
+    iEditor = NULL;
+
+    // Create skin background control context,
+    // the actual image ID and rectangle will be set later
+    if ( iCallObjectDisplay )
+        {
+        iFrameContext = CAknsFrameBackgroundControlContext::NewL(
+            KAknsIIDNone, TRect(0,0,4,4), TRect(1,1,3,3), EFalse );
+        }
+    else
+        {
+        iSkinContext = CAknsBasicBackgroundControlContext::NewL(
+            KAknsIIDNone, TRect(0,0,1,1), EFalse );
+        }    
+    
+    // Create editor from resources:
+    iEditor = new( ELeave ) CAknPhoneNumberEditor;
+    iEditor->SetContainerWindowL( *this );
+    iEditor->SetParent( this );
+
+    TResourceReader reader;
+    iCoeEnv->CreateResourceReaderLC( reader, R_BUBBLEMANAGER_EDITOR );
+    ConstructEditorFromResourceAndLayoutL( reader );
+
+    CleanupStack::PopAndDestroy();    // reader
+
+    iEditor->SetObserver( this );
+    iEditor->SetFormat( KBubbleNEIdleStateFormat );
+    
+    iStatusPane = static_cast<CAknAppUi*>(iEikonEnv->
+        EikAppUi() )->StatusPane();
+
+    CBubbleOutlook::ConstructL( );
+
+    SetBlank();
+    ActivateL();
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::~CBubbleOutlookNumberEntry
+//
+//  
+// ---------------------------------------------------------------------------
+//
+CBubbleOutlookNumberEntry::~CBubbleOutlookNumberEntry()
+    {
+    if ( iBubble )
+        {
+        iBubbleManager.ResourceManager().ReleaseEikImage( iBubble );
+        }
+    delete iEditor;
+    delete iSkinContext;
+    delete iFrameContext;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::Reset
+//
+//  
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::Reset( )
+    {
+    if ( iBubble )
+        {
+        iBubbleManager.ResourceManager().ReleaseEikImage( iBubble );
+        }
+    iPlace = ENENone;
+    iIsUsed = EFalse;
+    iEditor->SetFocus( EFalse );
+    SetText( KNullDesC );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::ReadBubbleHeader
+//
+//  
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::ReadBubbleHeader( CBubbleHeader& /*aHeader*/ )
+    {
+    // ignore
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::SetPlace
+//
+//  
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::SetPlace( const TPhoneNumberEntryPlace& aPlace )
+    {
+    if ( iPlace == aPlace )
+        {
+        return;
+        }
+
+    iPlace = aPlace;
+
+    if ( iCallObjectDisplay )
+        {
+        SetPlace2( iPlace );
+        }
+    else
+        {
+        SetPlace1( iPlace );
+        }        
+
+    SizeChanged();
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::SetPlace1
+//
+//  
+// ---------------------------------------------------------------------------
+//    
+void CBubbleOutlookNumberEntry::SetPlace1( 
+    const TPhoneNumberEntryPlace& aPlace )
+    {
+    switch ( aPlace )
+        {
+        case ENEBottom:
+            {
+            if ( iBubble )
+                {
+                iBubbleManager.ResourceManager().ReleaseEikImage( iBubble );
+                }
+        
+            iBubble = iBubbleManager.ResourceManager().ReserveEikImage( ETrue );
+                    
+            iBubbleManager.ImageManager().SetBitmapToImage( 
+                iBubble , 
+                EQgn_graf_call_rec_big , 
+                EQgn_graf_call_rec_big_mask );
+         
+            iSkinContext->SetBitmap( KAknsIIDQgnGrafCallRecBig );
+            break;
+            }
+        case ENEBottomRight:
+            {
+            if ( iBubble )
+                {
+                iBubbleManager.ResourceManager().ReleaseEikImage( iBubble );
+                }
+            
+            iBubble = iBubbleManager.ResourceManager().ReserveEikImage( ETrue );
+            
+            iBubbleManager.ImageManager().SetBitmapToImage( 
+                iBubble , 
+                EQgn_graf_call_rec_big_right , 
+                EQgn_graf_call_rec_big_right_mask );
+         
+            iSkinContext->SetBitmap( KAknsIIDQgnGrafCallRecBigRight );
+            break;
+            }
+        case ENEIdleState:
+            {
+            if ( iBubble )
+                {
+                iBubbleManager.ResourceManager().ReleaseEikImage( iBubble );
+                }
+         
+            iBubble = iBubbleManager.ResourceManager().ReserveEikImage( ETrue );
+         
+            iBubbleManager.ImageManager().SetBitmapToImage( 
+                iBubble , 
+                EQgn_graf_call_rec_bigger , 
+                EQgn_graf_call_rec_bigger_mask );
+         
+            iSkinContext->SetBitmap( KAknsIIDQgnGrafCallRecBigger );
+            break;            
+            }
+        case ENENone:
+        default:
+            break;
+        }
+    
+    iSkinContext->SetParentContext( 
+        AknsDrawUtils::ControlContextOfParent(this) );
+    }    
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::SetPlace2
+//  
+// ---------------------------------------------------------------------------
+//    
+void CBubbleOutlookNumberEntry::SetPlace2( 
+    const TPhoneNumberEntryPlace& aPlace )
+    {
+    switch ( aPlace )
+        {
+        case ENEBottom:
+            iFrameContext->SetFrame( KAknsIIDQsnFrCall2Rect );
+            break;
+        case ENEBottomRight:
+            iFrameContext->SetFrame( KAknsIIDQsnFrCall2Rect );
+            break;
+        case ENEIdleState:
+            iFrameContext->SetFrame( KAknsIIDQsnFrCall2Rect );
+            break;            
+        case ENENone:
+        default:
+            break;
+        }    
+
+    iFrameContext->SetParentContext( 
+        AknsDrawUtils::ControlContextOfParent(this) );        
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::Place
+//
+//  
+// ---------------------------------------------------------------------------
+//
+CBubbleOutlookNumberEntry::TPhoneNumberEntryPlace 
+                                    CBubbleOutlookNumberEntry::Place() const
+    {
+    return iPlace;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::SizeChanged
+// called by framwork when the view size is changed
+//  
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::SizeChanged()
+    {
+    AknsUtils::RegisterControlPosition( this );
+    
+    if ( iCallObjectDisplay )
+        {
+        SizeChanged2();
+        }
+    else
+        {
+        SizeChanged1();    
+        }        
+    
+    UpdateEditorFormats( iPlace );
+
+    // DOES NOT LEAVE! Own implementation. L comes from observer
+    // interface
+    UpdateAndDrawEditor();
+    }
+    
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::SizeChanged1
+//
+//  
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::SizeChanged1()
+    {
+    switch ( iPlace )
+        {
+        case ENEBottom:
+            BubbleUtils::LayoutBackgroundImage( 
+                iBubble, 
+                Rect(), 
+                BubbleLayout::popup_number_entry_window_graphics_1( 0 ) );
+            
+            iSkinContext->SetRect( iBubble->Rect() );
+            break;
+            
+        case ENEBottomRight:
+            BubbleUtils::LayoutBackgroundImage( 
+                iBubble , 
+                Rect(), 
+                BubbleLayout::popup_number_entry_window_graphics_1( 0 ) );
+
+            iSkinContext->SetRect( iBubble->Rect() );
+            break;
+            
+        case ENEIdleState:
+            BubbleUtils::LayoutBackgroundImage( 
+                iBubble, 
+                Rect(), 
+                BubbleLayout::popup_number_entry_window_graphics_1( 3 ) );
+
+            iSkinContext->SetRect( iBubble->Rect() );
+            break;            
+
+        case ENENone:
+        default:
+            break;
+
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::SizeChanged2
+//
+//  
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::SizeChanged2()
+    {
+    TAknLayoutRect frameRect;
+    TBool prepareFrame( EFalse );
+    
+    switch ( iPlace )
+        {
+        case ENEBottom:
+        case ENEBottomRight:
+           frameRect.LayoutRect( 
+               Rect(), 
+               BubbleLayout::popup_number_entry_window_graphics_1( 0 ) );
+           prepareFrame = ETrue;     
+           break;
+
+        case ENEIdleState:
+            frameRect.LayoutRect( 
+                Rect(), 
+                BubbleLayout::popup_number_entry_window_graphics_1( 3 ) );
+            prepareFrame = ETrue;                
+            break;            
+        case ENENone:
+        default:
+            break;
+        }
+        
+    if ( prepareFrame )        
+        {
+        BubbleLayout2::RectFrameInnerOuterRects(
+           frameRect.Rect(),
+           iOuterRect,
+           iInnerRect );
+
+        iFrameContext->SetFrameRects( iOuterRect, iInnerRect );
+                
+        MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+        AknsDrawUtils::PrepareFrame( skin,
+                                     iOuterRect,
+                                     iInnerRect,
+                                     KAknsIIDQsnFrCall2Rect,
+                                     KAknsIIDDefault );            
+        }        
+    }    
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::CountComponentControls
+//
+//  
+// ---------------------------------------------------------------------------
+//
+TInt CBubbleOutlookNumberEntry::CountComponentControls() const
+    {
+    return 1;
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::ComponentControl
+//
+//  
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CBubbleOutlookNumberEntry::ComponentControl(TInt aIndex) const
+    {
+    if ( aIndex == 0 )
+        {
+        return iEditor;
+        }
+    return NULL;
+    
+    }
+
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::DrawTimerCostNow
+//
+//  Pure virtual in base class.
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::DrawTimerCostNow()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::DrawCLINow
+//
+//  Pure virtual in base class.
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::DrawCLINow()
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::HandleControlEventL
+//  
+//  This must be non leaving function, because others use it too.
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::HandleControlEventL( CCoeControl* aControl, 
+                                                     TCoeEvent aEventType)
+    {
+    if ( aControl != iEditor  
+        && aEventType != EEventStateChanged 
+        || iPlace == ENENone)
+        return;
+
+    UpdateAndDrawEditor();
+    
+	ReportEventL( EEventStateChanged );
+    
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::OfferKeyEventL
+//
+//  
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CBubbleOutlookNumberEntry::OfferKeyEventL( 
+                                            const TKeyEvent& aKeyEvent, 
+                                            TEventCode aType )
+    {
+    return iEditor->OfferKeyEventL( aKeyEvent, aType );
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::SetIsUsed
+//
+//  
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::SetIsUsed( const TBool& aIsUsed )
+    {
+#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2
+    // Don't set in focus if transition effects are turned on
+    // We don't want blinking cursor during transitions
+    if ( !aIsUsed )
+        {
+        iEditor->SetFocus( aIsUsed );
+        }
+#else
+    iEditor->SetFocus( aIsUsed );
+#endif    
+    iIsUsed = aIsUsed;    
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::IsUsed
+//
+//  
+// ---------------------------------------------------------------------------
+//
+TBool CBubbleOutlookNumberEntry::IsUsed() const
+    {
+    return iIsUsed;
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::GetEditor
+//
+//  
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CBubbleOutlookNumberEntry::GetEditor( ) const
+    {
+    return iEditor; 
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::SetText
+//
+//  
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::SetText( const TDesC& aDesC )
+    {
+    iEditor->DrawDeferred();
+    iEditor->SetText( aDesC );   
+    iEditor->DrawDeferred();
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::GetText
+//
+//  
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::GetText( TDes& aDesC )
+    {
+    iEditor->GetText( aDesC );
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::FocusChanged
+//
+//  
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::FocusChanged( TDrawNow aDrawNow )
+    {
+    // Don't allow drawing
+    iEditor->SetFocus( IsFocused(), ENoDrawNow );
+    if ( aDrawNow == EDrawNow && iMutedImage.IsVisible() )
+        {
+        // muted image goes on top 
+        // so it must be redrawn too
+        DrawLabelNow( iMutedImage );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::DrawBitmaps
+//
+//  
+// ---------------------------------------------------------------------------
+//
+#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2
+void CBubbleOutlookNumberEntry::DrawBitmaps( CBitmapContext& ) const
+#else
+void CBubbleOutlookNumberEntry::DrawBitmaps( CBitmapContext& aGc ) const
+#endif
+    {
+    if ( iPlace == ENENone || !iIsUsed ) 
+        {
+        return;
+        }
+
+#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2
+    // Must use SystemGc instead of aGc when transition effects are turned on
+    CWindowGc& aGc = SystemGc();
+#endif
+
+    if ( iCallObjectDisplay )
+        {
+        MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+        if ( !AknsDrawUtils::DrawFrame( skin,
+                                        (CWindowGc&) aGc,  
+                                        iOuterRect,
+                                        iInnerRect,
+                                        KAknsIIDQsnFrCall2Rect,
+                                        KAknsIIDDefault ) )
+            {
+            BubbleUtils::DrawBackgroundRect( aGc, Rect() );
+            }       
+        }
+    else if ( !BubbleUtils::DrawMaskedImage( aGc , iBubble ) )
+        {
+        BubbleUtils::DrawBackgroundRect( aGc, Rect() );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::HandleAnimationStartL
+//
+//  Pure virtual in base class.
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::HandleAnimationStartL() const
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::ReleaseBitmaps
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::ReleaseBitmaps()
+    {
+    if ( iBubble )
+        {
+        iBubbleManager.ResourceManager().ReleaseEikImage( iBubble );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::RebuildBitmaps
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::RebuildBitmaps()
+    {
+    if ( iCallObjectDisplay )
+        {
+        return;            
+        }
+    
+    switch ( iPlace )
+        {
+        case ENEBottom:
+            iBubble = iBubbleManager.ResourceManager().ReserveEikImage(ETrue);
+            iBubbleManager.ImageManager().SetBitmapToImage( 
+                iBubble , 
+                EQgn_graf_call_rec_big , 
+                EQgn_graf_call_rec_big_mask );
+            break;
+        case ENEBottomRight:
+            iBubble = iBubbleManager.ResourceManager().ReserveEikImage(ETrue);
+            iBubbleManager.ImageManager().SetBitmapToImage( 
+                iBubble , 
+                EQgn_graf_call_rec_big_right , 
+                EQgn_graf_call_rec_big_right_mask );
+            break;
+        case ENEIdleState:
+            iBubble = iBubbleManager.ResourceManager().ReserveEikImage(ETrue);
+            iBubbleManager.ImageManager().SetBitmapToImage( 
+                iBubble , 
+                EQgn_graf_call_rec_bigger , 
+                EQgn_graf_call_rec_bigger_mask );
+            break;
+        case ENENone:
+        default:
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::MopSupplyObject
+// ---------------------------------------------------------------------------
+//
+TTypeUid::Ptr CBubbleOutlookNumberEntry::MopSupplyObject( TTypeUid aId )
+    {
+    if( !iCallObjectDisplay && 
+        aId.iUid == MAknsControlContext::ETypeId && 
+        iSkinContext )
+        {
+        return MAknsControlContext::SupplyMopObject( aId, iSkinContext );
+        }
+    else if ( iCallObjectDisplay && 
+              aId.iUid == MAknsControlContext::ETypeId && 
+              iFrameContext )
+        {
+        return MAknsControlContext::SupplyMopObject( aId, iFrameContext );    
+        }
+    else
+        {
+        return CBubbleOutlook::MopSupplyObject( aId );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::DrawCallHeaderText
+//
+//  Pure virtual in base class.
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::DrawCallHeaderText()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::Draw
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::Draw( const TRect& /*aRect*/ ) const
+    {
+    if ( iPlace == ENENone || !iIsUsed ) 
+        {
+        return;
+        }
+
+    CWindowGc& gc = SystemGc( );
+    gc.SetBrushColor( AKN_LAF_COLOR( BubbleLayout::LayoutColourWhite() ) );
+    TRect rect = iEditor->Rect();
+
+    // Draw the skin background of the parent 
+    // (the bubble may be transparent)
+    AknsDrawUtils::DrawBackground( AknsUtils::SkinInstance(), 
+        AknsDrawUtils::ControlContextOfParent(this), this, gc, 
+        rect.iTl, rect, KAknsDrawParamDefault );
+    // Don't set clipping rect if transition effects are turned on
+#ifndef RD_UI_TRANSITION_EFFECTS_PHASE2
+    gc.SetClippingRect( rect );
+#endif
+    if ( iCallObjectDisplay )
+        {
+        // Draw bubble frame
+        MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+        if ( !AknsDrawUtils::DrawFrame( skin,
+                                        (CWindowGc&) gc,  
+                                        iOuterRect,
+                                        iInnerRect,
+                                        KAknsIIDQsnFrCall2Rect,
+                                        KAknsIIDDefault ) )
+            {
+            BubbleUtils::DrawBackgroundRect( gc, Rect() );
+            }                
+        }
+    else
+        {
+        if ( !BubbleUtils::DrawMaskedImage( gc , iBubble ) )
+            {
+            BubbleUtils::DrawBackgroundRect( gc, Rect() );
+            }            
+        }        
+    gc.CancelClippingRect();
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::ConstructEditorFromResourceAndLayoutL
+//
+//  
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::ConstructEditorFromResourceAndLayoutL( 
+    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;
+
+    // get supporting layouts
+    TRgb color;
+    TRect numberEntryRect = NumberEntryRect( 0 , color );
+
+    // get the relevant layouts
+    TAknLayoutText texts1LongText;
+    TAknLayoutText texts1ShortText;
+    TAknLayoutText texts2LongLine1Text;
+    TAknLayoutText texts2ShortLine1Text;
+    TAknLayoutText texts2LongLine2Text;
+    TAknLayoutText texts2ShortLine2Text;
+    TAknLayoutText textsIdleLine1Text;
+    TAknLayoutText textsIdleLine2Text;
+
+    texts1LongText.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_1( 0 ) );
+    texts1ShortText.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_1( 1 ) );
+    texts2LongLine1Text.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_2( 0, 0 ) );
+    texts2ShortLine1Text.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_2( 1, 0 ) );
+    texts2LongLine2Text.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_2( 0, 1 ) );
+    texts2ShortLine2Text.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_2( 1, 1 ) );
+    textsIdleLine1Text.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_3( 1 ) );
+    textsIdleLine2Text.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_3( 0 ) );        
+        
+
+    // although only specified for two line case, we need to have 
+    // some kind of value for the one line case but as there is 
+    // only one line, it isn't used.
+    TInt baselineSeparation = texts2LongLine2Text.TextRect().iBr.iY 
+        - texts2LongLine1Text.TextRect().iBr.iY;
+
+    for (TInt ii = 0; ii < formatCount; ii++)
+        {
+        CAknPhoneNumberEditor::TFormat format( aReader );
+
+        // override the format values using the layout data
+        TInt next = ii;
+        TBool noStatusPane = EFalse;
+        if( ii > KBubbleNEIdleStateFormat )
+            {
+            next -= KBubbleNEFormatOffsetIfNoStatusPane;
+            noStatusPane = ETrue;
+            }
+        
+        const CAknLayoutFont* layoutFont;
+
+        switch( next )
+            {
+            case KBubbleNE1LongLineFormat:
+                format.iFont = texts1LongText.Font();
+                layoutFont = CAknLayoutFont::AsCAknLayoutFontOrNull( format.iFont);
+                format.iBottomBaselineOffset = layoutFont->BaselineToTextPaneBottom();
+                format.iOuterRect = texts1LongText.TextRect(); 
+                break;
+            case KBubbleNE2LongLineFormat:
+                format.iFont = texts2LongLine1Text.Font();
+                layoutFont = CAknLayoutFont::AsCAknLayoutFontOrNull( format.iFont);
+                format.iBottomBaselineOffset = layoutFont->BaselineToTextPaneBottom();
+
+                format.iOuterRect = texts2LongLine2Text.TextRect();
+                format.iOuterRect.iTl.iY -= format.iBottomBaselineOffset; // have to add extra gap
+                format.iOuterRect.iTl.iY -= baselineSeparation; // have to add extra lines.
+                break;
+            case KBubbleNE1ShortLineFormat:
+                format.iFont = texts1ShortText.Font();
+                layoutFont = CAknLayoutFont::AsCAknLayoutFontOrNull( format.iFont);
+                format.iBottomBaselineOffset = layoutFont->BaselineToTextPaneBottom();
+                format.iOuterRect = texts1ShortText.TextRect();
+                break;
+            case KBubbleNE2ShortLineFormat:
+                format.iFont = texts2ShortLine1Text.Font();
+                layoutFont = CAknLayoutFont::AsCAknLayoutFontOrNull( format.iFont);
+                format.iBottomBaselineOffset = layoutFont->BaselineToTextPaneBottom();
+                format.iOuterRect = texts2ShortLine2Text.TextRect();
+                format.iOuterRect.iTl.iY -= format.iBottomBaselineOffset; // have to add extra gap
+                format.iOuterRect.iTl.iY -= baselineSeparation; // have to add extra lines.
+                break;
+            case KBubbleNEIdleStateFormat:
+                format.iFont = textsIdleLine1Text.Font();
+                layoutFont = CAknLayoutFont::AsCAknLayoutFontOrNull( format.iFont);
+                format.iBottomBaselineOffset = layoutFont->BaselineToTextPaneBottom();
+
+                format.iOuterRect = textsIdleLine2Text.TextRect();
+                format.iOuterRect.iTl.iY -= format.iBottomBaselineOffset; // have to add extra gap
+                
+                baselineSeparation = textsIdleLine2Text.TextRect().iBr.iY 
+                    - textsIdleLine1Text.TextRect().iBr.iY;
+                
+                format.iOuterRect.iTl.iY -= baselineSeparation; // have to add extra lines.
+                break;
+            }
+
+        if(noStatusPane)
+            {
+            format.iOuterRect.iTl.iY += BubbleLayout::MainPaneRect().iTl.iY;
+            format.iOuterRect.iBr.iY += BubbleLayout::MainPaneRect().iTl.iY;
+            }
+        format.iBaselineSeparation = baselineSeparation;
+        iEditor->AddFormat( format );
+        }
+
+    iEditor->SetFormat( KBubbleNEIdleStateFormat );
+    UpdateEditorColor( color );
+    }
+
+// -----------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::NumberEntryRect
+// -----------------------------------------------------------------------------
+//
+TRect CBubbleOutlookNumberEntry::NumberEntryRect( TInt aIndex, TRgb& aColor )
+    {
+    TRect mainRect = BubbleLayout::MainPaneRect();
+    TAknLayoutRect numberEntryLayoutRect;
+    numberEntryLayoutRect.LayoutRect( mainRect, 
+        BubbleLayout::popup_number_entry_window( aIndex ) );
+
+    aColor = numberEntryLayoutRect.Color();
+    TRect numberEntryRect = numberEntryLayoutRect.Rect();
+    // relative to mainpane
+    numberEntryRect.iTl.iY -= mainRect.iTl.iY;
+    numberEntryRect.iBr.iY -= mainRect.iTl.iY;
+    numberEntryRect.iTl.iX -= mainRect.iTl.iX;
+    numberEntryRect.iBr.iX -= mainRect.iTl.iX;
+
+    return numberEntryRect ;
+    }
+
+// -----------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::UpdateEditorFormats
+// -----------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::UpdateEditorFormats( 
+    TPhoneNumberEntryPlace aPlace )
+    {
+    // get supporting layouts
+    TRect numberEntryRect;
+    TRgb color;
+    if ( aPlace == ENEBottom )
+        {
+        numberEntryRect = NumberEntryRect( 0, color );
+        }
+    else if ( aPlace == ENEBottomRight )
+        {
+        numberEntryRect = NumberEntryRect( 1, color );
+        }
+    else if ( aPlace == ENEIdleState )
+        {
+        numberEntryRect = NumberEntryRect( 4, color );
+        }        
+    else
+        {
+        return;
+        }
+
+    // get the relevant layouts
+    TAknLayoutText texts1LongText;
+    TAknLayoutText texts1ShortText;
+    TAknLayoutText texts2LongLine1Text;
+    TAknLayoutText texts2ShortLine1Text;
+    TAknLayoutText texts2LongLine2Text;
+    TAknLayoutText texts2ShortLine2Text;
+    TAknLayoutText textsIdleLine1Text;
+    TAknLayoutText textsIdleLine2Text;
+
+    texts1LongText.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_1( 0 ) );
+    texts1ShortText.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_1( 1 ) );
+    texts2LongLine1Text.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_2(0, 0));
+    texts2ShortLine1Text.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_2(1, 0));
+    texts2LongLine2Text.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_2(0, 1));
+    texts2ShortLine2Text.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_2(1, 1));
+    textsIdleLine1Text.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_3( 1 ) );
+    textsIdleLine2Text.LayoutText( numberEntryRect, 
+        BubbleLayout::popup_number_entry_window_texts_3( 0 ) );               
+
+    // although only specified for two line case, we need to have 
+    // some kind of value for the one line case but as there is 
+    // only one line, it isn't used.
+    TInt baselineSeparation = texts2LongLine2Text.TextRect().iBr.iY 
+                            - texts2LongLine1Text.TextRect().iBr.iY;
+    TInt currentFormat = iEditor->CurrentFormatIndex();
+
+    for (TInt ii = 0; ii < iFormatCount; ii++)
+        {
+        CAknPhoneNumberEditor::TFormat format( iEditor->Format( ii ) );
+
+        // override the format values using the layout data
+        TInt next = ii;
+        TBool noStatusPane = EFalse;
+        if( ii > KBubbleNEIdleStateFormat )
+            {
+            next -= KBubbleNEFormatOffsetIfNoStatusPane;
+            noStatusPane = ETrue;
+            }
+
+        const CAknLayoutFont* layoutFont;
+        switch( next )
+            {
+            case KBubbleNE1LongLineFormat:
+                format.iFont = texts1LongText.Font();
+                layoutFont = CAknLayoutFont::AsCAknLayoutFontOrNull( format.iFont);
+                format.iBottomBaselineOffset = layoutFont->BaselineToTextPaneBottom();
+                format.iOuterRect = texts1LongText.TextRect(); 
+                break;
+            case KBubbleNE2LongLineFormat:
+                format.iFont = texts2LongLine1Text.Font();
+                layoutFont = CAknLayoutFont::AsCAknLayoutFontOrNull( format.iFont);
+                format.iBottomBaselineOffset = layoutFont->BaselineToTextPaneBottom();
+                format.iOuterRect = texts2LongLine2Text.TextRect();
+                format.iOuterRect.iTl.iY -= format.iBottomBaselineOffset; // have to add extra gap
+                format.iOuterRect.iTl.iY -= baselineSeparation; // have to add extra lines.
+                break;
+            case KBubbleNE1ShortLineFormat:
+                format.iFont = texts1ShortText.Font();
+                layoutFont = CAknLayoutFont::AsCAknLayoutFontOrNull( format.iFont);
+                format.iBottomBaselineOffset = layoutFont->BaselineToTextPaneBottom();
+                format.iOuterRect = texts1ShortText.TextRect();
+                break;
+            case KBubbleNE2ShortLineFormat:
+                format.iFont = texts2ShortLine1Text.Font();
+                layoutFont = CAknLayoutFont::AsCAknLayoutFontOrNull( format.iFont);
+                format.iBottomBaselineOffset = layoutFont->BaselineToTextPaneBottom();
+                format.iOuterRect = texts2ShortLine2Text.TextRect();
+                format.iOuterRect.iTl.iY -= format.iBottomBaselineOffset; // have to add extra gap
+                format.iOuterRect.iTl.iY -= baselineSeparation; // have to add extra lines.
+                break;
+            case KBubbleNEIdleStateFormat:
+                format.iFont = textsIdleLine1Text.Font();
+                layoutFont = CAknLayoutFont::AsCAknLayoutFontOrNull( format.iFont);
+                format.iBottomBaselineOffset = layoutFont->BaselineToTextPaneBottom();
+
+                format.iOuterRect = textsIdleLine2Text.TextRect();
+                format.iOuterRect.iTl.iY -= format.iBottomBaselineOffset; // have to add extra gap
+                
+                baselineSeparation = textsIdleLine2Text.TextRect().iBr.iY 
+                    - textsIdleLine1Text.TextRect().iBr.iY;
+                
+                format.iOuterRect.iTl.iY -= baselineSeparation; // have to add extra lines.
+                break;                
+            };
+
+        if(noStatusPane)
+            {
+            format.iOuterRect.iTl.iY += BubbleLayout::MainPaneRect().iTl.iY;
+            format.iOuterRect.iBr.iY += BubbleLayout::MainPaneRect().iTl.iY;
+            }
+        format.iBaselineSeparation = baselineSeparation;
+
+        iEditor->Format( ii ) = format;
+        }
+
+    iEditor->SetFormat( currentFormat );
+    UpdateEditorColor( color );
+    }
+
+
+// ---------------------------------------------------------------------------
+//  CBubbleOutlookNumberEntry::ChangeEditorMode
+//  
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CBubbleOutlookNumberEntry::ChangeEditorMode( TBool aDefaultMode )
+    {
+    return iEditor->ChangeEditorMode( aDefaultMode );
+    }
+    
+// ---------------------------------------------------------------------------
+//  CBubbleOutlookNumberEntry::GetEditorMode
+//  
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CBubbleOutlookNumberEntry::GetEditorMode() const
+    {
+    return iEditor->GetEditorMode();
+    }
+    
+// ---------------------------------------------------------------------------
+//  CBubbleOutlookNumberEntry::ResetEditorToDefaultValues
+//  
+// 
+// ---------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::ResetEditorToDefaultValues()
+    {
+    iEditor->ResetEditorToDefaultValues();
+    }
+
+// -----------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::UpdateEditorColor
+// -----------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::UpdateEditorColor( const TRgb aColor )
+    {
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    TRgb skinColor = aColor;
+
+    AknsUtils::GetCachedColor( 
+        skin, 
+        skinColor, 
+        KAknsIIDQsnTextColors,
+        EAknsCIQsnTextColorsCG51 );
+
+    // Ignore error
+    TRAP_IGNORE( iEditor->OverrideColorL( EColorControlText, skinColor ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CBubbleOutlookNumberEntry::UpdateAndDrawEditor
+// -----------------------------------------------------------------------------
+//
+void CBubbleOutlookNumberEntry::UpdateAndDrawEditor()
+    {
+    TInt format = 0;
+      
+      if ( iPlace == ENEBottom )
+          {
+          if ( iEditor->CountFormats() < 2 )
+              {
+              return;
+              }
+          format = KBubbleNE1LongLineFormat;
+          if ( !iEditor->WouldTextFitInFormat( format ) )
+              {
+              format = KBubbleNE2LongLineFormat;
+              }
+          }
+      else if ( iPlace == ENEBottomRight )
+          {
+          if ( iEditor->CountFormats() < 4 )
+              {
+              return;
+              }
+          format = KBubbleNE1ShortLineFormat;
+          if ( !iEditor->WouldTextFitInFormat( KBubbleNE1ShortLineFormat ) )
+              {
+              format = KBubbleNE2ShortLineFormat;
+              }
+          }
+      else if ( iPlace == ENEIdleState )
+          {
+          if ( iEditor->CountFormats() < 9 )
+              {
+              return;
+              }
+          format = KBubbleNEIdleStateFormat;
+          }
+
+      // If there is no status pane the relative coordinates editor must be
+      // moved 44 pixels downwards, because editor's coordinates are absolute - 
+      // NOT relative to parent rect.
+      if ( iStatusPane && !iStatusPane->IsVisible() &&
+           !AknStatuspaneUtils::StaconPaneActive() )
+          {
+          format += KBubbleNEFormatOffsetIfNoStatusPane;
+          }
+
+      if (iEditor->CurrentFormatIndex() != format)
+          {
+          iEditor->SetFormat(format);
+          if ( iBubble )
+              {
+              iEditor->DrawNow();
+              if ( iMutedImage.IsVisible() )
+                  {
+                  iMutedImage.DrawNow();
+                  }
+              }
+          }
+    }
+
+
+// End of File