src/hbcore/inputfw/hbinputfocusobject.cpp
changeset 21 4633027730f5
parent 7 923ff622b8b9
child 23 e6ad4ef83b23
--- a/src/hbcore/inputfw/hbinputfocusobject.cpp	Tue Jul 06 14:36:53 2010 +0300
+++ b/src/hbcore/inputfw/hbinputfocusobject.cpp	Wed Aug 18 10:05:37 2010 +0300
@@ -37,9 +37,14 @@
 #include "hbinputeditorinterface.h"
 #include "hbinputvkbhost.h"
 #include "hbinputstandardfilters.h"
+#include "hbdeviceprofile.h"
 #include "hbinpututils.h"
 #include "hbnamespace_p.h"
+#include "hbmainwindow.h"
 #include "hbevent.h"
+#include "hbwidget.h"
+#include "hbinputmainwindow_p.h"
+
 /*!
 @alpha
 @hbcore
@@ -75,35 +80,79 @@
     }
 }
 
-
 class HbInputFocusObjectPrivate
 {
+    Q_DECLARE_PUBLIC(HbInputFocusObject)
+
 public:
     HbInputFocusObjectPrivate(QObject *focusedObject)
         : mFocusedObject(focusedObject),
           mEditorInterface(focusedObject)
     {}
 
+    HbMainWindow *mainWindow() const;    
+
 public:
+    HbInputFocusObject *q_ptr;
     QPointer<QObject> mFocusedObject;
     HbEditorInterface mEditorInterface;
     QString mPreEditString;
 };
 
+HbMainWindow *HbInputFocusObjectPrivate::mainWindow() const
+{
+    QWidget *qWidgetObject = qobject_cast<QWidget *>(mFocusedObject);
+    QGraphicsObject *graphicsObject = 0;
+
+    // check for graphics view related widgets.
+    if (qWidgetObject) {
+        if (qWidgetObject->graphicsProxyWidget()) {
+            graphicsObject = qWidgetObject->graphicsProxyWidget();
+        } else {
+            return HbInputMainWindow::instance();
+        }
+    } else {
+        graphicsObject = qobject_cast<QGraphicsObject *>(mFocusedObject);
+    }
+
+    if (graphicsObject) {
+        if (graphicsObject->scene()) {
+            QList<QGraphicsView*> views = graphicsObject->scene()->views();
+            foreach (QGraphicsView *view, views) {
+                HbMainWindow *mainWindow = qobject_cast<HbMainWindow*>(view);
+                if (mainWindow) {
+                    return mainWindow;
+                }
+            }
+            // not a HbMainWindow.
+            return HbInputMainWindow::instance();
+        }
+    }
+
+    return 0;
+}
 
 /// @endcond
 
 HbInputFocusObject::HbInputFocusObject(QObject *focusedObject)
     : d_ptr(new HbInputFocusObjectPrivate(focusedObject))
 {
+    Q_D(HbInputFocusObject);
+    d->q_ptr = this;
+
     if (focusedObject) {
         HbEvent *event = new HbEvent(HbEvent::InputMethodFocusIn);
         QCoreApplication::sendEvent(focusedObject, event);
         delete event;
+
+        HbMainWindow *mainWindow = d->mainWindow();
+        if (mainWindow) {
+            connect(mainWindow, SIGNAL(aboutToChangeOrientation()), this, SIGNAL(aboutToChangeOrientation()));
+            connect(mainWindow, SIGNAL(orientationChanged(Qt::Orientation)), this, SIGNAL(orientationChanged()));
+        }
     }
 }
 
-
 HbInputFocusObject::~HbInputFocusObject()
 {
     Q_D(HbInputFocusObject);
@@ -176,7 +225,6 @@
     }
 }
 
-
 /*!
 Posts given event to focused editor in an asynchronous manner.
 */
@@ -703,5 +751,23 @@
     }
 }
 
+/*!
+Returns the screen orientation in editor widget's context. For widgets
+living in HbMainWindow, it is main window's orientation. For everything
+else, it is device profile's screen orientation.
+*/
+Qt::Orientation HbInputFocusObject::orientation() const
+{
+    Q_D(const HbInputFocusObject);
+
+    HbMainWindow *mainWindow = d->mainWindow();
+    if (mainWindow) {
+        return mainWindow->orientation();
+    }
+
+    return HbDeviceProfile::current().orientation();
+}
+
+#include "moc_hbinputfocusobject.cpp"
+
 // End of file
-