uifw/EikStd/coctlsrc/EIKHKEYT.CPP
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/EikStd/coctlsrc/EIKHKEYT.CPP	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,180 @@
+/*
+* Copyright (c) 1997-1999 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 <eikhkeyt.h>
+#include <eikpanic.h>
+#include <coemain.h>
+#include <barsread.h>
+
+EXPORT_C CEikHotKeyTable::CEikHotKeyTable()
+    : CArrayFixFlat<SEikHotKey> (4) // granularity of 4
+    {
+    }
+
+EXPORT_C CEikHotKeyTable::~CEikHotKeyTable()
+    {
+    }
+
+EXPORT_C TBool CEikHotKeyTable::HotKeyFromCommandId(TInt aCommandId,TInt& aKeycode,TInt& aModifiers) const
+    {
+    if (Count())
+        {
+        TInt i=0;
+        const SEikHotKey* hotKey=&(*this)[0];
+        while (i++<Count())
+            {
+            if (hotKey->iCommandId==aCommandId)
+                {
+                if (i<=iNumberPlain)
+                    {
+                    aKeycode=hotKey->iKeycode;
+                    aModifiers=0;
+                    }
+                else
+                    {
+                    aKeycode=hotKey->iKeycode-('a'-1);
+                    if (i>iNumberPlain+iNumberCtrl)
+                        aModifiers=EModifierShift|EModifierCtrl;
+                    else
+                        aModifiers=EModifierCtrl;
+                    }
+                return(ETrue);
+                }
+            hotKey++;
+            }
+        }
+    return(EFalse);
+    }
+
+EXPORT_C TInt CEikHotKeyTable::CommandIdFromHotKey(TInt aKeycode,TInt aModifiers) const
+    {
+	if (aModifiers&EModifierPureKeycode && aModifiers&EModifierCtrl)
+		return 0;
+    TInt start=0;
+    TInt count=0;
+    if (!aModifiers || aModifiers==EModifierShift)
+        count=iNumberPlain;
+    else
+        {
+        aKeycode+='a'-1;
+        if (aModifiers==EModifierCtrl)
+            {
+            start=iNumberPlain;
+            count=iNumberCtrl;
+            }
+        else if (aModifiers==(EModifierShift|EModifierCtrl))
+            {
+            start=iNumberPlain+iNumberCtrl;
+            count=iNumberShiftCtrl;
+            }
+        }
+    if (count && Count())
+        {
+        const SEikHotKey* hotKey=&(*this)[start];
+        while (count--)
+            {
+            if (hotKey->iKeycode==aKeycode)
+                return(hotKey->iCommandId);
+            hotKey++;
+            }
+        }
+    return(0);
+    }
+
+EXPORT_C void CEikHotKeyTable::AddItemL(TInt aCommandId,TInt aKeycode,TInt aModifiers)
+    {
+    TInt pos=0;
+    TInt* pNumber=&iNumberPlain;
+    switch (aModifiers)
+        {
+    case 0:
+        break;
+    case EModifierCtrl:
+        pos=iNumberPlain;
+        pNumber=&iNumberCtrl;
+        break;
+    case (EModifierShift|EModifierCtrl):
+        pos=iNumberPlain+iNumberCtrl;
+        pNumber=&iNumberShiftCtrl;
+        break;
+    default:
+        User::Leave(KErrNotSupported);
+        }
+    SEikHotKey hotKey;
+    hotKey.iCommandId=aCommandId;
+    hotKey.iKeycode=aKeycode;
+    InsertL(pos+*pNumber,hotKey);
+    (*pNumber)++; // after the InsertL succeeds
+    }
+
+EXPORT_C void CEikHotKeyTable::RemoveItem(TInt aCommandId)
+    {
+    TInt i=0;
+    FOREVER
+        {
+        if (i==Count())
+            Panic(EEikPanicNoHotKeyToRemove);
+        SEikHotKey& hotKey=(*this)[i];
+        if (hotKey.iCommandId==aCommandId)
+            {
+            if (i<iNumberPlain)
+                iNumberPlain--;
+            else if (i<iNumberPlain+iNumberCtrl)
+                iNumberCtrl--;
+            else
+                iNumberShiftCtrl--;
+            break;
+            }
+        i++;
+        }
+    Delete(i);
+    }
+
+EXPORT_C void CEikHotKeyTable::ConstructFromResourceL(TInt aResourceId)
+    {
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC(reader,aResourceId);
+    iNumberPlain=reader.ReadInt16();
+    if (iNumberPlain)
+        {
+	    const SEikHotKey* ptr=(const SEikHotKey*)reader.Ptr();
+	    reader.Advance(iNumberPlain*sizeof(SEikHotKey));
+	    AppendL(ptr,iNumberPlain);
+        }
+    iNumberCtrl=reader.ReadInt16();
+    if (iNumberCtrl)
+        {
+	    const SEikHotKey* ptr=(const SEikHotKey*)reader.Ptr();
+	    reader.Advance(iNumberCtrl*sizeof(SEikHotKey));
+	    AppendL(ptr,iNumberCtrl);
+        }
+    iNumberShiftCtrl=reader.ReadInt16();
+    if (iNumberShiftCtrl)
+        {
+	    const SEikHotKey* ptr=(const SEikHotKey*)reader.Ptr();
+	    reader.Advance(iNumberShiftCtrl*sizeof(SEikHotKey));
+	    AppendL(ptr,iNumberShiftCtrl);
+        }
+    CleanupStack::PopAndDestroy();
+    }
+
+EXPORT_C void CEikHotKeyTable::Reset()
+    {
+	iNumberPlain=iNumberCtrl=iNumberShiftCtrl=0;
+    CArrayFixFlat<SEikHotKey>::Reset();
+    }