helpwidget.cpp 25.6 KB
Newer Older
1
2
/****************************************************************************
**
3
4
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
5
6
7
8
9
10
11
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
12
13
14
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
15
**
16
17
18
19
20
21
22
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
23
24
25
26
27
**
****************************************************************************/

#include "helpwidget.h"

28
#include "bookmarkmanager.h"
29
#include "contentwindow.h"
30
#include "helpconstants.h"
31
#include "helpicons.h"
32
33
#include "helpplugin.h"
#include "helpviewer.h"
34
#include "indexwindow.h"
35
#include "localhelpmanager.h"
36
#include "openpagesmanager.h"
37
#include "searchwidget.h"
38
#include "topicchooser.h"
39
40
41

#include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/actionmanager/actionmanager.h>
42
#include <coreplugin/actionmanager/command.h>
43
#include <coreplugin/coreconstants.h>
44
#include <coreplugin/coreicons.h>
45
46
#include <coreplugin/icore.h>
#include <coreplugin/findplaceholder.h>
47
48
#include <coreplugin/minisplitter.h>
#include <coreplugin/sidebar.h>
49
#include <texteditor/texteditorconstants.h>
50
#include <utils/qtcassert.h>
51
52
#include <utils/styledbar.h>

Sergey Belyashov's avatar
Sergey Belyashov committed
53
#include <QCoreApplication>
54
#include <QHBoxLayout>
55
56
57
#include <QHelpEngine>
#include <QHelpSearchEngine>
#include <QHelpSearchQuery>
58
#include <QMenu>
59
60
61
#include <QPrinter>
#include <QPrintDialog>
#include <QStackedWidget>
62
63
#include <QToolButton>

64
65
static const char kWindowSideBarSettingsKey[] = "Help/WindowSideBar";
static const char kModeSideBarSettingsKey[] = "Help/ModeSideBar";
66
67
68
69

namespace Help {
namespace Internal {

70
71
HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget *parent) :
    QWidget(parent),
72
    m_style(style),
73
    m_toggleSideBarAction(0),
74
75
76
    m_switchToHelp(0),
    m_filterComboBox(0),
    m_closeAction(0),
77
78
    m_scaleUp(0),
    m_scaleDown(0),
79
    m_resetScale(0),
80
81
    m_printer(0),
    m_sideBar(0),
82
83
84
85
86
    m_contentsAction(0),
    m_indexAction(0),
    m_bookmarkAction(0),
    m_searchAction(0),
    m_openPagesAction(0)
87
{
88
89
90
91
92
93
94
95
96
97
    m_viewerStack = new QStackedWidget;

    auto hLayout = new QHBoxLayout(this);
    hLayout->setMargin(0);
    hLayout->setSpacing(0);

    m_sideBarSplitter = new Core::MiniSplitter(this);
    m_sideBarSplitter->setOpaqueResize(false);
    hLayout->addWidget(m_sideBarSplitter);

98
    Utils::StyledBar *toolBar = new Utils::StyledBar();
99
100
101
    QHBoxLayout *layout = new QHBoxLayout(toolBar);
    layout->setSpacing(0);
    layout->setMargin(0);
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119

    auto rightSide = new QWidget(this);
    m_sideBarSplitter->insertWidget(1, rightSide);
    QVBoxLayout *vLayout = new QVBoxLayout(rightSide);
    vLayout->setMargin(0);
    vLayout->setSpacing(0);
    vLayout->addWidget(toolBar);
    vLayout->addWidget(m_viewerStack);
    Core::FindToolBarPlaceHolder *fth = new Core::FindToolBarPlaceHolder(this);
    vLayout->addWidget(fth);

    setFocusProxy(m_viewerStack);

    m_context = new Core::IContext(this);
    m_context->setContext(context);
    m_context->setWidget(m_sideBarSplitter);
    Core::ICore::addContextObject(m_context);

120
    Core::Command *cmd;
121
122
123
124
125
126
127
128
    QToolButton *button;

    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
129
130
    }
    if (style != SideBarWidget) {
131
        m_toggleSideBarAction = new QAction(Core::Icons::TOGGLE_SIDEBAR.icon(),
Sergey Belyashov's avatar
Sergey Belyashov committed
132
133
                                            QCoreApplication::translate("Core", Core::Constants::TR_SHOW_SIDEBAR),
                                            toolBar);
134
135
136
137
138
139
        m_toggleSideBarAction->setCheckable(true);
        m_toggleSideBarAction->setChecked(false);
        cmd = Core::ActionManager::registerAction(m_toggleSideBarAction,
                                                  Core::Constants::TOGGLE_SIDEBAR, context);
        connect(m_toggleSideBarAction, &QAction::toggled, m_toggleSideBarAction,
                [this](bool checked) {
Sergey Belyashov's avatar
Sergey Belyashov committed
140
141
142
143
                    m_toggleSideBarAction->setText(
                        QCoreApplication::translate("Core",
                                                    checked ? Core::Constants::TR_HIDE_SIDEBAR
                                                            : Core::Constants::TR_SHOW_SIDEBAR));
144
145
                });
        addSideBar();
146
        m_toggleSideBarAction->setChecked(m_sideBar->isVisibleTo(this));
147
148
149
150
151
        connect(m_toggleSideBarAction, &QAction::triggered, m_sideBar, &Core::SideBar::setVisible);
        connect(m_sideBar, &Core::SideBar::sideBarClosed, m_toggleSideBarAction, [this]() {
            m_toggleSideBarAction->setChecked(false);
        });
    }
152
153
    if (style == ExternalWindow)
        layout->addWidget(Core::Command::toolButtonWithAppendedShortcut(m_toggleSideBarAction, cmd));
154

155
156
157
    if (style != ModeWidget) {
        m_switchToHelp = new QAction(tr("Go to Help Mode"), toolBar);
        cmd = Core::ActionManager::registerAction(m_switchToHelp, Constants::CONTEXT_HELP, context);
Montel Laurent's avatar
Montel Laurent committed
158
        connect(m_switchToHelp, &QAction::triggered, this, &HelpWidget::helpModeButtonClicked);
159
        layout->addWidget(Core::Command::toolButtonWithAppendedShortcut(m_switchToHelp, cmd));
160
    }
161

162
    m_homeAction = new QAction(Icons::HOME.icon(), tr("Home"), this);
163
164
    cmd = Core::ActionManager::registerAction(m_homeAction, Constants::HELP_HOME, context);
    connect(m_homeAction, &QAction::triggered, this, &HelpWidget::goHome);
165
    layout->addWidget(Core::Command::toolButtonWithAppendedShortcut(m_homeAction, cmd));
166

167
    m_backAction = new QAction(Core::Icons::PREV.icon(), tr("Back"), toolBar);
168
    connect(m_backAction, &QAction::triggered, this, &HelpWidget::backward);
169
    m_backMenu = new QMenu(toolBar);
Montel Laurent's avatar
Montel Laurent committed
170
    connect(m_backMenu, &QMenu::aboutToShow, this, &HelpWidget::updateBackMenu);
171
172
173
    m_backAction->setMenu(m_backMenu);
    cmd = Core::ActionManager::registerAction(m_backAction, Constants::HELP_PREVIOUS, context);
    cmd->setDefaultKeySequence(QKeySequence::Back);
174
175
176
    button = Core::Command::toolButtonWithAppendedShortcut(m_backAction, cmd);
    button->setPopupMode(QToolButton::DelayedPopup);
    layout->addWidget(button);
177

178
    m_forwardAction = new QAction(Core::Icons::NEXT.icon(), tr("Forward"), toolBar);
179
    connect(m_forwardAction, &QAction::triggered, this, &HelpWidget::forward);
180
    m_forwardMenu = new QMenu(toolBar);
Montel Laurent's avatar
Montel Laurent committed
181
    connect(m_forwardMenu, &QMenu::aboutToShow, this, &HelpWidget::updateForwardMenu);
182
183
184
    m_forwardAction->setMenu(m_forwardMenu);
    cmd = Core::ActionManager::registerAction(m_forwardAction, Constants::HELP_NEXT, context);
    cmd->setDefaultKeySequence(QKeySequence::Forward);
185
186
187
    button = Core::Command::toolButtonWithAppendedShortcut(m_forwardAction, cmd);
    button->setPopupMode(QToolButton::DelayedPopup);
    layout->addWidget(button);
188

189
    m_addBookmarkAction = new QAction(Icons::BOOKMARK.icon(), tr("Add Bookmark"), this);
Eike Ziller's avatar
Eike Ziller committed
190
    cmd = Core::ActionManager::registerAction(m_addBookmarkAction, Constants::HELP_ADDBOOKMARK, context);
191
192
193
    cmd->setDefaultKeySequence(QKeySequence(Core::UseMacShortcuts ? tr("Meta+M") : tr("Ctrl+M")));
    connect(m_addBookmarkAction, &QAction::triggered, this, &HelpWidget::addBookmark);
    layout->addWidget(new Utils::StyledSeparator(toolBar));
194
    layout->addWidget(Core::Command::toolButtonWithAppendedShortcut(m_addBookmarkAction, cmd));
195

196
197
198
    if (style == ModeWidget) {
        layout->addWidget(new Utils::StyledSeparator(toolBar));
        layout->addWidget(OpenPagesManager::instance().openPagesComboBox(), 10);
199
200
201
202
    } else {
        layout->addWidget(new QLabel(), 10);
    }
    if (style != SideBarWidget) {
203
204
205
        m_filterComboBox = new QComboBox;
        m_filterComboBox->setMinimumContentsLength(15);
        m_filterComboBox->setModel(LocalHelpManager::filterModel());
206
        m_filterComboBox->setCurrentIndex(LocalHelpManager::filterIndex());
207
208
209
210
211
212
213
        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);
    }

214
215
    layout->addStretch();

216
217
218
    m_printAction = new QAction(this);
    Core::ActionManager::registerAction(m_printAction, Core::Constants::PRINT, context);
    connect(m_printAction, &QAction::triggered, this, [this]() { print(currentViewer()); });
219

220
    m_copy = new QAction(this);
221
    Core::ActionManager::registerAction(m_copy, Core::Constants::COPY, context);
222
    connect(m_copy, &QAction::triggered, this, &HelpWidget::copy);
223
224
225
226

    Core::ActionContainer *advancedMenu = Core::ActionManager::actionContainer(Core::Constants::M_EDIT_ADVANCED);
    QTC_CHECK(advancedMenu);
    if (advancedMenu) {
227
        // reuse TextEditor constants to avoid a second pair of menu actions
228
229
        m_scaleUp = new QAction(tr("Increase Font Size"), this);
        cmd = Core::ActionManager::registerAction(m_scaleUp, TextEditor::Constants::INCREASE_FONT_SIZE,
230
                                                  context);
231
        connect(m_scaleUp, &QAction::triggered, this, &HelpWidget::scaleUp);
232
233
        advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);

234
235
        m_scaleDown = new QAction(tr("Decrease Font Size"), this);
        cmd = Core::ActionManager::registerAction(m_scaleDown, TextEditor::Constants::DECREASE_FONT_SIZE,
236
                                                  context);
237
        connect(m_scaleDown, &QAction::triggered, this, &HelpWidget::scaleDown);
238
239
        advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);

240
241
        m_resetScale = new QAction(tr("Reset Font Size"), this);
        cmd = Core::ActionManager::registerAction(m_resetScale, TextEditor::Constants::RESET_FONT_SIZE,
242
                                                  context);
243
        connect(m_resetScale, &QAction::triggered, this, &HelpWidget::resetScale);
244
245
        advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
    }
246

247
    if (style != ExternalWindow) {
248
        m_closeAction = new QAction(Core::Icons::CLOSE_TOOLBAR.icon(), QString(), toolBar);
249
        connect(m_closeAction, SIGNAL(triggered()), this, SIGNAL(closeButtonClicked()));
250
251
252
        button = new QToolButton;
        button->setDefaultAction(m_closeAction);
        layout->addWidget(button);
253
254
255
256
257
258
    }

    if (style != ModeWidget) {
        HelpViewer *viewer = HelpPlugin::createHelpViewer(qreal(0.0));
        addViewer(viewer);
        setCurrentViewer(viewer);
259
260
261
262
263
    }
}

HelpWidget::~HelpWidget()
{
264
    if (m_sideBar) {
265
        m_sideBar->saveSettings(Core::ICore::settings(), sideBarSettingsKey());
266
        Core::ActionManager::unregisterAction(m_contentsAction, Constants::HELP_CONTENTS);
267
        Core::ActionManager::unregisterAction(m_indexAction, Constants::HELP_INDEX);
Eike Ziller's avatar
Eike Ziller committed
268
        Core::ActionManager::unregisterAction(m_bookmarkAction, Constants::HELP_BOOKMARKS);
269
        Core::ActionManager::unregisterAction(m_searchAction, Constants::HELP_SEARCH);
270
271
        if (m_openPagesAction)
            Core::ActionManager::unregisterAction(m_openPagesAction, Constants::HELP_OPENPAGES);
272
    }
273
    Core::ICore::removeContextObject(m_context);
274
    Core::ActionManager::unregisterAction(m_copy, Core::Constants::COPY);
275
    Core::ActionManager::unregisterAction(m_printAction, Core::Constants::PRINT);
276
277
    if (m_toggleSideBarAction)
        Core::ActionManager::unregisterAction(m_toggleSideBarAction, Core::Constants::TOGGLE_SIDEBAR);
278
279
    if (m_switchToHelp)
        Core::ActionManager::unregisterAction(m_switchToHelp, Constants::CONTEXT_HELP);
280
    Core::ActionManager::unregisterAction(m_homeAction, Constants::HELP_HOME);
281
282
    Core::ActionManager::unregisterAction(m_forwardAction, Constants::HELP_NEXT);
    Core::ActionManager::unregisterAction(m_backAction, Constants::HELP_PREVIOUS);
Eike Ziller's avatar
Eike Ziller committed
283
    Core::ActionManager::unregisterAction(m_addBookmarkAction, Constants::HELP_ADDBOOKMARK);
284
285
286
287
288
289
    if (m_scaleUp)
        Core::ActionManager::unregisterAction(m_scaleUp, TextEditor::Constants::INCREASE_FONT_SIZE);
    if (m_scaleDown)
        Core::ActionManager::unregisterAction(m_scaleDown, TextEditor::Constants::DECREASE_FONT_SIZE);
    if (m_resetScale)
        Core::ActionManager::unregisterAction(m_resetScale, TextEditor::Constants::RESET_FONT_SIZE);
290
291
}

292
293
294
295
void HelpWidget::addSideBar()
{
    QMap<QString, Core::Command *> shortcutMap;
    Core::Command *cmd;
296
    bool supportsNewPages = (m_style == ModeWidget);
297

298
299
    auto contentWindow = new ContentWindow;
    auto contentItem = new Core::SideBarItem(contentWindow, QLatin1String(Constants::HELP_CONTENTS));
300
    contentWindow->setOpenInNewPageActionVisible(supportsNewPages);
301
    contentWindow->setWindowTitle(HelpPlugin::tr(Constants::SB_CONTENTS));
302
303
    connect(contentWindow, &ContentWindow::linkActivated,
            this, &HelpWidget::open);
304
    m_contentsAction = new QAction(tr(Constants::SB_CONTENTS), this);
305
306
307
308
309
    cmd = Core::ActionManager::registerAction(m_contentsAction, Constants::HELP_CONTENTS, m_context->context());
    cmd->setDefaultKeySequence(QKeySequence(Core::UseMacShortcuts ? tr("Meta+Shift+C")
                                                                  : tr("Ctrl+Shift+C")));
    shortcutMap.insert(QLatin1String(Constants::HELP_CONTENTS), cmd);

310
    auto indexWindow = new IndexWindow();
Eike Ziller's avatar
Eike Ziller committed
311
    auto indexItem = new Core::SideBarItem(indexWindow, QLatin1String(Constants::HELP_INDEX));
312
    indexWindow->setOpenInNewPageActionVisible(supportsNewPages);
313
    indexWindow->setWindowTitle(HelpPlugin::tr(Constants::SB_INDEX));
314
315
316
317
    connect(indexWindow, &IndexWindow::linkActivated,
            this, &HelpWidget::open);
    connect(indexWindow, &IndexWindow::linksActivated,
        this, &HelpWidget::showTopicChooser);
318
    m_indexAction = new QAction(tr(Constants::SB_INDEX), this);
319
320
321
    cmd = Core::ActionManager::registerAction(m_indexAction, Constants::HELP_INDEX, m_context->context());
    cmd->setDefaultKeySequence(QKeySequence(Core::UseMacShortcuts ? tr("Meta+I")
                                                                  : tr("Ctrl+Shift+I")));
Eike Ziller's avatar
Eike Ziller committed
322
    shortcutMap.insert(QLatin1String(Constants::HELP_INDEX), cmd);
323

Eike Ziller's avatar
Eike Ziller committed
324
    auto bookmarkWidget = new BookmarkWidget(&LocalHelpManager::bookmarkManager());
325
    bookmarkWidget->setWindowTitle(HelpPlugin::tr(Constants::SB_BOOKMARKS));
326
    bookmarkWidget->setOpenInNewPageActionVisible(supportsNewPages);
Eike Ziller's avatar
Eike Ziller committed
327
328
329
330
331
332
    auto bookmarkItem = new Core::SideBarItem(bookmarkWidget,
                                              QLatin1String(Constants::HELP_BOOKMARKS));
    connect(bookmarkWidget, &BookmarkWidget::linkActivated, this, &HelpWidget::setSource);
    m_bookmarkAction = new QAction(tr("Activate Help Bookmarks View"), this);
    cmd = Core::ActionManager::registerAction(m_bookmarkAction, Constants::HELP_BOOKMARKS,
                                              m_context->context());
333
    cmd->setDefaultKeySequence(QKeySequence(Core::UseMacShortcuts ? tr("Alt+Meta+M")
Eike Ziller's avatar
Eike Ziller committed
334
335
336
                                                                  : tr("Ctrl+Shift+B")));
    shortcutMap.insert(QLatin1String(Constants::HELP_BOOKMARKS), cmd);

337
338
339
340
341
342
343
344
345
    auto searchItem = new SearchSideBarItem;
    connect(searchItem, &SearchSideBarItem::linkActivated, this, &HelpWidget::openFromSearch);
    m_searchAction = new QAction(tr("Activate Help Search View"), this);
    cmd = Core::ActionManager::registerAction(m_searchAction, Constants::HELP_SEARCH,
                                              m_context->context());
    cmd->setDefaultKeySequence(QKeySequence(Core::UseMacShortcuts ? tr("Meta+/")
                                                                  : tr("Ctrl+Shift+/")));
    shortcutMap.insert(QLatin1String(Constants::HELP_SEARCH), cmd);

346
347
348
    Core::SideBarItem *openPagesItem = 0;
    if (m_style == ModeWidget) {
        QWidget *openPagesWidget = OpenPagesManager::instance().openPagesWidget();
349
        openPagesWidget->setWindowTitle(HelpPlugin::tr(Constants::SB_OPENPAGES));
350
351
352
353
354
355
356
357
358
359
        openPagesItem = new Core::SideBarItem(openPagesWidget,
                                              QLatin1String(Constants::HELP_OPENPAGES));
        m_openPagesAction = new QAction(tr("Activate Open Help Pages View"), this);
        cmd = Core::ActionManager::registerAction(m_openPagesAction, Constants::HELP_OPENPAGES,
                                                  m_context->context());
        cmd->setDefaultKeySequence(QKeySequence(Core::UseMacShortcuts ? tr("Meta+O")
                                                                      : tr("Ctrl+Shift+O")));
        shortcutMap.insert(QLatin1String(Constants::HELP_OPENPAGES), cmd);
    }

360
    QList<Core::SideBarItem *> itemList;
361
    itemList << contentItem << indexItem << bookmarkItem << searchItem;
362
363
    if (openPagesItem)
         itemList << openPagesItem;
364
    m_sideBar = new Core::SideBar(itemList,
365
366
                                  QList<Core::SideBarItem *>() << contentItem
                                  << (openPagesItem ? openPagesItem : indexItem));
367
368
369
370
371
    m_sideBar->setShortcutMap(shortcutMap);
    m_sideBar->setCloseWhenEmpty(true);
    m_sideBarSplitter->insertWidget(0, m_sideBar);
    m_sideBarSplitter->setStretchFactor(0, 0);
    m_sideBarSplitter->setStretchFactor(1, 1);
372
373
    if (m_style != ModeWidget)
        m_sideBar->setVisible(false);
374
    m_sideBar->resize(250, size().height());
375
    m_sideBar->readSettings(Core::ICore::settings(), sideBarSettingsKey());
376
377
    m_sideBarSplitter->setSizes(QList<int>() << m_sideBar->size().width() << 300);

378
379
380
    connect(m_contentsAction, &QAction::triggered, m_sideBar, [this]() {
        m_sideBar->activateItem(QLatin1String(Constants::HELP_CONTENTS));
    });
Eike Ziller's avatar
Eike Ziller committed
381
382
    connect(m_indexAction, &QAction::triggered, m_sideBar, [this]() {
        m_sideBar->activateItem(QLatin1String(Constants::HELP_INDEX));
383
    });
Eike Ziller's avatar
Eike Ziller committed
384
385
386
    connect(m_bookmarkAction, &QAction::triggered, m_sideBar, [this]() {
        m_sideBar->activateItem(QLatin1String(Constants::HELP_BOOKMARKS));
    });
387
388
389
    connect(m_searchAction, &QAction::triggered, m_sideBar, [this]() {
        m_sideBar->activateItem(QLatin1String(Constants::HELP_SEARCH));
    });
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
    if (m_openPagesAction) {
        connect(m_openPagesAction, &QAction::triggered, m_sideBar, [this]() {
            m_sideBar->activateItem(QLatin1String(Constants::HELP_OPENPAGES));
        });
    }
}

QString HelpWidget::sideBarSettingsKey() const
{
    switch (m_style) {
    case ModeWidget:
        return QLatin1String(kModeSideBarSettingsKey);
    case ExternalWindow:
        return QLatin1String(kWindowSideBarSettingsKey);
    case SideBarWidget:
        QTC_CHECK(false);
        break;
    }
    return QString();
409
410
}

411
412
HelpViewer *HelpWidget::currentViewer() const
{
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
    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();
}

431
void HelpWidget::addViewer(HelpViewer *viewer)
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
{
    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)
Montel Laurent's avatar
Montel Laurent committed
453
        connect(viewer, &HelpViewer::titleChanged, this, &HelpWidget::updateWindowTitle);
454

455
    connect(viewer, &HelpViewer::loadFinished, this, &HelpWidget::highlightSearchTerms);
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481

    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();
}

int HelpWidget::viewerCount() const
{
    return m_viewerStack->count();
}

HelpViewer *HelpWidget::viewerAt(int index) const
{
    return qobject_cast<HelpViewer *>(m_viewerStack->widget(index));
}

482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
void HelpWidget::open(const QUrl &url, bool newPage)
{
    if (newPage)
        OpenPagesManager::instance().createPage(url);
    else
        setSource(url);
}

void HelpWidget::showTopicChooser(const QMap<QString, QUrl> &links,
    const QString &keyword, bool newPage)
{
    TopicChooser tc(this, keyword, links);
    if (tc.exec() == QDialog::Accepted)
        open(tc.link(), newPage);
}

498
499
500
501
502
503
void HelpWidget::activateSideBarItem(const QString &id)
{
    QTC_ASSERT(m_sideBar, return);
    m_sideBar->activateItem(id);
}

504
505
506
507
508
509
510
511
void HelpWidget::setSource(const QUrl &url)
{
    HelpViewer* viewer = currentViewer();
    QTC_ASSERT(viewer, return);
    viewer->setSource(url);
    viewer->setFocus(Qt::OtherFocusReason);
}

512
void HelpWidget::openFromSearch(const QUrl &url, const QStringList &searchTerms, bool newPage)
513
{
514
    m_searchTerms = searchTerms;
515
    if (newPage)
516
        OpenPagesManager::instance().createPage(url);
517
518
519
520
521
522
    else {
        HelpViewer* viewer = currentViewer();
        QTC_ASSERT(viewer, return);
        viewer->setSource(url);
        viewer->setFocus(Qt::OtherFocusReason);
    }
523
524
}

525
526
527
528
529
void HelpWidget::closeEvent(QCloseEvent *)
{
    emit aboutToClose();
}

530
531
532
void HelpWidget::updateBackMenu()
{
    m_backMenu->clear();
533
534
    QTC_ASSERT(currentViewer(), return);
    currentViewer()->addBackHistoryItems(m_backMenu);
535
536
537
538
539
}

void HelpWidget::updateForwardMenu()
{
    m_forwardMenu->clear();
540
541
    QTC_ASSERT(currentViewer(), return);
    currentViewer()->addForwardHistoryItems(m_forwardMenu);
542
543
}

544
545
void HelpWidget::updateWindowTitle()
{
546
547
    QTC_ASSERT(currentViewer(), return);
    const QString pageTitle = currentViewer()->title();
548
549
550
551
552
553
    if (pageTitle.isEmpty())
        setWindowTitle(tr("Help"));
    else
        setWindowTitle(tr("Help - %1").arg(pageTitle));
}

554
void HelpWidget::helpModeButtonClicked()
555
{
556
557
    QTC_ASSERT(currentViewer(), return);
    emit openHelpMode(currentViewer()->source());
558
559
    if (m_style == ExternalWindow)
        close();
560
561
}

562
563
564
void HelpWidget::updateCloseButton()
{
    if (m_style == ModeWidget) {
565
        const bool closeOnReturn = LocalHelpManager::returnOnClose();
566
567
568
569
        m_closeAction->setEnabled(closeOnReturn || m_viewerStack->count() > 1);
    }
}

570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
void HelpWidget::goHome()
{
    if (HelpViewer *viewer = currentViewer())
        viewer->home();
}

void HelpWidget::addBookmark()
{
    HelpViewer *viewer = currentViewer();
    QTC_ASSERT(viewer, return);

    const QString &url = viewer->source().toString();
    if (url.isEmpty() || url == Help::Constants::AboutBlank)
        return;

    BookmarkManager *manager = &LocalHelpManager::bookmarkManager();
    manager->showBookmarkDialog(this, viewer->title(), url);
}

589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
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()
{
643
644
645
646
647
648
649
    if (m_searchTerms.isEmpty())
        return;
    HelpViewer *viewer = qobject_cast<HelpViewer *>(sender());
    QTC_ASSERT(viewer, return);
    foreach (const QString& term, m_searchTerms)
        viewer->findText(term, 0, false, true);
    m_searchTerms.clear();
650
651
}

652
653
} // Internal
} // Help