summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/inputmethod/qcoefepinputcontext_p.h1
-rw-r--r--src/gui/inputmethod/qcoefepinputcontext_s60.cpp108
2 files changed, 109 insertions, 0 deletions
diff --git a/src/gui/inputmethod/qcoefepinputcontext_p.h b/src/gui/inputmethod/qcoefepinputcontext_p.h
index 4b36da3..1b62a25 100644
--- a/src/gui/inputmethod/qcoefepinputcontext_p.h
+++ b/src/gui/inputmethod/qcoefepinputcontext_p.h
@@ -132,6 +132,7 @@ private:
void commitTemporaryPreeditString();
bool isWidgetVisible(QWidget *widget, int offset = 0);
bool isPartialKeyboardSupported();
+ bool vietCharConversion(const QEvent *event);
private Q_SLOTS:
void ensureInputCapabilitiesChanged();
diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
index 44a54a3..5ced556 100644
--- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
+++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
@@ -101,6 +101,49 @@
_LIT(KAvkonResourceFile, "z:\\resource\\avkon.rsc" );
+// Vietnamese tone tables
+const int VietToneMarks = 5;
+
+const QChar VietToneList[VietToneMarks] = {
+ 0x0301, 0x0300, 0x0309, 0x0303, 0x0323
+};
+
+const QChar VietVowelList[] = {
+ 0x0041, 0x0061, 0x0102, 0x0103, 0x00c2,
+ 0x00e2, 0x0045, 0x0065, 0x00ca, 0x00ea,
+ 0x0049, 0x0069, 0x004f, 0x006f, 0x00d4,
+ 0x00f4, 0x01a0, 0x01a1, 0x0055, 0x0075,
+ 0x01af, 0x01b0, 0x0059, 0x0079
+};
+
+const QChar VietToneMatrix[][VietToneMarks] = {
+ // Matrix for each vowel (row) after applying certain tone mark (column)
+ 0x00c1, 0x00c0, 0x1ea2, 0x00c3, 0x1ea0,
+ 0x00e1, 0x00e0, 0x1ea3, 0x00e3, 0x1ea1,
+ 0x1eae, 0x1eb0, 0x1eb2, 0x1eb4, 0x1eb6,
+ 0x1eaf, 0x1eb1, 0x1eb3, 0x1eb5, 0x1eb7,
+ 0x1ea4, 0x1ea6, 0x1ea8, 0x1eaa, 0x1eac,
+ 0x1ea5, 0x1ea7, 0x1ea9, 0x1eab, 0x1ead,
+ 0x00c9, 0x00c8, 0x1eba, 0x1ebc, 0x1eb8,
+ 0x00e9, 0x00e8, 0x1ebb, 0x1ebd, 0x1eb9,
+ 0x1ebe, 0x1ec0, 0x1ec2, 0x1ec4, 0x1ec6,
+ 0x1ebf, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ec7,
+ 0x00cd, 0x00cc, 0x1ec8, 0x0128, 0x1eca,
+ 0x00ed, 0x00ec, 0x1ec9, 0x0129, 0x1ecb,
+ 0x00d3, 0x00d2, 0x1ece, 0x00d5, 0x1ecc,
+ 0x00f3, 0x00f2, 0x1ecf, 0x00f5, 0x1ecd,
+ 0x1ed0, 0x1ed2, 0x1ed4, 0x1ed6, 0x1ed8,
+ 0x1ed1, 0x1ed3, 0x1ed5, 0x1ed7, 0x1ed9,
+ 0x1eda, 0x1edc, 0x1ede, 0x1ee0, 0x1ee2,
+ 0x1edb, 0x1edd, 0x1edf, 0x1ee1, 0x1ee3,
+ 0x00da, 0x00d9, 0x1ee6, 0x0168, 0x1ee4,
+ 0x00fa, 0x00f9, 0x1ee7, 0x0169, 0x1ee5,
+ 0x1ee8, 0x1eea, 0x1eec, 0x1eee, 0x1ef0,
+ 0x1ee9, 0x1eeb, 0x1eed, 0x1eef, 0x1ef1,
+ 0x00dd, 0x1ef2, 0x1ef6, 0x1ef8, 0x1ef4,
+ 0x00fd, 0x1ef3, 0x1ef7, 0x1ef9, 0x1ef5
+};
+
QT_BEGIN_NAMESPACE
static QWidget* getFocusedChild(const QList<QObject*>& objectList)
@@ -572,11 +615,76 @@ bool QCoeFepInputContext::needsInputPanel()
}
}
+bool QCoeFepInputContext::vietCharConversion(const QEvent *event)
+{
+ const QKeyEvent *keyEvent = static_cast<const QKeyEvent *>(event);
+ const uint VietVowelListCount = sizeof(VietVowelList)/sizeof(VietVowelList[0]);
+ for (int tone = 0; tone < VietToneMarks; tone++) {
+ if (keyEvent->key() == VietToneList[tone]) {
+ // Vietnamese vowel tone mark pressed, check previous character
+ const int cursor = focusWidget()->inputMethodQuery(Qt::ImCursorPosition).toInt();
+ if (cursor > 0) {
+ QString widgetText = focusWidget()->inputMethodQuery(Qt::ImSurroundingText).toString();
+ for (int vowel = 0; vowel < VietVowelListCount; vowel++) {
+ if (widgetText[cursor-1].unicode() == VietVowelList[vowel]) {
+ // Previous character is Vietnamese vowel, replace it from matrix
+ QList<QInputMethodEvent::Attribute> attributes;
+ if (event->type() == QEvent::KeyPress) {
+ QInputMethodEvent imEvent(QString(VietToneMatrix[vowel][tone]), attributes);
+ sendEvent(imEvent);
+ } else {
+ // event->type() == QEvent::KeyRelease
+ QInputMethodEvent imEvent(QLatin1String(""), attributes);
+ imEvent.setCommitString(QString(VietToneMatrix[vowel][tone]), -1, 1);
+ sendEvent(imEvent);
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ }
+ if (keyEvent->key() == Qt::Key_Backspace) {
+ // Backspace pressed, check previous character
+ const int cursor = focusWidget()->inputMethodQuery(Qt::ImCursorPosition).toInt();
+ if (cursor > 0) {
+ QString widgetText = focusWidget()->inputMethodQuery(Qt::ImSurroundingText).toString();
+ for (int vowel = 0; vowel < VietVowelListCount; vowel++) {
+ for (int tone = 0; tone < VietToneMarks; tone++) {
+ if (widgetText[cursor-1].unicode() == VietToneMatrix[vowel][tone]) {
+ // Previous character is Vietnamese vowel with tone, replace it with plain vowel
+ QList<QInputMethodEvent::Attribute> attributes;
+ if (event->type() == QEvent::KeyPress) {
+ QInputMethodEvent imEvent(QString(VietVowelList[vowel]), attributes);
+ sendEvent(imEvent);
+ } else {
+ // event->type() == QEvent::KeyRelease
+ QInputMethodEvent imEvent(QLatin1String(""), attributes);
+ imEvent.setCommitString(QString(VietVowelList[vowel]), -1, 1);
+ sendEvent(imEvent);
+ }
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+}
+
bool QCoeFepInputContext::filterEvent(const QEvent *event)
{
if (!focusWidget())
return false;
+ if ((event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) &&
+ QApplication::keyboardInputLocale().language() == QLocale::Vietnamese) {
+ // Vietnamese character conversions
+ if (vietCharConversion(event))
+ return true;
+ }
+
switch (event->type()) {
case QEvent::KeyPress:
commitTemporaryPreeditString();