211 lines
5.1 KiB
C++
211 lines
5.1 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2005-2006 Trolltech ASA. All rights reserved.
|
|
**
|
|
** This file was part of the example classes of the Qt Toolkit.
|
|
** Now it's being hacked into some other shape... :)
|
|
**
|
|
** This file may be used under the terms of the GNU General Public
|
|
** License version 2.0 as published by the Free Software Foundation
|
|
** and appearing in the file LICENSE.GPL included in the packaging of
|
|
** this file. Please review the following information to ensure GNU
|
|
** General Public Licensing requirements will be met:
|
|
** http://www.trolltech.com/products/qt/opensource.html
|
|
**
|
|
** If you are unsure which license is appropriate for your use, please
|
|
** review the following information:
|
|
** http://www.trolltech.com/products/qt/licensing.html or contact the
|
|
** sales department at sales@trolltech.com.
|
|
**
|
|
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
**
|
|
****************************************************************************/
|
|
|
|
#include "memxmlModel.h"
|
|
#include <QtGui>
|
|
#include <QtXml>
|
|
#include <QDomNode>
|
|
#include <QHash>
|
|
|
|
class DomItem
|
|
{
|
|
public:
|
|
DomItem(QDomNode &node, int row, DomItem *parent = 0);
|
|
~DomItem();
|
|
DomItem *child(int i);
|
|
DomItem *parent();
|
|
QDomNode node() const;
|
|
int row();
|
|
|
|
private:
|
|
QDomNode domNode;
|
|
QHash<int,DomItem*> childItems;
|
|
DomItem *parentItem;
|
|
int rowNumber;
|
|
};
|
|
|
|
DomItem::DomItem(QDomNode &node, int row, DomItem *parent)
|
|
{
|
|
domNode = node;
|
|
// Record the item's location within its parent.
|
|
rowNumber = row;
|
|
parentItem = parent;
|
|
}
|
|
|
|
DomItem::~DomItem()
|
|
{
|
|
QHash<int,DomItem*>::iterator it;
|
|
for (it = childItems.begin(); it != childItems.end(); ++it)
|
|
delete it.value();
|
|
}
|
|
|
|
QDomNode DomItem::node() const
|
|
{
|
|
return domNode;
|
|
}
|
|
|
|
DomItem *DomItem::parent()
|
|
{
|
|
return parentItem;
|
|
}
|
|
|
|
DomItem *DomItem::child(int i)
|
|
{
|
|
if (childItems.contains(i))
|
|
return childItems[i];
|
|
|
|
if (i >= 0 && i < domNode.childNodes().count()) {
|
|
QDomNode childNode = domNode.childNodes().item(i);
|
|
DomItem *childItem = new DomItem(childNode, i, this);
|
|
childItems[i] = childItem;
|
|
return childItem;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int DomItem::row()
|
|
{
|
|
return rowNumber;
|
|
}
|
|
|
|
MemXMLModel::MemXMLModel(QDomDocument document, QObject *parent)
|
|
: QAbstractItemModel(parent), domDocument(document)
|
|
{
|
|
rootItem = new DomItem(domDocument, 0);
|
|
}
|
|
|
|
MemXMLModel::~MemXMLModel()
|
|
{
|
|
delete rootItem;
|
|
}
|
|
|
|
int MemXMLModel::columnCount(const QModelIndex & parent) const
|
|
{
|
|
Q_UNUSED(parent);
|
|
return 3;
|
|
}
|
|
|
|
QVariant MemXMLModel::data(const QModelIndex &index, int role) const
|
|
{
|
|
if (!index.isValid())
|
|
return QVariant();
|
|
|
|
if (role != Qt::DisplayRole)
|
|
return QVariant();
|
|
|
|
DomItem *item = static_cast<DomItem*>(index.internalPointer());
|
|
|
|
QDomNode node = item->node();
|
|
QStringList attributes;
|
|
QDomNamedNodeMap attributeMap = node.attributes();
|
|
|
|
switch (index.column()) {
|
|
case 0:
|
|
return node.nodeName();
|
|
case 1:
|
|
for (int i = 0; (unsigned int)(i) < attributeMap.count(); ++i)
|
|
{
|
|
QDomNode attribute = attributeMap.item(i);
|
|
attributes << attribute.nodeName() + "=\"" +attribute.nodeValue() + "\"";
|
|
}
|
|
return attributes.join(" ");
|
|
case 2:
|
|
return node.nodeValue().split("\n").join(" ");
|
|
default:
|
|
return QVariant();
|
|
}
|
|
}
|
|
|
|
Qt::ItemFlags MemXMLModel::flags(const QModelIndex &index) const
|
|
{
|
|
if (!index.isValid())
|
|
{
|
|
return Qt::ItemIsEnabled;
|
|
}
|
|
|
|
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
|
}
|
|
|
|
QVariant MemXMLModel::headerData(int section, Qt::Orientation orientation, int role) const
|
|
{
|
|
if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
|
|
switch (section) {
|
|
case 0:
|
|
return tr("Name");
|
|
case 1:
|
|
return tr("Attributes");
|
|
case 2:
|
|
return tr("Value");
|
|
default:
|
|
return QVariant();
|
|
}
|
|
}
|
|
|
|
return QVariant();
|
|
}
|
|
|
|
QModelIndex MemXMLModel::index(int row, int column, const QModelIndex &parent) const
|
|
{
|
|
DomItem *parentItem;
|
|
|
|
if (!parent.isValid())
|
|
parentItem = rootItem;
|
|
else
|
|
parentItem = static_cast<DomItem*>(parent.internalPointer());
|
|
|
|
DomItem *childItem = parentItem->child(row);
|
|
if (childItem)
|
|
return createIndex(row, column, childItem);
|
|
else
|
|
return QModelIndex();
|
|
}
|
|
|
|
QModelIndex MemXMLModel::parent(const QModelIndex &child) const
|
|
{
|
|
if (!child.isValid())
|
|
return QModelIndex();
|
|
|
|
DomItem *childItem = static_cast<DomItem*>(child.internalPointer());
|
|
DomItem *parentItem = childItem->parent();
|
|
|
|
if (!parentItem || parentItem == rootItem)
|
|
return QModelIndex();
|
|
|
|
return createIndex(parentItem->row(), 0, parentItem);
|
|
}
|
|
|
|
int MemXMLModel::rowCount(const QModelIndex &parent) const
|
|
{
|
|
DomItem *parentItem;
|
|
|
|
if (!parent.isValid())
|
|
parentItem = rootItem;
|
|
else
|
|
parentItem = static_cast<DomItem*>(parent.internalPointer());
|
|
|
|
return parentItem->node().childNodes().count();
|
|
}
|
|
|
|
#include "memxmlModel.moc"
|