Setting tag sface-0.1-7
[sface.git] / sface / rspecwindow.py
index 4db87c6..f9bca14 100644 (file)
@@ -5,20 +5,14 @@ from PyQt4.QtCore import *
 from PyQt4.QtGui import *
 from PyQt4.QtXml import *
 
+from sface.xmlwidget import *
 from sface.config import config
 from sface.screens.sfascreen import SfaScreen
 
 
-class RSpecView(QTreeView):
+class RSpecView(XmlView):
     def __init__(self, parent):
-        QTreeView.__init__(self, parent)
-
-        self.setAnimated(True)
-        self.setItemsExpandable(True)
-        self.setRootIsDecorated(True)
-        self.setHeaderHidden(True)
-        self.setAttribute(Qt.WA_MacShowFocusRect, 0)
-        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
+        XmlView.__init__(self, parent)
 
     def expandMatchingText(self, txt):
         self.collapseAll()
@@ -48,183 +42,19 @@ class RSpecView(QTreeView):
             index = model.index(r, 0)
             search(index)
 
-
-class DomModel(QAbstractItemModel):
-    def __init__(self, document, parent = 0):
-        QAbstractItemModel.__init__(self, parent)
-        self.domDocument = document
-        # one of the children of the rootItem is the 'xml' thing.
-        # here I delete it.
-        childList = document.childNodes()
-        for i in range(childList.count()):
-            currElem = childList.item(i)
-            if (currElem.nodeType() == QDomNode.ProcessingInstructionNode):
-                document.removeChild(currElem)
-                break
-        self.rootItem = DomItem(document, 0);
-
-    def data(self, index, role):
-        if not index.isValid():
-            return QVariant()
-        if role != Qt.DisplayRole:
-            return QVariant()
-        node = index.internalPointer().node()
-        attributeMap = node.attributes()
-
-        col = index.column()
-        if col == 0:
-            if node.nodeType() == QDomNode.ElementNode:
-                qslist = QStringList()
-                for i in range(attributeMap.count()):
-                    attr = attributeMap.item(i)
-                    elem = '%s="%s"' % (attr.nodeName(), attr.nodeValue())
-                    qslist.append(elem)
-                return QString("<%s %s>" % (node.nodeName(), qslist.join(' ')))
-            elif node.nodeType() == QDomNode.AttributeNode:
-                return QString('Whozat?!')
-            elif node.nodeType() == QDomNode.TextNode:
-                return node.nodeValue()
-            elif node.nodeType() == QDomNode.CDATASectionNode:
-                return QString('unsupported node type')
-            elif node.nodeType() == QDomNode.EntityReferenceNode:
-                return QString('unsupported node type')
-            elif node.nodeType() == QDomNode.EntityNode:
-                return QString('unsupported node type')
-            elif node.nodeType() == QDomNode.ProcessingInstructionNode:
-                return QVariant()
-                #return node.nodeName()
-            elif node.nodeType() == QDomNode.CommentNode:
-                return QString('#').append(node.nodeValue())
-            elif node.nodeType() == QDomNode.DocumentNode:
-                return QString('unsupported node type')
-            elif node.nodeType() == QDomNode.DocumentTypeNode:
-                return QString('unsupported node type')
-            elif node.nodeType() == QDomNode.DocumentFragmentNode:
-                return QString('unsupported node type')
-            elif node.nodeType() == QDomNode.NotationNode:
-                return QString('unsupported node type')
-            elif node.nodeType() == QDomNode.BaseNode:
-                return QString('unsupported node type')
-            elif node.nodeType() == QDomNode.CharacterDataNode:
-                return QString('unsupported node type')
-            else:
-                return QVariant()
-        else:
-            return QVariant()
-
-    def flags(self, index):
-        if not index.isValid():
-            return Qt.ItemIsEnabled
-        return Qt.ItemIsEnabled | Qt.ItemIsSelectable
-        
-    def headerData(self, section, orientation, role):
-        return QVariant()
-
-    def index(self, row, column, parent=None):
-        if not parent or not parent.isValid():
-            parentItem = self.rootItem
-        else:
-            parentItem = parent.internalPointer()
-
-        childItem = parentItem.child(row)
-        # childItem would be None to say "false"?
-        if childItem:
-            return self.createIndex(row, column, childItem)
-        else:
-            return QModelIndex()
-
-    def parent(self, child):
-        if not child.isValid():
-            return QModelIndex()
-        childItem = child.internalPointer()
-        parentItem = childItem.parent()
-        
-        if not parentItem or parentItem == self.rootItem:
-            return QModelIndex()
-        return self.createIndex(parentItem.row(), 0, parentItem)
-
-    def rowCount(self, parent=None):
-        if not parent or not parent.isValid():
-            parentItem = self.rootItem
-        else:
-            parentItem = parent.internalPointer()
-
-        return parentItem.node().childNodes().count()
-
-    def columnCount(self, parent):
-        # just one column we'll print tag name (and attributes) or the
-        # tag content
-        return 1
-
-
-class DomItem:
-    # wrapper around PyQt4.QtXml.QDomNode it keeps an hash of
-    # childrens for performance reasons
-
-    def __init__(self, node, row, parent = 0):
-        # node is of type PyQt4.QtXml.QDomNode
-        self.domNode = node
-        self.parentItem = parent
-        self.rowNumber = row
-        self.childItems = {}
-
-    def child(self, i):
-        if i in self.childItems:
-            return self.childItems[i]
-        if i >= 0 and i < self.domNode.childNodes().count():
-            childNode = self.domNode.childNodes().item(i)
-            childItem = DomItem(childNode, i, self)
-            self.childItems[i] = childItem
-            return childItem
-        return None
-            
-    def parent(self):
-        return self.parentItem
-
-    def node(self):
-        return self.domNode
-
-    def row(self):
-        return self.rowNumber
-    
-
-class RSpecWindow(QDialog):
+class RSpecWindow(XmlWindow):
     def __init__(self, parent=None):
-        QDialog.__init__(self, parent)
-        self.setWindowTitle("RSPec View")
-
-        self.document = None
-        self.model = None
-
+        XmlWindow.__init__(self, parent, 'RSpec Window')
         self.view = RSpecView(self)
-        layout = QVBoxLayout()
-        layout.addWidget(self.view)
-        self.setLayout(layout)
-
-        self.updateView()
 
-    def show(self):
-        self.updateView()
-        QDialog.show(self)
-        
     def showNode(self, hostname):
         self.view.expandMatchingText(hostname)
 
     def updateView(self):
-        del self.document
-        del self.model
-        self.document = None
-        self.model = None
+        XmlWindow.updateView(self)
 
         rspec_file = config.getSliceRSpecFile()
         if not os.path.exists(rspec_file):
             return
 
-        self.document = QDomDocument("RSpec")
         self.document.setContent(open(rspec_file,'r').read())
-        self.model = DomModel(self.document, self)
-
-        self.view.setModel(self.model)
-        self.view.expand(self.model.index(0, 0)) #expand first level only
-
-