commit
a1f474c793
@ -1,476 +0,0 @@ |
||||
/*
|
||||
* This program 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 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include "UBAbstractWidget.h" |
||||
|
||||
#include <QtNetwork> |
||||
#include <QtXml> |
||||
|
||||
#include "frameworks/UBFileSystemUtils.h" |
||||
|
||||
#include "core/UBApplicationController.h" |
||||
#include "core/UBApplication.h" |
||||
#include "core/UBSettings.h" |
||||
|
||||
#include "network/UBNetworkAccessManager.h" |
||||
|
||||
#include "web/UBWebPage.h" |
||||
#include "web/UBWebKitUtils.h" |
||||
#include "web/UBWebController.h" |
||||
|
||||
#include "core/memcheck.h" |
||||
|
||||
QStringList UBAbstractWidget::sInlineJavaScripts; |
||||
bool UBAbstractWidget::sInlineJavaScriptLoaded = false; |
||||
|
||||
UBAbstractWidget::UBAbstractWidget(const QUrl& pWidgetUrl, QWidget *parent) |
||||
: UBRoutedMouseEventWebView(parent) |
||||
, mWidgetUrl(pWidgetUrl) |
||||
, mIsResizable(false) |
||||
, mInitialLoadDone(false) |
||||
, mLoadIsErronous(false) |
||||
, mIsFreezable(true) |
||||
, mCanBeContent(0) |
||||
, mCanBeTool(0) |
||||
, mIsFrozen(false) |
||||
, mIsTakingSnapshot(false) |
||||
{ |
||||
setAcceptDrops(true); |
||||
setPage(new UBWebPage(this)); |
||||
QWebView::settings()->setAttribute(QWebSettings::JavaEnabled, true); |
||||
QWebView::settings()->setAttribute(QWebSettings::PluginsEnabled, true); |
||||
QWebView::settings()->setAttribute(QWebSettings::LocalStorageDatabaseEnabled, true); |
||||
QWebView::settings()->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, true); |
||||
QWebView::settings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true); |
||||
QWebView::settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard, true); |
||||
QWebView::settings()->setAttribute(QWebSettings::DnsPrefetchEnabled, true); |
||||
|
||||
QWebView::page()->setNetworkAccessManager(UBNetworkAccessManager::defaultAccessManager()); |
||||
|
||||
setAutoFillBackground(false); |
||||
|
||||
QPalette pagePalette = QWebView::page()->palette(); |
||||
pagePalette.setBrush(QPalette::Base, QBrush(Qt::transparent)); |
||||
pagePalette.setBrush(QPalette::Window, QBrush(Qt::transparent)); |
||||
QWebView::page()->setPalette(pagePalette); |
||||
|
||||
QPalette viewPalette = palette(); |
||||
pagePalette.setBrush(QPalette::Base, QBrush(Qt::transparent)); |
||||
viewPalette.setBrush(QPalette::Window, QBrush(Qt::transparent)); |
||||
setPalette(viewPalette); |
||||
|
||||
connect(QWebView::page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(javaScriptWindowObjectCleared())); |
||||
connect(QWebView::page(), SIGNAL(geometryChangeRequested(const QRect&)), this, SIGNAL(geometryChangeRequested(const QRect&))); |
||||
connect(this, SIGNAL(loadFinished(bool)), this, SLOT(mainFrameLoadFinished (bool))); |
||||
|
||||
setMouseTracking(true); |
||||
} |
||||
|
||||
bool UBAbstractWidget::canBeContent() |
||||
{ |
||||
// if we under MAC OS
|
||||
#if defined(Q_OS_MAC) |
||||
return mCanBeContent & UBAbstractWidget::type_MAC; |
||||
#endif |
||||
|
||||
// if we under UNIX OS
|
||||
#if defined(Q_OS_UNIX) |
||||
return mCanBeContent & UBAbstractWidget::type_UNIX; |
||||
#endif |
||||
|
||||
// if we under WINDOWS OS
|
||||
#if defined(Q_OS_WIN) |
||||
return mCanBeContent & UBAbstractWidget::type_WIN; |
||||
#endif |
||||
} |
||||
|
||||
bool UBAbstractWidget::canBeTool() |
||||
{ |
||||
// if we under MAC OS
|
||||
#if defined(Q_OS_MAC) |
||||
return mCanBeTool & UBAbstractWidget::type_MAC; |
||||
#endif |
||||
|
||||
// if we under UNIX OS
|
||||
#if defined(Q_OS_UNIX) |
||||
return mCanBeTool & UBAbstractWidget::type_UNIX; |
||||
#endif |
||||
|
||||
// if we under WINDOWS OS
|
||||
#if defined(Q_OS_WIN) |
||||
return mCanBeTool & UBAbstractWidget::type_WIN; |
||||
#endif |
||||
} |
||||
|
||||
UBAbstractWidget::~UBAbstractWidget() |
||||
{ |
||||
// NOOP
|
||||
} |
||||
|
||||
void UBAbstractWidget::loadMainHtml() |
||||
{ |
||||
mInitialLoadDone = false; |
||||
QWebView::load(mMainHtmlUrl); |
||||
} |
||||
|
||||
bool UBAbstractWidget::event(QEvent *event) |
||||
{ |
||||
if (event->type() == QEvent::ContextMenu) |
||||
{ |
||||
event->accept(); |
||||
return true; |
||||
} else { |
||||
return QWebView::event(event); |
||||
} |
||||
} |
||||
|
||||
|
||||
void UBAbstractWidget::mainFrameLoadFinished (bool ok) |
||||
{ |
||||
mInitialLoadDone = true; |
||||
mLoadIsErronous = !ok; |
||||
|
||||
update(); |
||||
} |
||||
|
||||
|
||||
bool UBAbstractWidget::hasEmbededObjects() |
||||
{ |
||||
if (QWebView::page()->mainFrame()) |
||||
{ |
||||
QList<UBWebKitUtils::HtmlObject> htmlObjects = UBWebKitUtils::objectsInFrame(QWebView::page()->mainFrame()); |
||||
return htmlObjects.length() > 0; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
|
||||
bool UBAbstractWidget::hasEmbededFlash() |
||||
{ |
||||
if (hasEmbededObjects()) |
||||
{ |
||||
return QWebView::page()->mainFrame()->toHtml().contains("application/x-shockwave-flash"); |
||||
} |
||||
else |
||||
{ |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
|
||||
void UBAbstractWidget::resize(qreal width, qreal height) |
||||
{ |
||||
qreal w = qMax((qreal)mNominalSize.width(), width); |
||||
qreal h = qMax((qreal)mNominalSize.height(), height); |
||||
QWebView::page()->setViewportSize(QSize(w, h)); |
||||
QWebView::setFixedSize(QSize(w, h)); |
||||
} |
||||
|
||||
|
||||
QString UBAbstractWidget::iconFilePath(const QUrl& pUrl) |
||||
{ |
||||
// TODO UB 4.x read config.xml widget.icon param first
|
||||
|
||||
QStringList files; |
||||
|
||||
files << "icon.svg"; // W3C widget default 1
|
||||
files << "icon.ico"; // W3C widget default 2
|
||||
files << "icon.png"; // W3C widget default 3
|
||||
files << "icon.gif"; // W3C widget default 4
|
||||
|
||||
files << "Icon.png"; // Apple widget default
|
||||
|
||||
QString file = UBFileSystemUtils::getFirstExistingFileFromList(pUrl.toLocalFile(), files); |
||||
|
||||
// default
|
||||
if (file.length() == 0) |
||||
{ |
||||
file = QString(":/images/defaultWidgetIcon.png"); |
||||
} |
||||
|
||||
return file; |
||||
} |
||||
|
||||
|
||||
|
||||
QString UBAbstractWidget::widgetName(const QUrl& widgetPath) |
||||
{ |
||||
QString name; |
||||
QString version; |
||||
|
||||
QFile w3CConfigFile(widgetPath.toLocalFile() + "/config.xml"); |
||||
QFile appleConfigFile(widgetPath.toLocalFile() + "/Info.plist"); |
||||
|
||||
if (w3CConfigFile.exists() && w3CConfigFile.open(QFile::ReadOnly)) |
||||
{ |
||||
QDomDocument doc; |
||||
doc.setContent(w3CConfigFile.readAll()); |
||||
QDomElement root = doc.firstChildElement("widget"); |
||||
if (!root.isNull()) |
||||
{ |
||||
QDomElement nameElement = root.firstChildElement("name"); |
||||
if (!nameElement.isNull()) |
||||
name = nameElement.text(); |
||||
|
||||
version = root.attribute("version", ""); |
||||
} |
||||
|
||||
w3CConfigFile.close(); |
||||
} |
||||
else if (appleConfigFile.exists() && appleConfigFile.open(QFile::ReadOnly)) |
||||
{ |
||||
QDomDocument doc; |
||||
doc.setContent(appleConfigFile.readAll()); |
||||
QDomElement root = doc.firstChildElement("plist"); |
||||
if (!root.isNull()) |
||||
{ |
||||
QDomElement dictElement = root.firstChildElement("dict"); |
||||
if (!dictElement.isNull()) |
||||
{ |
||||
QDomNodeList childNodes = dictElement.childNodes(); |
||||
|
||||
// looking for something like
|
||||
// ..
|
||||
// <key>CFBundleDisplayName</key>
|
||||
// <string>brain scans</string>
|
||||
// ..
|
||||
|
||||
for(int i = 0; i < childNodes.count() - 1; i++) |
||||
{ |
||||
if (childNodes.at(i).isElement()) |
||||
{ |
||||
QDomElement elKey = childNodes.at(i).toElement(); |
||||
if (elKey.text() == "CFBundleDisplayName") |
||||
{ |
||||
if (childNodes.at(i + 1).isElement()) |
||||
{ |
||||
QDomElement elValue = childNodes.at(i + 1).toElement(); |
||||
name = elValue.text(); |
||||
} |
||||
} |
||||
else if (elKey.text() == "CFBundleShortVersionString") |
||||
{ |
||||
if (childNodes.at(i + 1).isElement()) |
||||
{ |
||||
QDomElement elValue = childNodes.at(i + 1).toElement(); |
||||
version = elValue.text(); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
appleConfigFile.close(); |
||||
} |
||||
|
||||
QString result; |
||||
|
||||
if (name.length() > 0) |
||||
{ |
||||
result = name; |
||||
if (version.length() > 0) |
||||
{ |
||||
result += " "; |
||||
result += version; |
||||
} |
||||
} |
||||
|
||||
return result; |
||||
} |
||||
|
||||
|
||||
int UBAbstractWidget::widgetType(const QUrl& pUrl) |
||||
{ |
||||
QString mime = UBFileSystemUtils::mimeTypeFromFileName(pUrl.toString()); |
||||
|
||||
if (mime == "application/vnd.apple-widget") |
||||
{ |
||||
return UBWidgetType::Apple; |
||||
} |
||||
else if (mime == "application/widget") |
||||
{ |
||||
return UBWidgetType::W3C; |
||||
} |
||||
else |
||||
{ |
||||
return UBWidgetType::Other; |
||||
} |
||||
} |
||||
|
||||
|
||||
void UBAbstractWidget::mousePressEvent(QMouseEvent *event) |
||||
{ |
||||
if(mIsFrozen) |
||||
{ |
||||
event->accept(); |
||||
return; |
||||
} |
||||
UBRoutedMouseEventWebView::mousePressEvent(event); |
||||
mMouseIsPressed = true; |
||||
} |
||||
|
||||
|
||||
void UBAbstractWidget::mouseMoveEvent(QMouseEvent *event) |
||||
{ |
||||
|
||||
if(mIsFrozen) |
||||
{ |
||||
event->accept(); |
||||
return; |
||||
} |
||||
|
||||
// TODO UB 4.x fix web kit mouse move routing
|
||||
|
||||
if (mFirstReleaseAfterMove) |
||||
{ |
||||
mFirstReleaseAfterMove = false; |
||||
} |
||||
else |
||||
{ |
||||
UBRoutedMouseEventWebView::mouseMoveEvent(event); |
||||
} |
||||
} |
||||
|
||||
|
||||
void UBAbstractWidget::mouseReleaseEvent(QMouseEvent *event) |
||||
{ |
||||
if(mIsFrozen) |
||||
{ |
||||
event->accept(); |
||||
return; |
||||
} |
||||
|
||||
UBRoutedMouseEventWebView::mouseReleaseEvent(event); |
||||
mMouseIsPressed = false; |
||||
mFirstReleaseAfterMove = true; |
||||
} |
||||
|
||||
QWebView * UBAbstractWidget::createWindow(QWebPage::WebWindowType type) |
||||
{ |
||||
if (type == QWebPage::WebBrowserWindow) |
||||
{ |
||||
UBApplication::applicationController->showInternet(); |
||||
return UBApplication::webController->createNewTab(); |
||||
} |
||||
else |
||||
{ |
||||
return this; |
||||
} |
||||
} |
||||
|
||||
|
||||
void UBAbstractWidget::injectInlineJavaScript() |
||||
{ |
||||
if (!sInlineJavaScriptLoaded) |
||||
{ |
||||
sInlineJavaScripts = UBApplication::applicationController->widgetInlineJavaScripts(); |
||||
sInlineJavaScriptLoaded = true; |
||||
} |
||||
|
||||
foreach(QString script, sInlineJavaScripts) |
||||
{ |
||||
QWebView::page()->mainFrame()->evaluateJavaScript(script); |
||||
} |
||||
} |
||||
|
||||
|
||||
void UBAbstractWidget::javaScriptWindowObjectCleared() |
||||
{ |
||||
injectInlineJavaScript(); |
||||
} |
||||
|
||||
|
||||
void UBAbstractWidget::paintEvent(QPaintEvent * event) |
||||
{ |
||||
if (mIsFrozen) |
||||
{ |
||||
QPainter p(this); |
||||
p.drawPixmap(0, 0, mSnapshot); |
||||
} |
||||
else |
||||
{ |
||||
QWebView::paintEvent(event); |
||||
} |
||||
if (!mInitialLoadDone || mLoadIsErronous) |
||||
{ |
||||
QPainter p(this); |
||||
QString message = tr("Loading ..."); |
||||
|
||||
// this is the right way of doing but we receive two callback and the one return always that the
|
||||
// load as failed... to check
|
||||
if (mInitialLoadDone && mLoadIsErronous) |
||||
message = tr("Cannot load content"); |
||||
else |
||||
message = tr("Loading ..."); |
||||
|
||||
p.setFont(QFont("Arial", 12)); |
||||
|
||||
QFontMetrics fm = p.fontMetrics(); |
||||
QRect txtBoundingRect = fm.boundingRect(message); |
||||
|
||||
txtBoundingRect.moveCenter(rect().center()); |
||||
txtBoundingRect.adjust(-10, -5, 10, 5); |
||||
|
||||
p.setPen(Qt::NoPen); |
||||
p.setBrush(UBSettings::paletteColor); |
||||
p.drawRoundedRect(txtBoundingRect, 3, 3); |
||||
|
||||
p.setPen(Qt::white); |
||||
p.drawText(rect(), Qt::AlignCenter, message); |
||||
} |
||||
} |
||||
void UBAbstractWidget::dropEvent(QDropEvent *event) |
||||
{ |
||||
QWebView::dropEvent(event); |
||||
} |
||||
|
||||
QPixmap UBAbstractWidget::takeSnapshot() |
||||
{ |
||||
mIsTakingSnapshot = true; |
||||
|
||||
QPixmap pix(size()); |
||||
pix.fill(Qt::transparent); |
||||
|
||||
render(&pix); |
||||
|
||||
mIsTakingSnapshot = false; |
||||
|
||||
return pix; |
||||
} |
||||
|
||||
|
||||
void UBAbstractWidget::setSnapshot(const QPixmap& pix) |
||||
{ |
||||
mSnapshot = pix; |
||||
} |
||||
|
||||
|
||||
void UBAbstractWidget::freeze() |
||||
{ |
||||
QPixmap pix = takeSnapshot(); |
||||
mIsFrozen = true; |
||||
setSnapshot(pix); |
||||
update(); |
||||
} |
||||
|
||||
|
||||
void UBAbstractWidget::unFreeze() |
||||
{ |
||||
mIsFrozen = false; |
||||
update(); |
||||
} |
||||
|
@ -1,155 +0,0 @@ |
||||
/*
|
||||
* This program 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 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef UBABSTRACTWIDGET_H_ |
||||
#define UBABSTRACTWIDGET_H_ |
||||
|
||||
#include <QtGui> |
||||
#include <QtWebKit> |
||||
|
||||
#include "web/UBRoutedMouseEventWebView.h" |
||||
|
||||
|
||||
struct UBWidgetType |
||||
{ |
||||
enum Enum |
||||
{ |
||||
W3C = 0, Apple, Other |
||||
}; |
||||
}; |
||||
|
||||
|
||||
class UBAbstractWidget : public UBRoutedMouseEventWebView |
||||
{ |
||||
Q_OBJECT; |
||||
|
||||
public: |
||||
UBAbstractWidget(const QUrl& pWidgetUrl, QWidget *parent = 0); |
||||
virtual ~UBAbstractWidget(); |
||||
|
||||
void loadMainHtml(); |
||||
|
||||
QUrl mainHtml() |
||||
{ |
||||
return mMainHtmlUrl; |
||||
} |
||||
|
||||
QUrl widgetUrl() |
||||
{ |
||||
return mWidgetUrl; |
||||
} |
||||
|
||||
QString mainHtmlFileName() |
||||
{ |
||||
return mMainHtmlFileName; |
||||
} |
||||
|
||||
bool hasEmbededObjects(); |
||||
bool hasEmbededFlash(); |
||||
|
||||
void resize(qreal width, qreal height); |
||||
|
||||
QSize nominalSize() const |
||||
{ |
||||
return mNominalSize; |
||||
} |
||||
|
||||
bool canBeContent(); |
||||
bool canBeTool(); |
||||
|
||||
bool hasLoadedSuccessfully() const |
||||
{ |
||||
return (mInitialLoadDone && !mLoadIsErronous); |
||||
} |
||||
|
||||
bool freezable() { return mIsFreezable;} |
||||
bool resizable() { return mIsResizable;} |
||||
|
||||
static QString iconFilePath(const QUrl& pUrl); |
||||
static QString widgetName(const QUrl& pUrl); |
||||
static int widgetType(const QUrl& pUrl); |
||||
|
||||
bool isFrozen(){ return mIsFrozen;} |
||||
|
||||
QPixmap snapshot(){return mSnapshot;} |
||||
void setSnapshot(const QPixmap& pix); |
||||
|
||||
QPixmap takeSnapshot(); |
||||
|
||||
public slots: |
||||
void freeze(); |
||||
void unFreeze(); |
||||
|
||||
signals: |
||||
|
||||
void geometryChangeRequested(const QRect & geom); |
||||
|
||||
protected: |
||||
|
||||
bool mMouseIsPressed; |
||||
bool mFirstReleaseAfterMove; |
||||
|
||||
virtual bool event(QEvent *e); |
||||
|
||||
virtual void mousePressEvent(QMouseEvent *event); |
||||
virtual void mouseMoveEvent(QMouseEvent *event); |
||||
virtual void mouseReleaseEvent(QMouseEvent *event); |
||||
|
||||
virtual QWebView * createWindow(QWebPage::WebWindowType type); |
||||
|
||||
QUrl mMainHtmlUrl; |
||||
QString mMainHtmlFileName; |
||||
QUrl mWidgetUrl; |
||||
QSize mNominalSize; |
||||
bool mIsResizable; |
||||
bool mInitialLoadDone; |
||||
bool mLoadIsErronous; |
||||
|
||||
bool mIsFreezable; |
||||
int mCanBeContent; |
||||
int mCanBeTool; |
||||
enum OSType |
||||
{ |
||||
type_NONE = 0, // 0000
|
||||
type_WIN = 1, // 0001
|
||||
type_MAC = 2, // 0010
|
||||
type_UNIX = 4, // 0100
|
||||
type_ALL = 7, // 0111
|
||||
}; |
||||
|
||||
virtual void injectInlineJavaScript(); |
||||
virtual void paintEvent(QPaintEvent * event); |
||||
virtual void dropEvent(QDropEvent *); |
||||
|
||||
protected slots: |
||||
|
||||
void mainFrameLoadFinished(bool ok); |
||||
|
||||
private: |
||||
|
||||
static QStringList sInlineJavaScripts; |
||||
static bool sInlineJavaScriptLoaded; |
||||
|
||||
bool mIsFrozen; |
||||
QPixmap mSnapshot; |
||||
|
||||
bool mIsTakingSnapshot; |
||||
|
||||
private slots: |
||||
void javaScriptWindowObjectCleared(); |
||||
|
||||
}; |
||||
|
||||
#endif /* UBABSTRACTWIDGET_H_ */ |
@ -1,77 +0,0 @@ |
||||
/*
|
||||
* This program 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 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include "UBAppleWidget.h" |
||||
|
||||
#include <QtNetwork> |
||||
|
||||
#include "web/UBWebKitUtils.h" |
||||
|
||||
#include "network/UBNetworkAccessManager.h" |
||||
|
||||
#include "core/memcheck.h" |
||||
|
||||
UBAppleWidget::UBAppleWidget(const QUrl& pWidgetUrl, QWidget *parent) |
||||
: UBAbstractWidget(pWidgetUrl, parent) |
||||
{ |
||||
QString path = pWidgetUrl.toLocalFile(); |
||||
|
||||
if (!path.endsWith(".wdgt") && !path.endsWith(".wdgt/")) |
||||
{ |
||||
int lastSlashIndex = path.lastIndexOf("/"); |
||||
if (lastSlashIndex > 0) |
||||
{ |
||||
path = path.mid(0, lastSlashIndex + 1); |
||||
} |
||||
} |
||||
|
||||
QFile plistFile(path + "/Info.plist"); |
||||
plistFile.open(QFile::ReadOnly); |
||||
|
||||
QByteArray plistBin = plistFile.readAll(); |
||||
QString plist = QString::fromUtf8(plistBin); |
||||
|
||||
int mainHtmlIndex = plist.indexOf("MainHTML"); |
||||
int mainHtmlIndexStart = plist.indexOf("<string>", mainHtmlIndex); |
||||
int mainHtmlIndexEnd = plist.indexOf("</string>", mainHtmlIndexStart); |
||||
|
||||
if (mainHtmlIndex > -1 && mainHtmlIndexStart > -1 && mainHtmlIndexEnd > -1) |
||||
{ |
||||
mMainHtmlFileName = plist.mid(mainHtmlIndexStart + 8, mainHtmlIndexEnd - mainHtmlIndexStart - 8); |
||||
} |
||||
|
||||
mMainHtmlUrl = pWidgetUrl; |
||||
mMainHtmlUrl.setPath(pWidgetUrl.path() + "/" + mMainHtmlFileName); |
||||
|
||||
QWebView::load(mMainHtmlUrl); |
||||
|
||||
QPixmap defaultPixmap(pWidgetUrl.toLocalFile() + "/Default.png"); |
||||
|
||||
setFixedSize(defaultPixmap.size()); |
||||
|
||||
mNominalSize = defaultPixmap.size(); |
||||
} |
||||
|
||||
UBAppleWidget::~UBAppleWidget() |
||||
{ |
||||
// NOOP
|
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,36 +0,0 @@ |
||||
/*
|
||||
* This program 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 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef UBAPPLEWIDGET_H_ |
||||
#define UBAPPLEWIDGET_H_ |
||||
|
||||
#include <QtGui> |
||||
#include <QtWebKit> |
||||
|
||||
#include "UBAbstractWidget.h" |
||||
|
||||
class UBItem; |
||||
|
||||
class UBAppleWidget : public UBAbstractWidget |
||||
{ |
||||
Q_OBJECT; |
||||
|
||||
public: |
||||
UBAppleWidget(const QUrl& pWidgetUrl, QWidget *parent = 0); |
||||
virtual ~UBAppleWidget(); |
||||
|
||||
}; |
||||
|
||||
#endif /* UBAPPLEWIDGET_H_ */ |
@ -0,0 +1,160 @@ |
||||
/*
|
||||
* This program 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 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include <QtGui> |
||||
#include <QtWebKit> |
||||
|
||||
#include "UBGraphicsWebView.h" |
||||
#include "UBGraphicsScene.h" |
||||
#include "UBGraphicsItemDelegate.h" |
||||
#include "UBGraphicsDelegateFrame.h" |
||||
|
||||
#include "core/memcheck.h" |
||||
|
||||
UBGraphicsWebView::UBGraphicsWebView(QGraphicsItem* parent) |
||||
: QGraphicsWebView(parent) |
||||
{ |
||||
setData(UBGraphicsItemData::ItemLayerType, UBItemLayerType::Object); |
||||
|
||||
mDelegate = new UBGraphicsItemDelegate(this, 0, true, false, false); |
||||
mDelegate->init(); |
||||
|
||||
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); |
||||
|
||||
QGraphicsWebView::setAcceptHoverEvents(true); |
||||
} |
||||
|
||||
|
||||
UBGraphicsWebView::~UBGraphicsWebView() |
||||
{ |
||||
if (mDelegate) |
||||
delete mDelegate; |
||||
} |
||||
|
||||
|
||||
QVariant UBGraphicsWebView::itemChange(GraphicsItemChange change, const QVariant &value) |
||||
{ |
||||
if ((change == QGraphicsItem::ItemSelectedHasChanged) && scene()) { |
||||
if (isSelected()) |
||||
scene()->setActiveWindow(this); |
||||
else |
||||
if(scene()->activeWindow() == this) |
||||
scene()->setActiveWindow(0); |
||||
} |
||||
|
||||
QVariant newValue = mDelegate->itemChange(change, value); |
||||
return QGraphicsWebView::itemChange(change, newValue); |
||||
} |
||||
|
||||
void UBGraphicsWebView::setUuid(const QUuid &pUuid) |
||||
{ |
||||
UBItem::setUuid(pUuid); |
||||
setData(UBGraphicsItemData::ItemUuid, QVariant(pUuid)); //store item uuid inside the QGraphicsItem to fast operations with Items on the scene
|
||||
} |
||||
|
||||
void UBGraphicsWebView::mousePressEvent(QGraphicsSceneMouseEvent *event) |
||||
{ |
||||
if (!mDelegate->mousePressEvent(event)) |
||||
setSelected(true); /* forcing selection */ |
||||
|
||||
QGraphicsWebView::mousePressEvent(event); |
||||
} |
||||
|
||||
|
||||
void UBGraphicsWebView::mouseMoveEvent(QGraphicsSceneMouseEvent *event) |
||||
{ |
||||
if (!mDelegate->mouseMoveEvent(event)) |
||||
QGraphicsWebView::mouseMoveEvent(event); |
||||
} |
||||
|
||||
|
||||
void UBGraphicsWebView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) |
||||
{ |
||||
mDelegate->mouseReleaseEvent(event); |
||||
QGraphicsWebView::mouseReleaseEvent(event); |
||||
} |
||||
|
||||
void UBGraphicsWebView::wheelEvent(QGraphicsSceneWheelEvent *event) |
||||
{ |
||||
if (mDelegate->weelEvent(event)) |
||||
{ |
||||
QGraphicsWebView::wheelEvent(event); |
||||
event->accept(); |
||||
} |
||||
} |
||||
|
||||
void UBGraphicsWebView::hoverEnterEvent(QGraphicsSceneHoverEvent *event) |
||||
{ |
||||
Q_UNUSED(event) |
||||
/* NOOP */ |
||||
} |
||||
void UBGraphicsWebView::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) |
||||
{ |
||||
Q_UNUSED(event) |
||||
/* NOOP */ |
||||
} |
||||
|
||||
void UBGraphicsWebView::setDelegate(UBGraphicsItemDelegate* pDelegate) |
||||
{ |
||||
if (mDelegate) |
||||
delete mDelegate; |
||||
|
||||
mDelegate = pDelegate; |
||||
} |
||||
|
||||
|
||||
void UBGraphicsWebView::resize(qreal w, qreal h) |
||||
{ |
||||
UBGraphicsWebView::resize(QSizeF(w, h)); |
||||
} |
||||
|
||||
|
||||
void UBGraphicsWebView::resize(const QSizeF & pSize) |
||||
{ |
||||
if (pSize != size()) { |
||||
QGraphicsWebView::setMaximumSize(pSize.width(), pSize.height()); |
||||
QGraphicsWebView::resize(pSize.width(), pSize.height()); |
||||
if (mDelegate) |
||||
mDelegate->positionHandles(); |
||||
if (scene()) |
||||
scene()->setModified(true); |
||||
} |
||||
} |
||||
|
||||
QSizeF UBGraphicsWebView::size() const |
||||
{ |
||||
return QGraphicsWebView::size(); |
||||
} |
||||
|
||||
|
||||
UBGraphicsScene* UBGraphicsWebView::scene() |
||||
{ |
||||
return static_cast<UBGraphicsScene*>(QGraphicsItem::scene()); |
||||
} |
||||
|
||||
|
||||
void UBGraphicsWebView::remove() |
||||
{ |
||||
if (mDelegate) |
||||
mDelegate->remove(true); |
||||
} |
||||
|
||||
bool UBGraphicsWebView::event(QEvent *event) |
||||
{ |
||||
if (event->type() == QEvent::ShortcutOverride) |
||||
event->accept(); |
||||
|
||||
return QGraphicsWebView::event(event); |
||||
} |
@ -0,0 +1,62 @@ |
||||
/*
|
||||
* This program 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 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef UBGRAPHICSWEBVIEW_H_ |
||||
#define UBGRAPHICSWEBVIEW_H_ |
||||
|
||||
#include <QtGui> |
||||
#include <QtWebKit> |
||||
|
||||
#include "UBItem.h" |
||||
#include "UBResizableGraphicsItem.h" |
||||
|
||||
class UBGraphicsItemDelegate; |
||||
|
||||
class UBGraphicsWebView: public QGraphicsWebView, public UBItem, public UBResizableGraphicsItem, public UBGraphicsItem |
||||
{ |
||||
public: |
||||
UBGraphicsWebView(QGraphicsItem* parent = 0); |
||||
virtual ~UBGraphicsWebView(); |
||||
|
||||
virtual void resize(qreal w, qreal h); |
||||
virtual void resize(const QSizeF & size); |
||||
|
||||
virtual QSizeF size() const; |
||||
|
||||
void setDelegate(UBGraphicsItemDelegate* pDelegate); |
||||
|
||||
virtual UBGraphicsScene* scene(); |
||||
|
||||
virtual void remove(); |
||||
|
||||
virtual UBGraphicsItemDelegate* Delegate() const { return mDelegate;} |
||||
|
||||
virtual void clearSource(){;} |
||||
virtual void setUuid(const QUuid &pUuid); |
||||
|
||||
protected: |
||||
|
||||
virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); |
||||
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); |
||||
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); |
||||
virtual void wheelEvent(QGraphicsSceneWheelEvent *event); |
||||
virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event); |
||||
virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); |
||||
virtual bool event(QEvent *event); |
||||
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); |
||||
|
||||
}; |
||||
|
||||
#endif /* UBGRAPHICSWEBVIEW_H_ */ |
File diff suppressed because it is too large
Load Diff
@ -1,525 +0,0 @@ |
||||
/*
|
||||
* This program 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 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include "UBW3CWidget.h" |
||||
|
||||
#include <QtNetwork> |
||||
#include <QtXml> |
||||
|
||||
#include "frameworks/UBPlatformUtils.h" |
||||
#include "frameworks/UBFileSystemUtils.h" |
||||
|
||||
#include "core/UBApplication.h" |
||||
#include "core/UBSettings.h" |
||||
#include "api/UBWidgetUniboardAPI.h" |
||||
|
||||
#include "board/UBBoardController.h" |
||||
|
||||
#include "core/memcheck.h" |
||||
|
||||
|
||||
bool UBW3CWidget::sTemplateLoaded = false; |
||||
QMap<QString, QString> UBW3CWidget::sNPAPIWrapperTemplates; |
||||
QString UBW3CWidget::sNPAPIWrappperConfigTemplate; |
||||
|
||||
|
||||
UBW3CWidget::UBW3CWidget(const QUrl& pWidgetUrl, QWidget *parent) |
||||
: UBAbstractWidget(pWidgetUrl, parent) |
||||
|
||||
{ |
||||
QString path = pWidgetUrl.toLocalFile(); |
||||
QDir potentialDir(path); |
||||
|
||||
if (!path.endsWith(".wgt") && !path.endsWith(".wgt/") && !potentialDir.exists()) |
||||
{ |
||||
int lastSlashIndex = path.lastIndexOf("/"); |
||||
if (lastSlashIndex > 0) |
||||
{ |
||||
path = path.mid(0, lastSlashIndex + 1); |
||||
} |
||||
} |
||||
|
||||
if(!path.endsWith("/")) |
||||
path += "/"; |
||||
|
||||
int width = 300; |
||||
int height = 150; |
||||
|
||||
QFile configFile(path + "config.xml"); |
||||
configFile.open(QFile::ReadOnly); |
||||
|
||||
QDomDocument doc; |
||||
doc.setContent(configFile.readAll()); |
||||
QDomNodeList widgetDomList = doc.elementsByTagName("widget"); |
||||
|
||||
if (widgetDomList.count() > 0) |
||||
{ |
||||
QDomElement widgetElement = widgetDomList.item(0).toElement(); |
||||
|
||||
width = widgetElement.attribute("width", "300").toInt(); |
||||
height = widgetElement.attribute("height", "150").toInt(); |
||||
|
||||
mMetadatas.id = widgetElement.attribute("id", ""); |
||||
|
||||
//some early widget (<= 4.3.4) where using identifier instead of id
|
||||
if (mMetadatas.id.length() == 0) |
||||
mMetadatas.id = widgetElement.attribute("identifier", ""); |
||||
|
||||
mMetadatas.version = widgetElement.attribute("version", ""); |
||||
|
||||
// TODO UB 4.x map properly ub namespace
|
||||
mIsResizable = widgetElement.attribute("ub:resizable", "false") == "true"; |
||||
mIsFreezable = widgetElement.attribute("ub:freezable", "true") == "true"; |
||||
|
||||
QString roles = widgetElement.attribute("ub:roles", "content tool").trimmed().toLower(); |
||||
|
||||
//------------------------------//
|
||||
|
||||
if( roles == "" || roles.contains("tool") ) |
||||
{ |
||||
mCanBeTool = UBAbstractWidget::type_ALL; |
||||
} |
||||
|
||||
if( roles.contains("twin") ) |
||||
{ |
||||
mCanBeTool |= UBAbstractWidget::type_WIN; |
||||
} |
||||
|
||||
if( roles.contains("tmac") ) |
||||
{ |
||||
mCanBeTool |= UBAbstractWidget::type_MAC; |
||||
} |
||||
|
||||
if( roles.contains("tunix") ) |
||||
{ |
||||
mCanBeTool |= UBAbstractWidget::type_UNIX; |
||||
} |
||||
|
||||
//---------//
|
||||
|
||||
if( roles == "" || roles.contains("content") ) |
||||
{ |
||||
mCanBeContent = UBAbstractWidget::type_ALL; |
||||
} |
||||
|
||||
if( roles.contains("cwin") ) |
||||
{ |
||||
mCanBeContent |= UBAbstractWidget::type_WIN; |
||||
} |
||||
|
||||
if( roles.contains("cmac") ) |
||||
{ |
||||
mCanBeContent |= UBAbstractWidget::type_MAC; |
||||
} |
||||
|
||||
if( roles.contains("cunix") ) |
||||
{ |
||||
mCanBeContent |= UBAbstractWidget::type_UNIX; |
||||
} |
||||
|
||||
//------------------------------//
|
||||
|
||||
QDomNodeList contentDomList = widgetElement.elementsByTagName("content"); |
||||
|
||||
if (contentDomList.count() > 0) |
||||
{ |
||||
QDomElement contentElement = contentDomList.item(0).toElement(); |
||||
|
||||
mMainHtmlFileName = contentElement.attribute("src", ""); |
||||
} |
||||
|
||||
mMetadatas.name = textForSubElementByLocale(widgetElement, "name", locale()); |
||||
mMetadatas.description = textForSubElementByLocale(widgetElement, "description ", locale()); |
||||
|
||||
QDomNodeList authorDomList = widgetElement.elementsByTagName("author"); |
||||
|
||||
if (authorDomList.count() > 0) |
||||
{ |
||||
QDomElement authorElement = authorDomList.item(0).toElement(); |
||||
|
||||
mMetadatas.author = authorElement.text(); |
||||
mMetadatas.authorHref = authorElement.attribute("href", ""); |
||||
mMetadatas.authorEmail = authorElement.attribute("email ", ""); |
||||
} |
||||
|
||||
QDomNodeList propertiesDomList = widgetElement.elementsByTagName("preference"); |
||||
|
||||
for (uint i = 0; i < propertiesDomList.length(); i++) |
||||
{ |
||||
QDomElement preferenceElement = propertiesDomList.at(i).toElement(); |
||||
QString prefName = preferenceElement.attribute("name", ""); |
||||
|
||||
if (prefName.length() > 0) |
||||
{ |
||||
QString prefValue = preferenceElement.attribute("value", ""); |
||||
bool readOnly = (preferenceElement.attribute("readonly", "false") == "true"); |
||||
|
||||
mPreferences.insert(prefName, PreferenceValue(prefValue, readOnly)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
if (mMainHtmlFileName.length() == 0) |
||||
{ |
||||
QFile defaultStartFile(path + "index.htm"); |
||||
|
||||
if (defaultStartFile.exists()) |
||||
{ |
||||
mMainHtmlFileName = "index.htm"; |
||||
} |
||||
else |
||||
{ |
||||
QFile secondDefaultStartFile(path + "index.html"); |
||||
|
||||
if (secondDefaultStartFile.exists()) |
||||
{ |
||||
mMainHtmlFileName = "index.html"; |
||||
} |
||||
} |
||||
} |
||||
|
||||
mMainHtmlUrl = pWidgetUrl; |
||||
mMainHtmlUrl.setPath(pWidgetUrl.path() + "/" + mMainHtmlFileName); |
||||
// is it a valid local file ?
|
||||
QFile f(mMainHtmlUrl.toLocalFile()); |
||||
|
||||
if(!f.exists()) |
||||
mMainHtmlUrl = QUrl(mMainHtmlFileName); |
||||
|
||||
connect(page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(javaScriptWindowObjectCleared())); |
||||
connect(UBApplication::boardController, SIGNAL(activeSceneChanged()), this, SLOT(javaScriptWindowObjectCleared())); |
||||
|
||||
QWebView::load(mMainHtmlUrl); |
||||
|
||||
setFixedSize(QSize(width, height)); |
||||
|
||||
mNominalSize = QSize(width, height); |
||||
} |
||||
|
||||
UBW3CWidget::~UBW3CWidget() |
||||
{ |
||||
// NOOP
|
||||
} |
||||
|
||||
void UBW3CWidget::javaScriptWindowObjectCleared() |
||||
{ |
||||
UBWidgetUniboardAPI *uniboardAPI = new UBWidgetUniboardAPI(UBApplication::boardController->activeScene(), 0); |
||||
|
||||
page()->mainFrame()->addToJavaScriptWindowObject("sankore", uniboardAPI); |
||||
|
||||
} |
||||
|
||||
bool UBW3CWidget::hasNPAPIWrapper(const QString& pMimeType) |
||||
{ |
||||
loadNPAPIWrappersTemplates(); |
||||
|
||||
return sNPAPIWrapperTemplates.contains(pMimeType); |
||||
} |
||||
|
||||
|
||||
QString UBW3CWidget::createNPAPIWrapper(const QString& url, |
||||
const QString& pMimeType, const QSize& sizeHint, const QString& pName) |
||||
{ |
||||
const QString userWidgetPath = UBSettings::settings()->userInteractiveDirectory() + "/" + tr("Web"); |
||||
QDir userWidgetDir(userWidgetPath); |
||||
|
||||
return createNPAPIWrapperInDir(url, userWidgetDir, pMimeType, sizeHint, pName); |
||||
} |
||||
|
||||
|
||||
|
||||
QString UBW3CWidget::createNPAPIWrapperInDir(const QString& pUrl, const QDir& pDir, |
||||
const QString& pMimeType, const QSize& sizeHint, |
||||
const QString& pName) |
||||
{ |
||||
QString url = pUrl; |
||||
url = UBFileSystemUtils::removeLocalFilePrefix(url); |
||||
QString name = pName; |
||||
|
||||
QFileInfo fi(url); |
||||
|
||||
if (name.length() == 0) |
||||
name = fi.baseName(); |
||||
|
||||
if (fi.exists()){ |
||||
url = fi.fileName(); |
||||
} |
||||
|
||||
loadNPAPIWrappersTemplates(); |
||||
|
||||
QString htmlTemplate; |
||||
|
||||
if (pMimeType.length() > 0 && sNPAPIWrapperTemplates.contains(pMimeType)){ |
||||
htmlTemplate = sNPAPIWrapperTemplates.value(pMimeType); |
||||
} |
||||
else { |
||||
QString extension = UBFileSystemUtils::extension(url); |
||||
|
||||
if (sNPAPIWrapperTemplates.contains(extension)) |
||||
htmlTemplate = sNPAPIWrapperTemplates.value(extension); |
||||
} |
||||
|
||||
if (htmlTemplate.length() > 0){ |
||||
htmlTemplate = htmlTemplate.replace(QString("{in.url}"), url) |
||||
.replace(QString("{in.width}"), QString("%1").arg(sizeHint.width())) |
||||
.replace(QString("{in.height}"), QString("%1").arg(sizeHint.height())); |
||||
|
||||
QString configTemplate = sNPAPIWrappperConfigTemplate |
||||
.replace(QString("{in.id}"), url) |
||||
.replace(QString("{in.width}"), QString("%1").arg(sizeHint.width())) |
||||
.replace(QString("{in.height}"), QString("%1").arg(sizeHint.height())) |
||||
.replace(QString("{in.name}"), name) |
||||
.replace(QString("{in.startFile}"), QString("index.htm")); |
||||
|
||||
QString dirPath = pDir.path(); |
||||
if (!pDir.exists()) |
||||
pDir.mkpath(dirPath); |
||||
|
||||
QString widgetLibraryPath = dirPath + "/" + name + ".wgt"; |
||||
QDir widgetLibraryDir(widgetLibraryPath); |
||||
|
||||
if (widgetLibraryDir.exists()) |
||||
{ |
||||
if (!UBFileSystemUtils::deleteDir(widgetLibraryDir.path())) |
||||
{ |
||||
qWarning() << "Cannot delete old widget " << widgetLibraryDir.path(); |
||||
} |
||||
} |
||||
|
||||
widgetLibraryDir.mkpath(widgetLibraryPath); |
||||
if (fi.exists()){ |
||||
QString target = widgetLibraryPath + "/" + fi.fileName(); |
||||
QString source = pUrl; |
||||
source = UBFileSystemUtils::removeLocalFilePrefix(source); |
||||
QFile::copy(source, target); |
||||
} |
||||
|
||||
QFile configFile(widgetLibraryPath + "/config.xml"); |
||||
|
||||
if (!configFile.open(QIODevice::WriteOnly)) |
||||
{ |
||||
qWarning() << "Cannot open file " << configFile.fileName(); |
||||
return ""; |
||||
} |
||||
|
||||
QTextStream outConfig(&configFile); |
||||
outConfig.setCodec("UTF-8"); |
||||
|
||||
outConfig << configTemplate; |
||||
configFile.close(); |
||||
|
||||
QFile indexFile(widgetLibraryPath + "/index.htm"); |
||||
|
||||
if (!indexFile.open(QIODevice::WriteOnly)) |
||||
{ |
||||
qWarning() << "Cannot open file " << indexFile.fileName(); |
||||
return ""; |
||||
} |
||||
|
||||
QTextStream outIndex(&indexFile); |
||||
outIndex.setCodec("UTF-8"); |
||||
|
||||
outIndex << htmlTemplate; |
||||
indexFile.close(); |
||||
|
||||
return widgetLibraryPath; |
||||
} |
||||
else |
||||
{ |
||||
return ""; |
||||
} |
||||
} |
||||
|
||||
|
||||
QString UBW3CWidget::createHtmlWrapperInDir(const QString& html, const QDir& pDir, |
||||
const QSize& sizeHint, const QString& pName) |
||||
{ |
||||
|
||||
QString widgetPath = pDir.path() + "/" + pName + ".wgt"; |
||||
widgetPath = UBFileSystemUtils::nextAvailableFileName(widgetPath); |
||||
QDir widgetDir(widgetPath); |
||||
|
||||
if (!widgetDir.exists()) |
||||
{ |
||||
widgetDir.mkpath(widgetDir.path()); |
||||
} |
||||
|
||||
QFile configFile(widgetPath + "/" + "config.xml"); |
||||
|
||||
if (configFile.exists()) |
||||
{ |
||||
configFile.remove(configFile.fileName()); |
||||
} |
||||
|
||||
if (!configFile.open(QIODevice::WriteOnly)) |
||||
{ |
||||
qWarning() << "Cannot open file " << configFile.fileName(); |
||||
return ""; |
||||
} |
||||
|
||||
QTextStream outConfig(&configFile); |
||||
outConfig.setCodec("UTF-8"); |
||||
outConfig << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl; |
||||
outConfig << "<widget xmlns=\"http://www.w3.org/ns/widgets\"" << endl; |
||||
outConfig << " xmlns:ub=\"http://uniboard.mnemis.com/widgets\"" << endl; |
||||
outConfig << " id=\"http://uniboard.mnemis.com/" << pName << "\"" <<endl; |
||||
|
||||
outConfig << " version=\"1.0\"" << endl; |
||||
outConfig << " width=\"" << sizeHint.width() << "\"" << endl; |
||||
outConfig << " height=\"" << sizeHint.height() << "\"" << endl; |
||||
outConfig << " ub:resizable=\"true\">" << endl; |
||||
|
||||
outConfig << " <name>" << pName << "</name>" << endl; |
||||
outConfig << " <content src=\"" << pName << ".html\"/>" << endl; |
||||
|
||||
outConfig << "</widget>" << endl; |
||||
|
||||
configFile.close(); |
||||
|
||||
const QString fullHtmlFileName = widgetPath + "/" + pName + ".html"; |
||||
|
||||
QFile widgetHtmlFile(fullHtmlFileName); |
||||
if (widgetHtmlFile.exists()) |
||||
{ |
||||
widgetHtmlFile.remove(widgetHtmlFile.fileName()); |
||||
} |
||||
if (!widgetHtmlFile.open(QIODevice::WriteOnly)) |
||||
{ |
||||
qWarning() << "cannot open file " << widgetHtmlFile.fileName(); |
||||
return ""; |
||||
} |
||||
|
||||
QTextStream outStartFile(&widgetHtmlFile); |
||||
outStartFile.setCodec("UTF-8"); |
||||
|
||||
outStartFile << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" << endl; |
||||
outStartFile << "<html>" << endl; |
||||
outStartFile << "<head>" << endl; |
||||
outStartFile << " <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">" << endl; |
||||
outStartFile << "</head>" << endl; |
||||
outStartFile << " <body>" << endl; |
||||
outStartFile << html << endl; |
||||
outStartFile << " </body>" << endl; |
||||
outStartFile << "</html>" << endl; |
||||
|
||||
widgetHtmlFile.close(); |
||||
|
||||
return widgetPath; |
||||
|
||||
} |
||||
|
||||
QString UBW3CWidget::freezedWidgetPage() |
||||
{ |
||||
static QString defaultcontent; |
||||
|
||||
if (defaultcontent.isNull()) { |
||||
QString freezedWidgetDefaultContentFilePath = freezedWidgetFilePath(); |
||||
QFile wrapperFile(freezedWidgetDefaultContentFilePath); |
||||
if (!wrapperFile.open(QIODevice::ReadOnly | QIODevice::Text)) { |
||||
qDebug() << "can't open wrapper file " + freezedWidgetDefaultContentFilePath; |
||||
defaultcontent = ""; |
||||
} else { |
||||
QByteArray arr = wrapperFile.readAll(); |
||||
if (!arr.isEmpty()) { |
||||
defaultcontent = QString(arr); |
||||
} else { |
||||
qDebug() << "content of " + freezedWidgetDefaultContentFilePath + "is empty"; |
||||
defaultcontent = ""; |
||||
} |
||||
} |
||||
} |
||||
|
||||
return defaultcontent; |
||||
} |
||||
|
||||
QString UBW3CWidget::freezedWidgetFilePath() |
||||
{ |
||||
return UBPlatformUtils::applicationResourcesDirectory() + "/etc/" + "freezedWidgetWrapper.html"; |
||||
} |
||||
|
||||
void UBW3CWidget::loadNPAPIWrappersTemplates() |
||||
{ |
||||
if (!sTemplateLoaded) |
||||
{ |
||||
sNPAPIWrapperTemplates.clear(); |
||||
|
||||
QString etcPath = UBPlatformUtils::applicationResourcesDirectory() + "/etc/"; |
||||
|
||||
QDir etcDir(etcPath); |
||||
|
||||
foreach(QString fileName, etcDir.entryList()) |
||||
{ |
||||
if (fileName.startsWith("npapi-wrapper") && (fileName.endsWith(".htm") || fileName.endsWith(".html"))) |
||||
{ |
||||
|
||||
QString htmlContent = UBFileSystemUtils::readTextFile(etcPath + fileName); |
||||
|
||||
if (htmlContent.length() > 0) |
||||
{ |
||||
QStringList tokens = fileName.split("."); |
||||
|
||||
if (tokens.length() >= 4) |
||||
{ |
||||
QString mime = tokens.at(tokens.length() - 4 ); |
||||
mime += "/" + tokens.at(tokens.length() - 3); |
||||
|
||||
QString fileExtension = tokens.at(tokens.length() - 2); |
||||
|
||||
sNPAPIWrapperTemplates.insert(mime, htmlContent); |
||||
sNPAPIWrapperTemplates.insert(fileExtension, htmlContent); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
sNPAPIWrappperConfigTemplate = UBFileSystemUtils::readTextFile(etcPath + "npapi-wrapper.config.xml"); |
||||
|
||||
sTemplateLoaded = true; |
||||
} |
||||
} |
||||
|
||||
|
||||
QString UBW3CWidget::textForSubElementByLocale(QDomElement rootElement, QString subTagName, QLocale locale) |
||||
{ |
||||
QDomNodeList subList = rootElement.elementsByTagName(subTagName); |
||||
|
||||
QString lang = locale.name(); |
||||
|
||||
if (lang.length() > 2) |
||||
lang[2] = QLatin1Char('-'); |
||||
|
||||
if (subList.count() > 1) |
||||
{ |
||||
for(int i = 0; i < subList.count(); i++) |
||||
{ |
||||
QDomNode node = subList.at(i); |
||||
QDomElement element = node.toElement(); |
||||
|
||||
QString configLang = element.attribute("xml:lang", ""); |
||||
|
||||
if(lang == configLang || (configLang.length() == 2 && configLang == lang.left(2))) |
||||
return element.text(); |
||||
} |
||||
} |
||||
|
||||
if (subList.count() >= 1) |
||||
{ |
||||
QDomElement element = subList.item(0).toElement(); |
||||
return element.text(); |
||||
} |
||||
|
||||
return ""; |
||||
} |
||||
|
@ -1,126 +0,0 @@ |
||||
/*
|
||||
* This program 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 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef UBW3CWIDGET_H_ |
||||
#define UBW3CWIDGET_H_ |
||||
|
||||
#include <QtGui> |
||||
#include <QtWebKit> |
||||
#include <QtXml> |
||||
|
||||
/*
|
||||
* wrapper for w3c widget 1.0 as define in http://www.w3.org/TR/widgets/
|
||||
*/ |
||||
|
||||
#include "UBAbstractWidget.h" |
||||
|
||||
class UBItem; |
||||
|
||||
class UBW3CWidget : public UBAbstractWidget |
||||
{ |
||||
Q_OBJECT; |
||||
|
||||
public: |
||||
UBW3CWidget(const QUrl& pWidgetUrl, QWidget *parent = 0); |
||||
|
||||
virtual ~UBW3CWidget(); |
||||
|
||||
static QString createNPAPIWrapper(const QString& url, |
||||
const QString& pMimeType = QString(), const QSize& sizeHint = QSize(300, 150), |
||||
const QString& pName = QString()); |
||||
|
||||
static QString createNPAPIWrapperInDir(const QString& url, const QDir& pDir, |
||||
const QString& pMimeType = QString(), const QSize& sizeHint = QSize(300, 150), |
||||
const QString& pName = QString()); |
||||
|
||||
static QString createHtmlWrapperInDir(const QString& html, const QDir& pDir, |
||||
const QSize& sizeHint, const QString& pName); |
||||
|
||||
static QString freezedWidgetPage(); |
||||
|
||||
static QString freezedWidgetFilePath(); |
||||
|
||||
static bool hasNPAPIWrapper(const QString& pMimeType); |
||||
|
||||
class PreferenceValue |
||||
{ |
||||
public: |
||||
|
||||
PreferenceValue() |
||||
{ |
||||
// NOOP
|
||||
} |
||||
|
||||
|
||||
PreferenceValue(const QString& pValue, bool pReadonly) |
||||
{ |
||||
value = pValue; |
||||
readonly = pReadonly; |
||||
} |
||||
|
||||
QString value; |
||||
bool readonly; |
||||
}; |
||||
|
||||
class Metadata |
||||
{ |
||||
public: |
||||
QString id; |
||||
QString name; |
||||
QString description; |
||||
QString author; |
||||
QString authorEmail; |
||||
QString authorHref; |
||||
QString version; |
||||
}; |
||||
|
||||
|
||||
QMap<QString, PreferenceValue> preferences() |
||||
{ |
||||
return mPreferences; |
||||
} |
||||
|
||||
Metadata metadatas() const |
||||
{ |
||||
return mMetadatas; |
||||
} |
||||
|
||||
private: |
||||
|
||||
QMap<QString, PreferenceValue> mPreferences; |
||||
|
||||
static bool sTemplateLoaded; |
||||
|
||||
static QMap<QString, QString> sNPAPIWrapperTemplates; |
||||
|
||||
static QString sNPAPIWrappperConfigTemplate; |
||||
|
||||
static void loadNPAPIWrappersTemplates(); |
||||
|
||||
static QString textForSubElementByLocale(QDomElement rootElement, QString subTagName, QLocale locale); |
||||
|
||||
// w3c metadata widget attributes
|
||||
//
|
||||
// http://www.w3.org/TR/widgets/#widget0
|
||||
|
||||
Metadata mMetadatas; |
||||
|
||||
private slots: |
||||
|
||||
void javaScriptWindowObjectCleared(); |
||||
|
||||
}; |
||||
|
||||
#endif /* UBW3CWIDGET_H_ */ |
@ -1,100 +0,0 @@ |
||||
/*
|
||||
* This program 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 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include "UBRoutedMouseEventWebView.h" |
||||
|
||||
#include <QtCore> |
||||
#include <QtWebKit> |
||||
#include <QtGui> |
||||
|
||||
#include "core/memcheck.h" |
||||
|
||||
UBRoutedMouseEventWebView::UBRoutedMouseEventWebView(QWidget * parent) |
||||
: QWebView(parent) |
||||
{ |
||||
QWebView::setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform); |
||||
} |
||||
|
||||
UBRoutedMouseEventWebView::~UBRoutedMouseEventWebView() |
||||
{ |
||||
// NOOP
|
||||
} |
||||
|
||||
|
||||
void UBRoutedMouseEventWebView::mouseMoveEvent(QMouseEvent* ev) |
||||
{ |
||||
QWebPage* p = page(); |
||||
|
||||
if (p) |
||||
{ |
||||
p->event(ev); |
||||
} |
||||
} |
||||
|
||||
void UBRoutedMouseEventWebView::mousePressEvent(QMouseEvent* ev) |
||||
{ |
||||
QWebPage* p = page(); |
||||
|
||||
if (p) |
||||
{ |
||||
p->event(ev); |
||||
} |
||||
} |
||||
|
||||
void UBRoutedMouseEventWebView::mouseDoubleClickEvent(QMouseEvent* ev) |
||||
{ |
||||
QWebPage* p = page(); |
||||
|
||||
if (p) |
||||
{ |
||||
p->event(ev); |
||||
} |
||||
} |
||||
|
||||
void UBRoutedMouseEventWebView::mouseReleaseEvent(QMouseEvent* ev) |
||||
{ |
||||
QWebPage* p = page(); |
||||
|
||||
if (p) |
||||
{ |
||||
p->event(ev); |
||||
} |
||||
} |
||||
|
||||
void UBRoutedMouseEventWebView::contextMenuEvent(QContextMenuEvent* ev) |
||||
{ |
||||
QWebPage* p = page(); |
||||
|
||||
if (p) |
||||
{ |
||||
p->event(ev); |
||||
} |
||||
} |
||||
|
||||
|
||||
void UBRoutedMouseEventWebView::wheelEvent(QWheelEvent* ev) |
||||
{ |
||||
QWebPage* p = page(); |
||||
|
||||
if (p) |
||||
{ |
||||
p->event(ev); |
||||
} |
||||
} |
||||
//void UBRoutedMouseEventWebView::dropEvent(QDropEvent *event)
|
||||
//{
|
||||
//// QWebView::dropEvent(event);
|
||||
// event->accept();
|
||||
//}
|
@ -1,45 +0,0 @@ |
||||
/*
|
||||
* This program 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 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef UBROUTEDMOUSEEVENTWEBVIEW_H_ |
||||
#define UBROUTEDMOUSEEVENTWEBVIEW_H_ |
||||
|
||||
#include <QtWebKit> |
||||
|
||||
/*
|
||||
* This class changes the routing of mouse events. |
||||
* Qt 4.5.2 does not report back the "accepted" flag set |
||||
* by WebKit, as we want to know if a mouse event has been |
||||
* consumed by webKit, we override them without keeping the |
||||
* accepted flag status |
||||
*/ |
||||
|
||||
class UBRoutedMouseEventWebView : public QWebView |
||||
{ |
||||
public: |
||||
UBRoutedMouseEventWebView(QWidget * parent = 0 ); |
||||
virtual ~UBRoutedMouseEventWebView(); |
||||
|
||||
protected: |
||||
virtual void mouseMoveEvent(QMouseEvent* ev); |
||||
virtual void mousePressEvent(QMouseEvent* ev); |
||||
virtual void mouseDoubleClickEvent(QMouseEvent* ev); |
||||
virtual void mouseReleaseEvent(QMouseEvent* ev); |
||||
virtual void contextMenuEvent(QContextMenuEvent* ev); |
||||
virtual void wheelEvent(QWheelEvent* ev); |
||||
// virtual void dropEvent(QDropEvent *);
|
||||
}; |
||||
|
||||
#endif /* UBROUTEDMOUSEEVENTWEBVIEW_H_ */ |
Loading…
Reference in new issue