diff --git a/shared/help/contentwindow.cpp b/shared/help/contentwindow.cpp index 5a42be4efe57f4f51a7777384b684cba42369e6c..37f258228a017968475daecddf05f501f2e383be 100644 --- a/shared/help/contentwindow.cpp +++ b/shared/help/contentwindow.cpp @@ -48,22 +48,22 @@ ContentWindow::ContentWindow(QHelpEngine *helpEngine) , m_contentWidget(0) , m_expandDepth(-2) { - QVBoxLayout *layout = new QVBoxLayout(this); m_contentWidget = m_helpEngine->contentWidget(); - connect(m_contentWidget, SIGNAL(linkActivated(const QUrl&)), - this, SIGNAL(linkActivated(const QUrl&))); + m_contentWidget->viewport()->installEventFilter(this); + m_contentWidget->setContextMenuPolicy(Qt::CustomContextMenu); + + QVBoxLayout *layout = new QVBoxLayout(this); layout->setMargin(4); layout->addWidget(m_contentWidget); - m_contentWidget->setContextMenuPolicy(Qt::CustomContextMenu); - connect(m_contentWidget, SIGNAL(customContextMenuRequested(const QPoint&)), - this, SLOT(showContextMenu(const QPoint&))); + connect(m_contentWidget, SIGNAL(customContextMenuRequested(QPoint)), this, + SLOT(showContextMenu(QPoint))); + connect(m_contentWidget, SIGNAL(linkActivated(QUrl)), this, + SIGNAL(linkActivated(QUrl))); + QHelpContentModel *contentModel = qobject_cast<QHelpContentModel*>(m_contentWidget->model()); - connect(contentModel, SIGNAL(contentsCreated()), - this, SLOT(expandTOC())); - - m_contentWidget->viewport()->installEventFilter(this); + connect(contentModel, SIGNAL(contentsCreated()), this, SLOT(expandTOC())); } ContentWindow::~ContentWindow() @@ -125,7 +125,7 @@ bool ContentWindow::eventFilter(QObject *o, QEvent *e) CentralWidget::instance()->setSourceInNewTab(itm->url()); } } - return QWidget::eventFilter(o,e); + return QWidget::eventFilter(o, e); } void ContentWindow::showContextMenu(const QPoint &pos) diff --git a/shared/help/helpviewer.cpp b/shared/help/helpviewer.cpp index 8619739f706296eb011ff4973abd20c2b014602f..d542e4996f56592719b507ec1c77dbc604db52ee 100644 --- a/shared/help/helpviewer.cpp +++ b/shared/help/helpviewer.cpp @@ -38,7 +38,6 @@ #include <QtCore/QEvent> #include <QtCore/QVariant> #include <QtCore/QByteArray> -#include <QtCore/QDebug> #include <QtCore/QTimer> #include <QtGui/QMenu> @@ -65,7 +64,8 @@ public: virtual void abort(); - virtual qint64 bytesAvailable() const { return data.length() + QNetworkReply::bytesAvailable(); } + virtual qint64 bytesAvailable() const + { return data.length() + QNetworkReply::bytesAvailable(); } protected: virtual qint64 readData(char *data, qint64 maxlen); @@ -75,14 +75,15 @@ private: qint64 origLen; }; -HelpNetworkReply::HelpNetworkReply(const QNetworkRequest &request, const QByteArray &fileData) +HelpNetworkReply::HelpNetworkReply(const QNetworkRequest &request, + const QByteArray &fileData) : data(fileData), origLen(fileData.length()) { setRequest(request); setOpenMode(QIODevice::ReadOnly); setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String("text/html")); - setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(fileData.length())); + setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(origLen)); QTimer::singleShot(0, this, SIGNAL(metaDataChanged())); QTimer::singleShot(0, this, SIGNAL(readyRead())); } @@ -110,20 +111,21 @@ public: HelpNetworkAccessManager(QHelpEngine *engine, QObject *parent); protected: - virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, - QIODevice *outgoingData = 0); + virtual QNetworkReply *createRequest(Operation op, + const QNetworkRequest &request, QIODevice *outgoingData = 0); private: QHelpEngine *helpEngine; }; -HelpNetworkAccessManager::HelpNetworkAccessManager(QHelpEngine *engine, QObject *parent) +HelpNetworkAccessManager::HelpNetworkAccessManager(QHelpEngine *engine, + QObject *parent) : QNetworkAccessManager(parent), helpEngine(engine) { } -QNetworkReply *HelpNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, - QIODevice *outgoingData) +QNetworkReply *HelpNetworkAccessManager::createRequest(Operation op, + const QNetworkRequest &request, QIODevice *outgoingData) { const QString scheme = request.url().scheme(); if (scheme == QLatin1String("qthelp") || scheme == QLatin1String("about")) { @@ -140,7 +142,8 @@ public: protected: virtual QWebPage *createWindow(QWebPage::WebWindowType); - virtual bool acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type); + virtual bool acceptNavigationRequest(QWebFrame *frame, + const QNetworkRequest &request, NavigationType type); private: CentralWidget *centralWidget; @@ -170,9 +173,10 @@ static bool isLocalUrl(const QUrl &url) return false; } -bool HelpPage::acceptNavigationRequest(QWebFrame *, const QNetworkRequest &request, QWebPage::NavigationType) +bool HelpPage::acceptNavigationRequest(QWebFrame *, + const QNetworkRequest &request, QWebPage::NavigationType) { - const QUrl url = request.url(); + const QUrl &url = request.url(); if (isLocalUrl(url)) { if (url.path().endsWith(QLatin1String("pdf"))) { QString fileName = url.toString(); @@ -186,12 +190,12 @@ bool HelpPage::acceptNavigationRequest(QWebFrame *, const QNetworkRequest &reque } QDesktopServices::openUrl(QUrl(tmpFile.fileName())); return false; - } else - return true; - } else { - QDesktopServices::openUrl(url); - return false; + } + return true; } + + QDesktopServices::openUrl(url); + return false; } HelpViewer::HelpViewer(QHelpEngine *engine, CentralWidget *parent) @@ -202,19 +206,22 @@ HelpViewer::HelpViewer(QHelpEngine *engine, CentralWidget *parent) page()->setNetworkAccessManager(new HelpNetworkAccessManager(engine, this)); QAction* action = pageAction(QWebPage::OpenLinkInNewWindow); - if (parent) - action->setText(tr("Open Link in New Tab")); - else + action->setText(tr("Open Link in New Tab")); + if (!parent) action->setVisible(false); pageAction(QWebPage::DownloadLinkToDisk)->setVisible(false); pageAction(QWebPage::DownloadImageToDisk)->setVisible(false); pageAction(QWebPage::OpenImageInNewWindow)->setVisible(false); - connect(pageAction(QWebPage::Copy), SIGNAL(changed()), this, SLOT(actionChanged())); - connect(pageAction(QWebPage::Back), SIGNAL(changed()), this, SLOT(actionChanged())); - connect(pageAction(QWebPage::Forward), SIGNAL(changed()), this, SLOT(actionChanged())); - connect(page(), SIGNAL(linkHovered(QString, QString, QString)), this, SIGNAL(highlighted(QString))); + connect(pageAction(QWebPage::Copy), SIGNAL(changed()), this, + SLOT(actionChanged())); + connect(pageAction(QWebPage::Back), SIGNAL(changed()), this, + SLOT(actionChanged())); + connect(pageAction(QWebPage::Forward), SIGNAL(changed()), this, + SLOT(actionChanged())); + connect(page(), SIGNAL(linkHovered(QString, QString, QString)), this, + SIGNAL(highlighted(QString))); connect(this, SIGNAL(urlChanged(QUrl)), this, SIGNAL(sourceChanged(QUrl))); } @@ -232,12 +239,12 @@ void HelpViewer::resetZoom() void HelpViewer::zoomIn(qreal range) { - setTextSizeMultiplier(textSizeMultiplier() + range/10); + setTextSizeMultiplier(textSizeMultiplier() + range / 10.0); } void HelpViewer::zoomOut(qreal range) { - setTextSizeMultiplier(qMax(0.,textSizeMultiplier() - range/10)); + setTextSizeMultiplier(qMax(0.0, textSizeMultiplier() - range / 10.0)); } void HelpViewer::home() @@ -250,11 +257,10 @@ void HelpViewer::wheelEvent(QWheelEvent *e) { if (e->modifiers() & Qt::ControlModifier) { const int delta = e->delta(); - qDebug() << delta; if (delta > 0) - zoomIn(delta/120); + zoomIn(delta / 120); else if (delta < 0) - zoomOut(-delta/120); + zoomOut(-delta / 120); e->accept(); return; } @@ -287,7 +293,7 @@ void HelpViewer::actionChanged() emit forwardAvailable(a->isEnabled()); } -#else // !defined(USE_WEBKIT) +#else // !defined(QT_NO_WEBKIT) HelpViewer::HelpViewer(QHelpEngine *engine, CentralWidget *parent) : QTextBrowser(parent) @@ -304,37 +310,15 @@ void HelpViewer::setSource(const QUrl &url) { bool help = url.toString() == QLatin1String("help"); if (url.isValid() && !help) { - bool isPdf = url.path().endsWith(QLatin1String("pdf")); - if (url.scheme() == QLatin1String("http") - || url.scheme() == QLatin1String("ftp") - || url.scheme() == QLatin1String("mailto") || isPdf) { - bool launched = false; - if (isPdf && url.scheme() == QLatin1String("qthelp")) { - QString fileName = url.toString(); - fileName = QDir::tempPath() + QDir::separator() + fileName.right - (fileName.length() - fileName.lastIndexOf(QChar('/'))); - - QFile tmpFile(QDir::cleanPath(fileName)); - if (tmpFile.open(QIODevice::ReadWrite)) { - tmpFile.write(helpEngine->fileData(url)); - tmpFile.close(); - } - launched = QDesktopServices::openUrl(QUrl(tmpFile.fileName())); - } else { - launched = QDesktopServices::openUrl(url); - } - - if (!launched) { - QMessageBox::information(this, tr("Help"), - tr("Unable to launch external application.\n"), tr("OK")); - } + if (launchedWithExternalApp(url)) + return; + + QUrl u = helpEngine->findFile(url); + if (u.isValid()) { + if (!homeUrl.isValid()) + homeUrl = url; + QTextBrowser::setSource(u); return; - } else { - QUrl u = helpEngine->findFile(url); - if (u.isValid()) { - QTextBrowser::setSource(u); - return; - } } } @@ -377,6 +361,37 @@ void HelpViewer::zoomOut(int range) zoomCount--; } +bool HelpViewer::launchedWithExternalApp(const QUrl &url) +{ + bool isPdf = url.path().endsWith(QLatin1String("pdf")); + if (url.scheme() == QLatin1String("http") + || url.scheme() == QLatin1String("ftp") + || url.scheme() == QLatin1String("mailto") || isPdf) { + bool launched = false; + if (isPdf && url.scheme() == QLatin1String("qthelp")) { + QString fileName = url.toString(); + fileName = QDir::tempPath() + QDir::separator() + fileName.right + (fileName.length() - fileName.lastIndexOf(QChar('/'))); + + QFile tmpFile(QDir::cleanPath(fileName)); + if (tmpFile.open(QIODevice::ReadWrite)) { + tmpFile.write(helpEngine->fileData(url)); + tmpFile.close(); + } + launched = QDesktopServices::openUrl(QUrl(tmpFile.fileName())); + } else { + launched = QDesktopServices::openUrl(url); + } + + if (!launched) { + QMessageBox::information(this, tr("Help"), + tr("Unable to launch external application.\n"), tr("OK")); + } + return true; + } + return false; +} + QVariant HelpViewer::loadResource(int type, const QUrl &name) { QByteArray ba; @@ -436,7 +451,8 @@ void HelpViewer::contextMenuEvent(QContextMenuEvent *e) copyAnchorAction = menu.addAction(tr("Copy &Link Location")); copyAnchorAction->setEnabled(!link.isEmpty() && link.isValid()); - menu.addAction(tr("Open Link in New Tab\tCtrl+LMB"), this, SLOT(openLinkInNewTab())); + menu.addAction(tr("Open Link in New Tab\tCtrl+LMB"), this, + SLOT(openLinkInNewTab())); menu.addSeparator(); } menu.addActions(parentWidget->globalActions()); @@ -478,6 +494,23 @@ void HelpViewer::keyPressEvent(QKeyEvent *e) QTextBrowser::keyPressEvent(e); } -#endif // !defined(USE_WEBKIT) +void HelpViewer::home() +{ + if (homeUrl.isValid()) + setSource(homeUrl); +} + +void HelpViewer::wheelEvent(QWheelEvent *e) +{ + if (e->modifiers() == Qt::CTRL) { + e->accept(); + (e->delta() > 0) ? zoomIn() : zoomOut(); + } else { + e->ignore(); + QTextBrowser::wheelEvent(e); + } +} + +#endif // !defined(QT_NO_WEBKIT) QT_END_NAMESPACE diff --git a/shared/help/helpviewer.h b/shared/help/helpviewer.h index 0e1b26b54009483ae60c32d76840ce21393dd79e..925cfdd81cc36ded955ab4f1269cad6a63665ff2 100644 --- a/shared/help/helpviewer.h +++ b/shared/help/helpviewer.h @@ -128,6 +128,14 @@ public: inline bool hasSelection() const { return textCursor().hasSelection(); } + bool launchedWithExternalApp(const QUrl &url); + +public Q_SLOTS: + void home(); + +protected: + void wheelEvent(QWheelEvent *e); + private: QVariant loadResource(int type, const QUrl &name); void openLinkInNewTab(const QString &link); @@ -145,6 +153,7 @@ private: QString lastAnchor; QHelpEngine *helpEngine; CentralWidget* parentWidget; + QUrl homeUrl; }; #endif diff --git a/shared/help/indexwindow.cpp b/shared/help/indexwindow.cpp index 8f5038dfaf8053a4f10faf200e7f8a1be29cae7b..6c72d75c6c00c9f2851e82a09f4af749506ec48c 100644 --- a/shared/help/indexwindow.cpp +++ b/shared/help/indexwindow.cpp @@ -60,24 +60,24 @@ IndexWindow::IndexWindow(QHelpEngine *helpEngine, QWidget *parent) m_searchLineEdit = new QLineEdit(); l->setBuddy(m_searchLineEdit); - connect(m_searchLineEdit, SIGNAL(textChanged(QString)), - this, SLOT(filterIndices(QString))); + connect(m_searchLineEdit, SIGNAL(textChanged(QString)), this, + SLOT(filterIndices(QString))); m_searchLineEdit->installEventFilter(this); layout->setMargin(4); layout->addWidget(m_searchLineEdit); m_indexWidget = m_helpEngine->indexWidget(); m_indexWidget->installEventFilter(this); - connect(m_helpEngine->indexModel(), SIGNAL(indexCreationStarted()), - this, SLOT(disableSearchLineEdit())); - connect(m_helpEngine->indexModel(), SIGNAL(indexCreated()), - this, SLOT(enableSearchLineEdit())); - connect(m_indexWidget, SIGNAL(linkActivated(QUrl, QString)), - this, SIGNAL(linkActivated(QUrl))); + connect(m_helpEngine->indexModel(), SIGNAL(indexCreationStarted()), this, + SLOT(disableSearchLineEdit())); + connect(m_helpEngine->indexModel(), SIGNAL(indexCreated()), this, + SLOT(enableSearchLineEdit())); + connect(m_indexWidget, SIGNAL(linkActivated(QUrl, QString)), this, + SIGNAL(linkActivated(QUrl))); connect(m_indexWidget, SIGNAL(linksActivated(QMap<QString, QUrl>, QString)), this, SIGNAL(linksActivated(QMap<QString, QUrl>, QString))); - connect(m_searchLineEdit, SIGNAL(returnPressed()), - m_indexWidget, SLOT(activateCurrentItem())); + connect(m_searchLineEdit, SIGNAL(returnPressed()), m_indexWidget, + SLOT(activateCurrentItem())); layout->addWidget(m_indexWidget); m_indexWidget->viewport()->installEventFilter(this); diff --git a/shared/help/indexwindow.h b/shared/help/indexwindow.h index a95a166bf651b822c052324864499fd81f34c9a5..51ebb06653d197fa2fd1b74f5bcdf1bcc44031c8 100644 --- a/shared/help/indexwindow.h +++ b/shared/help/indexwindow.h @@ -36,10 +36,10 @@ #include <QtCore/QUrl> #include <QtGui/QWidget> +#include <QtGui/QLineEdit> QT_BEGIN_NAMESPACE -class QLineEdit; class QHelpIndexWidget; class QHelpEngine; @@ -52,7 +52,11 @@ public: ~IndexWindow(); void setSearchLineEditText(const QString &text); - + QString searchLineEditText() const + { + return m_searchLineEdit->text(); + } + signals: void linkActivated(const QUrl &link); void linksActivated(const QMap<QString, QUrl> &links,