added XML visualization for RSpecs
[sface.git] / sface / domModel.py
1 from PyQt4.QtCore import QAbstractItemModel, QVariant, QString, QStringList
2 from PyQt4.QtCore import QModelIndex
3 from PyQt4.QtCore import Qt
4 from PyQt4.QtXml import QDomNode
5 from domItem import domItem
6
7 class domModel(QAbstractItemModel):
8     def __init__(self, document, parent = 0):
9         QAbstractItemModel.__init__(self, parent)
10         self.domDocument = document
11         self.rootItem = domItem(document, 0);
12
13     def data(self, index, role):
14         if not index.isValid():
15             return QVariant()
16         if role != Qt.DisplayRole:
17             return QVariant()
18         node = index.internalPointer().node()
19         attributeMap = node.attributes()
20
21         col = index.column()
22         if col == 0:
23             if node.nodeType() == QDomNode.ElementNode:
24                 qslist = QStringList()
25                 for i in range(attributeMap.count()):
26                     attr = attributeMap.item(i)
27                     elem = (attr.nodeName()
28                             .append(QString('="'))
29                             .append(attr.nodeValue())
30                             .append(QString('"')))
31                     qslist.append(elem)
32                 return (QString('<').
33                         append(node.nodeName()).
34                         append(' ').
35                         append(qslist.join(' ')).
36                         append('>'))
37             elif node.nodeType() == QDomNode.AttributeNode:
38                 return QString('Whozat?!')
39             elif node.nodeType() == QDomNode.TextNode:
40                 return node.nodeValue()
41             elif node.nodeType() == QDomNode.CDATASectionNode:
42                 return QString('unsupported node type')
43             elif node.nodeType() == QDomNode.EntityReferenceNode:
44                 return QString('unsupported node type')
45             elif node.nodeType() == QDomNode.EntityNode:
46                 return QString('unsupported node type')
47             elif node.nodeType() == QDomNode.ProcessingInstructionNode:
48                 return node.nodeName()
49             elif node.nodeType() == QDomNode.CommentNode:
50                 return QString('#').append(node.nodeValue())
51             elif node.nodeType() == QDomNode.DocumentNode:
52                 return QString('unsupported node type')
53             elif node.nodeType() == QDomNode.DocumentTypeNode:
54                 return QString('unsupported node type')
55             elif node.nodeType() == QDomNode.DocumentFragmentNode:
56                 return QString('unsupported node type')
57             elif node.nodeType() == QDomNode.NotationNode:
58                 return QString('unsupported node type')
59             elif node.nodeType() == QDomNode.BaseNode:
60                 return QString('unsupported node type')
61             elif node.nodeType() == QDomNode.CharacterDataNode:
62                 return QString('unsupported node type')
63             else:
64                 return QVariant()
65         else:
66             return QVariant()
67
68     def flags(self, index):
69         if not index.isValid():
70             return Qt.ItemIsEnabled
71         # does this `|` thing hold?
72         return Qt.ItemIsEnabled | Qt.ItemIsSelectable
73         
74     def headerData(self, section, orientation, role):
75         if orientation == Qt.Horizontal and role == Qt.DisplayRole:
76             if section == 0:
77                 return QString("Do I need an header?")
78             else:
79                 return QVariant()
80         else:
81             return QVariant()
82
83     def index(self, row, column, parent):
84         if not parent.isValid():
85             parentItem = self.rootItem
86         else:
87             parentItem = parent.internalPointer()
88
89         childItem = parentItem.child(row)
90         # childItem would be None to say "false"?
91         if childItem:
92             return self.createIndex(row, column, childItem)
93         else:
94             return QModelIndex()
95
96     def parent(self, child):
97         if not child.isValid():
98             return QModelIndex()
99         childItem = child.internalPointer()
100         parentItem = childItem.parent()
101         
102         if not parentItem or parentItem == self.rootItem:
103             return QModelIndex()
104         return self.createIndex(parentItem.row(), 0, parentItem)
105
106     def rowCount(self, parent):
107         if not parent.isValid():
108             parentItem = self.rootItem
109         else:
110             parentItem = parent.internalPointer()
111
112         return parentItem.node().childNodes().count()
113
114     def columnCount(self, parent):
115         # just one column
116         # we'll print tag name (and attributes)
117         # or the tag content
118         return 1