check if rspec is not there
[sface.git] / sface / xmlwindow.py
1 import sys
2
3 from PyQt4.QtCore import *
4 from PyQt4.QtGui import *
5 from PyQt4.QtXml import *
6
7 from sface.config import config
8
9
10 class DomModel(QAbstractItemModel):
11     def __init__(self, document, parent = 0):
12         QAbstractItemModel.__init__(self, parent)
13         self.domDocument = document
14         self.rootItem = DomItem(document, 0);
15
16     def data(self, index, role):
17         if not index.isValid():
18             return QVariant()
19         if role != Qt.DisplayRole:
20             return QVariant()
21         node = index.internalPointer().node()
22         attributeMap = node.attributes()
23
24         col = index.column()
25         if col == 0:
26             if node.nodeType() == QDomNode.ElementNode:
27                 qslist = QStringList()
28                 for i in range(attributeMap.count()):
29                     attr = attributeMap.item(i)
30                     elem = (attr.nodeName()
31                             .append(QString('="'))
32                             .append(attr.nodeValue())
33                             .append(QString('"')))
34                     qslist.append(elem)
35                 return (QString('<').
36                         append(node.nodeName()).
37                         append(' ').
38                         append(qslist.join(' ')).
39                         append('>'))
40             elif node.nodeType() == QDomNode.AttributeNode:
41                 return QString('Whozat?!')
42             elif node.nodeType() == QDomNode.TextNode:
43                 return node.nodeValue()
44             elif node.nodeType() == QDomNode.CDATASectionNode:
45                 return QString('unsupported node type')
46             elif node.nodeType() == QDomNode.EntityReferenceNode:
47                 return QString('unsupported node type')
48             elif node.nodeType() == QDomNode.EntityNode:
49                 return QString('unsupported node type')
50             elif node.nodeType() == QDomNode.ProcessingInstructionNode:
51                 return node.nodeName()
52             elif node.nodeType() == QDomNode.CommentNode:
53                 return QString('#').append(node.nodeValue())
54             elif node.nodeType() == QDomNode.DocumentNode:
55                 return QString('unsupported node type')
56             elif node.nodeType() == QDomNode.DocumentTypeNode:
57                 return QString('unsupported node type')
58             elif node.nodeType() == QDomNode.DocumentFragmentNode:
59                 return QString('unsupported node type')
60             elif node.nodeType() == QDomNode.NotationNode:
61                 return QString('unsupported node type')
62             elif node.nodeType() == QDomNode.BaseNode:
63                 return QString('unsupported node type')
64             elif node.nodeType() == QDomNode.CharacterDataNode:
65                 return QString('unsupported node type')
66             else:
67                 return QVariant()
68         else:
69             return QVariant()
70
71     def flags(self, index):
72         if not index.isValid():
73             return Qt.ItemIsEnabled
74         # does this `|` thing hold?
75         return Qt.ItemIsEnabled | Qt.ItemIsSelectable
76         
77     def headerData(self, section, orientation, role):
78         if orientation == Qt.Horizontal and role == Qt.DisplayRole:
79             if section == 0:
80                 return QString("Do I need an header?")
81             else:
82                 return QVariant()
83         else:
84             return QVariant()
85
86     def index(self, row, column, parent):
87         if not parent.isValid():
88             parentItem = self.rootItem
89         else:
90             parentItem = parent.internalPointer()
91
92         childItem = parentItem.child(row)
93         # childItem would be None to say "false"?
94         if childItem:
95             return self.createIndex(row, column, childItem)
96         else:
97             return QModelIndex()
98
99     def parent(self, child):
100         if not child.isValid():
101             return QModelIndex()
102         childItem = child.internalPointer()
103         parentItem = childItem.parent()
104         
105         if not parentItem or parentItem == self.rootItem:
106             return QModelIndex()
107         return self.createIndex(parentItem.row(), 0, parentItem)
108
109     def rowCount(self, parent):
110         if not parent.isValid():
111             parentItem = self.rootItem
112         else:
113             parentItem = parent.internalPointer()
114
115         return parentItem.node().childNodes().count()
116
117     def columnCount(self, parent):
118         # just one column
119         # we'll print tag name (and attributes)
120         # or the tag content
121         return 1
122
123
124 class DomItem:
125     # wrapper around PyQt4.QtXml.QDomNode
126     # it keeps an hash of childrens for
127     # performance reasons
128
129     def __init__(self, node, row, parent = 0):
130         # node is of type PyQt4.QtXml.QDomNode
131         self.domNode = node
132         self.parentItem = parent
133         self.rowNumber = row
134         self.childItems = {}
135
136     def child(self, i):
137         if i in self.childItems:
138             return self.childItems[i]
139         if i >= 0 and i < self.domNode.childNodes().count():
140             childNode = self.domNode.childNodes().item(i)
141             childItem = DomItem(childNode, i, self)
142             self.childItems[i] = childItem
143             return childItem
144         return None
145             
146     def parent(self):
147         return self.parentItem
148
149     def node(self):
150         return self.domNode
151
152     def row(self):
153         return self.rowNumber
154     
155
156
157 class XmlWindow(QDialog):
158     def __init__(self, parent=None):
159         QDialog.__init__(self, parent)
160         self.setWindowTitle("RSpec View")
161
162
163     def init_view(self, init_view):
164         document = QDomDocument("RSpec")
165         rspec_file = config.getSliceRSpecFile()
166         if not os.path.exists(rspec_file):
167             return
168
169         document.setContent(open(rspec_file,'r').read())
170         model = DomModel(document, self)
171
172         view = QTreeView()
173         view.setModel(model)
174
175         layout = QVBoxLayout()
176         layout.addWidget(self.view)
177         self.setLayout(layout)
178
179