phoneplugins/infowidgetplugin/infowidgetprovider/infowidget/src/infowidgetlayoutmanager.cpp
changeset 37 ba76fc04e6c2
--- /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. 
+
+