uifw/AvKon/src/aknshortcuts.cpp
changeset 0 2f259fa3e83a
--- /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 <AknPanic.h>
+#include <avkon.rsg>
+#include <eikbtgpc.h>
+#include <eikenv.h>
+#include <aknappui.h>
+#include <avkon.hrh>
+
+// The following are needed for template instantiations. aknlists.h
+// tells the compiler which shortcuttemplates to instantiate.
+#include <AknGrid.h>
+#include <aknlists.h>
+
+
+//
+// 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