diff -r 000000000000 -r 2f259fa3e83a uifw/ganes/src/HgKeyUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/ganes/src/HgKeyUtils.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,288 @@ +/* +* Copyright (c) 2009 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 "HgKeyUtils.h" +#include "HgConstants.h" +#include +#include + +#include +#include +#include +#include +#include +#include + +// ----------------------------------------------------------------------------- +// CHgKeyUtils::NewL() +// ----------------------------------------------------------------------------- +// +CHgKeyUtils* CHgKeyUtils::NewL( CHgScroller& aScroller ) + { + CHgKeyUtils* self = new (ELeave) CHgKeyUtils( aScroller ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CHgKeyUtils::CHgKeyUtils() +// ----------------------------------------------------------------------------- +// +CHgKeyUtils::~CHgKeyUtils() + { + RemoveMSKObserver(); + // Stop listening CenRep. + if (iCenRepNotifyHandler) + { + iCenRepNotifyHandler->StopListening(); + } + delete iCenRepNotifyHandler; + delete iCenRep; + } + +// ----------------------------------------------------------------------------- +// CHgKeyUtils::HandleNotifyInt() +// ----------------------------------------------------------------------------- +// +void CHgKeyUtils::HandleNotifyInt(TUint32 aId, TInt aNewValue) + { + if (aId == KAknFepHashKeySelection) + { + iAknFepHashKeySelection = (TBool)aNewValue; + } + } + +// ----------------------------------------------------------------------------- +// CHgKeyUtils::CHgKeyUtils() +// ----------------------------------------------------------------------------- +// +CHgKeyUtils::CHgKeyUtils( CHgScroller& aScroller ): + iScroller( aScroller ) + { + + } + +// ----------------------------------------------------------------------------- +// CHgKeyUtils::ConstructL() +// ----------------------------------------------------------------------------- +// +void CHgKeyUtils::ConstructL() + { + iMskEnabledInPlatform = AknLayoutUtils::MSKEnabled(); + + // Start listening a CenRep key indicating whether hash key selection is active. + TRAPD(err, iCenRep = CRepository::NewL(KCRUidAknFep)); + if (err == KErrNone) + { + iCenRepNotifyHandler = CCenRepNotifyHandler::NewL(*this, + *iCenRep, + CCenRepNotifyHandler::EIntKey, + KAknFepHashKeySelection); + + iCenRepNotifyHandler->StartListeningL(); + iCenRep->Get(KAknFepHashKeySelection, iAknFepHashKeySelection); + } + } + +// ----------------------------------------------------------------------------- +// CHgKeyUtils::SelectionMode() +// ----------------------------------------------------------------------------- +// +TBool CHgKeyUtils::SelectionMode( const TKeyEvent& aKeyEvent ) + { + return (iAknFepHashKeySelection && aKeyEvent.iScanCode == EStdKeyHash) || + aKeyEvent.iScanCode == EStdKeyLeftShift || + aKeyEvent.iScanCode == EStdKeyRightShift || + aKeyEvent.iScanCode == EStdKeyLeftCtrl || + aKeyEvent.iScanCode == EStdKeyRightCtrl; + } + +// ----------------------------------------------------------------------------- +// CHgKeyUtils::ProcessCommandL() +// ----------------------------------------------------------------------------- +// +void CHgKeyUtils::ProcessCommandL(TInt aCommandId) + { + if( !iMskEnabledInPlatform ) + return; + + switch ( aCommandId ) + { + case EAknSoftkeyShiftMSK: + { + const TInt selectedIndex = iScroller.SelectedIndex(); + if ( selectedIndex != KErrNotFound ) + { + if( iScroller.ItemL( selectedIndex ).Flags() & CHgItem::EHgItemFlagMarked ) + { + iScroller.UnMark(selectedIndex); + iScroller.SetSelectionMode( CHgScroller::ESelectionUnMark ); + } + else + { + iScroller.Mark(selectedIndex); + iScroller.SetSelectionMode( CHgScroller::ESelectionMark ); + } + } + } + break; + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CHgKeyUtils::CreateMSKObserverL() +// ----------------------------------------------------------------------------- +// +void CHgKeyUtils::CreateMSKObserver() + { + if( !iMskEnabledInPlatform ) + return; + + RemoveMSKObserver(); + + UpdateMSKVars(); + + if( !iCba ) + return; + + iCba->SetMSKCommandObserver(this); + iMSKButtonGroupAlive = ETrue; + } + +// ----------------------------------------------------------------------------- +// CHgKeyUtils::RemoveMSKObserver() +// ----------------------------------------------------------------------------- +// +void CHgKeyUtils::RemoveMSKObserver() + { + if( !iMSKButtonGroupAlive || !iMskEnabledInPlatform ) + return; + + UpdateMSKVars(); + + if( !iCba ) + return; + + iCba->SetMSKCommandObserver(NULL); + iMSKButtonGroupAlive = EFalse; + } + +// ----------------------------------------------------------------------------- +// CHgKeyUtils::UpdateMSKVars() +// ----------------------------------------------------------------------------- +// +void CHgKeyUtils::UpdateMSKVars() + { + if( !iMskEnabledInPlatform ) + return; + + CEikButtonGroupContainer* bgc; + iCba = NULL; + + iScroller.MopGetObject( bgc ); + if ( bgc ) + { + iCba = ( static_cast( bgc->ButtonGroup() ) ); // downcast from MEikButtonGroup + } + } + +// ----------------------------------------------------------------------------- +// CHgKeyUtils::OfferKeyEventL() +// ----------------------------------------------------------------------------- +// +TKeyResponse CHgKeyUtils::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ) + { + TKeyResponse response = EKeyWasNotConsumed; + + // if we have markable list and either shift, ctrl or hash is long pressed + // down, we will enter selection (marking) mode, where MSK is Mark/Unmark + if( SelectionMode( aKeyEvent ) ) + { + if( aType == EEventKeyDown ) + { + iShiftKeyPressed = ETrue; + iScroller.SetSelectionMode( CHgScroller::ESelectionPossible ); + } + else if( aType == EEventKeyUp ) + { + iShiftKeyPressed = EFalse; + iScroller.SetSelectionMode( CHgScroller::ENoSelection ); + } + response = EKeyWasConsumed; + } + + const TInt selectedIndex = iScroller.SelectedIndex(); + if( iShiftKeyPressed + && aType == EEventKey + && selectedIndex != KErrNotFound + && iScroller.SelectionMode() == CHgScroller::ESelectionPossible ) + { + TBool itemMarked = iScroller.ItemL( selectedIndex ).Flags() & CHgItem::EHgItemFlagMarked; + if(itemMarked) + { + iScroller.SetSelectionMode( CHgScroller::ESelectionUnMark ); + } + else + { + iScroller.SetSelectionMode( CHgScroller::ESelectionMark ); + } + + if( ( iAknFepHashKeySelection && aKeyEvent.iScanCode == EStdKeyHash ) ) + { + if( itemMarked ) + { + iScroller.UnMark(selectedIndex); + } + else + { + iScroller.Mark(selectedIndex); + } + iScroller.RefreshScreen(selectedIndex); + } + + } + + return response; + } + +// ----------------------------------------------------------------------------- +// CHgKeyUtils::HandleLosingForeground() +// ----------------------------------------------------------------------------- +// +void CHgKeyUtils::HandleLosingFocus() + { + // switch off selection (marking) mode when we lose focus + iShiftKeyPressed = EFalse; + iSelectionModeEnabled = EFalse; + iScroller.SetSelectionMode( CHgScroller::ENoSelection ); + RemoveMSKObserver(); + } + +// ----------------------------------------------------------------------------- +// CHgKeyUtils::HandleGainingForeground() +// ----------------------------------------------------------------------------- +// +void CHgKeyUtils::HandleGainingFocus() + { + CreateMSKObserver(); + } + +// End of file