phonebookui/Speeddial/src/SpdiaContainer.cpp
changeset 0 e686773b3f54
child 8 5586b4d2ec3e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Speeddial/src/SpdiaContainer.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,1241 @@
+/*
+* Copyright (c) 2002-2004 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:     Declares container control for application.
+*
+*/
+
+
+
+
+
+
+// INCLUDE FILES
+#include <AknGrid.h>
+#include <eikapp.h>
+#include <gulicon.h>
+#include <avkon.rsg>
+#include <aknkeys.h>
+#include <eikmenub.h>
+#include <eikimage.h>
+#include <csxhelp/sdm.hlp.hrh>
+#include <bldvariant.hrh>
+
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+#include <SpdCtrl.rsg>
+#include <AknsUtils.h>
+#include <AknIconUtils.h>
+#include <aknViewAppUi.h>
+#include <AknFepInternalCRKeys.h>
+#include <aknlists.h>
+
+#include <SpeedDial.rsg>
+
+#include "speeddial.hrh" 
+#include "SpdiaControl.hrh"
+#include "speeddialprivate.h"
+#include "SpdiaView.h"
+#include "SpdiaContainer.h"
+#include "SpdiaApplication.h"
+#include "SpdiaNote.h"
+#include "Speeddial.laf"
+#include <applayout.cdl.h>
+#include <layoutmetadata.cdl.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <vmnumber.h>
+#include "SpdiaAppUi.h"
+
+#include <featmgr.h>
+#include <NumberGrouping.h>
+
+#include <CVPbkContactStoreUriArray.h>
+#include <CPbk2StoreConfiguration.h>
+#include <voicemailboxdomaincrkeys.h>
+#include <telvmbxsettingscrkeys.h>
+
+
+// LOCAL CONSTANTS AND MACROS
+const TUint KShortcutKey0('0');
+const TInt KCellRowCount(3);
+const TInt KCellColCount(3);
+const TInt KMaxIndex(8);
+const TInt KInvalidIndex(10);
+const TInt KPhoneNumberMaxLen = 100;
+
+// ================= MEMBER FUNCTIONS =======================
+// Constructor
+CSpdiaContainer::CSpdiaContainer(CSpeedDialPrivate *aSpeedPrivate):iSpeedPrivate( aSpeedPrivate ),
+    iLongTapUsed( EFalse ), iNoAssignedShown( EFalse ), iButton1DownIndex( 0 )
+    {
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::ConstructL
+// Symbian two phased constructor
+// 
+// ---------------------------------------------------------
+//
+void CSpdiaContainer::ConstructL(CAknView* aView)
+    {
+    CreateWindowL();
+
+    iView = STATIC_CAST(CSpdiaView*, aView);
+
+    CSpdiaAppUi* spdialUi = static_cast< CSpdiaAppUi* >( CEikonEnv::Static()->AppUi() );
+    if ( !spdialUi->IsSettingType() )
+        {
+        iView->SetCba( R_SPDIA_SOFTKEYS_OPTION_EXIT_OPTION );
+        }
+    iAlreadyActive = EFalse;
+
+    FeatureManager::InitializeLibL();
+    if ( FeatureManager::FeatureSupported( KFeatureIdPhoneNumberGrouping ) )
+        {
+        iNumberGrouping = CPNGNumberGrouping::NewL( KPhoneNumberMaxLen );
+        }
+    // Create Grid
+    iGrid = new(ELeave) CAknQdialStyleGrid;
+    iGrid->SetContainerWindowL( *this );
+    iGrid->ConstructL( this, CEikListBox::EMultipleSelection );
+    iGrid->SetBorder(TGulBorder::ENone);
+
+    iGrid->CreateScrollBarFrameL(ETrue);
+    iGrid->SetListBoxObserver( this );
+    // Create Grid-info
+
+    TInt error = iSpeedPrivate->GetSpdCtrlLastError();
+    if ( error != KErrNone )
+        {
+        CSpdiaAppUi* spdialUi = static_cast< CSpdiaAppUi* >( CEikonEnv::Static()->AppUi() );
+        spdialUi->LaunchInfoNoteL();
+        return ;
+        }
+    // Using KInvalidIndex here is not to init index in CreateGridDataL().
+    iSpeedPrivate->CreateGridDataL( iGrid, KInvalidIndex );
+    iSpeedPrivate->SetContainerWindowL( *this );
+    iSpeedPrivate->SetRefreshObserver( this );
+
+    // shortcut value must be set after adding items the the list.
+    iGrid->SetShortcutValueFromPrevList( iGrid->ShortcutValueForNextList() );
+    
+    SetStatusPaneL();
+
+    if ( AknLayoutUtils::LayoutMirrored() )
+        {
+        iGrid->SetCurrentDataIndex(0);
+        }
+    ActivateL();
+    iAlreadyActive = EFalse;
+    ivmbxvariation = CRepository::NewL( KCRUidVideoMailbox );
+    ivmbxvariation->Get( KVideoMbxSupport, iVmbxsupported );
+    delete ivmbxvariation;
+    ivmbxvariation = NULL;
+    LongTapDetectorL();
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::RefreshGrid
+// It calls spdctrl CreateGridDataL to draw the grid on skin change.
+// 
+// ---------------------------------------------------------
+void CSpdiaContainer::RefreshGrid()
+    {
+		TRAP_IGNORE( iSpeedPrivate->CreateGridDataL( iGrid, -1 ) );
+    }
+
+// Destructor
+CSpdiaContainer::~CSpdiaContainer()
+    {
+    delete iGrid;
+    if ( iSpeedPrivate )
+        {    
+        iSpeedPrivate->SetGridDataAsNull();
+        }
+    delete iNumberGrouping;        
+    FeatureManager::UnInitializeLib();
+
+    if ( iDialog )
+        {
+        delete iDialog;
+        }
+    delete iLongTapDetector;
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::Control
+// Get a grid-model reference
+// ---------------------------------------------------------
+CSpeedDialPrivate& CSpdiaContainer::Control()
+    {
+    return *iSpeedPrivate;
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::IsVoiceMailBox
+// Check Voice Mail Box number
+// ---------------------------------------------------------
+TBool CSpdiaContainer::IsVoiceMailBox(TInt aIndex) const
+    {
+    if (aIndex < 0)
+        {
+        aIndex = iGrid->CurrentDataIndex();
+        }
+    return  iSpeedPrivate->VMBoxPosition() == aIndex? ETrue: EFalse;
+    }
+// ---------------------------------------------------------
+// CSpdiaContainer::IsVdoMailBox
+// Check Voice Mail Box number
+// ---------------------------------------------------------
+TBool CSpdiaContainer::IsVdoMailBox(TInt aIndex) const
+    {
+    if ( !iVmbxsupported )
+        {
+        // Video Mailbox feature is disabled
+        return EFalse;
+        }
+        
+    if ( aIndex < 0 )
+        {
+        aIndex = iGrid->CurrentDataIndex();
+        }
+
+    return iSpeedPrivate->VdoMBoxPosition() == aIndex ? ETrue : EFalse;
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::CurGridPosition
+// Get Current grid position
+// ---------------------------------------------------------
+TInt CSpdiaContainer::CurGridPosition() const
+    {
+   	return iGrid->CurrentDataIndex();
+    }
+
+// ----------------------------------------------------
+// CSpdiaContainer::UpdatePhoneNumberL
+// 
+// ----------------------------------------------------
+//
+void CSpdiaContainer::UpdatePhoneNumberL(TInt aIndex)
+    {
+    //STATIC_CAST(CDesCArray* ,iGrid->Model()->ItemTextArray())->Reset();
+    iSpeedPrivate->CreateGridDataL(iGrid, aIndex);
+    iView->LoadCba(MenuResourceID());
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::GetHelpContext
+// This function is called when Help application is launched.  
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CSpdiaContainer::GetHelpContext(TCoeHelpContext& aContext) const
+    {
+    aContext.iMajor = KUidSpdia;
+    aContext.iContext = KSDM_HLP_APP;
+    }
+// ---------------------------------------------------------
+// CSpdiaContainer::HandleResourceChange()
+// Handle layout and skin change event.  
+// ---------------------------------------------------------
+//
+void CSpdiaContainer::HandleResourceChange( TInt aType )
+    {   
+    if ( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        // Refresh when grid is in foreground 
+        if ( iSpeedPrivate->State() == CSpeedDialPrivate::STATE_IDLE && 
+             iSpeedPrivate->GridStatus() == CSpeedDialPrivate::EGridUse )
+            {
+            // if refresh grid here, termination will be interrupt when edit type is full screen QWERTY.
+            RefreshGrid();
+            iGrid->HandleResourceChange( aType );
+
+            // Reload menubar when swap between landscape and portrait mode.
+            iView->LoadCba( MenuResourceID() );
+            DrawDeferred();
+            }
+        TRAP_IGNORE( SetStatusPaneL() );
+        }
+    else
+        {
+        CCoeControl::HandleResourceChange( aType );
+        TRAP_IGNORE( SetLayoutL() );
+        }
+
+    // To hide the scrollbar of the grid
+    TRAP_IGNORE( iGrid->ScrollBarFrame()->SetScrollBarVisibilityL(
+        CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOff ) );
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::SizeChanged
+// Called by framework when the view size is changed
+// ---------------------------------------------------------
+//
+void CSpdiaContainer::SizeChanged()
+    {
+    iView->iStatusPane->DrawNow();
+    
+    TRAP_IGNORE( SetLayoutL() );
+    DrawNow();
+    }
+// ---------------------------------------------------------
+// CSpdiaContainer::SetLayoutL
+// Called by framework when the view size is changed
+// ---------------------------------------------------------
+//
+void CSpdiaContainer::SetLayoutL()
+    {
+    TAknLayoutRect areaRect;
+    TAknLayoutRect gridQdialPaneRect;
+    TAknLayoutRect mainQdialPaneRect;
+    TRect        mainPaneRect ;
+    TRect        statusPaneRect;
+    TRect        mainRect;
+    TInt         width = 0;
+    TInt         height =0;
+ 	
+    if ( AknLayoutUtils::ScalableLayoutInterfaceAvailable() )
+        {
+        if ( Layout_Meta_Data::IsLandscapeOrientation() )
+            {
+            AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );
+            AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane, statusPaneRect );
+            if( !AknLayoutUtils::PenEnabled() )
+                {
+                mainPaneRect.iTl = statusPaneRect.iTl;
+                mainRect = mainPaneRect;
+                mainPaneRect.iBr.iY = mainPaneRect.iBr.iY - statusPaneRect.iTl.iY;
+                }
+            else
+                {
+                mainPaneRect.iTl.iY -= mainPaneRect.iTl.iY;
+                mainPaneRect.iTl.iX -=statusPaneRect.iTl.iY;
+                mainRect = mainPaneRect;
+                }
+            mainQdialPaneRect.LayoutRect( mainPaneRect,AknLayoutScalable_Apps::main_qdial_pane().LayoutLine() );
+            gridQdialPaneRect.LayoutRect( mainQdialPaneRect.Rect(),AknLayoutScalable_Apps::grid_qdial_pane().LayoutLine() );
+            AknLayoutUtils::LayoutControl( iGrid, mainQdialPaneRect.Rect(), AknLayoutScalable_Apps::grid_qdial_pane().LayoutLine() );
+            TAknWindowComponentLayout areaNew = AknLayoutScalable_Apps::cell_qdial_pane( 0, 0 ).LayoutLine();
+  
+            areaRect.LayoutRect( mainQdialPaneRect.Rect() ,areaNew.LayoutLine() );
+		 
+            width  = areaRect.Rect().Width();
+            height = areaRect.Rect().Height();
+            }
+        else
+            {
+            AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );
+            AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane, statusPaneRect );
+            mainPaneRect.iTl= statusPaneRect.iTl;
+            mainRect = mainPaneRect;
+            mainQdialPaneRect.LayoutRect( mainPaneRect,AknLayoutScalable_Apps::main_qdial_pane().LayoutLine() );
+            gridQdialPaneRect.LayoutRect( mainQdialPaneRect.Rect(),AknLayoutScalable_Apps::grid_qdial_pane().LayoutLine() );
+            AknLayoutUtils::LayoutControl( iGrid, mainQdialPaneRect.Rect(), AknLayoutScalable_Apps::grid_qdial_pane().LayoutLine() );
+            TAknWindowComponentLayout areaNew = AknLayoutScalable_Apps::cell_qdial_pane( 0, 0 ).LayoutLine();
+            areaRect.LayoutRect( mainQdialPaneRect.Rect() ,areaNew.LayoutLine() );
+		 
+            width  = ( mainPaneRect.Width() / 3 ) - 1;
+            height = ( mainPaneRect.Height() / 3 ) - 7;
+            }		
+        }
+    else
+        {
+        AknLayoutUtils::LayoutControl( iGrid, Rect(), AppLayout::Speed_Dial_descendants_Line_1() );
+        TAknWindowLineLayout area = AppLayout::cell_qdial_pane( 0, 0 );		        
+        areaRect.LayoutRect( Rect(), area );			
+        }
+    TInt language = User::Language();
+    TBool LeftToRight( ETrue );
+
+    // When Arabic and Hebrew input is in use, the Arabic and Hebrew browsing order
+    // is not followed. Instead, the browsing order is the same as in Western variants.
+    if ( language == ELangUrdu /*|| language == ELangArabic*/ )
+        {
+        LeftToRight = EFalse;
+        }
+    TRAP_IGNORE( iGrid->SetLayoutL(
+            EFalse,                // aVerticalOrientation
+            LeftToRight,           // aLeftToRight
+            ETrue,                 // aTopToBottom
+            KCellRowCount,         // aNumOfItemsInPrimaryOrient
+            KCellColCount,         // aNumOfItemsInSecondaryOrient
+            TSize( width, height ) // NewScalableUI changes
+            )
+        );
+      
+    TRAP_IGNORE( iGrid->ScrollBarFrame()->SetScrollBarVisibilityL(
+        CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOff ) );
+    CFormattedCellListBoxData* data = iGrid->ItemDrawer()->FormattedCellData();
+
+    data->SetTransparentSubCellL( SDM_TN_CIF_TURNED, ETrue );  //5
+    data->SetTransparentSubCellL( SDM_TN_CIF, ETrue );         //7
+    data->SetTransparentSubCellL( SDM_TN_VGA_TURNED, ETrue );  //9
+    data->SetTransparentSubCellL( SDM_TN_VGA, ETrue );         //11
+    data->SetTransparentSubCellL( SDM_TN_OTHER, ETrue );       //13
+
+    if ( AknLayoutUtils::ScalableLayoutInterfaceAvailable() )
+        {
+        data->SetBackgroundSkinStyle( &KAknsIIDQsnBgAreaMainQdial, mainRect );
+        data->SetSkinStyle( &KAknsIIDQsnBgAreaMainQdial, mainRect );
+        iSpeedPrivate->SetLayout( mainPaneRect );
+        }
+    else
+        {
+        data->SetBackgroundSkinStyle( &KAknsIIDQsnBgAreaMainQdial, Rect() );
+        data->SetSkinStyle( &KAknsIIDQsnBgAreaMainQdial, Rect() );
+        iSpeedPrivate->SetLayout( Rect() );
+        }
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::CountComponentControls
+//
+//  
+// ---------------------------------------------------------
+//
+TInt CSpdiaContainer::CountComponentControls() const
+    {
+    return 2; // return nbr of controls inside this container
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::ComponentControl
+//
+// ---------------------------------------------------------
+//
+CCoeControl* CSpdiaContainer::ComponentControl(TInt aIndex) const
+    {
+    switch ( aIndex )
+        {
+        case 0:
+            return iSpeedPrivate;
+        case 1:
+            return iGrid;
+
+        default:
+            return NULL;
+        }
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::Draw
+// 
+// ---------------------------------------------------------
+//
+void CSpdiaContainer::Draw(const TRect& aRect) const
+    {
+    iSpeedPrivate->Draw( aRect );
+    }
+
+// ---------------------------------------------------------
+// CSpeedContainer::OfferKeyEventL
+// processing of a key event
+// ---------------------------------------------------------
+//
+TKeyResponse CSpdiaContainer::OfferKeyEventL(
+                    const TKeyEvent& aKeyEvent, TEventCode aType)
+    {
+    if ( iSpeedPrivate->GetWait()->IsStarted() )
+        {    
+        return EKeyWasConsumed;
+        }
+
+    TInt index( 0 );
+    
+    if ( ( iView->IsFocused() ) && ( aKeyEvent.iCode == EKeyEnter || aKeyEvent.iCode == EKeyDevice3 ) /*|| aKeyEvent.iCode == EKeyDevice3*/ )
+        {
+        index = iGrid->CurrentDataIndex();
+        if ( !IsVoiceMailBox() && !IsVdoMailBox() && !iSpeedPrivate->Contact( index ) )
+            {
+            iView->CmdAssignNumberL();
+            }
+        else
+            {
+            CEikMenuBar* menuBar = iView->MenuBar();
+            TInt barId( R_SPDIA_MENUBAR_VIEW_OK_ASSIGN );
+            if ( IsVoiceMailBox() || IsVdoMailBox() )
+                {
+                barId = R_SPDIA_MENUBAR_VIEW_OK_CALL;
+                }
+            else if ( iSpeedPrivate->Contact( index ) )
+                {
+                barId = R_SPDIA_MENUBAR_VIEW_OK_CALL_VIDEO;                
+                }
+            menuBar->SetMenuType( CEikMenuBar::EMenuContext );
+            menuBar->SetMenuTitleResourceId( barId );
+
+            menuBar->TryDisplayMenuBarL();
+            // For the reason at the time of being canceled, a menu is changed.
+            menuBar->SetMenuTitleResourceId( MenuResourceID() );
+            menuBar->SetMenuType( CEikMenuBar::EMenuOptions );
+            }
+        return EKeyWasConsumed;
+        }
+    // Check whether the focus exists.
+    // If not, updated the option menu
+    else if ( !iView->IsFocused() )
+    	{
+    	// LOGTEXT( _L("CR addition: handle HW key shortcuts event in OfferKeyEventL()") );
+    	iGrid->SetCurrentDataIndex( 0 );
+        iView->LoadCba( MenuResourceID() );
+        MiddleSoftKeyL();
+    	}
+
+    TKeyResponse exitCode( EKeyWasNotConsumed );
+    TChar code( aKeyEvent.iCode );
+    MiddleSoftKeyL();
+    TInt language = User::Language();
+    // When Arabic and Hebrew input is in use, the Arabic and Hebrew browsing order
+    // is not followed. Instead, the browsing order is the same as in Western variants.
+    if ( language == ELangUrdu /*|| language == ELangArabic*/ )
+        {
+        if ( code == EKeyLeftArrow )
+            {
+            index = iGrid->CurrentDataIndex();
+            if ( index == KMaxIndex )
+                {
+                iGrid->SetCurrentDataIndex( 0 );
+                iView->LoadCba( MenuResourceID() );
+                return EKeyWasConsumed; 
+                }
+            }
+		
+        if ( code == EKeyRightArrow )
+            {
+            index = iGrid->CurrentDataIndex();
+            if ( index == 0 )
+                {
+                iGrid->SetCurrentDataIndex( KMaxIndex );
+                iView->LoadCba( MenuResourceID() );
+                return EKeyWasConsumed; 
+                }
+            }	
+        }
+    else
+        {
+        if ( code == EKeyRightArrow )
+            {
+            index = iGrid->CurrentDataIndex();
+            if ( index == KMaxIndex )
+                {
+                iGrid->SetCurrentDataIndex( 0 );
+                iView->LoadCba( MenuResourceID() );
+                return EKeyWasConsumed; 
+                }
+            }
+	
+        if ( code == EKeyLeftArrow )
+            {
+            index = iGrid->CurrentDataIndex();
+            if ( index == 0 )
+                {
+                iGrid->SetCurrentDataIndex( KMaxIndex );
+                iView->LoadCba( MenuResourceID() );
+                return EKeyWasConsumed; 
+                }
+            }
+        }
+
+    if ( aKeyEvent.iScanCode == EStdKeyYes )
+        {
+        // Send key is pressed, when menu or dialog is displayed, the call won't be created.
+        if ( aType == EEventKey 
+		     && !static_cast<CSpdiaAppUi*>( CEikonEnv::Static()->AppUi() )->IsDisplayingDialog() 
+		     && !iView->MenuBar()->IsDisplayed() )
+            {
+            CallCreateL();
+            }
+        return EKeyWasConsumed;
+        }
+        
+    exitCode = iGrid->OfferKeyEventL( aKeyEvent, aType );
+    if ( exitCode != EKeyWasNotConsumed )
+        {
+        DrawDeferred();
+        if ( code.IsDigit() )
+            {
+            if ( aKeyEvent.iCode - KShortcutKey0 > 0 )
+                {
+                iGrid->SetCurrentDataIndex( 
+                        iSpeedPrivate->Index( aKeyEvent.iCode - KShortcutKey0 ) );
+                MiddleSoftKeyL();
+                iView->LoadCba( MenuResourceID() );
+                exitCode = EKeyWasConsumed;
+                }
+            }
+        else if ( code == EKeyLeftArrow ||
+                code == EKeyRightArrow ||
+                code == EKeyUpArrow ||
+                code == EKeyDownArrow )
+            {
+            iView->LoadCba( MenuResourceID() );
+            MiddleSoftKeyL();
+            }
+        }
+    return exitCode;
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::HandleDatabaseEventL
+// Handles an database event of type aEventType.
+// ---------------------------------------------------------
+//
+void CSpdiaContainer::HandleDatabaseEventL(
+         TContactDbObserverEvent aEvent)
+    {
+    switch( aEvent.iType )
+        {
+        case EContactDbObserverEventContactChanged:
+        case EContactDbObserverEventContactDeleted:
+        case EContactDbObserverEventContactAdded:
+            break;
+        case EContactDbObserverEventSpeedDialsChanged:
+            if ( iDialog )
+                {
+                UpdatePhoneNumberL();
+                }
+            iNeedUpdate = ETrue;
+            break;
+        default:
+            break;
+        }
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::CallCreateL
+// Handles send key press.
+// ---------------------------------------------------------
+//
+void CSpdiaContainer::CallCreateL()
+    {
+    TPhCltTelephoneNumber number;
+    TInt index( iGrid->CurrentDataIndex() );
+    TInt numberType( ESpDialPbkFieldIdNone );
+    TBool call( EFalse );
+
+    // voice mailbox
+    if ( IsVoiceMailBox() || IsVdoMailBox() )
+        {
+        //  call = iSpeedPrivate->VoiceMailL(number);
+        iView->CmdNumberCallL(KAiwCmdCall, ETrue );
+        TInt type = iSpeedPrivate->VoiceMailType();
+        if( type == EVmbxIP )
+            {
+            numberType = ESpDialPbkFieldIdVOIP;
+            }
+        else if( type == EVmbxVideo )
+            {
+            numberType = ESpDialPbkFieldIdPhoneNumberVideo;
+            }
+        }
+    else
+        {
+        // if contact does not exit call should not be created.
+        if ( iSpeedPrivate->Contact( index ) != NULL )
+            {
+            call = ETrue;
+            }
+        
+        if ( !iNoAssignedShown && iSpeedPrivate->Contact( index ) == NULL )
+            {
+            CAknQueryDialog* dlg = 
+                        CAknQueryDialog::NewL( CAknQueryDialog::ENoTone );
+            iNoAssignedShown = ETrue;
+            
+            // Assign it now?
+            if ( !dlg->ExecuteLD( R_SPDIA_QUERY_ASSIGN ) || 
+                                    !iView->CmdAssignNumberL() )
+                {
+                call = EFalse;
+                }
+            else
+                {
+                call = ETrue;
+                }
+            
+            iNoAssignedShown = EFalse;
+            }
+        if ( call )
+            {
+            number = iSpeedPrivate->PhoneNumber( index );
+            numberType = iSpeedPrivate->NumberType( index );
+            }
+        }
+
+    if ( call )
+        {
+        iView->NumberCallL( number, numberType);
+        }
+    }
+
+// ----------------------------------------------------
+// CSpdiaContainer::MenuResourceID
+// 
+// ----------------------------------------------------
+//
+TInt CSpdiaContainer::MenuResourceID()
+    {
+    TInt id( R_SPDIA_MENUBAR_VIEW_VOICE );
+    TInt index( iGrid->CurrentDataIndex() );
+
+    if ( ( !IsVoiceMailBox() ) && ( !IsVdoMailBox() ) )
+        {
+        id = iSpeedPrivate->Contact(index) != NULL ?
+            R_SPDIA_MENUBAR_VIEW : R_SPDIA_MENUBAR_VIEW_ASSIGN;
+        }
+    return id;
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::ShowViewNumberL
+// 
+// ---------------------------------------------------------
+void CSpdiaContainer::ShowViewNumberL()
+    {
+    TInt gridIndex( CurGridPosition() );
+    TInt textWidth( SDM_VIEW_NUMBER_TEXT_MAXWIDTH );
+    MVPbkStoreContact* contact( iSpeedPrivate->Contact( gridIndex ) );
+    
+    iSpeedPrivate->SetCurrentGridIndex( gridIndex );
+
+    if ( contact == NULL )
+        {
+        if( iDialog )
+            {
+            delete iDialog;
+            }
+        iDialog = NULL;
+        iDialog = new( ELeave ) CSpdiaNoteDialog( &iDialog );
+        iDialog->PrepareLC( R_SPDIA_NOTE_VIEWNUMBER );
+        iDialog->RunLD();
+        if ( iDialog )
+            {
+            delete iDialog;
+            }
+        iDialog = NULL;
+        return;
+        }	
+    // The assign was deleted while the view number was displayed.
+    delete iDialog;
+    iDialog = NULL;
+
+    iDialog = new(ELeave) CSpdiaNoteDialog( &iDialog );
+    iDialog->PrepareLC( R_SPDIA_NOTE_VIEWNUMBER );
+
+    CArrayPtr<CGulIcon>* imgArray = iSpeedPrivate->IconArray();
+
+    // icon
+    TInt imgIndex( iSpeedPrivate->SpdIconIndex(gridIndex) );
+
+    if(imgIndex >= 0)
+        {
+        iDialog->SetIconL( CreateBitmapL(*(*imgArray)[imgIndex]) );
+        textWidth -= SDM_ADDITIONAL_MARGIN_FOR_NUMBER_TYPE_ICON; 
+        }
+
+    // thumbnail
+    imgIndex = iSpeedPrivate->ThumbIndex( gridIndex );
+    CEikImage* image;
+		if ( imgIndex >= 0 )
+        {
+        image = CreateScaledBitmapL( *(*imgArray)[imgIndex] );
+        iDialog->SetImageL( image );
+        TSize size(image->Bitmap()->SizeInPixels());
+        textWidth -= size.iWidth + SDM_MARGIN_BETWEEN_TEXT_AND_IMAGE;
+        }
+
+    HBufC* title = iSpeedPrivate->ContactTitleL( contact, ETrue);
+    CleanupStack::PushL(title);
+
+    // Information
+    CDesCArray* locStr = new(ELeave) CDesCArrayFlat( 2 );
+    CleanupStack::PushL( locStr );
+    const CFont* font = iEikonEnv->NormalFont();
+    if ( AknLayoutUtils::Variant() == EApacVariant )
+        {
+        font = ApacPlain16();
+        }
+
+    TPtr ptr = title->Des();
+    TAknLayoutRect dialogRect;
+    TAknLayoutText textLayout;
+    TAknTextComponentLayout area;
+    if ( AknLayoutUtils::ScalableLayoutInterfaceAvailable() )
+        {
+        TAknWindowLineLayout tempWidth = AknLayoutScalable_Avkon::popup_note_image_window().LayoutLine();
+        dialogRect.LayoutRect(Rect(), tempWidth);
+        area = AknLayoutScalable_Avkon::popup_note_image_window_t2((imgIndex >= 0) ? 2 : 0 );
+			
+        textLayout.LayoutText( dialogRect.Rect() ,area );
+        textWidth = textLayout.TextRect().Width();
+        TextUtils::ClipToFit ( ptr, *AknLayoutUtils::FontFromId( area.Font()), textWidth );
+        }
+    else
+        {
+        TextUtils::ClipToFit ( ptr, *font,textWidth);
+        }
+    locStr->AppendL( title->Des() );
+
+    const TDesC& phoneNumber = iSpeedPrivate->PhoneNumber( gridIndex );
+    HBufC* phoneNumberBuf;
+	
+    if ( iNumberGrouping )
+        {
+        iNumberGrouping->Set(phoneNumber);
+        phoneNumberBuf = iNumberGrouping->FormattedNumber().AllocLC();			
+        }        
+    else
+        {
+        phoneNumberBuf = phoneNumber.AllocLC();
+        }
+    TPtr phoneNumberPtr = phoneNumberBuf->Des();
+    AknTextUtils::LanguageSpecificNumberConversion( phoneNumberPtr );
+
+    locStr->AppendL( phoneNumberPtr );
+    HBufC* addprompt = StringLoader::LoadLC(R_SPDIA_TEXT_PROMPT, *locStr);
+    
+    HBufC* prompt = StringLoader::LoadL( R_SPDIA_TEXT_VIEWNUM, iSpeedPrivate->Number(gridIndex) );
+    prompt = prompt->ReAlloc( prompt->Length() + addprompt->Length() );
+    CleanupStack::PushL(prompt);
+    prompt->Des().Append( addprompt->Des() );
+
+    iDialog->SetTextL( *prompt );
+    iDialog->SetPhoneNumberL( (*locStr)[1] );
+
+    CleanupStack::PopAndDestroy( 5 ); // title, locStr, prompt, addprompt, phoneNumberBuf
+    if ( AknLayoutUtils::ScalableLayoutInterfaceAvailable() )
+        {
+        TAknWindowLineLayout tempWidth = AknLayoutScalable_Avkon::popup_note_image_window().LayoutLine();
+        dialogRect.LayoutRect(Rect(), tempWidth);
+        area = AknLayoutScalable_Avkon::popup_note_image_window_t3((imgIndex >= 0) ? 2 : 0 );
+		
+        textLayout.LayoutText(dialogRect.Rect() ,area );
+        textWidth = textLayout.TextRect().Width();
+        }
+    iDialog->ClipPhoneNumberFromBeginningL( textWidth , 0 );
+    iDialog->RunLD();
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::DoUpdate
+// 
+// ---------------------------------------------------------
+void CSpdiaContainer::DoUpdateL()
+    {
+    MiddleSoftKeyL();
+    if ( iSpeedPrivate && iSpeedPrivate->UpdateFlag() )
+        { 
+        DrawNow();        
+        if ( iDialog )
+            {
+            ShowViewNumberL();   
+            iSpeedPrivate->SetUpdateFlag( EFalse );
+            }     
+        iView->LoadCba( MenuResourceID() );
+        }   
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::Grid
+// 
+// ---------------------------------------------------------
+CAknQdialStyleGrid* CSpdiaContainer::Grid()
+    {
+    return iGrid;
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::CreateBitmapL
+// 
+// ---------------------------------------------------------
+CEikImage* CSpdiaContainer::CreateBitmapL(const CGulIcon& aSrc)
+    {
+    if( aSrc.Bitmap() == NULL || aSrc.Mask() == NULL )
+    	{
+    	return NULL;
+    	}
+    CEikImage* image = new(ELeave) CEikImage;
+    image->SetPictureOwnedExternally(EFalse);
+    CFbsBitmap* bitmap = new(ELeave) CFbsBitmap;
+    image->SetBitmap(bitmap);
+    User::LeaveIfError(bitmap->Duplicate(aSrc.Bitmap()->Handle()));
+    CFbsBitmap* bmpMask = aSrc.Mask();
+    if ( bmpMask )
+        {
+        CFbsBitmap* mask = new(ELeave) CFbsBitmap;
+        image->SetMask(mask);
+        User::LeaveIfError( mask->Duplicate( aSrc.Mask()->Handle() ) );
+        }
+    return image;
+    }
+    
+// ---------------------------------------------------------
+// CSpdiaContainer::FocusChanged
+// 
+// ---------------------------------------------------------
+void CSpdiaContainer::FocusChanged(TDrawNow /*aDrawNow*/)
+    {
+    if( iGrid )
+        {
+        iGrid->SetFocus( IsFocused() );
+        }
+    }
+// ---------------------------------------------------------
+// CSpdiaContainer::CreateScaledBitmapL
+// 
+// ---------------------------------------------------------
+CEikImage* CSpdiaContainer::CreateScaledBitmapL(const CGulIcon& aSrc)
+    {
+    TRect 		   mainPaneRect ;
+    TRect 		   statusPaneRect;
+    TRect 		   mainRect;
+    TAknLayoutRect windowParentRect;
+    TAknLayoutRect imageRect;
+    
+    if ( Layout_Meta_Data::IsLandscapeOrientation() )
+        {
+        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainPaneRect);
+        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStatusPane,statusPaneRect);
+        mainPaneRect.iTl = statusPaneRect.iTl;
+        mainRect = mainPaneRect;
+        mainPaneRect.iBr.iY = mainPaneRect.iBr.iY - statusPaneRect.iTl.iY;
+        windowParentRect.LayoutRect(mainRect, AknLayoutScalable_Avkon::popup_note_image_window(0));
+        imageRect.LayoutRect(windowParentRect.Rect(), AknLayoutScalable_Avkon::popup_note_image_window_g2(1));
+        }
+    else
+        {	
+        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainPaneRect);
+        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStatusPane,statusPaneRect);
+        mainPaneRect.iTl= statusPaneRect.iTl;
+        mainRect = mainPaneRect;
+        windowParentRect.LayoutRect(mainRect, AknLayoutScalable_Avkon::popup_note_image_window(0));
+        imageRect.LayoutRect(windowParentRect.Rect(), AknLayoutScalable_Avkon::popup_note_image_window_g2(1));;
+        }
+     
+    TSize imagesize(imageRect.Rect().Size());
+     
+    CFbsBitmap* bmporg= new (ELeave) CFbsBitmap();
+    bmporg->Create(aSrc.Bitmap()->SizeInPixels(), aSrc.Bitmap()->DisplayMode() );
+    bmporg->Duplicate(aSrc.Bitmap()->Handle());
+       
+    CAknIcon* tmpIcon = CAknIcon::NewL();
+    tmpIcon->SetBitmap( bmporg);
+    CAknIcon* scaledIcon = AknIconUtils::CreateIconL(tmpIcon);
+    AknIconUtils::SetSize(scaledIcon->Bitmap(),imagesize,EAspectRatioNotPreserved);
+
+    CFbsBitmap* bmp = new (ELeave) CFbsBitmap();
+    TInt err1 = bmp->Duplicate( scaledIcon->Bitmap()->Handle() );
+
+    // CEikImage	
+    CEikImage* image = new(ELeave) CEikImage;
+    image->SetPictureOwnedExternally( EFalse );
+    image->SetBitmap( bmp );
+    delete scaledIcon;
+  
+    return image;
+    }
+
+// ---------------------------------------------------------
+// CSpdiaContainer::VoiceMailDialogLaunched(
+// 
+// ---------------------------------------------------------
+void CSpdiaContainer::VoiceMailDialogLaunched(TBool aBool)
+    {
+    iVoiceDialog = aBool;
+    }
+// ------------------------------------------------------
+// CSpdiaContainer::MiddleSoftKeyL
+// 
+// ----------------------------------------------------------
+
+void CSpdiaContainer::MiddleSoftKeyL()
+    {
+    TInt index( Grid()->CurrentDataIndex() );
+    if ( ( index < 0 ) || ( index > 8 ) )
+        {
+        return;
+        }
+    if ( IsVoiceMailBox() || IsVdoMailBox() )
+        {
+        //If cba is not changed back here, changing to context sensitive menu does not work
+        if ( iView->IsSettingType() )
+            {
+            iView->SetCba( R_SPDIA_SOFTKEYS_OPTION_BACK_OPTION );
+            }
+        else
+            {
+            iView->SetCba( R_SPDIA_SOFTKEYS_OPTION_EXIT_OPTION ); 
+            }
+        iView->MenuBar()->SetContextMenuTitleResourceId( R_SPDIA_MENUBAR_VIEW_OK_CALL );
+        }
+    else if ( Control().Contact( index ) != NULL )
+        {
+        if ( iView->IsSettingType() )
+            {
+            iView->SetCba( R_SPDIA_SOFTKEYS_OPTION_BACK_OPTION );
+            }
+        else
+            {
+            iView->SetCba( R_SPDIA_SOFTKEYS_OPTION_EXIT_OPTION ); 
+            }
+        iView->MenuBar()->SetContextMenuTitleResourceId( R_SPDIA_MENUBAR_VIEW_OK_CALL_VIDEO );
+        }
+    else
+        {
+        //when number not assigned in 5.0, MSK versions, display "Assign"
+        if ( AknLayoutUtils::MSKEnabled() )
+            {
+            if ( iView->IsSettingType()  )
+                {
+                iView->SetCba( R_SPDIA_VIEW_OPTIONS_BACK_ASSIGN );
+                }
+            else
+                {
+                iView->SetCba( R_SPDIA_VIEW_OPTIONS_EXIT_ASSIGN ); 
+                }
+            }
+        else if(AknLayoutUtils::PenEnabled())
+            {
+            if ( iView->IsSettingType() )
+                {
+                iView->SetCba( R_SPDIA_VIEW_OPTIONS_BACK );
+                }
+            else
+                {
+                iView->SetCba( R_SPDIA_VIEW_OPTIONS_EXIT ); 
+                }
+            }
+        else
+            {
+            iView->SetCba( R_SPDIA_SOFTKEYS_OPTION_EXIT_OPTION );
+            if ( iView->IsSettingType()  )
+                {
+                iView->SetCba( R_SPDIA_SOFTKEYS_OPTION_BACK_OPTION );
+                }
+            else
+                {
+                iView->SetCba( R_SPDIA_SOFTKEYS_OPTION_EXIT_OPTION ); 
+                }
+            iView->MenuBar()->SetContextMenuTitleResourceId( R_SPDIA_MENUBAR_VIEW_OK_ASSIGN );
+            }
+        }
+    }
+		
+// ----------------------------------------------------------------------------
+// CSpdiaContainer::HandlePointerEventL
+// Function to handle all touch (pointer events)
+// ----------------------------------------------------------------------------
+void CSpdiaContainer::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+    {
+    if ( !iView->IsAssignCompleted() )
+        {
+        return;
+        }
+
+    // Check if touch is enabled or not.
+    if ( !AknLayoutUtils::PenEnabled() )
+        {
+        return;
+        }
+  
+    if ( iLongTapDetector )
+        {
+        iLongTapDetector->PointerEventL( aPointerEvent );
+        }
+    // Process only once when the grid control has been pressed
+    if ( ( aPointerEvent.iType == TPointerEvent::EButton1Down ) ||
+         ( aPointerEvent.iType == TPointerEvent::EDrag ) ||
+         ( aPointerEvent.iType == TPointerEvent::EButton1Up ) )
+        {        
+        // Ask the grid to process the handlepointerevent
+        iGrid->HandlePointerEventL( aPointerEvent );
+        
+        if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
+        	{
+        	iButton1DownIndex = iGrid->CurrentDataIndex();
+        	}
+        // If already highlighted, activate the grid element
+        if ( iGrid->CurrentDataIndex() == iButton1DownIndex ) 
+            {
+            TInt pointedItemIndex;
+            if ( ( aPointerEvent.iType == TPointerEvent::EButton1Up ) &&
+                iGrid->View()->XYPosToItemIndex(
+                    aPointerEvent.iPosition, pointedItemIndex ) &&
+                ( pointedItemIndex == iButton1DownIndex ) )
+                {
+                if ( iLongTapUsed == EFalse )
+                    {
+                    // Need filtrate IsVoiceMailBox and IsVdoMailBox
+                    if ( !IsVoiceMailBox() && !IsVdoMailBox() 
+                         && iSpeedPrivate->Contact( iButton1DownIndex ) == NULL )
+                        {
+                        // Open phonebook fetch list
+                        iView->CmdAssignNumberL();	
+                        // No need to launch the menu
+                        return;
+                        }
+                    else if ( iSpeedPrivate->Contact( iButton1DownIndex ) != NULL )
+                        {
+                        CallCreateL( );
+                        return;
+                        }
+                    CEikMenuBar* menuBar = iView->MenuBar();
+                    TInt barId(R_SPDIA_MENUBAR_VIEW_OK_ASSIGN);
+            
+                    // If focus is on voicemailbox
+                    if ( IsVoiceMailBox() || IsVdoMailBox() )
+                        {
+                        barId = R_SPDIA_MENUBAR_VIEW_OK_CALL;
+                        }
+                    // If a number is assigned then provide call option
+                    else if ( iSpeedPrivate->Contact( iButton1DownIndex ) != NULL )
+                        {
+                        barId = R_SPDIA_MENUBAR_VIEW_OK_CALL_VIDEO;
+                        }
+                    menuBar->StopDisplayingMenuBar();
+                    menuBar->SetMenuType( CEikMenuBar::EMenuContext );
+                    menuBar->SetMenuTitleResourceId( barId );
+                    menuBar->TryDisplayMenuBarL();
+                    // At the time of being canceled, a menu is changed.
+                    menuBar->SetMenuTitleResourceId( MenuResourceID() );
+                    menuBar->SetMenuType( CEikMenuBar::EMenuOptions );
+                    }
+                iLongTapUsed = EFalse;
+                }
+            }
+        // Else just reload the cba buttons based on the context
+        else 
+            {
+            MiddleSoftKeyL();
+            iView->LoadCba( MenuResourceID() );
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CSpdiaContainer::LongTapDetectorL
+// --------------------------------------------------------------------------
+//    
+CAknLongTapDetector& CSpdiaContainer::LongTapDetectorL()
+    {
+    if ( !iLongTapDetector )
+        {
+        iLongTapDetector = CAknLongTapDetector::NewL( this );
+        }
+    return *iLongTapDetector;
+    }
+    
+// --------------------------------------------------------------------------
+// CSpdiaContainer::HandleLongTapEventL
+// --------------------------------------------------------------------------
+//    
+ void CSpdiaContainer::HandleLongTapEventL(
+        const TPoint& /*aPenEventLocation*/, 
+        const TPoint& /*aPenEventScreenLocation*/ )
+    {
+    //Get the Current Data Index
+    if ( AknLayoutUtils::PenEnabled() )
+        {
+        iLongTapUsed = ETrue;   	    
+        TInt index = iGrid->CurrentDataIndex();
+        if ( IsVoiceMailBox() || IsVdoMailBox())
+            {
+            CEikMenuBar* menuBar = iView->MenuBar();
+            TInt barId = R_SPDIA_MENUBAR_VIEW_OK_CALL;
+            
+            menuBar->StopDisplayingMenuBar();
+            menuBar->SetMenuType(CEikMenuBar::EMenuContext);
+            menuBar->SetMenuTitleResourceId(barId);
+            menuBar->TryDisplayMenuBarL();
+            //For the reason at the time of being canceled, a menu is changed.
+            menuBar->SetMenuTitleResourceId(MenuResourceID());
+            menuBar->SetMenuType(CEikMenuBar::EMenuOptions);
+            }
+        }
+    }
+    
+// --------------------------------------------------------------------------
+// CSpdiaContainer::SetStatusPaneL
+// --------------------------------------------------------------------------
+//    
+ void CSpdiaContainer::SetStatusPaneL()
+     {
+     CEikStatusPane* statusPane = iView->iStatusPane;
+
+     if ( Layout_Meta_Data::IsLandscapeOrientation() )
+         {
+         statusPane->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL );
+         statusPane->MakeVisible( ETrue );
+         statusPane->DrawNow();
+         }
+     else
+         {
+         TInt resouceId = statusPane->CurrentLayoutResId();
+
+         if ( resouceId != R_AVKON_STATUS_PANE_LAYOUT_USUAL && 
+             resouceId != R_AVKON_STATUS_PANE_LAYOUT_USUAL_EXT )
+             {
+             statusPane->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL );
+             }
+
+         if ( !statusPane->IsVisible() )
+             {
+             statusPane->MakeVisible( ETrue );
+             }
+
+         TRect mainPaneRect;
+         AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );
+
+         TRect statusPaneRect;
+         AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane, statusPaneRect );
+         if ( !iView->IsShowMsgDlg() && !iView->IsShowVmbxDlg())
+             {
+             mainPaneRect.iTl = statusPaneRect.iTl;
+             }
+         SetRect( mainPaneRect );
+         }
+     }
+
+ // --------------------------------------------------------------------------
+ // CSpdiaContainer::RefreshDialog
+ // from MRefreshObserver
+ // --------------------------------------------------------------------------
+ // 
+ void CSpdiaContainer::RefreshDialog()
+     {
+     if ( iDialog )
+         {
+         TRAP_IGNORE( DoUpdateL() );
+         }
+     }
+ 
+ // --------------------------------------------------------------------------
+ // CSpdiaContainer::RefreshDialog
+ // From MEikListBoxObserver, Handles an event of listbox.
+ // --------------------------------------------------------------------------
+ // 
+ void CSpdiaContainer::HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType)
+    {
+    switch(aEventType)
+        {
+        case EEventPenDownOnItem:
+            iView->LoadCba( MenuResourceID() );
+            MiddleSoftKeyL();
+            break;
+        }
+    }
+ // End of File