diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/aknshortcuts.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/aknshortcuts.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,409 @@ +/* +* 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: +* +*/ + + +#include "aknshortcuts.h" + +#include +#include +#include +#include +#include +#include + +// The following are needed for template instantiations. aknlists.h +// tells the compiler which shortcuttemplates to instantiate. +#include +#include + + +// +// Shortcut behavior. +// + +EXPORT_C void AknListBoxShortCuts::RunL() + { + TShortcutEvent event = EIdle; + EndTimer(); + ChangeStateL(event); + DoProcedureL(); + } + +EXPORT_C void AknListBoxShortCuts::ConstructL() + { + CTimer::ConstructL(); + CActiveScheduler::Add(this); + DoProcedureL(); + } + +EXPORT_C AknListBoxShortCuts::AknListBoxShortCuts() + : CTimer(EActivePriorityClockTimer), + iCurrentTimerType(ENoTimeout), + iState(EState1), + iIdleNextState(EStateNone), + iNaviKeyNextState(EStateNone), + iNumKeyNextState(EStateNone), + iLocked(EFalse) + { } + +EXPORT_C TBool AknListBoxShortCuts::RecursionLock() + { + if (iLocked) return EFalse; + iLocked = ETrue; + return ETrue; + } + +EXPORT_C void AknListBoxShortCuts::RecursionUnlock() + { + iLocked = EFalse; + } + +// EndTimer() call must be in most derived class too -- we do not want timer events after destruction +// of most derived class. +EXPORT_C AknListBoxShortCuts::~AknListBoxShortCuts() { EndTimer(); } + +EXPORT_C TKeyResponse AknListBoxShortCuts::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode /*aType*/) + { + TShortcutEvent event=ENone; + switch (aKeyEvent.iCode) + { + case EKeyDownArrow: + case EKeyUpArrow: + event = ENavi; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '*': + case '#': + event = ENumber; + break; + }; + + if (event == ENone) return EKeyWasNotConsumed; + ChangeStateL(event); + DoProcedureL(); + return EKeyWasConsumed; + } + + + +EXPORT_C void AknListBoxShortCuts::ChangeStateL(TShortcutEvent aEvent) + { + switch(aEvent) + { + case EIdle: + iState = iIdleNextState; + break; + case ENavi: + iState = iNaviKeyNextState; + break; + case ENumber: + iState = iNumKeyNextState; + break; + case EStateToOne: + EndTimer(); + iState=EState1; + iIdleNextState=EStateNone; + iNaviKeyNextState=EStateNone; + iNumKeyNextState=EStateNone; + DoProcedureL(); + break; + case EStateToFive: + iState = EState5; + break; + default: + break; + }; + } + +EXPORT_C void AknListBoxShortCuts::EndTimer() + { + if (iCurrentTimerType == ENoTimeout) return; + + switch(iCurrentTimerType) + { + case EShortcutActiveTimeout: + TRAP_IGNORE( + DoActionL(EEnableSoftkeys) + ); + break; + default: + break; + }; + Cancel(); + iCurrentTimerType = ENoTimeout; + } +EXPORT_C void AknListBoxShortCuts::StartTimerL(TShortcutTimerType aTimer) + { + TInt timeout = 0; + EndTimer(); + iCurrentTimerType = aTimer; + + switch(iCurrentTimerType) + { + case ENoUserActionTimeout: + timeout = 20; + break; + case EIndexDisplayTimeout: + timeout = 30; + break; + case EShortcutActiveTimeout: + // Softkeys are disabled during shortcutactivetimeout. + DoActionL(EDisableSoftkeys); + timeout = 20; + break; + default: + break; + }; + After(timeout); + } + +EXPORT_C void AknListBoxShortCuts::DoProcedureL() + { + switch (iState) + { + case EState1: + DoActionL(EBeginning); + StartTimerL(ENoUserActionTimeout); + iIdleNextState = EState2; + iNaviKeyNextState = EState3; + iNumKeyNextState = EState4; + break; + case EState2: // No action during ENoUserActionTimeout + DoActionL(EAssertNotFetched); + DoActionL(EShowShortcutNumber); + StartTimerL(EIndexDisplayTimeout); + iIdleNextState = EState2HideOnly; + iNaviKeyNextState = EState2HideAndGoState3; + iNumKeyNextState = EState2HideAndGoState4; + break; + case EState2HideOnly: + DoActionL(EAssertNotFetched); + DoActionL(EHideShortcutNumber); + break; + case EState2HideAndGoState3: + DoActionL(EHideShortcutNumber); + // FALL THROUGH + case EState3: // Navigation keys + DoActionL(EAssertNotFetched); + DoActionL(EStoreFocusedItemPos); + DoActionL(EForwardKeyEventToListBox); + if (DoTest(ENewItemFocused)) + { + // We're at state 1 again. + StartTimerL(ENoUserActionTimeout); + iIdleNextState = EState2; + iNaviKeyNextState = EState3; + iNumKeyNextState = EState4; + } + break; + case EState2HideAndGoState4: + DoActionL(EHideShortcutNumber); + // FALL THROUGH + case EState4: // Numeric keys + DoActionL(EAssertNotFetched); + DoActionL(EAddKeyAsShortcutDigitAndMoveFocus); + if (DoTest(ECheckForValidIndexNumber)) + { + StartTimerL(EShortcutActiveTimeout); + iIdleNextState = EState5; + iNumKeyNextState = EState6; + iNaviKeyNextState = EState3; + } + break; + case EState5: // After EshortcutActiveTimeout, user did nothing + DoActionL(ESelectListBoxItem); + ChangeStateL(EStateToOne); + break; + case EState6: // pressed 0-9 during shortcutactivetimeout + DoActionL(EAddKeyAsShortcutDigitAndMoveFocus); + if (DoTest(ECheckForValidIndexNumber)) + { + StartTimerL(EShortcutActiveTimeout); + iIdleNextState = EState5; + iNumKeyNextState = EState6; + iNaviKeyNextState = EState3; + } else { + DoActionL(ERemoveKeyDigitFromIndexNumber); + DoActionL(EPassDigitToNextList); + DoActionL(ESelectListBoxItem); + ChangeStateL(EStateToOne); + + } + break; + default: + break; + }; + } + + + +EXPORT_C TInt AknListBoxShortCutsImplementation::ShortcutValueForNextList() + { + if (iStillNeedToFetchShortcutValue == EFalse) + return 0; + iStillNeedToFetchShortcutValue = EFalse; + return iEvent.iCode; + } + +/* valid values for aValue are 0 and '0' <= aValue <= '9'. Application does not need to know + this - they just pass the interger from one list to another. */ +EXPORT_C void AknListBoxShortCutsImplementation::SetShortcutValueFromPrevList(TInt /*aValue*/) + { +#if 0 + if (aValue == 0) return; + + __ASSERT_DEBUG(aValue>=int('0') && aValue<=int('9'), Panic(EAknPanicListboxShortcutInvalidValue)); + iEvent.iCode = aValue; + TRAP_IGNORE( ChangeStateL(ENumber) ); // THIS MAY LEAVE + TRAP_IGNORE( DoProcedureL() ); // THIS MAY LEAVE +#endif + } + + +EXPORT_C TBool AknListBoxShortCutsImplementation::DoTest(TConcreteQuery q) + { + TInt focuspos; + switch(q) + { + case ENewItemFocused: + focuspos = iListBox->CurrentItemIndex(); + if (iFocusItemPos == focuspos) return EFalse; + return ETrue; + + case ECheckForValidIndexNumber: + return iListBox->LastCharMatched(); + + default: + break; + }; + return TRUE; + } + +EXPORT_C AknListBoxShortCutsImplementation::AknListBoxShortCutsImplementation(CEikListBox* aListBox) +: iListBox(aListBox) + { + iStillNeedToFetchShortcutValue = EFalse; + } + +EXPORT_C AknListBoxShortCutsImplementation::~AknListBoxShortCutsImplementation() + { + EndTimer(); // This must be in most derived class too. + delete iCba; + } + +EXPORT_C void AknListBoxShortCutsImplementation::ConstructL() + { + AknListBoxShortCuts::ConstructL(); + iListBox->CreateMatchBufferL(); + } + +EXPORT_C void AknListBoxShortCutsImplementation::DoActionL(TConcreteShortcutActions a) + { + if (iListBox->Model()->NumberOfItems() == 0) + return; + + TInt code = iEvent.iCode; + switch(a) + { + case EStoreFocusedItemPos: + // this is for use of ENewItemFocused + iFocusItemPos = iListBox->CurrentItemIndex(); + break; + case EBeginning: + iListBox->ClearMatchBuffer(); + break; + case EAddKeyAsShortcutDigitAndMoveFocus: + iListBox->ClearMatchBuffer(); + iListBox->MatchTypedCharL(code); + break; + case ERemoveKeyDigitFromIndexNumber: + break; + case EShowShortcutNumber: + break; + case EHideShortcutNumber: + break; + case EForwardKeyEventToListBox: + iListBox->OfferKeyEventL(iEvent, iEventCode); + break; + case ESelectListBoxItem: + iListBox->ReportListBoxEventL(MEikListBoxObserver::EEventEnterKeyPressed); + break; + case EPassDigitToNextList: + break; + case EDisableSoftkeys: + // uses MEikCommandObserver (it should not do anything) +#if 0 + iCba = iAvkonAppUi->Cba(); + iCba->AddCommandL(0, EAknSoftkeyDummyUsedWithShortcuts, _L(" ")); + iCba->AddCommandL(1, EAknSoftkeyDummyUsedWithShortcuts, _L(" ")); +#endif +#if NOT_NEEDED_ANYMORE + if (iCba) + { + delete iCba; + iCba = NULL; + } + iCba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba, CEikButtonGroupContainer::EHorizontal, this, R_AVKON_SOFTKEYS_EMPTY, *iListBox); + iCba->SetBoundingRect(TRect(TPoint(0,0),CEikonEnv::Static()->ScreenDevice()->SizeInPixels())); + iCba->MinimumSize(); + iCba->MakeVisible(ETrue); + iListBox->UpdateScrollBarsL(); +#endif + break; + case EEnableSoftkeys: +#if 0 + iCba = iAvkonAppUi->Cba(); + iCba->RemoveCommandFromStack(0, EAknSoftkeyDummyUsedWithShortcuts); + iCba->RemoveCommandFromStack(1, EAknSoftkeyDummyUsedWithShortcuts); +#endif + +#if NOT_NEEDED_ANYMORE + iCba->MakeVisible(EFalse); + delete iCba; + iCba = 0; + iListBox->UpdateScrollBarsL(); +#endif + break; + case EAssertNotFetched: + break; + default: + break; + }; + } + + +EXPORT_C void AknListBoxShortCutsImplementation::ProcessCommandL(TInt) + { + } + +EXPORT_C TKeyResponse AknListBoxShortCutsImplementation::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType) + { + iEvent = aKeyEvent; + iEventCode = aType; + return AknListBoxShortCuts::OfferKeyEventL(aKeyEvent, aType); + } + +// End of File