phonebookengines/contactsmodel/cntplsql/src/cqwertykeymap.cpp
changeset 46 efe85016a067
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/cntplsql/src/cqwertykeymap.cpp	Wed Jun 23 18:02:44 2010 +0300
@@ -0,0 +1,324 @@
+/*
+* Copyright (c) 2010 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: Retrieves the character map for each of the numeric keys.
+*/
+
+// INCLUDE FILES
+#include "cqwertykeymap.h"
+
+// This macro suppresses log writes
+//#define NO_PRED_SEARCH_LOGS
+#include "predictivesearchlog.h"
+
+#include <QChar>
+#include <QString>
+
+
+// Largest amount of keypresses that can be stored in QWERTY keyboard's
+// predictive search tables.
+// SQL BIGINT is a 64-bit signed integer and one bit is reserved for sign.
+// QWERTY's keys are identified by TKeyId that needs 6 bits.
+// 63 / 6 = 10
+const TInt KMaxKeysStoredInDb = 10;
+
+// How many bits are needed to represent TKeyId
+const TInt KBitsInKeyId = 6;
+
+
+const QChar KEY_Q_NAME = 'q';
+const QChar KEY_W_NAME = 'w';
+const QChar KEY_E_NAME = 'e';
+const QChar KEY_R_NAME = 'r';
+const QChar KEY_T_NAME = 't';
+const QChar KEY_Y_NAME = 'y';
+const QChar KEY_U_NAME = 'u';
+const QChar KEY_I_NAME = 'i';
+const QChar KEY_O_NAME = 'o';
+const QChar KEY_P_NAME = 'p';
+
+const QChar KEY_A_NAME = 'a';
+const QChar KEY_S_NAME = 's';
+const QChar KEY_D_NAME = 'd';
+const QChar KEY_F_NAME = 'f';
+const QChar KEY_G_NAME = 'g';
+const QChar KEY_H_NAME = 'h';
+const QChar KEY_J_NAME = 'j';
+const QChar KEY_K_NAME = 'k';
+const QChar KEY_L_NAME = 'l';
+
+const QChar KEY_Z_NAME = 'z';
+const QChar KEY_X_NAME = 'x';
+const QChar KEY_C_NAME = 'c';
+const QChar KEY_V_NAME = 'v';
+const QChar KEY_B_NAME = 'b';
+const QChar KEY_N_NAME = 'n';
+const QChar KEY_M_NAME = 'm';
+
+const QChar KEY_COLON_NAME = ',';
+const QChar KEY_DOT_NAME   = '.';
+const QChar KEY_DASH_NAME  = '-';
+const QChar KEY_AT_NAME	   = '@';
+const QChar KEY_QUOTE_NAME = '\'';
+const QChar KEY_QUESTION_MARK_NAME = '?';
+
+const QChar KEY_32_NAME = '1';
+const QChar KEY_33_NAME = '2';
+const QChar KEY_34_NAME = '3';
+const QChar KEY_35_NAME = '4';
+const QChar KEY_36_NAME = '5';
+const QChar KEY_37_NAME = '6';
+const QChar KEY_38_NAME = '7';
+const QChar KEY_39_NAME = '8';
+const QChar KEY_40_NAME = '9';
+const QChar KEY_41_NAME = '0';
+const QChar KEY_42_NAME = '+';
+const QChar KEY_43_NAME = '#';
+
+// Unmapped (unknown) characters are replaced with this
+const QChar PAD_CHAR = '!';
+
+// Must be the first key (EKeyQ) that has internal value 0
+const QChar KLowerLimitPadding = KEY_Q_NAME;
+const QChar KUpperLimitPadding = PAD_CHAR;
+
+
+// ============================== MEMBER FUNCTIONS ============================
+
+// ----------------------------------------------------------------------------
+// CQwertyKeyMap::NewL
+// ----------------------------------------------------------------------------
+CQwertyKeyMap* CQwertyKeyMap::NewL()
+	{
+    PRINT(_L("Enter CQwertyKeyMap::NewL"));
+    
+    CQwertyKeyMap* self = new (ELeave) CQwertyKeyMap();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    PRINT(_L("End CQwertyKeyMap::NewL"));
+    return self;
+	}
+
+// ----------------------------------------------------------------------------
+// CQwertyKeyMap::~CQwertyKeyMap
+// ----------------------------------------------------------------------------
+CQwertyKeyMap::~CQwertyKeyMap()
+    {
+    PRINT(_L("Enter CQwertyKeyMap::~CQwertyKeyMap"));    
+    PRINT(_L("End CQwertyKeyMap::~CQwertyKeyMap"));
+    }
+
+// ----------------------------------------------------------------------------
+// CQwertyKeyMap::ArrayIndexToMappedChar
+// Map index of iKeyMapping list, to the key that the mapping is for.
+// Space is already handled in CPcsKeyMap::GetMappedString(), no need to handle
+// it here.
+// ----------------------------------------------------------------------------
+const QChar CQwertyKeyMap::ArrayIndexToMappedChar(TInt aArrayIndex) const
+	{
+	__ASSERT_DEBUG(aArrayIndex < EAmountOfKeysInQwertyKeypad,
+				   User::Panic(_L("CQwertyKeyMap::ArrayIndexToMappedChar"),
+				   KErrOverflow));
+	return iKeyNames.value(static_cast<TKeyId>(aArrayIndex), PAD_CHAR);
+	}
+
+#if !defined(USE_ORBIT_KEYMAP)
+// ----------------------------------------------------------------------------
+// CQwertyKeyMap::UseHardcodedKeyMap
+// ----------------------------------------------------------------------------
+const QChar CQwertyKeyMap::UseHardcodedKeyMap(const QChar input) const
+    {
+    if (input >= 'a' && input <= 'z')
+        {
+        return input;
+        }
+    if (input >= 'A' && input <= 'Z')
+        {
+        return input.toLower(); // Return lowercase letter
+        }
+    if (input == KEY_COLON_NAME ||
+        input == KEY_DOT_NAME ||
+        input == KEY_DASH_NAME ||
+        input == KEY_AT_NAME ||
+        input == KEY_QUOTE_NAME ||
+        input == KEY_QUESTION_MARK_NAME)
+        {
+        return input;
+        }
+
+        // TODO: add rest of the keys
+
+#if defined(THAI_KEYMAP)
+    // TODO: add Thai key map
+#endif
+
+    // Other (unknown) chars
+    return PAD_CHAR;
+    }
+#endif // #if !defined(USE_ORBIT_KEYMAP)
+
+// ----------------------------------------------------------------------------
+// CQwertyKeyMap::ComputeValue
+// ----------------------------------------------------------------------------
+TInt CQwertyKeyMap::ComputeValue(QString aString,
+								 TBool aUpperLimit,
+								 QString& aValue) const
+	{
+	QString padded;
+	if (aString.length() < KMaxKeysStoredInDb)
+		{
+		padded = aString.leftJustified(KMaxKeysStoredInDb,
+			aUpperLimit ? KUpperLimitPadding : KLowerLimitPadding);
+		}
+	else
+		{
+		padded = aString;
+		}	
+
+#if defined(WRITE_PRED_SEARCH_LOGS)
+	TBuf<KMaxKeysStoredInDb> log(padded.utf16());
+	PRINT1(_L("CQwertyKeyMap::ComputeValue string = '%S'"), &log);
+#endif
+
+	qint64 value(0);
+	for (TInt i = 0; i < KMaxKeysStoredInDb; ++i)
+		{
+        value <<= KBitsInKeyId;
+		value += MapKeyNameToValue(padded[i]);
+		PRINT1(_L("  value now 0x%lx"), value);
+		}
+
+	// In order to write queries using '>' and '<' instead of '>=' and '<=',
+	// expand the limit by one.
+	if (aUpperLimit)
+		{
+		++value;
+		}
+	else
+		{
+		--value;
+		}
+	PRINT2(_L("CQwertyKeyMap::ComputeValue result=0x%lx (%ld decimal)"), value, value);
+	aValue = QString::number(value); // Convert to decimal value
+	return KErrNone;
+	}
+
+#if defined(USE_ORBIT_KEYMAP)
+// ----------------------------------------------------------------------------
+// CQwertyKeyMap::MapKeyNameToValue
+// ----------------------------------------------------------------------------
+bool CQwertyKeyMap::IsValidChar(const QChar aChar) const
+	{
+	return iKeyValues.contains(aChar);
+	}
+#endif // #if defined(USE_ORBIT_KEYMAP)
+
+// ----------------------------------------------------------------------------
+// CQwertyKeyMap::MapKeyNameToValue
+// Does the reverse of ArrayIndexToMappedChar()
+// ----------------------------------------------------------------------------
+TInt CQwertyKeyMap::MapKeyNameToValue(const QChar aKeyName) const
+    {
+    return iKeyNames.key(aKeyName, KPadCharValue);
+    }
+
+// ----------------------------------------------------------------------------
+// CQwertyKeyMap::CQwertyKeyMap
+// Fill QList with empty strings
+// ----------------------------------------------------------------------------
+CQwertyKeyMap::CQwertyKeyMap() :
+	CPcsKeyMap(EAmountOfKeysInQwertyKeypad, PAD_CHAR, KMaxKeysStoredInDb)
+	{
+	}
+
+// ----------------------------------------------------------------------------
+// CQwertyKeyMap::ConstructL
+// ----------------------------------------------------------------------------
+void CQwertyKeyMap::ConstructL()
+	{
+	PRINT(_L("Enter CQwertyKeyMap::ConstructL"));
+
+	// CPcsKeyMap::ConstructLanguageMappings() uses ArrayIndexToMappedChar()
+	// that uses iKeyNames, so construct it first
+	TInt err(KErrNone);
+    QT_TRYCATCH_ERROR(err, ConstructKeyNameMap());
+    User::LeaveIfError(err);
+
+#if defined(USE_ORBIT_KEYMAP)
+	CPcsKeyMap::ConstructL(HbKeyboardVirtualQwerty);
+#else
+	CPcsKeyMap::ConstructL();
+#endif
+
+	PRINT(_L("End CQwertyKeyMap::ConstructL"));
+	}
+
+// ----------------------------------------------------------------------------
+// CQwertyKeyMap::ConstructKeyNameMap
+// ----------------------------------------------------------------------------
+void CQwertyKeyMap::ConstructKeyNameMap()
+	{
+	iKeyNames.insert(EKeyQ, KEY_Q_NAME);
+	iKeyNames.insert(EKeyW, KEY_W_NAME);
+	iKeyNames.insert(EKeyE, KEY_E_NAME);
+	iKeyNames.insert(EKeyR, KEY_R_NAME);
+	iKeyNames.insert(EKeyT, KEY_T_NAME);
+	iKeyNames.insert(EKeyY, KEY_Y_NAME);
+	iKeyNames.insert(EKeyU, KEY_U_NAME);
+	iKeyNames.insert(EKeyI, KEY_I_NAME);
+	iKeyNames.insert(EKeyO, KEY_O_NAME);
+	iKeyNames.insert(EKeyP, KEY_P_NAME);
+	iKeyNames.insert(EKeyA, KEY_A_NAME);
+	iKeyNames.insert(EKeyS, KEY_S_NAME);
+	iKeyNames.insert(EKeyD, KEY_D_NAME);
+	iKeyNames.insert(EKeyF, KEY_F_NAME);
+	iKeyNames.insert(EKeyG, KEY_G_NAME);
+	iKeyNames.insert(EKeyH, KEY_H_NAME);
+	iKeyNames.insert(EKeyJ, KEY_J_NAME);
+	iKeyNames.insert(EKeyK, KEY_K_NAME);
+	iKeyNames.insert(EKeyL, KEY_L_NAME);
+	iKeyNames.insert(EKeyZ, KEY_Z_NAME);
+	iKeyNames.insert(EKeyX, KEY_X_NAME);
+	iKeyNames.insert(EKeyC, KEY_C_NAME);
+	iKeyNames.insert(EKeyV, KEY_V_NAME);
+	iKeyNames.insert(EKeyB, KEY_B_NAME);
+	iKeyNames.insert(EKeyN, KEY_N_NAME);
+	iKeyNames.insert(EKeyM, KEY_M_NAME);
+	iKeyNames.insert(EKeyColon, KEY_COLON_NAME);
+	iKeyNames.insert(EKeyDot,   KEY_DOT_NAME);
+	iKeyNames.insert(EKeyDash,  KEY_DASH_NAME);
+	iKeyNames.insert(EKeyAt,	KEY_AT_NAME);
+	iKeyNames.insert(EKeyQuote, KEY_QUOTE_NAME);
+	iKeyNames.insert(EKeyQuestionMark, KEY_QUESTION_MARK_NAME);
+	iKeyNames.insert(EKey32, KEY_32_NAME);
+	iKeyNames.insert(EKey33, KEY_33_NAME);
+	iKeyNames.insert(EKey34, KEY_34_NAME);
+	iKeyNames.insert(EKey35, KEY_35_NAME);
+	iKeyNames.insert(EKey36, KEY_36_NAME);
+	iKeyNames.insert(EKey37, KEY_37_NAME);
+	iKeyNames.insert(EKey38, KEY_38_NAME);
+	iKeyNames.insert(EKey39, KEY_39_NAME);
+	iKeyNames.insert(EKey40, KEY_40_NAME);
+	iKeyNames.insert(EKey41, KEY_41_NAME);
+	iKeyNames.insert(EKey42, KEY_42_NAME);
+	iKeyNames.insert(EKey43, KEY_43_NAME);
+
+
+	// Since reverse lookup in QMap is slow, collect all values into iKeyValues
+	// list, that can be searched.
+	iKeyValues = iKeyNames.values();
+	}
+
+// End of file