2
This file is part of Rocs.
3
Copyright 2013 Andreas Cord-Landwehr <cola@uni-paderborn.de>
5
This program is free software; you can redistribute it and/or
6
modify it under the terms of the GNU General Public License as
7
published by the Free Software Foundation; either version 2 of
8
the License, or (at your option) any later version.
10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
GNU General Public License for more details.
15
You should have received a copy of the GNU General Public License
16
along with this program. If not, see <http://www.gnu.org/licenses/>.
19
#include "ApiDocModel.h"
20
#include "ObjectDocumentation.h"
21
#include "MethodDocumentation.h"
22
#include "PropertyDocumentation.h"
30
Item(const QList<QVariant> &data, Item *parent = 0);
33
void appendChild(Item *child);
36
int childCount() const;
37
int columnCount() const;
38
QVariant data(int column) const;
39
void setDocumentAnchor(const QString &document, const QString &anchor);
46
QList<Item*> _childItems;
47
QList<QVariant> _itemData;
53
Item::Item(const QList<QVariant> &data, Item *parent)
61
qDeleteAll(_childItems);
64
void Item::appendChild(Item *item)
66
_childItems.append(item);
69
Item * Item::child(int row)
71
return _childItems.value(row);
74
int Item::childCount() const
76
return _childItems.count();
82
return _parentItem->_childItems.indexOf(const_cast<Item*>(this));
87
int Item::columnCount() const
89
return _itemData.count();
92
QVariant Item::data(int column) const
94
return _itemData.value(column);
97
void Item::setDocumentAnchor(const QString& document, const QString& anchor)
100
_document = document;
103
QString Item::anchor()
108
QString Item::document()
113
Item * Item::parent()
119
// ApiDocModel methods
120
ApiDocModel::ApiDocModel(QList<ObjectDocumentation* > dataList, QObject *parent)
121
: QAbstractItemModel(parent)
123
QList<QVariant> rootData;
124
rootData << i18n("Script Objects");
125
rootItem = new Item(rootData);
126
setupModelData(dataList, rootItem);
129
ApiDocModel::~ApiDocModel()
134
QModelIndex ApiDocModel::index(int row, int column, const QModelIndex &parent) const
136
if (!hasIndex(row, column, parent)) {
137
return QModelIndex();
141
if (!parent.isValid()) {
142
parentItem = rootItem;
145
parentItem = static_cast<Item*>(parent.internalPointer());
148
Item *childItem = parentItem->child(row);
150
return createIndex(row, column, childItem);
153
return QModelIndex();
157
QModelIndex ApiDocModel::parent(const QModelIndex &index) const
159
if (!index.isValid()) {
160
return QModelIndex();
163
Item *childItem = static_cast<Item*>(index.internalPointer());
164
Item *parentItem = childItem->parent();
166
if (parentItem == rootItem) {
167
return QModelIndex();
170
return createIndex(parentItem->row(), 0, parentItem);
173
int ApiDocModel::rowCount(const QModelIndex &parent) const
176
if (parent.column() > 0) {
180
if (!parent.isValid()) {
181
parentItem = rootItem;
184
parentItem = static_cast<Item*>(parent.internalPointer());
187
return parentItem->childCount();
190
int ApiDocModel::columnCount(const QModelIndex &parent) const
192
if (parent.isValid()) {
193
return static_cast<Item*>(parent.internalPointer())->columnCount();
196
return rootItem->columnCount();
200
QVariant ApiDocModel::data(const QModelIndex &index, int role) const
202
if (!index.isValid()) {
206
Item *item = static_cast<Item*>(index.internalPointer());
207
if (role == DocumentRole) {
208
return QVariant::fromValue<QString>(item->document());
210
if (role == AnchorRole) {
211
return QVariant::fromValue<QString>(item->anchor());
213
if (role != Qt::DisplayRole) {
216
return item->data(index.column());
219
Qt::ItemFlags ApiDocModel::flags(const QModelIndex &index) const
221
if (!index.isValid()) {
224
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
227
QVariant ApiDocModel::headerData(int section, Qt::Orientation orientation, int role) const
229
if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
230
return rootItem->data(section);
236
void ApiDocModel::setupModelData(QList<ObjectDocumentation* > dataList, Item *parent)
238
foreach (ObjectDocumentation *object, dataList) {
239
QList<QVariant> columnData;
240
columnData << object->id();
241
Item *objectItem = new Item(columnData, parent);
242
objectItem->setDocumentAnchor(object->apiDocumentIdentifier(), QString());
243
parent->appendChild(objectItem);
245
QList<QVariant> propertyColumnData;
246
propertyColumnData << i18n("Properties");
247
Item *propertyContainer = new Item(propertyColumnData, objectItem);
248
propertyContainer->setDocumentAnchor(object->apiDocumentIdentifier(), "properties");
249
objectItem->appendChild(propertyContainer);
250
foreach (PropertyDocumentation *property, object->properties()) {
251
QList<QVariant> columnData;
252
columnData << property->name();
253
Item *propertyItem = new Item(columnData, propertyContainer);
254
propertyItem->setDocumentAnchor(object->apiDocumentIdentifier(),
255
property->apiDocumentAnchor());
256
propertyContainer->appendChild(propertyItem);
259
QList<QVariant> methodColumnData;
260
methodColumnData << i18n("Methods");
261
Item *methodContainer = new Item(methodColumnData, objectItem);
262
methodContainer->setDocumentAnchor(object->apiDocumentIdentifier(), "methods");
263
objectItem->appendChild(methodContainer);
264
foreach (MethodDocumentation *method, object->methods()) {
265
QList<QVariant> columnData;
266
columnData << method->name();
267
Item *methodProperty = new Item(columnData, methodContainer);
268
methodProperty->setDocumentAnchor(object->apiDocumentIdentifier(),
269
method->apiDocumentAnchor());
270
methodContainer->appendChild(methodProperty);