--- /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();
+ }