src/hbutils/document/hbdocumentloaderfactory_p.cpp
changeset 0 16d8024aca5e
child 1 f7ac710697a9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbutils/document/hbdocumentloaderfactory_p.cpp	Mon Apr 19 14:02:13 2010 +0300
@@ -0,0 +1,442 @@
+/****************************************************************************
+**
+** 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 HbUtils 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 "hbdocumentloaderfactory_p.h"
+
+#include <QObject>
+#include <QString>
+#include <QByteArray>
+#include <QGraphicsWidget>
+#if QT_VERSION >= 0x040600 && defined(HBUTILS_WEBKIT)
+#include <QGraphicsWebView>
+#endif // QT_VERSION
+
+#include <hbwidget.h>
+#include <hbpushbutton.h>
+#include <hblineedit.h>
+#include <hbdatetimeedit.h>
+#include <hbsearchpanel.h>
+#include <hbmenu.h>
+#include <hbview.h>
+#include <hbprogressbar.h>
+#include <hbscrollbar.h>
+#include <hbstackedwidget.h>
+#include <hbslider.h>
+#include <hbsliderpopup.h>
+#include <hbtoolbar.h>
+#include <hblabel.h>
+#include <hbdialog.h>
+#include <hbtooltip.h>
+#include <hblistview.h>
+#include <hblistwidget.h>
+#include <hbaction.h>
+#include <hbzoomsliderpopup.h>
+#include <hbvolumesliderpopup.h>
+#include <hbscrollarea.h>
+#include <hbgridview.h>
+#include <hbradiobuttonlist.h>
+#include <hbtextedit.h>
+#include <hbratingslider.h>
+#include <hbmessagebox.h>
+#include <hbcheckbox.h>
+#include <hbprogressslider.h>
+#include <hbinputdialog.h>
+#include <hbcolordialog.h>
+#include <hblistdialog.h>
+#include <hbcombobox.h>
+#include <hbgroupbox.h>
+#include <hbtreeview.h>
+#include <hbtransparentwindow.h>
+#include <hbdataform.h>
+#include <hbabstractviewitem.h>
+#include <hblistviewitem.h>
+#include <hbdatetimepicker.h>
+#include <hbgridviewitem.h>
+#include <hbtreeviewitem.h>
+#include <hbdataformviewitem.h>
+
+enum HbDocumentLoaderFactoryWidgetRoles {
+    HbWidgetRoleUnknown, // needs to be the first one = 0
+    HbWidgetRoleViewWidget,
+    HbWidgetRoleViewToolBar,
+    HbWidgetRoleViewMenu,
+    HbWidgetRoleMenuSubmenu,
+    HbWidgetRolePopupHeadingWidget,
+    HbWidgetRolePopupContentWidget,
+    HbWidgetRoleScrollAreaContents,
+    HbWidgetRoleListViewPrototype,  // deprecated
+    HbWidgetRoleGroupBoxContentWidget,
+    HbWidgetRoleAbstractViewPrototype,
+    HbWidgetRoleAmount // needs to be the last one
+};
+
+enum HbDocumentLoaderFactoryObjectRoles {
+    HbObjectRoleUnknown, // needs to be the first one = 0
+    HbObjectRoleDialogPrimaryAction,
+    HbObjectRoleDialogSecondaryAction,
+    HbObjectRoleMenuAction,
+    HbObjectRoleToolBarAction,
+    HbObjectRoleAmount // needs to be the last one
+};
+
+struct HbDocumentLoaderFactoryKnownValue
+{
+    const char *name;
+    int id;
+};
+
+// Used in binary seacrh, so keep name fields in alphabetical order.
+const HbDocumentLoaderFactoryKnownValue widgetRoles[HbWidgetRoleAmount - 1] =
+{
+    { "HbAbstractView:prototype", HbWidgetRoleAbstractViewPrototype },
+    { "HbDialog:contentWidget", HbWidgetRolePopupContentWidget },
+    { "HbDialog:headingWidget", HbWidgetRolePopupHeadingWidget },
+    { "HbGroupBox:contentWidget", HbWidgetRoleGroupBoxContentWidget },
+    { "HbListView:prototype", HbWidgetRoleListViewPrototype },  // deprecated
+    { "HbMenu:menu", HbWidgetRoleMenuSubmenu },
+    { "HbScrollArea:contents", HbWidgetRoleScrollAreaContents },
+    { "HbView:menu", HbWidgetRoleViewMenu },
+    { "HbView:toolBar", HbWidgetRoleViewToolBar },
+    { "HbView:widget", HbWidgetRoleViewWidget }
+};
+
+// Used in binary seacrh, so keep name fields in alphabetical order.
+const HbDocumentLoaderFactoryKnownValue objectRoles[HbObjectRoleAmount - 1] =
+{
+    { "HbDialog:primaryAction", HbObjectRoleDialogPrimaryAction },
+    { "HbDialog:secondaryAction", HbObjectRoleDialogSecondaryAction },
+    { "HbMenu:addAction", HbObjectRoleMenuAction },
+    { "HbToolBar:addAction", HbObjectRoleToolBarAction }
+};
+
+inline bool operator<(
+        const QString &name, const HbDocumentLoaderFactoryKnownValue &prop)
+{
+    return QString::compare(name, QLatin1String(prop.name), Qt::CaseSensitive) < 0;
+}
+
+inline bool operator<(
+        const HbDocumentLoaderFactoryKnownValue &prop, const QString &name)
+{
+    return QString::compare(QLatin1String(prop.name), name, Qt::CaseSensitive) < 0;
+}
+
+inline int findKnownValue(
+    const QString &name,
+    const HbDocumentLoaderFactoryKnownValue *start,
+    int numValues)
+{
+    const HbDocumentLoaderFactoryKnownValue *end = &start[numValues - 1];
+    const HbDocumentLoaderFactoryKnownValue *prop = qBinaryFind(start, end, name);
+    if (prop == end) {
+        return 0;
+    }
+    return prop->id;
+}
+
+/*
+    \class HbDocumentLoaderFactory
+    \internal
+    \proto
+
+    This \c HbDocumentLoaderFactory class is used to perform widget specific actions,
+    such as creation of the widgets, which cannot be handled using QT's meta object system.
+*/
+
+HbDocumentLoaderFactory::HbDocumentLoaderFactory()
+{
+}
+
+HbDocumentLoaderFactory::~HbDocumentLoaderFactory()
+{
+}
+
+/*
+    Creates instance of specified type and given object name.
+    \param type type of the instance.
+    \param name object name of the instance.
+    \return newly created object.
+*/
+QObject *HbDocumentLoaderFactory::create(const QString& type, const QString& name)
+{
+    QObject *result = 0;
+
+    const QByteArray typeArray = type.toUtf8();
+    const char *typeString = typeArray.constData();
+
+    #define CHECK_OBJECT_0(T) else if (!qstrcmp(typeString, #T)) { result = new T(); }
+
+    if (result) {
+        // unreachable, intentional
+    }
+    CHECK_OBJECT_0(QObject)
+    CHECK_OBJECT_0(QGraphicsWidget)
+    CHECK_OBJECT_0(HbWidget)
+    CHECK_OBJECT_0(HbPushButton)
+    CHECK_OBJECT_0(HbLabel)
+    CHECK_OBJECT_0(HbMenu)
+    CHECK_OBJECT_0(HbView)
+    CHECK_OBJECT_0(HbSlider)
+    CHECK_OBJECT_0(HbLineEdit)
+    CHECK_OBJECT_0(HbDateTimeEdit)
+    CHECK_OBJECT_0(HbSearchPanel)
+    CHECK_OBJECT_0(HbToolBar)
+    CHECK_OBJECT_0(HbScrollBar)
+    CHECK_OBJECT_0(HbListView)
+    CHECK_OBJECT_0(HbListWidget)
+    CHECK_OBJECT_0(HbDialog)
+    CHECK_OBJECT_0(HbProgressBar)
+    CHECK_OBJECT_0(HbStackedWidget)
+    CHECK_OBJECT_0(HbAction)
+    CHECK_OBJECT_0(HbRadioButtonList)
+    CHECK_OBJECT_0(HbZoomSliderPopup)
+    CHECK_OBJECT_0(HbVolumeSliderPopup)
+    CHECK_OBJECT_0(HbSliderPopup)
+    CHECK_OBJECT_0(HbScrollArea)
+    CHECK_OBJECT_0(HbGridView)
+    CHECK_OBJECT_0(HbTextEdit)
+    CHECK_OBJECT_0(HbCheckBox)
+    CHECK_OBJECT_0(HbProgressSlider)
+    CHECK_OBJECT_0(HbListDialog)
+    CHECK_OBJECT_0(HbColorDialog)
+    CHECK_OBJECT_0(HbRatingSlider)
+    CHECK_OBJECT_0(HbInputDialog)
+    CHECK_OBJECT_0(HbMessageBox)
+    CHECK_OBJECT_0(HbComboBox)
+    CHECK_OBJECT_0(HbGroupBox)
+    CHECK_OBJECT_0(HbTreeView)
+    CHECK_OBJECT_0(HbTransparentWindow)
+    CHECK_OBJECT_0(HbDataForm)
+    CHECK_OBJECT_0(HbListViewItem)
+    CHECK_OBJECT_0(HbDateTimePicker)
+    CHECK_OBJECT_0(HbGridViewItem)
+    CHECK_OBJECT_0(HbDataFormViewItem)
+    CHECK_OBJECT_0(HbTreeViewItem)
+#if QT_VERSION >= 0x040600 && defined(HBUTILS_WEBKIT)
+    CHECK_OBJECT_0(QGraphicsWebView)
+#endif
+    else {
+    }
+
+    if (result) {
+        result->setObjectName(name);
+    }
+    return result;
+}
+
+/*
+    Sets child widget to specified role in parent widget.
+    If role is not specified, then basic parent-child relationship is created.
+
+    \param parent parent widget.
+    \param child child widget.
+    \param role desired role for child widget.
+    \return true upon success, false on failure.
+*/
+bool HbDocumentLoaderFactory::setWidgetRole(
+    QGraphicsWidget *parent, QGraphicsWidget *child, const QString &role)
+{
+    if (role.isEmpty()) {
+        child->setParentItem(parent);
+        return true;
+    }
+
+    bool success = true;
+
+    switch (findKnownValue(role, widgetRoles, HbWidgetRoleAmount)) {
+    case HbWidgetRoleViewWidget:
+        {
+            HbView *view = qobject_cast<HbView *>(parent);
+            success = (view != 0);
+            if (view) {
+                view->setWidget(child);
+            }
+        }
+        break;
+
+    case HbWidgetRolePopupHeadingWidget:
+        {
+            HbDialog *popup = qobject_cast<HbDialog *>(parent);
+            success = (popup != 0);
+            if (popup) {
+                popup->setHeadingWidget(child);
+            }
+        }
+        break;
+    case HbWidgetRoleGroupBoxContentWidget:
+        {
+            HbGroupBox *groupBox = qobject_cast<HbGroupBox *>(parent);
+            success = (groupBox != 0);
+            if(groupBox) {
+                groupBox->setContentWidget(qobject_cast<HbWidget *>(child));
+            }
+        }
+        break;
+
+    case HbWidgetRolePopupContentWidget:
+        {
+            HbDialog *popup = qobject_cast<HbDialog *>(parent);
+            success = (popup != 0);
+            if (popup) {
+                popup->setContentWidget(child);
+            }
+        }
+        break;
+
+    case HbWidgetRoleViewToolBar:
+        {
+            HbView *view = qobject_cast<HbView *>(parent);
+            success = (view != 0);
+            if (view) {
+                child->setParentItem(parent);
+                view->setToolBar(qobject_cast<HbToolBar *>(child));
+            }
+        }
+        break;
+
+    case HbWidgetRoleViewMenu:
+        {
+            HbView *view = qobject_cast<HbView *>(parent);
+            success = (view != 0);
+            if (view) {
+                view->setMenu(qobject_cast<HbMenu *>(child));
+            }
+        }
+        break;
+
+    case HbWidgetRoleMenuSubmenu:
+        {
+            HbMenu *menu = qobject_cast<HbMenu *>(parent);
+            success = (menu != 0);
+            if (menu) {
+                menu->addMenu(qobject_cast<HbMenu *>(child));
+            }
+        }
+        break;
+
+    case HbWidgetRoleScrollAreaContents:
+        {
+            HbScrollArea *scrollArea = qobject_cast<HbScrollArea *>(parent);
+            success = (scrollArea != 0);
+            if (scrollArea) {
+                scrollArea->setContentWidget(child);
+            }
+        }
+        break;
+
+    case HbWidgetRoleAbstractViewPrototype:
+        {
+            HbAbstractItemView *view = qobject_cast<HbAbstractItemView *>(parent);
+            HbAbstractViewItem *item = qobject_cast<HbAbstractViewItem *>(child);
+            if (view && item) {
+                success = true;
+                view->setItemPrototype(item);
+            } else {
+                success = false;
+            }
+        }
+        break;
+
+    case HbWidgetRoleListViewPrototype:
+        {
+            HbListView *view = qobject_cast<HbListView *>(parent);
+            HbAbstractViewItem * item = qobject_cast<HbAbstractViewItem *>(child);
+            if (view && item) {
+                success = true;
+                view->setItemPrototype(item);
+            } else {
+                success = false;
+            }
+        }
+        break;
+
+    case HbWidgetRoleUnknown:
+    default:
+        success = false;
+        break;
+    }
+
+    return success;
+}
+
+bool HbDocumentLoaderFactory::setObjectRole(
+    QObject *parent, QObject *child, const QString &role)
+{
+    if (role.isEmpty()) {
+        child->setParent(parent);
+        return true;
+    }
+
+    bool success = true;
+
+    switch (findKnownValue(role, objectRoles, HbObjectRoleAmount)) {
+    case HbObjectRoleDialogPrimaryAction:
+        {
+            HbDialog *popup = qobject_cast<HbDialog *>(parent);
+            success = (popup != 0);
+            if (popup) {
+                popup->setPrimaryAction(qobject_cast<HbAction *>(child));
+            }
+        }
+        break;
+
+    case HbObjectRoleDialogSecondaryAction:
+        {
+            HbDialog *popup = qobject_cast<HbDialog *>(parent);
+            success = (popup != 0);
+            if (popup) {
+                popup->setSecondaryAction(qobject_cast<HbAction *>(child));
+            }
+        }
+        break;
+    
+    case HbObjectRoleMenuAction:
+        {
+            HbMenu *menu = qobject_cast<HbMenu *>(parent);
+            success = (menu != 0);
+            if (menu) {
+                menu->addAction(qobject_cast<QAction *>(child));
+            }
+        }
+        break;
+
+    case HbObjectRoleToolBarAction:
+        {
+            HbToolBar *toolBar = qobject_cast<HbToolBar *>(parent);
+            success = (toolBar != 0);
+            if (toolBar) {
+                toolBar->addAction(qobject_cast<HbAction *>(child));
+            }
+        }
+        break;
+
+    case HbObjectRoleUnknown:
+    default:
+        success = false;
+        break;
+    }
+
+    return success;
+}