summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/help/centralwidget.cpp296
-rw-r--r--src/plugins/help/centralwidget.h70
-rw-r--r--src/plugins/help/generalsettingspage.cpp4
-rw-r--r--src/plugins/help/helpplugin.cpp248
-rw-r--r--src/plugins/help/helpplugin.h16
-rw-r--r--src/plugins/help/helpwidget.cpp288
-rw-r--r--src/plugins/help/helpwidget.h41
-rw-r--r--src/plugins/help/localhelpmanager.cpp50
-rw-r--r--src/plugins/help/localhelpmanager.h15
-rw-r--r--src/plugins/help/openpagesmanager.cpp8
-rw-r--r--src/shared/help/contentwindow.cpp2
11 files changed, 390 insertions, 648 deletions
diff --git a/src/plugins/help/centralwidget.cpp b/src/plugins/help/centralwidget.cpp
index 94deeb15a5..23e4d98292 100644
--- a/src/plugins/help/centralwidget.cpp
+++ b/src/plugins/help/centralwidget.cpp
@@ -31,22 +31,11 @@
#include "helpviewer.h"
#include "localhelpmanager.h"
+#include "topicchooser.h"
-#include <topicchooser.h>
-
-#include <QEvent>
-#include <QTimer>
-
-#include <QKeyEvent>
-#include <QLayout>
-#include <QPageSetupDialog>
-#include <QPrinter>
-#include <QPrintDialog>
-#include <QPrintPreviewDialog>
-#include <QStackedWidget>
+#include <utils/qtcassert.h>
#include <QHelpEngine>
-#include <QHelpSearchEngine>
using namespace Help::Internal;
@@ -54,29 +43,19 @@ CentralWidget *gStaticCentralWidget = 0;
// -- CentralWidget
-CentralWidget::CentralWidget(QWidget *parent)
- : QWidget(parent)
- , printer(0)
- , m_stackedWidget(0)
+CentralWidget::CentralWidget(const Core::Context &context, QWidget *parent)
+ : HelpWidget(context, HelpWidget::ModeWidget, parent)
{
- Q_ASSERT(!gStaticCentralWidget);
+ QTC_CHECK(!gStaticCentralWidget);
gStaticCentralWidget = this;
-
- QVBoxLayout *vboxLayout = new QVBoxLayout(this);
- vboxLayout->setMargin(0);
- m_stackedWidget = new QStackedWidget(this);
- vboxLayout->addWidget(m_stackedWidget);
}
CentralWidget::~CentralWidget()
{
-#ifndef QT_NO_PRINTER
- delete printer;
-#endif
-
+ // TODO: this shouldn't be done here
QString zoomFactors;
QString currentPages;
- for (int i = 0; i < m_stackedWidget->count(); ++i) {
+ for (int i = 0; i < viewerCount(); ++i) {
const HelpViewer * const viewer = viewerAt(i);
const QUrl &source = viewer->source();
if (source.isValid()) {
@@ -97,171 +76,6 @@ CentralWidget *CentralWidget::instance()
return gStaticCentralWidget;
}
-bool CentralWidget::isForwardAvailable() const
-{
- const HelpViewer* viewer = currentHelpViewer();
- if (viewer)
- return viewer->isForwardAvailable();
-
- return false;
-}
-
-bool CentralWidget::isBackwardAvailable() const
-{
- const HelpViewer* viewer = currentHelpViewer();
- if (viewer)
- return viewer->isBackwardAvailable();
-
- return false;
-}
-
-HelpViewer* CentralWidget::viewerAt(int index) const
-{
- return qobject_cast<HelpViewer*> (m_stackedWidget->widget(index));
-}
-
-HelpViewer* CentralWidget::currentHelpViewer() const
-{
- return qobject_cast<HelpViewer*> (m_stackedWidget->currentWidget());
-}
-
-void CentralWidget::addPage(HelpViewer *page, bool fromSearch)
-{
- page->installEventFilter(this);
- page->setFocus(Qt::OtherFocusReason);
- connectSignals(page);
- m_stackedWidget->addWidget(page);
- if (fromSearch) {
- connect(currentHelpViewer(), SIGNAL(loadFinished()), this,
- SLOT(highlightSearchTerms()));
- }
-}
-
-void CentralWidget::removePage(int index)
-{
- m_stackedWidget->removeWidget(m_stackedWidget->widget(index));
-}
-
-int CentralWidget::currentIndex() const
-{
- return m_stackedWidget->currentIndex();
-}
-
-void CentralWidget::setCurrentPage(HelpViewer *page)
-{
- m_stackedWidget->setCurrentWidget(page);
-}
-
-bool CentralWidget::find(const QString &txt, Core::FindFlags flags,
- bool incremental, bool *wrapped)
-{
- return currentHelpViewer()->findText(txt, flags, incremental, false, wrapped);
-}
-
-// -- public slots
-
-void CentralWidget::copy()
-{
- if (HelpViewer* viewer = currentHelpViewer())
- viewer->copy();
-}
-
-void CentralWidget::home()
-{
- if (HelpViewer* viewer = currentHelpViewer())
- viewer->home();
-}
-
-void CentralWidget::zoomIn()
-{
- HelpViewer* viewer = currentHelpViewer();
- if (viewer)
- viewer->scaleUp();
-}
-
-void CentralWidget::zoomOut()
-{
- HelpViewer* viewer = currentHelpViewer();
- if (viewer)
- viewer->scaleDown();
-}
-
-void CentralWidget::resetZoom()
-{
- HelpViewer* viewer = currentHelpViewer();
- if (viewer)
- viewer->resetScale();
-}
-
-void CentralWidget::forward()
-{
- if (HelpViewer* viewer = currentHelpViewer())
- viewer->forward();
-}
-
-void CentralWidget::backward()
-{
- if (HelpViewer* viewer = currentHelpViewer())
- viewer->backward();
-}
-
-void CentralWidget::print()
-{
-#ifndef QT_NO_PRINTER
- if (HelpViewer* viewer = currentHelpViewer()) {
- initPrinter();
-
- QPrintDialog dlg(printer, this);
- dlg.setWindowTitle(tr("Print Document"));
- if (!viewer->selectedText().isEmpty())
- dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);
- dlg.addEnabledOption(QAbstractPrintDialog::PrintPageRange);
- dlg.addEnabledOption(QAbstractPrintDialog::PrintCollateCopies);
-
- if (dlg.exec() == QDialog::Accepted)
- viewer->print(printer);
- }
-#endif
-}
-
-void CentralWidget::pageSetup()
-{
-#ifndef QT_NO_PRINTER
- initPrinter();
- QPageSetupDialog dlg(printer);
- dlg.exec();
-#endif
-}
-
-void CentralWidget::printPreview()
-{
-#ifndef QT_NO_PRINTER
- initPrinter();
- QPrintPreviewDialog preview(printer, this);
- connect(&preview, SIGNAL(paintRequested(QPrinter*)),
- SLOT(printPreview(QPrinter*)));
- preview.exec();
-#endif
-}
-
-void CentralWidget::setSource(const QUrl &url)
-{
- if (HelpViewer* viewer = currentHelpViewer()) {
- viewer->setSource(url);
- viewer->setFocus(Qt::OtherFocusReason);
- }
-}
-
-void CentralWidget::setSourceFromSearch(const QUrl &url)
-{
- if (HelpViewer* viewer = currentHelpViewer()) {
- connect(viewer, SIGNAL(loadFinished()), this,
- SLOT(highlightSearchTerms()));
- viewer->setSource(url);
- viewer->setFocus(Qt::OtherFocusReason);
- }
-}
-
void CentralWidget::showTopicChooser(const QMap<QString, QUrl> &links,
const QString &keyword)
{
@@ -269,99 +83,3 @@ void CentralWidget::showTopicChooser(const QMap<QString, QUrl> &links,
if (tc.exec() == QDialog::Accepted)
setSource(tc.link());
}
-
-// -- protected
-
-void CentralWidget::focusInEvent(QFocusEvent * /* event */)
-{
- // If we have a current help viewer then this is the 'focus proxy',
- // otherwise it's the central widget. This is needed, so an embedding
- // program can just set the focus to the central widget and it does
- // The Right Thing(TM)
- QObject *receiver = m_stackedWidget;
- if (HelpViewer *viewer = currentHelpViewer())
- receiver = viewer;
- QTimer::singleShot(1, receiver, SLOT(setFocus()));
-}
-
-// -- private slots
-
-void CentralWidget::highlightSearchTerms()
-{
- if (HelpViewer *viewer = currentHelpViewer()) {
- QHelpSearchEngine *searchEngine =
- LocalHelpManager::helpEngine().searchEngine();
- QList<QHelpSearchQuery> queryList = searchEngine->query();
-
- QStringList terms;
- foreach (const QHelpSearchQuery &query, queryList) {
- switch (query.fieldName) {
- default: break;
- case QHelpSearchQuery::ALL: {
- case QHelpSearchQuery::PHRASE:
- case QHelpSearchQuery::DEFAULT:
- case QHelpSearchQuery::ATLEAST:
- foreach (QString term, query.wordList)
- terms.append(term.remove(QLatin1Char('"')));
- }
- }
- }
-
- foreach (const QString& term, terms)
- viewer->findText(term, 0, false, true);
- disconnect(viewer, SIGNAL(loadFinished()), this,
- SLOT(highlightSearchTerms()));
- }
-}
-
-void CentralWidget::printPreview(QPrinter *p)
-{
-#ifndef QT_NO_PRINTER
- HelpViewer *viewer = currentHelpViewer();
- if (viewer)
- viewer->print(p);
-#else
- Q_UNUSED(p)
-#endif
-}
-
-void CentralWidget::handleSourceChanged(const QUrl &url)
-{
- if (sender() == currentHelpViewer())
- emit sourceChanged(url);
-}
-
-// -- private
-
-void CentralWidget::initPrinter()
-{
-#ifndef QT_NO_PRINTER
- if (!printer)
- printer = new QPrinter(QPrinter::HighResolution);
-#endif
-}
-
-void CentralWidget::connectSignals(HelpViewer *page)
-{
- connect(page, SIGNAL(sourceChanged(QUrl)), this, SLOT(handleSourceChanged(QUrl)));
- connect(page, SIGNAL(forwardAvailable(bool)), this, SIGNAL(forwardAvailable(bool)));
- connect(page, SIGNAL(backwardAvailable(bool)), this, SIGNAL(backwardAvailable(bool)));
- connect(page, SIGNAL(printRequested()), this, SLOT(print()));
-}
-
-bool CentralWidget::eventFilter(QObject *object, QEvent *e)
-{
- if (e->type() != QEvent::KeyPress)
- return QWidget::eventFilter(object, e);
-
- HelpViewer *viewer = currentHelpViewer();
- QKeyEvent *keyEvent = static_cast<QKeyEvent*> (e);
- if (viewer == object && keyEvent->key() == Qt::Key_Backspace) {
- if (viewer->isBackwardAvailable()) {
- // this helps in case there is an html <input> field
- if (!viewer->hasFocus())
- viewer->backward();
- }
- }
- return QWidget::eventFilter(object, e);
-}
diff --git a/src/plugins/help/centralwidget.h b/src/plugins/help/centralwidget.h
index 8fa96d0e19..37d310459e 100644
--- a/src/plugins/help/centralwidget.h
+++ b/src/plugins/help/centralwidget.h
@@ -30,90 +30,32 @@
#ifndef CENTRALWIDGET_H
#define CENTRALWIDGET_H
-#include <coreplugin/find/ifindsupport.h>
-
-#include <QWidget>
+#include "helpwidget.h"
-QT_FORWARD_DECLARE_CLASS(QEvent)
-QT_FORWARD_DECLARE_CLASS(QAction)
-QT_FORWARD_DECLARE_CLASS(QStackedWidget)
-QT_FORWARD_DECLARE_CLASS(QFocusEvent)
-QT_FORWARD_DECLARE_CLASS(QPrinter)
+#include <coreplugin/find/ifindsupport.h>
namespace Help {
- namespace Internal {
+namespace Internal {
class HelpViewer;
class PrintHelper;
-class CentralWidget : public QWidget
+class CentralWidget : public HelpWidget
{
Q_OBJECT
public:
- CentralWidget(QWidget *parent = 0);
+ CentralWidget(const Core::Context &context, QWidget *parent = 0);
~CentralWidget();
static CentralWidget *instance();
- bool isForwardAvailable() const;
- bool isBackwardAvailable() const;
-
- HelpViewer *viewerAt(int index) const;
- HelpViewer *currentHelpViewer() const;
-
- void addPage(HelpViewer *page, bool fromSearch = false);
- void removePage(int index);
-
- int currentIndex() const;
- void setCurrentPage(HelpViewer *page);
-
- bool find(const QString &txt, Core::FindFlags findFlags,
- bool incremental, bool *wrapped = 0);
-
public slots:
- void copy();
- void home();
-
- void zoomIn();
- void zoomOut();
- void resetZoom();
-
- void forward();
- void backward();
-
- void print();
- void pageSetup();
- void printPreview();
-
- void setSource(const QUrl &url);
- void setSourceFromSearch(const QUrl &url);
void showTopicChooser(const QMap<QString, QUrl> &links, const QString &key);
-protected:
- void focusInEvent(QFocusEvent *event);
-
-signals:
- void sourceChanged(const QUrl &url);
- void forwardAvailable(bool available);
- void backwardAvailable(bool available);
-
-private slots:
- void highlightSearchTerms();
- void printPreview(QPrinter *printer);
- void handleSourceChanged(const QUrl &url);
-
-private:
- void initPrinter();
- void connectSignals(HelpViewer *page);
- bool eventFilter(QObject *object, QEvent *e);
-
-private:
- QPrinter *printer;
- QStackedWidget *m_stackedWidget;
};
- } // namespace Internal
+} // namespace Internal
} // namespace Help
#endif // CENTRALWIDGET_H
diff --git a/src/plugins/help/generalsettingspage.cpp b/src/plugins/help/generalsettingspage.cpp
index f60a65dbe6..ddebe0714b 100644
--- a/src/plugins/help/generalsettingspage.cpp
+++ b/src/plugins/help/generalsettingspage.cpp
@@ -110,7 +110,7 @@ QWidget *GeneralSettingsPage::widget()
connect(m_ui->blankPageButton, SIGNAL(clicked()), this, SLOT(setBlankPage()));
connect(m_ui->defaultPageButton, SIGNAL(clicked()), this, SLOT(setDefaultPage()));
- HelpViewer *viewer = CentralWidget::instance()->currentHelpViewer();
+ HelpViewer *viewer = CentralWidget::instance()->currentViewer();
if (!viewer)
m_ui->currentPageButton->setEnabled(false);
@@ -197,7 +197,7 @@ void GeneralSettingsPage::apply()
void GeneralSettingsPage::setCurrentPage()
{
- HelpViewer *viewer = CentralWidget::instance()->currentHelpViewer();
+ HelpViewer *viewer = CentralWidget::instance()->currentViewer();
if (viewer)
m_ui->homePageLineEdit->setText(viewer->source().toString());
}
diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp
index b7a8c007bf..1bc33d7a29 100644
--- a/src/plugins/help/helpplugin.cpp
+++ b/src/plugins/help/helpplugin.cpp
@@ -107,18 +107,6 @@ static const char kExternalWindowStateKey[] = "Help/ExternalWindowState";
using namespace Core;
-static QToolButton *toolButton(Core::Command *cmd, QAction *action)
-{
- QToolButton *button = new QToolButton;
- button->setDefaultAction(action);
- button->setPopupMode(QToolButton::DelayedPopup);
- action->setToolTip(cmd->stringWithAppendedShortcut(action->text()));
- QObject::connect(cmd, &Core::Command::keySequenceChanged, action, [cmd, action]() {
- action->setToolTip(cmd->stringWithAppendedShortcut(action->text()));
- });
- return button;
-}
-
HelpPlugin::HelpPlugin()
: m_mode(0),
m_centralWidget(0),
@@ -131,8 +119,6 @@ HelpPlugin::HelpPlugin()
m_firstModeChange(true),
m_helpManager(0),
m_openPagesManager(0),
- m_backMenu(0),
- m_nextMenu(0),
m_isSidebarVisible(true)
{
}
@@ -175,9 +161,15 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
addAutoReleasedObject(m_generalSettingsPage = new GeneralSettingsPage());
addAutoReleasedObject(m_searchTaskHandler = new SearchTaskHandler);
+ m_centralWidget = new Help::Internal::CentralWidget(modecontext);
+ connect(m_centralWidget, SIGNAL(sourceChanged(QUrl)), this,
+ SLOT(updateSideBarSource(QUrl)));
+ connect(m_centralWidget, &CentralWidget::closeButtonClicked,
+ &OpenPagesManager::instance(), &OpenPagesManager::closeCurrentPage);
+
connect(m_generalSettingsPage, SIGNAL(fontChanged()), this,
SLOT(fontChanged()));
- connect(m_generalSettingsPage, SIGNAL(returnOnCloseChanged()), this,
+ connect(m_generalSettingsPage, SIGNAL(returnOnCloseChanged()), m_centralWidget,
SLOT(updateCloseButton()));
connect(HelpManager::instance(), SIGNAL(helpRequested(QUrl,Core::HelpManager::HelpViewerLocation)),
this, SLOT(handleHelpRequest(QUrl,Core::HelpManager::HelpViewerLocation)));
@@ -193,52 +185,9 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
connect(HelpManager::instance(), SIGNAL(setupFinished()), this,
SLOT(unregisterOldQtCreatorDocumentation()));
- auto helpButtonBar = new Utils::StyledBar;
- auto helpButtonLayout = new QHBoxLayout(helpButtonBar);
- helpButtonLayout->setMargin(0);
- helpButtonLayout->setSpacing(0);
-
m_splitter = new MiniSplitter;
Command *cmd;
- m_centralWidget = new Help::Internal::CentralWidget();
- connect(m_centralWidget, SIGNAL(sourceChanged(QUrl)), this,
- SLOT(updateSideBarSource(QUrl)));
- // Add Home, Previous and Next actions (used in the toolbar)
- QAction *action = new QAction(QIcon(QLatin1String(IMAGEPATH "home.png")),
- tr("Home"), this);
- cmd = ActionManager::registerAction(action, Constants::HELP_HOME, globalcontext);
- connect(action, SIGNAL(triggered()), m_centralWidget, SLOT(home()));
- helpButtonLayout->addWidget(toolButton(cmd, action));
-
- QAction *back = new QAction(QIcon(QLatin1String(IMAGEPATH "previous.png")),
- tr("Previous Page"), this);
- cmd = ActionManager::registerAction(back, Constants::HELP_PREVIOUS, modecontext);
- cmd->setDefaultKeySequence(QKeySequence::Back);
- back->setEnabled(m_centralWidget->isBackwardAvailable());
- connect(back, SIGNAL(triggered()), m_centralWidget, SLOT(backward()));
- connect(m_centralWidget, SIGNAL(backwardAvailable(bool)), back,
- SLOT(setEnabled(bool)));
- helpButtonLayout->addWidget(toolButton(cmd, back));
-
- QAction *next = new QAction(QIcon(QLatin1String(IMAGEPATH "next.png")), tr("Next Page"), this);
- cmd = ActionManager::registerAction(next, Constants::HELP_NEXT, modecontext);
- cmd->setDefaultKeySequence(QKeySequence::Forward);
- next->setEnabled(m_centralWidget->isForwardAvailable());
- connect(next, SIGNAL(triggered()), m_centralWidget, SLOT(forward()));
- connect(m_centralWidget, SIGNAL(forwardAvailable(bool)), next,
- SLOT(setEnabled(bool)));
- helpButtonLayout->addWidget(toolButton(cmd, next));
- helpButtonLayout->addWidget(new Utils::StyledSeparator(helpButtonBar));
-
- setupNavigationMenus(back, next, helpButtonBar);
-
- action = new QAction(QIcon(QLatin1String(IMAGEPATH "bookmark.png")),
- tr("Add Bookmark"), this);
- cmd = ActionManager::registerAction(action, Constants::HELP_BOOKMARK, modecontext);
- cmd->setDefaultKeySequence(QKeySequence(UseMacShortcuts ? tr("Meta+M") : tr("Ctrl+M")));
- connect(action, SIGNAL(triggered()), this, SLOT(addBookmark()));
- helpButtonLayout->addWidget(toolButton(cmd, action));
- helpButtonLayout->addWidget(new Utils::StyledSeparator(helpButtonBar));
+ QAction *action;
// Add Contents, Index, and Context menu items
action = new QAction(QIcon::fromTheme(QLatin1String("help-contents")),
@@ -268,34 +217,6 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_SUPPORT);
connect(action, SIGNAL(triggered()), this, SLOT(slotReportBug()));
- action = new QAction(this);
- ActionManager::registerAction(action, Core::Constants::PRINT, modecontext);
- connect(action, SIGNAL(triggered()), m_centralWidget, SLOT(print()));
-
- action = new QAction(this);
- cmd = ActionManager::registerAction(action, Core::Constants::COPY, modecontext);
- connect(action, SIGNAL(triggered()), m_centralWidget, SLOT(copy()));
- action->setText(cmd->action()->text());
- action->setIcon(cmd->action()->icon());
-
- if (ActionContainer *advancedMenu = ActionManager::actionContainer(Core::Constants::M_EDIT_ADVANCED)) {
- // reuse TextEditor constants to avoid a second pair of menu actions
- action = new QAction(tr("Increase Font Size"), this);
- cmd = ActionManager::registerAction(action, TextEditor::Constants::INCREASE_FONT_SIZE, modecontext);
- connect(action, SIGNAL(triggered()), m_centralWidget, SLOT(zoomIn()));
- advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
-
- action = new QAction(tr("Decrease Font Size"), this);
- cmd = ActionManager::registerAction(action, TextEditor::Constants::DECREASE_FONT_SIZE, modecontext);
- connect(action, SIGNAL(triggered()), m_centralWidget, SLOT(zoomOut()));
- advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
-
- action = new QAction(tr("Reset Font Size"), this);
- cmd = ActionManager::registerAction(action, TextEditor::Constants::RESET_FONT_SIZE, modecontext);
- connect(action, SIGNAL(triggered()), m_centralWidget, SLOT(resetZoom()));
- advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
- }
-
if (ActionContainer *windowMenu = ActionManager::actionContainer(Core::Constants::M_WINDOW)) {
// reuse EditorManager constants to avoid a second pair of menu actions
// Goto Previous In History Action
@@ -315,27 +236,7 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
SLOT(gotoNextPage()));
}
- QWidget *toolBarWidget = new QWidget;
- QHBoxLayout *toolBarLayout = new QHBoxLayout(toolBarWidget);
- toolBarLayout->setMargin(0);
- toolBarLayout->setSpacing(0);
- toolBarLayout->addWidget(helpButtonBar);
- toolBarLayout->addWidget(createWidgetToolBar());
-
- QWidget *mainWidget = new QWidget;
- m_splitter->addWidget(mainWidget);
- QVBoxLayout *mainWidgetLayout = new QVBoxLayout(mainWidget);
- mainWidgetLayout->setMargin(0);
- mainWidgetLayout->setSpacing(0);
- mainWidgetLayout->addWidget(toolBarWidget);
- mainWidgetLayout->addWidget(m_centralWidget);
-
- if (QLayout *layout = m_centralWidget->layout()) {
- layout->setSpacing(0);
- FindToolBarPlaceHolder *fth = new FindToolBarPlaceHolder(m_centralWidget);
- fth->setObjectName(QLatin1String("HelpFindToolBarPlaceHolder"));
- mainWidgetLayout->addWidget(fth);
- }
+ m_splitter->addWidget(m_centralWidget);
HelpIndexFilter *helpIndexFilter = new HelpIndexFilter();
addAutoReleasedObject(helpIndexFilter);
@@ -516,8 +417,9 @@ void HelpPlugin::resetFilter()
engine->setCustomValue(Help::Constants::PreviousFilterNameKey, filterName);
engine->setCurrentFilter(filterName);
- updateFilterComboBox();
- connect(engine, SIGNAL(setupFinished()), this, SLOT(updateFilterComboBox()));
+ LocalHelpManager::updateFilterModel();
+ connect(engine, &QHelpEngineCore::setupFinished,
+ LocalHelpManager::instance(), &LocalHelpManager::updateFilterModel);
}
void HelpPlugin::saveExternalWindowSettings()
@@ -647,7 +549,7 @@ void HelpPlugin::modeChanged(IMode *mode, IMode *old)
void HelpPlugin::updateSideBarSource()
{
- if (HelpViewer *viewer = m_centralWidget->currentHelpViewer()) {
+ if (HelpViewer *viewer = m_centralWidget->currentViewer()) {
const QUrl &url = viewer->source();
if (url.isValid())
updateSideBarSource(url);
@@ -660,14 +562,6 @@ void HelpPlugin::updateSideBarSource(const QUrl &newUrl)
m_rightPaneSideBarWidget->currentViewer()->setSource(newUrl);
}
-void HelpPlugin::updateCloseButton()
-{
- const bool closeOnReturn = HelpManager::customValue(QLatin1String("ReturnOnClose"),
- false).toBool();
- m_closeButton->setEnabled((OpenPagesManager::instance().pageCount() > 1)
- || closeOnReturn);
-}
-
void HelpPlugin::fontChanged()
{
if (!m_rightPaneSideBarWidget)
@@ -677,23 +571,8 @@ void HelpPlugin::fontChanged()
QFont font = fontSetting.isValid() ? fontSetting.value<QFont>()
: m_rightPaneSideBarWidget->currentViewer()->viewerFont();
- m_rightPaneSideBarWidget->currentViewer()->setViewerFont(font);
- const int count = OpenPagesManager::instance().pageCount();
- for (int i = 0; i < count; ++i) {
- if (HelpViewer *viewer = CentralWidget::instance()->viewerAt(i))
- viewer->setViewerFont(font);
- }
-}
-
-QStackedLayout * layoutForWidget(QWidget *parent, QWidget *widget)
-{
- QList<QStackedLayout*> list = parent->findChildren<QStackedLayout*>();
- foreach (QStackedLayout *layout, list) {
- const int index = layout->indexOf(widget);
- if (index >= 0)
- return layout;
- }
- return 0;
+ m_rightPaneSideBarWidget->setViewerFont(font);
+ CentralWidget::instance()->setViewerFont(font);
}
void HelpPlugin::setupHelpEngineIfNeeded()
@@ -743,7 +622,7 @@ HelpViewer *HelpPlugin::viewerForHelpViewerLocation(Core::HelpManager::HelpViewe
QTC_CHECK(actualLocation == Core::HelpManager::HelpModeAlways);
activateHelpMode(); // should trigger an createPage...
- HelpViewer *viewer = m_centralWidget->currentHelpViewer();
+ HelpViewer *viewer = m_centralWidget->currentViewer();
if (!viewer)
viewer = OpenPagesManager::instance().createPage();
return viewer;
@@ -850,69 +729,6 @@ void HelpPlugin::activateBookmarks()
m_sideBar->activateItem(m_bookmarkItem);
}
-Utils::StyledBar *HelpPlugin::createWidgetToolBar()
-{
- m_filterComboBox = new QComboBox;
- m_filterComboBox->setMinimumContentsLength(15);
- connect(m_filterComboBox, SIGNAL(activated(QString)), this,
- SLOT(filterDocumentation(QString)));
- connect(m_filterComboBox, SIGNAL(currentIndexChanged(int)), this,
- SLOT(updateSideBarSource()));
-
- m_closeButton = new QToolButton();
- m_closeButton->setIcon(QIcon(QLatin1String(Core::Constants::ICON_BUTTON_CLOSE)));
- m_closeButton->setToolTip(tr("Close current page"));
- connect(m_closeButton, SIGNAL(clicked()), &OpenPagesManager::instance(),
- SLOT(closeCurrentPage()));
- connect(&OpenPagesManager::instance(), SIGNAL(pagesChanged()), this,
- SLOT(updateCloseButton()));
-
- Utils::StyledBar *toolBar = new Utils::StyledBar;
-
- QHBoxLayout *layout = new QHBoxLayout(toolBar);
- layout->setMargin(0);
- layout->setSpacing(0);
- layout->addWidget(OpenPagesManager::instance().openPagesComboBox(), 10);
- layout->addSpacing(5);
- layout->addWidget(new QLabel(tr("Filtered by:")));
- layout->addWidget(m_filterComboBox);
- layout->addStretch();
- layout->addWidget(m_closeButton);
-
- return toolBar;
-}
-
-void HelpPlugin::updateFilterComboBox()
-{
- const QHelpEngine &engine = LocalHelpManager::helpEngine();
- QString curFilter = m_filterComboBox->currentText();
- if (curFilter.isEmpty())
- curFilter = engine.currentFilter();
- m_filterComboBox->clear();
- m_filterComboBox->addItems(engine.customFilters());
- int idx = m_filterComboBox->findText(curFilter);
- if (idx < 0)
- idx = 0;
- m_filterComboBox->setCurrentIndex(idx);
-}
-
-void HelpPlugin::filterDocumentation(const QString &customFilter)
-{
- LocalHelpManager::helpEngine().setCurrentFilter(customFilter);
-}
-
-void HelpPlugin::addBookmark()
-{
- HelpViewer *viewer = m_centralWidget->currentHelpViewer();
-
- const QString &url = viewer->source().toString();
- if (url.isEmpty() || url == Help::Constants::AboutBlank)
- return;
-
- BookmarkManager *manager = &LocalHelpManager::bookmarkManager();
- manager->showBookmarkDialog(m_centralWidget, viewer->title(), url);
-}
-
void HelpPlugin::highlightSearchTermsInContextHelp()
{
if (m_contextHelpHighlightId.isEmpty())
@@ -950,20 +766,6 @@ void HelpPlugin::handleHelpRequest(const QUrl &url, Core::HelpManager::HelpViewe
Core::ICore::raiseWindow(viewer);
}
-void HelpPlugin::slotAboutToShowBackMenu()
-{
- m_backMenu->clear();
- if (HelpViewer *viewer = m_centralWidget->currentHelpViewer())
- viewer->addBackHistoryItems(m_backMenu);
-}
-
-void HelpPlugin::slotAboutToShowNextMenu()
-{
- m_nextMenu->clear();
- if (HelpViewer *viewer = m_centralWidget->currentHelpViewer())
- viewer->addForwardHistoryItems(m_nextMenu);
-}
-
void HelpPlugin::slotOpenSupportPage()
{
switchToHelpMode(QUrl(QLatin1String("qthelp://org.qt-project.qtcreator/doc/technical-support.html")));
@@ -1005,21 +807,3 @@ Core::HelpManager::HelpViewerLocation HelpPlugin::contextHelpOption() const
return Core::HelpManager::HelpViewerLocation(engine.customValue(QLatin1String("ContextHelpOption"),
Core::HelpManager::SideBySideIfPossible).toInt());
}
-
-void HelpPlugin::setupNavigationMenus(QAction *back, QAction *next, QWidget *parent)
-{
- if (!m_backMenu) {
- m_backMenu = new QMenu(parent);
- connect(m_backMenu, SIGNAL(aboutToShow()), this,
- SLOT(slotAboutToShowBackMenu()));
- }
-
- if (!m_nextMenu) {
- m_nextMenu = new QMenu(parent);
- connect(m_nextMenu, SIGNAL(aboutToShow()), this,
- SLOT(slotAboutToShowNextMenu()));
- }
-
- back->setMenu(m_backMenu);
- next->setMenu(m_nextMenu);
-}
diff --git a/src/plugins/help/helpplugin.h b/src/plugins/help/helpplugin.h
index 17b8abd286..a0e7d644f1 100644
--- a/src/plugins/help/helpplugin.h
+++ b/src/plugins/help/helpplugin.h
@@ -41,7 +41,6 @@
QT_BEGIN_NAMESPACE
class QAction;
-class QComboBox;
class QMenu;
class QToolButton;
class QUrl;
@@ -96,10 +95,6 @@ private slots:
void activateOpenPages();
void activateBookmarks();
- void addBookmark();
- void updateFilterComboBox();
- void filterDocumentation(const QString &customFilter);
-
void saveExternalWindowSettings();
void switchToHelpMode(const QUrl &source);
void slotHideRightPane();
@@ -110,14 +105,11 @@ private slots:
void fontChanged();
- void updateCloseButton();
void setupHelpEngineIfNeeded();
void highlightSearchTermsInContextHelp();
void handleHelpRequest(const QUrl &url, Core::HelpManager::HelpViewerLocation location);
- void slotAboutToShowBackMenu();
- void slotAboutToShowNextMenu();
void slotOpenSupportPage();
void slotReportBug();
@@ -127,7 +119,6 @@ private:
void setupUi();
void resetFilter();
void activateHelpMode();
- Utils::StyledBar *createWidgetToolBar();
bool canShowHelpSideBySide() const;
HelpViewer *viewerForHelpViewerLocation(Core::HelpManager::HelpViewerLocation location);
HelpViewer *viewerForContextHelp();
@@ -137,7 +128,6 @@ private:
void doSetupIfNeeded();
Core::HelpManager::HelpViewerLocation contextHelpOption() const;
- void setupNavigationMenus(QAction *back, QAction *next, QWidget *parent);
private:
HelpMode *m_mode;
@@ -155,7 +145,6 @@ private:
GeneralSettingsPage *m_generalSettingsPage;
SearchTaskHandler *m_searchTaskHandler;
- QComboBox *m_filterComboBox;
Core::SideBar *m_sideBar;
bool m_firstModeChange;
@@ -163,16 +152,11 @@ private:
OpenPagesManager *m_openPagesManager;
Core::MiniSplitter *m_splitter;
- QToolButton *m_closeButton;
-
QString m_contextHelpHighlightId;
QPointer<HelpWidget> m_externalWindow;
QRect m_externalWindowState;
- QMenu *m_backMenu;
- QMenu *m_nextMenu;
-
bool m_isSidebarVisible;
QAction *m_toggleSideBarAction;
};
diff --git a/src/plugins/help/helpwidget.cpp b/src/plugins/help/helpwidget.cpp
index 53b2bebbcc..83ed2558f3 100644
--- a/src/plugins/help/helpwidget.cpp
+++ b/src/plugins/help/helpwidget.cpp
@@ -34,18 +34,26 @@
#include "helpplugin.h"
#include "helpviewer.h"
#include "localhelpmanager.h"
+#include "openpagesmanager.h"
#include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/coreconstants.h>
#include <coreplugin/icore.h>
#include <coreplugin/findplaceholder.h>
+#include <coreplugin/helpmanager.h>
#include <texteditor/texteditorconstants.h>
#include <utils/qtcassert.h>
#include <utils/styledbar.h>
#include <QHBoxLayout>
+#include <QHelpEngine>
+#include <QHelpSearchEngine>
+#include <QHelpSearchQuery>
#include <QMenu>
+#include <QPrinter>
+#include <QPrintDialog>
+#include <QStackedWidget>
#include <QToolButton>
static QToolButton *toolButton(QAction *action, Core::Command *cmd = 0)
@@ -67,10 +75,14 @@ namespace Internal {
HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget *parent) :
QWidget(parent),
+ m_style(style),
+ m_switchToHelp(0),
+ m_filterComboBox(0),
+ m_closeAction(0),
m_scaleUp(0),
m_scaleDown(0),
m_resetScale(0),
- m_style(style)
+ m_printer(0)
{
Utils::StyledBar *toolBar = new Utils::StyledBar();
QHBoxLayout *layout = new QHBoxLayout(toolBar);
@@ -78,10 +90,12 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
layout->setMargin(0);
Core::Command *cmd;
- m_switchToHelp = new QAction(tr("Go to Help Mode"), toolBar);
- cmd = Core::ActionManager::registerAction(m_switchToHelp, Constants::CONTEXT_HELP, context);
- connect(m_switchToHelp, SIGNAL(triggered()), this, SLOT(helpModeButtonClicked()));
- layout->addWidget(toolButton(m_switchToHelp, cmd));
+ if (style != ModeWidget) {
+ m_switchToHelp = new QAction(tr("Go to Help Mode"), toolBar);
+ cmd = Core::ActionManager::registerAction(m_switchToHelp, Constants::CONTEXT_HELP, context);
+ connect(m_switchToHelp, SIGNAL(triggered()), this, SLOT(helpModeButtonClicked()));
+ layout->addWidget(toolButton(m_switchToHelp, cmd));
+ }
m_homeAction = new QAction(QIcon(QLatin1String(":/help/images/home.png")),
tr("Home"), this);
@@ -91,6 +105,7 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
m_backAction = new QAction(QIcon(QLatin1String(":/help/images/previous.png")),
tr("Back"), toolBar);
+ connect(m_backAction, &QAction::triggered, this, &HelpWidget::backward);
m_backMenu = new QMenu(toolBar);
connect(m_backMenu, SIGNAL(aboutToShow()), this, SLOT(updateBackMenu()));
m_backAction->setMenu(m_backMenu);
@@ -100,6 +115,7 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
m_forwardAction = new QAction(QIcon(QLatin1String(":/help/images/next.png")),
tr("Forward"), toolBar);
+ connect(m_forwardAction, &QAction::triggered, this, &HelpWidget::forward);
m_forwardMenu = new QMenu(toolBar);
connect(m_forwardMenu, SIGNAL(aboutToShow()), this, SLOT(updateForwardMenu()));
m_forwardAction->setMenu(m_forwardMenu);
@@ -115,38 +131,45 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
layout->addWidget(new Utils::StyledSeparator(toolBar));
layout->addWidget(toolButton(m_addBookmarkAction, cmd));
+ if (style == ModeWidget) {
+ layout->addWidget(new Utils::StyledSeparator(toolBar));
+ layout->addWidget(OpenPagesManager::instance().openPagesComboBox(), 10);
+ m_filterComboBox = new QComboBox;
+ m_filterComboBox->setMinimumContentsLength(15);
+ m_filterComboBox->setModel(LocalHelpManager::filterModel());
+ layout->addWidget(m_filterComboBox);
+ connect(m_filterComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated),
+ LocalHelpManager::instance(), &LocalHelpManager::setFilterIndex);
+ connect(LocalHelpManager::instance(), &LocalHelpManager::filterIndexChanged,
+ m_filterComboBox, &QComboBox::setCurrentIndex);
+ }
+
layout->addStretch();
- m_viewer = HelpPlugin::createHelpViewer(qreal(0.0));
+ m_viewerStack = new QStackedWidget;
QVBoxLayout *vLayout = new QVBoxLayout(this);
vLayout->setMargin(0);
vLayout->setSpacing(0);
vLayout->addWidget(toolBar);
- vLayout->addWidget(m_viewer);
+ vLayout->addWidget(m_viewerStack);
Core::FindToolBarPlaceHolder *fth = new Core::FindToolBarPlaceHolder(this);
vLayout->addWidget(fth);
- setFocusProxy(m_viewer);
+ setFocusProxy(m_viewerStack);
m_context = new Core::IContext(this);
m_context->setContext(context);
- m_context->setWidget(m_viewer);
+ m_context->setWidget(m_viewerStack);
Core::ICore::addContextObject(m_context);
- m_backAction->setEnabled(m_viewer->isBackwardAvailable());
- connect(m_backAction, SIGNAL(triggered()), m_viewer, SLOT(backward()));
- connect(m_viewer, SIGNAL(backwardAvailable(bool)), m_backAction,
- SLOT(setEnabled(bool)));
-
- m_forwardAction->setEnabled(m_viewer->isForwardAvailable());
- connect(m_forwardAction, SIGNAL(triggered()), m_viewer, SLOT(forward()));
- connect(m_viewer, SIGNAL(forwardAvailable(bool)), m_forwardAction,
- SLOT(setEnabled(bool)));
+ m_printAction = new QAction(this);
+ Core::ActionManager::registerAction(m_printAction, Core::Constants::PRINT, context);
+ connect(m_printAction, &QAction::triggered, this, [this]() { print(currentViewer()); });
m_copy = new QAction(this);
Core::ActionManager::registerAction(m_copy, Core::Constants::COPY, context);
- connect(m_copy, SIGNAL(triggered()), m_viewer, SLOT(copy()));
+ connect(m_copy, &QAction::triggered, this, &HelpWidget::copy);
Core::ActionContainer *advancedMenu = Core::ActionManager::actionContainer(Core::Constants::M_EDIT_ADVANCED);
QTC_CHECK(advancedMenu);
@@ -155,37 +178,44 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
m_scaleUp = new QAction(tr("Increase Font Size"), this);
cmd = Core::ActionManager::registerAction(m_scaleUp, TextEditor::Constants::INCREASE_FONT_SIZE,
context);
- connect(m_scaleUp, SIGNAL(triggered()), m_viewer, SLOT(scaleUp()));
+ connect(m_scaleUp, &QAction::triggered, this, &HelpWidget::scaleUp);
advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
m_scaleDown = new QAction(tr("Decrease Font Size"), this);
cmd = Core::ActionManager::registerAction(m_scaleDown, TextEditor::Constants::DECREASE_FONT_SIZE,
context);
- connect(m_scaleDown, SIGNAL(triggered()), m_viewer, SLOT(scaleDown()));
+ connect(m_scaleDown, &QAction::triggered, this, &HelpWidget::scaleDown);
advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
m_resetScale = new QAction(tr("Reset Font Size"), this);
cmd = Core::ActionManager::registerAction(m_resetScale, TextEditor::Constants::RESET_FONT_SIZE,
context);
- connect(m_resetScale, SIGNAL(triggered()), m_viewer, SLOT(resetScale()));
+ connect(m_resetScale, &QAction::triggered, this, &HelpWidget::resetScale);
advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
}
- if (style == SideBarWidget) {
- QAction *close = new QAction(QIcon(QLatin1String(Core::Constants::ICON_BUTTON_CLOSE)),
+ if (style == ModeWidget) {
+ m_closeAction = new QAction(QIcon(QLatin1String(Core::Constants::ICON_BUTTON_CLOSE)),
+ QString(), toolBar);
+ connect(m_closeAction, SIGNAL(triggered()), this, SIGNAL(closeButtonClicked()));
+ layout->addWidget(toolButton(m_closeAction));
+ } else if (style == SideBarWidget) {
+ m_closeAction = new QAction(QIcon(QLatin1String(Core::Constants::ICON_BUTTON_CLOSE)),
QString(), toolBar);
- connect(close, SIGNAL(triggered()), this, SIGNAL(closeButtonClicked()));
- layout->addWidget(toolButton(close));
- m_viewer->setOpenInNewPageActionVisible(false);
+ connect(m_closeAction, SIGNAL(triggered()), this, SIGNAL(closeButtonClicked()));
+ layout->addWidget(toolButton(m_closeAction));
} else if (style == ExternalWindow) {
static int windowId = 0;
Core::ICore::registerWindow(this,
Core::Context(Core::Id("Help.Window.").withSuffix(++windowId)));
setAttribute(Qt::WA_DeleteOnClose);
setAttribute(Qt::WA_QuitOnClose, false); // don't prevent Qt Creator from closing
- connect(m_viewer, SIGNAL(titleChanged()), this, SLOT(updateWindowTitle()));
- updateWindowTitle();
- m_viewer->setOpenInNewPageActionVisible(false);
+ }
+
+ if (style != ModeWidget) {
+ HelpViewer *viewer = HelpPlugin::createHelpViewer(qreal(0.0));
+ addViewer(viewer);
+ setCurrentViewer(viewer);
}
}
@@ -193,7 +223,8 @@ HelpWidget::~HelpWidget()
{
Core::ICore::removeContextObject(m_context);
Core::ActionManager::unregisterAction(m_copy, Core::Constants::COPY);
- Core::ActionManager::unregisterAction(m_switchToHelp, Constants::CONTEXT_HELP);
+ if (m_switchToHelp)
+ Core::ActionManager::unregisterAction(m_switchToHelp, Constants::CONTEXT_HELP);
Core::ActionManager::unregisterAction(m_homeAction, Constants::HELP_HOME);
Core::ActionManager::unregisterAction(m_forwardAction, Constants::HELP_NEXT);
Core::ActionManager::unregisterAction(m_backAction, Constants::HELP_PREVIOUS);
@@ -208,7 +239,100 @@ HelpWidget::~HelpWidget()
HelpViewer *HelpWidget::currentViewer() const
{
- return m_viewer;
+ return qobject_cast<HelpViewer *>(m_viewerStack->currentWidget());
+}
+
+void HelpWidget::setCurrentViewer(HelpViewer *viewer)
+{
+ m_viewerStack->setCurrentWidget(viewer);
+ m_backAction->setEnabled(viewer->isBackwardAvailable());
+ m_forwardAction->setEnabled(viewer->isForwardAvailable());
+ if (m_style == ExternalWindow)
+ updateWindowTitle();
+ emit sourceChanged(viewer->source());
+}
+
+int HelpWidget::currentIndex() const
+{
+ return m_viewerStack->currentIndex();
+}
+
+void HelpWidget::addViewer(HelpViewer *viewer, bool highlightSearchTerms)
+{
+ m_viewerStack->addWidget(viewer);
+ viewer->setFocus(Qt::OtherFocusReason);
+ if (m_style == SideBarWidget || m_style == ExternalWindow)
+ viewer->setOpenInNewPageActionVisible(false);
+ connect(viewer, &HelpViewer::sourceChanged, this, [viewer, this](const QUrl &url) {
+ if (currentViewer() == viewer)
+ emit sourceChanged(url);
+ });
+ connect(viewer, &HelpViewer::forwardAvailable, this, [viewer, this](bool available) {
+ if (currentViewer() == viewer)
+ m_forwardAction->setEnabled(available);
+ });
+ connect(viewer, &HelpViewer::backwardAvailable, this, [viewer, this](bool available) {
+ if (currentViewer() == viewer)
+ m_backAction->setEnabled(available);
+ });
+ connect(viewer, &HelpViewer::printRequested, this, [viewer, this]() {
+ print(viewer);
+ });
+ if (m_style == ExternalWindow)
+ connect(viewer, SIGNAL(titleChanged()), this, SLOT(updateWindowTitle()));
+
+ if (highlightSearchTerms)
+ connect(viewer, &HelpViewer::loadFinished, this, &HelpWidget::highlightSearchTerms);
+
+ updateCloseButton();
+}
+
+void HelpWidget::removeViewerAt(int index)
+{
+ QWidget *viewerWidget = m_viewerStack->widget(index);
+ QTC_ASSERT(viewerWidget, return);
+ m_viewerStack->removeWidget(viewerWidget);
+ // do not delete, that is done in the model
+ // delete viewerWidget;
+ if (m_viewerStack->currentWidget())
+ setCurrentViewer(qobject_cast<HelpViewer *>(m_viewerStack->currentWidget()));
+ updateCloseButton();
+}
+
+void HelpWidget::setViewerFont(const QFont &font)
+{
+ for (int i = 0; i < m_viewerStack->count(); ++i) {
+ HelpViewer *viewer = qobject_cast<HelpViewer *>(m_viewerStack->widget(i));
+ QTC_ASSERT(viewer, continue);
+ viewer->setFont(font);
+ }
+}
+
+int HelpWidget::viewerCount() const
+{
+ return m_viewerStack->count();
+}
+
+HelpViewer *HelpWidget::viewerAt(int index) const
+{
+ return qobject_cast<HelpViewer *>(m_viewerStack->widget(index));
+}
+
+void HelpWidget::setSource(const QUrl &url)
+{
+ HelpViewer* viewer = currentViewer();
+ QTC_ASSERT(viewer, return);
+ viewer->setSource(url);
+ viewer->setFocus(Qt::OtherFocusReason);
+}
+
+void HelpWidget::setSourceFromSearch(const QUrl &url)
+{
+ HelpViewer* viewer = currentViewer();
+ QTC_ASSERT(viewer, return);
+ connect(viewer, &HelpViewer::loadFinished, this, &HelpWidget::highlightSearchTerms);
+ viewer->setSource(url);
+ viewer->setFocus(Qt::OtherFocusReason);
}
void HelpWidget::closeEvent(QCloseEvent *)
@@ -219,18 +343,21 @@ void HelpWidget::closeEvent(QCloseEvent *)
void HelpWidget::updateBackMenu()
{
m_backMenu->clear();
- m_viewer->addBackHistoryItems(m_backMenu);
+ QTC_ASSERT(currentViewer(), return);
+ currentViewer()->addBackHistoryItems(m_backMenu);
}
void HelpWidget::updateForwardMenu()
{
m_forwardMenu->clear();
- m_viewer->addForwardHistoryItems(m_forwardMenu);
+ QTC_ASSERT(currentViewer(), return);
+ currentViewer()->addForwardHistoryItems(m_forwardMenu);
}
void HelpWidget::updateWindowTitle()
{
- const QString pageTitle = m_viewer->title();
+ QTC_ASSERT(currentViewer(), return);
+ const QString pageTitle = currentViewer()->title();
if (pageTitle.isEmpty())
setWindowTitle(tr("Help"));
else
@@ -239,11 +366,21 @@ void HelpWidget::updateWindowTitle()
void HelpWidget::helpModeButtonClicked()
{
- emit openHelpMode(m_viewer->source());
+ QTC_ASSERT(currentViewer(), return);
+ emit openHelpMode(currentViewer()->source());
if (m_style == ExternalWindow)
close();
}
+void HelpWidget::updateCloseButton()
+{
+ if (m_style == ModeWidget) {
+ const bool closeOnReturn = Core::HelpManager::customValue(QLatin1String("ReturnOnClose"),
+ false).toBool();
+ m_closeAction->setEnabled(closeOnReturn || m_viewerStack->count() > 1);
+ }
+}
+
void HelpWidget::goHome()
{
if (HelpViewer *viewer = currentViewer())
@@ -263,5 +400,84 @@ void HelpWidget::addBookmark()
manager->showBookmarkDialog(this, viewer->title(), url);
}
+void HelpWidget::copy()
+{
+ QTC_ASSERT(currentViewer(), return);
+ currentViewer()->copy();
+}
+
+void HelpWidget::forward()
+{
+ QTC_ASSERT(currentViewer(), return);
+ currentViewer()->forward();
+}
+
+void HelpWidget::backward()
+{
+ QTC_ASSERT(currentViewer(), return);
+ currentViewer()->backward();
+}
+
+void HelpWidget::scaleUp()
+{
+ QTC_ASSERT(currentViewer(), return);
+ currentViewer()->scaleUp();
+}
+
+void HelpWidget::scaleDown()
+{
+ QTC_ASSERT(currentViewer(), return);
+ currentViewer()->scaleDown();
+}
+
+void HelpWidget::resetScale()
+{
+ QTC_ASSERT(currentViewer(), return);
+ currentViewer()->resetScale();
+}
+
+void HelpWidget::print(HelpViewer *viewer)
+{
+ QTC_ASSERT(viewer, return);
+ if (!m_printer)
+ m_printer = new QPrinter(QPrinter::HighResolution);
+ QPrintDialog dlg(m_printer, this);
+ dlg.setWindowTitle(tr("Print Documentation"));
+ if (!viewer->selectedText().isEmpty())
+ dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);
+ dlg.addEnabledOption(QAbstractPrintDialog::PrintPageRange);
+ dlg.addEnabledOption(QAbstractPrintDialog::PrintCollateCopies);
+
+ if (dlg.exec() == QDialog::Accepted)
+ viewer->print(m_printer);
+}
+
+void HelpWidget::highlightSearchTerms()
+{
+ if (HelpViewer *viewer = qobject_cast<HelpViewer *>(sender())) {
+ QHelpSearchEngine *searchEngine =
+ LocalHelpManager::helpEngine().searchEngine();
+ QList<QHelpSearchQuery> queryList = searchEngine->query();
+
+ QStringList terms;
+ foreach (const QHelpSearchQuery &query, queryList) {
+ switch (query.fieldName) {
+ default: break;
+ case QHelpSearchQuery::ALL: {
+ case QHelpSearchQuery::PHRASE:
+ case QHelpSearchQuery::DEFAULT:
+ case QHelpSearchQuery::ATLEAST:
+ foreach (QString term, query.wordList)
+ terms.append(term.remove(QLatin1Char('"')));
+ }
+ }
+ }
+
+ foreach (const QString& term, terms)
+ viewer->findText(term, 0, false, true);
+ disconnect(viewer, &HelpViewer::loadFinished, this, &HelpWidget::highlightSearchTerms);
+ }
+}
+
} // Internal
} // Help
diff --git a/src/plugins/help/helpwidget.h b/src/plugins/help/helpwidget.h
index 12788746f7..bd00034881 100644
--- a/src/plugins/help/helpwidget.h
+++ b/src/plugins/help/helpwidget.h
@@ -37,7 +37,11 @@
QT_BEGIN_NAMESPACE
class QAction;
+class QComboBox;
+class QFont;
class QMenu;
+class QPrinter;
+class QStackedWidget;
QT_END_NAMESPACE
namespace Help {
@@ -50,6 +54,7 @@ class HelpWidget : public QWidget
Q_OBJECT
public:
enum WidgetStyle {
+ ModeWidget,
SideBarWidget,
ExternalWindow
};
@@ -58,6 +63,21 @@ public:
~HelpWidget();
HelpViewer *currentViewer() const;
+ void setCurrentViewer(HelpViewer *viewer);
+ int currentIndex() const;
+ void addViewer(HelpViewer *viewer, bool highlightSearchTerms = false);
+ void removeViewerAt(int index);
+
+ void setViewerFont(const QFont &font);
+
+ // so central widget can save the state
+ int viewerCount() const;
+ HelpViewer *viewerAt(int index) const;
+
+public slots:
+ void setSource(const QUrl &url);
+ void setSourceFromSearch(const QUrl &url);
+ void updateCloseButton();
protected:
void closeEvent(QCloseEvent *);
@@ -66,17 +86,29 @@ signals:
void openHelpMode(const QUrl &url);
void closeButtonClicked();
void aboutToClose();
+ void sourceChanged(const QUrl &url);
+ void filterActivated(const QString &name);
private slots:
void updateBackMenu();
void updateForwardMenu();
void updateWindowTitle();
void helpModeButtonClicked();
+
+private:
void goHome();
void addBookmark();
+ void copy();
+ void forward();
+ void backward();
+ void scaleUp();
+ void scaleDown();
+ void resetScale();
+ void print(HelpViewer *viewer);
+ void highlightSearchTerms();
-private:
Core::IContext *m_context;
+ WidgetStyle m_style;
QAction *m_switchToHelp;
QAction *m_homeAction;
QMenu *m_backMenu;
@@ -84,13 +116,16 @@ private:
QAction *m_backAction;
QAction *m_forwardAction;
QAction *m_addBookmarkAction;
+ QComboBox *m_filterComboBox;
+ QAction *m_closeAction;
QAction *m_scaleUp;
QAction *m_scaleDown;
QAction *m_resetScale;
+ QAction *m_printAction;
QAction *m_copy;
- HelpViewer *m_viewer;
- WidgetStyle m_style;
+ QStackedWidget *m_viewerStack;
+ QPrinter *m_printer;
};
} // Internal
diff --git a/src/plugins/help/localhelpmanager.cpp b/src/plugins/help/localhelpmanager.cpp
index d99cdce10a..80b0fcd293 100644
--- a/src/plugins/help/localhelpmanager.cpp
+++ b/src/plugins/help/localhelpmanager.cpp
@@ -35,6 +35,7 @@
#include <app/app_version.h>
#include <coreplugin/helpmanager.h>
+#include <utils/qtcassert.h>
#include <QMutexLocker>
@@ -50,6 +51,10 @@ QHelpEngine* LocalHelpManager::m_guiEngine = 0;
QMutex LocalHelpManager::m_bkmarkMutex;
BookmarkManager* LocalHelpManager::m_bookmarkManager = 0;
+QStandardItemModel *LocalHelpManager::m_filterModel = 0;
+QString LocalHelpManager::m_currentFilter = QString();
+int LocalHelpManager::m_currentFilterIndex = -1;
+
LocalHelpManager::LocalHelpManager(QObject *parent)
: QObject(parent)
, m_guiNeedsSetup(true)
@@ -57,6 +62,7 @@ LocalHelpManager::LocalHelpManager(QObject *parent)
{
m_instance = this;
qRegisterMetaType<Help::Internal::LocalHelpManager::HelpData>("Help::Internal::LocalHelpManager::HelpData");
+ m_filterModel = new QStandardItemModel(this);
}
LocalHelpManager::~LocalHelpManager()
@@ -227,3 +233,47 @@ LocalHelpManager::HelpData LocalHelpManager::helpData(const QUrl &url)
}
return data;
}
+
+QAbstractItemModel *LocalHelpManager::filterModel()
+{
+ return m_filterModel;
+}
+
+void LocalHelpManager::setFilterIndex(int index)
+{
+ if (index == m_currentFilterIndex)
+ return;
+ m_currentFilterIndex = index;
+ QStandardItem *item = m_filterModel->item(index);
+ if (!item) {
+ helpEngine().setCurrentFilter(QString());
+ return;
+ }
+ helpEngine().setCurrentFilter(item->text());
+ emit m_instance->filterIndexChanged(m_currentFilterIndex);
+}
+
+void LocalHelpManager::updateFilterModel()
+{
+ const QHelpEngine &engine = helpEngine();
+ if (m_currentFilter.isEmpty())
+ m_currentFilter = engine.currentFilter();
+ m_filterModel->clear();
+ m_currentFilterIndex = -1;
+ int count = 0;
+ const QStringList &filters = engine.customFilters();
+ foreach (const QString &filterString, filters) {
+ m_filterModel->appendRow(new QStandardItem(filterString));
+ if (filterString == m_currentFilter)
+ m_currentFilterIndex = count;
+ count++;
+ }
+
+ if (filters.size() < 1)
+ return;
+ if (m_currentFilterIndex < 0) {
+ m_currentFilterIndex = 0;
+ m_currentFilter = filters.at(0);
+ }
+ emit m_instance->filterIndexChanged(m_currentFilterIndex);
+}
diff --git a/src/plugins/help/localhelpmanager.h b/src/plugins/help/localhelpmanager.h
index 2f84c39c44..f1eefe42dd 100644
--- a/src/plugins/help/localhelpmanager.h
+++ b/src/plugins/help/localhelpmanager.h
@@ -30,10 +30,11 @@
#ifndef LOCALHELPMANAGER_H
#define LOCALHELPMANAGER_H
+#include <QMetaType>
#include <QMutex>
#include <QObject>
#include <QUrl>
-#include <QMetaType>
+#include <QStandardItemModel>
QT_FORWARD_DECLARE_CLASS(QHelpEngine)
@@ -70,10 +71,22 @@ public:
static QByteArray loadErrorMessage(const QUrl &url, const QString &errorString);
Q_INVOKABLE static Help::Internal::LocalHelpManager::HelpData helpData(const QUrl &url);
+ static QAbstractItemModel *filterModel();
+ static void setFilterIndex(int index);
+
+ static void updateFilterModel();
+
+signals:
+ void filterIndexChanged(int index);
+
private:
bool m_guiNeedsSetup;
bool m_needsCollectionFile;
+ static QStandardItemModel *m_filterModel;
+ static QString m_currentFilter;
+ static int m_currentFilterIndex;
+
static QMutex m_guiMutex;
static QHelpEngine *m_guiEngine;
diff --git a/src/plugins/help/openpagesmanager.cpp b/src/plugins/help/openpagesmanager.cpp
index 2a55055af7..019c9dd613 100644
--- a/src/plugins/help/openpagesmanager.cpp
+++ b/src/plugins/help/openpagesmanager.cpp
@@ -173,7 +173,7 @@ void OpenPagesManager::setupInitialPages()
m_model->addPage(homePage);
for (int i = 0; i < m_model->rowCount(); ++i)
- CentralWidget::instance()->addPage(m_model->pageAt(i));
+ CentralWidget::instance()->addViewer(m_model->pageAt(i));
emit pagesChanged();
setCurrentPage((initialPage >= m_model->rowCount())
@@ -202,7 +202,7 @@ HelpViewer *OpenPagesManager::createPage(const QUrl &url, bool fromSearch)
const int index = m_model->rowCount() - 1;
HelpViewer * const page = m_model->pageAt(index);
- CentralWidget::instance()->addPage(page, fromSearch);
+ CentralWidget::instance()->addViewer(page, fromSearch);
emit pagesChanged();
setCurrentPage(index);
@@ -212,7 +212,7 @@ HelpViewer *OpenPagesManager::createPage(const QUrl &url, bool fromSearch)
void OpenPagesManager::setCurrentPage(int index)
{
- CentralWidget::instance()->setCurrentPage(m_model->pageAt(index));
+ CentralWidget::instance()->setCurrentViewer(m_model->pageAt(index));
m_comboBox->setCurrentIndex(index);
if (m_openPagesWidget)
@@ -294,7 +294,7 @@ void OpenPagesManager::removePage(int index)
Q_ASSERT(m_model->rowCount() > 1);
m_model->removePage(index);
- CentralWidget::instance()->removePage(index);
+ CentralWidget::instance()->removeViewerAt(index);
emit pagesChanged();
if (m_openPagesWidget)
diff --git a/src/shared/help/contentwindow.cpp b/src/shared/help/contentwindow.cpp
index b29e648005..7b5504896b 100644
--- a/src/shared/help/contentwindow.cpp
+++ b/src/shared/help/contentwindow.cpp
@@ -162,7 +162,7 @@ void ContentWindow::itemClicked(const QModelIndex &index)
if (contentModel) {
if (QHelpContentItem *itm = contentModel->contentItemAt(index)) {
const QUrl &url = itm->url();
- if (url != CentralWidget::instance()->currentHelpViewer()->source())
+ if (url != CentralWidget::instance()->currentViewer()->source())
emit linkActivated(itm->url());
}
}