diff -r f7ac710697a9 -r 06ff229162e9 src/hbplugins/inputmethods/touchinput/hbinputqwertynumerictouchkeyboard.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hbplugins/inputmethods/touchinput/hbinputqwertynumerictouchkeyboard.cpp Fri May 14 16:09:54 2010 +0300 @@ -0,0 +1,299 @@ +/**************************************************************************** +** +** 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 + +#include +#include +#include + +#include "hbinputqwertynumerictouchkeyboard.h" +#include "hbinputqwertynumerictouchkeyboard_p.h" +#include "hbinputvkbwidget_p.h" +#include "hbinputbuttongroup.h" +#include "hbinputbutton.h" +#include "hbinputmodeindicator.h" + +const qreal HbKeyboardHeightInUnits = 17.3; +const qreal HbKeyboardWidthInUnits = 95.5; + +const int HbVirtualQwertyNumberOfRows = 2; +const int HbVirtualQwertyNumberOfColumns = 10; +const int HbButtonKeyCodeTable[HbVirtualQwertyNumberOfRows * HbVirtualQwertyNumberOfColumns] = +{ + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeShift, + HbInputButton::ButtonKeyCodeSymbol, + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeCharacter, + HbInputButton::ButtonKeyCodeDelete, + HbInputButton::ButtonKeyCodeSettings, + HbInputButton::ButtonKeyCodeCustom +}; + +HbQwertyNumericKeyboardPrivate::HbQwertyNumericKeyboardPrivate() +{ +} + +HbQwertyNumericKeyboardPrivate::~HbQwertyNumericKeyboardPrivate() +{ +} + +void HbQwertyNumericKeyboardPrivate::init() +{ + Q_Q(HbQwertyNumericKeyboard); + + HbInputVkbWidgetPrivate::init(); + + HbInputButtonGroup *buttonGroup = static_cast(q->contentItem()); + if (buttonGroup) { + buttonGroup->setGridSize(QSize(HbVirtualQwertyNumberOfColumns, HbVirtualQwertyNumberOfRows)); + + QList buttons; + for (int i = 0; i < HbVirtualQwertyNumberOfColumns * HbVirtualQwertyNumberOfRows; ++i) { + HbInputButton *item = new HbInputButton(HbButtonKeyCodeTable[i], QPoint(i % HbVirtualQwertyNumberOfColumns, i / HbVirtualQwertyNumberOfColumns)); + buttons.append(item); + + if (HbButtonKeyCodeTable[i] == HbInputButton::ButtonKeyCodeSettings) { + mInputModeIndicator = new HbInputModeIndicator(item, q); + } else if (HbButtonKeyCodeTable[i] == HbInputButton::ButtonKeyCodeShift || + HbButtonKeyCodeTable[i] == HbInputButton::ButtonKeyCodeSymbol) { + item->setState(HbInputButton::ButtonStateDisabled); + } + } + buttonGroup->setButtons(buttons); + buttonGroup->setButtonPreviewEnabled(HbInputSettingProxy::instance()->isCharacterPreviewForQwertyEnabled()); + + QObject::connect(buttonGroup, SIGNAL(buttonPressed(const QKeyEvent&)), q, SLOT(sendKeyPressEvent(const QKeyEvent&))); + QObject::connect(buttonGroup, SIGNAL(buttonDoublePressed(const QKeyEvent&)), q, SLOT(sendKeyDoublePressEvent(const QKeyEvent&))); + QObject::connect(buttonGroup, SIGNAL(buttonReleased(const QKeyEvent&)), q, SLOT(sendKeyReleaseEvent(const QKeyEvent&))); + QObject::connect(buttonGroup, SIGNAL(buttonLongPressed(const QKeyEvent&)), q, SLOT(sendLongPressEvent(const QKeyEvent&))); + QObject::connect(buttonGroup, SIGNAL(pressedButtonChanged(const QKeyEvent&, const QKeyEvent&)), q, SLOT(sendKeyChangeEvent(const QKeyEvent&, const QKeyEvent&))); + } + QObject::connect(q, SIGNAL(flickEvent(HbInputVkbWidget::HbFlickDirection)), buttonGroup, SLOT(cancelButtonPress())); +} + +int HbQwertyNumericKeyboardPrivate::keyCode(int buttonId) +{ + return HbButtonKeyCodeTable[buttonId]; +} + +void HbQwertyNumericKeyboardPrivate::applyEditorConstraints() +{ + Q_Q(HbQwertyNumericKeyboard); + + HbInputFocusObject *focusedObject = mOwner->focusObject(); + if (!focusedObject) { + return; + } + + HbInputButtonGroup *buttonGroup = static_cast(q->contentItem()); + if (buttonGroup) { + QList buttons = buttonGroup->buttons(); + for (int i = 0; i < buttons.count(); ++i) { + if (keyCode(i) == HbInputButton::ButtonKeyCodeCharacter) { + HbInputButton *item = buttons.at(i); + + HbInputButton::HbInputButtonState state = item->state(); + QString data = item->text(HbInputButton::ButtonTextIndexPrimary); + if (data.isEmpty() || !focusedObject->characterAllowedInEditor(data.at(0))) { + state = HbInputButton::ButtonStateDisabled; + } else if (item->state() == HbInputButton::ButtonStateDisabled) { + state = HbInputButton::ButtonStateReleased; + } + item->setState(state); + } + } + buttonGroup->setButtons(buttons); + } +} + +void HbQwertyNumericKeyboardPrivate::updateKeyCodes() +{ + Q_Q(HbQwertyNumericKeyboard); + + QString characters; + getCharacters(characters); + + HbInputButtonGroup *buttonGroup = static_cast(q->contentItem()); + if (buttonGroup) { + int key = 0; + QList buttons = buttonGroup->buttons(); + for (int i = 0; i < buttons.count(); ++i) { + if (keyCode(i) == HbInputButton::ButtonKeyCodeCharacter) { + HbInputButton *item = buttons.at(i); + + if (key < characters.count()) { + item->setKeyCode(characters.at(key).unicode()); + } + ++key; + } + } + } +} + +void HbQwertyNumericKeyboardPrivate::updateButtons() +{ + Q_Q(HbQwertyNumericKeyboard); + + QString characters; + getCharacters(characters); + + HbInputButtonGroup *buttonGroup = static_cast(q->contentItem()); + if (buttonGroup) { + int key = 0; + QList buttons = buttonGroup->buttons(); + for (int i = 0; i < buttons.count(); ++i) { + if (keyCode(i) == HbInputButton::ButtonKeyCodeCharacter) { + HbInputButton *item = buttons.at(i); + + if (key < characters.count()) { + item->setText(characters.at(key), HbInputButton::ButtonTextIndexPrimary); + } else { + item->setText(QString(), HbInputButton::ButtonTextIndexPrimary); + } + ++key; + } + } + buttonGroup->setButtons(buttons); + } +} + +void HbQwertyNumericKeyboardPrivate::getCharacters(QString &characters) +{ + characters = QString("1234567890"); + + if (mKeymap) { + const HbKeyboardMap* keyboardMap = mKeymap->keyboard(HbKeyboardSctLandscape); + if (!keyboardMap) { + return; + } + + foreach (const HbMappedKey* mappedKey, keyboardMap->keys) { + QString chars = mappedKey->characters(HbModifierNone); + + HbInputFocusObject *focusedObject = mOwner->focusObject(); + QString allowedChars; + if (focusedObject) { + focusedObject->filterStringWithEditorFilter(chars, allowedChars); + } + + foreach (QChar sctChar, allowedChars) { + if (!characters.contains(sctChar)) { + characters.append(sctChar); + } + } + } + } +} + +/*! +Constructs the object. owner is the owning input method implementation. Keymap +is key mapping data to be used to display button texts. Key mapping data can be +changed later (for example when the input language changes) by calling +setKeymap. +*/ +HbQwertyNumericKeyboard::HbQwertyNumericKeyboard(HbInputMethod *owner, const HbKeymap *keymap, QGraphicsItem *parent) + : HbInputVkbWidget(*new HbQwertyNumericKeyboardPrivate, parent) +{ + Q_D(HbQwertyNumericKeyboard); + d->mOwner = owner; + setKeymap(keymap); + + QObject::connect(HbInputSettingProxy::instance(), SIGNAL(characterPreviewStateForQwertyChanged(bool)), this, SLOT(updateButtonPreviewStatus(bool))); +} + +/*! +Constructs the object. owner is the owning input method implementation. Keymap +is key mapping data to be used to display button texts. Key mapping data can be +changed later (for example when the input language changes) by calling +setKeymap. +*/ +HbQwertyNumericKeyboard::HbQwertyNumericKeyboard(HbQwertyNumericKeyboardPrivate &dd, HbInputMethod *owner, + const HbKeymap *keymap, QGraphicsItem* parent) + : HbInputVkbWidget(dd, parent) +{ + Q_D(HbQwertyNumericKeyboard); + d->mOwner = owner; + setKeymap(keymap); + + QObject::connect(HbInputSettingProxy::instance(), SIGNAL(characterPreviewStateForQwertyChanged(bool)), this, SLOT(updateButtonPreviewStatus(bool))); +} + +/*! +Destructs the object. +*/ +HbQwertyNumericKeyboard::~HbQwertyNumericKeyboard() +{ +} + +/*! +Returns keyboard type. +*/ +HbKeyboardType HbQwertyNumericKeyboard::keyboardType() const +{ + return HbKeyboardVirtualQwerty; +} + +/*! +Returns preferred keyboard size. HbVkbHost uses this information when it opens the keyboard. +*/ +QSizeF HbQwertyNumericKeyboard::preferredKeyboardSize() +{ + Q_D(HbQwertyNumericKeyboard); + + QSizeF result; + qreal unitValue = HbDeviceProfile::profile(mainWindow()).unitValue(); + + result.setHeight(HbKeyboardHeightInUnits * unitValue + d->mCloseHandleHeight); + result.setWidth(HbKeyboardWidthInUnits * unitValue); + + return QSizeF(result); +} + +/*! +Updates button preview status. +*/ +void HbQwertyNumericKeyboard::updateButtonPreviewStatus(bool status) +{ + HbInputButtonGroup *buttonGroup = static_cast(contentItem()); + if (buttonGroup) { + buttonGroup->setButtonPreviewEnabled(status); + } +} + +// End of file