source: trunk/examples/itemviews/simpledommodel/dommodel.cpp@ 561

Last change on this file since 561 was 561, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.1 sources.

File size: 5.1 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the examples of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include <QtGui>
43#include <QtXml>
44
45#include "domitem.h"
46#include "dommodel.h"
47
48//! [0]
49DomModel::DomModel(QDomDocument document, QObject *parent)
50 : QAbstractItemModel(parent), domDocument(document)
51{
52 rootItem = new DomItem(domDocument, 0);
53}
54//! [0]
55
56//! [1]
57DomModel::~DomModel()
58{
59 delete rootItem;
60}
61//! [1]
62
63//! [2]
64int DomModel::columnCount(const QModelIndex &/*parent*/) const
65{
66 return 3;
67}
68//! [2]
69
70//! [3]
71QVariant DomModel::data(const QModelIndex &index, int role) const
72{
73 if (!index.isValid())
74 return QVariant();
75
76 if (role != Qt::DisplayRole)
77 return QVariant();
78
79 DomItem *item = static_cast<DomItem*>(index.internalPointer());
80
81 QDomNode node = item->node();
82//! [3] //! [4]
83 QStringList attributes;
84 QDomNamedNodeMap attributeMap = node.attributes();
85
86 switch (index.column()) {
87 case 0:
88 return node.nodeName();
89 case 1:
90 for (int i = 0; i < attributeMap.count(); ++i) {
91 QDomNode attribute = attributeMap.item(i);
92 attributes << attribute.nodeName() + "=\""
93 +attribute.nodeValue() + "\"";
94 }
95 return attributes.join(" ");
96 case 2:
97 return node.nodeValue().split("\n").join(" ");
98 default:
99 return QVariant();
100 }
101}
102//! [4]
103
104//! [5]
105Qt::ItemFlags DomModel::flags(const QModelIndex &index) const
106{
107 if (!index.isValid())
108 return 0;
109
110 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
111}
112//! [5]
113
114//! [6]
115QVariant DomModel::headerData(int section, Qt::Orientation orientation,
116 int role) const
117{
118 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
119 switch (section) {
120 case 0:
121 return tr("Name");
122 case 1:
123 return tr("Attributes");
124 case 2:
125 return tr("Value");
126 default:
127 return QVariant();
128 }
129 }
130
131 return QVariant();
132}
133//! [6]
134
135//! [7]
136QModelIndex DomModel::index(int row, int column, const QModelIndex &parent)
137 const
138{
139 if (!hasIndex(row, column, parent))
140 return QModelIndex();
141
142 DomItem *parentItem;
143
144 if (!parent.isValid())
145 parentItem = rootItem;
146 else
147 parentItem = static_cast<DomItem*>(parent.internalPointer());
148//! [7]
149
150//! [8]
151 DomItem *childItem = parentItem->child(row);
152 if (childItem)
153 return createIndex(row, column, childItem);
154 else
155 return QModelIndex();
156}
157//! [8]
158
159//! [9]
160QModelIndex DomModel::parent(const QModelIndex &child) const
161{
162 if (!child.isValid())
163 return QModelIndex();
164
165 DomItem *childItem = static_cast<DomItem*>(child.internalPointer());
166 DomItem *parentItem = childItem->parent();
167
168 if (!parentItem || parentItem == rootItem)
169 return QModelIndex();
170
171 return createIndex(parentItem->row(), 0, parentItem);
172}
173//! [9]
174
175//! [10]
176int DomModel::rowCount(const QModelIndex &parent) const
177{
178 if (parent.column() > 0)
179 return 0;
180
181 DomItem *parentItem;
182
183 if (!parent.isValid())
184 parentItem = rootItem;
185 else
186 parentItem = static_cast<DomItem*>(parent.internalPointer());
187
188 return parentItem->node().childNodes().count();
189}
190//! [10]
Note: See TracBrowser for help on using the repository browser.