uifw/ganes/src/HgKeyUtils.cpp
changeset 0 2f259fa3e83a
--- /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 <ganes/HgScroller.h>
+#include <ganes/HgItem.h>
+
+#include <w32std.h>
+#include <eikbtgpc.h>
+#include <eikcba.h>
+#include <avkon.rsg>
+#include <avkon.hrh>
+#include <AknUtils.h>
+
+// -----------------------------------------------------------------------------
+// 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<CEikCba*>( 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