/*
Copyright (C) 2012 Sebastian Herbord. All rights reserved.
This file is part of Mod Organizer.
Mod Organizer is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Mod Organizer is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Mod Organizer. If not, see .
*/
#include "nexusview.h"
#include
#include
#include
#include
#include
#include
#include
#include "utility.h"
using namespace MOBase;
NexusView::NexusView(QWidget *parent)
: QWebView(parent), m_LastSeenModID(0)
{
installEventFilter(this);
// this->pageAction(QWebPage::OpenLinkInNewWindow)
connect(this, SIGNAL(urlChanged(QUrl)), this, SLOT(urlChanged(QUrl)));
page()->settings()->setMaximumPagesInCache(10);
}
void NexusView::urlChanged(const QUrl &url)
{
QRegExp modidExp(QString("http://([a-zA-Z0-9]*).nexusmods.com/downloads/file.php\\?id=(\\d+)"), Qt::CaseInsensitive);
if (modidExp.indexIn(url.toString()) != -1) {
m_LastSeenModID = modidExp.cap(2).toInt();
}
}
void NexusView::openPageExternal()
{
::ShellExecuteW(NULL, L"open", ToWString(url().toString()).c_str(), NULL, NULL, SW_SHOWNORMAL);
}
void NexusView::openLinkExternal()
{
::ShellExecuteW(NULL, L"open", ToWString(m_ContextURL.toString()).c_str(), NULL, NULL, SW_SHOWNORMAL);
}
QWebView *NexusView::createWindow(QWebPage::WebWindowType)
{
NexusView *newView = new NexusView(parentWidget());
emit initTab(newView);
return newView;
}
bool NexusView::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::ShortcutOverride) {
QKeyEvent *keyEvent = static_cast(event);
if (keyEvent->matches(QKeySequence::Find)) {
emit startFind();
} else if (keyEvent->matches(QKeySequence::FindNext)) {
emit findAgain();
}
} else if (event->type() == QEvent::MouseButtonPress) {
QMouseEvent *mouseEvent = static_cast(event);
if (mouseEvent->button() == Qt::MidButton) {
mouseEvent->ignore();
return true;
}
} else if (event->type() == QEvent::MouseButtonRelease) {
QMouseEvent *mouseEvent = static_cast(event);
if (mouseEvent->button() == Qt::MidButton) {
QWebHitTestResult hitTest = page()->frameAt(mouseEvent->pos())->hitTestContent(mouseEvent->pos());
if (hitTest.linkUrl().isValid()) {
emit openUrlInNewTab(hitTest.linkUrl());
}
mouseEvent->ignore();
return true;
}
}
return QWebView::eventFilter(obj, event);
}
void NexusView::contextMenuEvent(QContextMenuEvent *event)
{
if (!page()->swallowContextMenuEvent(event)) {
QWebHitTestResult r = page()->mainFrame()->hitTestContent(event->pos());
QMenu *menu = page()->createStandardContextMenu();
QAction *openExternalAction = new QAction("Open in external browser", menu);
if (r.linkUrl().isEmpty()) {
connect(openExternalAction, SIGNAL(triggered()), this, SLOT(openPageExternal()));
} else {
m_ContextURL = r.linkUrl();
connect(openExternalAction, SIGNAL(triggered()), this, SLOT(openLinkExternal()));
}
menu->addSeparator();
menu->addAction(openExternalAction);
menu->exec(mapToGlobal(event->pos()));
}
}