src/hbinput/inputwidgets/hbinputexactwordpopup.cpp
changeset 0 16d8024aca5e
child 1 f7ac710697a9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbinput/inputwidgets/hbinputexactwordpopup.cpp	Mon Apr 19 14:02:13 2010 +0300
@@ -0,0 +1,275 @@
+/****************************************************************************
+**
+** 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 HbInput 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 <QGraphicsWidget>
+#include <QPointer>
+#include <QIcon>
+#include <QGraphicsSceneMouseEvent>
+#include <QGraphicsLinearLayout>
+#if QT_VERSION >= 0x040600
+#include <QGraphicsDropShadowEffect>
+#endif
+
+#include "hbdeviceprofile.h"
+#include "hbdialog.h"
+#include "hblabel.h"
+#include "hbstyleoptionlabel.h"
+#include "hbinputexactwordpopup.h"
+#include "hbiconitem.h"
+#include "hbinputsettingproxy.h"
+#include "hbframeitem.h"
+#include "hbframedrawer.h"
+#include "hbcolorscheme.h"
+#include "hbdialog_p.h"
+
+const QSizeF  HbExactWordPopupSize(10,10);
+const QPointF HbExactWordPopupStartupDisplay(12, 33);
+
+class HbExactWordPopupPrivate : public HbDialogPrivate
+{
+    Q_DECLARE_PUBLIC(HbExactWordPopup)
+
+public:
+    HbExactWordPopupPrivate();
+    ~HbExactWordPopupPrivate();
+
+    void initBackground();
+
+public:
+    HbLabel *mText;
+    HbStyleOptionLabel *mOption;
+    HbIconItem *iconPrim;
+    HbFrameItem *mPopupBackground;
+};
+
+HbExactWordPopupPrivate::HbExactWordPopupPrivate(){
+    mText = 0;
+    mOption = 0;
+    iconPrim = 0;
+}
+
+HbExactWordPopupPrivate::~HbExactWordPopupPrivate(){
+    delete mOption;
+    mOption = 0;
+}
+
+void HbExactWordPopupPrivate::initBackground()
+{
+    Q_Q(HbExactWordPopup);
+
+    mPopupBackground = static_cast<HbFrameItem*>(q->primitive( HbStyle::P_Popup_background));
+
+    if( mPopupBackground == 0 ) {
+        mPopupBackground = static_cast<HbFrameItem*>(q->style()->createPrimitive((HbStyle::Primitive)(HbStyle::P_Popup_background), q));
+    }
+
+    if ( mPopupBackground->frameDrawer().isNull()) {
+        HbFrameDrawer* fd = new HbFrameDrawer("qtg_fr_popup_secondary", HbFrameDrawer::NinePieces);
+        mPopupBackground->setFrameDrawer(fd);
+    }
+
+    // the size of the layout in the base class has been set to 0, reset it by passing an invalid size to setMinimumSize
+    if(mainLayout) {
+        mainLayout->setMinimumSize(-1, -1);
+    }
+
+}
+
+HbExactWordPopup* HbExactWordPopup::instance( HbExactWordPopupIndicator indicatorArrow ) {
+    static QPointer<HbExactWordPopup> exactWordPopup;
+    if (!exactWordPopup) {
+        // HbExactWordPopup is owned by the scene
+        exactWordPopup = new HbExactWordPopup( 0, indicatorArrow );
+    }
+    return exactWordPopup;
+}
+
+/*!
+    Constructor.
+    \param parent An optional parameter.
+*/
+HbExactWordPopup::HbExactWordPopup(QGraphicsWidget *parent, HbExactWordPopupIndicator indicatorArrow ) :
+    HbDialog(*new HbExactWordPopupPrivate(), parent)
+{
+    Q_D(HbExactWordPopup);
+    d->mText = new HbLabel(this);
+    d->mText->setAlignment(Qt::AlignCenter);
+
+    d->setPriority(HbPopupPrivate::VirtualKeyboard + 1);  // Should be shown on top of virtual keyboard.
+
+    d->initBackground();
+
+    setTimeout(HbPopup::NoTimeout);
+    setBackgroundFaded(false);
+    setVisible(false);
+    setDismissPolicy(HbPopup::TapInside);
+    setFocusPolicy(Qt::ClickFocus);
+    setContentWidget(d->mText);
+    setModal(false);
+
+#if QT_VERSION >= 0x040600
+    // Make sure the excat word popup never steals focus.
+    setFlag(QGraphicsItem::ItemIsPanel, true);
+    setActive(false);
+
+    // enable drop shadow for the preview pane
+    QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect;
+    effect->setBlurRadius(8);
+    setGraphicsEffect(effect);
+#endif
+
+    d->mOption = new HbStyleOptionLabel();
+    if(d->mOption != 0 ) {
+        d->mOption->text = QString(" ");
+        d->mOption->boundingRect = QRectF(HbExactWordPopupStartupDisplay,HbExactWordPopupSize);
+        // for hardware keypad, we need to show the arrow to indicate the word
+        // and in virtual keypad this is not needed, so set the image accordingly
+        setIndicatorArrow( indicatorArrow );
+        d->mOption->alignment = Qt::AlignCenter;
+    }
+
+    d->iconPrim = static_cast<HbIconItem*>(primitive(HbStyle::P_Label_icon));
+    if(d->iconPrim == 0) {
+        d->iconPrim = static_cast<HbIconItem*>(style()->createPrimitive((HbStyle::Primitive)(HbStyle::P_Label_icon), this));
+    }
+    style()->updatePrimitive(d->iconPrim, (HbStyle::Primitive)(HbStyle::P_Label_icon), d->mOption);
+}
+
+/*!
+    Returns the text of the tooltip. The default value is "Exact Word popup text".
+
+    \sa setText()
+*/
+
+QString HbExactWordPopup::text()
+{
+    Q_D(HbExactWordPopup);
+    return d->mText->plainText();
+}
+
+/*!
+    Sets the text of the label within the progress note.
+
+    \sa text()
+*/
+void HbExactWordPopup::setText(const QString &newText)
+{
+    Q_D(HbExactWordPopup);
+    d->mText->setPlainText(newText);
+
+    QRectF ps=QRectF(QPointF(0,0), d->mText->preferredSize()).adjusted(-9,-9,9,9);
+    resize(ps.size());
+}
+
+/*!
+    Displays exact word popup at a given point
+
+    \sa hideText()
+*/
+void HbExactWordPopup::showText(QPointF pos)
+{
+    // the popup should know at this stage in which main window/scene it's been launched at.
+    int screenWidth = 0;
+    if ( mainWindow() ) {
+        screenWidth = HbDeviceProfile::profile(this).logicalSize().width();
+    } else {
+        // this is the fall-back if the main window is not know - can be removed when popup
+        // is not relying on the primary window anymore.
+        screenWidth = HbDeviceProfile::profile(mainWindow()).logicalSize().width();
+    }
+
+    const QRectF br = boundingRect();
+    const qreal brCenter = br.width()/2;
+    pos.setX(pos.x()-brCenter);
+    // fix x position to keep tooltip visible
+    const qreal requiredWidth = pos.x()+br.width();
+    if (requiredWidth > screenWidth) {
+        pos.setX(pos.x()-(requiredWidth-screenWidth));
+    } else if (0 > pos.x()) {
+        pos.setX(0);
+    }
+    pos.setY(pos.y()-br.height());
+    setPos(pos);
+
+    QSizeF mySize = size();
+    mySize.setHeight(HbExactWordPopupSize.height());
+    resize(mySize);    
+
+    Q_D(HbExactWordPopup);
+    d->mOption->boundingRect = QRectF(rect().center().x() - (HbExactWordPopupSize.width()/2),rect().bottom(),HbExactWordPopupSize.width(),HbExactWordPopupSize.height());
+    style()->updatePrimitive(d->iconPrim, (HbStyle::Primitive)(HbStyle::P_Label_icon), d->mOption);
+
+    show();
+}
+
+/*!
+    Hides exact word popup
+
+    \sa hideText()
+*/
+void HbExactWordPopup::hideText()
+{
+    close();
+}
+
+void HbExactWordPopup::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    if (contains(mapFromScene(event->scenePos()))) {
+        // commit word only if mouse release event happens inside popup area
+        emit exactWordSelected();
+        // this call closes the popup, and this is called only when mouse relase event happens
+        // inside popup area
+        HbDialog::mouseReleaseEvent(event);
+    }
+    // if mouse release event happens outside popup area, don't commit or close the popup
+
+}
+
+void HbExactWordPopup::updatePrimitives()
+{
+    Q_D( HbExactWordPopup );
+
+    d->mPopupBackground->frameDrawer().setFrameType(HbFrameDrawer::NinePieces);
+    d->mPopupBackground->frameDrawer().setFrameGraphicsName("qtg_fr_popup_secondary");
+    d->mPopupBackground->setGeometry(boundingRect());
+
+	QColor col = HbColorScheme::color( "qtc_editor_normal" ); //popupforeground
+    if (col.isValid()) {
+        d->mText->setTextColor(col);
+    }
+}
+
+// this method is called whenever there is a switch of keypad usage from h/w to virtual
+// h/w keypad needs an indicator, whereas virtual does not, hence set the image appropriately.
+void HbExactWordPopup::setIndicatorArrow( HbExactWordPopupIndicator indicatorArrow )
+{
+    Q_D( HbExactWordPopup );
+
+    if (indicatorArrow == HbNoIndicatorArrow) {
+        d->mOption->icon = (QString(""));
+    } else {
+        d->mOption->icon = (QString("qtg_mono_input_down"));
+   }
+}