/* * Copyright (C) 2013 Open Education Foundation * * Copyright (C) 2010-2013 Groupement d'Intérêt Public pour * l'Education Numérique en Afrique (GIP ENA) * * This file is part of OpenBoard. * * OpenBoard 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, version 3 of the License, * with a specific linking exception for the OpenSSL project's * "OpenSSL" library (or with modified versions of it that use the * same license as the "OpenSSL" library). * * OpenBoard 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 OpenBoard. If not, see . */ #ifndef UBGRAPHICSWIDGETITEM_H #define UBGRAPHICSWIDGETITEM_H #include #include #include #include "core/UB.h" #include "UBItem.h" #include "UBResizableGraphicsItem.h" class UBWidgetUniboardAPI; class UBGraphicsScene; class UBW3CWidgetAPI; class UBW3CWidgetWebStorageAPI; class UBGraphiscItem; class UBGraphiscItemDelegate; struct UBWidgetType { enum Enum { W3C = 0, Apple, Other }; }; class UBGraphicsWidgetItem : public QGraphicsWebView, public UBItem, public UBResizableGraphicsItem, public UBGraphicsItem { Q_OBJECT public: UBGraphicsWidgetItem(const QUrl &pWidgetUrl = QUrl(), QGraphicsItem *parent = 0); ~UBGraphicsWidgetItem(); enum { Type = UBGraphicsItemType::GraphicsWidgetItemType }; virtual int type() const { return Type; } virtual void initialize(); virtual void resize(qreal w, qreal h); virtual void resize(const QSizeF & size); virtual QSizeF size() const; QUrl mainHtml(); void loadMainHtml(); QUrl widgetUrl(); void widgetUrl(QUrl url) { mWidgetUrl = url; } QString mainHtmlFileName(); bool canBeContent(); bool canBeTool(); QString preference(const QString& key) const; void setPreference(const QString& key, QString value); QMap preferences() const; void removePreference(const QString& key); void removeAllPreferences(); QString datastoreEntry(const QString& key) const; void setDatastoreEntry(const QString& key, QString value); QMap datastoreEntries() const; void removeDatastoreEntry(const QString& key); void removeAllDatastoreEntries(); void removeScript(); void processDropEvent(QGraphicsSceneDragDropEvent *event); bool isDropableData(const QMimeData *data) const; virtual QUrl getOwnFolder() const; virtual void setOwnFolder(const QUrl &newFolder); virtual void setSnapshotPath(const QUrl &newFilePath); virtual QUrl getSnapshotPath(); virtual void clearSource(); virtual void setUuid(const QUuid &pUuid); QSize nominalSize() const; bool hasLoadedSuccessfully() const; bool freezable(); bool resizable(); bool isFrozen(); QPixmap snapshot(); void setSnapshot(const QPixmap& pix); QPixmap takeSnapshot(); virtual UBItem* deepCopy() const = 0; virtual UBGraphicsScene* scene(); static int widgetType(const QUrl& pUrl); static QString widgetName(const QUrl& pUrl); static QString iconFilePath(const QUrl& pUrl); public slots: void freeze(); void unFreeze(); protected: enum OSType { type_NONE = 0, // 0000 type_WIN = 1, // 0001 type_MAC = 2, // 0010 type_UNIX = 4, // 0100 type_ALL = 7 // 0111 }; bool mFirstReleaseAfterMove; bool mInitialLoadDone; bool mIsFreezable; bool mIsResizable; bool mLoadIsErronous; bool mMouseIsPressed; int mCanBeContent; int mCanBeTool; QSize mNominalSize; QString mMainHtmlFileName; QUrl mMainHtmlUrl; QUrl mWidgetUrl; QMap mDatastore; QMap mPreferences; virtual bool event(QEvent *event); virtual void dropEvent(QGraphicsSceneDragDropEvent *event); virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event); virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); virtual void sendJSEnterEvent(); virtual void sendJSLeaveEvent(); virtual void injectInlineJavaScript(); virtual void wheelEvent(QGraphicsSceneWheelEvent *event); virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); protected slots: void geometryChangeRequested(const QRect& geom); virtual void javaScriptWindowObjectCleared(); void mainFrameLoadFinished(bool ok); private slots: void onLinkClicked(const QUrl& url); void initialLayoutCompleted(); private: bool mIsFrozen; bool mIsTakingSnapshot; bool mShouldMoveWidget; UBWidgetUniboardAPI* mUniboardAPI; QPixmap mSnapshot; QPointF mLastMousePos; QUrl ownFolder; QUrl SnapshotFile; static bool sInlineJavaScriptLoaded; static QStringList sInlineJavaScripts; }; class UBGraphicsAppleWidgetItem : public UBGraphicsWidgetItem { Q_OBJECT public: UBGraphicsAppleWidgetItem(const QUrl& pWidgetUrl, QGraphicsItem *parent = 0); ~UBGraphicsAppleWidgetItem(); virtual void copyItemParameters(UBItem *copy) const; virtual void setUuid(const QUuid &pUuid); virtual UBItem* deepCopy() const; }; class UBGraphicsW3CWidgetItem : public UBGraphicsWidgetItem { Q_OBJECT public: class PreferenceValue { public: PreferenceValue() { /* NOOP */ } PreferenceValue(const QString& pValue, bool pReadonly) { value = pValue; readonly = pReadonly; } bool readonly; QString value; }; class Metadata { public: QString id; QString name; QString description; QString author; QString authorEmail; QString authorHref; QString version; }; UBGraphicsW3CWidgetItem(const QUrl& pWidgetUrl, QGraphicsItem *parent = 0); ~UBGraphicsW3CWidgetItem(); virtual void setUuid(const QUuid &pUuid); virtual UBItem* deepCopy() const; virtual void copyItemParameters(UBItem *copy) const; QMap preferences(); Metadata metadatas() const; static QString freezedWidgetFilePath(); 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 bool hasNPAPIWrapper(const QString& pMimeType); Metadata mMetadatas; private slots: virtual void javaScriptWindowObjectCleared(); private: static void loadNPAPIWrappersTemplates(); static QString textForSubElementByLocale(QDomElement rootElement, QString subTagName, QLocale locale); UBW3CWidgetAPI* mW3CWidgetAPI; QMap mPreferences; static bool sTemplateLoaded; static QString sNPAPIWrappperConfigTemplate; static QMap sNPAPIWrapperTemplates; }; #endif // UBGRAPHICSWIDGETITEM_H