git-svn-id: file:///svnroot/family-shop-mgr@32 26eb2498-383b-47a6-be48-5d6f36779e85
authoronil <u.irigoyen@gmail.com>
Fri, 28 May 2010 21:08:12 +0000 (21:08 +0000)
committeronil <u.irigoyen@gmail.com>
Fri, 28 May 2010 21:08:12 +0000 (21:08 +0000)
code/family-shop-mgr/ShoppingTreeItem.cpp
code/family-shop-mgr/ShoppingTreeModel.cpp
code/family-shop-mgr/ShoppingTreeModel.h

index c5a74e7..ae21ccc 100644 (file)
  *\r
  */\r
 \r
-#include "ShoppingTreeItem.h"\r
-\r
-/*******************************************************************/\r
-ShoppingTreeItem::ShoppingTreeItem(const QVector<QVariant> &data,\r
-                                   ShoppingTreeItem *parent) : m_itemType(NotDefined)\r
-{\r
-    parentItem = parent;\r
-    itemData = data;\r
-}\r
-\r
-/*******************************************************************/\r
-ShoppingTreeItem::~ShoppingTreeItem()\r
-{\r
-    qDeleteAll(childItems);\r
-}\r
-\r
-/*******************************************************************/\r
-ShoppingTreeItem *ShoppingTreeItem::child(int number)\r
-{\r
-    return childItems.value(number);\r
-}\r
+#include <QtXml>\r
 \r
-/*******************************************************************/\r
-int ShoppingTreeItem::childCount() const\r
-{\r
-    return childItems.count();\r
-}\r
-\r
-/*******************************************************************/\r
-int ShoppingTreeItem::childNumber() const\r
-{\r
-    if (parentItem)\r
-        return parentItem->childItems.indexOf(const_cast<ShoppingTreeItem*>(this));\r
+#include "ShoppingTreeItem.h"\r
 \r
-    return 0;\r
-}\r
 \r
-/*******************************************************************/\r
-int ShoppingTreeItem::columnCount() const\r
+DomItem::DomItem(QDomNode &node, int row, DomItem *parent)\r
 {\r
-    return itemData.count();\r
+    domNode = node;\r
+    rowNumber = row;\r
+    parentItem = parent;\r
 }\r
 \r
 /*******************************************************************/\r
-QVariant ShoppingTreeItem::data(int column) const\r
+DomItem::~DomItem()\r
 {\r
-    return itemData.value(column);\r
+    QHash<int,DomItem*>::iterator it;\r
+    for (it = childItems.begin(); it != childItems.end(); ++it)\r
+        delete it.value();\r
 }\r
 \r
 /*******************************************************************/\r
-bool ShoppingTreeItem::insertChildren(int position, int count, int columns,\r
-                                      ShoppingTreeModel* model)\r
+QDomNode DomItem::node() const\r
 {\r
-    if (position < 0 || position > childItems.size())\r
-        return false;\r
-\r
-    for (int row = 0; row < count; ++row) {\r
-        QVector<QVariant> data(columns);\r
-        ShoppingTreeItem *item = new ShoppingTreeItem(data, this);\r
-        childItems.insert(position, item);\r
-        if(model)\r
-        {\r
-            connect(item, SIGNAL(childItemSet(ShoppingTreeItem*)), model,\r
-                    SLOT(registerInsertedChild(ShoppingTreeItem*)));\r
-            connect(item, SIGNAL(childRemoved(ShoppingTreeItem*)), model,\r
-                    SLOT(deleteRemovedChild(ShoppingTreeItem*)));\r
-        }\r
-    }\r
-\r
-    return true;\r
+    return domNode;\r
 }\r
 \r
 /*******************************************************************/\r
-bool ShoppingTreeItem::insertColumns(int position, int columns)\r
-{\r
-    if (position < 0 || position > itemData.size())\r
-        return false;\r
-\r
-    for (int column = 0; column < columns; ++column)\r
-        itemData.insert(position, QVariant());\r
-\r
-    foreach (ShoppingTreeItem *child, childItems)\r
-        child->insertColumns(position, columns);\r
-\r
-    return true;\r
-}\r
-\r
-/*******************************************************************/\r
-ShoppingTreeItem *ShoppingTreeItem::parent()\r
+DomItem *DomItem::parent()\r
 {\r
     return parentItem;\r
 }\r
 \r
 /*******************************************************************/\r
-bool ShoppingTreeItem::removeChildren(int position, int count)\r
+DomItem *DomItem::child(int i)\r
 {\r
-    if (position < 0 || position + count > childItems.size())\r
-        return false;\r
+    if (childItems.contains(i))\r
+        return childItems[i];\r
 \r
-    for (int row = 0; row < count; ++row)\r
+    QDomNodeList childNodesList = domNode.childNodes();\r
+    QList<QDomNode> childElementsList;\r
+    QDomNode childNode;\r
+    for(int j = 0; !(childNode = childNodesList.at(j)).isNull(); j++)\r
     {\r
-        ShoppingTreeItem *item = childItems.takeAt(position);\r
-        emit childRemoved(item);\r
-        delete item;\r
+        if(childNode.isElement())\r
+        {\r
+            if(childNode.toElement().nodeName() == "category" ||\r
+               childNode.toElement().nodeName() == "item")\r
+                childElementsList.append(childNode);\r
+        }\r
     }\r
-\r
-    return true;\r
-}\r
-\r
-/*******************************************************************/\r
-bool ShoppingTreeItem::removeColumns(int position, int columns)\r
-{\r
-    if (position < 0 || position + columns > itemData.size())\r
-        return false;\r
-\r
-    for (int column = 0; column < columns; ++column)\r
-        itemData.remove(position);\r
-\r
-    foreach (ShoppingTreeItem *child, childItems)\r
-        child->removeColumns(position, columns);\r
-\r
-    return true;\r
-}\r
-\r
-/*******************************************************************/\r
-bool ShoppingTreeItem::setData(int column, const QVariant &value)\r
-{\r
-    if (column < 0 || column >= itemData.size())\r
-        return false;\r
-\r
-    if(m_itemType == Category && column != 0)\r
-        return false;\r
-\r
-    itemData[column] = value;\r
-    emit dataChanged(column);\r
-    return true;\r
-}\r
-\r
-/*******************************************************************/\r
-bool ShoppingTreeItem::setItemType(ItemType type)\r
-{\r
-    if(type == NotDefined)\r
-        return false;\r
-\r
-    m_itemType = type;\r
-\r
-    if(m_itemType == type)\r
-    {\r
-        emit childItemSet(this);\r
-        return true;\r
+    if (i >= 0 && i < childElementsList.count()) {\r
+        childNode = childElementsList.at(i);\r
+        DomItem *childItem = new DomItem(childNode, i, this);\r
+        childItems[i] = childItem;\r
+        return childItem;\r
     }\r
-    return false;\r
+    return 0;\r
 }\r
 \r
 /*******************************************************************/\r
-ShoppingTreeItem::ItemType ShoppingTreeItem::getItemType() const\r
+int DomItem::row()\r
 {\r
-    return m_itemType;\r
+    return rowNumber;\r
 }\r
index 28dd5d0..f79b957 100644 (file)
  *\r
  */\r
 \r
-#include "ShoppingTreeModel.h"\r
+#include <QtXml>\r
 \r
 #include "ShoppingTreeItem.h"\r
-#include <QFile>\r
-#include <QApplication>\r
-#include <QtGui>\r
+#include "ShoppingTreeModel.h"\r
 \r
-/*******************************************************************/\r
-ShoppingTreeModel::ShoppingTreeModel(const QString &xmlFileName,\r
-                                     QObject *parent) :\r
-QAbstractItemModel(parent), m_document("ShoppingList")\r
+DomModel::DomModel(QDomDocument document, QObject *parent)\r
+    : QAbstractItemModel(parent), domDocument(document),\r
+    rootItemNode(domDocument.firstChildElement("shoppingList"))\r
 {\r
-    QString error;\r
-    int errLine;\r
-    int errColumn;\r
-\r
-    m_xmlFileName = QApplication::applicationDirPath() + "/" + xmlFileName;\r
-    QFile file(m_xmlFileName);\r
-    if(!file.open(QIODevice::ReadOnly))\r
-        return;\r
-    // Parse xml file\r
-    if(!m_document.setContent(&file, true, &error, &errLine, &errColumn))\r
-    {\r
-        emit xmlParseError(error, errLine, errColumn);\r
-        file.close();\r
-        return;\r
-    }\r
-    file.close();\r
-\r
-    QDomElement root = m_document.documentElement();\r
-    if(root.tagName() != "shoppingList" || !root.hasAttribute("version"))\r
-    {\r
-        emit invalidDocument();\r
-        return;\r
-    }\r
-    else if(root.attribute("version") == "1.0")\r
-    {\r
-        // set column titles\r
-        QVector<QVariant> rootData;\r
-        rootData << "Category/Item name"\r
-                << "Quantity" << "Store";\r
-\r
-        rootItem = new ShoppingTreeItem(rootData);\r
-        m_domElementForItem.insert(rootItem, root);\r
-    }\r
-    else\r
-    {\r
-        // upgrade document version if possible\r
-        ;\r
-    }\r
-\r
-    QDomElement child = root.firstChildElement("category");\r
-    while(!child.isNull())\r
-    {\r
-        // Parse all categories\r
-        parseCategoryElement(child);\r
-        child = child.nextSiblingElement("category");\r
-    }\r
-\r
-    child = root.firstChildElement("item");\r
-    while(!child.isNull())\r
-    {\r
-        // parse all items which don't have category\r
-        rootItem->insertChildren(\r
-                rootItem->childCount(), 1,\r
-                rootItem->columnCount());\r
-        QVector<QVariant> columnData =\r
-                getColumnsFromItemElement(child);\r
-        rootItem->child(rootItem->childCount() - 1)->\r
-                setItemType(ShoppingTreeItem::Item);\r
-        for(int column = 0; column < columnData.size(); column++)\r
-        {\r
-            rootItem->child(rootItem->childCount() - 1)->\r
-                    setData(column, columnData[column]);\r
-        }\r
-        m_domElementForItem.insert(rootItem->child(rootItem->childCount() - 1),\r
-                                   child);\r
-        child = child.nextSiblingElement("item");\r
-    }\r
-\r
-\r
-    connect(rootItem, SIGNAL(childItemSet(ShoppingTreeItem*)), this,\r
-            SLOT(registerInsertedChild(ShoppingTreeItem*)));\r
-    connect(rootItem, SIGNAL(childRemoved(ShoppingTreeItem*)), this,\r
-            SLOT(deleteRemovedChild(ShoppingTreeItem*)));\r
-\r
-    QHashIterator<ShoppingTreeItem*,QDomElement> i(m_domElementForItem);\r
-    while(i.hasNext())\r
-    {\r
-        i.next();\r
-        connect(i.key(), SIGNAL(childItemSet(ShoppingTreeItem*)), this,\r
-                SLOT(registerInsertedChild(ShoppingTreeItem*)));\r
-        connect(i.key(), SIGNAL(childRemoved(ShoppingTreeItem*)), this,\r
-                SLOT(deleteRemovedChild(ShoppingTreeItem*)));\r
-    }\r
+    rootItem = new DomItem(rootItemNode, 0);\r
 }\r
 \r
 /*******************************************************************/\r
-ShoppingTreeModel::~ShoppingTreeModel()\r
+DomModel::~DomModel()\r
 {\r
     delete rootItem;\r
 }\r
 \r
 /*******************************************************************/\r
-bool ShoppingTreeModel::addCategory(QString name)\r
-{\r
-    QModelIndex parent = QModelIndex();\r
-\r
-    if (!this->insertRow(parent.row()+1, parent))\r
-        return false;\r
-\r
-    int column = 0;\r
-    QModelIndex child = this->index(parent.row()+1, column, parent);\r
-    ShoppingTreeItem* item = this->getItem(child);\r
-    item->setItemType(ShoppingTreeItem::Category);\r
-    this->setData(child, QVariant(name), Qt::EditRole);\r
-    return true;\r
-}\r
-\r
-/*******************************************************************/\r
-bool ShoppingTreeModel::addSubCategory(QString name, int position,\r
-                    const QModelIndex &parent)\r
+int DomModel::columnCount(const QModelIndex &/*parent*/) const\r
 {\r
-    if (!this->insertRow(position, parent))\r
-        return false;\r
-\r
-    for(int column = 0; column < this->columnCount(parent); ++column)\r
-    {\r
-        QModelIndex child = this->index(parent.row()+1, column, parent);\r
-        ShoppingTreeItem* item = this->getItem(child);\r
-        item->setItemType(ShoppingTreeItem::Category);\r
-        this->setData(child, QVariant(name), Qt::EditRole);\r
-    }\r
-    return true;\r
+    return 4;\r
 }\r
 \r
 /*******************************************************************/\r
-bool ShoppingTreeModel::addItem(QString name, int position,\r
-             const QModelIndex &parent)\r
+QVariant DomModel::data(const QModelIndex &index, int role) const\r
 {\r
-    if (!this->insertRow(position, parent))\r
-        return false;\r
-\r
-    int column = 0;\r
-    QModelIndex child = this->index(parent.row()+1, column, parent);\r
-    ShoppingTreeItem* item = this->getItem(child);\r
-    item->setItemType(ShoppingTreeItem::Item);\r
-    this->setData(child, QVariant(name), Qt::EditRole);\r
-\r
-    return true;\r
-}\r
-\r
-/*******************************************************************/\r
-bool ShoppingTreeModel::removeCategoryOrItem(const QModelIndex &index)\r
-{\r
-    return this->removeRow(index.row(), index.parent());\r
-}\r
-\r
-/*******************************************************************/\r
-QVariant ShoppingTreeModel::data(const QModelIndex &index, int role) const\r
-{\r
-    if(!index.isValid())\r
+    if (!index.isValid())\r
         return QVariant();\r
 \r
-    if(role != Qt::DisplayRole && role != Qt::EditRole)\r
+    if (role != Qt::DisplayRole)\r
         return QVariant();\r
 \r
-    ShoppingTreeItem *item = getItem(index);\r
-    return item->data(index.column());\r
-}\r
+    DomItem *item = static_cast<DomItem*>(index.internalPointer());\r
 \r
-/*******************************************************************/\r
-Qt::ItemFlags ShoppingTreeModel::flags(const QModelIndex &index) const\r
-{\r
-    if(!index.isValid())\r
-        return 0;\r
+    QDomNode node = item->node();\r
 \r
-    return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;\r
+    switch (index.column()) {\r
+        case 0:\r
+            return node.firstChildElement("title").text();\r
+        case 1:\r
+            if(node.toElement().nodeName() == "item")\r
+            {\r
+                return node.firstChildElement("quantity").text();\r
+            }\r
+            return QVariant();\r
+        case 2:\r
+            if(node.toElement().nodeName() == "item")\r
+            {\r
+                return node.firstChildElement("store").text();\r
+            }\r
+            return QVariant();\r
+        case 3:\r
+            if(node.toElement().nodeName() == "item")\r
+            {\r
+                return (bool) node.firstChildElement("checked").text().toInt();\r
+            }\r
+            return QVariant();\r
+        default:\r
+            return QVariant();\r
+    }\r
 }\r
 \r
 /*******************************************************************/\r
-ShoppingTreeItem *ShoppingTreeModel::getItem(const QModelIndex &index) const\r
+Qt::ItemFlags DomModel::flags(const QModelIndex &index) const\r
 {\r
-    if(index.isValid()){\r
-        ShoppingTreeItem *item =\r
-                static_cast<ShoppingTreeItem*>(index.internalPointer());\r
-        if(item) return item;\r
-    }\r
+    if (!index.isValid())\r
+        return 0;\r
 \r
-    return rootItem;\r
+    return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;\r
 }\r
 \r
 /*******************************************************************/\r
-QVariant ShoppingTreeModel::headerData(int section,\r
-                                       Qt::Orientation orientation,\r
-                                       int role) const\r
+QVariant DomModel::headerData(int section, Qt::Orientation orientation,\r
+                              int role) const\r
 {\r
-    if(orientation == Qt::Horizontal && role == Qt::DisplayRole)\r
-        return rootItem->data(section);\r
+    if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {\r
+        switch (section) {\r
+            case 0:\r
+                return tr("Category/Item name");\r
+            case 1:\r
+                return tr("Quantity");\r
+            case 2:\r
+                return tr("Store");\r
+            case 3:\r
+                return tr("Checked");\r
+            default:\r
+                return QVariant();\r
+        }\r
+    }\r
 \r
     return QVariant();\r
 }\r
 \r
 /*******************************************************************/\r
-QModelIndex ShoppingTreeModel::index(int row, int column,\r
-                                     const QModelIndex &parent) const\r
+QModelIndex DomModel::index(int row, int column, const QModelIndex &parent)\r
+            const\r
 {\r
-    if(parent.isValid() && parent.column() != 0)\r
+    if (!hasIndex(row, column, parent))\r
         return QModelIndex();\r
 \r
-    ShoppingTreeItem *parentItem = getItem(parent);\r
+    DomItem *parentItem;\r
 \r
-    ShoppingTreeItem *childItem = parentItem->child(row);\r
-    if(childItem)\r
+    if (!parent.isValid())\r
+        parentItem = rootItem;\r
+    else\r
+        parentItem = static_cast<DomItem*>(parent.internalPointer());\r
+\r
+    DomItem *childItem = parentItem->child(row);\r
+    if (childItem)\r
         return createIndex(row, column, childItem);\r
     else\r
         return QModelIndex();\r
 }\r
 \r
 /*******************************************************************/\r
-bool ShoppingTreeModel::insertColumns(int position, int columns,\r
-                                      const QModelIndex &parent)\r
+QModelIndex DomModel::parent(const QModelIndex &child) const\r
 {\r
-    bool success;\r
-\r
-    beginInsertColumns(parent, position, position + columns - 1);\r
-    success = rootItem->insertColumns(position, columns);\r
-    endInsertColumns();\r
-\r
-    return success;\r
-}\r
-\r
-/*******************************************************************/\r
-bool ShoppingTreeModel::insertRows(int position, int rows,\r
-                                   const QModelIndex &parent)\r
-{\r
-    ShoppingTreeItem *parentItem = getItem(parent);\r
-    bool success = false;\r
-\r
-    beginInsertRows(parent, position, position + rows - 1);\r
-    success = parentItem->insertChildren(position, rows,\r
-                                         rootItem->columnCount(), this);\r
-    endInsertRows();\r
-\r
-    return success;\r
-}\r
-\r
-/*******************************************************************/\r
-QModelIndex ShoppingTreeModel::parent(const QModelIndex &index) const\r
-{\r
-    if(!index.isValid())\r
+    if (!child.isValid())\r
         return QModelIndex();\r
 \r
-    ShoppingTreeItem *childItem = getItem(index);\r
-    ShoppingTreeItem *parentItem = childItem->parent();\r
+    DomItem *childItem = static_cast<DomItem*>(child.internalPointer());\r
+    DomItem *parentItem = childItem->parent();\r
 \r
-    if(parentItem == rootItem)\r
+    if (!parentItem || parentItem == rootItem)\r
         return QModelIndex();\r
 \r
-    return createIndex(parentItem->childNumber(), 0, parentItem);\r
+    return createIndex(parentItem->row(), 0, parentItem);\r
 }\r
 \r
 /*******************************************************************/\r
-bool ShoppingTreeModel::removeColumns(int position, int columns, const QModelIndex &parent)\r
+int DomModel::rowCount(const QModelIndex &parent) const\r
 {\r
-    bool success;\r
-\r
-    beginRemoveColumns(parent, position, position + columns - 1);\r
-    success = rootItem->removeColumns(position, columns);\r
-    endRemoveColumns();\r
-\r
-    if (rootItem->columnCount() == 0)\r
-        removeRows(0, rowCount());\r
-\r
-    return success;\r
-}\r
-\r
-/*******************************************************************/\r
-bool ShoppingTreeModel::removeRows(int position, int rows, const QModelIndex &parent)\r
-{\r
-    ShoppingTreeItem *parentItem = getItem(parent);\r
-    bool success;\r
-\r
-    beginRemoveRows(parent, position, position + rows - 1);\r
-    success = parentItem->removeChildren(position, rows);\r
-    endRemoveRows();\r
-\r
-    return success;\r
-}\r
-\r
-/*******************************************************************/\r
-int ShoppingTreeModel::rowCount(const QModelIndex &parent) const\r
-{\r
-    ShoppingTreeItem *parentItem = getItem(parent);\r
-\r
-    return parentItem->childCount();\r
-}\r
-\r
-/*******************************************************************/\r
-int ShoppingTreeModel::columnCount(const QModelIndex &parent) const\r
-{\r
-    if(parent.isValid())\r
-        return getItem(parent)->columnCount();\r
-    else\r
-        return rootItem->columnCount();\r
-}\r
-\r
-/*******************************************************************/\r
-bool ShoppingTreeModel::setData(const QModelIndex &index, const QVariant &value, int role)\r
-{\r
-    if(role != Qt::EditRole)\r
-        return false;\r
-\r
-    ShoppingTreeItem *item = getItem(index);\r
-\r
-    // only "items" have more than one editable column\r
-    if(index.column() != 0 && m_domElementForItem.value(item).tagName() != "item")\r
-        return false;\r
-\r
-    // edit item\r
-    bool result = (item->setData(index.column(),value) &&\r
-                   updateDomElement(item, index.column()));\r
-\r
-    if(result)\r
-        emit dataChanged(index, index);\r
-\r
-    return result;\r
-}\r
-\r
-/*******************************************************************/\r
-bool ShoppingTreeModel::setHeaderData(int section, Qt::Orientation orientation,\r
-                                      const QVariant &value, int role)\r
-{\r
-    if(role != Qt::EditRole || orientation != Qt::Horizontal)\r
-        return false;\r
-\r
-    bool result = rootItem->setData(section, value);\r
-\r
-    if(result)\r
-        emit headerDataChanged(orientation, section, section);\r
-\r
-    return result;\r
-}\r
-\r
-/*******************************************************************/\r
-void ShoppingTreeModel::registerInsertedChild(ShoppingTreeItem *item)\r
-{\r
-    QDomElement parentElement = m_domElementForItem.value(item->parent());\r
-    QDomElement childElement;\r
-    if(item->getItemType() == ShoppingTreeItem::Category)\r
-    {\r
-        childElement = m_document.createElement("category");\r
-        QDomElement title = m_document.createElement("title");\r
-        QDomText newTitleText = m_document.createTextNode("new category");\r
-        title.appendChild(newTitleText);\r
-        childElement.appendChild(title);\r
-    }\r
-    else if(item->getItemType() == ShoppingTreeItem::Item)\r
-    {\r
-        childElement = m_document.createElement("category");\r
-        QDomElement title = m_document.createElement("title");\r
-        QDomText newTitleText = m_document.createTextNode("new category");\r
-        title.appendChild(newTitleText);\r
-        childElement.appendChild(title);\r
-        QDomElement quantity = m_document.createElement("quantity");\r
-        QDomText newQuantityText = m_document.createTextNode("0");\r
-        quantity.appendChild(newQuantityText);\r
-        childElement.appendChild(quantity);\r
-        QDomElement store = m_document.createElement("store");\r
-        QDomText newStoreText = m_document.createTextNode("");\r
-        store.appendChild(newStoreText);\r
-        childElement.appendChild(store);\r
-        QDomElement lastModified = m_document.createElement("lastModified");\r
-        QDomText newDateText = m_document.createTextNode(\r
-                QDateTime::currentDateTime().toString("dd/MM/yyyy-hh:mm:ss"));\r
-        lastModified.appendChild(newDateText);\r
-        childElement.appendChild(lastModified);\r
-    }\r
-    else\r
-        return;\r
-\r
-    parentElement.appendChild(childElement);\r
-    m_domElementForItem.insert(item, childElement);\r
-    updateXmlFile();\r
-}\r
+    if (parent.column() > 0)\r
+        return 0;\r
 \r
-/*******************************************************************/\r
-void ShoppingTreeModel::deleteRemovedChild(ShoppingTreeItem *item)\r
-{\r
-    QDomElement element = m_domElementForItem.value(item);\r
-    QDomNode parentNode = element.parentNode();\r
-    parentNode.removeChild(element);\r
-    updateXmlFile();\r
-    m_domElementForItem.remove(item);\r
-}\r
+    DomItem *parentItem;\r
 \r
-/*******************************************************************/\r
-void ShoppingTreeModel::parseCategoryElement(const QDomElement &element,\r
-                                             ShoppingTreeItem *parentItem)\r
-{\r
-    // if parent is null then add category to root\r
-    if(!parentItem)\r
+    if (!parent.isValid())\r
         parentItem = rootItem;\r
-\r
-    ShoppingTreeItem *item;\r
-    QDomElement child = element.firstChildElement("title");\r
-    QString title = child.text();\r
-    if(!title.isEmpty())\r
-    {\r
-        parentItem->insertChildren(parentItem->childCount(), 1,\r
-                                   rootItem->columnCount());\r
-\r
-        parentItem->child(parentItem->childCount() - 1)->\r
-                setItemType(ShoppingTreeItem::Category);\r
-        parentItem->child(parentItem->childCount() - 1)->setData(0, title);\r
-        m_domElementForItem.insert(parentItem->child(parentItem->childCount() - 1),\r
-                                   element);\r
-        item = parentItem->child(parentItem->childCount() - 1);\r
-    }\r
     else\r
-    {\r
-        emit invalidDocument();\r
-        return;\r
-    }\r
+        parentItem = static_cast<DomItem*>(parent.internalPointer());\r
 \r
-    // add each sub category and item to the tree\r
-    child = child.nextSiblingElement();\r
-    while(!child.isNull())\r
+    int childCount = 0;\r
+    for(QDomElement childElement = parentItem->node().firstChildElement();\r
+        !childElement.isNull(); childElement = childElement.nextSiblingElement())\r
     {\r
-        if(child.tagName() == "category")\r
-        {\r
-            parseCategoryElement(child, parentItem);\r
-        }\r
-        else if(child.tagName() == "item")\r
-        {\r
-            item->insertChildren(\r
-                    item->childCount(), 1,\r
-                    rootItem->columnCount());\r
-            QVector<QVariant> columnData =\r
-                    getColumnsFromItemElement(child);\r
-            item->child(item->childCount() - 1)->setItemType(ShoppingTreeItem::Item);\r
-            for(int column = 0; column < columnData.size(); column++)\r
-            {\r
-                item->child(item->childCount() - 1)->setData(column, columnData[column]);\r
-            }\r
-            m_domElementForItem.insert(item->child(item->childCount() - 1),\r
-                                       child);\r
-        }\r
-        else\r
-        {\r
-            emit invalidDocument();\r
-            return;\r
-        }\r
-\r
-        child = child.nextSiblingElement();\r
-    }\r
-}\r
-\r
-/*******************************************************************/\r
-QVector<QVariant> ShoppingTreeModel::getColumnsFromItemElement(const QDomElement &element)\r
-{\r
-    QVector<QVariant> data;\r
-    QString title = element.firstChildElement("title").text();\r
-    int quantity = element.firstChildElement("quantity").text().toInt();\r
-    QString store = element.firstChildElement("store").text();\r
-    if(title.isEmpty() || quantity < 0)\r
-    {\r
-        emit invalidDocument();\r
-        return data;\r
-    }\r
-\r
-    data << title << quantity << store;\r
-    return data;\r
-}\r
-\r
-/*******************************************************************/\r
-bool ShoppingTreeModel::updateDomElement(ShoppingTreeItem *item, int column)\r
-{\r
-    QDomElement element = m_domElementForItem.value(item);\r
-\r
-    if(element.isNull())\r
-     return false;\r
-\r
-    bool success = false;\r
-    switch(column)\r
-    {\r
-        case 0:\r
-        {\r
-            QDomElement oldTitleElement = element.firstChildElement("title");\r
-            QDomElement newTitleElement = m_document.createElement("title");\r
-\r
-            QDomText newTitleText = m_document.createTextNode(item->data(0).toString());\r
-            newTitleElement.appendChild(newTitleText);\r
-\r
-            element.replaceChild(newTitleElement, oldTitleElement);\r
-            success = true;\r
-            break;\r
-        }\r
-        case 1:\r
-        {\r
-            QDomElement oldQuantityElement = element.firstChildElement("quantity");\r
-            QDomElement newQuantityElement = m_document.createElement("quantity");\r
-\r
-            QDomText newQuantityText = m_document.createTextNode(item->data(1).toString());\r
-            newQuantityElement.appendChild(newQuantityText);\r
-\r
-            element.replaceChild(newQuantityElement, oldQuantityElement);\r
-            success = true;\r
-            break;\r
-        }\r
-        case 2:\r
-        {\r
-            QDomElement oldStoreElement = element.firstChildElement("store");\r
-            QDomElement newStoreElement = m_document.createElement("store");\r
-\r
-            QDomText newStoreText = m_document.createTextNode(item->data(0).toString());\r
-            newStoreElement.appendChild(newStoreText);\r
-\r
-            element.replaceChild(newStoreElement, oldStoreElement);\r
-            success = true;\r
-            break;\r
-        }\r
-        default:\r
-            success = false;\r
+        if(childElement.nodeName() == "category" || childElement.nodeName() == "item")\r
+            childCount++;\r
     }\r
-\r
-    QDomElement oldDateElement = element.firstChildElement("lastModified");\r
-    if(!oldDateElement.isNull())\r
-    {\r
-        QDomElement newDateElement = m_document.createElement("lastModified");\r
-\r
-        QDomText newDateText = m_document.createTextNode(\r
-                QDateTime::currentDateTime().toString("dd/MM/yyyy-hh:mm:ss"));\r
-        newDateElement.appendChild(newDateText);\r
-\r
-        element.replaceChild(newDateElement, oldDateElement);\r
-    }\r
-\r
-    updateXmlFile();\r
-\r
-    return success;\r
-}\r
-\r
-/*******************************************************************/\r
-void ShoppingTreeModel::updateXmlFile() const\r
-{\r
-    QFile xmlFile(m_xmlFileName);\r
-    xmlFile.remove();\r
-    xmlFile.open(QIODevice::WriteOnly);\r
-    xmlFile.write(m_document.toByteArray(4));\r
-    xmlFile.close();\r
-}\r
-\r
-/*******************************************************************/\r
-void ShoppingTreeModel::sort(int column, Qt::SortOrder order)\r
-{\r
-    // TODO: implement sorting\r
-    ;\r
+    return childCount;\r
 }\r
index 8535e62..92ef5c7 100644 (file)
 #include <QAbstractItemModel>\r
 #include <QDomDocument>\r
 #include <QModelIndex>\r
-#include <QVector>\r
 #include <QVariant>\r
-#include <QHash>\r
 \r
-class ShoppingTreeItem;\r
+class DomItem;\r
 \r
-class ShoppingTreeModel : public QAbstractItemModel\r
+class DomModel : public QAbstractItemModel\r
 {\r
-Q_OBJECT\r
+    Q_OBJECT\r
 \r
 public:\r
-    ShoppingTreeModel(const QString &xmlFileName, QObject *parent = 0);\r
-    ~ShoppingTreeModel();\r
-\r
-    bool addCategory(QString name);\r
-    bool addSubCategory(QString name, int position,\r
-                        const QModelIndex &parent = QModelIndex());\r
-    bool addItem(QString name, int position,\r
-                 const QModelIndex &parent = QModelIndex());\r
-    bool removeCategoryOrItem(const QModelIndex &index = QModelIndex());\r
+    DomModel(QDomDocument document, QObject *parent = 0);\r
+    ~DomModel();\r
 \r
     QVariant data(const QModelIndex &index, int role) const;\r
+    Qt::ItemFlags flags(const QModelIndex &index) const;\r
     QVariant headerData(int section, Qt::Orientation orientation,\r
                         int role = Qt::DisplayRole) const;\r
     QModelIndex index(int row, int column,\r
                       const QModelIndex &parent = QModelIndex()) const;\r
-    QModelIndex parent(const QModelIndex &index) const;\r
-\r
+    QModelIndex parent(const QModelIndex &child) const;\r
     int rowCount(const QModelIndex &parent = QModelIndex()) const;\r
     int columnCount(const QModelIndex &parent = QModelIndex()) const;\r
 \r
-    Qt::ItemFlags flags(const QModelIndex &index) const;\r
-    bool setData(const QModelIndex &index, const QVariant &value,\r
-                 int role = Qt::EditRole);\r
-    bool setHeaderData(int section, Qt::Orientation orientation,\r
-                       const QVariant &value, int role = Qt::EditRole);\r
-    void sort(int column, Qt::SortOrder order);\r
-\r
 private:\r
-    bool insertColumns(int position, int columns,\r
-                           const QModelIndex &parent = QModelIndex());\r
-    bool removeColumns(int position, int columns,\r
-                           const QModelIndex &parent = QModelIndex());\r
-    bool insertRows(int position, int rows,\r
-                    const QModelIndex &parent = QModelIndex());\r
-    bool removeRows(int position, int rows,\r
-                    const QModelIndex &parent = QModelIndex());\r
-\r
-signals:\r
-    void xmlParseError(QString error, int line, int column);\r
-    void invalidDocument();\r
-\r
-public slots:\r
-    void registerInsertedChild(ShoppingTreeItem *item);\r
-    void deleteRemovedChild(ShoppingTreeItem *item);\r
-\r
-protected:\r
-    void parseCategoryElement(const QDomElement &element,\r
-                              ShoppingTreeItem *parentItem = 0);\r
-    QVector<QVariant> getColumnsFromItemElement(const QDomElement &element);\r
-    bool updateDomElement(ShoppingTreeItem *item, int column);\r
-    void updateXmlFile() const;\r
-\r
-private:\r
-    ShoppingTreeItem *getItem(const QModelIndex &index) const;\r
-\r
-    ShoppingTreeItem *rootItem;\r
-    QString m_xmlFileName;\r
-    QDomDocument m_document;\r
-    QHash<ShoppingTreeItem *, QDomElement> m_domElementForItem;\r
+    QDomDocument domDocument;\r
+    QDomNode rootItemNode;\r
+    DomItem *rootItem;\r
 };\r
 \r
 #endif // SHOPPINGTREEMODEL_H\r