phoneplugins/infowidgetplugin/infowidgetprovider/infowidget/src/infowidgetlayoutmanager.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneplugins/infowidgetplugin/infowidgetprovider/infowidget/src/infowidgetlayoutmanager.cpp Fri Jun 04 10:19:18 2010 +0100
@@ -0,0 +1,564 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+#include "infowidgetlayoutmanager.h"
+#include <QtGlobal>
+#include <QObject>
+#include <QGraphicsWidget>
+#include <hbdocumentloader.h>
+#include <hblabel.h>
+#include <hbmarqueeitem.h>
+#include <hbiconitem.h>
+#include <hbpushbutton.h>
+#include "infowidgetlogging.h"
+
+
+const char INFOWIDGET_DOCML_FILE[] = ":/resource/infowidget.docml";
+
+// Docml widget name mappings
+const char LAYOUT_PREFIX_INFO_DISPLAY[] = "id:";
+const char LAYOUT_PREFIX_SETTINGS_DISPLAY[] = "sd:";
+const char LAYOUT_NAME_CONTENT[] = "content";
+const char LAYOUT_NAME_MCNMARQUEEITEM[] = "mcnMarqueeItem";
+const char LAYOUT_NAME_SPNLABEL[] = "spnLabel";
+const char LAYOUT_NAME_SATMARQUEEITEM[] = "satMarqueeItem";
+const char LAYOUT_NAME_SPNICON[] = "spnIcon";
+const char LAYOUT_NAME_MCNICON[] = "mcnIcon";
+const char LAYOUT_NAME_SATTEXTICON[] = "satTextIcon";
+const char LAYOUT_NAME_SPNCHECKBOX[] = "spnCheckBox";
+const char LAYOUT_NAME_MCNCHECKBOX[] = "mcnCheckBox";
+const char LAYOUT_NAME_SATTEXTCHECKBOX[] = "satTextCheckBox";
+const char LAYOUT_NAME_OKBUTTON[] = "okButton";
+const char LAYOUT_NAME_CONTAINER[] = "container";
+const char LAYOUT_NAME_SETTINGSCONTAINER[] = "settingsContainer";
+
+
+/*!
+ \class InfoWidgetDocumentLoader
+ \brief Custom document loader for Operator info widget
+
+ Derived from HbDocumentLoader.
+
+*/
+
+/*!
+ InfoWidgetDocumentLoader::InfoWidgetDocumentLoader()
+ */
+InfoWidgetDocumentLoader::InfoWidgetDocumentLoader()
+{
+}
+
+/*!
+ InfoWidgetDocumentLoader::createObject()
+ */
+QObject *InfoWidgetDocumentLoader::createObject(
+ const QString &type,
+ const QString &name)
+{
+ DPRINT << ": IN";
+
+ DPRINT << ": type: "<< type;
+ DPRINT << ": name: "<< name;
+
+ if ( type == HbMarqueeItem::staticMetaObject.className() ) {
+ DPRINT << ": HbMarqueeItem";
+ QObject *object = new HbMarqueeItem;
+ object->setObjectName(name);
+ DPRINT << ": HbMarqueeitem found, OUT";
+ return object;
+ }
+
+ DPRINT << ": OUT";
+ return HbDocumentLoader::createObject(type, name);
+}
+
+
+/*!
+ \class InfoWidgetLayoutManager
+ \brief Layout manager class for Operator info widget.
+
+ Handles layout document loading and accessing the loaded
+ widgets.
+
+*/
+
+/*!
+ InfoWidgetLayoutManager::InfoWidgetLayoutManager()
+*/
+InfoWidgetLayoutManager::InfoWidgetLayoutManager(QObject *parent)
+: QObject(parent),
+ m_documentLoader(NULL),
+ m_displayRole(InfoDisplay),
+ m_layoutRows(0)
+{
+ DPRINT << ": IN";
+
+ // Fill supported layout item roles for info display
+ QList<LayoutItemRole> displayWidgetRoles = widgetRoles(InfoDisplay);
+
+ // Try to load all widgets in list by widget role
+ bool loadResult = loadWidgets(InfoDisplay,
+ displayWidgetRoles,
+ m_infoDisplayWidgets);
+ DPRINT << ": info display widget load result: " << loadResult;
+
+ // Fill supported layout item roles for settings display
+ displayWidgetRoles = widgetRoles(SettingsDisplay);
+
+ // Try to load all widgets in list by widget role
+ loadResult = loadWidgets(SettingsDisplay,
+ displayWidgetRoles,
+ m_settingsDisplayWidgets);
+ DPRINT << ": settings display widget load result: " << loadResult;
+
+ DPRINT << ": OUT";
+}
+
+/*!
+ InfoWidgetLayoutManager::~InfoWidgetLayoutManager()
+*/
+InfoWidgetLayoutManager::~InfoWidgetLayoutManager()
+{
+ DPRINT << ": IN";
+
+ if (m_documentLoader) {
+ delete m_documentLoader;
+ }
+
+ DPRINT << ": OUT";
+}
+
+/*!
+ InfoWidgetLayoutManager::destroyObjects()
+
+ Call on destruction for freeing
+ loaded objects. Parent items are deleted
+ causing deletion of corresponding object tree
+*/
+void InfoWidgetLayoutManager::destroyObjects()
+{
+ DPRINT << ": IN";
+
+ // Destroy parent items
+ QGraphicsWidget *contentInfoDisplay =
+ m_infoDisplayWidgets.value(RoleContent);
+ if (contentInfoDisplay) {
+ delete contentInfoDisplay;
+ m_infoDisplayWidgets.clear();
+ }
+
+ QGraphicsWidget *contentSettingsDisplay=
+ m_settingsDisplayWidgets.value(RoleContent);
+ if (contentSettingsDisplay) {
+ delete contentSettingsDisplay;
+ m_settingsDisplayWidgets.clear();
+ }
+
+ DPRINT << ": OUT";
+}
+
+
+/*!
+ InfoWidgetLayoutManager::currentDisplayRole()
+*/
+InfoWidgetLayoutManager::DisplayRole InfoWidgetLayoutManager::currentDisplayRole()
+{
+ DPRINT;
+ return m_displayRole;
+}
+
+/*!
+ InfoWidgetLayoutManager::currentWidgetRoles()
+*/
+QList<InfoWidgetLayoutManager::LayoutItemRole> InfoWidgetLayoutManager::currentWidgetRoles()
+{
+ DPRINT;
+ return m_widgets.keys();
+}
+
+/*!
+ InfoWidgetLayoutManager::layoutRows()
+*/
+int InfoWidgetLayoutManager::layoutRows() const
+{
+ DPRINT;
+ return m_layoutRows;
+}
+
+/*!
+ InfoWidgetLayoutManager::setLayoutRows()
+*/
+void InfoWidgetLayoutManager::setLayoutRows(int rows)
+{
+ DPRINT;
+ m_layoutRows = rows;
+}
+
+/*!
+ InfoWidgetLayoutManager::rowHeight()
+*/
+qreal InfoWidgetLayoutManager::rowHeight() const
+{
+ DPRINT;
+ HbStyle style;
+ qreal rowHeight;
+
+ bool ok = style.parameter("hb-param-graphic-size-primary-small",
+ rowHeight);
+ if (!ok) {
+ DPRINT << ": ERROR! Paremeters reading failed!! Using default";
+ rowHeight = 26.8;
+ }
+
+ DPRINT << ": rowHeight: " << rowHeight;
+ return rowHeight;
+}
+
+/*!
+ InfoWidgetLayoutManager::contentWidget()
+*/
+QGraphicsWidget* InfoWidgetLayoutManager::contentWidget()
+{
+ DPRINT;
+ return getWidget(RoleContent);
+}
+
+/*!
+ InfoWidgetLayoutManager::getWidget();
+*/
+QGraphicsWidget* InfoWidgetLayoutManager::getWidget(LayoutItemRole itemRole)
+{
+ DPRINT << ": item role: " << itemRole;
+
+ QGraphicsWidget *widget = m_widgets.value(itemRole);
+ if (widget) {
+ DPRINT << ": widget: " << widget;
+ }
+
+ return widget;
+}
+
+/*!
+ InfoWidgetLayoutManager::removeWidget();
+*/
+void InfoWidgetLayoutManager::removeWidget(LayoutItemRole itemRole)
+{
+ DPRINT << ": item role: " << itemRole;
+
+ QGraphicsWidget *widget = m_widgets.value(itemRole);
+ if (widget) {
+ DPRINT << ": removing widget: " << widget;
+ m_widgets.remove(itemRole);
+ delete widget;
+ }
+}
+
+/*!
+ InfoWidgetLayoutManager::hideWidget();
+*/
+void InfoWidgetLayoutManager::hideWidget(LayoutItemRole itemRole)
+{
+ DPRINT << ": item role: " << itemRole;
+
+ QGraphicsWidget *widget = m_widgets.value(itemRole);
+ if (widget) {
+ DPRINT << ": hiding widget: " << widget;
+ widget->hide();
+ }
+}
+
+/*!
+ InfoWidgetLayoutManager::hideAll();
+*/
+void InfoWidgetLayoutManager::hideAll()
+{
+ DPRINT << ": IN";
+
+ QMapIterator<LayoutItemRole, QGraphicsWidget *> iterator(m_widgets);
+ while (iterator.hasNext()) {
+ iterator.next();
+ QGraphicsWidget *widget = iterator.value();
+ if (widget) {
+ widget->hide();
+ }
+ }
+
+ DPRINT << ": OUT";
+}
+
+/*!
+ InfoWidgetLayoutManager::showAll();
+*/
+void InfoWidgetLayoutManager::showAll()
+{
+ DPRINT << ": IN";
+
+ QMapIterator<LayoutItemRole, QGraphicsWidget *> iterator(m_widgets);
+ while (iterator.hasNext()) {
+ iterator.next();
+ QGraphicsWidget *widget = iterator.value();
+ if (widget) {
+ widget->show();
+ }
+ }
+
+ DPRINT << ": OUT";
+}
+
+/*!
+ InfoWidgetLayoutManager::layoutInfoDisplay()
+*/
+QGraphicsLayout* InfoWidgetLayoutManager::layoutInfoDisplay()
+{
+ DPRINT << ": IN";
+
+ hideAll();
+
+ m_displayRole = InfoDisplay;
+ m_widgets = m_infoDisplayWidgets;
+
+ QGraphicsLayout *activeLayout(NULL);
+ DPRINT << ": getting content item and using its layout for activeLayout";
+ QGraphicsWidget *content = getWidget(RoleContent);
+ if (content) {
+ DPRINT << ": content found, getting layout";
+ activeLayout = content->layout();
+ }
+
+ DPRINT << ": OUT";
+ return activeLayout;
+}
+
+/*!
+ InfoWidgetLayoutManager::layoutSettingsDisplay()
+*/
+QGraphicsLayout* InfoWidgetLayoutManager::layoutSettingsDisplay()
+{
+ DPRINT << ": IN";
+
+ hideAll();
+
+ m_displayRole = SettingsDisplay;
+ m_widgets = m_settingsDisplayWidgets;
+
+ QGraphicsLayout *activeLayout(NULL);
+ DPRINT << ": getting content item and using its layout for activeLayout";
+ QGraphicsWidget *content = getWidget(RoleContent);
+ if (content) {
+ DPRINT << ": content found, getting layout";
+ activeLayout = content->layout();
+ }
+
+ DPRINT << ": OUT";
+ return activeLayout;
+}
+
+/*!
+ InfoWidgetLayoutManager::loadWidgets()
+*/
+bool InfoWidgetLayoutManager::loadWidgets(const DisplayRole displayRole,
+ const QList<LayoutItemRole> &displayWidgets,
+ QMap<LayoutItemRole, QGraphicsWidget *> &widgetMap)
+{
+ DPRINT << ": IN";
+ bool loadResult(false);
+
+ // Cleanup previously loaded content in case of any data
+ widgetMap.clear();
+
+ if (!m_documentLoader) {
+ m_documentLoader = new InfoWidgetDocumentLoader;
+ }
+ Q_ASSERT(m_documentLoader);
+
+ bool loaded = false;
+ m_documentLoader->load(INFOWIDGET_DOCML_FILE, &loaded);
+
+ Q_ASSERT_X(loaded,
+ "InfoWidgetLayoutManager",
+ "Invalid docml file");
+
+ DPRINT << ": document " << INFOWIDGET_DOCML_FILE << " loaded successfully";
+
+ QGraphicsWidget *widget(NULL);
+ LayoutItemRole currentWidgetRole;
+
+ foreach (currentWidgetRole, displayWidgets) {
+ DPRINT << ": iterating displayWidgets, current role: " << static_cast<int>(currentWidgetRole);
+
+ widget = loadWidget(*m_documentLoader, displayRole, currentWidgetRole);
+ if (widget) {
+ DPRINT << ": widget found, inserting to widget map";
+ widgetMap.insert(currentWidgetRole, widget);
+ widget = NULL;
+ } else {
+ DCRITICAL << ": ERROR, widget not found!";
+ }
+ }
+
+ if (widgetMap.count() == displayWidgets.count()) {
+ DPRINT << ": all widgets loaded";
+ loadResult = true;
+ } else {
+ DCRITICAL << ": error, all widgets were not loaded";
+ }
+
+ DPRINT << ": OUT";
+ return loadResult;
+}
+
+/*!
+ InfoWidgetLayoutManager::reloadWidgets()
+*/
+bool InfoWidgetLayoutManager::reloadWidgets(const DisplayRole displayRole)
+{
+ QList<LayoutItemRole> displayWidgetRoles = widgetRoles(displayRole);
+ bool loadResult(false);
+
+ switch (displayRole) {
+ case InfoDisplay:
+ loadResult = loadWidgets(displayRole,
+ displayWidgetRoles,
+ m_infoDisplayWidgets);
+ break;
+ case SettingsDisplay: // Fall through
+ default:
+ break;
+ }
+ return loadResult;
+}
+
+/*!
+ InfoWidgetLayoutManager::loadWidget()
+
+ Initialize loader with corresponding document file before calling this single widget loader utility
+*/
+QGraphicsWidget* InfoWidgetLayoutManager::loadWidget(InfoWidgetDocumentLoader &loader,
+ DisplayRole displayRole,
+ LayoutItemRole widgetRole)
+{
+ DPRINT << ": IN";
+
+ QString widgetPrefix;
+ if (displayRole == InfoDisplay) {
+ widgetPrefix = LAYOUT_PREFIX_INFO_DISPLAY;
+ } else if (displayRole == SettingsDisplay) {
+ widgetPrefix = LAYOUT_PREFIX_SETTINGS_DISPLAY;
+ }
+
+ QGraphicsWidget *widget(NULL);
+ QString widgetName = widgetPrefix;
+
+ switch (widgetRole)
+ {
+ case RoleContent:
+ widgetName.append(LAYOUT_NAME_CONTENT);
+ break;
+ case RoleMcnMarqueeItem:
+ widgetName.append(LAYOUT_NAME_MCNMARQUEEITEM);
+ break;
+ case RoleSpnLabel:
+ widgetName.append(LAYOUT_NAME_SPNLABEL);
+ break;
+ case RoleSatMarqueeItem:
+ widgetName.append(LAYOUT_NAME_SATMARQUEEITEM);
+ break;
+ case RoleSpnIcon:
+ widgetName.append(LAYOUT_NAME_SPNICON);
+ break;
+ case RoleMcnIcon:
+ widgetName.append(LAYOUT_NAME_MCNICON);
+ break;
+ case RoleSatTextIcon:
+ widgetName.append(LAYOUT_NAME_SATTEXTICON);
+ break;
+ case RoleSpnCheckBox:
+ widgetName.append(LAYOUT_NAME_SPNCHECKBOX);
+ break;
+ case RoleMcnCheckBox:
+ widgetName.append(LAYOUT_NAME_MCNCHECKBOX);
+ break;
+ case RoleSatTextCheckBox:
+ widgetName.append(LAYOUT_NAME_SATTEXTCHECKBOX);
+ break;
+ case RoleOkButton:
+ widgetName.append(LAYOUT_NAME_OKBUTTON);
+ break;
+ case RoleContainer:
+ widgetName.append(LAYOUT_NAME_CONTAINER);
+ break;
+ case RoleSettingsContainer:
+ widgetName.append(LAYOUT_NAME_SETTINGSCONTAINER);
+ break;
+
+ case RoleUndefined: // Fall through
+ default:
+ break;
+ }
+
+ widget = qobject_cast<QGraphicsWidget *>(loader.findWidget(widgetName));
+ if (!widget) {
+ DCRITICAL << ": ERROR, widget " << widgetName << " not found!";
+ }
+
+ DPRINT << ": OUT";
+ return widget;
+}
+
+/*!
+ InfoWidgetLayoutManager::widgetRoles()
+
+ Returns supported widget roles for specific display
+*/
+const QList<InfoWidgetLayoutManager::LayoutItemRole> InfoWidgetLayoutManager::widgetRoles(
+ DisplayRole displayRole) const
+{
+ DPRINT << ": IN";
+
+ QList<LayoutItemRole> widgetRoles;
+
+ // Fill supported layout item roles for specific display
+ switch (displayRole) {
+ case SettingsDisplay:
+ widgetRoles.append(RoleContent);
+ widgetRoles.append(RoleSpnCheckBox);
+ widgetRoles.append(RoleMcnCheckBox);
+ widgetRoles.append(RoleSatTextCheckBox);
+ widgetRoles.append(RoleOkButton);
+ widgetRoles.append(RoleSettingsContainer);
+ break;
+ case InfoDisplay:
+ widgetRoles.append(RoleContent);
+ widgetRoles.append(RoleSpnIcon);
+ widgetRoles.append(RoleSpnLabel);
+ widgetRoles.append(RoleMcnIcon);
+ widgetRoles.append(RoleMcnMarqueeItem);
+ widgetRoles.append(RoleSatTextIcon);
+ widgetRoles.append(RoleSatMarqueeItem);
+ break;
+ default:
+ break;
+ }
+
+ DPRINT << ": widgetRoles.count() : " << widgetRoles.count();
+ DPRINT << ": OUT";
+ return widgetRoles;
+}
+
+// End of File.
+
+