def __installQtDoc(self, name, engine):
     """
     Private method to install/update a Qt help document.
     
     @param name name of the Qt help document (string or QString)
     @param engine reference to the help engine (QHelpEngineCore)
     @return flag indicating success (boolean)
     """
     versionKey = QString("qt_version_%1@@%2").arg(qVersion()).arg(name)
     info = engine.customValue(versionKey, QVariant("")).toString()
     lst = info.split('|')
     
     dt = QDateTime()
     if len(lst) and not lst[0].isEmpty():
         dt = QDateTime.fromString(lst[0], Qt.ISODate)
     
     qchFile = QString()
     if len(lst) == 2:
         qchFile = lst[1]
     
     docsPath = QDir(QLibraryInfo.location(QLibraryInfo.DocumentationPath) + \
                QDir.separator() + "qch")
     
     files = docsPath.entryList(QStringList("*.qch"))
     if files.isEmpty():
         engine.setCustomValue(versionKey, 
             QVariant(QDateTime().toString(Qt.ISODate) + '|'))
         return False
     
     for f in files:
         if f.startsWith(name):
             fi = QFileInfo(docsPath.absolutePath() + QDir.separator() + f)
             namespace = QHelpEngineCore.namespaceName(fi.absoluteFilePath())
             if namespace.isEmpty():
                 continue
             
             if dt.isValid() and \
                namespace in engine.registeredDocumentations() and \
                fi.lastModified().toString(Qt.ISODate) == dt.toString(Qt.ISODate) and \
                qchFile == fi.absoluteFilePath():
                 return False
             
             if namespace in engine.registeredDocumentations():
                 engine.unregisterDocumentation(namespace)
             
             if not engine.registerDocumentation(fi.absoluteFilePath()):
                 self.emit(SIGNAL("errorMessage(const QString&)"), 
                     self.trUtf8("""<p>The file <b>%1</b> could not be registered."""
                                 """<br/>Reason: %2</p>""")\
                         .arg(fi.absoluteFilePath)\
                         .arg(engine.error())
                 )
                 return False
             
             engine.setCustomValue(versionKey, 
                 QVariant(fi.lastModified().toString(Qt.ISODate) + '|' + \
                 fi.absoluteFilePath()))
             return True
     
     return False
 def run(self):
     """
     Protected method executed by the thread.
     """
     engine = QHelpEngineCore(self.__collection)
     engine.setupData()
     changes = False
     
     qtDocs = ["designer", "linguist", "qt"]
     for doc in qtDocs:
         changes |= self.__installQtDoc(doc, engine)
         self.__mutex.lock()
         if self.__abort:
             engine = None
             self.__mutex.unlock()
             return
         self.__mutex.unlock()
     
     changes |= self.__installEric4Doc(engine)
     engine = None
     del engine
     self.emit(SIGNAL("docsInstalled(bool)"), changes)
 def on_addButton_clicked(self):
     """
     Private slot to add documents to the help database.
     """
     fileNames = KQFileDialog.getOpenFileNames(\
         self,
         self.trUtf8("Add Documentation"),
         QString(),
         self.trUtf8("Qt Compressed Help Files (*.qch)"),
         None)
     if fileNames.isEmpty():
         return
     
     for fileName in fileNames:
         ns = QHelpEngineCore.namespaceName(fileName)
         if ns.isEmpty():
             KQMessageBox.warning(self,
                 self.trUtf8("Add Documentation"),
                 self.trUtf8("""The file <b>%1</b> is not a valid Qt Help File.""")\
                     .arg(fileName)
             )
             continue
         
         if len(self.documentsList.findItems(ns, Qt.MatchFixedString)):
             KQMessageBox.warning(self,
                 self.trUtf8("Add Documentation"),
                 self.trUtf8("""The namespace <b>%1</b> is already registered.""")\
                     .arg(ns)
             )
             continue
         
         self.__engine.registerDocumentation(fileName)
         self.documentsList.addItem(ns)
         self.__registeredDocs.append(ns)
         if ns in self.__unregisteredDocs:
             self.__unregisteredDocs.remove(ns)
 def __init__(self, engine, parent = None):
     """
     Constructor
     
     @param engine reference to the help engine (QHelpEngine)
     @param parent reference to the parent widget (QWidget)
     """
     QDialog.__init__(self, parent)
     self.setupUi(self)
     
     self.__engine = engine
     
     self.attributesList.header().hide()
     
     self.filtersList.clear()
     self.attributesList.clear()
     
     help = QHelpEngineCore(self.__engine.collectionFile())
     help.setupData()
     
     self.__removedFilters = []
     self.__filterMap = {}
     self.__filterMapBackup = {}
     self.__removedAttributes = []
     
     for filter in help.customFilters():
         atts = help.filterAttributes(filter)
         ufilter = unicode(filter)
         self.__filterMapBackup[ufilter] = atts
         if ufilter not in self.__filterMap:
             self.__filterMap[ufilter] = atts
     
     self.filtersList.addItems(sorted(self.__filterMap.keys()))
     for attr in help.filterAttributes():
         QTreeWidgetItem(self.attributesList, QStringList(attr))
     
     if self.__filterMap:
         self.filtersList.setCurrentRow(0)