--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbplugins/inputmethods/touchinput/hbinputprediction12keythaihandler.cpp Mon May 03 12:48:33 2010 +0300
@@ -0,0 +1,215 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (developer.feedback@nokia.com)
+**
+** This file is part of the HbPlugins module of the UI Extensions for Mobile.
+**
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at developer.feedback@nokia.com.
+**
+****************************************************************************/
+#include <QTimer>
+
+#include <hbinputsettingproxy.h>
+#include <hbinputkeymapfactory.h>
+#include <hbinputpredictionengine.h>
+
+#include "virtual12key.h"
+
+#include "hbinputprediction12keyhandler_p.h"
+#include "hbinputprediction12keythaihandler.h"
+
+class HbInputPrediction12KeyThaiHandlerPrivate: public HbInputPrediction12KeyHandlerPrivate
+{
+ Q_DECLARE_PUBLIC(HbInputPrediction12KeyThaiHandler)
+
+public:
+ HbInputPrediction12KeyThaiHandlerPrivate();
+ ~HbInputPrediction12KeyThaiHandlerPrivate();
+
+ bool buttonReleased(const QKeyEvent *keyEvent);
+ bool buttonPressed(const QKeyEvent *keyEvent);
+ void _q_timeout();
+};
+
+HbInputPrediction12KeyThaiHandlerPrivate::HbInputPrediction12KeyThaiHandlerPrivate()
+{
+}
+
+HbInputPrediction12KeyThaiHandlerPrivate::~HbInputPrediction12KeyThaiHandlerPrivate()
+{
+
+}
+
+void HbInputPrediction12KeyThaiHandlerPrivate::_q_timeout()
+{
+ Q_Q(HbInputPrediction12KeyHandler);
+ // let's stop the timer first.
+ mTimer->stop();
+
+ if (mButtonDown) {
+ if(mLastKey == Qt::Key_0){
+ q->actionHandler(HbInputModeHandler::HbInputModeActionCommit);
+ q->commitFirstMappedNumber(mLastKey);
+ } else if(mLastKey != Qt::Key_Asterisk) {
+ //Long key press number key is applicable to all keys so pass it to Base class
+ HbInputPrediction12KeyHandlerPrivate::_q_timeout();
+ }
+ }
+}
+
+bool HbInputPrediction12KeyThaiHandlerPrivate::buttonPressed(const QKeyEvent *keyEvent)
+{
+ mLongPressHappened = false;
+ HbInputFocusObject *focusObject = 0;
+ focusObject = mInputMethod->focusObject();
+ if (!focusObject) {
+ return false;
+ }
+
+ int buttonId = keyEvent->key();
+
+ //Pass the event to base class except Shift key
+ if (buttonId == Qt::Key_Shift ) {
+ mLastKey = buttonId;
+ mButtonDown = true;
+ } else {
+ HbInputPrediction12KeyHandlerPrivate::buttonPressed(keyEvent);
+ }
+ // custom button should not start timer.
+ if ((buttonId & CUSTOM_INPUT_MASK) != CUSTOM_INPUT_MASK) {
+ mTimer->start(HbLongPressTimerTimeout);
+ }
+ return false;
+}
+
+/*!
+Handles the key release events from the VKB. Launches the SCT with key release event of
+asterisk.
+*/
+bool HbInputPrediction12KeyThaiHandlerPrivate::buttonReleased(const QKeyEvent *keyEvent)
+{
+ Q_Q(HbInputPrediction12KeyHandler);
+
+ if(!mButtonDown || mLongPressHappened){
+ return false;
+ }
+
+ int buttonId = keyEvent->key();
+ // it was a long press on sct swith button. so just return form here.
+ if (!mTimer->isActive() && buttonId == Qt::Key_Control) {
+ return true;
+ }
+
+ if (buttonId == Qt::Key_Asterisk && !mInputMethod->isSctModeActive()) {
+ //Handle if key Asterisk pressed and SCT is not launched or else pass it to base handlers
+ if (q->HbInputPredictionHandler::filterEvent(keyEvent)) {
+ mButtonDown = false;
+ return true;
+ }
+ } else if ( buttonId == Qt::Key_Shift ) {
+ //As we can't map charatcers to Shift key in keymapping, making use of "#" key i.e. Qt::Key_NumberSign
+ //in keymapping and manipulating event to Qt::Key_NumberSign when shift key is pressed
+ const QKeyEvent *event = new QKeyEvent(QEvent::KeyPress, Qt::Key_NumberSign, Qt::NoModifier);
+ if (q->HbInputPredictionHandler::filterEvent(event)) {
+ mButtonDown = false;
+ return true;
+ }
+ } else {
+ HbInputPrediction12KeyHandlerPrivate::buttonReleased(keyEvent);
+ }
+ return false;
+}
+
+
+HbInputPrediction12KeyThaiHandler::HbInputPrediction12KeyThaiHandler(HbInputAbstractMethod *inputMethod)
+ :HbInputPrediction12KeyHandler(* new HbInputPrediction12KeyThaiHandlerPrivate, inputMethod)
+{
+ Q_D(HbInputPrediction12KeyThaiHandler);
+ d->q_ptr = this;
+}
+
+HbInputPrediction12KeyThaiHandler::~HbInputPrediction12KeyThaiHandler()
+{
+}
+/*!
+ filterEvent to handler keypress/release events.
+*/
+
+bool HbInputPrediction12KeyThaiHandler::filterEvent(const QKeyEvent * event)
+{
+ Q_D(HbInputPrediction12KeyThaiHandler);
+ HbInputFocusObject *focusObject = 0;
+ focusObject = d->mInputMethod->focusObject();
+
+ //If there was a handling for empty candidate-list, i.e. the engine did not predict
+ //any meaningful word for the input sequence.
+
+ if(!d->mCanContinuePrediction) {
+ int eventKey = event->key();
+ //let's us return If engine did not predict any meaningful word for the input sequence
+ //for Shift,Asterisk and Control
+ if(eventKey == Qt::Key_Control || eventKey == Qt::Key_0) {
+ if(d->mCandidates->size() && focusObject ) {
+ //Remove the "?" mark
+ (*d->mCandidates)[d->mBestGuessLocation].chop(1);
+ d->updateEditor();
+ d->mCanContinuePrediction = true;
+ }
+ } else if (eventKey != Qt::Key_Shift && eventKey != Qt::Key_Asterisk){
+ // For Shift key and Asterisk key Will handle it in button release Since we have character mapped to Shift and Asterisk
+ // or else pass it to Prediction12KeyHandler handler
+ HbInputPrediction12KeyHandler::filterEvent(event);
+ }
+ }
+
+ // If the word is in inline edit First tap of Qt::Key_0 should commit the word in the editor
+ // For successive tap prediction mode can't handle Qt::Key_0, so we will emit a passFilterEvent
+ // this signal must be connected to by the plugin to a modehandler.
+ // which can handle it.
+
+ if (event->key() == Qt::Key_0 && d->mEngine->inputLength() >= 1 ) {
+ if(event->type() == QEvent::KeyPress) {
+ d->mButtonDown = true;
+ // start Long Press timer as zero key should be allowed to enter
+ d->mTimer->start(HbLongPressTimerTimeout);
+ } else if(event->type() == QEvent::KeyRelease) {
+ d->mTimer->stop();
+ d->mButtonDown = false;
+ actionHandler(HbInputModeHandler::HbInputModeActionCommit);
+ }
+ d->mLastKey = Qt::Key_0;
+ return true;
+ } else if (event->key() == Qt::Key_0) {
+ emit passFilterEvent(event);
+ d->mLastKey = Qt::Key_0;
+ return true;
+ } else {
+ if (d->mLastKey == Qt::Key_0) {
+ emit passActionHandler(HbInputModeActionCommit);
+ }
+ if (event->type() == QEvent::KeyRelease) {
+ return d->buttonReleased(event);
+ } else {
+ return d->buttonPressed(event);
+ }
+ }
+}
+
+
+//EOF
+