diff --git a/src/plugins/help/docsettingspage.cpp b/src/plugins/help/docsettingspage.cpp index 22714a21267ddd61fa23bee32ab95c53bc4bf3e5..0a5a603c039f1bddc27b9d24b5554cc276f41af1 100644 --- a/src/plugins/help/docsettingspage.cpp +++ b/src/plugins/help/docsettingspage.cpp @@ -29,6 +29,7 @@ #include "docsettingspage.h" #include "helpconstants.h" +#include "helpmanager.h" #include <QtCore/QCoreApplication> @@ -36,13 +37,11 @@ #include <QtGui/QKeyEvent> #include <QtGui/QMessageBox> -#include <QtHelp/QHelpEngine> +#include <QtHelp/QHelpEngineCore> using namespace Help::Internal; -DocSettingsPage::DocSettingsPage(QHelpEngine *helpEngine) - : m_helpEngine(helpEngine), - m_registeredDocs(false) +DocSettingsPage::DocSettingsPage() { } @@ -68,46 +67,55 @@ QString DocSettingsPage::displayCategory() const QWidget *DocSettingsPage::createPage(QWidget *parent) { - QWidget *w = new QWidget(parent); - m_ui.setupUi(w); + QWidget *widget = new QWidget(parent); + m_ui.setupUi(widget); - connect(m_ui.addButton, SIGNAL(clicked()), - this, SLOT(addDocumentation())); - connect(m_ui.removeButton, SIGNAL(clicked()), - this, SLOT(removeDocumentation())); + connect(m_ui.addButton, SIGNAL(clicked()), this, SLOT(addDocumentation())); + connect(m_ui.removeButton, SIGNAL(clicked()), this, SLOT(removeDocumentation())); m_ui.docsListWidget->installEventFilter(this); - m_ui.docsListWidget->addItems(m_helpEngine->registeredDocumentations()); - m_registeredDocs = false; - m_removeDocs.clear(); + + QHelpEngineCore *engine = &HelpManager::helpEngineCore(); + const QStringList &nameSpaces = engine->registeredDocumentations(); + foreach (const QString &nameSpace, nameSpaces) + addItem(nameSpace, engine->documentationFileName(nameSpace)); + + m_filesToRegister.clear(); + m_filesToUnregister.clear(); + if (m_searchKeywords.isEmpty()) m_searchKeywords = m_ui.groupBox->title(); - return w; + return widget; } void DocSettingsPage::addDocumentation() { - QStringList files = QFileDialog::getOpenFileNames(m_ui.addButton->parentWidget(), - tr("Add Documentation"), - QString(), tr("Qt Help Files (*.qch)")); + const QStringList &files = + QFileDialog::getOpenFileNames(m_ui.addButton->parentWidget(), + tr("Add Documentation"), m_recentDialogPath, tr("Qt Help Files (*.qch)")); if (files.isEmpty()) return; + m_recentDialogPath = QFileInfo(files.first()).canonicalPath(); + + const QHelpEngineCore &engine = HelpManager::helpEngineCore(); + const QStringList &nameSpaces = engine.registeredDocumentations(); foreach (const QString &file, files) { - QString nsName = QHelpEngineCore::namespaceName(file); - if (nsName.isEmpty()) { - QMessageBox::warning(m_ui.addButton->parentWidget(), - tr("Add Documentation"), - tr("The file %1 is not a valid Qt Help file!") - .arg(file)); + const QString &nameSpace = engine.namespaceName(file); + if (nameSpace.isEmpty()) continue; + + if (m_filesToUnregister.value(nameSpace) != QDir::cleanPath(file)) { + if (!m_filesToRegister.contains(nameSpace) && !nameSpaces.contains(nameSpace)) { + addItem(nameSpace, file); + m_filesToRegister.insert(nameSpace, QDir::cleanPath(file)); + } + } else { + addItem(nameSpace, file); + m_filesToUnregister.remove(nameSpace); } - m_helpEngine->registerDocumentation(file); - m_ui.docsListWidget->addItem(nsName); } - m_registeredDocs = true; - emit documentationAdded(); } void DocSettingsPage::removeDocumentation() @@ -118,6 +126,10 @@ void DocSettingsPage::removeDocumentation() void DocSettingsPage::apply() { emit dialogAccepted(); + emit documentationChanged(); + + m_filesToRegister.clear(); + m_filesToUnregister.clear(); } bool DocSettingsPage::matches(const QString &s) const @@ -125,25 +137,14 @@ bool DocSettingsPage::matches(const QString &s) const return m_searchKeywords.contains(s, Qt::CaseInsensitive); } -bool DocSettingsPage::applyChanges() +QStringList DocSettingsPage::docsToRegister() const { - QStringList::const_iterator it = m_removeDocs.constBegin(); - while (it != m_removeDocs.constEnd()) { - if (!m_helpEngine->unregisterDocumentation((*it))) { - QMessageBox::warning(m_ui.addButton->parentWidget(), - tr("Documentation"), - tr("Cannot unregister documentation file %1!") - .arg((*it))); - } - ++it; - } - - bool success = m_registeredDocs || m_removeDocs.count(); - - m_removeDocs.clear(); - m_registeredDocs = false; + return m_filesToRegister.values(); +} - return success; +QStringList DocSettingsPage::docsToUnregister() const +{ + return m_filesToUnregister.keys(); } bool DocSettingsPage::eventFilter(QObject *object, QEvent *event) @@ -170,8 +171,18 @@ void DocSettingsPage::removeDocumentation(const QList<QListWidgetItem*> items) return; int row = 0; + QHelpEngineCore *engine = &HelpManager::helpEngineCore(); foreach (QListWidgetItem* item, items) { - m_removeDocs.append(item->text()); + const QString &nameSpace = item->text(); + const QString &docPath = engine->documentationFileName(nameSpace); + + if (m_filesToRegister.value(nameSpace) != docPath) { + if (!m_filesToUnregister.contains(nameSpace)) + m_filesToUnregister.insert(nameSpace, docPath); + } else { + m_filesToRegister.remove(nameSpace); + } + row = m_ui.docsListWidget->row(item); delete m_ui.docsListWidget->takeItem(row); } @@ -179,3 +190,10 @@ void DocSettingsPage::removeDocumentation(const QList<QListWidgetItem*> items) m_ui.docsListWidget->setCurrentRow(qMax(row - 1, 0), QItemSelectionModel::ClearAndSelect); } + +void DocSettingsPage::addItem(const QString &nameSpace, const QString &fileName) +{ + QListWidgetItem* item = new QListWidgetItem(nameSpace); + item->setToolTip(fileName); + m_ui.docsListWidget->addItem(item); +} diff --git a/src/plugins/help/docsettingspage.h b/src/plugins/help/docsettingspage.h index 50b0aa5b57c01c5705278e1d1273bf3bd91175ad..c8ec79f9c7399db69e89249657ad4fca9eca7be1 100644 --- a/src/plugins/help/docsettingspage.h +++ b/src/plugins/help/docsettingspage.h @@ -31,22 +31,18 @@ #define DOCSETTINGSPAGE_H #include "ui_docsettingspage.h" - #include <coreplugin/dialogs/ioptionspage.h> -#include <QtGui/QWidget> - -QT_FORWARD_DECLARE_CLASS(QHelpEngine) - namespace Help { namespace Internal { class DocSettingsPage : public Core::IOptionsPage { Q_OBJECT + typedef QHash<QString, QString> FilesToNameSpaceHash; public: - DocSettingsPage(QHelpEngine *helpEngine); + DocSettingsPage(); QString id() const; QString displayName() const; @@ -55,14 +51,15 @@ public: QWidget *createPage(QWidget *parent); void apply(); - void finish() { } + void finish() {} virtual bool matches(const QString &s) const; - bool applyChanges(); + QStringList docsToRegister() const; + QStringList docsToUnregister() const; signals: - void documentationAdded(); void dialogAccepted(); + void documentationChanged(); private slots: void addDocumentation(); @@ -71,13 +68,16 @@ private slots: private: bool eventFilter(QObject *object, QEvent *event); void removeDocumentation(const QList<QListWidgetItem*> items); + void addItem(const QString &nameSpace, const QString &fileName); private: - QHelpEngine *m_helpEngine; - bool m_registeredDocs; - QStringList m_removeDocs; Ui::DocSettingsPage m_ui; + QString m_searchKeywords; + QString m_recentDialogPath; + + FilesToNameSpaceHash m_filesToRegister; + FilesToNameSpaceHash m_filesToUnregister; }; } // namespace Help diff --git a/src/plugins/help/filtersettingspage.cpp b/src/plugins/help/filtersettingspage.cpp index 16d36dbf4cae7544a6cfa827a12b7018f92e1c32..9fdf97464048818709c58a45bfd697cc0716c2cc 100644 --- a/src/plugins/help/filtersettingspage.cpp +++ b/src/plugins/help/filtersettingspage.cpp @@ -28,19 +28,21 @@ **************************************************************************/ #include "filtersettingspage.h" -#include "helpconstants.h" + #include "filternamedialog.h" +#include "helpconstants.h" +#include "helpmanager.h" + +#include <QtCore/QCoreApplication> #include <QtGui/QFileDialog> #include <QtGui/QMessageBox> -#include <QtCore/QCoreApplication> -#include <QtHelp/QHelpEngine> +#include <QtHelp/QHelpEngineCore> using namespace Help::Internal; -FilterSettingsPage::FilterSettingsPage(QHelpEngine *helpEngine) : - m_helpEngine(helpEngine) +FilterSettingsPage::FilterSettingsPage() { } @@ -66,11 +68,14 @@ QString FilterSettingsPage::displayCategory() const QWidget *FilterSettingsPage::createPage(QWidget *parent) { - m_currentPage = new QWidget(parent); - m_ui.setupUi(m_currentPage); + QWidget *widget = new QWidget(parent); + m_ui.setupUi(widget); + m_ui.attributeWidget->header()->hide(); m_ui.attributeWidget->setRootIsDecorated(false); + updateFilterPage(); // does call setupData on the engine + connect(m_ui.attributeWidget, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(updateFilterMap())); connect(m_ui.filterWidget, @@ -79,37 +84,33 @@ QWidget *FilterSettingsPage::createPage(QWidget *parent) connect(m_ui.filterAddButton, SIGNAL(clicked()), this, SLOT(addFilter())); connect(m_ui.filterRemoveButton, SIGNAL(clicked()), this, SLOT(removeFilter())); - updateFilterPage(); - if (m_searchKeywords.isEmpty()) - m_searchKeywords = m_ui.filterGroupBox->title() + QLatin1Char(' ') + m_ui.attributesGroupBox->title(); - - return m_currentPage; + if (m_searchKeywords.isEmpty()) { + m_searchKeywords = m_ui.filterGroupBox->title() + QLatin1Char(' ') + + m_ui.attributesGroupBox->title(); + } + return widget; } void FilterSettingsPage::updateFilterPage() { - if (!m_helpEngine) - return; - m_ui.filterWidget->clear(); m_ui.attributeWidget->clear(); - QHelpEngineCore help(m_helpEngine->collectionFile(), 0); - help.setupData(); m_filterMapBackup.clear(); - const QStringList filters = help.customFilters(); + const QHelpEngineCore &engine = HelpManager::helpEngineCore(); + const QStringList &filters = engine.customFilters(); foreach (const QString &filter, filters) { - const QStringList atts = help.filterAttributes(filter); - m_filterMapBackup.insert(filter, atts); + const QStringList &attributes = engine.filterAttributes(filter); + m_filterMapBackup.insert(filter, attributes); if (!m_filterMap.contains(filter)) - m_filterMap.insert(filter, atts); + m_filterMap.insert(filter, attributes); } - m_ui.filterWidget->addItems(m_filterMap.keys()); - foreach (const QString &a, help.filterAttributes()) - new QTreeWidgetItem(m_ui.attributeWidget, QStringList(a)); + const QStringList &attributes = engine.filterAttributes(); + foreach (const QString &attribute, attributes) + new QTreeWidgetItem(m_ui.attributeWidget, QStringList(attribute)); if (m_filterMap.keys().count()) m_ui.filterWidget->setCurrentRow(0); @@ -120,9 +121,9 @@ void FilterSettingsPage::updateAttributes(QListWidgetItem *item) QStringList checkedList; if (item) checkedList = m_filterMap.value(item->text()); - QTreeWidgetItem *itm; - for (int i=0; i<m_ui.attributeWidget->topLevelItemCount(); ++i) { - itm = m_ui.attributeWidget->topLevelItem(i); + + for (int i = 0; i < m_ui.attributeWidget->topLevelItemCount(); ++i) { + QTreeWidgetItem *itm = m_ui.attributeWidget->topLevelItem(i); if (checkedList.contains(itm->text(0))) itm->setCheckState(0, Qt::Checked); else @@ -134,14 +135,14 @@ void FilterSettingsPage::updateFilterMap() { if (!m_ui.filterWidget->currentItem()) return; - QString filter = m_ui.filterWidget->currentItem()->text(); + + const QString &filter = m_ui.filterWidget->currentItem()->text(); if (!m_filterMap.contains(filter)) return; QStringList newAtts; - QTreeWidgetItem *itm = 0; - for (int i=0; i<m_ui.attributeWidget->topLevelItemCount(); ++i) { - itm = m_ui.attributeWidget->topLevelItem(i); + for (int i = 0; i < m_ui.attributeWidget->topLevelItemCount(); ++i) { + QTreeWidgetItem *itm = m_ui.attributeWidget->topLevelItem(i); if (itm->checkState(0) == Qt::Checked) newAtts.append(itm->text(0)); } @@ -150,25 +151,25 @@ void FilterSettingsPage::updateFilterMap() void FilterSettingsPage::addFilter() { - FilterNameDialog dia(m_currentPage); + FilterNameDialog dia(m_ui.filterWidget); if (dia.exec() == QDialog::Rejected) return; - QString filterName = dia.filterName(); + const QString &filterName = dia.filterName(); if (!m_filterMap.contains(filterName)) { m_filterMap.insert(filterName, QStringList()); m_ui.filterWidget->addItem(filterName); } - QList<QListWidgetItem*> lst = m_ui.filterWidget - ->findItems(filterName, Qt::MatchCaseSensitive); + const QList<QListWidgetItem*> &lst = m_ui.filterWidget->findItems(filterName, + Qt::MatchCaseSensitive); m_ui.filterWidget->setCurrentItem(lst.first()); } void FilterSettingsPage::removeFilter() { - QListWidgetItem *item = m_ui.filterWidget - ->takeItem(m_ui.filterWidget->currentRow()); + QListWidgetItem *item = + m_ui.filterWidget->takeItem(m_ui.filterWidget->currentRow()); if (!item) return; @@ -187,43 +188,40 @@ void FilterSettingsPage::apply() bool FilterSettingsPage::applyChanges() { - bool changed = false; - if (m_filterMap.count() != m_filterMapBackup.count()) { - changed = true; - } else { - QMapIterator<QString, QStringList> it(m_filterMapBackup); - while (it.hasNext() && !changed) { - it.next(); - if (!m_filterMap.contains(it.key())) { - changed = true; - } else { - QStringList a = it.value(); - QStringList b = m_filterMap.value(it.key()); - if (a.count() != b.count()) { - changed = true; - } else { - QStringList::const_iterator i(a.constBegin()); - while (i != a.constEnd()) { - if (!b.contains(*i)) { - changed = true; - break; - } - ++i; + bool changed = m_filterMap.count() != m_filterMapBackup.count(); + if (!changed) { + FilterMap::const_iterator it = m_filterMapBackup.constBegin(); + for (; it != m_filterMapBackup.constEnd() && !changed; ++it) { + if (m_filterMap.contains(it.key())) { + const QStringList &a = it.value(); + const QStringList &b = m_filterMap.value(it.key()); + if (a.count() == b.count()) { + QStringList::const_iterator i = a.constBegin(); + for (; i != a.constEnd() && !changed; ++i) { + if (b.contains(*i)) + continue; + changed = true; } + } else { + changed = true; } + } else { + changed = true; } } } + if (changed) { + QHelpEngineCore *engine = &HelpManager::helpEngineCore(); foreach (const QString &filter, m_removedFilters) - m_helpEngine->removeCustomFilter(filter); - QMapIterator<QString, QStringList> it(m_filterMap); - while (it.hasNext()) { - it.next(); - m_helpEngine->addCustomFilter(it.key(), it.value()); - } + engine->removeCustomFilter(filter); + + FilterMap::const_iterator it; + for (it = m_filterMap.constBegin(); it != m_filterMap.constEnd(); ++it) + engine->addCustomFilter(it.key(), it.value()); return true; } + return false; } @@ -231,5 +229,3 @@ bool FilterSettingsPage::matches(const QString &s) const { return m_searchKeywords.contains(s, Qt::CaseInsensitive); } - - diff --git a/src/plugins/help/filtersettingspage.h b/src/plugins/help/filtersettingspage.h index eda27c08e0133a28842d97569a175a882b4ec8e2..e834b2f749322d6ae485fcad6eba0b1457c8c6ea 100644 --- a/src/plugins/help/filtersettingspage.h +++ b/src/plugins/help/filtersettingspage.h @@ -30,12 +30,8 @@ #ifndef FILTERSETTINGSPAGE_H #define FILTERSETTINGSPAGE_H -#include <QtGui/QWidget> -#include <coreplugin/dialogs/ioptionspage.h> - #include "ui_filtersettingspage.h" - -QT_FORWARD_DECLARE_CLASS(QHelpEngine) +#include <coreplugin/dialogs/ioptionspage.h> namespace Help { namespace Internal { @@ -43,9 +39,10 @@ namespace Internal { class FilterSettingsPage : public Core::IOptionsPage { Q_OBJECT + typedef QMap<QString, QStringList> FilterMap; public: - FilterSettingsPage(QHelpEngine *helpEngine); + FilterSettingsPage(); QString id() const; QString displayName() const; @@ -54,7 +51,7 @@ public: QWidget *createPage(QWidget *parent); void apply(); - void finish() { } + void finish() {} virtual bool matches(const QString &s) const; bool applyChanges(); @@ -67,13 +64,13 @@ private slots: void removeFilter(); private: - QHelpEngine *m_helpEngine; Ui::FilterSettingsPage m_ui; - QMap<QString, QStringList> m_filterMapBackup; - QMap<QString, QStringList> m_filterMap; - QStringList m_removedFilters; - QWidget *m_currentPage; + + FilterMap m_filterMap; + FilterMap m_filterMapBackup; + QString m_searchKeywords; + QStringList m_removedFilters; }; } // namespace Help diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp index 6a26dd7990aa5573e5ecc82e7e5dd3d6a1dab5af..992a801d1c494b97fa94cf577c3eed331577a0a4 100644 --- a/src/plugins/help/helpplugin.cpp +++ b/src/plugins/help/helpplugin.cpp @@ -146,28 +146,20 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error) //webSettings->setFontSize(QWebSettings::DefaultFontSize, applicationFont.pointSize()); #endif - // FIXME shouldn't the help engine create the directory if it doesn't exist? - const QFileInfo &fi(m_core->settings()->fileName()); - const QDir directory(fi.absolutePath() + QLatin1String("/qtcreator")); - if (!directory.exists()) - directory.mkpath(directory.absolutePath()); - m_helpEngine = new QHelpEngine(directory.absolutePath() + - QLatin1String("/helpcollection.qhc"), this); - m_helpEngine->setAutoSaveFilter(false); - - helpManager = new HelpManager(this); - addAutoReleasedObject(helpManager); - - m_filterSettingsPage = new FilterSettingsPage(m_helpEngine); - addAutoReleasedObject(m_filterSettingsPage); + addAutoReleasedObject(helpManager = new HelpManager(this)); + addAutoReleasedObject(m_docSettingsPage = new DocSettingsPage()); + addAutoReleasedObject(m_filterSettingsPage = new FilterSettingsPage()); - m_docSettingsPage = new DocSettingsPage(m_helpEngine); - addAutoReleasedObject(m_docSettingsPage); - - connect(m_docSettingsPage, SIGNAL(documentationAdded()), + connect(m_docSettingsPage, SIGNAL(documentationChanged()), m_filterSettingsPage, SLOT(updateFilterPage())); connect(m_docSettingsPage, SIGNAL(dialogAccepted()), this, SLOT(checkForHelpChanges())); + connect(helpManager, SIGNAL(registerDocumentation()), this, + SLOT(slotRegisterDocumentation())); + + // force a block here to avoid the expensive indexing restart signal, etc... + m_helpEngine = new QHelpEngine("", this); + m_helpEngine->blockSignals(true); m_contentWidget = new ContentWindow(m_helpEngine); m_contentWidget->setWindowTitle(tr("Contents")); @@ -414,10 +406,12 @@ void HelpPlugin::setFilesToRegister(const QStringList &files) filesToRegister += files; } -void HelpPlugin::pluginUpdateDocumentation() +void HelpPlugin::slotRegisterDocumentation() { - if (isInitialised) - updateDocumentation(); + if (isInitialised) { + if (registerDocumentation()) + m_helpEngine->setupData(); + } } void HelpPlugin::resetFilter() @@ -441,24 +435,24 @@ void HelpPlugin::resetFilter() m_helpEngine->setCurrentFilter(filterName); } -bool HelpPlugin::updateDocumentation() +bool HelpPlugin::verifiyDocumentation() { - bool needsSetup = false; + QStringList nameSpacesToUnregister; const QStringList ®isteredDocs = m_helpEngine->registeredDocumentations(); foreach (const QString &nameSpace, registeredDocs) { const QString &file = m_helpEngine->documentationFileName(nameSpace); - if (QFileInfo(file).exists()) - continue; - - if (!m_helpEngine->unregisterDocumentation(nameSpace)) { - qWarning() << "Error unregistering namespace '" - << nameSpace << "' from file '" << file << "': " - << m_helpEngine->error(); - } else { - needsSetup = true; - } + if (!QFileInfo(file).exists()) + nameSpacesToUnregister.append(nameSpace); } + if (!nameSpacesToUnregister.isEmpty()) + return unregisterDocumentation(nameSpacesToUnregister); + return false; +} + +bool HelpPlugin::registerDocumentation() +{ + bool needsSetup = false; foreach (const QString &file, filesToRegister) { const QString &nameSpace = m_helpEngine->namespaceName(file); if (nameSpace.isEmpty()) @@ -467,14 +461,27 @@ bool HelpPlugin::updateDocumentation() if (m_helpEngine->registerDocumentation(file)) { needsSetup = true; } else { - qWarning() << "error registering" << file << m_helpEngine->error(); + qWarning() << "Error registering namespace '" << nameSpace + << "' from file '" << file << "':" << m_helpEngine->error(); } } } filesToRegister.clear(); + return needsSetup; +} - if (needsSetup) - m_helpEngine->setupData(); +bool HelpPlugin::unregisterDocumentation(const QStringList &nameSpaces) +{ + bool needsSetup = false; + foreach (const QString &nameSpace, nameSpaces) { + const QString &file = m_helpEngine->documentationFileName(nameSpace); + if (m_helpEngine->unregisterDocumentation(nameSpace)) { + needsSetup = true; + } else { + qWarning() << "Error unregistering namespace '" << nameSpace + << "' from file '" << file << "': " << m_helpEngine->error(); + } + } return needsSetup; } @@ -607,13 +614,8 @@ 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; - } + m_helpEngine->setCollectionFile(HelpManager::collectionFilePath()); + m_helpEngine->setAutoSaveFilter(false); const QString &docInternal = QString::fromLatin1("com.nokia.qtcreator.%1%2%3") .arg(IDE_VERSION_MAJOR).arg(IDE_VERSION_MINOR).arg(IDE_VERSION_RELEASE); @@ -638,21 +640,6 @@ void HelpPlugin::extensionsInitialized() m_helpEngine->removeCustomFilter(filter); } - - m_helpEngine->blockSignals(blocked); - - connect(m_helpEngine, SIGNAL(setupFinished()), this, - SLOT(updateFilterComboBox())); - - // explicit disconnect the full text search indexer, we connect and start - // it later once we really need it, e.g. the full text search is opened... - disconnect(m_helpEngine, SIGNAL(setupFinished()), m_helpEngine->searchEngine(), - SLOT(indexDocumentation())); - connect(m_helpEngine->searchEngine(), SIGNAL(indexingStarted()), this, - SLOT(indexingStarted())); - connect(m_helpEngine->searchEngine(), SIGNAL(indexingFinished()), this, - SLOT(indexingFinished())); - // Explicitly register qml.qch if located in creator directory. This is only // needed for the creator-qml package, were we want to ship the documentation // without a qt development version. @@ -674,11 +661,9 @@ void HelpPlugin::extensionsInitialized() filesToRegister += addedDocs.split(QLatin1Char(';')); } - 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(); - } + verifiyDocumentation(); + registerDocumentation(); + m_bookmarkManager->setupBookmarkModels(); #if !defined(QT_NO_WEBKIT) QWebSettings* webSettings = QWebSettings::globalSettings(); @@ -704,10 +689,20 @@ void HelpPlugin::extensionsInitialized() connect(m_centralWidget, SIGNAL(viewerAboutToBeRemoved(int)), this, SLOT(removeViewerFromComboBox(int))); - connect(helpManager, SIGNAL(registerDocumentation()), this, - SLOT(pluginUpdateDocumentation())); + // explicit disconnect the full text search indexer, we connect and start + // it later once we really need it, e.g. the full text search is opened... + disconnect(m_helpEngine, SIGNAL(setupFinished()), m_helpEngine->searchEngine(), + SLOT(indexDocumentation())); + + connect(m_helpEngine, SIGNAL(setupFinished()), this, + SLOT(updateFilterComboBox())); + connect(m_helpEngine->searchEngine(), SIGNAL(indexingStarted()), this, + SLOT(indexingStarted())); + connect(m_helpEngine->searchEngine(), SIGNAL(indexingFinished()), this, + SLOT(indexingFinished())); - isInitialised = true; + isInitialised = true; // helper for slotRegisterDocumentation() + m_helpEngine->blockSignals(false); // blocked in initialize() } void HelpPlugin::shutdown() @@ -736,10 +731,13 @@ void HelpPlugin::modeChanged(Core::IMode *mode) qApp->setOverrideCursor(Qt::WaitCursor); resetFilter(); - m_centralWidget->setLastShownPages(); + m_helpEngine->setupData(); connect(m_helpEngine, SIGNAL(setupFinished()), m_helpEngine->searchEngine(), SLOT(indexDocumentation())); QMetaObject::invokeMethod(m_helpEngine, "setupFinished", Qt::QueuedConnection); + + m_centralWidget->setLastShownPages(); + qApp->restoreOverrideCursor(); } } @@ -979,8 +977,9 @@ void HelpPlugin::updateFilterComboBox() void HelpPlugin::checkForHelpChanges() { - bool changed = m_docSettingsPage->applyChanges(); - changed |= m_filterSettingsPage->applyChanges(); + bool changed = unregisterDocumentation(m_docSettingsPage->docsToUnregister()); + filesToRegister += m_docSettingsPage->docsToRegister(); + changed |= registerDocumentation(); if (changed) m_helpEngine->setupData(); } diff --git a/src/plugins/help/helpplugin.h b/src/plugins/help/helpplugin.h index de006ea2e716a01f2643239450ebc444e21055b3..0a6a6e32c82178eec4135184515dc02e23afa665 100644 --- a/src/plugins/help/helpplugin.h +++ b/src/plugins/help/helpplugin.h @@ -96,7 +96,7 @@ public: void setFilesToRegister(const QStringList &files); public slots: - void pluginUpdateDocumentation(); + void slotRegisterDocumentation(); void handleHelpRequest(const QString &url); private slots: @@ -134,7 +134,9 @@ private slots: private: void resetFilter(); - bool updateDocumentation(); + bool verifiyDocumentation(); + bool registerDocumentation(); + bool unregisterDocumentation(const QStringList &nameSpaces); private: QToolBar *createToolBar();