Move help manager into core.

- lessens open file handles
 - improves help plugin startup further

Task-number: QTCREATORBUG-337
Reviewed-by: ck
This commit is contained in:
kh1
2010-06-11 13:11:37 +02:00
parent 40b983a91b
commit 1b6ad08795
41 changed files with 622 additions and 520 deletions

View File

@@ -144,6 +144,11 @@ MimeDatabase *CoreImpl::mimeDatabase() const
return m_mainwindow->mimeDatabase(); return m_mainwindow->mimeDatabase();
} }
HelpManager *CoreImpl::helpManager() const
{
return m_mainwindow->helpManager();
}
QSettings *CoreImpl::settings(QSettings::Scope scope) const QSettings *CoreImpl::settings(QSettings::Scope scope) const
{ {
return m_mainwindow->settings(scope); return m_mainwindow->settings(scope);

View File

@@ -67,6 +67,7 @@ public:
VCSManager *vcsManager() const; VCSManager *vcsManager() const;
ModeManager *modeManager() const; ModeManager *modeManager() const;
MimeDatabase *mimeDatabase() const; MimeDatabase *mimeDatabase() const;
HelpManager *helpManager() const;
QSettings *settings(QSettings::Scope scope = QSettings::UserScope) const; QSettings *settings(QSettings::Scope scope = QSettings::UserScope) const;
SettingsDatabase *settingsDatabase() const; SettingsDatabase *settingsDatabase() const;

View File

@@ -6,6 +6,7 @@ QT += xml \
script \ script \
svg \ svg \
sql sql
CONFIG += help
include(../../qtcreatorplugin.pri) include(../../qtcreatorplugin.pri)
include(../../libs/utils/utils.pri) include(../../libs/utils/utils.pri)
include(../../shared/scriptwrapper/scriptwrapper.pri) include(../../shared/scriptwrapper/scriptwrapper.pri)
@@ -86,7 +87,8 @@ SOURCES += mainwindow.cpp \
editortoolbar.cpp \ editortoolbar.cpp \
ssh/ne7sshobject.cpp \ ssh/ne7sshobject.cpp \
ssh/sshconnection.cpp \ ssh/sshconnection.cpp \
ssh/sshkeygenerator.cpp ssh/sshkeygenerator.cpp \
helpmanager.cpp
HEADERS += mainwindow.h \ HEADERS += mainwindow.h \
editmode.h \ editmode.h \
@@ -171,7 +173,8 @@ HEADERS += mainwindow.h \
editortoolbar.h \ editortoolbar.h \
ssh/ne7sshobject.h \ ssh/ne7sshobject.h \
ssh/sshconnection.h \ ssh/sshconnection.h \
ssh/sshkeygenerator.h ssh/sshkeygenerator.h \
helpmanager.h
FORMS += dialogs/newdialog.ui \ FORMS += dialogs/newdialog.ui \
actionmanager/commandmappings.ui \ actionmanager/commandmappings.ui \

View File

@@ -0,0 +1,321 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** Commercial Usage
**
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at http://qt.nokia.com/contact.
**
**************************************************************************/
#include "helpmanager.h"
#include "icore.h"
#include <QtCore/QDebug>
#include <QtCore/QDir>
#include <QtCore/QFileInfo>
#include <QtCore/QStringList>
#include <QtHelp/QHelpEngineCore>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlDriver>
#include <QtSql/QSqlError>
#include <QtSql/QSqlQuery>
namespace Core {
HelpManager *HelpManager::m_instance = 0;
static const char linksForKeyQuery[] = "SELECT d.Title, f.Name, e.Name, "
"d.Name, a.Anchor FROM IndexTable a, FileNameTable d, FolderTable e, "
"NamespaceTable f WHERE a.FileId=d.FileId AND d.FolderId=e.Id AND "
"a.NamespaceId=f.Id AND a.Name='%1'";
// -- DbCleaner
struct DbCleaner {
DbCleaner(const QString &dbName)
: name(dbName) {}
~DbCleaner() {
QSqlDatabase::removeDatabase(name);
}
QString name;
};
// -- HelpManager
HelpManager::HelpManager(QObject *parent)
: QObject(parent)
, m_needsSetup(true)
, m_helpEngine(0)
{
Q_ASSERT(!m_instance);
m_instance = this;
connect(Core::ICore::instance(), SIGNAL(coreOpened()), this,
SLOT(setupHelpManager()));
}
HelpManager::~HelpManager()
{
delete m_helpEngine;
m_helpEngine = 0;
m_instance = 0;
}
HelpManager* HelpManager::instance()
{
Q_ASSERT(m_instance);
return m_instance;
}
QString HelpManager::collectionFilePath()
{
const QFileInfo fi(Core::ICore::instance()->settings()->fileName());
const QDir directory(fi.absolutePath() + QLatin1String("/qtcreator"));
if (!directory.exists())
directory.mkpath(directory.absolutePath());
return QDir::cleanPath(directory.absolutePath() + QLatin1String("/helpcollection.qhc"));
}
void HelpManager::registerDocumentation(const QStringList &files)
{
if (m_needsSetup) {
m_filesToRegister.append(files);
return;
}
bool docsChanged = false;
foreach (const QString &file, files) {
const QString &nameSpace = m_helpEngine->namespaceName(file);
if (nameSpace.isEmpty())
continue;
if (!m_helpEngine->registeredDocumentations().contains(nameSpace)) {
if (m_helpEngine->registerDocumentation(file)) {
docsChanged = true;
} else {
qWarning() << "Error registering namespace '" << nameSpace
<< "' from file '" << file << "':" << m_helpEngine->error();
}
}
}
if (docsChanged)
emit documentationChanged();
}
void HelpManager::unregisterDocumentation(const QStringList &nameSpaces)
{
if (m_needsSetup) {
m_nameSpacesToUnregister.append(nameSpaces);
return;
}
bool docsChanged = false;
foreach (const QString &nameSpace, nameSpaces) {
if (m_helpEngine->unregisterDocumentation(nameSpace)) {
docsChanged = true;
} else {
qWarning() << "Error unregistering namespace '" << nameSpace
<< "' from file '" << m_helpEngine->documentationFileName(nameSpace)
<< "': " << m_helpEngine->error();
}
}
if (docsChanged)
emit documentationChanged();
}
QUrl buildQUrl(const QString &nameSpace, const QString &folder,
const QString &relFileName, const QString &anchor)
{
QUrl url;
url.setScheme(QLatin1String("qthelp"));
url.setAuthority(nameSpace);
url.setPath(folder + QLatin1Char('/') + relFileName);
url.setFragment(anchor);
return url;
}
// This should go into Qt 4.8 once we start using it for Qt Creator
QMap<QString, QUrl> HelpManager::linksForKeyword(const QString &key) const
{
QMap<QString, QUrl> links;
if (m_needsSetup)
return links;
const QLatin1String sqlite("QSQLITE");
const QLatin1String name("HelpManager::linksForKeyword");
DbCleaner cleaner(name);
QSqlDatabase db = QSqlDatabase::addDatabase(sqlite, name);
if (db.driver() && db.driver()->lastError().type() == QSqlError::NoError) {
const QStringList &registeredDocs = m_helpEngine->registeredDocumentations();
foreach (const QString &nameSpace, registeredDocs) {
db.setDatabaseName(m_helpEngine->documentationFileName(nameSpace));
if (db.open()) {
QSqlQuery query = QSqlQuery(db);
query.setForwardOnly(true);
query.exec(QString::fromLatin1(linksForKeyQuery).arg(key));
while (query.next()) {
QString title = query.value(0).toString();
if (title.isEmpty()) // generate a title + corresponding path
title = key + QLatin1String(" : ") + query.value(3).toString();
links.insertMulti(title, buildQUrl(query.value(1).toString(),
query.value(2).toString(), query.value(3).toString(),
query.value(4).toString()));
}
}
}
}
return links;
}
QMap<QString, QUrl> HelpManager::linksForIdentifier(const QString &id) const
{
if (m_needsSetup)
return QMap<QString, QUrl>();
return m_helpEngine->linksForIdentifier(id);
}
// This should go into Qt 4.8 once we start using it for Qt Creator
QStringList HelpManager::findKeywords(const QString &key, int maxHits) const
{
QStringList keywords;
if (m_needsSetup)
return keywords;
const QLatin1String sqlite("QSQLITE");
const QLatin1String name("HelpManager::findKeywords");
DbCleaner cleaner(name);
QSqlDatabase db = QSqlDatabase::addDatabase(sqlite, name);
if (db.driver() && db.driver()->lastError().type() == QSqlError::NoError) {
const QStringList &registeredDocs = m_helpEngine->registeredDocumentations();
foreach (const QString &nameSpace, registeredDocs) {
db.setDatabaseName(m_helpEngine->documentationFileName(nameSpace));
if (db.open()) {
QSqlQuery query = QSqlQuery(db);
query.setForwardOnly(true);
query.exec(QString::fromLatin1("SELECT DISTINCT Name FROM "
"IndexTable WHERE Name LIKE '%%1%'").arg(key));
while (query.next()) {
const QString &key = query.value(0).toString();
if (!key.isEmpty()) {
keywords.append(key);
if (keywords.count() == maxHits)
return keywords;
}
}
}
}
}
return keywords;
}
QUrl HelpManager::findFile(const QUrl &url) const
{
if (m_needsSetup)
return QUrl();
return m_helpEngine->findFile(url);
}
void HelpManager::handleHelpRequest(const QString &url)
{
emit helpRequested(QUrl(url));
}
QStringList HelpManager::registeredNamespaces() const
{
if (m_needsSetup)
return QStringList();
return m_helpEngine->registeredDocumentations();
}
QString HelpManager::namespaceFromFile(const QString &file) const
{
if (m_needsSetup)
return QString();
return m_helpEngine->namespaceName(file);
}
QString HelpManager::fileFromNamespace(const QString &nameSpace) const
{
if (m_needsSetup)
return QString();
return m_helpEngine->documentationFileName(nameSpace);
}
// -- private slots
void HelpManager::setupHelpManager()
{
if (!m_needsSetup)
return;
m_needsSetup = false;
m_helpEngine = new QHelpEngineCore(collectionFilePath(), this);
m_helpEngine->setAutoSaveFilter(false);
m_helpEngine->setCurrentFilter(tr("Unfiltered"));
m_helpEngine->setupData();
verifyDocumenation();
if (!m_nameSpacesToUnregister.isEmpty()) {
unregisterDocumentation(m_nameSpacesToUnregister);
m_nameSpacesToUnregister.clear();
}
// this might come from the installer
const QLatin1String key("AddedDocs");
const QString &addedDocs = m_helpEngine->customValue(key).toString();
if (!addedDocs.isEmpty()) {
m_helpEngine->removeCustomValue(key);
m_filesToRegister += addedDocs.split(QLatin1Char(';'));
}
if (!m_filesToRegister.isEmpty()) {
registerDocumentation(m_filesToRegister);
m_filesToRegister.clear();
}
emit setupFinished();
}
// -- private
void HelpManager::verifyDocumenation()
{
QStringList nameSpacesToUnregister;
const QStringList &registeredDocs = m_helpEngine->registeredDocumentations();
foreach (const QString &nameSpace, registeredDocs) {
const QString &file = m_helpEngine->documentationFileName(nameSpace);
if (!QFileInfo(file).exists())
nameSpacesToUnregister.append(nameSpace);
}
if (!nameSpacesToUnregister.isEmpty())
unregisterDocumentation(nameSpacesToUnregister);
}
} // Core

View File

@@ -0,0 +1,96 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** Commercial Usage
**
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at http://qt.nokia.com/contact.
**
**************************************************************************/
#ifndef HELPMANAGER_H
#define HELPMANAGER_H
#include "core_global.h"
#include <QtCore/QMap>
#include <QtCore/QObject>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QUrl>
#include <QtCore/QVariant>
QT_FORWARD_DECLARE_CLASS(QHelpEngineCore)
QT_FORWARD_DECLARE_CLASS(QSqlQuery)
namespace Core {
class CORE_EXPORT HelpManager : public QObject
{
Q_OBJECT
Q_DISABLE_COPY(HelpManager)
public:
explicit HelpManager(QObject *parent = 0);
virtual ~HelpManager();
static HelpManager* instance();
static QString collectionFilePath();
void registerDocumentation(const QStringList &fileNames);
void unregisterDocumentation(const QStringList &nameSpaces);
QMap<QString, QUrl> linksForKeyword(const QString &key) const;
QMap<QString, QUrl> linksForIdentifier(const QString &id) const;
QStringList findKeywords(const QString &key, int maxHits = INT_MAX) const;
QUrl findFile(const QUrl &url) const;
void handleHelpRequest(const QString &url);
QStringList registeredNamespaces() const;
QString namespaceFromFile(const QString &file) const;
QString fileFromNamespace(const QString &nameSpace) const;
signals:
void setupFinished();
void documentationChanged();
void helpRequested(const QUrl &url);
private slots:
void setupHelpManager();
private:
void verifyDocumenation();
private:
bool m_needsSetup;
QHelpEngineCore *m_helpEngine;
QStringList m_filesToRegister;
QStringList m_nameSpacesToUnregister;
static HelpManager *m_instance;
};
} // Core
#endif // HELPMANAGER_H

View File

@@ -50,6 +50,7 @@ namespace Core {
class ActionManager; class ActionManager;
class EditorManager; class EditorManager;
class FileManager; class FileManager;
class HelpManager;
class IContext; class IContext;
class MessageManager; class MessageManager;
class MimeDatabase; class MimeDatabase;
@@ -96,6 +97,7 @@ public:
virtual VCSManager *vcsManager() const = 0; virtual VCSManager *vcsManager() const = 0;
virtual ModeManager *modeManager() const = 0; virtual ModeManager *modeManager() const = 0;
virtual MimeDatabase *mimeDatabase() const = 0; virtual MimeDatabase *mimeDatabase() const = 0;
virtual HelpManager *helpManager() const = 0;
virtual QSettings *settings(QSettings::Scope scope = QSettings::UserScope) const = 0; virtual QSettings *settings(QSettings::Scope scope = QSettings::UserScope) const = 0;
virtual SettingsDatabase *settingsDatabase() const = 0; virtual SettingsDatabase *settingsDatabase() const = 0;

View File

@@ -37,6 +37,7 @@
#include "fancytabwidget.h" #include "fancytabwidget.h"
#include "filemanager.h" #include "filemanager.h"
#include "generalsettings.h" #include "generalsettings.h"
#include "helpmanager.h"
#include "ifilefactory.h" #include "ifilefactory.h"
#include "messagemanager.h" #include "messagemanager.h"
#include "modemanager.h" #include "modemanager.h"
@@ -132,6 +133,7 @@ MainWindow::MainWindow() :
m_statusBarManager(0), m_statusBarManager(0),
m_modeManager(0), m_modeManager(0),
m_mimeDatabase(new MimeDatabase), m_mimeDatabase(new MimeDatabase),
m_helpManager(new HelpManager),
m_navigationWidget(0), m_navigationWidget(0),
m_rightPaneWidget(0), m_rightPaneWidget(0),
m_versionDialog(0), m_versionDialog(0),
@@ -288,6 +290,9 @@ MainWindow::~MainWindow()
m_modeManager = 0; m_modeManager = 0;
delete m_mimeDatabase; delete m_mimeDatabase;
m_mimeDatabase = 0; m_mimeDatabase = 0;
delete m_helpManager;
m_helpManager = 0;
} }
bool MainWindow::init(QString *errorMessage) bool MainWindow::init(QString *errorMessage)
@@ -1011,6 +1016,11 @@ MimeDatabase *MainWindow::mimeDatabase() const
return m_mimeDatabase; return m_mimeDatabase;
} }
HelpManager *MainWindow::helpManager() const
{
return m_helpManager;
}
IContext *MainWindow::contextObject(QWidget *widget) IContext *MainWindow::contextObject(QWidget *widget)
{ {
return m_contextWidgets.value(widget); return m_contextWidgets.value(widget);

View File

@@ -52,6 +52,7 @@ class ActionManager;
class StatusBarWidget; class StatusBarWidget;
class EditorManager; class EditorManager;
class FileManager; class FileManager;
class HelpManager;
class IContext; class IContext;
class IWizard; class IWizard;
class MessageManager; class MessageManager;
@@ -107,6 +108,7 @@ public:
Core::VariableManager *variableManager() const; Core::VariableManager *variableManager() const;
Core::ModeManager *modeManager() const; Core::ModeManager *modeManager() const;
Core::MimeDatabase *mimeDatabase() const; Core::MimeDatabase *mimeDatabase() const;
Core::HelpManager *helpManager() const;
VCSManager *vcsManager() const; VCSManager *vcsManager() const;
QSettings *settings(QSettings::Scope scope) const; QSettings *settings(QSettings::Scope scope) const;
@@ -193,6 +195,7 @@ private:
StatusBarManager *m_statusBarManager; StatusBarManager *m_statusBarManager;
ModeManager *m_modeManager; ModeManager *m_modeManager;
MimeDatabase *m_mimeDatabase; MimeDatabase *m_mimeDatabase;
HelpManager *m_helpManager;
FancyTabWidget *m_modeStack; FancyTabWidget *m_modeStack;
NavigationWidget *m_navigationWidget; NavigationWidget *m_navigationWidget;
RightPaneWidget *m_rightPaneWidget; RightPaneWidget *m_rightPaneWidget;

View File

@@ -1,7 +1,6 @@
TEMPLATE = lib TEMPLATE = lib
TARGET = CppEditor TARGET = CppEditor
DEFINES += CPPEDITOR_LIBRARY DEFINES += CPPEDITOR_LIBRARY
CONFIG += help
include(../../qtcreatorplugin.pri) include(../../qtcreatorplugin.pri)
include(../../libs/utils/utils.pri) include(../../libs/utils/utils.pri)
include(../../shared/indenter/indenter.pri) include(../../shared/indenter/indenter.pri)

View File

@@ -32,6 +32,7 @@
#include "cppplugin.h" #include "cppplugin.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/helpmanager.h>
#include <coreplugin/uniqueidmanager.h> #include <coreplugin/uniqueidmanager.h>
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <cpptools/cppmodelmanagerinterface.h> #include <cpptools/cppmodelmanagerinterface.h>
@@ -60,7 +61,6 @@
#include <QtGui/QToolTip> #include <QtGui/QToolTip>
#include <QtGui/QTextCursor> #include <QtGui/QTextCursor>
#include <QtGui/QTextBlock> #include <QtGui/QTextBlock>
#include <QtHelp/QHelpEngineCore>
using namespace CppEditor::Internal; using namespace CppEditor::Internal;
using namespace CPlusPlus; using namespace CPlusPlus;
@@ -68,27 +68,11 @@ using namespace Core;
CppHoverHandler::CppHoverHandler(QObject *parent) CppHoverHandler::CppHoverHandler(QObject *parent)
: QObject(parent) : QObject(parent)
, m_helpEngineNeedsSetup(false)
{ {
m_modelManager = ExtensionSystem::PluginManager::instance()->getObject<CppTools::CppModelManagerInterface>(); m_modelManager = ExtensionSystem::PluginManager::instance()->getObject<CppTools::CppModelManagerInterface>();
ICore *core = ICore::instance();
QFileInfo fi(core->settings()->fileName());
// FIXME shouldn't the help engine create the directory if it doesn't exist?
QDir directory(fi.absolutePath()+"/qtcreator");
if (!directory.exists())
directory.mkpath(directory.absolutePath());
m_helpEngine = new QHelpEngineCore(directory.absolutePath()
+ QLatin1String("/helpcollection.qhc"), this);
if (!m_helpEngine->setupData())
qWarning() << "Could not initialize help engine:" << m_helpEngine->error();
m_helpEngine->setAutoSaveFilter(false);
m_helpEngine->setCurrentFilter(tr("Unfiltered"));
m_helpEngineNeedsSetup = m_helpEngine->registeredDocumentations().count() == 0;
// Listen for editor opened events in order to connect to tooltip/helpid requests // Listen for editor opened events in order to connect to tooltip/helpid requests
connect(core->editorManager(), SIGNAL(editorOpened(Core::IEditor *)), connect(ICore::instance()->editorManager(), SIGNAL(editorOpened(Core::IEditor *)),
this, SLOT(editorOpened(Core::IEditor *))); this, SLOT(editorOpened(Core::IEditor *)));
} }
@@ -297,19 +281,13 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
} }
} }
if (m_helpEngineNeedsSetup
&& m_helpEngine->registeredDocumentations().count() > 0) {
m_helpEngine->setupData();
m_helpEngineNeedsSetup = false;
}
QMap<QString, QUrl> helpLinks; QMap<QString, QUrl> helpLinks;
if (m_toolTip.isEmpty()) { if (m_toolTip.isEmpty()) {
foreach (const Document::Include &incl, doc->includes()) { foreach (const Document::Include &incl, doc->includes()) {
if (incl.line() == lineNumber) { if (incl.line() == lineNumber) {
m_toolTip = QDir::toNativeSeparators(incl.fileName()); m_toolTip = QDir::toNativeSeparators(incl.fileName());
m_helpId = QFileInfo(incl.fileName()).fileName(); m_helpId = QFileInfo(incl.fileName()).fileName();
helpLinks = m_helpEngine->linksForIdentifier(m_helpId); helpLinks = Core::HelpManager::instance()->linksForIdentifier(m_helpId);
break; break;
} }
} }
@@ -388,7 +366,7 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
// To show their help anyway, try stripping scopes until we find something. // To show their help anyway, try stripping scopes until we find something.
const QString startHelpId = m_helpId; const QString startHelpId = m_helpId;
while (!m_helpId.isEmpty()) { while (!m_helpId.isEmpty()) {
helpLinks = m_helpEngine->linksForIdentifier(m_helpId); helpLinks = Core::HelpManager::instance()->linksForIdentifier(m_helpId);
if (!helpLinks.isEmpty()) if (!helpLinks.isEmpty())
break; break;

View File

@@ -33,7 +33,6 @@
#include <QtCore/QObject> #include <QtCore/QObject>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QHelpEngineCore;
class QPoint; class QPoint;
QT_END_NAMESPACE QT_END_NAMESPACE
@@ -70,10 +69,8 @@ private:
void updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, int pos); void updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, int pos);
CppTools::CppModelManagerInterface *m_modelManager; CppTools::CppModelManagerInterface *m_modelManager;
QHelpEngineCore *m_helpEngine;
QString m_helpId; QString m_helpId;
QString m_toolTip; QString m_toolTip;
bool m_helpEngineNeedsSetup;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -45,6 +45,7 @@
#include <coreplugin/designmode.h> #include <coreplugin/designmode.h>
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/helpmanager.h>
#include <coreplugin/uniqueidmanager.h> #include <coreplugin/uniqueidmanager.h>
#include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/actionmanager/actioncontainer.h> #include <coreplugin/actionmanager/actioncontainer.h>
@@ -282,14 +283,8 @@ void FormEditorW::fullInit()
m_integration = new QtCreatorIntegration(m_formeditor, this); m_integration = new QtCreatorIntegration(m_formeditor, this);
m_formeditor->setIntegration(m_integration); m_formeditor->setIntegration(m_integration);
// Connect Qt Designer help request to HelpManager. // Connect Qt Designer help request to HelpManager.
// TODO: Use Core::HelpManager once it has been introduced. connect(m_integration, SIGNAL(creatorHelpRequested(QUrl)),
foreach(QObject *object, ExtensionSystem::PluginManager::instance()->allObjects()) { Core::HelpManager::instance(), SIGNAL(helpRequested(QUrl)));
if (!qstrcmp(object->metaObject()->className(), "Help::HelpManager")) {
connect(m_integration, SIGNAL(creatorHelpRequested(QString)),
object, SLOT(handleHelpRequest(QString)));
break;
}
}
/** /**
* This will initialize our TabOrder, Signals and slots and Buddy editors. * This will initialize our TabOrder, Signals and slots and Buddy editors.

View File

@@ -61,6 +61,7 @@
#include <QtCore/QFileInfo> #include <QtCore/QFileInfo>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QUrl>
enum { indentation = 4 }; enum { indentation = 4 };
@@ -101,7 +102,8 @@ QtCreatorIntegration::QtCreatorIntegration(QDesignerFormEditorInterface *core, F
void QtCreatorIntegration::slotDesignerHelpRequested(const QString &manual, const QString &document) void QtCreatorIntegration::slotDesignerHelpRequested(const QString &manual, const QString &document)
{ {
// Pass on as URL. // Pass on as URL.
emit creatorHelpRequested(QString::fromLatin1("qthelp://com.trolltech.%1/qdoc/%2").arg(manual, document)); emit creatorHelpRequested(QUrl(QString::fromLatin1("qthelp://com.trolltech.%1/qdoc/%2")
.arg(manual, document)));
} }
void QtCreatorIntegration::updateSelection() void QtCreatorIntegration::updateSelection()

View File

@@ -34,6 +34,8 @@
#include "qt_private/qdesigner_integration_p.h" #include "qt_private/qdesigner_integration_p.h"
QT_FORWARD_DECLARE_CLASS(QUrl)
namespace Designer { namespace Designer {
namespace Internal { namespace Internal {
@@ -49,7 +51,7 @@ public:
bool supportsToSlotNavigation() { return true; } bool supportsToSlotNavigation() { return true; }
signals: signals:
void creatorHelpRequested(const QString &url); void creatorHelpRequested(const QUrl &url);
public slots: public slots:
void updateSelection(); void updateSelection();

View File

@@ -45,7 +45,6 @@
#include <QtGui/QStackedWidget> #include <QtGui/QStackedWidget>
#include <QtHelp/QHelpEngine> #include <QtHelp/QHelpEngine>
#include <QtHelp/QHelpEngineCore>
#include <QtHelp/QHelpSearchEngine> #include <QtHelp/QHelpSearchEngine>
using namespace Help::Internal; using namespace Help::Internal;
@@ -85,7 +84,7 @@ CentralWidget::~CentralWidget()
} }
} }
QHelpEngineCore *engine = &HelpManager::helpEngineCore(); QHelpEngineCore *engine = &LocalHelpManager::helpEngine();
engine->setCustomValue(QLatin1String("LastShownPages"), currentPages); engine->setCustomValue(QLatin1String("LastShownPages"), currentPages);
engine->setCustomValue(QLatin1String("LastShownPagesZoom"), zoomFactors); engine->setCustomValue(QLatin1String("LastShownPagesZoom"), zoomFactors);
engine->setCustomValue(QLatin1String("LastTabPage"), currentIndex()); engine->setCustomValue(QLatin1String("LastTabPage"), currentIndex());
@@ -314,7 +313,7 @@ void CentralWidget::highlightSearchTerms()
{ {
if (HelpViewer *viewer = currentHelpViewer()) { if (HelpViewer *viewer = currentHelpViewer()) {
QHelpSearchEngine *searchEngine = QHelpSearchEngine *searchEngine =
HelpManager::instance().helpEngine().searchEngine(); LocalHelpManager::helpEngine().searchEngine();
QList<QHelpSearchQuery> queryList = searchEngine->query(); QList<QHelpSearchQuery> queryList = searchEngine->query();
QStringList terms; QStringList terms;

View File

@@ -29,7 +29,8 @@
#include "docsettingspage.h" #include "docsettingspage.h"
#include "helpconstants.h" #include "helpconstants.h"
#include "helpmanager.h"
#include <coreplugin/helpmanager.h>
#include <QtCore/QCoreApplication> #include <QtCore/QCoreApplication>
@@ -37,8 +38,6 @@
#include <QtGui/QKeyEvent> #include <QtGui/QKeyEvent>
#include <QtGui/QMessageBox> #include <QtGui/QMessageBox>
#include <QtHelp/QHelpEngineCore>
using namespace Help::Internal; using namespace Help::Internal;
DocSettingsPage::DocSettingsPage() DocSettingsPage::DocSettingsPage()
@@ -80,10 +79,10 @@ QWidget *DocSettingsPage::createPage(QWidget *parent)
m_ui.docsListWidget->installEventFilter(this); m_ui.docsListWidget->installEventFilter(this);
QHelpEngineCore *engine = &HelpManager::helpEngineCore(); Core::HelpManager *manager = Core::HelpManager::instance();
const QStringList &nameSpaces = engine->registeredDocumentations(); const QStringList &nameSpaces = manager->registeredNamespaces();
foreach (const QString &nameSpace, nameSpaces) foreach (const QString &nameSpace, nameSpaces)
addItem(nameSpace, engine->documentationFileName(nameSpace)); addItem(nameSpace, manager->fileFromNamespace(nameSpace));
m_filesToRegister.clear(); m_filesToRegister.clear();
m_filesToUnregister.clear(); m_filesToUnregister.clear();
@@ -103,11 +102,11 @@ void DocSettingsPage::addDocumentation()
return; return;
m_recentDialogPath = QFileInfo(files.first()).canonicalPath(); m_recentDialogPath = QFileInfo(files.first()).canonicalPath();
const QHelpEngineCore &engine = HelpManager::helpEngineCore(); Core::HelpManager *manager = Core::HelpManager::instance();
const QStringList &nameSpaces = engine.registeredDocumentations(); const QStringList &nameSpaces = manager->registeredNamespaces();
foreach (const QString &file, files) { foreach (const QString &file, files) {
const QString &nameSpace = engine.namespaceName(file); const QString &nameSpace = manager->namespaceFromFile(file);
if (nameSpace.isEmpty()) if (nameSpace.isEmpty())
continue; continue;
@@ -130,14 +129,10 @@ void DocSettingsPage::removeDocumentation()
void DocSettingsPage::apply() void DocSettingsPage::apply()
{ {
HelpManager* manager = &HelpManager::instance(); Core::HelpManager *manager = Core::HelpManager::instance();
manager->unregisterDocumentation(m_filesToUnregister.keys()); manager->unregisterDocumentation(m_filesToUnregister.keys());
manager->registerDocumentation(m_filesToRegister.values()); manager->registerDocumentation(m_filesToRegister.values());
if (manager->guiEngineNeedsUpdate()) {
// emit this signal to the help plugin, since we don't want
// to force gui help engine setup if we are not in help mode
emit documentationChanged();
}
m_filesToRegister.clear(); m_filesToRegister.clear();
m_filesToUnregister.clear(); m_filesToUnregister.clear();
@@ -172,10 +167,10 @@ void DocSettingsPage::removeDocumentation(const QList<QListWidgetItem*> items)
return; return;
int row = 0; int row = 0;
QHelpEngineCore *engine = &HelpManager::helpEngineCore(); Core::HelpManager *manager = Core::HelpManager::instance();
foreach (QListWidgetItem* item, items) { foreach (QListWidgetItem* item, items) {
const QString &nameSpace = item->text(); const QString &nameSpace = item->text();
const QString &docPath = engine->documentationFileName(nameSpace); const QString &docPath = manager->fileFromNamespace(nameSpace);
if (m_filesToRegister.value(nameSpace) != docPath) { if (m_filesToRegister.value(nameSpace) != docPath) {
if (!m_filesToUnregister.contains(nameSpace)) if (!m_filesToUnregister.contains(nameSpace))

View File

@@ -55,9 +55,6 @@ public:
void finish() {} void finish() {}
virtual bool matches(const QString &s) const; virtual bool matches(const QString &s) const;
signals:
void documentationChanged();
private slots: private slots:
void addDocumentation(); void addDocumentation();
void removeDocumentation(); void removeDocumentation();

View File

@@ -33,16 +33,19 @@
#include "helpconstants.h" #include "helpconstants.h"
#include "helpmanager.h" #include "helpmanager.h"
#include <coreplugin/helpmanager.h>
#include <QtCore/QCoreApplication> #include <QtCore/QCoreApplication>
#include <QtGui/QFileDialog> #include <QtGui/QFileDialog>
#include <QtGui/QMessageBox> #include <QtGui/QMessageBox>
#include <QtHelp/QHelpEngineCore> #include <QtHelp/QHelpEngine>
using namespace Help::Internal; using namespace Help::Internal;
FilterSettingsPage::FilterSettingsPage() FilterSettingsPage::FilterSettingsPage()
: m_helpManager(0)
{ {
} }
@@ -76,6 +79,7 @@ QWidget *FilterSettingsPage::createPage(QWidget *parent)
QWidget *widget = new QWidget(parent); QWidget *widget = new QWidget(parent);
m_ui.setupUi(widget); m_ui.setupUi(widget);
m_helpManager->setupGuiHelpEngine();
updateFilterPage(); // does call setupData on the engine updateFilterPage(); // does call setupData on the engine
connect(m_ui.attributeWidget, SIGNAL(itemChanged(QTreeWidgetItem*, int)), connect(m_ui.attributeWidget, SIGNAL(itemChanged(QTreeWidgetItem*, int)),
@@ -86,6 +90,8 @@ QWidget *FilterSettingsPage::createPage(QWidget *parent)
connect(m_ui.filterAddButton, SIGNAL(clicked()), this, SLOT(addFilter())); connect(m_ui.filterAddButton, SIGNAL(clicked()), this, SLOT(addFilter()));
connect(m_ui.filterRemoveButton, SIGNAL(clicked()), this, connect(m_ui.filterRemoveButton, SIGNAL(clicked()), this,
SLOT(removeFilter())); SLOT(removeFilter()));
connect(Core::HelpManager::instance(), SIGNAL(documentationChanged()),
this, SLOT(updateFilterPage()));
if (m_searchKeywords.isEmpty()) { if (m_searchKeywords.isEmpty()) {
m_searchKeywords = m_ui.filterGroupBox->title() + QLatin1Char(' ') m_searchKeywords = m_ui.filterGroupBox->title() + QLatin1Char(' ')
@@ -100,7 +106,7 @@ void FilterSettingsPage::updateFilterPage()
m_ui.attributeWidget->clear(); m_ui.attributeWidget->clear();
m_filterMapBackup.clear(); m_filterMapBackup.clear();
const QHelpEngineCore &engine = HelpManager::helpEngineCore(); const QHelpEngineCore &engine = LocalHelpManager::helpEngine();
const QStringList &filters = engine.customFilters(); const QStringList &filters = engine.customFilters();
foreach (const QString &filter, filters) { foreach (const QString &filter, filters) {
const QStringList &attributes = engine.filterAttributes(filter); const QStringList &attributes = engine.filterAttributes(filter);
@@ -210,7 +216,7 @@ void FilterSettingsPage::apply()
} }
if (changed) { if (changed) {
QHelpEngineCore *engine = &HelpManager::helpEngineCore(); QHelpEngineCore *engine = &LocalHelpManager::helpEngine();
foreach (const QString &filter, m_removedFilters) foreach (const QString &filter, m_removedFilters)
engine->removeCustomFilter(filter); engine->removeCustomFilter(filter);
@@ -228,3 +234,8 @@ bool FilterSettingsPage::matches(const QString &s) const
{ {
return m_searchKeywords.contains(s, Qt::CaseInsensitive); return m_searchKeywords.contains(s, Qt::CaseInsensitive);
} }
void FilterSettingsPage::setHelpManager(LocalHelpManager *manager)
{
m_helpManager = manager;
}

View File

@@ -36,6 +36,8 @@
namespace Help { namespace Help {
namespace Internal { namespace Internal {
class LocalHelpManager;
class FilterSettingsPage : public Core::IOptionsPage class FilterSettingsPage : public Core::IOptionsPage
{ {
Q_OBJECT Q_OBJECT
@@ -55,6 +57,8 @@ public:
void finish() {} void finish() {}
virtual bool matches(const QString &s) const; virtual bool matches(const QString &s) const;
void setHelpManager(LocalHelpManager *manager);
signals: signals:
void filtersChanged(); void filtersChanged();
@@ -73,6 +77,8 @@ private:
QString m_searchKeywords; QString m_searchKeywords;
QStringList m_removedFilters; QStringList m_removedFilters;
LocalHelpManager *m_helpManager;
}; };
} // namespace Help } // namespace Help

View File

@@ -44,7 +44,7 @@
#include <QtGui/QApplication> #include <QtGui/QApplication>
#include <QtGui/QFileDialog> #include <QtGui/QFileDialog>
#include <QtHelp/QHelpEngineCore> #include <QtHelp/QHelpEngine>
#if !defined(QT_NO_WEBKIT) #if !defined(QT_NO_WEBKIT)
#include <QtWebKit/QWebSettings> #include <QtWebKit/QWebSettings>
@@ -94,7 +94,7 @@ QWidget *GeneralSettingsPage::createPage(QWidget *parent)
m_ui.sizeComboBox->setEditable(false); m_ui.sizeComboBox->setEditable(false);
m_ui.styleComboBox->setEditable(false); m_ui.styleComboBox->setEditable(false);
const QHelpEngineCore &engine = HelpManager::helpEngineCore(); const QHelpEngineCore &engine = LocalHelpManager::helpEngine();
m_font = qVariantValue<QFont>(engine.customValue(QLatin1String("font"), m_font)); m_font = qVariantValue<QFont>(engine.customValue(QLatin1String("font"), m_font));
updateFontSize(); updateFontSize();
@@ -163,7 +163,7 @@ void GeneralSettingsPage::apply()
if (weight >= 0) // Weight < 0 asserts... if (weight >= 0) // Weight < 0 asserts...
newFont.setWeight(weight); newFont.setWeight(weight);
QHelpEngineCore *engine = &HelpManager::helpEngineCore(); QHelpEngineCore *engine = &LocalHelpManager::helpEngine();
engine->setCustomValue(QLatin1String("font"), newFont); engine->setCustomValue(QLatin1String("font"), newFont);
if (newFont != m_font) if (newFont != m_font)
@@ -197,7 +197,7 @@ void GeneralSettingsPage::setBlankPage()
void GeneralSettingsPage::setDefaultPage() void GeneralSettingsPage::setDefaultPage()
{ {
const QString &defaultHomePage = HelpManager::helpEngineCore() const QString &defaultHomePage = LocalHelpManager::helpEngine()
.customValue(QLatin1String("DefaultHomePage"), QString()).toString(); .customValue(QLatin1String("DefaultHomePage"), QString()).toString();
m_ui.homePageLineEdit->setText(defaultHomePage); m_ui.homePageLineEdit->setText(defaultHomePage);
} }
@@ -214,7 +214,7 @@ void GeneralSettingsPage::importBookmarks()
QFile file(fileName); QFile file(fileName);
if (file.open(QIODevice::ReadOnly)) { if (file.open(QIODevice::ReadOnly)) {
const BookmarkManager &manager = HelpManager::bookmarkManager(); const BookmarkManager &manager = LocalHelpManager::bookmarkManager();
XbelReader reader(manager.treeBookmarkModel(), manager.listBookmarkModel()); XbelReader reader(manager.treeBookmarkModel(), manager.listBookmarkModel());
if (reader.readFromFile(&file)) if (reader.readFromFile(&file))
return; return;
@@ -237,7 +237,7 @@ void GeneralSettingsPage::exportBookmarks()
QFile file(fileName); QFile file(fileName);
if (file.open(QIODevice::WriteOnly)) { if (file.open(QIODevice::WriteOnly)) {
XbelWriter writer(HelpManager::bookmarkManager().treeBookmarkModel()); XbelWriter writer(LocalHelpManager::bookmarkManager().treeBookmarkModel());
writer.writeToFile(&file); writer.writeToFile(&file);
} }
} }

View File

@@ -28,197 +28,28 @@
**************************************************************************/ **************************************************************************/
#include "helpindexfilter.h" #include "helpindexfilter.h"
#include "helpmanager.h"
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/helpmanager.h>
#include <QtGui/QIcon> #include <QtGui/QIcon>
#include <QtHelp/QHelpEngine>
#include <QtHelp/QHelpIndexModel>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlDriver>
#include <QtSql/QSqlError>
#include <QtSql/QSqlQuery>
using namespace Locator; using namespace Locator;
using namespace Help; using namespace Help;
using namespace Help::Internal; using namespace Help::Internal;
Q_DECLARE_METATYPE(ILocatorFilter*); Q_DECLARE_METATYPE(ILocatorFilter*);
static const char linksForKeyQuery[] = "SELECT d.Title, f.Name, e.Name, "
"d.Name, a.Anchor FROM IndexTable a, FileNameTable d, FolderTable e, "
"NamespaceTable f WHERE a.FileId=d.FileId AND d.FolderId=e.Id AND "
"a.NamespaceId=f.Id AND a.Name='%1'";
// -- HelpIndexFilter::HelpFileReader
class HelpIndexFilter::HelpFileReader
{
struct dbCleaner {
dbCleaner(const QString &dbName)
: name(dbName) {}
~dbCleaner() {
QSqlDatabase::removeDatabase(name);
}
QString name;
};
public:
HelpFileReader();
~HelpFileReader();
public:
void updateHelpFiles();
QMap<QString, QUrl> linksForKey(const QString &key);
QList<FilterEntry> matchesFor(const QString &entry, ILocatorFilter *locator,
int maxHits = INT_MAX);
private:
QIcon m_icon;
bool m_initialized;
QStringList m_helpFiles;
};
HelpIndexFilter::HelpFileReader::HelpFileReader()
: m_initialized(false)
{
m_icon = QIcon(QLatin1String(":/help/images/bookmark.png"));
}
HelpIndexFilter::HelpFileReader::~HelpFileReader()
{
}
void HelpIndexFilter::HelpFileReader::updateHelpFiles()
{
m_helpFiles.clear();
const QLatin1String id("HelpIndexFilter::HelpFileReader::helpFiles");
{
QSqlDatabase db = QSqlDatabase::addDatabase(QLatin1String("QSQLITE"), id);
if (db.driver()
&& db.driver()->lastError().type() == QSqlError::NoError) {
db.setDatabaseName(HelpManager::collectionFilePath());
if (db.open()) {
QSqlQuery query = QSqlQuery(db);
query.exec(QLatin1String("SELECT a.FilePath FROM NamespaceTable a"));
while (query.next())
m_helpFiles.append(query.value(0).toString());
}
}
}
QSqlDatabase::removeDatabase(id);
}
QUrl buildQUrl(const QString &nameSpace, const QString &folder,
const QString &relFileName, const QString &anchor)
{
QUrl url;
url.setScheme(QLatin1String("qthelp"));
url.setAuthority(nameSpace);
url.setPath(folder + QLatin1Char('/') + relFileName);
url.setFragment(anchor);
return url;
}
QMap<QString, QUrl>HelpIndexFilter::HelpFileReader::linksForKey(const QString &key)
{
if (!m_initialized) {
updateHelpFiles();
m_initialized = true;
}
QMap<QString, QUrl> links;
const QLatin1String sqlite("QSQLITE");
const QLatin1String name("HelpIndexFilter::HelpFileReader::linksForKey");
dbCleaner cleaner(name);
QSqlDatabase db = QSqlDatabase::addDatabase(sqlite, name);
if (db.driver() && db.driver()->lastError().type() == QSqlError::NoError) {
foreach(const QString &file, m_helpFiles) {
if (!QFile::exists(file))
continue;
db.setDatabaseName(file);
if (db.open()) {
QSqlQuery query = QSqlQuery(db);
query.setForwardOnly(true);
query.exec(QString::fromLatin1(linksForKeyQuery).arg(key));
while (query.next()) {
QString title = query.value(0).toString();
if (title.isEmpty()) // generate a title + corresponding path
title = key + QLatin1String(" : ") + query.value(3).toString();
links.insertMulti(title, buildQUrl(query.value(1).toString(),
query.value(2).toString(), query.value(3).toString(),
query.value(4).toString()));
}
}
}
}
return links;
}
QList<FilterEntry> HelpIndexFilter::HelpFileReader::matchesFor(const QString &id,
ILocatorFilter *locator, int maxHits)
{
if (!m_initialized) {
updateHelpFiles();
m_initialized = true;
}
QList<FilterEntry> entries;
const QLatin1String sqlite("QSQLITE");
const QLatin1String name("HelpIndexFilter::HelpFileReader::matchesFor");
dbCleaner cleaner(name);
QSqlDatabase db = QSqlDatabase::addDatabase(sqlite, name);
if (db.driver() && db.driver()->lastError().type() == QSqlError::NoError) {
foreach(const QString &file, m_helpFiles) {
if (!QFile::exists(file))
continue;
db.setDatabaseName(file);
if (db.open()) {
QSqlQuery query = QSqlQuery(db);
query.setForwardOnly(true);
query.exec(QString::fromLatin1("SELECT DISTINCT Name FROM "
"IndexTable WHERE Name LIKE '%%1%'").arg(id));
while (query.next()) {
const QString &key = query.value(0).toString();
if (!key.isEmpty()) {
entries.append(FilterEntry(locator, key, QVariant(),
m_icon));
if (entries.count() == maxHits)
return entries;
}
}
}
}
}
return entries;
}
// -- HelpIndexFilter
HelpIndexFilter::HelpIndexFilter() HelpIndexFilter::HelpIndexFilter()
: m_fileReader(new HelpFileReader)
{ {
setIncludedByDefault(false); setIncludedByDefault(false);
setShortcutString(QString(QLatin1Char('?'))); setShortcutString(QString(QLatin1Char('?')));
m_icon = QIcon(QLatin1String(":/help/images/bookmark.png"));
connect(&HelpManager::helpEngineCore(), SIGNAL(setupFinished()), this,
SLOT(updateHelpFiles()));
} }
HelpIndexFilter::~HelpIndexFilter() HelpIndexFilter::~HelpIndexFilter()
{ {
delete m_fileReader;
}
void HelpIndexFilter::updateHelpFiles()
{
m_fileReader->updateHelpFiles();
} }
QString HelpIndexFilter::displayName() const QString HelpIndexFilter::displayName() const
@@ -238,15 +69,23 @@ ILocatorFilter::Priority HelpIndexFilter::priority() const
QList<FilterEntry> HelpIndexFilter::matchesFor(const QString &entry) QList<FilterEntry> HelpIndexFilter::matchesFor(const QString &entry)
{ {
QStringList keywords;
if (entry.length() < 2) if (entry.length() < 2)
return m_fileReader->matchesFor(entry, this, 300); keywords = Core::HelpManager::instance()->findKeywords(entry, 300);
return m_fileReader->matchesFor(entry, this); else
keywords = Core::HelpManager::instance()->findKeywords(entry);
QList<FilterEntry> entries;
foreach (const QString &keyword, keywords)
entries.append(FilterEntry(this, keyword, QVariant(), m_icon));
return entries;
} }
void HelpIndexFilter::accept(FilterEntry selection) const void HelpIndexFilter::accept(FilterEntry selection) const
{ {
const QString &key = selection.displayName; const QString &key = selection.displayName;
const QMap<QString, QUrl> &links = m_fileReader->linksForKey(key); const QMap<QString, QUrl> &links = Core::HelpManager::instance()->linksForKeyword(key);
if (links.size() == 1) { if (links.size() == 1) {
emit linkActivated(links.begin().value()); emit linkActivated(links.begin().value());
} else if (!links.isEmpty()) { } else if (!links.isEmpty()) {

View File

@@ -32,6 +32,8 @@
#include <locator/ilocatorfilter.h> #include <locator/ilocatorfilter.h>
#include <QtGui/QIcon>
namespace Help { namespace Help {
namespace Internal { namespace Internal {
@@ -40,7 +42,6 @@ class HelpPlugin;
class HelpIndexFilter : public Locator::ILocatorFilter class HelpIndexFilter : public Locator::ILocatorFilter
{ {
Q_OBJECT Q_OBJECT
class HelpFileReader;
public: public:
HelpIndexFilter(); HelpIndexFilter();
@@ -58,11 +59,8 @@ signals:
void linkActivated(const QUrl &link) const; void linkActivated(const QUrl &link) const;
void linksActivated(const QMap<QString, QUrl> &urls, const QString &keyword) const; void linksActivated(const QMap<QString, QUrl> &urls, const QString &keyword) const;
private slots:
void updateHelpFiles();
private: private:
HelpFileReader *m_fileReader; QIcon m_icon;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -30,38 +30,29 @@
#include "helpmanager.h" #include "helpmanager.h"
#include "bookmarkmanager.h" #include "bookmarkmanager.h"
#include <coreplugin/icore.h> #include <coreplugin/coreconstants.h>
#include <coreplugin/helpmanager.h>
#include <QtCore/QDebug>
#include <QtCore/QDir>
#include <QtCore/QFileInfo>
#include <QtCore/QMutexLocker> #include <QtCore/QMutexLocker>
#include <QtHelp/QHelpEngine> #include <QtHelp/QHelpEngine>
#include <QtHelp/QHelpEngineCore>
using namespace Help; using namespace Help::Internal;
bool HelpManager::m_guiNeedsSetup = true; QMutex LocalHelpManager::m_guiMutex;
bool HelpManager::m_needsCollectionFile = true; QHelpEngine* LocalHelpManager::m_guiEngine = 0;
QMutex HelpManager::m_guiMutex; QMutex LocalHelpManager::m_bkmarkMutex;
QHelpEngine* HelpManager::m_guiEngine = 0; BookmarkManager* LocalHelpManager::m_bookmarkManager = 0;
QMutex HelpManager::m_coreMutex; LocalHelpManager::LocalHelpManager(QObject *parent)
QHelpEngineCore* HelpManager::m_coreEngine = 0;
HelpManager* HelpManager::m_helpManager = 0;
BookmarkManager* HelpManager::m_bookmarkManager = 0;
HelpManager::HelpManager(QObject *parent)
: QObject(parent) : QObject(parent)
, m_guiNeedsSetup(true)
, m_needsCollectionFile(true)
{ {
Q_ASSERT(!m_helpManager);
m_helpManager = this;
} }
HelpManager::~HelpManager() LocalHelpManager::~LocalHelpManager()
{ {
if (m_bookmarkManager) { if (m_bookmarkManager) {
m_bookmarkManager->saveBookmarks(); m_bookmarkManager->saveBookmarks();
@@ -71,88 +62,27 @@ HelpManager::~HelpManager()
delete m_guiEngine; delete m_guiEngine;
m_guiEngine = 0; m_guiEngine = 0;
delete m_coreEngine;
m_coreEngine = 0;
} }
HelpManager& HelpManager::instance() void LocalHelpManager::setupGuiHelpEngine()
{
Q_ASSERT(m_helpManager);
return *m_helpManager;
}
void HelpManager::setupGuiHelpEngine()
{ {
if (m_needsCollectionFile) { if (m_needsCollectionFile) {
m_needsCollectionFile = false; m_needsCollectionFile = false;
(&helpEngine())->setCollectionFile(collectionFilePath()); helpEngine().setCollectionFile(Core::HelpManager::collectionFilePath());
} }
if (m_guiNeedsSetup) { if (m_guiNeedsSetup) {
m_guiNeedsSetup = false; m_guiNeedsSetup = false;
(&helpEngine())->setupData(); helpEngine().setupData();
} }
} }
bool HelpManager::guiEngineNeedsUpdate() const void LocalHelpManager::setEngineNeedsUpdate()
{ {
return m_guiNeedsSetup;
}
void HelpManager::handleHelpRequest(const QString &url)
{
emit helpRequested(QUrl(url));
}
void HelpManager::verifyDocumenation()
{
QStringList nameSpacesToUnregister;
QHelpEngineCore *engine = &helpEngineCore();
const QStringList &registeredDocs = engine->registeredDocumentations();
foreach (const QString &nameSpace, registeredDocs) {
const QString &file = engine->documentationFileName(nameSpace);
if (!QFileInfo(file).exists())
nameSpacesToUnregister.append(nameSpace);
}
if (!nameSpacesToUnregister.isEmpty())
unregisterDocumentation(nameSpacesToUnregister);
}
void HelpManager::registerDocumentation(const QStringList &files)
{
QHelpEngineCore *engine = &helpEngineCore();
foreach (const QString &file, files) {
const QString &nameSpace = engine->namespaceName(file);
if (nameSpace.isEmpty())
continue;
if (!engine->registeredDocumentations().contains(nameSpace)) {
if (engine->registerDocumentation(file)) {
m_guiNeedsSetup = true; m_guiNeedsSetup = true;
} else {
qWarning() << "Error registering namespace '" << nameSpace
<< "' from file '" << file << "':" << engine->error();
}
}
}
} }
void HelpManager::unregisterDocumentation(const QStringList &nameSpaces) QHelpEngine &LocalHelpManager::helpEngine()
{
QHelpEngineCore *engine = &helpEngineCore();
foreach (const QString &nameSpace, nameSpaces) {
const QString &file = engine->documentationFileName(nameSpace);
if (engine->unregisterDocumentation(nameSpace)) {
m_guiNeedsSetup = true;
} else {
qWarning() << "Error unregistering namespace '" << nameSpace
<< "' from file '" << file << "': " << engine->error();
}
}
}
QHelpEngine &HelpManager::helpEngine()
{ {
if (!m_guiEngine) { if (!m_guiEngine) {
QMutexLocker _(&m_guiMutex); QMutexLocker _(&m_guiMutex);
@@ -164,34 +94,18 @@ QHelpEngine &HelpManager::helpEngine()
return *m_guiEngine; return *m_guiEngine;
} }
QString HelpManager::collectionFilePath() BookmarkManager& LocalHelpManager::bookmarkManager()
{
const QFileInfo fi(Core::ICore::instance()->settings()->fileName());
const QDir directory(fi.absolutePath() + QLatin1String("/qtcreator"));
if (!directory.exists())
directory.mkpath(directory.absolutePath());
return QDir::cleanPath(directory.absolutePath() + QLatin1String("/helpcollection.qhc"));
}
QHelpEngineCore& HelpManager::helpEngineCore()
{
if (!m_coreEngine) {
QMutexLocker _(&m_coreMutex);
if (!m_coreEngine) {
m_coreEngine = new QHelpEngineCore(collectionFilePath());
m_coreEngine->setAutoSaveFilter(false);
m_coreEngine->setCurrentFilter(tr("Unfiltered"));
m_coreEngine->setupData();
}
}
return *m_coreEngine;
}
BookmarkManager& HelpManager::bookmarkManager()
{ {
if (!m_bookmarkManager) {
QMutexLocker _(&m_bkmarkMutex);
if (!m_bookmarkManager) { if (!m_bookmarkManager) {
m_bookmarkManager = new BookmarkManager; m_bookmarkManager = new BookmarkManager;
m_bookmarkManager->setupBookmarkModels(); m_bookmarkManager->setupBookmarkModels();
const QString &url = QString::fromLatin1("qthelp://com.nokia.qtcreator."
"%1%2%3/doc/index.html").arg(IDE_VERSION_MAJOR).arg(IDE_VERSION_MINOR)
.arg(IDE_VERSION_RELEASE);
helpEngine().setCustomValue(QLatin1String("DefaultHomePage"), url);
}
} }
return *m_bookmarkManager; return *m_bookmarkManager;
} }

View File

@@ -27,66 +27,44 @@
** **
**************************************************************************/ **************************************************************************/
#ifndef HELPMANAGER_H #ifndef LOCALHELPMANAGER_H
#define HELPMANAGER_H #define LOCALHELPMANAGER_H
#include "help_global.h"
#include <QtCore/QMutex> #include <QtCore/QMutex>
#include <QtCore/QObject> #include <QtCore/QObject>
QT_FORWARD_DECLARE_CLASS(QHelpEngine) QT_FORWARD_DECLARE_CLASS(QHelpEngine)
QT_FORWARD_DECLARE_CLASS(QHelpEngineCore)
QT_FORWARD_DECLARE_CLASS(QString)
QT_FORWARD_DECLARE_CLASS(QStringList)
QT_FORWARD_DECLARE_CLASS(QUrl)
class BookmarkManager; class BookmarkManager;
namespace Help { namespace Help {
namespace Internal {
class HELP_EXPORT HelpManager : public QObject class LocalHelpManager : public QObject
{ {
Q_OBJECT Q_OBJECT
public:
HelpManager(QObject *parent = 0);
~HelpManager();
static HelpManager& instance(); public:
LocalHelpManager(QObject *parent = 0);
~LocalHelpManager();
void setupGuiHelpEngine(); void setupGuiHelpEngine();
bool guiEngineNeedsUpdate() const; void setEngineNeedsUpdate();
void verifyDocumenation();
void registerDocumentation(const QStringList &fileNames);
void unregisterDocumentation(const QStringList &nameSpaces);
static QHelpEngine& helpEngine(); static QHelpEngine& helpEngine();
static QString collectionFilePath();
static QHelpEngineCore& helpEngineCore();
static BookmarkManager& bookmarkManager(); static BookmarkManager& bookmarkManager();
public slots:
void handleHelpRequest(const QString &url);
signals:
void helpRequested(const QUrl &url);
private: private:
static bool m_guiNeedsSetup; bool m_guiNeedsSetup;
static bool m_needsCollectionFile; bool m_needsCollectionFile;
static QMutex m_guiMutex; static QMutex m_guiMutex;
static QHelpEngine *m_guiEngine; static QHelpEngine *m_guiEngine;
static QMutex m_coreMutex; static QMutex m_bkmarkMutex;
static QHelpEngineCore *m_coreEngine;
static HelpManager *m_helpManager;
static BookmarkManager *m_bookmarkManager; static BookmarkManager *m_bookmarkManager;
}; };
} // Internal
} // Help } // Help
#endif // HELPMANAGER_H #endif // LOCALHELPMANAGER_H

View File

@@ -54,6 +54,7 @@
#include <coreplugin/editormanager/ieditor.h> #include <coreplugin/editormanager/ieditor.h>
#include <coreplugin/findplaceholder.h> #include <coreplugin/findplaceholder.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/helpmanager.h>
#include <coreplugin/minisplitter.h> #include <coreplugin/minisplitter.h>
#include <coreplugin/modemanager.h> #include <coreplugin/modemanager.h>
#include <coreplugin/rightpane.h> #include <coreplugin/rightpane.h>
@@ -78,10 +79,8 @@
#include <QtGui/QToolBar> #include <QtGui/QToolBar>
#include <QtHelp/QHelpEngine> #include <QtHelp/QHelpEngine>
#include <QtHelp/QHelpEngineCore>
using namespace Core::Constants; using namespace Core::Constants;
using namespace Help;
using namespace Help::Internal; using namespace Help::Internal;
const char * const SB_INDEX = "Index"; const char * const SB_INDEX = "Index";
@@ -140,22 +139,20 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
qApp->installTranslator(qhelptr); qApp->installTranslator(qhelptr);
} }
addAutoReleasedObject(m_helpManager = new HelpManager(this)); addAutoReleasedObject(m_helpManager = new LocalHelpManager(this));
addAutoReleasedObject(m_openPagesManager = new OpenPagesManager(this)); addAutoReleasedObject(m_openPagesManager = new OpenPagesManager(this));
addAutoReleasedObject(m_docSettingsPage = new DocSettingsPage()); addAutoReleasedObject(m_docSettingsPage = new DocSettingsPage());
addAutoReleasedObject(m_filterSettingsPage = new FilterSettingsPage()); addAutoReleasedObject(m_filterSettingsPage = new FilterSettingsPage());
addAutoReleasedObject(m_generalSettingsPage = new GeneralSettingsPage()); addAutoReleasedObject(m_generalSettingsPage = new GeneralSettingsPage());
connect(m_docSettingsPage, SIGNAL(documentationChanged()), m_filterSettingsPage,
SLOT(updateFilterPage()));
connect(m_generalSettingsPage, SIGNAL(fontChanged()), this, connect(m_generalSettingsPage, SIGNAL(fontChanged()), this,
SLOT(fontChanged())); SLOT(fontChanged()));
connect(m_helpManager, SIGNAL(helpRequested(QUrl)), this, connect(Core::HelpManager::instance(), SIGNAL(helpRequested(QUrl)), this,
SLOT(handleHelpRequest(QUrl))); SLOT(handleHelpRequest(QUrl)));
m_filterSettingsPage->setHelpManager(m_helpManager);
connect(m_filterSettingsPage, SIGNAL(filtersChanged()), this, connect(m_filterSettingsPage, SIGNAL(filtersChanged()), this,
SLOT(setupHelpEngineIfNeeded())); SLOT(setupHelpEngineIfNeeded()));
connect(m_docSettingsPage, SIGNAL(documentationChanged()), this, connect(Core::HelpManager::instance(), SIGNAL(documentationChanged()), this,
SLOT(setupHelpEngineIfNeeded())); SLOT(setupHelpEngineIfNeeded()));
m_splitter = new Core::MiniSplitter; m_splitter = new Core::MiniSplitter;
@@ -313,30 +310,20 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
void HelpPlugin::extensionsInitialized() void HelpPlugin::extensionsInitialized()
{ {
const QString &filterInternal = QString::fromLatin1("Qt Creator %1.%2.%3") const QString &nsInternal = QString::fromLatin1("com.nokia.qtcreator.%1%2%3")
.arg(IDE_VERSION_MAJOR).arg(IDE_VERSION_MINOR).arg(IDE_VERSION_RELEASE);
const QRegExp filterRegExp(QLatin1String("Qt Creator \\d*\\.\\d*\\.\\d*"));
QHelpEngineCore *engine = &m_helpManager->helpEngineCore();
const QStringList &filters = engine->customFilters();
foreach (const QString &filter, filters) {
if (filterRegExp.exactMatch(filter) && filter != filterInternal)
engine->removeCustomFilter(filter);
}
const QString &docInternal = QString::fromLatin1("com.nokia.qtcreator.%1%2%3")
.arg(IDE_VERSION_MAJOR).arg(IDE_VERSION_MINOR).arg(IDE_VERSION_RELEASE); .arg(IDE_VERSION_MAJOR).arg(IDE_VERSION_MINOR).arg(IDE_VERSION_RELEASE);
foreach (const QString &ns, engine->registeredDocumentations()) { Core::HelpManager *helpManager = Core::HelpManager::instance();
foreach (const QString &ns, helpManager->registeredNamespaces()) {
if (ns.startsWith(QLatin1String("com.nokia.qtcreator.")) if (ns.startsWith(QLatin1String("com.nokia.qtcreator."))
&& ns != docInternal) && ns != nsInternal)
m_helpManager->unregisterDocumentation(QStringList() << ns); helpManager->unregisterDocumentation(QStringList() << ns);
} }
QStringList filesToRegister; QStringList filesToRegister;
// Explicitly register qml.qch if located in creator directory. This is only // 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 // needed for the creator-qml package, were we want to ship the documentation
// without a qt development version. // without a qt development version. TODO: is this still really needed, remove
const QString &appPath = QCoreApplication::applicationDirPath(); const QString &appPath = QCoreApplication::applicationDirPath();
filesToRegister.append(QDir::cleanPath(QDir::cleanPath(appPath filesToRegister.append(QDir::cleanPath(QDir::cleanPath(appPath
+ QLatin1String(DOCPATH "qml.qch")))); + QLatin1String(DOCPATH "qml.qch"))));
@@ -344,24 +331,6 @@ void HelpPlugin::extensionsInitialized()
// we might need to register creators inbuild help // we might need to register creators inbuild help
filesToRegister.append(QDir::cleanPath(appPath filesToRegister.append(QDir::cleanPath(appPath
+ QLatin1String(DOCPATH "qtcreator.qch"))); + QLatin1String(DOCPATH "qtcreator.qch")));
// this comes from the installer
const QLatin1String key("AddedDocs");
const QString &addedDocs = engine->customValue(key).toString();
if (!addedDocs.isEmpty()) {
engine->removeCustomValue(key);
filesToRegister += addedDocs.split(QLatin1Char(';'));
}
updateFilterComboBox();
m_helpManager->verifyDocumenation();
m_helpManager->registerDocumentation(filesToRegister);
const QString &url = QString::fromLatin1("qthelp://com.nokia.qtcreator."
"%1%2%3/doc/index.html").arg(IDE_VERSION_MAJOR).arg(IDE_VERSION_MINOR)
.arg(IDE_VERSION_RELEASE);
engine->setCustomValue(QLatin1String("DefaultHomePage"), url);
connect(engine, SIGNAL(setupFinished()), this, SLOT(updateFilterComboBox()));
} }
void HelpPlugin::aboutToShutdown() void HelpPlugin::aboutToShutdown()
@@ -424,7 +393,7 @@ void HelpPlugin::setupUi()
// connect(shortcut, SIGNAL(activated()), this, SLOT(activateSearch())); // connect(shortcut, SIGNAL(activated()), this, SLOT(activateSearch()));
// shortcutMap.insert("Search", cmd); // shortcutMap.insert("Search", cmd);
BookmarkManager *manager = &HelpManager::bookmarkManager(); BookmarkManager *manager = &LocalHelpManager::bookmarkManager();
BookmarkWidget *bookmarkWidget = new BookmarkWidget(manager, 0, false); BookmarkWidget *bookmarkWidget = new BookmarkWidget(manager, 0, false);
bookmarkWidget->setWindowTitle(tr("Bookmarks")); bookmarkWidget->setWindowTitle(tr("Bookmarks"));
m_bookmarkItem = new Core::SideBarItem(bookmarkWidget, QLatin1String(SB_BOOKMARKS)); m_bookmarkItem = new Core::SideBarItem(bookmarkWidget, QLatin1String(SB_BOOKMARKS));
@@ -469,24 +438,36 @@ void HelpPlugin::setupUi()
void HelpPlugin::resetFilter() void HelpPlugin::resetFilter()
{ {
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(QLatin1String("Qt Creator \\d*\\.\\d*\\.\\d*"));
QHelpEngineCore *engine = &LocalHelpManager::helpEngine();
const QStringList &filters = engine->customFilters();
foreach (const QString &filter, filters) {
if (filterRegExp.exactMatch(filter) && filter != filterInternal)
engine->removeCustomFilter(filter);
}
const QLatin1String weAddedFilterKey("UnfilteredFilterInserted"); const QLatin1String weAddedFilterKey("UnfilteredFilterInserted");
const QLatin1String previousFilterNameKey("UnfilteredFilterName"); const QLatin1String previousFilterNameKey("UnfilteredFilterName");
if (engine->customValue(weAddedFilterKey).toInt() == 1) {
QHelpEngineCore *core = &m_helpManager->helpEngineCore();
if (core->customValue(weAddedFilterKey).toInt() == 1) {
// we added a filter at some point, remove previously added filter // we added a filter at some point, remove previously added filter
const QString &filter = core->customValue(previousFilterNameKey).toString(); const QString &filter = engine->customValue(previousFilterNameKey).toString();
if (!filter.isEmpty()) if (!filter.isEmpty())
core->removeCustomFilter(filter); engine->removeCustomFilter(filter);
} }
// potentially remove a filter with new name // potentially remove a filter with new name
const QString filterName = tr("Unfiltered"); const QString filterName = tr("Unfiltered");
core->removeCustomFilter(filterName); engine->removeCustomFilter(filterName);
core->addCustomFilter(filterName, QStringList()); engine->addCustomFilter(filterName, QStringList());
core->setCustomValue(weAddedFilterKey, 1); engine->setCustomValue(weAddedFilterKey, 1);
core->setCustomValue(previousFilterNameKey, filterName); engine->setCustomValue(previousFilterNameKey, filterName);
(&m_helpManager->helpEngine())->setCurrentFilter(filterName); engine->setCurrentFilter(filterName);
updateFilterComboBox();
connect(engine, SIGNAL(setupFinished()), this, SLOT(updateFilterComboBox()));
} }
void HelpPlugin::createRightPaneContextViewer() void HelpPlugin::createRightPaneContextViewer()
@@ -594,9 +575,9 @@ void HelpPlugin::modeChanged(Core::IMode *mode)
qApp->processEvents(); qApp->processEvents();
qApp->setOverrideCursor(Qt::WaitCursor); qApp->setOverrideCursor(Qt::WaitCursor);
m_helpManager->setupGuiHelpEngine();
setupUi(); setupUi();
resetFilter(); resetFilter();
m_helpManager->setupGuiHelpEngine();
OpenPagesManager::instance().setupInitialPages(); OpenPagesManager::instance().setupInitialPages();
qApp->restoreOverrideCursor(); qApp->restoreOverrideCursor();
@@ -632,7 +613,7 @@ void HelpPlugin::fontChanged()
if (!m_helpViewerForSideBar) if (!m_helpViewerForSideBar)
createRightPaneContextViewer(); createRightPaneContextViewer();
const QHelpEngineCore &engine = m_helpManager->helpEngineCore(); const QHelpEngine &engine = LocalHelpManager::helpEngine();
QFont font = qVariantValue<QFont>(engine.customValue(QLatin1String("font"), QFont font = qVariantValue<QFont>(engine.customValue(QLatin1String("font"),
m_helpViewerForSideBar->viewerFont())); m_helpViewerForSideBar->viewerFont()));
@@ -646,7 +627,8 @@ void HelpPlugin::fontChanged()
void HelpPlugin::setupHelpEngineIfNeeded() void HelpPlugin::setupHelpEngineIfNeeded()
{ {
if (Core::ICore::instance()->modeManager()->currentMode() == m_mode) m_helpManager->setEngineNeedsUpdate();
if (Core::ModeManager::instance()->currentMode() == m_mode)
m_helpManager->setupGuiHelpEngine(); m_helpManager->setupGuiHelpEngine();
} }
@@ -655,7 +637,7 @@ HelpViewer* HelpPlugin::viewerForContextMode()
using namespace Core; using namespace Core;
bool showSideBySide = false; bool showSideBySide = false;
const QHelpEngineCore &engine = m_helpManager->helpEngineCore(); const QHelpEngineCore &engine = LocalHelpManager::helpEngine();
RightPanePlaceHolder *placeHolder = RightPanePlaceHolder::current(); RightPanePlaceHolder *placeHolder = RightPanePlaceHolder::current();
switch (engine.customValue(QLatin1String("ContextHelpOption"), 0).toInt()) { switch (engine.customValue(QLatin1String("ContextHelpOption"), 0).toInt()) {
case 0: { case 0: {
@@ -712,7 +694,7 @@ void HelpPlugin::activateContext()
// Find out what to show // Find out what to show
if (IContext *context = m_core->currentContextObject()) { if (IContext *context = m_core->currentContextObject()) {
id = context->contextHelpId(); id = context->contextHelpId();
links = m_helpManager->helpEngineCore().linksForIdentifier(id); links = Core::HelpManager::instance()->linksForIdentifier(id);
} }
if (HelpViewer* viewer = viewerForContextMode()) { if (HelpViewer* viewer = viewerForContextMode()) {
@@ -802,7 +784,7 @@ QToolBar *HelpPlugin::createToolBar()
void HelpPlugin::updateFilterComboBox() void HelpPlugin::updateFilterComboBox()
{ {
const QHelpEngine &engine = m_helpManager->helpEngine(); const QHelpEngine &engine = LocalHelpManager::helpEngine();
QString curFilter = m_filterComboBox->currentText(); QString curFilter = m_filterComboBox->currentText();
if (curFilter.isEmpty()) if (curFilter.isEmpty())
curFilter = engine.currentFilter(); curFilter = engine.currentFilter();
@@ -816,7 +798,7 @@ void HelpPlugin::updateFilterComboBox()
void HelpPlugin::filterDocumentation(const QString &customFilter) void HelpPlugin::filterDocumentation(const QString &customFilter)
{ {
(&m_helpManager->helpEngine())->setCurrentFilter(customFilter); LocalHelpManager::helpEngine().setCurrentFilter(customFilter);
} }
void HelpPlugin::addBookmark() void HelpPlugin::addBookmark()
@@ -827,7 +809,7 @@ void HelpPlugin::addBookmark()
if (url.isEmpty() || url == Help::Constants::AboutBlank) if (url.isEmpty() || url == Help::Constants::AboutBlank)
return; return;
BookmarkManager *manager = &HelpManager::bookmarkManager(); BookmarkManager *manager = &LocalHelpManager::bookmarkManager();
manager->showBookmarkDialog(m_centralWidget, viewer->title(), url); manager->showBookmarkDialog(m_centralWidget, viewer->title(), url);
} }
@@ -836,7 +818,7 @@ void HelpPlugin::handleHelpRequest(const QUrl &url)
if (HelpViewer::launchWithExternalApp(url)) if (HelpViewer::launchWithExternalApp(url))
return; return;
if (m_helpManager->helpEngineCore().findFile(url).isValid()) { if (Core::HelpManager::instance()->findFile(url).isValid()) {
if (url.queryItemValue(QLatin1String("view")) == QLatin1String("split")) { if (url.queryItemValue(QLatin1String("view")) == QLatin1String("split")) {
if (HelpViewer* viewer = viewerForContextMode()) if (HelpViewer* viewer = viewerForContextMode())
viewer->setSource(url); viewer->setSource(url);

View File

@@ -49,8 +49,6 @@ class SideBarItem;
} // Core } // Core
namespace Help { namespace Help {
class HelpManager;
namespace Internal { namespace Internal {
class CentralWidget; class CentralWidget;
class DocSettingsPage; class DocSettingsPage;
@@ -58,6 +56,7 @@ class FilterSettingsPage;
class GeneralSettingsPage; class GeneralSettingsPage;
class HelpMode; class HelpMode;
class HelpViewer; class HelpViewer;
class LocalHelpManager;
class OpenPagesManager; class OpenPagesManager;
class SearchWidget; class SearchWidget;
@@ -129,7 +128,7 @@ private:
Core::SideBar *m_sideBar; Core::SideBar *m_sideBar;
bool m_firstModeChange; bool m_firstModeChange;
HelpManager *m_helpManager; LocalHelpManager *m_helpManager;
OpenPagesManager *m_openPagesManager; OpenPagesManager *m_openPagesManager;
Core::MiniSplitter *m_splitter; Core::MiniSplitter *m_splitter;

View File

@@ -40,7 +40,7 @@
#include <QtGui/QDesktopServices> #include <QtGui/QDesktopServices>
#include <QtGui/QMouseEvent> #include <QtGui/QMouseEvent>
#include <QtHelp/QHelpEngineCore> #include <QtHelp/QHelpEngine>
using namespace Help::Internal; using namespace Help::Internal;
@@ -126,7 +126,7 @@ QString HelpViewer::mimeFromUrl(const QUrl &url)
bool HelpViewer::launchWithExternalApp(const QUrl &url) bool HelpViewer::launchWithExternalApp(const QUrl &url)
{ {
if (isLocalUrl(url)) { if (isLocalUrl(url)) {
const QHelpEngineCore &helpEngine = Help::HelpManager::helpEngineCore(); const QHelpEngineCore &helpEngine = LocalHelpManager::helpEngine();
const QUrl &resolvedUrl = helpEngine.findFile(url); const QUrl &resolvedUrl = helpEngine.findFile(url);
if (!resolvedUrl.isValid()) if (!resolvedUrl.isValid())
return false; return false;
@@ -155,7 +155,7 @@ bool HelpViewer::launchWithExternalApp(const QUrl &url)
void HelpViewer::home() void HelpViewer::home()
{ {
const QHelpEngineCore &engine = Help::HelpManager::helpEngineCore(); const QHelpEngineCore &engine = LocalHelpManager::helpEngine();
QString homepage = engine.customValue(QLatin1String("HomePage"), QString homepage = engine.customValue(QLatin1String("HomePage"),
QLatin1String("")).toString(); QLatin1String("")).toString();

View File

@@ -44,7 +44,7 @@
#include <QtGui/QApplication> #include <QtGui/QApplication>
#include <QtGui/QWheelEvent> #include <QtGui/QWheelEvent>
#include <QtHelp/QHelpEngineCore> #include <QtHelp/QHelpEngine>
#include <QtNetwork/QNetworkAccessManager> #include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply> #include <QtNetwork/QNetworkReply>
@@ -125,7 +125,7 @@ QNetworkReply *HelpNetworkAccessManager::createRequest(Operation /*op*/,
const QNetworkRequest &request, QIODevice* /*outgoingData*/) const QNetworkRequest &request, QIODevice* /*outgoingData*/)
{ {
QString url = request.url().toString(); QString url = request.url().toString();
const QHelpEngineCore &engine = HelpManager::helpEngineCore(); const QHelpEngineCore &engine = LocalHelpManager::helpEngine();
// TODO: For some reason the url to load is already wrong (passed from webkit) // TODO: For some reason the url to load is already wrong (passed from webkit)
// though the css file and the references inside should work that way. One // though the css file and the references inside should work that way. One
// possible problem might be that the css is loaded at the same level as the // possible problem might be that the css is loaded at the same level as the
@@ -265,7 +265,7 @@ QFont HelpViewer::viewerFont() const
QWebSettings* webSettings = QWebSettings::globalSettings(); QWebSettings* webSettings = QWebSettings::globalSettings();
QFont font(QApplication::font().family(), QFont font(QApplication::font().family(),
webSettings->fontSize(QWebSettings::DefaultFontSize)); webSettings->fontSize(QWebSettings::DefaultFontSize));
const QHelpEngineCore &engine = HelpManager::helpEngineCore(); const QHelpEngineCore &engine = LocalHelpManager::helpEngine();
return qVariantValue<QFont>(engine.customValue(QLatin1String("font"), return qVariantValue<QFont>(engine.customValue(QLatin1String("font"),
font)); font));
} }

View File

@@ -41,7 +41,7 @@
#include <QtGui/QComboBox> #include <QtGui/QComboBox>
#include <QtGui/QTreeView> #include <QtGui/QTreeView>
#include <QtHelp/QHelpEngineCore> #include <QtHelp/QHelpEngine>
using namespace Help::Internal; using namespace Help::Internal;
@@ -118,7 +118,7 @@ QStringList splitString(const QVariant &value)
void OpenPagesManager::setupInitialPages() void OpenPagesManager::setupInitialPages()
{ {
const QHelpEngineCore &engine = HelpManager::helpEngineCore(); const QHelpEngineCore &engine = LocalHelpManager::helpEngine();
const int option = engine.customValue(QLatin1String("StartOption"), const int option = engine.customValue(QLatin1String("StartOption"),
Help::Constants::ShowLastPages).toInt(); Help::Constants::ShowLastPages).toInt();
QString homePage = engine.customValue(QLatin1String("DefaultHomePage"), QString homePage = engine.customValue(QLatin1String("DefaultHomePage"),

View File

@@ -100,7 +100,7 @@ void SearchWidget::showEvent(QShowEvent *event)
QVBoxLayout *vLayout = new QVBoxLayout(this); QVBoxLayout *vLayout = new QVBoxLayout(this);
vLayout->setMargin(4); vLayout->setMargin(4);
searchEngine = (&HelpManager::helpEngine())->searchEngine(); searchEngine = (&LocalHelpManager::helpEngine())->searchEngine();
resultWidget = searchEngine->resultWidget(); resultWidget = searchEngine->resultWidget();
QHelpSearchQueryWidget *queryWidget = searchEngine->queryWidget(); QHelpSearchQueryWidget *queryWidget = searchEngine->queryWidget();
@@ -126,7 +126,7 @@ void SearchWidget::showEvent(QShowEvent *event)
connect(searchEngine, SIGNAL(indexingFinished()), this, connect(searchEngine, SIGNAL(indexingFinished()), this,
SLOT(indexingFinished())); SLOT(indexingFinished()));
QMetaObject::invokeMethod(&HelpManager::helpEngine(), "setupFinished", QMetaObject::invokeMethod(&LocalHelpManager::helpEngine(), "setupFinished",
Qt::QueuedConnection); Qt::QueuedConnection);
} }
} }

View File

@@ -114,7 +114,6 @@ plugin_qt4projectmanager.depends = plugin_texteditor
plugin_qt4projectmanager.depends += plugin_projectexplorer plugin_qt4projectmanager.depends += plugin_projectexplorer
plugin_qt4projectmanager.depends += plugin_cpptools plugin_qt4projectmanager.depends += plugin_cpptools
plugin_qt4projectmanager.depends += plugin_cppeditor plugin_qt4projectmanager.depends += plugin_cppeditor
plugin_qt4projectmanager.depends += plugin_help
plugin_qt4projectmanager.depends += plugin_designer plugin_qt4projectmanager.depends += plugin_designer
plugin_qt4projectmanager.depends += plugin_debugger plugin_qt4projectmanager.depends += plugin_debugger

View File

@@ -3,7 +3,6 @@ TARGET = QmlJSEditor
include(../../qtcreatorplugin.pri) include(../../qtcreatorplugin.pri)
include(qmljseditor_dependencies.pri) include(qmljseditor_dependencies.pri)
CONFIG += help
DEFINES += \ DEFINES += \
QMLJSEDITOR_LIBRARY \ QMLJSEDITOR_LIBRARY \
QT_CREATOR QT_CREATOR

View File

@@ -32,6 +32,7 @@
#include "qmljshoverhandler.h" #include "qmljshoverhandler.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/helpmanager.h>
#include <coreplugin/uniqueidmanager.h> #include <coreplugin/uniqueidmanager.h>
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <debugger/debuggerconstants.h> #include <debugger/debuggerconstants.h>
@@ -52,7 +53,6 @@
#include <QtGui/QToolTip> #include <QtGui/QToolTip>
#include <QtGui/QTextCursor> #include <QtGui/QTextCursor>
#include <QtGui/QTextBlock> #include <QtGui/QTextBlock>
#include <QtHelp/QHelpEngineCore>
using namespace Core; using namespace Core;
using namespace QmlJS; using namespace QmlJS;
@@ -61,27 +61,11 @@ using namespace QmlJSEditor::Internal;
HoverHandler::HoverHandler(QObject *parent) HoverHandler::HoverHandler(QObject *parent)
: QObject(parent) : QObject(parent)
, m_helpEngineNeedsSetup(false)
{ {
m_modelManager = ExtensionSystem::PluginManager::instance()->getObject<ModelManagerInterface>(); m_modelManager = ExtensionSystem::PluginManager::instance()->getObject<ModelManagerInterface>();
ICore *core = ICore::instance();
QFileInfo fi(core->settings()->fileName());
// FIXME shouldn't the help engine create the directory if it doesn't exist?
QDir directory(fi.absolutePath()+"/qtcreator");
if (!directory.exists())
directory.mkpath(directory.absolutePath());
m_helpEngine = new QHelpEngineCore(directory.absolutePath()
+ QLatin1String("/helpcollection.qhc"), this);
if (!m_helpEngine->setupData())
qWarning() << "Could not initialize help engine:" << m_helpEngine->error();
m_helpEngine->setAutoSaveFilter(false);
m_helpEngine->setCurrentFilter(tr("Unfiltered"));
m_helpEngineNeedsSetup = m_helpEngine->registeredDocumentations().count() == 0;
// Listen for editor opened events in order to connect to tooltip/helpid requests // Listen for editor opened events in order to connect to tooltip/helpid requests
connect(core->editorManager(), SIGNAL(editorOpened(Core::IEditor *)), connect(ICore::instance()->editorManager(), SIGNAL(editorOpened(Core::IEditor *)),
this, SLOT(editorOpened(Core::IEditor *))); this, SLOT(editorOpened(Core::IEditor *)));
} }
@@ -151,11 +135,6 @@ void HoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, int p
const Snapshot snapshot = semanticInfo.snapshot; const Snapshot snapshot = semanticInfo.snapshot;
const Document::Ptr qmlDocument = semanticInfo.document; const Document::Ptr qmlDocument = semanticInfo.document;
if (m_helpEngineNeedsSetup && m_helpEngine->registeredDocumentations().count() > 0) {
m_helpEngine->setupData();
m_helpEngineNeedsSetup = false;
}
// We only want to show F1 if the tooltip matches the help id // We only want to show F1 if the tooltip matches the help id
bool showF1 = true; bool showF1 = true;
@@ -188,7 +167,7 @@ void HoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, int p
QString helpId = QLatin1String("QML."); QString helpId = QLatin1String("QML.");
helpId += baseClass; helpId += baseClass;
if (! m_helpEngine->linksForIdentifier(helpId).isEmpty()) { if (!Core::HelpManager::instance()->linksForIdentifier(helpId).isEmpty()) {
m_helpId = helpId; m_helpId = helpId;
break; break;
} }

View File

@@ -35,7 +35,6 @@
#include <QtCore/QObject> #include <QtCore/QObject>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QHelpEngineCore;
class QPoint; class QPoint;
class QStringList; class QStringList;
QT_END_NAMESPACE QT_END_NAMESPACE
@@ -80,10 +79,8 @@ private:
private: private:
ModelManagerInterface *m_modelManager; ModelManagerInterface *m_modelManager;
QHelpEngineCore *m_helpEngine;
QString m_helpId; QString m_helpId;
QString m_toolTip; QString m_toolTip;
bool m_helpEngineNeedsSetup;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -18,7 +18,6 @@ Alternatively, this plugin may be used under the terms of the GNU Lesser General
<dependency name="ProjectExplorer" version="1.3.86"/> <dependency name="ProjectExplorer" version="1.3.86"/>
<dependency name="CppTools" version="1.3.86"/> <dependency name="CppTools" version="1.3.86"/>
<dependency name="CppEditor" version="1.3.86"/> <dependency name="CppEditor" version="1.3.86"/>
<dependency name="Help" version="1.3.86"/>
<dependency name="Designer" version="1.3.86"/> <dependency name="Designer" version="1.3.86"/>
<dependency name="Debugger" version="1.3.86"/> <dependency name="Debugger" version="1.3.86"/>
</dependencyList> </dependencyList>

View File

@@ -31,6 +31,7 @@
#include "ui_gettingstartedwelcomepagewidget.h" #include "ui_gettingstartedwelcomepagewidget.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/helpmanager.h>
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <coreplugin/mainwindow.h> #include <coreplugin/mainwindow.h>
@@ -38,8 +39,6 @@
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <help/helpmanager.h>
#include <QtCore/QDateTime> #include <QtCore/QDateTime>
#include <QtCore/QDir> #include <QtCore/QDir>
#include <QtCore/QFileInfo> #include <QtCore/QFileInfo>
@@ -338,15 +337,13 @@ void GettingStartedWelcomePageWidget::slotOpenExample()
void GettingStartedWelcomePageWidget::slotOpenHelpPage(const QString& url) void GettingStartedWelcomePageWidget::slotOpenHelpPage(const QString& url)
{ {
Help::HelpManager *helpManager Core::HelpManager *helpManager = Core::HelpManager::instance();
= ExtensionSystem::PluginManager::instance()->getObject<Help::HelpManager>();
Q_ASSERT(helpManager); Q_ASSERT(helpManager);
helpManager->handleHelpRequest(url); helpManager->handleHelpRequest(url);
} }
void GettingStartedWelcomePageWidget::slotOpenContextHelpPage(const QString& url) void GettingStartedWelcomePageWidget::slotOpenContextHelpPage(const QString& url)
{ {
Help::HelpManager *helpManager Core::HelpManager *helpManager = Core::HelpManager::instance();
= ExtensionSystem::PluginManager::instance()->getObject<Help::HelpManager>();
Q_ASSERT(helpManager); Q_ASSERT(helpManager);
helpManager->handleHelpRequest(url % QLatin1String("?view=split")); helpManager->handleHelpRequest(url % QLatin1String("?view=split"));
} }

View File

@@ -1,7 +1,6 @@
include(../../plugins/projectexplorer/projectexplorer.pri) include(../../plugins/projectexplorer/projectexplorer.pri)
include(../../plugins/cpptools/cpptools.pri) include(../../plugins/cpptools/cpptools.pri)
include(../../plugins/cppeditor/cppeditor.pri) include(../../plugins/cppeditor/cppeditor.pri)
include(../../plugins/help/help.pri)
include(../../plugins/designer/designer.pri) include(../../plugins/designer/designer.pri)
include(../../plugins/debugger/debugger.pri) include(../../plugins/debugger/debugger.pri)
include(../../libs/symbianutils/symbianutils.pri) include(../../libs/symbianutils/symbianutils.pri)

View File

@@ -43,6 +43,7 @@
#include <projectexplorer/cesdkhandler.h> #include <projectexplorer/cesdkhandler.h>
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/helpmanager.h>
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <help/helpmanager.h> #include <help/helpmanager.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -211,8 +212,7 @@ QSet<QString> QtVersionManager::supportedTargetIds() const
void QtVersionManager::updateDocumentation() void QtVersionManager::updateDocumentation()
{ {
Help::HelpManager *helpManager Core::HelpManager *helpManager = Core::HelpManager::instance();
= ExtensionSystem::PluginManager::instance()->getObject<Help::HelpManager>();
Q_ASSERT(helpManager); Q_ASSERT(helpManager);
QStringList files; QStringList files;
foreach (QtVersion *version, m_versions) { foreach (QtVersion *version, m_versions) {

View File

@@ -50,10 +50,11 @@
#include <QtGui/QToolButton> #include <QtGui/QToolButton>
#include <QtGui/QPushButton> #include <QtGui/QPushButton>
#include <QtGui/QApplication> #include <QtGui/QApplication>
#include <QtHelp/QHelpEngineCore>
#include <QtGui/QDialogButtonBox> #include <QtGui/QDialogButtonBox>
#include <QtGui/QSortFilterProxyModel> #include <QtGui/QSortFilterProxyModel>
#include <QtHelp/QHelpEngine>
using namespace Help::Internal; using namespace Help::Internal;
BookmarkDialog::BookmarkDialog(BookmarkManager *manager, const QString &title, BookmarkDialog::BookmarkDialog(BookmarkManager *manager, const QString &title,
@@ -646,7 +647,7 @@ void BookmarkManager::saveBookmarks()
QDataStream stream(&bookmarks, QIODevice::WriteOnly); QDataStream stream(&bookmarks, QIODevice::WriteOnly);
readBookmarksRecursive(treeModel->invisibleRootItem(), stream, 0); readBookmarksRecursive(treeModel->invisibleRootItem(), stream, 0);
(&Help::HelpManager::helpEngineCore())->setCustomValue(QLatin1String("Bookmarks"), (&LocalHelpManager::helpEngine())->setCustomValue(QLatin1String("Bookmarks"),
bookmarks); bookmarks);
} }
@@ -765,7 +766,7 @@ void BookmarkManager::setupBookmarkModels()
QList<int> lastDepths; QList<int> lastDepths;
QList<QStandardItem*> parents; QList<QStandardItem*> parents;
QByteArray ba = Help::HelpManager::helpEngineCore() QByteArray ba = LocalHelpManager::helpEngine()
.customValue(QLatin1String("Bookmarks")).toByteArray(); .customValue(QLatin1String("Bookmarks")).toByteArray();
QDataStream stream(ba); QDataStream stream(ba);
while (!stream.atEnd()) { while (!stream.atEnd()) {

View File

@@ -45,7 +45,7 @@ ContentWindow::ContentWindow()
: m_contentWidget(0) : m_contentWidget(0)
, m_expandDepth(-2) , m_expandDepth(-2)
{ {
m_contentWidget = (&Help::HelpManager::helpEngine())->contentWidget(); m_contentWidget = (&LocalHelpManager::helpEngine())->contentWidget();
m_contentWidget->installEventFilter(this); m_contentWidget->installEventFilter(this);
m_contentWidget->viewport()->installEventFilter(this); m_contentWidget->viewport()->installEventFilter(this);
m_contentWidget->setContextMenuPolicy(Qt::CustomContextMenu); m_contentWidget->setContextMenuPolicy(Qt::CustomContextMenu);

View File

@@ -80,7 +80,7 @@ IndexWindow::IndexWindow()
toolbar->setLayout(tbLayout); toolbar->setLayout(tbLayout);
layout->addWidget(toolbar); layout->addWidget(toolbar);
QHelpEngine *engine = &Help::HelpManager::helpEngine(); QHelpEngine *engine = &LocalHelpManager::helpEngine();
m_indexWidget = engine->indexWidget(); m_indexWidget = engine->indexWidget();
m_indexWidget->installEventFilter(this); m_indexWidget->installEventFilter(this);
connect(engine->indexModel(), SIGNAL(indexCreationStarted()), this, connect(engine->indexModel(), SIGNAL(indexCreationStarted()), this,