Help: Pimpl plugin and avoid use of global object pool

Create a HelpPluginPrivate class, move all previously private
HelpPlugin data and code there.

Make it live from HelpPlugin::initialize() to HelpPlugin destruction,
so it can be used to handle life time of data members automatically,
making use of IPlugin::addAutoRemovedObject unneeded.

Change-Id: I9e381ca20b98f4d9c06687c11b81a64e69ceeb96
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2018-02-02 17:29:15 +01:00
parent 126674429f
commit d3eb585db9
2 changed files with 168 additions and 175 deletions

View File

@@ -100,32 +100,97 @@
#include <functional> #include <functional>
using namespace Help::Internal;
static const char kExternalWindowStateKey[] = "Help/ExternalWindowState"; static const char kExternalWindowStateKey[] = "Help/ExternalWindowState";
static const char kToolTipHelpContext[] = "Help.ToolTip"; static const char kToolTipHelpContext[] = "Help.ToolTip";
using namespace Core; using namespace Core;
using namespace Utils; using namespace Utils;
static HelpPlugin *m_instance = nullptr; namespace Help {
namespace Internal {
HelpPlugin::HelpPlugin() class HelpPluginPrivate : public QObject
{ {
m_instance = this; public:
} HelpPluginPrivate();
void modeChanged(Core::Id mode, Core::Id old);
void requestContextHelp();
void showContextHelp(const QString &contextHelpId);
void activateIndex();
void activateContents();
void saveExternalWindowSettings();
void showLinkInHelpMode(const QUrl &source);
void showLinksInCurrentViewer(const QMap<QString, QUrl> &links, const QString &key);
void slotHideRightPane();
void updateSideBarSource(const QUrl &newUrl);
void setupHelpEngineIfNeeded();
void highlightSearchTermsInContextHelp();
void handleHelpRequest(const QUrl &url, Core::HelpManager::HelpViewerLocation location);
void slotSystemInformation();
void resetFilter();
static void activateHelpMode() { ModeManager::activateMode(Constants::ID_MODE_HELP); }
static bool canShowHelpSideBySide();
HelpViewer *viewerForContextHelp();
HelpWidget *createHelpWidget(const Core::Context &context, HelpWidget::WidgetStyle style);
void createRightPaneContextViewer();
HelpViewer *externalHelpViewer();
HelpViewer *helpModeHelpViewer();
HelpWidget *helpWidgetForWindow(QWidget *window);
HelpViewer *viewerForHelpViewerLocation(HelpManager::HelpViewerLocation location);
void showInHelpViewer(const QUrl &url, HelpViewer *viewer);
void doSetupIfNeeded();
HelpMode m_mode;
CentralWidget *m_centralWidget = nullptr;
HelpWidget *m_rightPaneSideBarWidget = nullptr;
DocSettingsPage m_docSettingsPage;
FilterSettingsPage m_filterSettingsPage;
SearchTaskHandler m_searchTaskHandler;
GeneralSettingsPage m_generalSettingsPage;
bool m_setupNeeded = true;
LocalHelpManager m_helpManager;
OpenPagesManager m_openPagesManager;
QString m_contextHelpHighlightId;
QPointer<HelpWidget> m_externalWindow;
QRect m_externalWindowState;
HelpIndexFilter helpIndexFilter;
RemoteHelpFilter remoteHelpFilter;
};
static HelpPluginPrivate *dd = nullptr;
HelpPlugin::~HelpPlugin() HelpPlugin::~HelpPlugin()
{ {
delete m_openPagesManager; delete dd;
delete m_helpManager; dd = nullptr;
} }
bool HelpPlugin::initialize(const QStringList &arguments, QString *error) bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
{ {
Q_UNUSED(arguments) Q_UNUSED(arguments)
Q_UNUSED(error) Q_UNUSED(error)
Context modecontext(Constants::C_MODE_HELP); dd = new HelpPluginPrivate;
return true;
}
HelpPluginPrivate::HelpPluginPrivate()
{
Context modecontext(Help::Constants::C_MODE_HELP);
const QString &locale = ICore::userInterfaceLanguage(); const QString &locale = ICore::userInterfaceLanguage();
if (!locale.isEmpty()) { if (!locale.isEmpty()) {
@@ -141,31 +206,25 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
QCoreApplication::installTranslator(qhelptr); QCoreApplication::installTranslator(qhelptr);
} }
m_helpManager = new LocalHelpManager(this);
m_openPagesManager = new OpenPagesManager(this);
addAutoReleasedObject(m_docSettingsPage = new DocSettingsPage());
addAutoReleasedObject(m_filterSettingsPage = new FilterSettingsPage());
addAutoReleasedObject(new GeneralSettingsPage());
addAutoReleasedObject(m_searchTaskHandler = new SearchTaskHandler);
m_centralWidget = new CentralWidget(Context("Help.CentralHelpWidget")); m_centralWidget = new CentralWidget(Context("Help.CentralHelpWidget"));
connect(m_centralWidget, &HelpWidget::sourceChanged, this, connect(m_centralWidget, &HelpWidget::sourceChanged,
&HelpPlugin::updateSideBarSource); this, &HelpPluginPrivate::updateSideBarSource);
connect(m_centralWidget, &CentralWidget::closeButtonClicked, connect(m_centralWidget, &CentralWidget::closeButtonClicked,
&OpenPagesManager::instance(), &OpenPagesManager::closeCurrentPage); &OpenPagesManager::instance(), &OpenPagesManager::closeCurrentPage);
connect(LocalHelpManager::instance(), &LocalHelpManager::returnOnCloseChanged, connect(LocalHelpManager::instance(), &LocalHelpManager::returnOnCloseChanged,
m_centralWidget, &CentralWidget::updateCloseButton); m_centralWidget, &CentralWidget::updateCloseButton);
connect(HelpManager::instance(), &HelpManager::helpRequested, connect(HelpManager::instance(), &HelpManager::helpRequested,
this, &HelpPlugin::handleHelpRequest); this, &HelpPluginPrivate::handleHelpRequest);
connect(m_searchTaskHandler, &SearchTaskHandler::search, this, &QDesktopServices::openUrl); connect(&m_searchTaskHandler, &SearchTaskHandler::search,
this, &QDesktopServices::openUrl);
connect(m_filterSettingsPage, &FilterSettingsPage::filtersChanged, this, connect(&m_filterSettingsPage, &FilterSettingsPage::filtersChanged,
&HelpPlugin::setupHelpEngineIfNeeded); this, &HelpPluginPrivate::setupHelpEngineIfNeeded);
connect(HelpManager::instance(), &HelpManager::documentationChanged, this, connect(HelpManager::instance(), &HelpManager::documentationChanged,
&HelpPlugin::setupHelpEngineIfNeeded); this, &HelpPluginPrivate::setupHelpEngineIfNeeded);
connect(HelpManager::instance(), &HelpManager::collectionFileChanged, this, connect(HelpManager::instance(), &HelpManager::collectionFileChanged,
&HelpPlugin::setupHelpEngineIfNeeded); this, &HelpPluginPrivate::setupHelpEngineIfNeeded);
connect(ToolTip::instance(), &ToolTip::shown, ICore::instance(), []() { connect(ToolTip::instance(), &ToolTip::shown, ICore::instance(), []() {
ICore::addAdditionalContext(Context(kToolTipHelpContext), ICore::ContextPriority::High); ICore::addAdditionalContext(Context(kToolTipHelpContext), ICore::ContextPriority::High);
@@ -179,41 +238,41 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
// Add Contents, Index, and Context menu items // Add Contents, Index, and Context menu items
action = new QAction(QIcon::fromTheme("help-contents"), action = new QAction(QIcon::fromTheme("help-contents"),
tr(Constants::SB_CONTENTS), this); HelpPlugin::tr(Constants::SB_CONTENTS), this);
cmd = ActionManager::registerAction(action, "Help.ContentsMenu"); cmd = ActionManager::registerAction(action, "Help.ContentsMenu");
ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_HELP); ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_HELP);
connect(action, &QAction::triggered, this, &HelpPlugin::activateContents); connect(action, &QAction::triggered, this, &HelpPluginPrivate::activateContents);
action = new QAction(tr(Constants::SB_INDEX), this); action = new QAction(HelpPlugin::tr(Constants::SB_INDEX), this);
cmd = ActionManager::registerAction(action, "Help.IndexMenu"); cmd = ActionManager::registerAction(action, "Help.IndexMenu");
ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_HELP); ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_HELP);
connect(action, &QAction::triggered, this, &HelpPlugin::activateIndex); connect(action, &QAction::triggered, this, &HelpPluginPrivate::activateIndex);
action = new QAction(tr("Context Help"), this); action = new QAction(HelpPlugin::tr("Context Help"), this);
cmd = ActionManager::registerAction(action, Help::Constants::CONTEXT_HELP, cmd = ActionManager::registerAction(action, Help::Constants::CONTEXT_HELP,
Context(kToolTipHelpContext, Core::Constants::C_GLOBAL)); Context(kToolTipHelpContext, Core::Constants::C_GLOBAL));
ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_HELP); ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_HELP);
cmd->setDefaultKeySequence(QKeySequence(Qt::Key_F1)); cmd->setDefaultKeySequence(QKeySequence(Qt::Key_F1));
connect(action, &QAction::triggered, this, &HelpPlugin::requestContextHelp); connect(action, &QAction::triggered, this, &HelpPluginPrivate::requestContextHelp);
action = new QAction(tr("Technical Support"), this); action = new QAction(HelpPlugin::tr("Technical Support"), this);
cmd = ActionManager::registerAction(action, "Help.TechSupport"); cmd = ActionManager::registerAction(action, "Help.TechSupport");
ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_SUPPORT); ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_SUPPORT);
connect(action, &QAction::triggered, this, [this] { connect(action, &QAction::triggered, this, [this] {
showLinkInHelpMode(QUrl("qthelp://org.qt-project.qtcreator/doc/technical-support.html")); showLinkInHelpMode(QUrl("qthelp://org.qt-project.qtcreator/doc/technical-support.html"));
}); });
action = new QAction(tr("Report Bug..."), this); action = new QAction(HelpPlugin::tr("Report Bug..."), this);
cmd = ActionManager::registerAction(action, "Help.ReportBug"); cmd = ActionManager::registerAction(action, "Help.ReportBug");
ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_SUPPORT); ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_SUPPORT);
connect(action, &QAction::triggered, this, [] { connect(action, &QAction::triggered, this, [] {
QDesktopServices::openUrl(QUrl("https://bugreports.qt.io")); QDesktopServices::openUrl(QUrl("https://bugreports.qt.io"));
}); });
action = new QAction(tr("System Information..."), this); action = new QAction(HelpPlugin::tr("System Information..."), this);
cmd = ActionManager::registerAction(action, "Help.SystemInformation"); cmd = ActionManager::registerAction(action, "Help.SystemInformation");
ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_SUPPORT); ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_SUPPORT);
connect(action, &QAction::triggered, this, &HelpPlugin::slotSystemInformation); connect(action, &QAction::triggered, this, &HelpPluginPrivate::slotSystemInformation);
if (ActionContainer *windowMenu = ActionManager::actionContainer(Core::Constants::M_WINDOW)) { if (ActionContainer *windowMenu = ActionManager::actionContainer(Core::Constants::M_WINDOW)) {
// reuse EditorManager constants to avoid a second pair of menu actions // reuse EditorManager constants to avoid a second pair of menu actions
@@ -234,24 +293,17 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
&OpenPagesManager::gotoNextPage); &OpenPagesManager::gotoNextPage);
} }
auto helpIndexFilter = new HelpIndexFilter(); connect(&helpIndexFilter, &HelpIndexFilter::linksActivated,
addAutoReleasedObject(helpIndexFilter); this, &HelpPluginPrivate::showLinksInCurrentViewer);
connect(helpIndexFilter, &HelpIndexFilter::linksActivated,
this, &HelpPlugin::showLinksInCurrentViewer);
RemoteHelpFilter *remoteHelpFilter = new RemoteHelpFilter(); connect(&remoteHelpFilter, &RemoteHelpFilter::linkActivated,
addAutoReleasedObject(remoteHelpFilter); this, &QDesktopServices::openUrl);
connect(remoteHelpFilter, &RemoteHelpFilter::linkActivated, this, &QDesktopServices::openUrl);
QDesktopServices::setUrlHandler("qthelp", HelpManager::instance(), "handleHelpRequest"); QDesktopServices::setUrlHandler("qthelp", HelpManager::instance(), "handleHelpRequest");
connect(ModeManager::instance(), &ModeManager::currentModeChanged, connect(ModeManager::instance(), &ModeManager::currentModeChanged,
this, &HelpPlugin::modeChanged); this, &HelpPluginPrivate::modeChanged);
m_mode = new HelpMode; m_mode.setWidget(m_centralWidget);
m_mode->setWidget(m_centralWidget);
addAutoReleasedObject(m_mode);
return true;
} }
void HelpPlugin::extensionsInitialized() void HelpPlugin::extensionsInitialized()
@@ -264,16 +316,18 @@ void HelpPlugin::extensionsInitialized()
ExtensionSystem::IPlugin::ShutdownFlag HelpPlugin::aboutToShutdown() ExtensionSystem::IPlugin::ShutdownFlag HelpPlugin::aboutToShutdown()
{ {
if (m_externalWindow) delete dd->m_externalWindow.data();
delete m_externalWindow.data();
if (m_centralWidget) delete dd->m_centralWidget;
delete m_centralWidget; dd->m_centralWidget = nullptr;
if (m_rightPaneSideBarWidget)
delete m_rightPaneSideBarWidget; delete dd->m_rightPaneSideBarWidget;
dd->m_rightPaneSideBarWidget = nullptr;
return SynchronousShutdown; return SynchronousShutdown;
} }
void HelpPlugin::resetFilter() void HelpPluginPrivate::resetFilter()
{ {
const QString &filterInternal = QString::fromLatin1("Qt Creator %1.%2.%3") const QString &filterInternal = QString::fromLatin1("Qt Creator %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);
@@ -295,7 +349,7 @@ void HelpPlugin::resetFilter()
} }
// potentially remove a filter with new name // potentially remove a filter with new name
const QString filterName = tr("Unfiltered"); const QString filterName = HelpPlugin::tr("Unfiltered");
engine->removeCustomFilter(filterName); engine->removeCustomFilter(filterName);
engine->addCustomFilter(filterName, QStringList()); engine->addCustomFilter(filterName, QStringList());
engine->setCustomValue(Help::Constants::WeAddedFilterKey, 1); engine->setCustomValue(Help::Constants::WeAddedFilterKey, 1);
@@ -307,7 +361,7 @@ void HelpPlugin::resetFilter()
LocalHelpManager::instance(), &LocalHelpManager::updateFilterModel); LocalHelpManager::instance(), &LocalHelpManager::updateFilterModel);
} }
void HelpPlugin::saveExternalWindowSettings() void HelpPluginPrivate::saveExternalWindowSettings()
{ {
if (!m_externalWindow) if (!m_externalWindow)
return; return;
@@ -316,18 +370,18 @@ void HelpPlugin::saveExternalWindowSettings()
settings->setValue(kExternalWindowStateKey, qVariantFromValue(m_externalWindowState)); settings->setValue(kExternalWindowStateKey, qVariantFromValue(m_externalWindowState));
} }
HelpWidget *HelpPlugin::createHelpWidget(const Context &context, HelpWidget::WidgetStyle style) HelpWidget *HelpPluginPrivate::createHelpWidget(const Context &context, HelpWidget::WidgetStyle style)
{ {
HelpWidget *widget = new HelpWidget(context, style); HelpWidget *widget = new HelpWidget(context, style);
connect(widget->currentViewer(), &HelpViewer::loadFinished, connect(widget->currentViewer(), &HelpViewer::loadFinished,
this, &HelpPlugin::highlightSearchTermsInContextHelp); this, &HelpPluginPrivate::highlightSearchTermsInContextHelp);
connect(widget, &HelpWidget::openHelpMode, connect(widget, &HelpWidget::openHelpMode,
this, &HelpPlugin::showLinkInHelpMode); this, &HelpPluginPrivate::showLinkInHelpMode);
connect(widget, &HelpWidget::closeButtonClicked, connect(widget, &HelpWidget::closeButtonClicked,
this, &HelpPlugin::slotHideRightPane); this, &HelpPluginPrivate::slotHideRightPane);
connect(widget, &HelpWidget::aboutToClose, connect(widget, &HelpWidget::aboutToClose,
this, &HelpPlugin::saveExternalWindowSettings); this, &HelpPluginPrivate::saveExternalWindowSettings);
// force setup, as we might have never switched to full help mode // force setup, as we might have never switched to full help mode
// thus the help engine might still run without collection file setup // thus the help engine might still run without collection file setup
@@ -336,7 +390,7 @@ HelpWidget *HelpPlugin::createHelpWidget(const Context &context, HelpWidget::Wid
return widget; return widget;
} }
void HelpPlugin::createRightPaneContextViewer() void HelpPluginPrivate::createRightPaneContextViewer()
{ {
if (m_rightPaneSideBarWidget) if (m_rightPaneSideBarWidget)
return; return;
@@ -344,7 +398,7 @@ void HelpPlugin::createRightPaneContextViewer()
HelpWidget::SideBarWidget); HelpWidget::SideBarWidget);
} }
HelpViewer *HelpPlugin::externalHelpViewer() HelpViewer *HelpPluginPrivate::externalHelpViewer()
{ {
if (m_externalWindow) if (m_externalWindow)
return m_externalWindow->currentViewer(); return m_externalWindow->currentViewer();
@@ -419,17 +473,12 @@ HelpViewer *HelpPlugin::createHelpViewer(qreal zoom)
return viewer; return viewer;
} }
void HelpPlugin::activateHelpMode() void HelpPluginPrivate::showLinkInHelpMode(const QUrl &source)
{
ModeManager::activateMode(Id(Constants::ID_MODE_HELP));
}
void HelpPlugin::showLinkInHelpMode(const QUrl &source)
{ {
showInHelpViewer(source, helpModeHelpViewer()); showInHelpViewer(source, helpModeHelpViewer());
} }
void HelpPlugin::showLinksInCurrentViewer(const QMap<QString, QUrl> &links, const QString &key) void HelpPluginPrivate::showLinksInCurrentViewer(const QMap<QString, QUrl> &links, const QString &key)
{ {
if (links.size() < 1) if (links.size() < 1)
return; return;
@@ -437,22 +486,22 @@ void HelpPlugin::showLinksInCurrentViewer(const QMap<QString, QUrl> &links, cons
widget->showLinks(links, key); widget->showLinks(links, key);
} }
void HelpPlugin::slotHideRightPane() void HelpPluginPrivate::slotHideRightPane()
{ {
RightPaneWidget::instance()->setShown(false); RightPaneWidget::instance()->setShown(false);
} }
void HelpPlugin::modeChanged(Core::Id mode, Core::Id old) void HelpPluginPrivate::modeChanged(Core::Id mode, Core::Id old)
{ {
Q_UNUSED(old) Q_UNUSED(old)
if (mode == m_mode->id()) { if (mode == m_mode.id()) {
QGuiApplication::setOverrideCursor(Qt::WaitCursor); QGuiApplication::setOverrideCursor(Qt::WaitCursor);
doSetupIfNeeded(); doSetupIfNeeded();
QGuiApplication::restoreOverrideCursor(); QGuiApplication::restoreOverrideCursor();
} }
} }
void HelpPlugin::updateSideBarSource(const QUrl &newUrl) void HelpPluginPrivate::updateSideBarSource(const QUrl &newUrl)
{ {
if (m_rightPaneSideBarWidget) { if (m_rightPaneSideBarWidget) {
// This is called when setSource on the central widget is called. // This is called when setSource on the central widget is called.
@@ -463,15 +512,15 @@ void HelpPlugin::updateSideBarSource(const QUrl &newUrl)
} }
} }
void HelpPlugin::setupHelpEngineIfNeeded() void HelpPluginPrivate::setupHelpEngineIfNeeded()
{ {
LocalHelpManager::setEngineNeedsUpdate(); LocalHelpManager::setEngineNeedsUpdate();
if (ModeManager::currentMode() == m_mode->id() if (ModeManager::currentMode() == m_mode.id()
|| LocalHelpManager::contextHelpOption() == HelpManager::ExternalHelpAlways) || LocalHelpManager::contextHelpOption() == HelpManager::ExternalHelpAlways)
LocalHelpManager::setupGuiHelpEngine(); LocalHelpManager::setupGuiHelpEngine();
} }
bool HelpPlugin::canShowHelpSideBySide() bool HelpPluginPrivate::canShowHelpSideBySide()
{ {
RightPanePlaceHolder *placeHolder = RightPanePlaceHolder::current(); RightPanePlaceHolder *placeHolder = RightPanePlaceHolder::current();
if (!placeHolder) if (!placeHolder)
@@ -490,16 +539,16 @@ bool HelpPlugin::canShowHelpSideBySide()
return true; return true;
} }
HelpViewer *HelpPlugin::helpModeHelpViewer() HelpViewer *HelpPluginPrivate::helpModeHelpViewer()
{ {
activateHelpMode(); // should trigger an createPage... activateHelpMode(); // should trigger an createPage...
HelpViewer *viewer = m_instance->m_centralWidget->currentViewer(); HelpViewer *viewer = m_centralWidget->currentViewer();
if (!viewer) if (!viewer)
viewer = OpenPagesManager::instance().createPage(); viewer = OpenPagesManager::instance().createPage();
return viewer; return viewer;
} }
HelpWidget *HelpPlugin::helpWidgetForWindow(QWidget *window) HelpWidget *HelpPluginPrivate::helpWidgetForWindow(QWidget *window)
{ {
if (m_externalWindow && m_externalWindow->window() == window->window()) if (m_externalWindow && m_externalWindow->window() == window->window())
return m_externalWindow; return m_externalWindow;
@@ -508,6 +557,11 @@ HelpWidget *HelpPlugin::helpWidgetForWindow(QWidget *window)
} }
HelpViewer *HelpPlugin::viewerForHelpViewerLocation(HelpManager::HelpViewerLocation location) HelpViewer *HelpPlugin::viewerForHelpViewerLocation(HelpManager::HelpViewerLocation location)
{
return dd->viewerForHelpViewerLocation(location);
}
HelpViewer *HelpPluginPrivate::viewerForHelpViewerLocation(HelpManager::HelpViewerLocation location)
{ {
HelpManager::HelpViewerLocation actualLocation = location; HelpManager::HelpViewerLocation actualLocation = location;
if (location == HelpManager::SideBySideIfPossible) if (location == HelpManager::SideBySideIfPossible)
@@ -515,21 +569,26 @@ HelpViewer *HelpPlugin::viewerForHelpViewerLocation(HelpManager::HelpViewerLocat
: HelpManager::HelpModeAlways; : HelpManager::HelpModeAlways;
if (actualLocation == HelpManager::ExternalHelpAlways) if (actualLocation == HelpManager::ExternalHelpAlways)
return m_instance->externalHelpViewer(); return externalHelpViewer();
if (actualLocation == HelpManager::SideBySideAlways) { if (actualLocation == HelpManager::SideBySideAlways) {
m_instance->createRightPaneContextViewer(); createRightPaneContextViewer();
RightPaneWidget::instance()->setWidget(m_instance->m_rightPaneSideBarWidget); RightPaneWidget::instance()->setWidget(m_rightPaneSideBarWidget);
RightPaneWidget::instance()->setShown(true); RightPaneWidget::instance()->setShown(true);
return m_instance->m_rightPaneSideBarWidget->currentViewer(); return m_rightPaneSideBarWidget->currentViewer();
} }
QTC_CHECK(actualLocation == HelpManager::HelpModeAlways); QTC_CHECK(actualLocation == HelpManager::HelpModeAlways);
return m_instance->helpModeHelpViewer(); return helpModeHelpViewer();
} }
void HelpPlugin::showInHelpViewer(const QUrl &url, HelpViewer *viewer) void HelpPlugin::showInHelpViewer(const QUrl &url, HelpViewer *viewer)
{
dd->showInHelpViewer(url, viewer);
}
void HelpPluginPrivate::showInHelpViewer(const QUrl &url, HelpViewer *viewer)
{ {
QTC_ASSERT(viewer, return); QTC_ASSERT(viewer, return);
viewer->setFocus(); viewer->setFocus();
@@ -540,7 +599,7 @@ void HelpPlugin::showInHelpViewer(const QUrl &url, HelpViewer *viewer)
viewer->window()->show(); viewer->window()->show();
} }
HelpViewer *HelpPlugin::viewerForContextHelp() HelpViewer *HelpPluginPrivate::viewerForContextHelp()
{ {
return viewerForHelpViewerLocation(LocalHelpManager::contextHelpOption()); return viewerForHelpViewerLocation(LocalHelpManager::contextHelpOption());
} }
@@ -573,7 +632,7 @@ static QUrl findBestLink(const QMap<QString, QUrl> &links, QString *highlightId)
return source; return source;
} }
void HelpPlugin::requestContextHelp() void HelpPluginPrivate::requestContextHelp()
{ {
// Find out what to show // Find out what to show
QString contextHelpId = Utils::ToolTip::contextHelpId(); QString contextHelpId = Utils::ToolTip::contextHelpId();
@@ -584,7 +643,7 @@ void HelpPlugin::requestContextHelp()
showContextHelp(contextHelpId); showContextHelp(contextHelpId);
} }
void HelpPlugin::showContextHelp(const QString &contextHelpId) void HelpPluginPrivate::showContextHelp(const QString &contextHelpId)
{ {
// get the viewer after getting the help id, // get the viewer after getting the help id,
// because a new window might be opened and therefore focus be moved // because a new window might be opened and therefore focus be moved
@@ -600,7 +659,7 @@ void HelpPlugin::showContextHelp(const QString &contextHelpId)
if (!source.isValid()) { if (!source.isValid()) {
// No link found or no context object // No link found or no context object
showInHelpViewer(QUrl(Help::Constants::AboutBlank), viewer); showInHelpViewer(QUrl(Help::Constants::AboutBlank), viewer);
viewer->setHtml(tr("<html><head><title>No Documentation</title>" viewer->setHtml(HelpPlugin::tr("<html><head><title>No Documentation</title>"
"</head><body><br/><center>" "</head><body><br/><center>"
"<font color=\"%1\"><b>%2</b></font><br/>" "<font color=\"%1\"><b>%2</b></font><br/>"
"<font color=\"%3\">No documentation available.</font>" "<font color=\"%3\">No documentation available.</font>"
@@ -613,19 +672,19 @@ void HelpPlugin::showContextHelp(const QString &contextHelpId)
} }
} }
void HelpPlugin::activateIndex() void HelpPluginPrivate::activateIndex()
{ {
activateHelpMode(); activateHelpMode();
m_centralWidget->activateSideBarItem(Constants::HELP_INDEX); m_centralWidget->activateSideBarItem(Constants::HELP_INDEX);
} }
void HelpPlugin::activateContents() void HelpPluginPrivate::activateContents()
{ {
activateHelpMode(); activateHelpMode();
m_centralWidget->activateSideBarItem(Constants::HELP_CONTENTS); m_centralWidget->activateSideBarItem(Constants::HELP_CONTENTS);
} }
void HelpPlugin::highlightSearchTermsInContextHelp() void HelpPluginPrivate::highlightSearchTermsInContextHelp()
{ {
if (m_contextHelpHighlightId.isEmpty()) if (m_contextHelpHighlightId.isEmpty())
return; return;
@@ -635,7 +694,7 @@ void HelpPlugin::highlightSearchTermsInContextHelp()
m_contextHelpHighlightId.clear(); m_contextHelpHighlightId.clear();
} }
void HelpPlugin::handleHelpRequest(const QUrl &url, HelpManager::HelpViewerLocation location) void HelpPluginPrivate::handleHelpRequest(const QUrl &url, HelpManager::HelpViewerLocation location)
{ {
static const QString qtcreatorUnversionedID = "org.qt-project.qtcreator"; static const QString qtcreatorUnversionedID = "org.qt-project.qtcreator";
if (url.host() == qtcreatorUnversionedID) { if (url.host() == qtcreatorUnversionedID) {
@@ -687,16 +746,16 @@ public:
} }
}; };
void HelpPlugin::slotSystemInformation() void HelpPluginPrivate::slotSystemInformation()
{ {
auto dialog = new DialogClosingOnEscape(ICore::dialogParent()); auto dialog = new DialogClosingOnEscape(ICore::dialogParent());
dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setWindowFlags(Qt::Window); dialog->setWindowFlags(Qt::Window);
dialog->setModal(true); dialog->setModal(true);
dialog->setWindowTitle(tr("System Information")); dialog->setWindowTitle(HelpPlugin::tr("System Information"));
auto layout = new QVBoxLayout; auto layout = new QVBoxLayout;
dialog->setLayout(layout); dialog->setLayout(layout);
auto intro = new QLabel(tr("Use the following to provide more detailed information about your system to bug reports:")); auto intro = new QLabel(HelpPlugin::tr("Use the following to provide more detailed information about your system to bug reports:"));
intro->setWordWrap(true); intro->setWordWrap(true);
layout->addWidget(intro); layout->addWidget(intro);
const QString text = "{noformat}\n" + ICore::systemInformation() + "\n{noformat}"; const QString text = "{noformat}\n" + ICore::systemInformation() + "\n{noformat}";
@@ -709,7 +768,7 @@ void HelpPlugin::slotSystemInformation()
layout->addWidget(info); layout->addWidget(info);
auto buttonBox = new QDialogButtonBox; auto buttonBox = new QDialogButtonBox;
buttonBox->addButton(QDialogButtonBox::Cancel); buttonBox->addButton(QDialogButtonBox::Cancel);
buttonBox->addButton(tr("Copy to Clipboard"), QDialogButtonBox::AcceptRole); buttonBox->addButton(HelpPlugin::tr("Copy to Clipboard"), QDialogButtonBox::AcceptRole);
connect(buttonBox, &QDialogButtonBox::accepted, dialog, &QDialog::accept); connect(buttonBox, &QDialogButtonBox::accepted, dialog, &QDialog::accept);
connect(buttonBox, &QDialogButtonBox::rejected, dialog, &QDialog::reject); connect(buttonBox, &QDialogButtonBox::rejected, dialog, &QDialog::reject);
layout->addWidget(buttonBox); layout->addWidget(buttonBox);
@@ -723,7 +782,7 @@ void HelpPlugin::slotSystemInformation()
dialog->show(); dialog->show();
} }
void HelpPlugin::doSetupIfNeeded() void HelpPluginPrivate::doSetupIfNeeded()
{ {
LocalHelpManager::setupGuiHelpEngine(); LocalHelpManager::setupGuiHelpEngine();
if (m_setupNeeded) { if (m_setupNeeded) {
@@ -733,3 +792,6 @@ void HelpPlugin::doSetupIfNeeded()
LocalHelpManager::bookmarkManager().setupBookmarkModels(); LocalHelpManager::bookmarkManager().setupBookmarkModels();
} }
} }
} // Internal
} // Help

View File

@@ -25,35 +25,17 @@
#pragma once #pragma once
#include "helpwidget.h"
#include <coreplugin/helpmanager.h> #include <coreplugin/helpmanager.h>
#include <coreplugin/icontext.h>
#include <extensionsystem/iplugin.h> #include <extensionsystem/iplugin.h>
#include <QMap>
#include <QStringList>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QUrl; class QUrl;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace Core {
class SideBar;
} // Core
namespace Utils { class StyledBar; }
namespace Help { namespace Help {
namespace Internal { namespace Internal {
class CentralWidget;
class DocSettingsPage;
class FilterSettingsPage;
class HelpMode;
class HelpViewer; class HelpViewer;
class LocalHelpManager;
class OpenPagesManager;
class SearchTaskHandler;
class HelpPlugin : public ExtensionSystem::IPlugin class HelpPlugin : public ExtensionSystem::IPlugin
{ {
@@ -61,68 +43,17 @@ class HelpPlugin : public ExtensionSystem::IPlugin
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Help.json") Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Help.json")
public: public:
HelpPlugin(); HelpPlugin() = default;
virtual ~HelpPlugin(); ~HelpPlugin() final;
bool initialize(const QStringList &arguments, QString *errorMessage);
void extensionsInitialized();
ShutdownFlag aboutToShutdown();
static HelpViewer *viewerForHelpViewerLocation(Core::HelpManager::HelpViewerLocation location); static HelpViewer *viewerForHelpViewerLocation(Core::HelpManager::HelpViewerLocation location);
static void showInHelpViewer(const QUrl &url, HelpViewer *viewer); static void showInHelpViewer(const QUrl &url, HelpViewer *viewer);
static HelpViewer *createHelpViewer(qreal zoom); static HelpViewer *createHelpViewer(qreal zoom);
private: private:
void modeChanged(Core::Id mode, Core::Id old); bool initialize(const QStringList &arguments, QString *errorMessage) final;
void extensionsInitialized() final;
void requestContextHelp(); ShutdownFlag aboutToShutdown() final;
void showContextHelp(const QString &contextHelpId);
void activateIndex();
void activateContents();
void saveExternalWindowSettings();
void showLinkInHelpMode(const QUrl &source);
void showLinksInCurrentViewer(const QMap<QString, QUrl> &links, const QString &key);
void slotHideRightPane();
void updateSideBarSource(const QUrl &newUrl);
void setupHelpEngineIfNeeded();
void highlightSearchTermsInContextHelp();
void handleHelpRequest(const QUrl &url, Core::HelpManager::HelpViewerLocation location);
void slotSystemInformation();
void resetFilter();
static void activateHelpMode();
static bool canShowHelpSideBySide();
HelpViewer *viewerForContextHelp();
HelpWidget *createHelpWidget(const Core::Context &context, HelpWidget::WidgetStyle style);
void createRightPaneContextViewer();
HelpViewer *externalHelpViewer();
HelpViewer *helpModeHelpViewer();
HelpWidget *helpWidgetForWindow(QWidget *window);
void doSetupIfNeeded();
HelpMode *m_mode = nullptr;
CentralWidget *m_centralWidget = nullptr;
HelpWidget *m_rightPaneSideBarWidget = nullptr;
DocSettingsPage *m_docSettingsPage = nullptr;
FilterSettingsPage *m_filterSettingsPage = nullptr;
SearchTaskHandler *m_searchTaskHandler = nullptr;
bool m_setupNeeded = true;
LocalHelpManager *m_helpManager = nullptr;
OpenPagesManager *m_openPagesManager = nullptr;
QString m_contextHelpHighlightId;
QPointer<HelpWidget> m_externalWindow;
QRect m_externalWindowState;
}; };
} // namespace Internal } // namespace Internal