#include #include "regexpmodel.h" #include "regexpparser.h" RegExpModel::RegExpModel(QObject *parent) : QAbstractItemModel(parent) { rootNode = 0; } RegExpModel::~RegExpModel() { delete rootNode; } void RegExpModel::setRootNode(Node *node) { delete rootNode; rootNode = node; reset(); } QModelIndex RegExpModel::index(int row, int column, const QModelIndex &parent) const { if (!rootNode) return QModelIndex(); Node *parentNode = nodeFromIndex(parent); return createIndex(row, column, parentNode->children[row]); } QModelIndex RegExpModel::parent(const QModelIndex &child) const { Node *node = nodeFromIndex(child); if (!node) return QModelIndex(); Node *parentNode = node->parent; if (!parentNode) return QModelIndex(); Node *grandparentNode = parentNode->parent; if (!grandparentNode) return QModelIndex(); int row = grandparentNode->children.indexOf(parentNode); return createIndex(row, child.column(), parentNode); } int RegExpModel::rowCount(const QModelIndex &parent) const { Node *parentNode = nodeFromIndex(parent); if (!parentNode) return 0; return parentNode->children.count(); } int RegExpModel::columnCount(const QModelIndex & /* parent */) const { return 2; } QVariant RegExpModel::data(const QModelIndex &index, int role) const { if (role != Qt::DisplayRole) return QVariant(); Node *node = nodeFromIndex(index); if (!node) return QVariant(); if (index.column() == 0) { switch (node->type) { case Node::RegExp: return tr("RegExp"); case Node::Expression: return tr("Expression"); case Node::Term: return tr("Term"); case Node::Factor: return tr("Factor"); case Node::Atom: return tr("Atom"); case Node::Terminal: return tr("Terminal"); default: return tr("Unknown"); } } else if (index.column() == 1) { return node->str; } return QVariant(); } QVariant RegExpModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { if (section == 0) { return tr("Node"); } else if (section == 1) { return tr("Value"); } } return QVariant(); } Node *RegExpModel::nodeFromIndex(const QModelIndex &index) const { if (index.isValid()) { return static_cast(index.internalPointer()); } else { return rootNode; } }