Subversion Repositories Scribus

Rev

Rev 22723 | Blame | Compare with Previous | Last modification | View Log | RSS feed


/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above copyright
**     notice, this list of conditions and the following disclaimer in
**     the documentation and/or other materials provided with the
**     distribution.
**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
**     the names of its contributors may be used to endorse or promote
**     products derived from this software without specific prior written
**     permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
** $QT_END_LICENSE$
**
****************************************************************************/


//File initially based on treemodel.h from Qt 4.x, hardly anything like it now

/*
    treemodel.cpp

    Provides a simple tree model to show how to create and use hierarchical
    models.
*/


#include <QtGui>
#include <QDomDocument>
#include <QFile>

#include "schelptreemodel.h"

ScHelpTreeModel::ScHelpTreeModel(const QString &dataFile, const QString &col1name, const QString &col2name, QMap<QString, QString>* indexToBuild, QObject *parent)
    : TreeModel(parent)
{
        QList<QVariant> rootData;
        rootData << col1name << col2name;
        m_rootItem = new TreeItem(rootData);
        if (!dataFile.isEmpty())
                setupModelData(dataFile, m_rootItem, indexToBuild);
}

void ScHelpTreeModel::setupModelData(const QString &dataFile, TreeItem *parent, QMap<QString, QString>* indexToBuild)
{
        QFile file( dataFile );
        if ( !file.open( QIODevice::ReadOnly ) )
                return;
        QDomDocument doc( "menuentries" );
        if ( !doc.setContent( &file ) )
        {
                file.close();
                return;
        }
        file.close();

        QList<TreeItem*> parents;
        QList<int> indentations;
        parents << parent;
        indentations << 0;
        QDomElement docElem = doc.documentElement();
        QDomNode n = docElem.firstChild();
//      bool haveTutorials=false;
        QList<QVariant> columnData;
        int position=0;
        while (!n.isNull())
        {
                QDomElement e = n.toElement(); // try to convert the node to an element.
                if (!e.isNull())
                {
                        if (e.hasAttribute( "text" ) && e.hasAttribute( "file" ))
                        {
                                QDomAttr textAttr = e.attributeNode( "text" );
                                QDomAttr fileAttr = e.attributeNode( "file" );
                                columnData.clear();
                                columnData << textAttr.value() <<  fileAttr.value();
                                if (position > indentations.last())
                                {
                                        // The last child of the current parent is now the new parent
                                        // unless the current parent has no children.
               
                                        if (parents.last()->childCount() > 0)
                                        {
                                                parents << parents.last()->child(parents.last()->childCount()-1);
                                                indentations << position;
                                        }
                                }
                                else
                                {
                                        while (position < indentations.last() && parents.count() > 0) {
                                                parents.pop_back();
                                                indentations.pop_back();
                                        }
                                }
                                // Append a new item to the current parent's list of children.
                                parents.last()->appendChild(new TreeItem(columnData, parents.last()));
                                if (indexToBuild)
                                        indexToBuild->insert(textAttr.value(), fileAttr.value());
                        }

                        QDomNodeList nl=n.childNodes();
                        if (nl.count()>0)
                                position=1;
                        for (int i=0 ; i<= nl.count() ; i++)
                        {
                                QDomNode child=nl.item(i);
                                if (child.isElement())
                                {
                                        QDomElement ec = child.toElement();
                                        if (!ec.isNull())
                                        {
                                                if (ec.hasAttribute( "text" ) && ec.hasAttribute( "file" ))
                                                {
                                                        QDomAttr textAttr = ec.attributeNode( "text" );
                                                        QDomAttr fileAttr = ec.attributeNode( "file" );
                                                        columnData.clear();
                                                        columnData << textAttr.value() <<  fileAttr.value();
                                                        if (position > indentations.last())
                                                        {
                                                                // The last child of the current parent is now the new parent
                                                                // unless the current parent has no children.
                                       
                                                                if (parents.last()->childCount() > 0)
                                                                {
                                                                        parents << parents.last()->child(parents.last()->childCount()-1);
                                                                        indentations << position;
                                                                }
                                                        }
                                                        else
                                                        {
                                                                while (position < indentations.last() && parents.count() > 0) {
                                                                        parents.pop_back();
                                                                        indentations.pop_back();
                                                                }
                                                        }
                                                        // Append a new item to the current parent's list of children.
                                                        parents.last()->appendChild(new TreeItem(columnData, parents.last()));
                                                        if (indexToBuild)
                                                                indexToBuild->insert(textAttr.value(), fileAttr.value());
                                                }
                                                //3rd level
                                                QDomNodeList nl2=child.childNodes();
                                                if (nl2.count() > 0)
                                                        position = 2;
                                                for (int i2 = 0 ; i2 <= nl2.count(); i2++)
                                                {
                                                        QDomNode childchild = nl2.item(i2);
                                                        if (childchild.isElement())
                                                        {
                                                                QDomElement ecc = childchild.toElement();
                                                                if (!ecc.isNull())
                                                                {
                                                                        QDomAttr textAttr = ecc.attributeNode( "text" );
                                                                        QDomAttr fileAttr = ecc.attributeNode( "file" );
                                                                        columnData.clear();
                                                                        columnData << textAttr.value() <<  fileAttr.value();
                                                                        if (position > indentations.last())
                                                                        {
                                                                                // The last child of the current parent is now the new parent
                                                                                // unless the current parent has no children.
                                                       
                                                                                if (parents.last()->childCount() > 0)
                                                                                {
                                                                                        parents << parents.last()->child(parents.last()->childCount()-1);
                                                                                        indentations << position;
                                                                                }
                                                                        }
                                                                        else
                                                                        {
                                                                                while (position < indentations.last() && parents.count() > 0) {
                                                                                        parents.pop_back();
                                                                                        indentations.pop_back();
                                                                                }
                                                                        }
                                                                        // Append a new item to the current parent's list of children.
                                                                        parents.last()->appendChild(new TreeItem(columnData, parents.last()));
                                                                        if (indexToBuild)
                                                                                indexToBuild->insert(textAttr.value(), fileAttr.value());
                                                                }
                                                        }
                                                }
                                                position=1;
                                        }
                                }
                        }
                        position=0;
                }
                n = n.nextSibling();
        }
}

void ScHelpTreeModel::addRow(const QString& s1, const QString& s2, int i)
{
        QList<TreeItem*> parents;
//      QList<int> indentations;
        parents << m_rootItem;
        if (parents.last()->childCount() > 0)
                parents << parents.last()->child(parents.last()->childCount()-1);
        QList<QVariant> columnData;
        columnData << s1 << s2;// << i;
        parents.last()->appendChild(new TreeItem(columnData, parents.last()));
}