diff -r c84cf270c54f -r 8871b09be73b phoneuis/dialer/src/cdialerkeypadcontainer.cpp --- a/phoneuis/dialer/src/cdialerkeypadcontainer.cpp Tue Feb 02 00:10:04 2010 +0200 +++ b/phoneuis/dialer/src/cdialerkeypadcontainer.cpp Fri Feb 19 22:50:26 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007 - 2010 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" @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -33,310 +32,59 @@ #include #include // for KDC_APP_RESOURCE_DIR #include +#include +#include #include "cdialerkeypadcontainer.h" #include "dialercommon.h" #include "dialertrace.h" #include "cdialerkeypadbutton.h" -_LIT( KDialerMifFileName, "dialer.mif" ); // Number of buttons in this container const TInt KNumberOfButtons = 12; -// Keypad button images -const TMifDialer KKeyPadButtons[] = +struct TDialerButton + { + TMifDialer iBitmap; + TMifDialer iBitmapMask; + TInt iScanCode; + TInt iKeyCode; + }; + +const TDialerButton KKeyPadButtons[ KNumberOfButtons ] = + { - EMbmDialerQgn_indi_dialer_one, - EMbmDialerQgn_indi_dialer_two, - EMbmDialerQgn_indi_dialer_three, - EMbmDialerQgn_indi_dialer_four, - EMbmDialerQgn_indi_dialer_five, - EMbmDialerQgn_indi_dialer_six, - EMbmDialerQgn_indi_dialer_seven, - EMbmDialerQgn_indi_dialer_eight, - EMbmDialerQgn_indi_dialer_nine, - EMbmDialerQgn_indi_dialer_prefix, - EMbmDialerQgn_indi_dialer_zero, - EMbmDialerQgn_indi_dialer_hash - }; - -// Keypad button image masks -const TMifDialer KKeyPadButtonsMasks[] = - { - EMbmDialerQgn_indi_dialer_one_mask, - EMbmDialerQgn_indi_dialer_two_mask, - EMbmDialerQgn_indi_dialer_three_mask, - EMbmDialerQgn_indi_dialer_four_mask, - EMbmDialerQgn_indi_dialer_five_mask, - EMbmDialerQgn_indi_dialer_six_mask, - EMbmDialerQgn_indi_dialer_seven_mask, - EMbmDialerQgn_indi_dialer_eight_mask, - EMbmDialerQgn_indi_dialer_nine_mask, - EMbmDialerQgn_indi_dialer_prefix_mask, - EMbmDialerQgn_indi_dialer_zero_mask, - EMbmDialerQgn_indi_dialer_hash_mask + { EMbmDialerQgn_indi_dialer_voicemail, + EMbmDialerQgn_indi_dialer_voicemail_mask, + '1', + '1' + }, + { KDialerNoIcon, KDialerNoIcon, + '2', '2' }, + { KDialerNoIcon, KDialerNoIcon, + '3', '3' }, + { KDialerNoIcon, KDialerNoIcon, + '4', '4' }, + { KDialerNoIcon, KDialerNoIcon, + '5', '5' }, + { KDialerNoIcon, KDialerNoIcon, + '6', '6' }, + { KDialerNoIcon, KDialerNoIcon, + '7', '7' }, + { KDialerNoIcon, KDialerNoIcon, + '8', '8' }, + { KDialerNoIcon, KDialerNoIcon, + '9', '9' }, + { KDialerNoIcon, KDialerNoIcon, + EStdKeyNkpAsterisk, '*' }, + { KDialerNoIcon, KDialerNoIcon, + '0', '0' }, + { KDialerNoIcon, KDialerNoIcon, + EStdKeyHash, '#' } }; -// Match keypresses to keyevents send to the phone -// -const TInt TDialerButtonToKeypadMap[12][2] = - { - { 49, // ScanCode - 49 // KeyCode - }, - { 50, - 50 - }, - { 51, - 51 - }, - { 52, - 52 - }, - { 53, - 53 - }, - { 54, - 54 - }, - { 55, - 55 - }, - { 56, - 56 - }, - { 57, - 57 - }, - { EStdKeyNkpAsterisk, - 42 - }, - { '0', - '0' - }, - { EStdKeyHash, - 35 - } - }; -// Class declaration for CDialerKeyPadButton separated to cdialerkeypadbutton.h. - -// --------------------------------------------------------------------------- -// C++ default constructor -// --------------------------------------------------------------------------- -// -CDialerKeyPadButton::CDialerKeyPadButton() - { - } - -// --------------------------------------------------------------------------- -// Destructor -// --------------------------------------------------------------------------- -// -CDialerKeyPadButton::~CDialerKeyPadButton() - { - MTouchFeedback* feedback = MTouchFeedback::Instance(); - if ( feedback ) - { - feedback->RemoveFeedbackForControl( iButton ); - } - delete iButton; - } - -// --------------------------------------------------------------------------- -// Creates number keypad button -// --------------------------------------------------------------------------- -// -void CDialerKeyPadButton::CreateButtonL( const TInt aScanCode, - const TInt aKeyCode, - const TMifDialer aButtonIcon, - const TMifDialer aButtonIconMask ) - { - iScanCode = aScanCode; - iKeyCode = aKeyCode; - iButtonIcon = aButtonIcon; - iButtonIconMask = aButtonIconMask; - - TFileName mifPath( KDriveZ ); - mifPath.Append( KDC_APP_BITMAP_DIR ); - mifPath.Append( KDialerMifFileName ); - - MAknsSkinInstance* skin = AknsUtils::SkinInstance(); - CFbsBitmap* bitmap (NULL); - CFbsBitmap* mask (NULL); - - // Get icon ids. - TAknsItemID skinItemId( KAknsIIDNone ); - - // Create button image. - MapDialerIconToSkinIcon( aButtonIcon ,skinItemId ); - AknsUtils::CreateColorIconLC( - skin, - skinItemId, - KAknsIIDQsnIconColors, - EAknsCIQsnIconColorsCG30, - bitmap, - mask, - mifPath, - aButtonIcon, - aButtonIconMask, - KRgbBlack - ); - - CGulIcon* icon = CGulIcon::NewL( bitmap, mask ); - CleanupStack::Pop( 2 ); - CleanupStack::PushL( icon ); - iButton = CAknButton::NewL( - icon , // ownership taken - NULL, NULL, NULL, _L(""), _L(""), 0, 0 ); - iButton->SetButtonFlags( KAknButtonReportOnLongPress| - KAknButtonReportOnKeyDown | - KAknButtonRequestExitOnButtonUpEvent ); - iButton->SetIconScaleMode( EAspectRatioPreserved ); - iButton->SetMargins( TMargins8(0,0,0,0) ); - CleanupStack::Pop( icon ); - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -TInt CDialerKeyPadButton::ScanCode() const - { - return iScanCode; - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -TInt CDialerKeyPadButton::KeyCode() const - { - return iKeyCode; - } -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CDialerKeyPadButton::MapDialerIconToSkinIcon( const TInt aDialerIcon, - TAknsItemID& aItemId ) const - { - switch ( aDialerIcon ) - { - case EMbmDialerQgn_indi_dialer_one: - aItemId = KAknsIIDQgnIndiDialerOne; - break; - case EMbmDialerQgn_indi_dialer_two: - aItemId = KAknsIIDQgnIndiDialerTwo; - break; - case EMbmDialerQgn_indi_dialer_three: - aItemId = KAknsIIDQgnIndiDialerThree; - break; - case EMbmDialerQgn_indi_dialer_four: - aItemId = KAknsIIDQgnIndiDialerFour; - break; - case EMbmDialerQgn_indi_dialer_five: - aItemId = KAknsIIDQgnIndiDialerFive; - break; - case EMbmDialerQgn_indi_dialer_six: - aItemId = KAknsIIDQgnIndiDialerSix; - break; - case EMbmDialerQgn_indi_dialer_seven: - aItemId = KAknsIIDQgnIndiDialerSeven; - break; - case EMbmDialerQgn_indi_dialer_eight: - aItemId = KAknsIIDQgnIndiDialerEight; - break; - case EMbmDialerQgn_indi_dialer_nine: - aItemId = KAknsIIDQgnIndiDialerNine; - break; - case EMbmDialerQgn_indi_dialer_zero: - aItemId = KAknsIIDQgnIndiDialerZero; - break; - case EMbmDialerQgn_indi_dialer_prefix: - aItemId = KAknsIIDQgnIndiDialerPrefix; - break; - case EMbmDialerQgn_indi_dialer_hash: - aItemId = KAknsIIDQgnIndiDialerHash; - break; - default: - break; - } - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CDialerKeyPadButton::SetIconSize( TSize& aSize ) - { - iButton->SetIconSize( aSize ); - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CDialerKeyPadButton::UpdateIconL() - { - TFileName mifPath( KDriveZ ); - mifPath.Append( KDC_APP_BITMAP_DIR ); - mifPath.Append( KDialerMifFileName ); - - MAknsSkinInstance* skin = AknsUtils::SkinInstance(); - CFbsBitmap* bitmap (NULL); - CFbsBitmap* mask (NULL); - - // Get icon id. - TAknsItemID skinItemId( KAknsIIDNone ); - MapDialerIconToSkinIcon( iButtonIcon, skinItemId ); - - AknsUtils::CreateColorIconLC( - skin, - skinItemId, - KAknsIIDQsnIconColors, - EAknsCIQsnIconColorsCG30, - bitmap, - mask, - mifPath, - iButtonIcon, - iButtonIconMask, - KRgbBlack - ); - - CGulIcon* icon = CGulIcon::NewL( bitmap, mask ); - CleanupStack::Pop( 2 ); - - iButton->State()->SetIcon( icon ); // icon ownership transfered - - } - -// --------------------------------------------------------------------------- -// -// Enable or disable audio but keep vibra feedback -// --------------------------------------------------------------------------- -// -void CDialerKeyPadButton::EnableAudioFeedback( const TBool aEnable ) - { - MTouchFeedback* feedback = MTouchFeedback::Instance(); - if ( feedback ) - { - feedback->EnableFeedbackForControl( iButton, ETrue, aEnable ); - } - } -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CDialerKeyPadButton::HandleResourceChange( TInt aType ) - { - if ( aType == KAknsMessageSkinChange ) - { - TRAP_IGNORE( UpdateIconL() ); - iButton->HandleResourceChange( aType ); - } - } // ========================= MEMBER FUNCTIONS ================================ @@ -366,9 +114,9 @@ { DIALER_PRINT("KeyPadContainer::ConstructL<"); BaseConstructL(); + iKeyLabelManager = CDialerKeyPadLabelManager::NewL( *iCoeEnv, *this ); CreateButtonsL(); - CCoeEnv* env = CCoeEnv::Static(); - env->AddForegroundObserverL( *this ); + iCoeEnv->AddForegroundObserverL( *this ); DIALER_PRINT("KeyPadContainer::ConstructL>"); } @@ -387,14 +135,12 @@ CDialerKeyPadContainer::~CDialerKeyPadContainer() { for ( TInt i = 0; i < iButtonCount; i++ ) - { - AknsUtils::DeregisterControlPosition( - ((CDialerKeyPadButton*)iButtons[i])->Control()); + { delete iButtons[i]; } iButtons.Close(); - CCoeEnv* env = CCoeEnv::Static(); - env->RemoveForegroundObserver( *this ); + iCoeEnv->RemoveForegroundObserver( *this ); + delete iKeyLabelManager; } // --------------------------------------------------------------------------- @@ -417,7 +163,7 @@ __ASSERT_DEBUG( aIndex < KNumberOfButtons, _L("CDialerKeyPadContainer::ComponentControl, index out of range.")); - return ((CDialerKeyPadButton*)iButtons[aIndex])->Control(); + return iButtons[aIndex]; } // --------------------------------------------------------------------------- @@ -465,9 +211,12 @@ // void CDialerKeyPadContainer::SetLayout() { - if ( iOperatingMode == EModeDialer ) + if ( iOperatingMode == EModeDialer || + iOperatingMode == EModeEasyDialing ) { - SetPhoneLayout(); + // Same renewed layout is used regardless of the status + // of Easy Dialing + SetEasyDialingLayout(); } else { @@ -497,20 +246,9 @@ TRect parentRect( Rect() ); - // Icon size - all in same size - TAknLayoutRect functionGraphics; - - functionGraphics.LayoutRect( - parentRect, - TAknWindowComponentLayout::Compose( - AknLayoutScalable_Apps::cell_dialer2_keypad_pane( iVariety ), - AknLayoutScalable_Apps::cell_dialer2_keypad_pane_g1( - iVariety ) ) ); - TSize iconSize = functionGraphics.Rect().Size(); - // Layout buttons TAknLayoutScalableParameterLimits limits = - AknLayoutScalable_Apps::cell_dialer2_keypad_pane_ParamLimits( iVariety ); + AknLayoutScalable_Apps::cell_dialer2_keypad_pane_ParamLimits( iVariety ); TInt i = 0; for ( TInt row = limits.FirstRow(); row <= limits.LastRow(); row++ ) @@ -518,22 +256,63 @@ for ( TInt col = limits.FirstColumn(); col <= limits.LastColumn(); col++ ) { - // Layout button - AknLayoutUtils::LayoutControl( - ((CDialerKeyPadButton*)iButtons[i])->Control(), parentRect, - TAknWindowComponentLayout::Compose( - AknLayoutScalable_Apps::cell_dialer2_keypad_pane( iVariety, - col, row ), - AknLayoutScalable_Apps::bg_button_pane_pane_cp04( - iVariety ) ) ); - - // Set icon size - ((CDialerKeyPadButton*)iButtons[i++])->SetIconSize( iconSize ); + iButtons[i]->SetVariety( iVariety ); + iButtons[i]->SetOperationMode( iOperatingMode ); + + AknLayoutUtils::LayoutControl( iButtons[i], parentRect, TAknWindowComponentLayout::Compose( + AknLayoutScalable_Apps::cell_dialer2_keypad_pane( iVariety, col, row ), + AknLayoutScalable_Apps::bg_button_pane_pane_cp04( iVariety ) ) ); + i++; } } } // --------------------------------------------------------------------------- +// CDialerKeyPadContainer::SetEasyDialingLayout +// +// --------------------------------------------------------------------------- +// +void CDialerKeyPadContainer::SetEasyDialingLayout() + { + TRect parentRect( Rect() ); + + // Layout buttons + TAknLayoutScalableParameterLimits limits = + AknLayoutScalable_Apps::cell_dialer2_keypad_pane_ParamLimits( iVariety ); + + // Rectangle of the first button + TAknLayoutRect buttonLayoutRect; + buttonLayoutRect.LayoutRect( parentRect, + AknLayoutScalable_Apps::cell_dia3_key_num_pane( iVariety ) ); + TRect firstButtonRect = buttonLayoutRect.Rect(); + // Move the first button rect to top-left-corner of the keypad area, + // the default place is wrong in mirrored layout. + firstButtonRect.SetRect( parentRect.iTl, firstButtonRect.Size() ); + + TInt colCount = limits.LastColumn() - limits.FirstColumn() + 1; + + for ( TInt row = limits.FirstRow() ; row <= limits.LastRow() ; row++ ) + { + for ( TInt col = limits.FirstColumn() ; col <= limits.LastColumn() ; col++ ) + { + // Calculate corresponding index in iButtons array + TInt idx = col + row * colCount; + + // Set mode and variety so that correct button internal layout will be used + iButtons[idx]->SetVariety( iVariety ); + iButtons[idx]->SetOperationMode( iOperatingMode ); + + // Layout button + TRect buttonRect = firstButtonRect; + buttonRect.Move( col * buttonRect.Width(), row * buttonRect.Height() ); + buttonRect.Shrink( 1, 1 ); // to create small gap between buttons + iButtons[idx]->SetRect( buttonRect ); + } + } + + } + +// --------------------------------------------------------------------------- // CDialerKeyPadContainer::SetVideoLayout // // --------------------------------------------------------------------------- @@ -542,21 +321,8 @@ { TRect parentRect( Rect() ); - // Icon size - all in same size - TAknLayoutRect functionGraphics; - - functionGraphics.LayoutRect( - parentRect, - TAknWindowComponentLayout::Compose( - AknLayoutScalable_Apps::cell_video_dialer_keypad_pane( iVariety, - 0, 0 ), - AknLayoutScalable_Apps::cell_video_dialer_keypad_pane_g1( - iVariety ) ) ); - TSize iconSize = functionGraphics.Rect().Size(); - TAknLayoutScalableParameterLimits limits = - AknLayoutScalable_Apps::cell_video_dialer_keypad_pane_ParamLimits( - iVariety ) ; + AknLayoutScalable_Apps::cell_video_dialer_keypad_pane_ParamLimits( iVariety ) ; TInt i = 0; for ( TInt row = limits.FirstRow(); row <= limits.LastRow(); row++ ) @@ -565,17 +331,17 @@ col <= limits.LastColumn(); col++ ) { + iButtons[i]->SetVariety( iVariety ); + iButtons[i]->SetOperationMode( iOperatingMode ); + // Layout button AknLayoutUtils::LayoutControl( - ((CDialerKeyPadButton*)iButtons[i])->Control(), parentRect, + iButtons[i], parentRect, TAknWindowComponentLayout::Compose( AknLayoutScalable_Apps::cell_video_dialer_keypad_pane( - iVariety, col, row ), - AknLayoutScalable_Apps::bg_button_pane_cp08( - iVariety ) ) ); - - // Set icon size - iButtons[i++]->SetIconSize( iconSize ); + iVariety, col, row ), + AknLayoutScalable_Apps::bg_button_pane_cp08( iVariety ) ) ); + i++; } } } @@ -590,24 +356,37 @@ { DIALER_PRINT("KeyPadContainer::CreateButtonsL<"); - for ( TInt i=0; i < KNumberOfButtons; i++ ) + TInt flags ( KAknButtonReportOnLongPress| + KAknButtonReportOnKeyDown | + KAknButtonRequestExitOnButtonUpEvent ); + + for ( TInt i = 0; i < KNumberOfButtons; i++ ) { - CDialerKeyPadButton* button = new (ELeave) CDialerKeyPadButton(); - CleanupStack::PushL( button ); - button->CreateButtonL( TDialerButtonToKeypadMap[i][0], - TDialerButtonToKeypadMap[i][1], - KKeyPadButtons[i], - KKeyPadButtonsMasks[i] ); + const TPtrC numLabel = iKeyLabelManager->ButtonNumLabel( i ); + + const TPtrC alphaLabel = iKeyLabelManager->ButtonFirstAlphaLabel( i ); + + const TPtrC secondAlphaLabel = iKeyLabelManager->ButtonSecondAlphaLabel( i ); + + CDialerKeyPadButton* button = CDialerKeyPadButton::NewLC( + numLabel, + alphaLabel, + secondAlphaLabel, + KKeyPadButtons[i].iScanCode, + KKeyPadButtons[i].iKeyCode, + KKeyPadButtons[i].iBitmap, + KKeyPadButtons[i].iBitmapMask, + flags ); + iButtons.AppendL( button ); CleanupStack::Pop( button ); - iButtons.Append( button ); - button->Control()->SetMopParent( this ); - button->Control()->SetParent( this ); - button->Control()->SetContainerWindowL( *this ); - button->Control()->SetObserver( this ); - button->Control()->ActivateL(); - AknsUtils::RegisterControlPosition( button->Control() ); + + button->SetMopParent( this ); + button->SetParent( this ); + button->SetContainerWindowL( *this ); + button->SetObserver( this ); + button->ActivateL(); } - DIALER_PRINT("KeyPadContainer::CreateButtonsL>"); + DIALER_PRINT("KeyPadContainer::CreateButtonsL>"); } // --------------------------------------------------------------------------- @@ -635,17 +414,19 @@ CDialerKeyPadButton* tappedButton = NULL; for ( TInt i=0; i < iButtons.Count(); i++ ) { - if ( iButtons[i]->Control() == aControl ) + if ( iButtons[i] == aControl ) { tappedButton = iButtons[i]; break; } } - + + __ASSERT_ALWAYS( tappedButton, + _L("CDialerKeyPadContainer::HandleControlEventL, invalid button handle")); + // Send key event to phone. TKeyEvent keyEvent; keyEvent.iScanCode = tappedButton->ScanCode(); - keyEvent.iCode = tappedButton->KeyCode(); keyEvent.iModifiers = 0; keyEvent.iRepeats = 0; @@ -664,7 +445,7 @@ { DIALER_PRINT("HandleControlEventL.EEventStateChanged"); iButtonPressedDown = ETrue; - + keyEvent.iCode = tappedButton->KeyCode(); iParentControl.PrepareForFocusGainL(); ControlEnv()->SimulateKeyEventL( keyEvent, EEventKeyDown ); @@ -696,8 +477,7 @@ { for ( TInt i=0; i < iButtons.Count(); i++ ) { - (( CDialerKeyPadButton* )iButtons[i])->HandleResourceChange( - aType ); + iButtons[i]->HandleResourceChange( aType ); } } } @@ -705,7 +485,7 @@ // --------------------------------------------------------------------------- // CDialerKeyPadContainer::MakeVisible // -// Called when dialer control come visible or unvisible +// Called when dialer control becomes visible or invisible // // --------------------------------------------------------------------------- // @@ -723,6 +503,17 @@ CCoeControl::MakeVisible( aVisible ); } +// --------------------------------------------------------------------------- +// CDialerKeyPadContainer::SetOperationMode +// +// Set new operation mode for the keypad +// +// --------------------------------------------------------------------------- +// +void CDialerKeyPadContainer::SetOperationMode( TDialerOperationMode aOperatingMode ) + { + iOperatingMode = aOperatingMode; + } // --------------------------------------------------------------------------- // CDialerKeyPadContainer::HandleGainingForeground @@ -755,6 +546,30 @@ } // --------------------------------------------------------------------------- +// CDialerKeyPadContainer::KeyLabelsChanged +// +// Reset button labels and update the layout +// --------------------------------------------------------------------------- +// +void CDialerKeyPadContainer::KeyLabelsChanged() + { + for ( TInt i = 0 ; i < iButtons.Count() ; i++ ) + { + const TPtrC numLabel = iKeyLabelManager->ButtonNumLabel( i ); + const TPtrC alphaLabel = iKeyLabelManager->ButtonFirstAlphaLabel( i ); + const TPtrC secondAlphaLabel = iKeyLabelManager->ButtonSecondAlphaLabel( i ); + + iButtons[i]->SetNumLabel( numLabel ); + iButtons[i]->SetPrimaryAlphaLabel( alphaLabel ); + iButtons[i]->SetSecondaryAlphaLabel( secondAlphaLabel ); + + // reset layout + iButtons[i]->SetSize( iButtons[i]->Size() ); + } + DrawDeferred(); + } + +// --------------------------------------------------------------------------- // CDialerKeyPadContainer::EnableTactileFeedback // //