src/hbcore/vkbhosts/hbabstractvkbhost.cpp
changeset 6 c3690ec91ef8
parent 5 627c4a0fd0e7
child 21 4633027730f5
child 34 ed14f46c0e55
equal deleted inserted replaced
5:627c4a0fd0e7 6:c3690ec91ef8
    42 const qreal HbCursorLineMargin = 15.0;
    42 const qreal HbCursorLineMargin = 15.0;
    43 const qreal HbContainerBorderMargin = 20.0;
    43 const qreal HbContainerBorderMargin = 20.0;
    44 const qreal HbHeightVerticalFactor = 0.5;
    44 const qreal HbHeightVerticalFactor = 0.5;
    45 const qreal HbHeightHorizFactor = 0.7;
    45 const qreal HbHeightHorizFactor = 0.7;
    46 const QString KHandWritingName("Handwriting");
    46 const QString KHandWritingName("Handwriting");
       
    47 // see hbpopup.cpp for this
       
    48 extern const char* KPositionManagedByVKB;
       
    49 
       
    50 /// @cond
    47 
    51 
    48 HbVkbHostContainerWidget::HbVkbHostContainerWidget(QObject *containterWidget)
    52 HbVkbHostContainerWidget::HbVkbHostContainerWidget(QObject *containterWidget)
    49 :mContainerWidget(containterWidget)
    53     : mContainerWidget(containterWidget)
    50 {
    54 {
    51 }
    55 }
    52 
    56 
    53 // sets container widgets position to new position.
    57 // sets container widgets position to new position.
    54 void HbVkbHostContainerWidget::setPos(QPointF newPosition)
    58 void HbVkbHostContainerWidget::setPos(QPointF newPosition)
    61         }
    65         }
    62 
    66 
    63         QWidget *qWidget = qobject_cast<QWidget *>(mContainerWidget);
    67         QWidget *qWidget = qobject_cast<QWidget *>(mContainerWidget);
    64         if (qWidget) {
    68         if (qWidget) {
    65 #ifdef Q_WS_WIN
    69 #ifdef Q_WS_WIN
    66              QPoint finalPosition = newPosition.toPoint();
    70             QPoint finalPosition = newPosition.toPoint();
    67              finalPosition -= qWidget->geometry().topLeft() - qWidget->frameGeometry().topLeft();
    71             finalPosition -= qWidget->geometry().topLeft() - qWidget->frameGeometry().topLeft();
    68              qWidget->move(finalPosition);
    72             qWidget->move(finalPosition);
    69 #else             
    73 #else
    70              qWidget->move(newPosition.toPoint());
    74             qWidget->move(newPosition.toPoint());
    71 #endif
    75 #endif
    72             return;
    76             return;
    73         }
    77         }
    74     }
    78     }
    75 }
    79 }
    80 {
    84 {
    81     if (mContainerWidget) {
    85     if (mContainerWidget) {
    82         QGraphicsObject *graphicsObject = qobject_cast<QGraphicsObject *>(mContainerWidget);
    86         QGraphicsObject *graphicsObject = qobject_cast<QGraphicsObject *>(mContainerWidget);
    83         if (graphicsObject) {
    87         if (graphicsObject) {
    84             return graphicsObject->pos();;
    88             return graphicsObject->pos();;
    85         } 
    89         }
    86 
    90 
    87         QWidget *qWidget = qobject_cast<QWidget *>(mContainerWidget);
    91         QWidget *qWidget = qobject_cast<QWidget *>(mContainerWidget);
    88         if (qWidget) {
    92         if (qWidget) {
    89             return qWidget->mapToGlobal(QPoint(0,0));
    93             return qWidget->mapToGlobal(QPoint(0, 0));
    90         }
    94         }
    91     }
    95     }
    92 
    96 
    93     return QPointF(0, 0);
    97     return QPointF(0, 0);
    94 }
    98 }
    99 {
   103 {
   100     if (mContainerWidget) {
   104     if (mContainerWidget) {
   101         QGraphicsObject *graphicsObject = qobject_cast<QGraphicsObject *>(mContainerWidget);
   105         QGraphicsObject *graphicsObject = qobject_cast<QGraphicsObject *>(mContainerWidget);
   102         if (graphicsObject) {
   106         if (graphicsObject) {
   103             return graphicsObject->sceneBoundingRect();;
   107             return graphicsObject->sceneBoundingRect();;
   104         } 
   108         }
   105 
   109 
   106         QWidget *qWidget = qobject_cast<QWidget *>(mContainerWidget);
   110         QWidget *qWidget = qobject_cast<QWidget *>(mContainerWidget);
   107         if (qWidget) {
   111         if (qWidget) {
   108             return QRectF(qWidget->mapToGlobal(QPoint(0,0)), qWidget->size());
   112             return QRectF(qWidget->mapToGlobal(QPoint(0, 0)), qWidget->size());
   109         }
   113         }
   110     }
   114     }
   111 
   115 
   112     return QRectF(0, 0, 0, 0);
   116     return QRectF(0, 0, 0, 0);
   113 }
   117 }
   114 
   118 
   115 // connect container specific signals here.
   119 // connect container specific signals here.
   116 void HbVkbHostContainerWidget::connectSignals(QObject *reciever)
   120 void HbVkbHostContainerWidget::connectSignals(QObject *receiver)
   117 {
   121 {
   118     if (qobject_cast<QGraphicsObject*> (mContainerWidget)) {
   122     if (qobject_cast<QGraphicsObject *> (mContainerWidget)) {
   119         QObject::connect(mContainerWidget, SIGNAL(yChanged())
   123         QObject::connect(mContainerWidget, SIGNAL(yChanged()),
   120             , reciever, SLOT(ensureCursorVisibility()));
   124                          receiver, SLOT(ensureCursorVisibility()));
   121     }
   125     }
   122 
   126 
   123     HbPopup *popup = qobject_cast<HbPopup*>(mContainerWidget);
   127     HbPopup *popup = qobject_cast<HbPopup *>(mContainerWidget);
   124     if (popup) {
   128     if (popup) {
   125         QObject::connect(popup, SIGNAL(aboutToHide()), reciever, SLOT(containerAboutToClose()));
   129         QObject::connect(popup, SIGNAL(aboutToHide()), receiver, SLOT(containerAboutToClose()));
   126     }
   130     }
   127 
   131 
   128     HbView *view = qobject_cast<HbView*>(mContainerWidget);
   132     HbView *view = qobject_cast<HbView *>(mContainerWidget);
   129     if (view) {
   133     if (view) {
   130         QObject::connect(view->mainWindow(), SIGNAL(currentViewChanged(HbView *))
   134         QObject::connect(view->mainWindow(), SIGNAL(currentViewChanged(HbView *)),
   131             , reciever, SLOT(currentViewChanged(HbView *)));
   135                          receiver, SLOT(currentViewChanged(HbView *)));
   132     }
   136     }
   133 }
   137 }
   134 
   138 
   135 // disconnect container specific signals here.
   139 // disconnect container specific signals here.
   136 void HbVkbHostContainerWidget::disconnectSignals(QObject *reciever)
   140 void HbVkbHostContainerWidget::disconnectSignals(QObject *receiver)
   137 {
   141 {
   138     if (qobject_cast<QGraphicsObject*> (mContainerWidget)) {
   142     if (qobject_cast<QGraphicsObject *> (mContainerWidget)) {
   139         QObject::disconnect(mContainerWidget, SIGNAL(yChanged())
   143         QObject::disconnect(mContainerWidget, SIGNAL(yChanged()),
   140             , reciever, SLOT(ensureCursorVisibility()));
   144                             receiver, SLOT(ensureCursorVisibility()));
   141     }
   145     }
   142 
   146 
   143     HbPopup *popup = qobject_cast<HbPopup*>(mContainerWidget);
   147     HbPopup *popup = qobject_cast<HbPopup *>(mContainerWidget);
   144     if (popup) {
   148     if (popup) {
   145         QObject::disconnect(popup, SIGNAL(aboutToHide()), reciever, SLOT(containerAboutToClose()));
   149         QObject::disconnect(popup, SIGNAL(aboutToHide()), receiver, SLOT(containerAboutToClose()));
   146     }
   150     }
   147     
   151 
   148     HbPopup *view = qobject_cast<HbPopup*>(mContainerWidget);
   152     HbPopup *view = qobject_cast<HbPopup *>(mContainerWidget);
   149     if (view) {
   153     if (view) {
   150         QObject::disconnect(view->mainWindow(), SIGNAL(currentViewChanged(HbView *))
   154         QObject::disconnect(view->mainWindow(), SIGNAL(currentViewChanged(HbView *)),
   151             , reciever, SLOT(currentViewChanged(HbView *)));
   155                             receiver, SLOT(currentViewChanged(HbView *)));
   152     }
   156     }
   153 }
   157 }
       
   158 
       
   159 /// @endcond
   154 
   160 
   155 /*!
   161 /*!
   156 \proto
   162 \proto
   157 \class HbAbstractVkbHost
   163 \class HbAbstractVkbHost
   158 \brief Base class for HbCore's virtual keyboard hosts.
   164 \brief Base class for HbCore's virtual keyboard hosts.
   161 */
   167 */
   162 
   168 
   163 /// @cond
   169 /// @cond
   164 
   170 
   165 HbAbstractVkbHostPrivate::HbAbstractVkbHostPrivate(HbAbstractVkbHost *myHost, QObject *containerWidget)
   171 HbAbstractVkbHostPrivate::HbAbstractVkbHostPrivate(HbAbstractVkbHost *myHost, QObject *containerWidget)
   166 : q_ptr(myHost),
   172     : q_ptr(myHost),
   167 mCallback(0),
   173       mCallback(0),
   168 mKeypad(0),
   174       mKeypad(0),
   169 mContainerWidget(new HbVkbHostContainerWidget(containerWidget)),
   175       mContainerWidget(new HbVkbHostContainerWidget(containerWidget)),
   170 mTimeLine(HbAnimationTime),
   176       mTimeLine(HbAnimationTime),
   171 mKeypadStatus(HbVkbHost::HbVkbStatusClosed),
   177       mKeypadStatus(HbVkbHost::HbVkbStatusClosed),
   172 mKeypadOperationOngoing(false),
   178       mKeypadOperationOngoing(false),
   173 mOriginalContainerPosition(QPointF(0,0)),
   179       mOriginalContainerPosition(QPointF(0, 0)),
   174 mContainerMovementStartingPoint(QPointF(0, 0)),
   180       mContainerMovementStartingPoint(QPointF(0, 0)),
   175 mContainerMovementVector(QPointF(0, 0)),
   181       mContainerMovementVector(QPointF(0, 0)),
   176 mKeypadMovementStartingPoint(QPointF(0, 0)),
   182       mKeypadMovementStartingPoint(QPointF(0, 0)),
   177 mKeypadMovementVector(QPointF(0, 0)),
   183       mKeypadMovementVector(QPointF(0, 0)),
   178 mInputMethod(0),
   184       mInputMethod(0),
   179 mKeypadStatusBeforeOrientationChange(HbVkbHost::HbVkbStatusClosed)
   185       mKeypadStatusBeforeOrientationChange(HbVkbHost::HbVkbStatusClosed)
   180 {
   186 {
   181     mTimeLine.setUpdateInterval(16);
   187     mTimeLine.setUpdateInterval(16);
   182 }
   188 }
   183 
   189 
   184 HbAbstractVkbHostPrivate::~HbAbstractVkbHostPrivate()
   190 HbAbstractVkbHostPrivate::~HbAbstractVkbHostPrivate()
   303 
   309 
   304 bool HbAbstractVkbHostPrivate::prepareKeypadAnimation(HbVkbHost::HbVkbStatus status)
   310 bool HbAbstractVkbHostPrivate::prepareKeypadAnimation(HbVkbHost::HbVkbStatus status)
   305 {
   311 {
   306     if (status == HbVkbHost::HbVkbStatusOpened) {
   312     if (status == HbVkbHost::HbVkbStatusOpened) {
   307         if (mKeypadStatus == HbVkbHost::HbVkbStatusClosed) {
   313         if (mKeypadStatus == HbVkbHost::HbVkbStatusClosed) {
   308              // Set up keyboard open animation.
   314             // Set up keyboard open animation.
   309              mKeypadMovementStartingPoint.setY(mScreenSize.height());
   315             mKeypadMovementStartingPoint.setY(mScreenSize.height());
   310              mKeypadMovementVector.setY(-mKeypad->size().height());
   316             mKeypadMovementVector.setY(-mKeypad->size().height());
   311              if (!disableCursorShift()) {
   317             if (!disableCursorShift()) {
   312                  // Initialize keypad position
   318                 // Initialize keypad position
   313                  mKeypad->setPos(mKeypadMovementStartingPoint);
   319                 mKeypad->setPos(mKeypadMovementStartingPoint);
   314              }
   320             }
   315              return true;
   321             return true;
   316          } else if (mKeypadStatus == HbVkbHost::HbVkbStatusMinimized && mCallback) {
   322         } else if (mKeypadStatus == HbVkbHost::HbVkbStatusMinimized && mCallback) {
   317              mKeypadMovementVector.setY(-(mKeypad->size().height() - mCallback->minimizedKeyboardSize().height()));
   323             mKeypadMovementVector.setY(-(mKeypad->size().height() - mCallback->minimizedKeyboardSize().height()));
   318              return true;
   324             return true;
   319          }
   325         }
   320     } else if (status == HbVkbHost::HbVkbStatusMinimized && mCallback) {
   326     } else if (status == HbVkbHost::HbVkbStatusMinimized && mCallback) {
   321         mKeypadMovementVector = QPointF(0, mKeypad->size().height() - mCallback->minimizedKeyboardSize().height());
   327         mKeypadMovementVector = QPointF(0, mKeypad->size().height() - mCallback->minimizedKeyboardSize().height());
   322         return true;
   328         return true;
   323     } else {
   329     } else {
   324         // It is going to be closed.
   330         // It is going to be closed.
   350 void HbAbstractVkbHostPrivate::connectSignals()
   356 void HbAbstractVkbHostPrivate::connectSignals()
   351 {
   357 {
   352     mContainerWidget->connectSignals(q_ptr);
   358     mContainerWidget->connectSignals(q_ptr);
   353 
   359 
   354     // global signal not specific to any containter widget, can be connected now.
   360     // global signal not specific to any containter widget, can be connected now.
   355     HbMainWindow* mainWindow = this->mainWindow();
   361     HbMainWindow *mainWindow = this->mainWindow();
   356     if (mainWindow) {
   362     if (mainWindow) {
   357         q_ptr->connect(mainWindow, SIGNAL(aboutToChangeOrientation()), q_ptr, SLOT(orientationAboutToChange()));
   363         q_ptr->connect(mainWindow, SIGNAL(aboutToChangeOrientation()), q_ptr, SLOT(orientationAboutToChange()));
   358         q_ptr->connect(mainWindow, SIGNAL(orientationChanged(Qt::Orientation)), q_ptr, SLOT(orientationChanged(Qt::Orientation)));
   364         q_ptr->connect(mainWindow, SIGNAL(orientationChanged(Qt::Orientation)), q_ptr, SLOT(orientationChanged(Qt::Orientation)));
   359         q_ptr->connect(mainWindow, SIGNAL(currentViewChanged(HbView*)), q_ptr, SLOT(currentViewChanged(HbView*)));
   365         q_ptr->connect(mainWindow, SIGNAL(currentViewChanged(HbView *)), q_ptr, SLOT(currentViewChanged(HbView *)));
   360     }
   366     }
   361 }
   367 }
   362 
   368 
   363 void HbAbstractVkbHostPrivate::disconnectSignals()
   369 void HbAbstractVkbHostPrivate::disconnectSignals()
   364 {
   370 {
   365     mContainerWidget->disconnectSignals(q_ptr);
   371     mContainerWidget->disconnectSignals(q_ptr);
   366 
   372 
   367     // global signal not specific to any containter widget, can be connected now.
   373     // global signal not specific to any containter widget, can be connected now.
   368     HbMainWindow* mainWindow = this->mainWindow();
   374     HbMainWindow *mainWindow = this->mainWindow();
   369     if (mainWindow) {
   375     if (mainWindow) {
   370         q_ptr->disconnect(mainWindow, SIGNAL(aboutToChangeOrientation()), q_ptr, SLOT(orientationAboutToChange()));
   376         q_ptr->disconnect(mainWindow, SIGNAL(aboutToChangeOrientation()), q_ptr, SLOT(orientationAboutToChange()));
   371         q_ptr->disconnect(mainWindow, SIGNAL(orientationChanged(Qt::Orientation)), q_ptr, SLOT(orientationChanged(Qt::Orientation)));
   377         q_ptr->disconnect(mainWindow, SIGNAL(orientationChanged(Qt::Orientation)), q_ptr, SLOT(orientationChanged(Qt::Orientation)));
   372         q_ptr->disconnect(mainWindow, SIGNAL(currentViewChanged(HbView*)), q_ptr, SLOT(currentViewChanged(HbView*)));
   378         q_ptr->disconnect(mainWindow, SIGNAL(currentViewChanged(HbView *)), q_ptr, SLOT(currentViewChanged(HbView *)));
   373     }
   379     }
   374 }
   380 }
   375 
   381 
   376 void HbAbstractVkbHostPrivate::openKeypad()
   382 void HbAbstractVkbHostPrivate::openKeypad()
   377 {    
   383 {
   378     if (mContainerWidget->widgetObject()) {
   384     if (mContainerWidget->widgetObject()) {
   379         HbMainWindow* mainWin = mainWindow();
   385         HbMainWindow *mainWin = mainWindow();
   380         if (mainWin && mKeypad) {
   386         if (mainWin && mKeypad) {
   381             if (mKeypad->scene() != mainWin->scene()) {
   387             if (mKeypad->scene() != mainWin->scene()) {
   382                 // Add keypad to scene if it is not already in there.
   388                 // Add keypad to scene if it is not already in there.
   383                 mainWin->scene()->addItem(mKeypad);
   389                 mainWin->scene()->addItem(mKeypad);
   384             }
   390             }
   428 }
   434 }
   429 
   435 
   430 void HbAbstractVkbHostPrivate::openKeypadWithoutAnimation()
   436 void HbAbstractVkbHostPrivate::openKeypadWithoutAnimation()
   431 {
   437 {
   432     HbMainWindow *mainWin = mainWindow();
   438     HbMainWindow *mainWin = mainWindow();
   433     if (mKeypadStatus!= HbVkbHost::HbVkbStatusOpened && mKeypad && mContainerWidget->widgetObject() && mainWin) {
   439     if (mKeypadStatus != HbVkbHost::HbVkbStatusOpened && mKeypad && mContainerWidget->widgetObject() && mainWin) {
   434         if (mKeypad->scene() != mainWin->scene()) {
   440         if (mKeypad->scene() != mainWin->scene()) {
   435             // Add item to scene if it is not already in there.
   441             // Add item to scene if it is not already in there.
   436             mainWin->scene()->addItem(mKeypad);
   442             mainWin->scene()->addItem(mKeypad);
   437         }
   443         }
   438 
   444 
   442         }
   448         }
   443         if (prepareAnimations(HbVkbHost::HbVkbStatusOpened)) {
   449         if (prepareAnimations(HbVkbHost::HbVkbStatusOpened)) {
   444             if (!disableCursorShift()) {
   450             if (!disableCursorShift()) {
   445                 // Move the container widget to keep the focused line visible.
   451                 // Move the container widget to keep the focused line visible.
   446                 mContainerWidget->setPos(mContainerWidget->pos() + mContainerMovementVector);
   452                 mContainerWidget->setPos(mContainerWidget->pos() + mContainerMovementVector);
   447                 
   453 
   448                 // Move the keypad
   454                 // Move the keypad
   449                 mKeypad->setPos(mKeypadMovementStartingPoint + mKeypadMovementVector);
   455                 mKeypad->setPos(mKeypadMovementStartingPoint + mKeypadMovementVector);
   450             }
   456             }
   451 
   457 
   452             mKeypadStatus = HbVkbHost::HbVkbStatusOpened;
   458             mKeypadStatus = HbVkbHost::HbVkbStatusOpened;
   465             // Add item to scene if it is not already in there.
   471             // Add item to scene if it is not already in there.
   466             mainWin->scene()->addItem(mKeypad);
   472             mainWin->scene()->addItem(mKeypad);
   467         }
   473         }
   468 
   474 
   469         if (mKeypadStatus != HbVkbHost::HbVkbStatusMinimized) {
   475         if (mKeypadStatus != HbVkbHost::HbVkbStatusMinimized) {
   470             mCallback->aboutToOpen(q_ptr);           
   476             mCallback->aboutToOpen(q_ptr);
   471             q_ptr->resizeKeyboard(); // Make sure that the keyboard doesn't exceed given boundaries.
   477             q_ptr->resizeKeyboard(); // Make sure that the keyboard doesn't exceed given boundaries.
   472         }
   478         }
   473 
   479 
   474         if (prepareAnimations(HbVkbHost::HbVkbStatusMinimized)) {             
   480         if (prepareAnimations(HbVkbHost::HbVkbStatusMinimized)) {
   475             if (!disableCursorShift()) {
   481             if (!disableCursorShift()) {
   476                 mKeypad->setPos(0.0, mScreenSize.height() - mCallback->minimizedKeyboardSize().height());
   482                 mKeypad->setPos(0.0, mScreenSize.height() - mCallback->minimizedKeyboardSize().height());
   477             }
   483             }
   478             mKeypadStatus = HbVkbHost::HbVkbStatusMinimized;
   484             mKeypadStatus = HbVkbHost::HbVkbStatusMinimized;
   479             mCallback->keyboardMinimized(q_ptr);
   485             mCallback->keyboardMinimized(q_ptr);
   489         mKeypadStatus = HbVkbHost::HbVkbStatusClosed;
   495         mKeypadStatus = HbVkbHost::HbVkbStatusClosed;
   490 
   496 
   491         if (!disableCursorShift()) {
   497         if (!disableCursorShift()) {
   492             // Return the container widget to original position.
   498             // Return the container widget to original position.
   493             mContainerWidget->setPos(mOriginalContainerPosition);
   499             mContainerWidget->setPos(mOriginalContainerPosition);
       
   500             mContainerWidget->widgetObject()->setProperty(KPositionManagedByVKB, false );
   494         }
   501         }
   495 
   502 
   496         // Hide the keypad
   503         // Hide the keypad
   497         mKeypad->hide();
   504         mKeypad->hide();
   498         mCallback->keyboardClosed(q_ptr);
   505         mCallback->keyboardClosed(q_ptr);
   502 
   509 
   503 void HbAbstractVkbHostPrivate::minimizeKeypadWithoutAnimation()
   510 void HbAbstractVkbHostPrivate::minimizeKeypadWithoutAnimation()
   504 {
   511 {
   505     HbMainWindow *mainWin = mainWindow();
   512     HbMainWindow *mainWin = mainWindow();
   506     if (mKeypadStatus != HbVkbHost::HbVkbStatusMinimized && mKeypad && mainWin) {
   513     if (mKeypadStatus != HbVkbHost::HbVkbStatusMinimized && mKeypad && mainWin) {
   507         mCallback->aboutToClose(q_ptr);                
   514         mCallback->aboutToClose(q_ptr);
   508         if (mKeypad->scene() != mainWin->scene()) {
   515         if (mKeypad->scene() != mainWin->scene()) {
   509             // Add item to scene if it is not already in there.
   516             // Add item to scene if it is not already in there.
   510             mainWin->scene()->addItem(mKeypad);
   517             mainWin->scene()->addItem(mKeypad);
   511         }
   518         }
   512 
   519 
   526     if (mTimeLine.state() == QTimeLine::Running) {
   533     if (mTimeLine.state() == QTimeLine::Running) {
   527         mTimeLine.stop();
   534         mTimeLine.stop();
   528 
   535 
   529         if (!disableCursorShift()) {
   536         if (!disableCursorShift()) {
   530             mContainerWidget->setPos(mOriginalContainerPosition);
   537             mContainerWidget->setPos(mOriginalContainerPosition);
       
   538             mContainerWidget->widgetObject()->setProperty(KPositionManagedByVKB, false );
   531         }
   539         }
   532 
   540 
   533         if (mKeypad) {
   541         if (mKeypad) {
   534             mKeypad->hide();
   542             mKeypad->hide();
   535         }
   543         }
   543     }
   551     }
   544 }
   552 }
   545 
   553 
   546 HbMainWindow *HbAbstractVkbHostPrivate::mainWindow() const
   554 HbMainWindow *HbAbstractVkbHostPrivate::mainWindow() const
   547 {
   555 {
   548     HbWidget *hbWidget = qobject_cast<HbWidget*>(mContainerWidget->widgetObject());
   556     HbWidget *hbWidget = qobject_cast<HbWidget *>(mContainerWidget->widgetObject());
   549     if (hbWidget) {
   557     if (hbWidget) {
   550         return hbWidget->mainWindow();
   558         return hbWidget->mainWindow();
   551     }
   559     }
   552 
   560 
   553     // below is the case when we have a pure vanilla application.
   561     // below is the case when we have a pure vanilla application.
   554     // there should be one hbmainwindow to show all the widgets.
   562     // there should be one hbmainwindow to show all the widgets.
   555     if (hbInstance->allMainWindows().size())
   563     if (hbInstance->allMainWindows().size()) {
   556         return hbInstance->allMainWindows().at(0);
   564         return hbInstance->allMainWindows().at(0);
       
   565     }
   557 
   566 
   558     // no mainwindow.
   567     // no mainwindow.
   559     return 0;
   568     return 0;
   560 }
   569 }
   561 
   570 
   563 {
   572 {
   564     HbMainWindow *mainWin = mainWindow();
   573     HbMainWindow *mainWin = mainWindow();
   565     QSizeF result = static_cast<QSizeF>(HbDeviceProfile::profile(mainWin).logicalSize());
   574     QSizeF result = static_cast<QSizeF>(HbDeviceProfile::profile(mainWin).logicalSize());
   566 
   575 
   567     // do some sanity checking for the size got from device profile
   576     // do some sanity checking for the size got from device profile
   568     if( result.isNull() || result.width() < 200 || result.height() < 200 ) {
   577     if (result.isNull() || result.width() < 200 || result.height() < 200) {
   569         qWarning("VkbHost error: size from device profile is faulty, using fallback!");
   578         qWarning("VkbHost error: size from device profile is faulty, using fallback!");
   570         if (mainWin) {
   579         if (mainWin) {
   571             if (mainWin->orientation() == Qt::Horizontal) {
   580             if (mainWin->orientation() == Qt::Horizontal) {
   572                 result.setWidth(640);
   581                 result.setWidth(640);
   573                 result.setHeight(360);
   582                 result.setHeight(360);
   579     }
   588     }
   580 
   589 
   581     return result;
   590     return result;
   582 }
   591 }
   583 
   592 
   584 bool HbAbstractVkbHostPrivate::disableCursorShift() {
   593 bool HbAbstractVkbHostPrivate::disableCursorShift()
       
   594 {
   585 
   595 
   586     if (!mInputMethod
   596     if (!mInputMethod
   587         || mainWindow()) {
   597         || mainWindow()) {
   588         return false;
   598         return false;
   589     }
   599     }
   681 }
   691 }
   682 
   692 
   683 /*!
   693 /*!
   684 \reimp
   694 \reimp
   685 */
   695 */
   686 
   696 void HbAbstractVkbHost::openKeypad(HbVirtualKeyboard *vkb, HbInputMethod *owner, bool animationAllowed)
   687 void HbAbstractVkbHost::openKeypad(HbVirtualKeyboard *vkb, HbInputMethod* owner, bool animationAllowed)
       
   688 {
   697 {
   689     Q_D(HbAbstractVkbHost);
   698     Q_D(HbAbstractVkbHost);
   690 
   699 
   691     if (owner) {
   700     if (owner) {
   692         d->mInputMethod = owner;
   701         d->mInputMethod = owner;
   699         return;
   708         return;
   700     }
   709     }
   701 
   710 
   702     if (!HbVkbHostBridge::instance()->connectHost(this)) {
   711     if (!HbVkbHostBridge::instance()->connectHost(this)) {
   703         // Do not set open call pending if orientation change is ongoing
   712         // Do not set open call pending if orientation change is ongoing
   704         if (HbInputSettingProxy::instance()->orientationChangeCompleted()) {
   713         connect(HbVkbHostBridge::instance(), SIGNAL(stateTransitionCompleted()), this, SLOT(stateTransitionCompleted()));
   705             connect(HbVkbHostBridge::instance(), SIGNAL(stateTransitionCompleted()), this, SLOT(stateTransitionCompleted()));
   714         // The previous keyboard is still closing. Set the call pending and return.
   706             // The previous keyboard is still closing. Set the call pending and return.
   715         d->mPendingCall.vkb = vkb;
   707             d->mPendingCall.vkb = vkb;
   716         d->mPendingCall.animationAllowed = animationAllowed;
   708             d->mPendingCall.animationAllowed = animationAllowed;
       
   709         }
       
   710         return;
   717         return;
   711     }
   718     }
   712 
   719 
   713     if (!d->mKeypadOperationOngoing) {
   720     if (!d->mKeypadOperationOngoing) {
   714         d->mKeypadOperationOngoing = true;
   721         d->mKeypadOperationOngoing = true;
   726             return;
   733             return;
   727         }
   734         }
   728 
   735 
   729         emit aboutToOpen();
   736         emit aboutToOpen();
   730 
   737 
       
   738         if (d->mContainerWidget && d->mContainerWidget->widgetObject()) {
       
   739             d->mContainerWidget->widgetObject()->setProperty(KPositionManagedByVKB, true );
       
   740         }
       
   741 
   731         if (animationAllowed) {
   742         if (animationAllowed) {
   732             d->openKeypad();
   743             d->openKeypad();
   733         } else {
   744         } else {
   734             d->openKeypadWithoutAnimation();
   745             d->openKeypadWithoutAnimation();
   735             emit keypadOpened();
   746             emit keypadOpened();
   736         }
   747         }
   737         HbWidgetFeedback::triggered(qobject_cast<const HbWidget*>(d->mKeypad), Hb::InstantPopupOpened);
   748         HbWidgetFeedback::triggered(qobject_cast<const HbWidget *>(d->mKeypad), Hb::InstantPopupOpened);
   738 
   749 
   739         d->connectSignals();
   750         d->connectSignals();
   740         d->mKeypadOperationOngoing = false;
   751         d->mKeypadOperationOngoing = false;
   741     }
   752     }
   742 }
   753 }
   773 {
   784 {
   774     Q_D(HbAbstractVkbHost);
   785     Q_D(HbAbstractVkbHost);
   775 
   786 
   776     if (!d->disableCursorShift()) {
   787     if (!d->disableCursorShift()) {
   777         // Move the container.
   788         // Move the container.
   778     if (d->mContainerWidget->widgetObject()) {
   789         if (d->mContainerWidget->widgetObject()) {
   779             d->mContainerWidget->setPos(d->mContainerMovementStartingPoint + (d->mContainerMovementVector * value));
   790             d->mContainerWidget->setPos(d->mContainerMovementStartingPoint + (d->mContainerMovementVector * value));
   780         }
   791         }
   781 
   792 
   782         // Move keypad
   793         // Move keypad
   783         if (d->mKeypad) {
   794         if (d->mKeypad) {
   809         if (d->mKeypadStatus == HbVkbHost::HbVkbStatusOpened) {
   820         if (d->mKeypadStatus == HbVkbHost::HbVkbStatusOpened) {
   810             d->mCallback->keyboardOpened(this);
   821             d->mCallback->keyboardOpened(this);
   811 
   822 
   812             if (d->mInputMethod->focusObject()) {
   823             if (d->mInputMethod->focusObject()) {
   813                 // This is hopefully temporary...
   824                 // This is hopefully temporary...
   814                 QTextEdit *textEdit = qobject_cast<QTextEdit*>(d->mInputMethod->focusObject()->object());
   825                 QTextEdit *textEdit = qobject_cast<QTextEdit *>(d->mInputMethod->focusObject()->object());
   815                 if (textEdit) {
   826                 if (textEdit) {
   816                     textEdit->ensureCursorVisible();
   827                     textEdit->ensureCursorVisible();
   817                 }
   828                 }
   818             }
   829             }
   819 
   830 
   827         } else {
   838         } else {
   828             // It was closed. Hide the keyboard.
   839             // It was closed. Hide the keyboard.
   829             d->mKeypad->hide();
   840             d->mKeypad->hide();
   830             // Return the container where it was.
   841             // Return the container where it was.
   831             d->mContainerWidget->setPos(d->mOriginalContainerPosition);
   842             d->mContainerWidget->setPos(d->mOriginalContainerPosition);
       
   843             d->mContainerWidget->widgetObject()->setProperty(KPositionManagedByVKB, false );
   832             d->mCallback->keyboardClosed(this);
   844             d->mCallback->keyboardClosed(this);
   833             emit keypadClosed();
   845             emit keypadClosed();
   834             HbVkbHostBridge::instance()->connectHost(0);
   846             HbVkbHostBridge::instance()->connectHost(0);
   835         }
   847         }
   836     }
   848     }
   864 */
   876 */
   865 void HbAbstractVkbHost::orientationAboutToChange()
   877 void HbAbstractVkbHost::orientationAboutToChange()
   866 {
   878 {
   867     Q_D(HbAbstractVkbHost);
   879     Q_D(HbAbstractVkbHost);
   868     d->mKeypadStatusBeforeOrientationChange = d->mKeypadStatus;
   880     d->mKeypadStatusBeforeOrientationChange = d->mKeypadStatus;
   869     HbInputSettingProxy::instance()->notifyScreenOrientationChange();
       
   870 }
   881 }
   871 
   882 
   872 /*!
   883 /*!
   873 This slot is connected to orientation change signal from the framework and notifies
   884 This slot is connected to orientation change signal from the framework and notifies
   874 the setting proxy. Notification will then be froearded to other interested parties
   885 the setting proxy. Notification will then be froearded to other interested parties
   875 by the setting proxy.
   886 by the setting proxy.
   876 */
   887 */
   877 void HbAbstractVkbHost::orientationChanged(Qt::Orientation orientation)
   888 void HbAbstractVkbHost::orientationChanged(Qt::Orientation orientation)
   878 {
   889 {
   879     HbInputSettingProxy::instance()->setScreenOrientation(orientation);
   890     Q_UNUSED(orientation);
   880 }
   891 }
   881 
   892 
   882 /*!
   893 /*!
   883 \reimp
   894 \reimp
   884 */
   895 */
   885 HbVirtualKeyboard* HbAbstractVkbHost::activeKeypad() const
   896 HbVirtualKeyboard *HbAbstractVkbHost::activeKeypad() const
   886 {
   897 {
   887     Q_D(const HbAbstractVkbHost);
   898     Q_D(const HbAbstractVkbHost);
   888     return d->mCallback;
   899     return d->mCallback;
   889 }
   900 }
   890 
   901 
   897 
   908 
   898     if ((d->mTimeLine.state() == QTimeLine::Running) ||
   909     if ((d->mTimeLine.state() == QTimeLine::Running) ||
   899         (d->mKeypadStatus == HbVkbStatusClosed) ||
   910         (d->mKeypadStatus == HbVkbStatusClosed) ||
   900         (d->mKeypadStatus == HbVkbStatusMinimized) ||
   911         (d->mKeypadStatus == HbVkbStatusMinimized) ||
   901         !d->mContainerWidget->widgetObject()) {
   912         !d->mContainerWidget->widgetObject()) {
   902             return;
   913         return;
   903     }
   914     }
   904 
   915 
   905     // This will refresh the situation if needed.
   916     // This will refresh the situation if needed.
   906     d->openKeypad();
   917     d->openKeypad();
   907 }
   918 }
   937 QSizeF HbAbstractVkbHost::confirmedKeyboardSize()const
   948 QSizeF HbAbstractVkbHost::confirmedKeyboardSize()const
   938 {
   949 {
   939     Q_D(const HbAbstractVkbHost);
   950     Q_D(const HbAbstractVkbHost);
   940 
   951 
   941     if (d->mCallback && d->mKeypad) {
   952     if (d->mCallback && d->mKeypad) {
   942         QSizeF kbArea = keyboardArea();        
   953         QSizeF kbArea = keyboardArea();
   943         QSizeF confirmed = d->mCallback->preferredKeyboardSize();
   954         QSizeF confirmed = d->mCallback->preferredKeyboardSize();
   944 
   955 
   945         if (confirmed.width() > kbArea.width()) {
   956         if (confirmed.width() > kbArea.width()) {
   946             confirmed.setWidth(kbArea.width());
   957             confirmed.setWidth(kbArea.width());
   947         }
   958         }
  1007 }
  1018 }
  1008 
  1019 
  1009 /*!
  1020 /*!
  1010 \reimp
  1021 \reimp
  1011 */
  1022 */
  1012 void HbAbstractVkbHost::openMinimizedKeypad(HbVirtualKeyboard *vkb, HbInputMethod* owner)
  1023 void HbAbstractVkbHost::openMinimizedKeypad(HbVirtualKeyboard *vkb, HbInputMethod *owner)
  1013 {
  1024 {
  1014     Q_D(HbAbstractVkbHost);
  1025     Q_D(HbAbstractVkbHost);
  1015     d->mInputMethod = owner;
  1026     d->mInputMethod = owner;
  1016 
  1027 
  1017     if (!d->mKeypadOperationOngoing) {
  1028     if (!d->mKeypadOperationOngoing) {
  1051 void HbAbstractVkbHost::currentViewChanged(HbView *view)
  1062 void HbAbstractVkbHost::currentViewChanged(HbView *view)
  1052 {
  1063 {
  1053     Q_D(HbAbstractVkbHost);
  1064     Q_D(HbAbstractVkbHost);
  1054 
  1065 
  1055     if (view != d->mContainerWidget->widgetObject()) {
  1066     if (view != d->mContainerWidget->widgetObject()) {
  1056         if (d->mTimeLine.state() == QTimeLine::Running) {               
  1067         if (d->mTimeLine.state() == QTimeLine::Running) {
  1057             d->cancelAnimationAndHideVkbWidget();
  1068             d->cancelAnimationAndHideVkbWidget();
  1058             if (d->mCallback) {
  1069             if (d->mCallback) {
  1059                 d->mCallback->keyboardClosed(this);
  1070                 d->mCallback->keyboardClosed(this);
  1060             }          
  1071             }
  1061         } else if (d->mKeypadStatus != HbVkbStatusClosed) {
  1072         } else if (d->mKeypadStatus != HbVkbStatusClosed) {
  1062             d->closeKeypadWithoutAnimation();
  1073             d->closeKeypadWithoutAnimation();
  1063             emit keypadClosed();
  1074             emit keypadClosed();
  1064         }
  1075         }
  1065     }
  1076     }
  1068 /*!
  1079 /*!
  1069 \reimp
  1080 \reimp
  1070 */
  1081 */
  1071 void HbAbstractVkbHost::refresh()
  1082 void HbAbstractVkbHost::refresh()
  1072 {
  1083 {
  1073      Q_D(HbAbstractVkbHost);
  1084     Q_D(HbAbstractVkbHost);
  1074 
  1085 
  1075      if (d->mKeypadStatus == HbVkbHost::HbVkbStatusOpened &&
  1086     if (d->mKeypadStatus == HbVkbHost::HbVkbStatusOpened &&
  1076          d->mTimeLine.state() != QTimeLine::Running) {
  1087         d->mTimeLine.state() != QTimeLine::Running) {
  1077          d->prepareAnimationsCommon();
  1088         d->prepareAnimationsCommon();
  1078          if (d->prepareContainerAnimation(HbVkbHost::HbVkbStatusOpened)) {
  1089         if (d->prepareContainerAnimation(HbVkbHost::HbVkbStatusOpened)) {
  1079              // Container status needs to be updated. Run the animation.
  1090             // Container status needs to be updated. Run the animation.
  1080              d->mTimeLine.start();
  1091             d->mTimeLine.start();
  1081          }
  1092         }
  1082      }
  1093     }
  1083 }
  1094 }
  1084 
  1095 
  1085 /*!
  1096 /*!
  1086 \reimp
  1097 \reimp
  1087 */
  1098 */
  1088 bool HbAbstractVkbHost::stateTransitionOngoing() const
  1099 bool HbAbstractVkbHost::stateTransitionOngoing() const
  1089 {
  1100 {
  1090      Q_D(const HbAbstractVkbHost);
  1101     Q_D(const HbAbstractVkbHost);
  1091      return (d->mTimeLine.state() == QTimeLine::Running);
  1102     return (d->mTimeLine.state() == QTimeLine::Running);
  1092 }
  1103 }
  1093 
  1104 
  1094 /*!
  1105 /*!
  1095 Receives signal from HbVkbHostBridge when previous host completes its state
  1106 Receives signal from HbVkbHostBridge when previous host completes its state
  1096 transition and sens pending call if any.
  1107 transition and sens pending call if any.