src/hbutils/document/hbdocumentloadersyntax_p.cpp
changeset 0 16d8024aca5e
child 1 f7ac710697a9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbutils/document/hbdocumentloadersyntax_p.cpp	Mon Apr 19 14:02:13 2010 +0300
@@ -0,0 +1,1133 @@
+/****************************************************************************
+**
+** 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 "hbdocumentloadersyntax_p.h"
+#include "hbdocumentloaderactions_p.h"
+#include "hbdocumentloader_p.h"
+#include "hbdocumentloader.h"
+
+#include <hbicon.h>
+#include <hbfontspec.h>
+#include <QDebug>
+#include <QMetaEnum>
+
+#include <QTranslator>
+#include <hbmainwindow.h>
+
+
+// Document loader version number
+#define VERSION_MAJOR 1
+#define VERSION_MINOR 0
+
+#define MIN_SUPPORTED_VERSION_MAJOR 0
+#define MIN_SUPPORTED_VERSION_MINOR 1
+
+/*
+    \class HbDocumentLoaderSyntax
+    \internal
+    \proto
+*/
+
+HbDocumentLoaderSyntax::HbDocumentLoaderSyntax( HbDocumentLoaderActions *actions, const HbMainWindow *window )
+: HbXmlLoaderAbstractSyntax( actions ), mRealActions( actions ), mMainWindow(window)
+{
+}
+
+HbDocumentLoaderSyntax::~HbDocumentLoaderSyntax()
+{
+}
+
+bool HbDocumentLoaderSyntax::load( QIODevice *device, const QString &section )
+{
+    mCurrentProfile = HbDeviceProfile::profile(mMainWindow);
+    return HbXmlLoaderAbstractSyntax::loadDevice( device, section );
+}
+
+bool HbDocumentLoaderSyntax::readLayoutStartItem()
+{
+    bool result = false;
+    switch( mCurrentLayoutType ) {
+        case LAYOUT_ANCHOR:
+        {
+            HB_DOCUMENTLOADER_PRINT( "GENERAL LAYOUT START ITEM: ANCHOR ITEM" );
+            if( mReader.name() == lexemValue( AL_ANCHOR ) ) {
+
+                const QString src = attribute( AL_SRC_NAME );
+                const QString dst = attribute( AL_DST_NAME );
+                const QString srcEdge = attribute( AL_SRC_EDGE );
+                const QString dstEdge = attribute( AL_DST_EDGE );
+                const QString spacing = attribute( AL_SPACING );
+                const QString spacer = attribute( AL_SPACER );
+                qreal spacingVal = 0;
+                result = true;
+                if( !spacing.isEmpty() ) {
+                    result = toPixels( spacing, spacingVal );
+                }
+                if (result) {
+                    result = mRealActions->addAnchorLayoutEdge( src, srcEdge, dst, dstEdge, spacingVal, spacer );
+                }
+            }
+            break;
+        }
+        case LAYOUT_GRID:
+        {
+            HB_DOCUMENTLOADER_PRINT( "GENERAL LAYOUT START ITEM: GRID ITEM" );
+            if( mReader.name() == lexemValue( GL_GRIDCELL ) ) {
+
+                const QString src = attribute( GL_ITEMNAME );
+
+                const QString row = attribute( GL_ROW );
+                const QString column = attribute( GL_COLUMN );
+                const QString rowspan = attribute( GL_ROWSPAN );
+                const QString columnspan = attribute( GL_COLUMNSPAN );
+                const QString alignment = attribute( TYPE_ALIGNMENT );
+                result = mRealActions->addGridLayoutCell( src, row, column, rowspan, columnspan, alignment );
+            } else if( mReader.name() == lexemValue( GL_GRIDROW ) ) {
+                const QString row = attribute( GL_ROW );
+                const QString stretchfactor = attribute( ATTR_STRETCHFACTOR );
+                const QString alignment = attribute( TYPE_ALIGNMENT );
+                result = mRealActions->setGridLayoutRowProperties( row, stretchfactor, alignment );
+                if (result) {
+                    result = processRowHeights( row );
+                }
+            } else if( mReader.name() == lexemValue( GL_GRIDCOLUMN ) ) {
+                const QString column = attribute( GL_COLUMN );
+                const QString stretchfactor = attribute( ATTR_STRETCHFACTOR );
+                const QString alignment = attribute( TYPE_ALIGNMENT );
+                result = mRealActions->setGridLayoutColumnProperties( column, stretchfactor, alignment );
+                if (result) {
+                    result = processColumnWidths( column );
+                }
+            } else if( mReader.name() == lexemValue( TYPE_CONTENTSMARGINS ) ) {
+                result = processContentsMargins();
+            }
+            break;
+        }
+        case LAYOUT_LINEAR:
+        {
+            HB_DOCUMENTLOADER_PRINT( "GENERAL LAYOUT START ITEM: LINEAR ITEM" );
+            if( mReader.name() == lexemValue( LL_LINEARITEM ) ) {
+                result = true;
+                const QString index = attribute( LL_INDEX );
+                const QString itemname = attribute( LL_ITEMNAME );
+                const QString spacing = attribute( LL_SPACING );
+                const QString stretchfactor = attribute( ATTR_STRETCHFACTOR );
+                const QString alignment = attribute( TYPE_ALIGNMENT );
+                
+                qreal spacingValue(0);
+                qreal *spacingPtr(0);
+                if( !spacing.isEmpty() ) {
+                    result = toPixels( spacing, spacingValue );
+                    spacingPtr = &spacingValue;
+                }
+                if (result) {
+                    result = mRealActions->addLinearLayoutItem( itemname, index, stretchfactor, alignment, spacingPtr );
+                }
+            } else if( mReader.name() == lexemValue( LL_STRETCH ) ) {
+                const QString index = attribute( LL_INDEX );
+                const QString stretchfactor = attribute( ATTR_STRETCHFACTOR );
+
+                result = mRealActions->addLinearLayoutStretch( index, stretchfactor );
+            } else if( mReader.name() == lexemValue( TYPE_CONTENTSMARGINS ) ) {
+                result = processContentsMargins();
+            }
+            break;
+        }
+        case LAYOUT_STACK:
+        {
+            HB_DOCUMENTLOADER_PRINT( "GENERAL LAYOUT START ITEM: STACK ITEM" );
+            if( mReader.name() == lexemValue( SL_STACKITEM ) ) {
+
+                const QString index = attribute( SL_INDEX );
+                const QString itemname = attribute( SL_ITEMNAME );
+
+                result =  mRealActions->addStackedLayoutItem( itemname, index );
+            }
+            break;
+
+        }
+        case LAYOUT_NULL:
+        {
+            HB_DOCUMENTLOADER_PRINT( "GENERAL LAYOUT START ITEM: NULL ITEM (MUST NOT EXIST)" );
+            break;
+        }
+        default:
+        {
+            qWarning() << "Internal error, wrong layout type, line " << mReader.lineNumber();
+        }
+    }
+    return result;
+}
+
+bool HbDocumentLoaderSyntax::processContentsMargins()
+{
+    const QString leftS = attribute( ATTR_LEFT );
+    const QString topS = attribute( ATTR_TOP );
+    const QString rightS = attribute( ATTR_RIGHT );
+    const QString bottomS = attribute( ATTR_BOTTOM );
+
+    bool result = true;
+    qreal left = 0, top = 0, right = 0, bottom = 0;
+    if ( !leftS.isEmpty() ) {
+        result = toPixels(leftS, left);
+    }
+    if ( result && !topS.isEmpty() ) {
+        result = toPixels(topS, top);
+    }
+    if ( result && !rightS.isEmpty() ) {
+        result = toPixels(rightS, right);
+    }
+    if ( result && !bottomS.isEmpty() ) {
+        result = toPixels(bottomS, bottom);
+    }
+
+    if ( result ) {
+        result = mRealActions->setLayoutContentsMargins( left, top, right, bottom );
+    }
+
+    if (!result) {
+        qWarning() << "Invalid contents margins, line " << mReader.lineNumber();
+    }
+
+    return result;
+}
+
+bool HbDocumentLoaderSyntax::processRowHeights( const QString &row )
+{
+    const QString minHeightS = attribute( GL_MINHEIGHT );
+    const QString maxHeightS = attribute( GL_MAXHEIGHT );
+    const QString prefHeightS = attribute( GL_PREFHEIGHT );
+    const QString fixedHeightS = attribute( GL_FIXEDHEIGHT );
+    const QString rowSpacingS = attribute( GL_SPACING );
+    qreal minHeight = -1;
+    qreal maxHeight = -1;
+    qreal prefHeight = -1;
+    qreal fixedHeight = -1;
+    qreal rowSpacing = -1;
+
+    bool result = true;
+    int propertyAvailable = 0;
+
+    if ( !minHeightS.isEmpty() ) {
+        result = toPixels(minHeightS, minHeight);
+        propertyAvailable |= HbDocumentLoaderActions::propertyMin;
+    }
+
+    if ( result && !maxHeightS.isEmpty() ) {
+        result = toPixels(maxHeightS, maxHeight);
+        propertyAvailable |= HbDocumentLoaderActions::propertyMax;
+    }
+
+    if ( result && !prefHeightS.isEmpty() ) {
+        result = toPixels(prefHeightS, prefHeight);
+        propertyAvailable |= HbDocumentLoaderActions::propertyPref;
+    }
+
+    if ( result && !fixedHeightS.isEmpty() ) {
+        result = toPixels(fixedHeightS, fixedHeight);
+        propertyAvailable |= HbDocumentLoaderActions::propertyFixed;
+    }
+
+    if ( result && !rowSpacingS.isEmpty() ) {
+        result = toPixels(rowSpacingS, rowSpacing);
+        propertyAvailable |= HbDocumentLoaderActions::propertySpacing;
+    }
+
+    if ( result && propertyAvailable ) {
+        result = mRealActions->setGridLayoutRowHeights( row, minHeight, maxHeight, 
+                                                        prefHeight, fixedHeight, 
+                                                        rowSpacing, propertyAvailable);
+    }
+
+    return result;
+}
+
+bool HbDocumentLoaderSyntax::processColumnWidths( const QString &column )
+{
+    const QString minWidthS = attribute( GL_MINWIDTH );
+    const QString maxWidthS = attribute( GL_MAXWIDTH );
+    const QString prefWidthS = attribute( GL_PREFWIDTH );
+    const QString fixedWidthS = attribute( GL_FIXEDWIDTH );
+    const QString columnSpacingS = attribute( GL_SPACING );
+    qreal minWidth = -1;
+    qreal maxWidth = -1;
+    qreal prefWidth = -1;
+    qreal fixedWidth = -1;
+    qreal columnSpacing = -1;
+
+    bool result = true;
+    int propertyAvailable = 0;
+
+    if ( !minWidthS.isEmpty() ) {
+        result = toPixels(minWidthS, minWidth);
+        propertyAvailable |= HbDocumentLoaderActions::propertyMin;
+    }
+
+    if ( result && !maxWidthS.isEmpty() ) {
+        result = toPixels(maxWidthS, maxWidth);
+        propertyAvailable |= HbDocumentLoaderActions::propertyMax;
+    }
+
+    if ( result && !prefWidthS.isEmpty() ) {
+        result = toPixels(prefWidthS, prefWidth);
+        propertyAvailable |= HbDocumentLoaderActions::propertyPref;
+    }
+
+    if ( result && !fixedWidthS.isEmpty() ) {
+        result = toPixels(fixedWidthS, fixedWidth);
+        propertyAvailable |= HbDocumentLoaderActions::propertyFixed;
+    }
+
+    if ( result && !columnSpacingS.isEmpty() ) {
+        result = toPixels(columnSpacingS, columnSpacing);
+        propertyAvailable |= HbDocumentLoaderActions::propertySpacing;
+    }
+
+    if ( result && propertyAvailable ) {
+        result = mRealActions->setGridLayoutColumnWidths( column, minWidth, maxWidth, 
+                                                          prefWidth, fixedWidth, 
+                                                          columnSpacing, propertyAvailable);
+    }
+
+    return result;
+}
+
+bool HbDocumentLoaderSyntax::readContainerStartItem()
+{
+    bool result = false;
+    switch ( mCurrentElementType ) {
+         case PROPERTY:
+         {
+            HB_DOCUMENTLOADER_PRINT( "CONTAINER START ITEM: PROPERTY" );
+
+            switch( mCurrentContainerType ) {
+                case CONTAINER_STRINGLIST:
+                {
+                    // check that we are only trying to put strings into a string list
+
+                    HB_DOCUMENTLOADER_PRINT( "GENERAL CONTAINER START ITEM: STRING LIST" );
+                    if( mReader.name() == lexemValue( TYPE_STRING )
+                        || mReader.name() == lexemValue( TYPE_ENUMS )
+                        || mReader.name() == lexemValue( TYPE_LOCALIZED_STRING ) ) {
+                        result = processContainedProperty();
+                        }
+                    break;
+                }
+                case CONTAINER_NULL:
+                {
+                    HB_DOCUMENTLOADER_PRINT( "GENERAL CONTAINER START ITEM: NULL ITEM (MUST NOT EXIST)" );
+                    break;
+                }
+                default:
+                {
+                    qWarning() << "Internal error, wrong container type, line " << mReader.lineNumber();
+                    break;
+                }
+            }
+            break;
+         }
+         default:
+         {
+             break;
+         }
+    }
+
+    return result;
+}
+
+bool HbDocumentLoaderSyntax::readContainerEndItem()
+{
+    bool result = false;
+    QString currentPropertyName;
+    QVariant variant;
+
+    switch( mCurrentElementType ) {
+        case CONTAINER:
+        {
+            currentPropertyName = mCurrentContainer.back();
+            mCurrentContainer.removeLast();
+
+            if (mRealActions->mCurrentContainer) {
+                // in order for the conversion to work, all of the contained types need to be suitable and equivalent, e.g. strings
+                QVariant variantContainer = QVariant(*(mRealActions->mCurrentContainer));
+                if (variantContainer.isValid()) {
+                    switch(mCurrentContainerType) {
+                        case CONTAINER_STRINGLIST:
+                        {
+                            QStringList list = variantContainer.toStringList();
+                            variant = QVariant(list);
+                            break;
+                        }
+                        default:
+                        {
+                            variant = variantContainer;
+                            break;
+                        }
+                    }
+                }
+            }
+
+            result = mRealActions->pushProperty(currentPropertyName, variant);
+
+            HB_DOCUMENTLOADER_PRINT( "CONTAINER END ITEM : SWITCHING TO GENERAL ITEM PROCESSING MODE" );
+            mElementState = ES_GENERAL_ITEM;
+
+            result = true;
+            break;
+        }
+        default:
+        {
+            result = HbXmlLoaderAbstractSyntax::readGeneralEndItem();
+            break;
+        }
+    }
+    return result;
+}
+
+bool HbDocumentLoaderSyntax::readGeneralStartItem()
+{
+    bool result = false;
+    switch( mCurrentElementType ) {
+         case OBJECT:
+         {
+            HB_DOCUMENTLOADER_PRINT( "GENERAL START ITEM: OBJECT" );
+            result = processObject();
+            break;
+         }
+         case WIDGET:
+         {
+            HB_DOCUMENTLOADER_PRINT( "GENERAL START ITEM: WIDGET" );
+            result = processWidget();
+            break;
+         }
+         case SPACERITEM:
+         {
+            HB_DOCUMENTLOADER_PRINT( "GENERAL START ITEM: SPACERITEM" );
+            result = processSpacerItem();
+            break;
+         }
+         case CONNECT:
+         {
+            HB_DOCUMENTLOADER_PRINT( "GENERAL START ITEM: CONNECT" );
+            result = processConnect();
+            break;
+         }
+         case PROPERTY:
+         {
+            HB_DOCUMENTLOADER_PRINT( "GENERAL START ITEM: PROPERTY" );
+            result = processProperty();
+            break;
+         }
+         case REF:
+         {
+            HB_DOCUMENTLOADER_PRINT( "GENERAL START ITEM: REF" );
+            result = processRef();
+            break;
+         }
+         case VARIABLE:
+         {
+            HB_DOCUMENTLOADER_PRINT( "GENERAL START ITEM: VARIABLE" );
+            result = processVariable();
+            break;
+         }
+         case DEPRECATED:
+         {
+             HB_DOCUMENTLOADER_PRINT( "GENERAL START ITEM: DEPRECATED" );
+             result = true;
+             break;
+         }
+         default:
+         {
+              result = HbXmlLoaderAbstractSyntax::readGeneralStartItem();
+         }
+    }
+    return result;
+}
+
+bool HbDocumentLoaderSyntax::processDocument()
+{
+    bool ok, ok1, ok2, res = true;
+
+    QString ver_str =  attribute( ATTR_VERSION );
+
+    ver_str.toDouble( &ok );
+    QStringList ver = ver_str.split( '.' );
+
+    if( ( !ok ) || ( ver.size() != 2 ) ) {
+        qWarning() << "Wrong document version format " << mReader.lineNumber();
+        return false;
+    }
+
+    int major = ver.at(0).toInt( &ok1 );
+    int minor = ver.at(1).toInt( &ok2 );
+
+    if( ( !ok1 ) || ( !ok2 ) ) {
+        qWarning() << "Wrong document version format " << mReader.lineNumber();
+        return false;
+    }
+
+
+    if( ( major > VERSION_MAJOR ) || ( major < MIN_SUPPORTED_VERSION_MAJOR ) ) {
+        res = false;
+    } else if( ( ( major == VERSION_MAJOR ) && ( minor > VERSION_MINOR )  ) ||
+               ( ( major == MIN_SUPPORTED_VERSION_MAJOR ) && ( minor < MIN_SUPPORTED_VERSION_MINOR ) ) ) {
+        res = false;
+    }
+
+    if( ! res ) {
+        qWarning() << "Not supported document version " + ver_str + ". Current parser version is: " + version();
+        return false;
+
+    }
+    return mRealActions->pushDocument( attribute( ATTR_CONTEXT ) );
+}
+
+bool HbDocumentLoaderSyntax::processObject()
+{
+    const QString type = attribute( ATTR_TYPE );
+    const QString name = attribute( ATTR_NAME );
+
+    if( !mRealActions->pushObject( type, name ) ) {
+        qWarning() << "Error in object processing, line " << mReader.lineNumber();
+        return false;
+    }
+    return true;
+}
+
+bool HbDocumentLoaderSyntax::processWidget()
+{
+    const QString type = attribute( ATTR_TYPE );
+    const QString name = attribute( ATTR_NAME );
+    const QString role = attribute( ATTR_ROLE );
+    const QString plugin = attribute( ATTR_PLUGIN );
+    if( !mRealActions->pushWidget( type, name, role, plugin) ) {
+        qWarning() << "Error in widget processing, line " << mReader.lineNumber();
+        return false;
+    }
+    return true;
+}
+
+bool HbDocumentLoaderSyntax::processSpacerItem()
+{
+    const QString name = attribute( ATTR_NAME );
+    const QString widget = attribute( ATTR_WIDGET );
+
+    if( !mRealActions->pushSpacerItem( name, widget ) ) {
+        qWarning() << "Error in object processing, line " << mReader.lineNumber();
+        return false;
+    }
+    return true;
+}
+
+bool HbDocumentLoaderSyntax::processLayout()
+{
+    bool result = false;
+    const QString layout_type = attribute( ATTR_TYPE );
+    const QString widget = attribute( ATTR_WIDGET );
+
+    if( layout_type == lexemValue( LAYOUT_ANCHOR ) ) {
+
+        mCurrentLayoutType = LAYOUT_ANCHOR;
+        result = mRealActions->createAnchorLayout( widget );
+
+    } else if( layout_type == lexemValue( LAYOUT_GRID ) ) {
+
+        result = true;
+        mCurrentLayoutType = LAYOUT_GRID;
+        const QString spacing = attribute( GL_SPACING );
+        qreal spacingValue(0);
+        qreal *spacingPtr(0);
+        if( !spacing.isEmpty() ) {
+            result = toPixels( spacing, spacingValue );
+            spacingPtr = &spacingValue;
+        }
+        if (result) {
+            result = mRealActions->createGridLayout( widget, spacingPtr );
+        }
+
+    } else if( layout_type == lexemValue( LAYOUT_LINEAR ) ) {
+
+        result = true;
+        mCurrentLayoutType = LAYOUT_LINEAR;
+        const QString orientation = attribute( LL_ORIENTATION );
+        const QString spacing = attribute( LL_SPACING );
+        qreal spacingValue(0);
+        qreal *spacingPtr(0);
+        if( !spacing.isEmpty() ) {
+            result = toPixels( spacing, spacingValue );
+            spacingPtr = &spacingValue;
+        }
+        if (result) {
+            result = mRealActions->createLinearLayout( widget, orientation, spacingPtr );
+        }
+
+    } else if( layout_type == lexemValue( LAYOUT_STACK ) ) {
+
+        mCurrentLayoutType = LAYOUT_STACK;
+        result = mRealActions->createStackedLayout( widget );
+
+    } else if( layout_type == lexemValue( LAYOUT_NULL ) ) {
+
+        mCurrentLayoutType = LAYOUT_NULL;
+        result = mRealActions->createNullLayout( widget );
+
+    } else {
+        return HbXmlLoaderAbstractSyntax::processLayout();
+    }
+
+    if( !result ) {
+        qWarning() << "Unable to create layout, line " << mReader.lineNumber();
+        return false;
+    }
+    return true;
+}
+
+bool HbDocumentLoaderSyntax::processConnect()
+{
+    const QString srcName = attribute( ATTR_SRC );
+    const QString signalName = attribute( ATTR_SIGNAL );
+    const QString dstName = attribute( ATTR_DST );
+    const QString slotName = attribute( ATTR_SLOT );
+
+    if( !mRealActions->pushConnect( srcName, signalName, dstName, slotName ) ) {
+        qWarning() << "Error in connect processing, line " << mReader.lineNumber();
+        return false;
+
+    }
+    return true;
+}
+
+bool HbDocumentLoaderSyntax::processContainer()
+{
+    bool result = false;
+    const QString container_type = attribute( ATTR_TYPE );
+
+    if( container_type == lexemValue( CONTAINER_STRINGLIST ) ) {
+
+        mCurrentContainerType = CONTAINER_STRINGLIST;
+
+        const QString propertyName = attribute ( ATTR_NAME );
+        mCurrentContainer << propertyName;
+        result = mRealActions->createContainer();
+
+    } else {
+        return HbXmlLoaderAbstractSyntax::processContainer();
+    }
+
+    if( !result ) {
+        qWarning() << "Unable to create container, line " << mReader.lineNumber();
+        return false;
+    }
+    return true;
+}
+
+bool HbDocumentLoaderSyntax::processContainedProperty()
+{
+    const QVariant value = decodeValue();
+    if( ! value.isValid() ) {
+        qWarning() << "Invalid property, line " << mReader.lineNumber();
+        return false;
+    }
+
+    if( !mRealActions->appendPropertyToContainer( value ) ) {
+        qWarning() << "Unable to set property, line " << mReader.lineNumber();
+        return false;
+    }
+    return true;
+}
+
+bool HbDocumentLoaderSyntax::processProperty()
+{
+    const QVariant value = decodeValue();
+    if( ! value.isValid() ) {
+        qWarning() << "Invalid property, line " << mReader.lineNumber();
+        return false;
+    }
+
+    const QString propertyName = attribute( ATTR_NAME );
+
+    if( !mRealActions->pushProperty( propertyName, value ) ) {
+        qWarning() << "Unable to set property, line " << mReader.lineNumber();
+        return false;
+    }
+    return true;
+}
+
+bool HbDocumentLoaderSyntax::processRef()
+{
+    const QString objectName = attribute( ATTR_OBJECT );
+    const QString role = attribute( ATTR_ROLE );
+
+    if( !mRealActions->pushRef( objectName, role ) ) {
+        qWarning() << "Error in reference processing, line " << mReader.lineNumber();
+        return false;
+    }
+    return true;
+}
+
+static bool convertSizePolicy_Policy( const QString& policyS, QSizePolicy::Policy *&policy )
+{
+    if ( policyS.isEmpty() ) {
+        return false;
+    }
+
+    const QMetaObject *meta = &QSizePolicy::staticMetaObject;
+    const int enumIndex = meta->indexOfEnumerator("Policy");
+    Q_ASSERT( enumIndex != -1 );
+    QMetaEnum metaEnum = meta->enumerator(enumIndex);
+    const QByteArray byteArray = policyS.toUtf8();
+    const int policyI = metaEnum.keyToValue(byteArray.data());
+
+    if ( policyI == -1 ) {
+        return false;
+    }
+
+    policy = (QSizePolicy::Policy *)new int(policyI);
+    return true;
+}
+
+bool HbDocumentLoaderSyntax::processVariable()
+{
+    bool result = false;
+    const QString type = mReader.name().toString();
+
+    if( type == lexemValue( TYPE_CONTENTSMARGINS ) ) {
+
+        const QString leftS = attribute( ATTR_LEFT );
+        const QString topS = attribute( ATTR_TOP );
+        const QString rightS = attribute( ATTR_RIGHT );
+        const QString bottomS = attribute( ATTR_BOTTOM );
+
+        result = true;
+        qreal left = 0, top = 0, right = 0, bottom = 0;
+        if ( !leftS.isEmpty() ) {
+            result = toPixels(leftS, left);
+        }
+        if ( result && !topS.isEmpty() ) {
+            result = toPixels(topS, top);
+        }
+        if ( result && !rightS.isEmpty() ) {
+            result = toPixels(rightS, right);
+        }
+        if ( result && !bottomS.isEmpty() ) {
+            result = toPixels(bottomS, bottom);
+        }
+
+        if ( result ) {
+            result = mRealActions->setContentsMargins( left, top, right, bottom );
+        }
+
+        if (!result) {
+            qWarning() << "Invalid contents margins, line " << mReader.lineNumber();
+        }
+
+    } else if ( type == lexemValue( TYPE_SIZEPOLICY ) ) {
+        const QString horizontalPolicyS = attribute( ATTR_HORIZONTALPOLICY );
+        const QString verticalPolicyS = attribute( ATTR_VERTICALPOLICY );
+        const QString horizontalStretchS = attribute( ATTR_HORIZONTALSTRETCH );
+        const QString verticalStretchS = attribute( ATTR_VERTICALSTRETCH );
+
+        result = true;
+
+        QSizePolicy::Policy *hPol = 0;
+        if ( !horizontalPolicyS.isEmpty() ) {
+            result = convertSizePolicy_Policy( horizontalPolicyS, hPol );
+        }
+
+        QSizePolicy::Policy *vPol = 0;
+        if ( result && !verticalPolicyS.isEmpty() ) {
+            result = convertSizePolicy_Policy( verticalPolicyS, vPol );
+        }
+
+        int *hStretch = 0;
+        if ( result && !horizontalStretchS.isEmpty() ) {
+            const int intValue = horizontalStretchS.toInt( &result );
+            if ( result ) {
+                if ( intValue >= 0 && intValue < 256 ) {
+                    hStretch = new int( intValue );
+                } else {
+                    result = false;
+                }
+            }
+        }
+
+        int *vStretch = 0;
+        if ( result && !verticalStretchS.isEmpty() ) {
+            const int intValue = verticalStretchS.toInt( &result );
+            if ( result ) {
+                if ( intValue >= 0 && intValue < 256 ) {
+                    vStretch = new int( intValue );
+                } else {
+                    result = false;
+                }
+            }
+        }
+
+        if ( result ) {
+            result = mRealActions->setSizePolicy( hPol, vPol, hStretch, vStretch );
+        }
+        delete hPol;
+        delete vPol;
+        delete hStretch;
+        delete vStretch;
+
+        if (!result) {
+            qWarning() << "Invalid size policy, line " << mReader.lineNumber();
+        }
+
+    } else if ( type == lexemValue( TYPE_SIZEHINT ) ) {
+
+        Qt::SizeHint hint = Qt::PreferredSize;
+        bool fixed = false;
+
+        if (convertSizeHintType(attribute( ATTR_TYPE ), hint, fixed)) {
+
+            result = true;
+
+            qreal *sizeHintWidth = 0;
+            const QString width = attribute( ATTR_WIDTH );
+            if (!width.isEmpty()) {
+                qreal widthInPixels;
+                result = toPixels(width, widthInPixels);
+                if (result) {
+                    sizeHintWidth = new qreal;
+                    *sizeHintWidth = widthInPixels;
+                }
+            }
+
+            qreal *sizeHintHeight = 0;
+            const QString height = attribute( ATTR_HEIGHT );
+            if (result && !height.isEmpty()) {
+                qreal heightInPixels;
+                result = toPixels(height, heightInPixels);
+                if (result) {
+                    sizeHintHeight = new qreal;
+                    *sizeHintHeight = heightInPixels;
+                }
+            }
+
+            if (result) {
+                result = mRealActions->setSizeHint(hint, sizeHintWidth, sizeHintHeight, fixed);
+            }
+        }
+
+        if (!result) {
+            qWarning() << "Invalid size hint, line " << mReader.lineNumber();
+        }
+    } else if ( type == lexemValue( TYPE_ZVALUE ) ) {
+        const QString zValueAsString = attribute( ATTR_VALUE );
+        if (!zValueAsString.isEmpty()) {
+            qreal zValueAsReal;
+            result = toReal(zValueAsString, zValueAsReal);
+            if ( result ) {
+                result = mRealActions->setZValue( zValueAsReal );
+            }
+        }
+
+        if (!result) {
+            qWarning() << "Invalid z value, line " << mReader.lineNumber();
+        }
+    } else if ( type == lexemValue( TYPE_TOOLTIP ) ) {
+        const QString value = attribute( ATTR_VALUE );
+        const QString comment = attribute( ATTR_COMMENT );
+        const QString locId = attribute( ATTR_LOCID );
+
+        if (!locId.isEmpty()) {
+            QByteArray locIdUtf8(locId.toUtf8());
+            const QString translated = hbTrId(locIdUtf8);
+            result = mRealActions->setToolTip( translated );
+        } else {
+            const QString translated = mRealActions->translate( value, comment );
+            result = mRealActions->setToolTip( translated );
+        }
+
+        if (!result) {
+            qWarning() << "Invalid tooltip, line " << mReader.lineNumber();
+        }
+    }
+
+    return result;
+}
+
+ElementType
+    HbDocumentLoaderSyntax::elementType( QStringRef name ) const
+{
+    const QString stringName = name.toString();
+
+    if( stringName == lexemValue(TYPE_DOCUMENT) ){
+        return DOCUMENT;
+    }
+    return HbXmlLoaderAbstractSyntax::elementType( name );
+}
+
+QVariant HbDocumentLoaderSyntax::decodeValue()
+{
+    QVariant result = QVariant::Invalid;
+
+    const QString type = mReader.name().toString();
+
+    bool ok = false;
+    if( type == lexemValue( TYPE_INT ) ) {
+        const QString value = attribute( ATTR_VALUE );
+        int int_res = value.toInt( &ok );
+        if( ok ) {
+            result = int_res;
+        }
+    } else if( type == lexemValue( TYPE_REAL ) ) {
+        const QString value = attribute( ATTR_VALUE );
+        qreal qreal_res;
+        ok = toPixels( value, qreal_res );
+        if( ok ) {
+            result = qreal_res;
+        }
+    } else if( type == lexemValue( TYPE_LOCALIZED_STRING ) ) {
+        const QString value =
+            mRealActions->translate( attribute( ATTR_VALUE ), attribute( ATTR_COMMENT ) );
+        result = value;
+    } else if( type == lexemValue( TYPE_STRING ) ) {
+        const QString value = attribute( ATTR_VALUE );
+        const QString locId = attribute( ATTR_LOCID );
+        if (!locId.isEmpty()) {
+            QByteArray locIdUtf8(locId.toUtf8());
+            result = hbTrId(locIdUtf8);
+        } else {
+            result = value;
+        }
+    } else if( type == lexemValue( TYPE_ENUMS ) ) {
+        result = attribute( ATTR_VALUE );
+    } else if ( type == lexemValue( TYPE_BOOL ) ) {
+        const QString value = attribute( ATTR_VALUE );
+        if (value == lexemValue( VALUE_BOOL_TRUE ) ) {
+            result = QVariant(true);
+        } else if (value == lexemValue( VALUE_BOOL_FALSE ) ) {
+            result = QVariant(false);
+        }
+    } else if ( type == lexemValue( TYPE_ICON ) ) {
+
+        HbIcon icon;
+        ok = true;
+
+        // Read optional iconName attribute (if not given, it's null icon)
+        const QString iconName = attribute( ATTR_ICONNAME );
+        if ( !iconName.isEmpty() ) {
+            icon.setIconName( iconName );
+        }
+
+        qreal desiredWidth = 0;
+        qreal desiredHeight = 0;
+
+        // Read optional width attribute
+        const QString width = attribute( ATTR_WIDTH );
+        if (!width.isEmpty()) {
+            ok = toPixels( width, desiredWidth );
+        }
+
+        // Read optional height attribute
+        const QString height = attribute( ATTR_HEIGHT );
+        if (ok && !height.isEmpty()) {
+            ok = toPixels( height, desiredHeight );
+        }
+
+        if (ok) {
+            if (!width.isEmpty() && !height.isEmpty()) {
+                icon.setSize(QSizeF(desiredWidth, desiredHeight));
+            } else if (!width.isEmpty()) {
+                icon.setWidth(desiredWidth);
+            } else if (!height.isEmpty()) {
+                icon.setHeight(desiredHeight);
+            } else {
+                // neither defined.
+            }
+
+            result = icon;
+        }
+    } else if ( type == lexemValue(TYPE_SIZE) ) {
+
+        const QString width = attribute( ATTR_WIDTH );
+        const QString height = attribute( ATTR_HEIGHT );
+
+        if (!width.isEmpty() && !height.isEmpty()) {
+            ok = true;
+            QSizeF size;
+            qreal widthVal, heightVal;
+            ok = toPixels(width, widthVal);
+            if (ok) {
+                size.setWidth(widthVal);
+                ok = toPixels(height, heightVal);
+            }
+            if (ok) {
+                size.setHeight(heightVal);
+                result = size;
+            }
+        }
+
+    } else if ( type == lexemValue(TYPE_RECT) ) {
+
+        const QString posx = attribute( ATTR_X );
+        const QString posy = attribute( ATTR_Y );
+        const QString width = attribute( ATTR_WIDTH );
+        const QString height = attribute( ATTR_HEIGHT );
+
+        if (!width.isEmpty() && !height.isEmpty() && !posx.isEmpty() && !posy.isEmpty()) {
+            ok = true;
+            QSizeF size;
+            QPointF point;
+            qreal widthVal, heightVal, posxVal, posyVal;
+            ok = toPixels(width, widthVal);
+            if (ok) {
+                size.setWidth(widthVal);
+                ok = toPixels(height, heightVal);
+            }
+            if (ok) {
+                size.setHeight(heightVal);
+                ok = toPixels(posx, posxVal);
+            }
+            if (ok) {
+                point.setX(posxVal);
+                ok = toPixels(posy, posyVal);
+            }
+            if (ok) {
+                point.setY(posyVal);
+                result = QRectF(point, size);
+            }
+        }
+
+    } else if ( type == lexemValue(TYPE_POINT) ) {
+
+        const QString posx = attribute( ATTR_X );
+        const QString posy = attribute( ATTR_Y );
+        if (!posx.isEmpty() && !posy.isEmpty()) {
+            ok = true;
+            QPointF point;
+            qreal posxVal, posyVal;
+            ok = toPixels(posx, posxVal);
+            if (ok) {
+                point.setX(posxVal);
+                ok = toPixels(posy, posyVal);
+            }
+            if (ok) {
+                point.setY(posyVal);
+                result = point;
+            }
+        }
+
+    } else if ( type == lexemValue(TYPE_ALIGNMENT) ) {
+
+        const QString alignment = attribute( ATTR_VALUE );
+        if (!alignment.isEmpty() ) {
+            result = alignment;
+        }
+
+    } else if ( type == lexemValue(LL_ORIENTATION) ) {
+
+        const QString orientation = attribute( ATTR_VALUE );
+        if (!orientation.isEmpty() ) {
+            result = orientation;
+        }
+
+    } else if ( type == lexemValue(TYPE_COLOR) ) {
+
+        const QString curColor = attribute( ATTR_VALUE  );
+        if (!curColor.isEmpty() ) {
+            ok = true;
+            result = QColor(curColor);
+        }
+
+    } else if ( type == lexemValue(TYPE_FONTSPEC) ) {
+        QString roleString = attribute( ATTR_FONTSPECROLE );
+        HbFontSpec::Role role(HbFontSpec::Undefined);
+        ok = true;
+        if (!roleString.isEmpty()) {
+            ok = toFontSpecRole(roleString, role); // sets role if ok
+        }
+        if (ok) {
+            HbFontSpec spec(role);
+            QString textHeightString = attribute( ATTR_TEXTHEIGHT );
+            if (textHeightString.isEmpty()) {
+                // Deprecated.
+                textHeightString = attribute( ATTR_TEXTPANEHEIGHT );
+            }
+            if (!textHeightString.isEmpty()) {
+                qreal height(0);
+                ok = toPixels(textHeightString, height);
+                if (ok) {
+                    spec.setTextHeight(qRound(height));
+                }
+            }
+            if (ok) {
+                result = spec;
+            }
+        }
+    }
+
+    else {
+        // unknown property.
+    }
+
+    return result;
+}
+
+bool HbDocumentLoaderSyntax::convertSizeHintType(
+        const QString &type,
+        Qt::SizeHint &resultHint,
+        bool &resultFixed)
+{
+    bool ok = true;
+    resultFixed = false;
+
+    if (type == QLatin1String("MINIMUM")) {
+        resultHint = Qt::MinimumSize;
+    } else if (type == QLatin1String("MAXIMUM")) {
+        resultHint = Qt::MaximumSize;
+    } else if (type == QLatin1String("PREFERRED")) {
+        resultHint = Qt::PreferredSize;
+    } else if (type == QLatin1String("FIXED")) {
+        resultHint = Qt::PreferredSize;
+        resultFixed = true;
+    } else {
+        ok = false;
+    }
+    return ok;
+}
+
+QString HbDocumentLoaderSyntax::version()
+{
+    return ( QString::number( VERSION_MAJOR ) + QString( "." )
+            + QString::number( VERSION_MINOR ) + QString( " (" )
+            + QString::number( MIN_SUPPORTED_VERSION_MAJOR ) + QString( "." )
+            + QString::number( MIN_SUPPORTED_VERSION_MINOR ) + QString( ")" ) );
+}
+
+bool HbDocumentLoaderSyntax::toFontSpecRole(const QString &roleString, HbFontSpec::Role &role)
+{
+    bool success(false);
+    int enumInt = HbFontSpec::staticMetaObject.enumerator(
+            HbFontSpec::staticMetaObject.indexOfEnumerator("Role")).keyToValue(roleString.toLatin1());
+    if (enumInt >= 0) {
+        success = true;
+        role = static_cast<HbFontSpec::Role>(enumInt);
+    }
+    return success;
+}