}
// -- public slots
+
#ifndef QT_NO_CLIPBOARD
void CentralWidget::copy()
{
emit sourceChanged(url);
}
+void CentralWidget::slotHighlighted(const QString &link)
+{
+ TRACE_OBJ
+ QString resolvedLink = m_resolvedLinks.value(link);
+ if (!link.isEmpty() && resolvedLink.isEmpty()) {
+ resolvedLink = HelpEngineWrapper::instance().findFile(link).toString();
+ m_resolvedLinks.insert(link, resolvedLink);
+ }
+ emit highlighted(resolvedLink);
+}
+
// -- private
void CentralWidget::initPrinter()
SIGNAL(backwardAvailable(bool)));
connect(page, SIGNAL(sourceChanged(QUrl)), this,
SLOT(handleSourceChanged(QUrl)));
- connect(page, SIGNAL(highlighted(QString)), this,
- SIGNAL(highlighted(QString)));
connect(page, SIGNAL(printRequested()), this, SLOT(print()));
+ connect(page, SIGNAL(highlighted(QString)), this, SLOT(slotHighlighted(QString)));
}
bool CentralWidget::eventFilter(QObject *object, QEvent *e)
void highlightSearchTerms();
void printPreview(QPrinter *printer);
void handleSourceChanged(const QUrl &url);
+ void slotHighlighted(const QString &link);
private:
void initPrinter();
FindWidget *m_findWidget;
QStackedWidget *m_stackedWidget;
TabBar *m_tabBar;
+ QHash<QString, QString> m_resolvedLinks;
};
QT_END_NAMESPACE
return d->m_helpEngine->error();
}
-QString HelpEngineWrapper::virtualFolderForNameSpace(const QString &nameSpace) const
-{
- TRACE_OBJ
- return d->m_helpEngine->d->nameSpaceVirtualFolderMap.value(nameSpace, QString());
-}
-
const QStringList HelpEngineWrapper::qtDocInfo(const QString &component) const
{
TRACE_OBJ
const QStringList filterAttributes() const;
const QStringList filterAttributes(const QString &filterName) const;
QString error() const;
- QString virtualFolderForNameSpace(const QString &nameSpace) const;
/*
* To be called after assistant has finished looking for new documentation.
return QLatin1String(e->mimeType);
++e;
}
- return QLatin1String("");
+ return QLatin1String("application/octet-stream");
}
bool HelpViewer::launchWithExternalApp(const QUrl &url)
return false;
}
-QString HelpViewer::fixupVirtualFolderForUrl(const HelpEngineWrapper *engine, const QUrl &url, bool *fixed)
-{
- TRACE_OBJ
- Q_ASSERT(engine);
-
- QString ret = url.toString();
- const QString virtualFolder = engine->virtualFolderForNameSpace(url.host());
- QString effectiveVirtualFolder = virtualFolder;
- const QStringList tokens = url.path().split('/');
- Q_FOREACH (const QString& token, tokens) {
- if (!token.isEmpty()) {
- effectiveVirtualFolder = token;
- break;
- }
- }
-
- if (QString::localeAwareCompare(effectiveVirtualFolder, virtualFolder)) {
- ret = url.scheme() + QLatin1String("://") + url.host() + QLatin1Char('/')
- + virtualFolder + QLatin1String("/..") + url.path();
- }
- if (fixed && engine->findFile(ret).isValid())
- *fixed = true;
- return ret;
-}
-
// -- public slots
void HelpViewer::home()
static bool canOpenPage(const QString &url);
static QString mimeFromUrl(const QUrl &url);
static bool launchWithExternalApp(const QUrl &url);
- static QString fixupVirtualFolderForUrl(const HelpEngineWrapper *engine, const QUrl &url, bool *fixed = 0);
public slots:
#ifndef QT_NO_CLIPBOARD
return;
emit loadStarted();
- QString string = url.toString();
- const HelpEngineWrapper &engine = HelpEngineWrapper::instance();
- QUrl resolvedUrl = (string == QLatin1String("help") ? LocalHelpFile :
- engine.findFile(string));
- bool fileFound = resolvedUrl.isValid();
- if (!fileFound && isLocalUrl(url))
- resolvedUrl = fixupVirtualFolderForUrl(&engine, url, &fileFound);
+ bool helpOrAbout = (url.toString() == QLatin1String("help"));
+ const QUrl resolvedUrl = (helpOrAbout ? LocalHelpFile : HelpEngineWrapper::instance().findFile(url));
QTextBrowser::setSource(resolvedUrl);
- if (!fileFound) {
- setHtml(string == QLatin1String("about:blank") ? AboutBlank
- : PageNotFoundMessage.arg(url.toString()));
+
+ if (!resolvedUrl.isValid()) {
+ helpOrAbout = (url.toString() == QLatin1String("about:blank"));
+ setHtml(helpOrAbout ? AboutBlank : PageNotFoundMessage.arg(url.toString()));
}
emit loadFinished(true);
}
TRACE_OBJ
QByteArray ba;
if (type < 4) {
- QUrl url = fixupVirtualFolderForUrl(&HelpEngineWrapper::instance(), name);
+ const QUrl url = HelpEngineWrapper::instance().findFile(name);
ba = HelpEngineWrapper::instance().fileData(url);
if (url.toString().endsWith(QLatin1String(".svg"), Qt::CaseInsensitive)) {
QImage image;
#include "openpagesmanager.h"
#include "tracer.h"
+#include <QClipboard>
#include <QtCore/QFileInfo>
#include <QtCore/QString>
#include <QtCore/QTimer>
return len;
}
+// -- HelpRedirectNetworkReply
+
+class HelpRedirectNetworkReply : public QNetworkReply
+{
+public:
+ HelpRedirectNetworkReply(const QNetworkRequest &request, const QUrl &newUrl)
+ {
+ setRequest(request);
+ setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 301);
+ setAttribute(QNetworkRequest::RedirectionTargetAttribute, newUrl);
+
+ QTimer::singleShot(0, this, SIGNAL(finished()));
+ }
+
+protected:
+ void abort() { TRACE_OBJ }
+ qint64 readData(char*, qint64) { TRACE_OBJ return qint64(-1); }
+};
+
// -- HelpNetworkAccessManager
class HelpNetworkAccessManager : public QNetworkAccessManager
TRACE_OBJ
}
-QNetworkReply *HelpNetworkAccessManager::createRequest(Operation /*op*/,
- const QNetworkRequest &request, QIODevice* /*outgoingData*/)
+QNetworkReply *HelpNetworkAccessManager::createRequest(Operation, const QNetworkRequest &request, QIODevice*)
{
TRACE_OBJ
- QString url = request.url().toString();
-
const HelpEngineWrapper &engine = HelpEngineWrapper::instance();
- bool fileFound = engine.findFile(url).isValid();
- if (!fileFound && HelpViewer::isLocalUrl(request.url()))
- url = HelpViewer::fixupVirtualFolderForUrl(&engine, request.url(), &fileFound);
+ const QUrl url = engine.findFile(request.url());
+ if (url.isValid() && (url != request.url()))
+ return new HelpRedirectNetworkReply(request, url);
- const QString &mimeType = HelpViewer::mimeFromUrl(url);
- const QByteArray &data = fileFound ? engine.fileData(url) : QString::fromLatin1(g_htmlPage)
- .arg(g_percent1, g_percent2, HelpViewer::tr("Error loading: %1").arg(url), g_percent4).toUtf8();
+ if (url.isValid())
+ return new HelpNetworkReply(request, engine.fileData(url), HelpViewer::mimeFromUrl(url));
- return new HelpNetworkReply(request, data, mimeType.isEmpty()
- ? QLatin1String("application/octet-stream") : mimeType);
+ return new HelpNetworkReply(request, QString::fromLatin1(g_htmlPage).arg(g_percent1, g_percent2,
+ HelpViewer::tr("Error loading: %1").arg(request.url().toString()), g_percent4).toUtf8(),
+ QLatin1String("text/html"));
}
// -- HelpPage
QWebPage::triggerAction(action, checked);
break;
}
+
+#ifndef QT_NO_CLIPBOARD
+ if (action == CopyLinkToClipboard || action == CopyImageUrlToClipboard) {
+ const QString link = QApplication::clipboard()->text();
+ QApplication::clipboard()->setText(HelpEngineWrapper::instance().findFile(link).toString());
+ }
+#endif
}
bool HelpPage::acceptNavigationRequest(QWebFrame *,
}
// -- public slots
+
#ifndef QT_NO_CLIPBOARD
void HelpViewer::copy()
{
contentModel->contentItemAt(contentModel->index(i, 0));
if (itm && itm->url().host() == link.host()) {
QString path = link.path();
- if (path.startsWith(QLatin1Char('/')))
- path = path.mid(1);
- if (searchContentItem(contentModel, contentModel->index(i, 0), path)) {
+ if (searchContentItem(contentModel, contentModel->index(i, 0), link.path()))
return m_syncIndex;
- }
}
}
return QModelIndex();
QMap<QString, QHelpDBReader*> fileNameReaderMap;
QMultiMap<QString, QHelpDBReader*> virtualFolderMap;
QStringList orderedFileNameList;
- QHash<QString, QString> nameSpaceVirtualFolderMap;
QHelpCollectionHandler *collectionHandler;
QString currentFilter;
fileNameReaderMap.clear();
virtualFolderMap.clear();
orderedFileNameList.clear();
- nameSpaceVirtualFolderMap.clear();
}
bool QHelpEngineCorePrivate::setup()
fileNameReaderMap.insert(absFileName, reader);
virtualFolderMap.insert(info.folderName, reader);
orderedFileNameList.append(absFileName);
- nameSpaceVirtualFolderMap.insert(info.namespaceName, info.folderName);
}
q->currentFilter();
emit q->setupFinished();