diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookui/Speeddial/ControlSrc/SpdiaGridDlg.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Speeddial/ControlSrc/SpdiaGridDlg.cpp Wed Sep 01 12:29:52 2010 +0100 @@ -0,0 +1,420 @@ +/* +* Copyright (c) 2002 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: +* The main UI container element of the Speeddial Control Utility +* that contains the 3x3 grid of speeddial entries. +* +*/ + + + + + +// INCLUDE FILES +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include // phonebook engine +#include +#include +#include +#include "SpdiaControl.hrh" +#include "SpdiaControl.h" +#include "SpdiaGridDlg.h" +#include "SpdiaGrid.h" +#include "Speeddial.laf" + +const TUint KShortcutKey0('0'); +const TInt KMaxIndex(8); +const TInt KNullIndexData(-1); +// ================= MEMBER FUNCTIONS ======================= +// --------------------------------------------------------- +// CSpdiaGridDlg::NewL() +// +// --------------------------------------------------------- +CSpdiaGridDlg* CSpdiaGridDlg::NewL(TInt& aDial, const CSpdiaControl& aControl) + { + CSpdiaGridDlg* self = new (ELeave) CSpdiaGridDlg(aDial, aControl); + return self; + } + +// --------------------------------------------------------- +// CSpdiaGridDlg::~CSpdiaGridDlg() +// +// --------------------------------------------------------- +CSpdiaGridDlg::~CSpdiaGridDlg() + { + delete iPbkNotifier; + } + +// --------------------------------------------------------- +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CSpdiaGridDlg::CSpdiaGridDlg(TInt& aDial, const CSpdiaControl& aControl): iDial(aDial) + { + iControl = CONST_CAST(CSpdiaControl*, &aControl); + iCbaID = R_AVKON_SOFTKEYS_BACK; + iButton1DownIndex = 0; + } + +// ---------------------------------------------------- +// CSpdiaGridDlg::PreLayoutDynInitL +// +// ---------------------------------------------------- +// +void CSpdiaGridDlg::PreLayoutDynInitL() + { + iGrid = STATIC_CAST(CSpdiaGrid*, Control(ESpdGridItem)); + + CDesCArray* itemArray = STATIC_CAST(CDesCArray*, + iGrid->Model()->ItemTextArray()); + + itemArray->Reset(); + iControl->CreateDataL(*iGrid); // + + // Obsever + CPbkContactEngine* pbkEngine = iControl->PbkEngine(); + iPbkNotifier = pbkEngine->CreateContactChangeNotifierL(this); + } + +// ---------------------------------------------------- +// CSpdiaGridDlg::PostLayoutDynInitL +// +// ---------------------------------------------------- +// +void CSpdiaGridDlg::PostLayoutDynInitL() + { + iControl->SetLayout(Rect()); + if ( AknLayoutUtils::LayoutMirrored() ) + { + iGrid->SetCurrentDataIndex(0); + LoadCbaL(); + } + HandleResourceChange( KEikDynamicLayoutVariantSwitch ); + } + +// --------------------------------------------------------- +// CSpdiaGridDlg::CreateCustomControlL +// +// --------------------------------------------------------- +// +SEikControlInfo CSpdiaGridDlg::CreateCustomControlL(TInt aControlType) + { + SEikControlInfo ctrlInfo; + ctrlInfo.iControl=NULL; + ctrlInfo.iTrailerTextId=0; + ctrlInfo.iFlags = EEikControlHasEars; + if (aControlType == ESpdiaGrid) + { + ctrlInfo.iControl = CSpdiaGrid::NewL(*iControl); + } + return ctrlInfo; + } +// --------------------------------------------------------- +// CSpdiaGridDlg::OkToExitL +// +// --------------------------------------------------------- +// +TBool CSpdiaGridDlg::OkToExitL(TInt aButtonId) // Pressed button id + { + TBool result(ETrue); + if (aButtonId == EAknSoftkeyOk) + { + TInt vmbxSupport = 0; + CRepository* vmbxSupported = CRepository::NewL( KCRUidVideoMailbox ); + vmbxSupported->Get( KVideoMbxSupport, vmbxSupport ); + delete vmbxSupported; + + TInt vmbxPos; + CRepository* vmbxKey2 = CRepository::NewL( KCRUidTelVideoMailbox ); + vmbxKey2->Get( KTelVideoMbxKey, vmbxPos ); + TInt vdoIndex( iControl->Index( vmbxPos ) ); + delete vmbxKey2; + + iDial = iControl->Number(iGrid->CurrentDataIndex()); + TInt index(iGrid->CurrentDataIndex()); + + if ( iControl->VMBoxPosition() == index || ( vmbxSupport && vdoIndex == index ) ) + { + result = EFalse; + } + } + return result; + } + +// --------------------------------------------------------- +// CSpdiaGridDlg::OfferKeyEventL +// +// --------------------------------------------------------- +// +TKeyResponse CSpdiaGridDlg::OfferKeyEventL + ( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + TBool keyConsumed( EFalse ); + if ( iGrid != NULL ) + { + TChar code( aKeyEvent.iCode ); + + 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 ) + { + TInt index = iGrid->CurrentDataIndex(); + if ( index == KMaxIndex ) + { + iGrid->SetCurrentDataIndex( 0 ); + LoadCbaL(); + return EKeyWasConsumed; + } + } + if ( code == EKeyRightArrow ) + { + TInt index = iGrid->CurrentDataIndex(); + if ( index == 0 ) + { + iGrid->SetCurrentDataIndex(KMaxIndex); + LoadCbaL(); + return EKeyWasConsumed; + } + } + } + else + { + if ( code == EKeyRightArrow ) + { + TInt index = iGrid->CurrentDataIndex(); + if(index == KMaxIndex) + { + iGrid->SetCurrentDataIndex(0); + LoadCbaL(); + return EKeyWasConsumed; + } + } + if ( code == EKeyLeftArrow ) + { + TInt index = iGrid->CurrentDataIndex(); + if ( index == 0 ) + { + iGrid->SetCurrentDataIndex(KMaxIndex); + LoadCbaL(); + return EKeyWasConsumed; + } + } + } + + if ( aKeyEvent.iScanCode == EStdKeyYes ) + { + return EKeyWasConsumed; + } + TKeyResponse exitCode( + iGrid->OfferKeyEventL( aKeyEvent, aType) ); + if ( exitCode != EKeyWasNotConsumed ) + { + if ( code.IsDigit() ) + { + if ( aKeyEvent.iCode - KShortcutKey0 > 0 ) + { + iGrid->SetCurrentDataIndex( + iControl->Index(aKeyEvent.iCode - KShortcutKey0)); + LoadCbaL(); + keyConsumed = ETrue; + } + } + else if (aKeyEvent.iCode == EKeyLeftArrow || + aKeyEvent.iCode == EKeyRightArrow || + aKeyEvent.iCode == EKeyUpArrow || + aKeyEvent.iCode == EKeyDownArrow) + { + LoadCbaL(); + keyConsumed = ETrue; + } + + if ( aKeyEvent.iCode == EKeyEnter ) + { + TryExitL(EAknSoftkeyOk); + keyConsumed = ETrue; + } + else if (aKeyEvent.iCode == EKeyEscape) + { + TryExitL(EAknSoftkeyBack); + keyConsumed = ETrue; + } + } + } + + if ( keyConsumed ) + { + return EKeyWasConsumed; + } + + return CEikDialog::OfferKeyEventL(aKeyEvent, aType); + } + +// --------------------------------------------------------- +// CSpdiaContainer::HandleDatabaseEventL +// Handles an database event of type aEventType. +// --------------------------------------------------------- +// +void CSpdiaGridDlg::HandleDatabaseEventL( + TContactDbObserverEvent aEvent) + { + switch(aEvent.iType) + { + case EContactDbObserverEventContactChanged: + case EContactDbObserverEventContactDeleted: + case EContactDbObserverEventContactAdded: + break; + case EContactDbObserverEventSpeedDialsChanged: + iNeedUpdate = ETrue; + break; + default: + break; + } + } + +// --------------------------------------------------------- +// CSpdiaGridDlg::FocusChanged() +// Changes focus. +// --------------------------------------------------------- +// +void CSpdiaGridDlg::FocusChanged(TDrawNow aDrawNow) + { + if (IsFocused() && aDrawNow == EDrawNow && iNeedUpdate) + { + TRAP_IGNORE(iControl->CreateDataL(*iGrid)); + iNeedUpdate = EFalse; + } + } + +// --------------------------------------------------------- +// CSpdiaGridDlg::LoadCbaL() +// Loads CBA buttons. +// --------------------------------------------------------- +// +void CSpdiaGridDlg::LoadCbaL() + { + TInt id(R_AVKON_SOFTKEYS_BACK); + + TInt vmbxSupport = 0; + CRepository* vmbxSupported = CRepository::NewL( KCRUidVideoMailbox ); + vmbxSupported->Get( KVideoMbxSupport, vmbxSupport ); + delete vmbxSupported; + + TInt vmbxPos; + CRepository* vmbxKey2 = CRepository::NewL( KCRUidTelVideoMailbox ); + vmbxKey2->Get( KTelVideoMbxKey, vmbxPos ); + TInt vdoIndex( iControl->Index( vmbxPos ) ); + delete vmbxKey2; + + if ( iGrid->CurrentDataIndex() != iControl->VMBoxPosition() && + ( !vmbxSupport || iGrid->CurrentDataIndex() != vdoIndex ) ) + { + id = R_SPDCTRL_SOFTKEYS_ASSIGN_BACK_ASSIGN; + } + if (id != iCbaID) + { + iCbaID = id; + ButtonGroupContainer().SetCommandSetL(id); + ButtonGroupContainer().DrawNow(); + } + iPrevIndex = iGrid->CurrentDataIndex(); + } + +// --------------------------------------------------------- +// CSpdiaGridDlg::HandleResourceChange() +// Handle layout and skin change event. +// --------------------------------------------------------- +// +void CSpdiaGridDlg::HandleResourceChange( TInt aType ) + { + TRect mainPaneRect ; + TRect statusPaneRect; + + if ( aType == KEikDynamicLayoutVariantSwitch ) + { + CEikStatusPane* StatusPane = + ( ( CAknAppUi* ) CEikonEnv::Static()->EikAppUi() )->StatusPane(); + + if ( Layout_Meta_Data::IsLandscapeOrientation() ) + { + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane,mainPaneRect ); + StatusPane->DrawNow(); + } + else + { + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect ); + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane, statusPaneRect ); + mainPaneRect.iTl = statusPaneRect.iTl; + } + SetRect( mainPaneRect ); + DrawNow(); + } + else if ( aType == KAknsMessageSkinChange ) + { + TRAP_IGNORE( iControl->CreateGridDataL( iGrid, KNullIndexData ) ); + CAknDialog::HandleResourceChange( aType ); + } + else + { + CAknDialog::HandleResourceChange( aType ); + } + } + +// --------------------------------------------------------- +// CSpdiaGridDlg::HandlePointerEventL() +// Handle the pointer events on the dialog page, instead of HandleDialogPageEventL. +// Because HandleDialogPageEventL() can not handle the different pointer events. +// Only when the index button down is the same with the index button up, assign is right action. +// --------------------------------------------------------- +// +void CSpdiaGridDlg::HandlePointerEventL( const TPointerEvent& aPointerEvent ) + { + iGrid->HandlePointerEventL( aPointerEvent ); + if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + iGrid->View()->XYPosToItemIndex( aPointerEvent.iPosition, iButton1DownIndex ); + } + else if ( aPointerEvent.iType == TPointerEvent::EButton1Up ) + { + TInt button1UpIndex = -1; + iGrid->View()->XYPosToItemIndex( aPointerEvent.iPosition, button1UpIndex ); + if( iButton1DownIndex == button1UpIndex ) + { + TryExitL( EAknSoftkeyOk ); + } + } + } +// End of File