diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp index f01589f8d0bde598c094be809ee99cd8787cb1d9..f22f169b752622966c597cced7d607de91a24fe0 100644 --- a/src/plugins/help/helpplugin.cpp +++ b/src/plugins/help/helpplugin.cpp @@ -96,40 +96,10 @@ HelpManager::HelpManager(Internal::HelpPlugin* plugin) void HelpManager::registerDocumentation(const QStringList &fileNames) { - bool needsSetup = false; - { - QHelpEngineCore hc(m_plugin->helpEngine()->collectionFile()); - if (!hc.setupData()) { - qWarning() << "Could not initialize help engine:" << hc.error(); - return; - } - foreach (const QString &fileName, fileNames) { - if (!QFileInfo(fileName).exists()) - continue; - const QString &nameSpace = QHelpEngineCore::namespaceName(fileName); - if (nameSpace.isEmpty()) - continue; - if (hc.registeredDocumentations().contains(nameSpace)) { - if (QFileInfo(hc.documentationFileName(nameSpace)).exists()) - continue; - - // remove stale documentation first - if (!hc.unregisterDocumentation(nameSpace)) { - qWarning() << "error unregistering namespace '" - << nameSpace << "' from file '" << fileName << "': " - << hc.error(); - continue; - } - } - if (hc.registerDocumentation(fileName)) { - needsSetup = true; - } else { - qWarning() << "error registering" << fileName << hc.error(); - } - } + if (m_plugin) { + m_plugin->setFilesToRegister(fileNames); + emit helpPluginUpdateDocumentation(); } - if (needsSetup) - m_plugin->helpEngine()->setupData(); } void HelpManager::openHelpPage(const QString& url) @@ -203,10 +173,9 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error) directory.mkpath(directory.absolutePath()); m_helpEngine = new QHelpEngine(directory.absolutePath() + QLatin1String("/helpcollection.qhc"), this); - connect(m_helpEngine, SIGNAL(setupFinished()), this, - SLOT(updateFilterComboBox())); - addAutoReleasedObject(new HelpManager(this)); + helpManager = new HelpManager(this); + addAutoReleasedObject(helpManager); m_filterSettingsPage = new FilterSettingsPage(m_helpEngine); addAutoReleasedObject(m_filterSettingsPage); @@ -461,6 +430,59 @@ QHelpEngine* HelpPlugin::helpEngine() const return m_helpEngine; } +void HelpPlugin::setFilesToRegister(const QStringList &files) +{ + filesToRegister += files; +} + +void HelpPlugin::pluginUpdateDocumentation() +{ + updateDocumentation(); +} + +bool HelpPlugin::updateDocumentation() +{ + bool needsSetup = false; + { + QHelpEngineCore hc(m_helpEngine->collectionFile()); + if (hc.setupData()) { + const QStringList ®isteredDocs = hc.registeredDocumentations(); + foreach (const QString &nameSpace, registeredDocs) { + const QString &file = hc.documentationFileName(nameSpace); + if (QFileInfo(file).exists()) + continue; + + if (!hc.unregisterDocumentation(nameSpace)) { + qWarning() << "Error unregistering namespace '" + << nameSpace << "' from file '" << file << "': " + << hc.error(); + } + } + + while (!filesToRegister.isEmpty()) { + const QString &file = filesToRegister.takeFirst(); + if (!QFileInfo(file).exists()) + continue; + const QString &nameSpace = hc.namespaceName(file); + if (nameSpace.isEmpty()) + continue; + if (!hc.registeredDocumentations().contains(nameSpace)) { + if (hc.registerDocumentation(file)) { + needsSetup = true; + } else { + qWarning() << "error registering" << file << hc.error(); + } + } + } + } else { + qWarning() << "Could not initialize help engine:" << hc.error(); + } + } + if (needsSetup) + m_helpEngine->setupData(); + return needsSetup; +} + void HelpPlugin::createRightPaneSideBar() { QAction *switchToHelpMode = new QAction(tr("Go to Help Mode"), this); @@ -581,95 +603,80 @@ void HelpPlugin::slotHideRightPane() void HelpPlugin::extensionsInitialized() { m_sideBar->readSettings(m_core->settings(), QLatin1String("HelpSideBar")); + + // force a block here to avoid the expensive indexing restart signal, etc... + bool blocked = m_helpEngine->blockSignals(true); if (!m_helpEngine->setupData()) { + m_helpEngine->blockSignals(blocked); qWarning() << "Could not initialize help engine: " << m_helpEngine->error(); return; } - bool assistantInternalDocRegistered = false; - QStringList documentationToRemove; - QStringList filtersToRemove; - const QString &docInternal = QString::fromLatin1("com.nokia.qtcreator.%1%2%3") .arg(IDE_VERSION_MAJOR).arg(IDE_VERSION_MINOR).arg(IDE_VERSION_RELEASE); - const QString filterInternal = QString::fromLatin1("Qt Creator %1.%2.%3") - .arg(IDE_VERSION_MAJOR).arg(IDE_VERSION_MINOR).arg(IDE_VERSION_RELEASE); - const QRegExp filterRegExp("Qt Creator \\d*\\.\\d*\\.\\d*"); + + bool assistantInternalDocRegistered = false; const QStringList &docs = m_helpEngine->registeredDocumentations(); foreach (const QString &ns, docs) { if (ns == docInternal) { assistantInternalDocRegistered = true; } else if (ns.startsWith(QLatin1String("com.nokia.qtcreator."))) { - documentationToRemove << ns; - } - } - foreach (const QString &filter, m_helpEngine->customFilters()) { - if (filterRegExp.exactMatch(filter) && filter != filterInternal) { - filtersToRemove << filter; + m_helpEngine->unregisterDocumentation(ns); } } - //remove any qtcreator documentation that doesn't belong to current version - if (!documentationToRemove.isEmpty() || !filtersToRemove.isEmpty() || !assistantInternalDocRegistered) { - QHelpEngineCore hc(m_helpEngine->collectionFile()); - hc.setupData(); - foreach (const QString &ns, documentationToRemove) { - hc.unregisterDocumentation(ns); - } - foreach (const QString &filter, filtersToRemove) { - hc.removeCustomFilter(filter); - } + const QString &filterInternal = QString::fromLatin1("Qt Creator %1.%2.%3") + .arg(IDE_VERSION_MAJOR).arg(IDE_VERSION_MINOR).arg(IDE_VERSION_RELEASE); - if (!assistantInternalDocRegistered) { - const QString qchFileName = - QDir::cleanPath(QCoreApplication::applicationDirPath() + const QRegExp filterRegExp(QLatin1String("Qt Creator \\d*\\.\\d*\\.\\d*")); + const QStringList &filters = m_helpEngine->customFilters(); + foreach (const QString &filter, filters) { + if (filterRegExp.exactMatch(filter) && filter != filterInternal) + m_helpEngine->removeCustomFilter(filter); + } + + if (!assistantInternalDocRegistered) { + const QString &internalDoc = QCoreApplication::applicationDirPath() #if defined(Q_OS_MAC) - + QLatin1String("/../Resources/doc/qtcreator.qch")); + + QLatin1String("/../Resources/doc/qtcreator.qch"); #else - + QLatin1String("../../share/doc/qtcreator/qtcreator.qch")); + + QLatin1String("../../share/doc/qtcreator/qtcreator.qch"); #endif - if (!hc.registerDocumentation(qchFileName)) - qDebug() << qPrintable(hc.error()); - } - + filesToRegister.append(QDir::cleanPath(internalDoc)); } const QLatin1String weAddedFilterKey("UnfilteredFilterInserted"); const QLatin1String previousFilterNameKey("UnfilteredFilterName"); - int i = m_helpEngine->customValue(weAddedFilterKey).toInt(); - const QString filterName = tr("Unfiltered"); - if (i == 1) { // we added a filter at some point - // remove previously added filter - QHelpEngineCore hc(m_helpEngine->collectionFile()); - hc.setupData(); - QString previousFilterName = hc.customValue(previousFilterNameKey).toString(); - if (!previousFilterName.isEmpty()) { // we noted down the name of the previously added filter - hc.removeCustomFilter(previousFilterName); - } - if (previousFilterName != filterName) { // potentially remove a filter with new name - hc.removeCustomFilter(filterName); - } - } - { - QHelpEngineCore hc(m_helpEngine->collectionFile()); - hc.setupData(); - hc.addCustomFilter(filterName, QStringList()); - hc.setCustomValue(weAddedFilterKey, 1); - hc.setCustomValue(previousFilterNameKey, filterName); + if (m_helpEngine->customValue(weAddedFilterKey).toInt() == 1) { + // we added a filter at some point, remove previously added filter + const QString &previousFilter = + m_helpEngine->customValue(previousFilterNameKey).toString(); + if (!previousFilter.isEmpty()) + m_helpEngine->removeCustomFilter(previousFilter); } - bool blocked = m_helpEngine->blockSignals(true); + + // potentially remove a filter with new name + const QString filterName = tr("Unfiltered"); + m_helpEngine->removeCustomFilter(filterName); + m_helpEngine->addCustomFilter(filterName, QStringList()); + m_helpEngine->setCustomValue(weAddedFilterKey, 1); + m_helpEngine->setCustomValue(previousFilterNameKey, filterName); m_helpEngine->setCurrentFilter(filterName); + m_helpEngine->blockSignals(blocked); - QString addedDocs = m_helpEngine->customValue(QLatin1String("AddedDocs")).toString(); + const QLatin1String key("AddedDocs"); + const QString &addedDocs = m_helpEngine->customValue(key).toString(); if (!addedDocs.isEmpty()) { - const QStringList documentationToAdd = addedDocs.split(QLatin1Char(';')); - foreach (const QString &item, documentationToAdd) - m_helpEngine->registerDocumentation(item); - m_helpEngine->removeCustomValue(QLatin1String("AddedDocs")); + m_helpEngine->removeCustomValue(key); + filesToRegister += addedDocs.split(QLatin1Char(';')); } - m_helpEngine->setupData(); + if (!updateDocumentation()) { + // if no documentation has been added, we need to force a setup data, + // otherwise it has already been run in updateDocumentation + m_helpEngine->setupData(); + } updateFilterComboBox(); m_bookmarkManager->setupBookmarkModels(); @@ -700,6 +707,11 @@ void HelpPlugin::extensionsInitialized() SLOT(updateViewerComboBoxIndex(int))); connect(m_centralWidget, SIGNAL(viewerAboutToBeRemoved(int)), this, SLOT(removeViewerFromComboBox(int))); + + connect(m_helpEngine, SIGNAL(setupFinished()), this, + SLOT(updateFilterComboBox())); + connect(helpManager, SIGNAL(helpPluginUpdateDocumentation()), this, + SLOT(pluginUpdateDocumentation())); } void HelpPlugin::shutdown() @@ -970,7 +982,7 @@ void HelpPlugin::addNewBookmark(const QString &title, const QString &url) void HelpPlugin::handleHelpRequest(const QUrl& url) { - if (url.queryItemValue("view") == QLatin1String("split")) + if (url.queryItemValue(QLatin1String("view")) == QLatin1String("split")) openContextHelpPage(url.toString()); else openHelpPage(url.toString()); diff --git a/src/plugins/help/helpplugin.h b/src/plugins/help/helpplugin.h index f679b483941a8af2a4a4a9c3a73e084d06a65aab..90f3d87f1c9ae4f4d757c99b405fd5d5b4e79602 100644 --- a/src/plugins/help/helpplugin.h +++ b/src/plugins/help/helpplugin.h @@ -35,6 +35,7 @@ #include <extensionsystem/iplugin.h> #include <QtCore/QMap> +#include <QtCore/QStringList> QT_BEGIN_NAMESPACE class QAction; @@ -83,6 +84,9 @@ public: void openHelpPage(const QString& url); void openContextHelpPage(const QString &url); +signals: + void helpPluginUpdateDocumentation(); + private: Internal::HelpPlugin *m_plugin; }; @@ -115,7 +119,11 @@ public: void openContextHelpPage(const QString &url); QHelpEngine* helpEngine() const; + + void setFilesToRegister(const QStringList &files); + public slots: + void pluginUpdateDocumentation(); void handleHelpRequest(const QUrl& url); private slots: @@ -147,6 +155,9 @@ private slots: void removeViewerFromComboBox(int index); void updateViewerComboBoxIndex(int index); +private: + bool updateDocumentation(); + private: QToolBar *createToolBar(); void createRightPaneSideBar(); @@ -181,6 +192,9 @@ private: QAction *m_rightPaneBackwardAction; QAction *m_rightPaneForwardAction; + + HelpManager *helpManager; + QStringList filesToRegister; }; } // namespace Internal