home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_2308 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  22.8 KB  |  659 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import sys
  5. import logging
  6. import os.path as os
  7. import re
  8.  
  9. try:
  10.     from xml.etree.ElementTree import parse, SubElement
  11. except ImportError:
  12.     
  13.     try:
  14.         from ElementTree import parse, SubElement
  15.     except ImportError:
  16.         
  17.         try:
  18.             from elementtree.ElementTree import parse, SubElement
  19.         except ImportError:
  20.             from PyQt4.elementtree.ElementTree import parse, SubElement
  21.         except:
  22.             None<EXCEPTION MATCH>ImportError
  23.         
  24.  
  25.         None<EXCEPTION MATCH>ImportError
  26.     
  27.  
  28.     None<EXCEPTION MATCH>ImportError
  29.  
  30. from PyQt4.uic.exceptions import NoSuchWidgetError
  31. from PyQt4.uic.objcreator import QObjectCreator
  32. from PyQt4.uic.properties import Properties
  33. logger = logging.getLogger(__name__)
  34. DEBUG = logger.debug
  35. if sys.version_info < (2, 4, 0):
  36.     
  37.     def reversed(seq):
  38.         for i in xrange(len(seq) - 1, -1, -1):
  39.             yield seq[i]
  40.         
  41.  
  42.  
  43. QtCore = None
  44. QtGui = None
  45.  
  46. def gridPosition(elem):
  47.     
  48.     try:
  49.         return (int(elem.attrib['row']), int(elem.attrib['column']), int(elem.attrib.get('rowspan', 1)), int(elem.attrib.get('colspan', 1)))
  50.     except KeyError:
  51.         return ()
  52.  
  53.  
  54.  
  55. class WidgetStack(list):
  56.     topwidget = None
  57.     
  58.     def push(self, item):
  59.         DEBUG('push %s %s' % (item.metaObject().className(), item.objectName()))
  60.         self.append(item)
  61.         if isinstance(item, QtGui.QWidget):
  62.             self.topwidget = item
  63.         
  64.  
  65.     
  66.     def popLayout(self):
  67.         layout = list.pop(self)
  68.         DEBUG('pop layout %s %s' % (layout.metaObject().className(), layout.objectName()))
  69.         return layout
  70.  
  71.     
  72.     def popWidget(self):
  73.         widget = list.pop(self)
  74.         DEBUG('pop widget %s %s' % (widget.metaObject().className(), widget.objectName()))
  75.         for item in reversed(self):
  76.             if isinstance(item, QtGui.QWidget):
  77.                 self.topwidget = item
  78.                 break
  79.                 continue
  80.         else:
  81.             self.topwidget = None
  82.         DEBUG('new topwidget %s' % (self.topwidget,))
  83.         return widget
  84.  
  85.     
  86.     def peek(self):
  87.         return self[-1]
  88.  
  89.     
  90.     def topIsLayout(self):
  91.         return isinstance(self[-1], QtGui.QLayout)
  92.  
  93.  
  94.  
  95. class UIParser(object):
  96.     
  97.     def __init__(self, QtCoreModule, QtGuiModule, creatorPolicy):
  98.         global QtCore, QtGui
  99.         self.factory = QObjectCreator(creatorPolicy)
  100.         self.wprops = Properties(self.factory, QtCoreModule, QtGuiModule)
  101.         QtCore = QtCoreModule
  102.         QtGui = QtGuiModule
  103.         self.reset()
  104.  
  105.     
  106.     def uniqueName(self, name):
  107.         
  108.         try:
  109.             suffix = self.name_suffixes[name]
  110.         except KeyError:
  111.             self.name_suffixes[name] = 0
  112.             return name
  113.  
  114.         suffix += 1
  115.         self.name_suffixes[name] = suffix
  116.         return '%s%i' % (name, suffix)
  117.  
  118.     
  119.     def reset(self):
  120.         
  121.         try:
  122.             self.wprops.reset()
  123.         except AttributeError:
  124.             pass
  125.  
  126.         self.toplevelWidget = None
  127.         self.stack = WidgetStack()
  128.         self.name_suffixes = { }
  129.         self.defaults = {
  130.             'spacing': 6,
  131.             'margin': 0 }
  132.         self.actions = []
  133.         self.currentActionGroup = None
  134.         self.resources = []
  135.         self.button_groups = []
  136.  
  137.     
  138.     def setupObject(self, clsname, parent, branch, is_attribute = True):
  139.         if not branch.attrib.get('name'):
  140.             pass
  141.         name = self.uniqueName(clsname[1:].lower())
  142.         if parent is None:
  143.             args = ()
  144.         else:
  145.             args = (parent,)
  146.         obj = self.factory.createQObject(clsname, name, args, is_attribute)
  147.         self.wprops.setProperties(obj, branch)
  148.         obj.setObjectName(name)
  149.         if is_attribute:
  150.             setattr(self.toplevelWidget, name, obj)
  151.         
  152.         return obj
  153.  
  154.     
  155.     def createWidget(self, elem):
  156.         
  157.         def widgetClass(elem):
  158.             cls = elem.attrib['class'].replace('::', '.')
  159.             if cls == 'Line':
  160.                 return 'QFrame'
  161.             return cls
  162.  
  163.         self.column_counter = 0
  164.         self.row_counter = 0
  165.         self.item_nr = 0
  166.         self.itemstack = []
  167.         self.sorting_enabled = None
  168.         parent = self.stack.topwidget
  169.         if isinstance(parent, (QtGui.QToolBox, QtGui.QTabWidget, QtGui.QStackedWidget, QtGui.QDockWidget, QtGui.QWizard)):
  170.             parent = None
  171.         
  172.         self.stack.push(self.setupObject(widgetClass(elem), parent, elem))
  173.         if isinstance(self.stack.topwidget, QtGui.QTableWidget):
  174.             self.stack.topwidget.setColumnCount(len(elem.findall('column')))
  175.             self.stack.topwidget.setRowCount(len(elem.findall('row')))
  176.         
  177.         self.traverseWidgetTree(elem)
  178.         widget = self.stack.popWidget()
  179.         if isinstance(widget, QtGui.QTreeView):
  180.             self.handleHeaderView(elem, 'header', widget.header())
  181.         elif isinstance(widget, QtGui.QTableView):
  182.             self.handleHeaderView(elem, 'horizontalHeader', widget.horizontalHeader())
  183.             self.handleHeaderView(elem, 'verticalHeader', widget.verticalHeader())
  184.         elif isinstance(widget, QtGui.QAbstractButton):
  185.             bg_i18n = self.wprops.getAttribute(elem, 'buttonGroup')
  186.             if bg_i18n is not None:
  187.                 bg_name = bg_i18n.string
  188.                 for bg in self.button_groups:
  189.                     if bg.objectName() == bg_name:
  190.                         break
  191.                         continue
  192.                 else:
  193.                     bg = self.factory.createQObject('QButtonGroup', bg_name, (self.toplevelWidget,))
  194.                     self.button_groups.append(bg)
  195.                 bg.addButton(widget)
  196.             
  197.         
  198.         if self.sorting_enabled is not None:
  199.             widget.setSortingEnabled(self.sorting_enabled)
  200.             self.sorting_enabled = None
  201.         
  202.         if self.stack.topIsLayout():
  203.             lay = self.stack.peek()
  204.             gp = elem.attrib['grid-position']
  205.             if isinstance(lay, QtGui.QFormLayout):
  206.                 if gp[1]:
  207.                     role = QtGui.QFormLayout.FieldRole
  208.                 else:
  209.                     role = QtGui.QFormLayout.LabelRole
  210.                 lay.setWidget(gp[0], role, widget)
  211.             else:
  212.                 lay.addWidget(widget, *gp)
  213.         
  214.         topwidget = self.stack.topwidget
  215.         if isinstance(topwidget, QtGui.QToolBox):
  216.             icon = self.wprops.getAttribute(elem, 'icon')
  217.             if icon is not None:
  218.                 topwidget.addItem(widget, icon, self.wprops.getAttribute(elem, 'label'))
  219.             else:
  220.                 topwidget.addItem(widget, self.wprops.getAttribute(elem, 'label'))
  221.             tooltip = self.wprops.getAttribute(elem, 'toolTip')
  222.             if tooltip is not None:
  223.                 topwidget.setItemToolTip(topwidget.indexOf(widget), tooltip)
  224.             
  225.         elif isinstance(topwidget, QtGui.QTabWidget):
  226.             icon = self.wprops.getAttribute(elem, 'icon')
  227.             if icon is not None:
  228.                 topwidget.addTab(widget, icon, self.wprops.getAttribute(elem, 'title'))
  229.             else:
  230.                 topwidget.addTab(widget, self.wprops.getAttribute(elem, 'title'))
  231.             tooltip = self.wprops.getAttribute(elem, 'toolTip')
  232.             if tooltip is not None:
  233.                 topwidget.setTabToolTip(topwidget.indexOf(widget), tooltip)
  234.             
  235.         elif isinstance(topwidget, QtGui.QWizard):
  236.             topwidget.addPage(widget)
  237.         elif isinstance(topwidget, QtGui.QStackedWidget):
  238.             topwidget.addWidget(widget)
  239.         elif isinstance(topwidget, (QtGui.QDockWidget, QtGui.QScrollArea)):
  240.             topwidget.setWidget(widget)
  241.         elif isinstance(topwidget, QtGui.QMainWindow):
  242.             if type(widget) == QtGui.QWidget:
  243.                 topwidget.setCentralWidget(widget)
  244.             elif isinstance(widget, QtGui.QToolBar):
  245.                 tbArea = self.wprops.getAttribute(elem, 'toolBarArea')
  246.                 if tbArea is None:
  247.                     topwidget.addToolBar(widget)
  248.                 elif isinstance(tbArea, str):
  249.                     tbArea = getattr(QtCore.Qt, tbArea)
  250.                 else:
  251.                     tbArea = QtCore.Qt.ToolBarArea(tbArea)
  252.                 topwidget.addToolBar(tbArea, widget)
  253.                 tbBreak = self.wprops.getAttribute(elem, 'toolBarBreak')
  254.                 if tbBreak:
  255.                     topwidget.insertToolBarBreak(widget)
  256.                 
  257.             elif isinstance(widget, QtGui.QMenuBar):
  258.                 topwidget.setMenuBar(widget)
  259.             elif isinstance(widget, QtGui.QStatusBar):
  260.                 topwidget.setStatusBar(widget)
  261.             elif isinstance(widget, QtGui.QDockWidget):
  262.                 dwArea = self.wprops.getAttribute(elem, 'dockWidgetArea')
  263.                 topwidget.addDockWidget(QtCore.Qt.DockWidgetArea(dwArea), widget)
  264.             
  265.         
  266.  
  267.     
  268.     def handleHeaderView(self, elem, name, header):
  269.         value = self.wprops.getAttribute(elem, name + 'Visible')
  270.         if value is not None:
  271.             header.setVisible(value)
  272.         
  273.         value = self.wprops.getAttribute(elem, name + 'CascadingSectionResizes')
  274.         if value is not None:
  275.             header.setCascadingSectionResizes(value)
  276.         
  277.         value = self.wprops.getAttribute(elem, name + 'DefaultSectionSize')
  278.         if value is not None:
  279.             header.setDefaultSectionSize(value)
  280.         
  281.         value = self.wprops.getAttribute(elem, name + 'HighlightSections')
  282.         if value is not None:
  283.             header.setHighlightSections(value)
  284.         
  285.         value = self.wprops.getAttribute(elem, name + 'MinimumSectionSize')
  286.         if value is not None:
  287.             header.setMinimumSectionSize(value)
  288.         
  289.         value = self.wprops.getAttribute(elem, name + 'ShowSortIndicator')
  290.         if value is not None:
  291.             header.setSortIndicatorShown(value)
  292.         
  293.         value = self.wprops.getAttribute(elem, name + 'StretchLastSection')
  294.         if value is not None:
  295.             header.setStretchLastSection(value)
  296.         
  297.  
  298.     
  299.     def createSpacer(self, elem):
  300.         width = int(elem.findtext('property/size/width'))
  301.         height = int(elem.findtext('property/size/height'))
  302.         sizeType = self.wprops.getProperty(elem, 'sizeType', QtGui.QSizePolicy.Expanding)
  303.         policy = (QtGui.QSizePolicy.Minimum, sizeType)
  304.         if self.wprops.getProperty(elem, 'orientation') == QtCore.Qt.Horizontal:
  305.             policy = (policy[1], policy[0])
  306.         
  307.         spacer = self.factory.createQObject('QSpacerItem', self.uniqueName('spacerItem'), (width, height) + policy, is_attribute = False)
  308.         if self.stack.topIsLayout():
  309.             lay = self.stack.peek()
  310.             gp = elem.attrib['grid-position']
  311.             if isinstance(lay, QtGui.QFormLayout):
  312.                 if gp[1]:
  313.                     role = QtGui.QFormLayout.FieldRole
  314.                 else:
  315.                     role = QtGui.QFormLayout.LabelRole
  316.                 lay.setItem(gp[0], role, spacer)
  317.             else:
  318.                 lay.addItem(spacer, *gp)
  319.         
  320.  
  321.     
  322.     def createLayout(self, elem):
  323.         left = self.wprops.getProperty(elem, 'leftMargin', -1)
  324.         top = self.wprops.getProperty(elem, 'topMargin', -1)
  325.         right = self.wprops.getProperty(elem, 'rightMargin', -1)
  326.         bottom = self.wprops.getProperty(elem, 'bottomMargin', -1)
  327.         
  328.         def comp_property(m, so_far = -2, nr = 0):
  329.             if m >= 0:
  330.                 nr += 1
  331.                 if so_far == -2:
  332.                     so_far = m
  333.                 elif so_far != m:
  334.                     so_far = -1
  335.                 
  336.             
  337.             return (so_far, nr)
  338.  
  339.         (margin, nr_margins) = comp_property(left)
  340.         (margin, nr_margins) = comp_property(top, margin, nr_margins)
  341.         (margin, nr_margins) = comp_property(right, margin, nr_margins)
  342.         (margin, nr_margins) = comp_property(bottom, margin, nr_margins)
  343.         if nr_margins > 0:
  344.             if nr_margins == 4 and margin >= 0:
  345.                 me = SubElement(elem, 'property', name = 'margin')
  346.                 SubElement(me, 'number').text = str(margin)
  347.             else:
  348.                 cme = SubElement(elem, 'property', name = 'pyuicContentsMargins')
  349.                 SubElement(cme, 'number').text = str(left)
  350.                 SubElement(cme, 'number').text = str(top)
  351.                 SubElement(cme, 'number').text = str(right)
  352.                 SubElement(cme, 'number').text = str(bottom)
  353.         
  354.         horiz = self.wprops.getProperty(elem, 'horizontalSpacing', -1)
  355.         vert = self.wprops.getProperty(elem, 'verticalSpacing', -1)
  356.         if horiz >= 0 or vert >= 0:
  357.             cme = SubElement(elem, 'property', name = 'pyuicSpacing')
  358.             SubElement(cme, 'number').text = str(horiz)
  359.             SubElement(cme, 'number').text = str(vert)
  360.         
  361.         classname = elem.attrib['class']
  362.         if self.stack.topIsLayout():
  363.             parent = None
  364.         else:
  365.             parent = self.stack.topwidget
  366.         if 'name' not in elem.attrib:
  367.             elem.attrib['name'] = classname[1:].lower()
  368.         
  369.         self.stack.push(self.setupObject(classname, parent, elem))
  370.         self.traverseWidgetTree(elem)
  371.         layout = self.stack.popLayout()
  372.         if self.stack.topIsLayout():
  373.             top_layout = self.stack.peek()
  374.             gp = elem.attrib['grid-position']
  375.             if isinstance(top_layout, QtGui.QFormLayout):
  376.                 if gp[1]:
  377.                     role = QtGui.QFormLayout.FieldRole
  378.                 else:
  379.                     role = QtGui.QFormLayout.LabelRole
  380.                 top_layout.setLayout(gp[0], role, layout)
  381.             else:
  382.                 self.configureLayout(elem, layout)
  383.                 top_layout.addLayout(layout, *gp)
  384.         else:
  385.             self.configureLayout(elem, layout)
  386.  
  387.     
  388.     def configureLayout(self, elem, layout):
  389.         if isinstance(layout, QtGui.QGridLayout):
  390.             self.setArray(elem, 'columnminimumwidth', layout.setColumnMinimumWidth)
  391.             self.setArray(elem, 'rowminimumheight', layout.setRowMinimumHeight)
  392.             self.setArray(elem, 'columnstretch', layout.setColumnStretch)
  393.             self.setArray(elem, 'rowstretch', layout.setRowStretch)
  394.         elif isinstance(layout, QtGui.QBoxLayout):
  395.             self.setArray(elem, 'stretch', layout.setStretch)
  396.         
  397.  
  398.     
  399.     def setArray(self, elem, name, setter):
  400.         array = elem.attrib.get(name)
  401.         if array:
  402.             for idx, value in enumerate(array.split(',')):
  403.                 value = int(value)
  404.                 if value > 0:
  405.                     setter(idx, value)
  406.                     continue
  407.             
  408.         
  409.  
  410.     
  411.     def handleItem(self, elem):
  412.         pass
  413.  
  414.     
  415.     def addAction(self, elem):
  416.         self.actions.append((self.stack.topwidget, elem.attrib['name']))
  417.  
  418.     
  419.     def addHeader(self, elem):
  420.         w = self.stack.topwidget
  421.         if isinstance(w, QtGui.QTreeWidget):
  422.             text = self.wprops.getProperty(elem, 'text')
  423.             icon = self.wprops.getProperty(elem, 'icon')
  424.             if text:
  425.                 w.headerItem().setText(self.column_counter, text)
  426.             
  427.             if icon:
  428.                 w.headerItem().setIcon(self.column_counter, icon)
  429.             
  430.             self.column_counter += 1
  431.         elif isinstance(w, QtGui.QTableWidget):
  432.             if len(elem) == 0:
  433.                 return None
  434.             text = self.wprops.getProperty(elem, 'text')
  435.             icon = self.wprops.getProperty(elem, 'icon')
  436.             item = self.factory.createQObject('QTableWidgetItem', 'item', (), False)
  437.             if elem.tag == 'column':
  438.                 w.setHorizontalHeaderItem(self.column_counter, item)
  439.                 if text:
  440.                     w.horizontalHeaderItem(self.column_counter).setText(text)
  441.                 
  442.                 if icon:
  443.                     item.setIcon(icon)
  444.                 
  445.                 self.column_counter += 1
  446.             elif elem.tag == 'row':
  447.                 w.setVerticalHeaderItem(self.row_counter, item)
  448.                 if text:
  449.                     w.verticalHeaderItem(self.row_counter).setText(text)
  450.                 
  451.                 if icon:
  452.                     item.setIcon(icon)
  453.                 
  454.                 self.row_counter += 1
  455.             
  456.         
  457.  
  458.     
  459.     def createAction(self, elem):
  460.         if not self.currentActionGroup:
  461.             pass
  462.         self.setupObject('QAction', self.toplevelWidget, elem)
  463.  
  464.     
  465.     def createActionGroup(self, elem):
  466.         action_group = self.setupObject('QActionGroup', self.toplevelWidget, elem)
  467.         self.currentActionGroup = action_group
  468.         self.traverseWidgetTree(elem)
  469.         self.currentActionGroup = None
  470.  
  471.     widgetTreeItemHandlers = {
  472.         'widget': createWidget,
  473.         'addaction': addAction,
  474.         'layout': createLayout,
  475.         'spacer': createSpacer,
  476.         'item': handleItem,
  477.         'action': createAction,
  478.         'actiongroup': createActionGroup,
  479.         'column': addHeader,
  480.         'row': addHeader }
  481.     
  482.     def traverseWidgetTree(self, elem):
  483.         for child in iter(elem):
  484.             
  485.             try:
  486.                 handler = self.widgetTreeItemHandlers[child.tag]
  487.             except KeyError:
  488.                 continue
  489.  
  490.             handler(self, child)
  491.         
  492.  
  493.     
  494.     def createUserInterface(self, elem):
  495.         cname = elem.attrib['class']
  496.         wname = elem.attrib['name']
  497.         if not wname:
  498.             wname = cname
  499.             if wname.startswith('Q'):
  500.                 wname = wname[1:]
  501.             
  502.             wname = wname[0].lower() + wname[1:]
  503.         
  504.         self.toplevelWidget = self.createToplevelWidget(cname, wname)
  505.         self.toplevelWidget.setObjectName(wname)
  506.         DEBUG('toplevel widget is %s', self.toplevelWidget.metaObject().className())
  507.         self.wprops.setProperties(self.toplevelWidget, elem)
  508.         self.stack.push(self.toplevelWidget)
  509.         self.traverseWidgetTree(elem)
  510.         self.stack.popWidget()
  511.         self.addActions()
  512.         self.setBuddies()
  513.         self.setDelayedProps()
  514.  
  515.     
  516.     def addActions(self):
  517.         for widget, action_name in self.actions:
  518.             if action_name == 'separator':
  519.                 widget.addSeparator()
  520.                 continue
  521.             DEBUG('add action %s to %s', action_name, widget.objectName())
  522.             action_obj = getattr(self.toplevelWidget, action_name)
  523.             if isinstance(action_obj, QtGui.QMenu):
  524.                 widget.addAction(action_obj.menuAction())
  525.                 continue
  526.             if not isinstance(action_obj, QtGui.QActionGroup):
  527.                 widget.addAction(action_obj)
  528.                 continue
  529.         
  530.  
  531.     
  532.     def setDelayedProps(self):
  533.         for func, args in self.wprops.delayed_props:
  534.             func(args)
  535.         
  536.  
  537.     
  538.     def setBuddies(self):
  539.         for widget, buddy in self.wprops.buddies:
  540.             DEBUG('%s is buddy of %s', buddy, widget.objectName())
  541.             
  542.             try:
  543.                 widget.setBuddy(getattr(self.toplevelWidget, buddy))
  544.             continue
  545.             except AttributeError:
  546.                 DEBUG('ERROR in ui spec: %s (buddy of %s) does not exist', buddy, widget.objectName())
  547.                 continue
  548.             
  549.  
  550.         
  551.  
  552.     
  553.     def classname(self, elem):
  554.         DEBUG('uiname is %s', elem.text)
  555.         name = elem.text
  556.         if name is None:
  557.             name = ''
  558.         
  559.         self.uiname = name
  560.         self.wprops.uiname = name
  561.         self.setContext(name)
  562.  
  563.     
  564.     def setContext(self, context):
  565.         pass
  566.  
  567.     
  568.     def readDefaults(self, elem):
  569.         self.defaults['margin'] = int(elem.attrib['margin'])
  570.         self.defaults['spacing'] = int(elem.attrib['spacing'])
  571.  
  572.     
  573.     def setTaborder(self, elem):
  574.         lastwidget = None
  575.         for widget_elem in elem:
  576.             widget = getattr(self.toplevelWidget, widget_elem.text)
  577.             if lastwidget is not None:
  578.                 self.toplevelWidget.setTabOrder(lastwidget, widget)
  579.             
  580.             lastwidget = widget
  581.         
  582.  
  583.     
  584.     def readResources(self, elem):
  585.         for include in elem.getiterator('include'):
  586.             loc = include.attrib.get('location')
  587.             if loc and loc.endswith('.qrc'):
  588.                 self.resources.append(os.path.basename(loc[:-4] + '_rc'))
  589.                 continue
  590.         
  591.  
  592.     
  593.     def createConnections(self, elem):
  594.         
  595.         def name2object(obj):
  596.             if obj == self.uiname:
  597.                 return self.toplevelWidget
  598.             return getattr(self.toplevelWidget, obj)
  599.  
  600.         for conn in iter(elem):
  601.             QtCore.QObject.connect(name2object(conn.findtext('sender')), QtCore.SIGNAL(conn.findtext('signal')), self.factory.getSlot(name2object(conn.findtext('receiver')), conn.findtext('slot').split('(')[0]))
  602.         
  603.         QtCore.QMetaObject.connectSlotsByName(self.toplevelWidget)
  604.  
  605.     
  606.     def customWidgets(self, elem):
  607.         
  608.         def header2module(header):
  609.             if header.endswith('.h'):
  610.                 header = header[:-2]
  611.             
  612.             mpath = []
  613.             for part in header.split('/'):
  614.                 if part not in ('', '.'):
  615.                     if part == '..':
  616.                         raise SyntaxError("custom widget header file name may not contain '..'.")
  617.                     part == '..'
  618.                     mpath.append(part)
  619.                     continue
  620.             
  621.             return '.'.join(mpath)
  622.  
  623.         for custom_widget in iter(elem):
  624.             classname = custom_widget.findtext('class')
  625.             if classname.startswith('Q3'):
  626.                 raise NoSuchWidgetError(classname)
  627.             classname.startswith('Q3')
  628.             if not custom_widget.findtext('extends'):
  629.                 pass
  630.             self.factory.addCustomWidget(classname, 'QWidget', header2module(custom_widget.findtext('header')))
  631.         
  632.  
  633.     
  634.     def createToplevelWidget(self, classname, widgetname):
  635.         raise NotImplementedError
  636.  
  637.     
  638.     def finalize(self):
  639.         pass
  640.  
  641.     
  642.     def parse(self, filename):
  643.         branchHandlers = (('layoutdefault', self.readDefaults), ('class', self.classname), ('customwidgets', self.customWidgets), ('widget', self.createUserInterface), ('connections', self.createConnections), ('tabstops', self.setTaborder), ('resources', self.readResources))
  644.         document = parse(filename)
  645.         version = document.getroot().attrib['version']
  646.         DEBUG('UI version is %s' % (version,))
  647.         for tagname, actor in branchHandlers:
  648.             elem = document.find(tagname)
  649.             if elem is not None:
  650.                 actor(elem)
  651.                 continue
  652.         
  653.         self.finalize()
  654.         w = self.toplevelWidget
  655.         self.reset()
  656.         return w
  657.  
  658.  
  659.