UBGraphicsWidgetItem.cpp 36.3 KB
Newer Older
Claudio Valerio's avatar
Claudio Valerio committed
1 2 3
/*
 * 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
Claudio Valerio's avatar
Claudio Valerio committed
4
 * the Free Software Foundation, either version 2 of the License, or
Claudio Valerio's avatar
Claudio Valerio committed
5 6 7 8 9 10 11 12 13 14
 * (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/>.
 */
Claudio Valerio's avatar
Claudio Valerio committed
15

16 17
#include <QtNetwork>
#include <QtXml>
Claudio Valerio's avatar
Claudio Valerio committed
18

19 20
#include "UBGraphicsWidgetItem.h"
#include "UBGraphicsScene.h"
Claudio Valerio's avatar
Claudio Valerio committed
21 22 23 24
#include "UBGraphicsItemDelegate.h"
#include "UBGraphicsWidgetItemDelegate.h"
#include "UBGraphicsDelegateFrame.h"

25 26 27 28
#include "api/UBWidgetUniboardAPI.h"
#include "api/UBW3CWidgetAPI.h"

 #include "board/UBBoardController.h"
Claudio Valerio's avatar
Claudio Valerio committed
29

30
#include "core/memcheck.h"
31 32 33
#include "core/UBApplicationController.h"
#include "core/UBApplication.h"
#include "core/UBSettings.h"
34

35
#include "frameworks/UBFileSystemUtils.h"
36 37
#include "frameworks/UBPlatformUtils.h"

38
#include "network/UBNetworkAccessManager.h"
39

40 41 42
#include "web/UBWebPage.h"
#include "web/UBWebKitUtils.h"
#include "web/UBWebController.h"
43

44 45
bool UBGraphicsWidgetItem::sInlineJavaScriptLoaded = false;
QStringList UBGraphicsWidgetItem::sInlineJavaScripts;
46

Yimgo's avatar
Yimgo committed
47
UBGraphicsWidgetItem::UBGraphicsWidgetItem(const QUrl &pWidgetUrl, QGraphicsItem *parent)
48 49 50
    : UBGraphicsWebView(parent)
    , mInitialLoadDone(false)
    , mIsFreezable(true)
51 52
    , mIsResizable(false)    
    , mLoadIsErronous(false)    
53 54
    , mCanBeContent(0)
    , mCanBeTool(0)
Yimgo's avatar
Yimgo committed
55
    , mWidgetUrl(pWidgetUrl)
56 57
    , mIsFrozen(false)
    , mIsTakingSnapshot(false)
Claudio Valerio's avatar
Claudio Valerio committed
58
    , mShouldMoveWidget(false)
59
    , mUniboardAPI(0)    
Claudio Valerio's avatar
Claudio Valerio committed
60
{
61
    setData(UBGraphicsItemData::itemLayerType, QVariant(itemLayerType::ObjectItem)); //Necessary to set if we want z value to be assigned correctly
Claudio Valerio's avatar
Claudio Valerio committed
62

63 64 65 66 67 68 69 70
    QGraphicsWebView::setPage(new UBWebPage(this));
    QGraphicsWebView::settings()->setAttribute(QWebSettings::JavaEnabled, true);
    QGraphicsWebView::settings()->setAttribute(QWebSettings::PluginsEnabled, true);
    QGraphicsWebView::settings()->setAttribute(QWebSettings::LocalStorageDatabaseEnabled, true);
    QGraphicsWebView::settings()->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, true);
    QGraphicsWebView::settings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true);
    QGraphicsWebView::settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard, true);
    QGraphicsWebView::settings()->setAttribute(QWebSettings::DnsPrefetchEnabled, true);
Claudio Valerio's avatar
Claudio Valerio committed
71

72
    page()->setNetworkAccessManager(UBNetworkAccessManager::defaultAccessManager());
Claudio Valerio's avatar
Claudio Valerio committed
73

74
    setAcceptDrops(true);
75
    setAutoFillBackground(false);
Claudio Valerio's avatar
Claudio Valerio committed
76

77 78 79 80
    QPalette pagePalette = page()->palette();
    pagePalette.setBrush(QPalette::Base, QBrush(Qt::transparent));
    pagePalette.setBrush(QPalette::Window, QBrush(Qt::transparent));
    page()->setPalette(pagePalette);
Claudio Valerio's avatar
Claudio Valerio committed
81

82 83 84 85
    QPalette viewPalette = palette();
    pagePalette.setBrush(QPalette::Base, QBrush(Qt::transparent));
    viewPalette.setBrush(QPalette::Window, QBrush(Qt::transparent));
    setPalette(viewPalette);
Claudio Valerio's avatar
Claudio Valerio committed
86

Yimgo's avatar
Yimgo committed
87
    UBGraphicsWidgetItemDelegate* delegate = new UBGraphicsWidgetItemDelegate(this);
88 89
    delegate->init();
    setDelegate(delegate);
Claudio Valerio's avatar
Claudio Valerio committed
90 91 92 93
}


UBGraphicsWidgetItem::~UBGraphicsWidgetItem()
root's avatar
root committed
94
{
95
    /* NOOP */
root's avatar
root committed
96
}
Claudio Valerio's avatar
Claudio Valerio committed
97

98
void UBGraphicsWidgetItem::initialize()
Claudio Valerio's avatar
Claudio Valerio committed
99
{
100 101 102
    installEventFilter(this);
    UBGraphicsWebView::setMinimumSize(nominalSize());
    setData(UBGraphicsItemData::itemLayerType, QVariant(itemLayerType::ObjectItem)); // Necessary to set if we want z value to be assigned correctly
Claudio Valerio's avatar
Claudio Valerio committed
103

104 105
    if (mDelegate && mDelegate->frame() && resizable())
        mDelegate->frame()->setOperationMode(UBGraphicsDelegateFrame::Resizing);
Claudio Valerio's avatar
Claudio Valerio committed
106

107 108
    QPalette palette = page()->palette();
    palette.setBrush(QPalette::Base, QBrush(Qt::transparent));
shibakaneki's avatar
shibakaneki committed
109 110
    page()->setPalette(palette);
    page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
Claudio Valerio's avatar
Claudio Valerio committed
111

112 113
    connect(page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(javaScriptWindowObjectCleared()));
    connect(page(), SIGNAL(geometryChangeRequested(const QRect&)), this, SLOT(geometryChangeRequested(const QRect&)));
114
    connect(this, SIGNAL(loadFinished(bool)), this, SLOT(mainFrameLoadFinished (bool)));
shibakaneki's avatar
shibakaneki committed
115 116 117 118 119
    connect(page(), SIGNAL(linkClicked(const QUrl&)), this, SLOT(onLinkClicked(const QUrl&)));
}

void UBGraphicsWidgetItem::onLinkClicked(const QUrl& url){
	UBApplication::webController->loadUrl(url);
Claudio Valerio's avatar
Claudio Valerio committed
120 121
}

122
QUrl UBGraphicsWidgetItem::mainHtml()
Claudio Valerio's avatar
Claudio Valerio committed
123
{
124
    return mMainHtmlUrl;
Claudio Valerio's avatar
Claudio Valerio committed
125 126
}

127
void UBGraphicsWidgetItem::loadMainHtml()
128
{
129
    mInitialLoadDone = false;
130
    load(mMainHtmlUrl);
131
}
132 133

QUrl UBGraphicsWidgetItem::widgetUrl()
134
{
135
    return mWidgetUrl;
136
}
137
QString UBGraphicsWidgetItem::mainHtmlFileName()
138
{
139
    return mMainHtmlFileName;
140 141
}

142
bool UBGraphicsWidgetItem::hasEmbededObjects()
Claudio Valerio's avatar
Claudio Valerio committed
143
{
144 145 146 147
    if (page()->mainFrame()) {
        QList<UBWebKitUtils::HtmlObject> htmlObjects = UBWebKitUtils::objectsInFrame(page()->mainFrame());
        return htmlObjects.length() > 0;
    }
Claudio Valerio's avatar
Claudio Valerio committed
148

149 150
    return false;
}
Claudio Valerio's avatar
Claudio Valerio committed
151

152 153 154 155 156 157
bool UBGraphicsWidgetItem::hasEmbededFlash()
{
    if (hasEmbededObjects())
        return page()->mainFrame()->toHtml().contains("application/x-shockwave-flash");
    else
        return false;
Claudio Valerio's avatar
Claudio Valerio committed
158 159
}

160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
bool UBGraphicsWidgetItem::canBeContent()
{
    // if we under MAC OS
    #if defined(Q_OS_MAC)
        return mCanBeContent & UBGraphicsWidgetItem::type_MAC;
    #endif

    // if we under UNIX OS
    #if defined(Q_OS_UNIX)
        return mCanBeContent & UBGraphicsWidgetItem::type_UNIX;
    #endif

    // if we under WINDOWS OS
    #if defined(Q_OS_WIN)
        return mCanBeContent & UBGraphicsWidgetItem::type_WIN;
    #endif
}
Claudio Valerio's avatar
Claudio Valerio committed
177

178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
bool UBGraphicsWidgetItem::canBeTool()
{
    // if we under MAC OS
    #if defined(Q_OS_MAC)
        return mCanBeTool & UBGraphicsWidgetItem::type_MAC;
    #endif

        // if we under UNIX OS
    #if defined(Q_OS_UNIX)
        return mCanBeTool & UBGraphicsWidgetItem::type_UNIX;
    #endif

        // if we under WINDOWS OS
    #if defined(Q_OS_WIN)
        return mCanBeTool & UBGraphicsWidgetItem::type_WIN;
    #endif
}
Claudio Valerio's avatar
Claudio Valerio committed
195

196
QString UBGraphicsWidgetItem::preference(const QString& key) const
197
{
198
    return mPreferences.value(key);
199
}
Claudio Valerio's avatar
Claudio Valerio committed
200

201
void UBGraphicsWidgetItem::setPreference(const QString& key, QString value)
202
{
203 204
    if (key == "" || (mPreferences.contains(key) && mPreferences.value(key) == value))
        return;
Claudio Valerio's avatar
Claudio Valerio committed
205

206 207 208
    mPreferences.insert(key, value);
    if (scene())
        scene()->setModified(true);
Claudio Valerio's avatar
Claudio Valerio committed
209 210
}

211
QMap<QString, QString> UBGraphicsWidgetItem::preferences() const
Claudio Valerio's avatar
Claudio Valerio committed
212
{
213
    return mPreferences;
Claudio Valerio's avatar
Claudio Valerio committed
214 215 216
}


217
void UBGraphicsWidgetItem::removePreference(const QString& key)
Claudio Valerio's avatar
Claudio Valerio committed
218
{
219
    mPreferences.remove(key);
Claudio Valerio's avatar
Claudio Valerio committed
220 221 222
}


223
void UBGraphicsWidgetItem::removeAllPreferences()
Claudio Valerio's avatar
Claudio Valerio committed
224
{
225
    mPreferences.clear();
Claudio Valerio's avatar
Claudio Valerio committed
226 227
}

228
QString UBGraphicsWidgetItem::datastoreEntry(const QString& key) const
Claudio Valerio's avatar
Claudio Valerio committed
229
{
230 231
    if (mDatastore.contains(key))
        return mDatastore.value(key);
232
    else
233
        return QString();
234
}
Claudio Valerio's avatar
Claudio Valerio committed
235

236
void UBGraphicsWidgetItem::setDatastoreEntry(const QString& key, QString value)
237
{
238 239
    if (key == "" || (mDatastore.contains(key) && mDatastore.value(key) == value))
        return;
Claudio Valerio's avatar
Claudio Valerio committed
240

241 242 243 244
    mDatastore.insert(key, value);
    if (scene())
        scene()->setModified(true);
}
Claudio Valerio's avatar
Claudio Valerio committed
245

246 247 248 249
QMap<QString, QString> UBGraphicsWidgetItem::datastoreEntries() const
{
    return mDatastore;
}
Claudio Valerio's avatar
Claudio Valerio committed
250 251


252 253 254 255
void UBGraphicsWidgetItem::removeDatastoreEntry(const QString& key)
{
    mDatastore.remove(key);
}
Claudio Valerio's avatar
Claudio Valerio committed
256

257

258 259 260
void UBGraphicsWidgetItem::removeAllDatastoreEntries()
{
    mDatastore.clear();
Claudio Valerio's avatar
Claudio Valerio committed
261 262
}

263 264 265 266
UBGraphicsItemDelegate* UBGraphicsWidgetItem::Delegate() const 
{
    return mDelegate;
}
Claudio Valerio's avatar
Claudio Valerio committed
267

268
void UBGraphicsWidgetItem::remove()
Claudio Valerio's avatar
Claudio Valerio committed
269
{
270 271
    if (mDelegate)
        mDelegate->remove();
Claudio Valerio's avatar
Claudio Valerio committed
272 273
}

274 275 276 277 278
void UBGraphicsWidgetItem::removeScript()
{
    if (page() && page()->mainFrame())
        page()->mainFrame()->evaluateJavaScript("if(widget && widget.onremove) { widget.onremove();}");
}
Claudio Valerio's avatar
Claudio Valerio committed
279

280 281 282 283 284
void UBGraphicsWidgetItem::processDropEvent(QDropEvent *event)
{
    return mUniboardAPI->ProcessDropEvent(event);
}
bool UBGraphicsWidgetItem::isDropableData(const QMimeData *data) const
Claudio Valerio's avatar
Claudio Valerio committed
285
{
286
    return mUniboardAPI->isDropableData(data);
Claudio Valerio's avatar
Claudio Valerio committed
287 288
}

289 290 291
QUrl UBGraphicsWidgetItem::getOwnFolder() const {
    return ownFolder;
}
Claudio Valerio's avatar
Claudio Valerio committed
292

293
void UBGraphicsWidgetItem::setOwnFolder(const QUrl &newFolder)
Claudio Valerio's avatar
Claudio Valerio committed
294
{
295
    ownFolder = newFolder;
Claudio Valerio's avatar
Claudio Valerio committed
296 297
}

298 299 300 301
void UBGraphicsWidgetItem::setSnapshotPath(const QUrl &newFilePath)
{
    SnapshotFile = newFilePath;
}
Claudio Valerio's avatar
Claudio Valerio committed
302

303
QUrl UBGraphicsWidgetItem::getSnapshotPath()
Claudio Valerio's avatar
Claudio Valerio committed
304
{
305
    return SnapshotFile;
Claudio Valerio's avatar
Claudio Valerio committed
306 307
}

308 309 310 311 312
void UBGraphicsWidgetItem::clearSource()
{
    UBFileSystemUtils::deleteDir(getOwnFolder().toLocalFile());
    UBFileSystemUtils::deleteFile(getSnapshotPath().toLocalFile());
}
Claudio Valerio's avatar
Claudio Valerio committed
313

314
void UBGraphicsWidgetItem::setUuid(const QUuid &pUuid)
Claudio Valerio's avatar
Claudio Valerio committed
315
{
316 317
    UBItem::setUuid(pUuid);
    setData(UBGraphicsItemData::ItemUuid, QVariant(pUuid)); //store item uuid inside the QGraphicsItem to fast operations with Items on the scene
Claudio Valerio's avatar
Claudio Valerio committed
318 319
}

320 321 322 323
QSize UBGraphicsWidgetItem::nominalSize() const
{
    return mNominalSize;
}
Claudio Valerio's avatar
Claudio Valerio committed
324

325
bool UBGraphicsWidgetItem::hasLoadedSuccessfully() const
Claudio Valerio's avatar
Claudio Valerio committed
326
{
327
    return (mInitialLoadDone && !mLoadIsErronous);
Claudio Valerio's avatar
Claudio Valerio committed
328 329
}

330 331 332 333
bool UBGraphicsWidgetItem::freezable() 
{ 
    return mIsFreezable;
}
Claudio Valerio's avatar
Claudio Valerio committed
334

335 336 337 338 339 340 341 342
bool UBGraphicsWidgetItem::resizable()
{ 
    return mIsResizable;
}        

bool UBGraphicsWidgetItem::isFrozen()
{ 
    return mIsFrozen;
Claudio Valerio's avatar
Claudio Valerio committed
343 344
}

345 346 347 348
QPixmap UBGraphicsWidgetItem::snapshot()
{
    return mSnapshot;
}
Claudio Valerio's avatar
Claudio Valerio committed
349

350
QPixmap UBGraphicsWidgetItem::takeSnapshot()
Claudio Valerio's avatar
Claudio Valerio committed
351
{
352
    mIsTakingSnapshot = true;
Claudio Valerio's avatar
Claudio Valerio committed
353

354 355 356 357 358 359
    QPixmap pixmap(size().toSize());
    pixmap.fill(Qt::transparent);
    QPainter painter(&pixmap);
 
    QStyleOptionGraphicsItem options;
    paint(&painter, &options);
Claudio Valerio's avatar
Claudio Valerio committed
360

361
    mIsTakingSnapshot = false;
Claudio Valerio's avatar
Claudio Valerio committed
362

363 364 365 366
    return pixmap;
}

void UBGraphicsWidgetItem::setSnapshot(const QPixmap& pix)
Claudio Valerio's avatar
Claudio Valerio committed
367
{
368
    mSnapshot = pix;
Claudio Valerio's avatar
Claudio Valerio committed
369 370
}

371 372 373 374
UBGraphicsScene* UBGraphicsWidgetItem::scene()
{
    return qobject_cast<UBGraphicsScene*>(QGraphicsItem::scene());
}
Claudio Valerio's avatar
Claudio Valerio committed
375

376
int UBGraphicsWidgetItem::widgetType(const QUrl& pUrl)
Claudio Valerio's avatar
Claudio Valerio committed
377
{
378 379 380 381 382 383 384 385
    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;
Claudio Valerio's avatar
Claudio Valerio committed
386 387
}

388 389 390 391 392 393 394
QString UBGraphicsWidgetItem::widgetName(const QUrl& widgetPath)
{
    QString name;
    QString version;
    QFile w3CConfigFile(widgetPath.toLocalFile() + "/config.xml");
    QFile appleConfigFile(widgetPath.toLocalFile() + "/Info.plist");

395
    if (w3CConfigFile.exists() && w3CConfigFile.open(QFile::ReadOnly)) {
396 397 398
        QDomDocument doc;
        doc.setContent(w3CConfigFile.readAll());
        QDomElement root = doc.firstChildElement("widget");
399
        if (!root.isNull()) {
400 401 402 403 404 405 406
            QDomElement nameElement = root.firstChildElement("name");
            if (!nameElement.isNull())
                name = nameElement.text();
            version = root.attribute("version", "");
        }
        w3CConfigFile.close();
    }
407
    else if (appleConfigFile.exists() && appleConfigFile.open(QFile::ReadOnly)) {
408 409 410
        QDomDocument doc;
        doc.setContent(appleConfigFile.readAll());
        QDomElement root = doc.firstChildElement("plist");
411
        if (!root.isNull()) {
412
            QDomElement dictElement = root.firstChildElement("dict");
413
            if (!dictElement.isNull()) {
414 415
                QDomNodeList childNodes  = dictElement.childNodes();

416 417 418 419 420 421
                /* looking for something like
                 * ..
                 * <key>CFBundleDisplayName</key>
                 * <string>brain scans</string>
                 * ..
                 */
422

423 424
                for(int i = 0; i < childNodes.count() - 1; i++) {
                    if (childNodes.at(i).isElement()) {
425
                        QDomElement elKey = childNodes.at(i).toElement();
426 427
                        if (elKey.text() == "CFBundleDisplayName") {
                            if (childNodes.at(i + 1).isElement()) {
428 429 430 431
                               QDomElement elValue = childNodes.at(i + 1).toElement();
                               name = elValue.text();
                            }
                        }
432 433
                        else if (elKey.text() == "CFBundleShortVersionString") {
                            if (childNodes.at(i + 1).isElement()) {
434 435 436 437 438 439 440 441 442 443 444
                               QDomElement elValue = childNodes.at(i + 1).toElement();
                               version = elValue.text();
                            }
                        }
                    }
                }
            }
        }
        appleConfigFile.close();
    }
    QString result;
Claudio Valerio's avatar
Claudio Valerio committed
445

446
    if (name.length() > 0) {
447
        result = name;
448
        if (version.length() > 0) {
449 450 451 452 453 454 455
            result += " ";
            result += version;
        }
    }
    return result;
}

456
QString UBGraphicsWidgetItem::iconFilePath(const QUrl& pUrl)
Claudio Valerio's avatar
Claudio Valerio committed
457
{
458
    /* TODO UB 4.x read config.xml widget.icon param first */
459

460
    QStringList files;
461

462 463 464 465 466
    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 */
467

468 469 470
    QString file = UBFileSystemUtils::getFirstExistingFileFromList(pUrl.toLocalFile(), files);
    /* default */
    if (file.length() == 0)
471
    {
472
        file = QString(":/images/defaultWidgetIcon.png");
473
    }
474
    return file;
Claudio Valerio's avatar
Claudio Valerio committed
475 476
}

477 478 479 480 481 482
void UBGraphicsWidgetItem::freeze()
{
    QPixmap pix = takeSnapshot();
    mIsFrozen = true;
    setSnapshot(pix);
}
Claudio Valerio's avatar
Claudio Valerio committed
483

484
void UBGraphicsWidgetItem::unFreeze()
Claudio Valerio's avatar
Claudio Valerio committed
485
{
486
    mIsFrozen = false;
Claudio Valerio's avatar
Claudio Valerio committed
487 488 489 490
}

void UBGraphicsWidgetItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
491
    UBGraphicsWebView::mousePressEvent(event);
Claudio Valerio's avatar
Claudio Valerio committed
492 493 494 495 496 497 498 499 500 501

    // did webkit consume the mouse press ?
    mShouldMoveWidget = !event->isAccepted() && (event->buttons() & Qt::LeftButton);

    mLastMousePos = mapToScene(event->pos());

    event->accept();
}

void UBGraphicsWidgetItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
502
{
Claudio Valerio's avatar
Claudio Valerio committed
503
    mShouldMoveWidget = false;
504

505 506
    UBGraphicsWebView::mouseReleaseEvent(event);
}
507

508
void UBGraphicsWidgetItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
Claudio Valerio's avatar
Claudio Valerio committed
509
{
510 511 512
    sendJSEnterEvent();
    mDelegate->hoverEnterEvent(event);
    UBGraphicsWebView::hoverEnterEvent(event);
Claudio Valerio's avatar
Claudio Valerio committed
513
}
514
void UBGraphicsWidgetItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
Claudio Valerio's avatar
Claudio Valerio committed
515
{
516 517 518
    sendJSLeaveEvent();
    mDelegate->hoverLeaveEvent(event);
    UBGraphicsWebView::hoverLeaveEvent(event);
Claudio Valerio's avatar
Claudio Valerio committed
519
}
520
void UBGraphicsWidgetItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
Claudio Valerio's avatar
Claudio Valerio committed
521
{
522
    UBGraphicsWebView::hoverMoveEvent(event);
523 524
}

525
bool UBGraphicsWidgetItem::eventFilter(QObject *obj, QEvent *event)
Claudio Valerio's avatar
Claudio Valerio committed
526
{
527 528 529 530 531
    if (mShouldMoveWidget && obj == this && event->type() == QEvent::MouseMove) {
        QMouseEvent *mouseMoveEvent = static_cast<QMouseEvent*>(event);

        if (mouseMoveEvent->buttons() & Qt::LeftButton) {
            QPointF scenePos = mapToScene(mouseMoveEvent->pos());
Claudio Valerio's avatar
Claudio Valerio committed
532

533
            QPointF newPos = pos() + scenePos - mLastMousePos;
Claudio Valerio's avatar
Claudio Valerio committed
534

535
            setPos(newPos);
536

537
            mLastMousePos = scenePos;
538

539
            event->accept();
540

541 542
            return true;
        }
Claudio Valerio's avatar
Claudio Valerio committed
543
    }
544 545 546

    /* standard event processing */
    return QObject::eventFilter(obj, event);
Claudio Valerio's avatar
Claudio Valerio committed
547
}
548

549 550
void UBGraphicsWidgetItem::sendJSEnterEvent()
{
551 552
    if (page() && page()->mainFrame())
        page()->mainFrame()->evaluateJavaScript("if(widget && widget.onenter) { widget.onenter();}");
553
}
554

555 556
void UBGraphicsWidgetItem::sendJSLeaveEvent()
{
557 558
    if (page() && page()->mainFrame())
        page()->mainFrame()->evaluateJavaScript("if(widget && widget.onleave) { widget.onleave();}");
559 560 561 562 563 564 565
}

void UBGraphicsWidgetItem::injectInlineJavaScript()
{
    if (!sInlineJavaScriptLoaded) {
        sInlineJavaScripts = UBApplication::applicationController->widgetInlineJavaScripts();
        sInlineJavaScriptLoaded = true;
566
    }
567 568 569

    foreach(QString script, sInlineJavaScripts)
        page()->mainFrame()->evaluateJavaScript(script);
570
}
571

572
void UBGraphicsWidgetItem::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
573
{
574 575
    if (mIsFrozen)
        painter->drawPixmap(0, 0, mSnapshot);
576
    else
Yimgo's avatar
Yimgo committed
577
        UBGraphicsWebView::paint(painter, option, widget);
578 579
    if (!mInitialLoadDone || mLoadIsErronous) {
        QString message;
580

581 582 583 584
        if (mInitialLoadDone && mLoadIsErronous)
            message = tr("Cannot load content");
        else
            message = tr("Loading ...");
585

586
        painter->setFont(QFont("Arial", 12));
587

588 589
        QFontMetrics fm = painter->fontMetrics();
        QRect txtBoundingRect = fm.boundingRect(message);
590

591 592
        txtBoundingRect.moveCenter(rect().center().toPoint());
        txtBoundingRect.adjust(-10, -5, 10, 5);
593

594 595 596
        painter->setPen(Qt::NoPen);
        painter->setBrush(UBSettings::paletteColor);
        painter->drawRoundedRect(txtBoundingRect, 3, 3);
597

598 599
        painter->setPen(Qt::white);
        painter->drawText(rect(), Qt::AlignCenter, message);
600
    }
601 602
}

603
void UBGraphicsWidgetItem::geometryChangeRequested(const QRect& geom)
604
{
605
    resize(geom.width(), geom.height());
606
}
607

608
void UBGraphicsWidgetItem::javaScriptWindowObjectCleared()
Ivan Ilin's avatar
Ivan Ilin committed
609
{
610 611 612 613 614 615 616
    injectInlineJavaScript();

    if(!mUniboardAPI)
        mUniboardAPI = new UBWidgetUniboardAPI(scene(), this);

    page()->mainFrame()->addToJavaScriptWindowObject("sankore", mUniboardAPI);

Ivan Ilin's avatar
Ivan Ilin committed
617
}
Claudio Valerio's avatar
Claudio Valerio committed
618

619
void UBGraphicsWidgetItem::mainFrameLoadFinished (bool ok)
Claudio Valerio's avatar
Claudio Valerio committed
620
{
621 622 623
    mInitialLoadDone = true;
    mLoadIsErronous = !ok;
    update(boundingRect());
Claudio Valerio's avatar
Claudio Valerio committed
624 625 626 627 628
}



UBGraphicsAppleWidgetItem::UBGraphicsAppleWidgetItem(const QUrl& pWidgetUrl, QGraphicsItem *parent)
Yimgo's avatar
Yimgo committed
629
    : UBGraphicsWidgetItem(pWidgetUrl, parent)
Claudio Valerio's avatar
Claudio Valerio committed
630
{
631
    QString path = pWidgetUrl.toLocalFile();
Claudio Valerio's avatar
Claudio Valerio committed
632

633
    if (!path.endsWith(".wdgt") && !path.endsWith(".wdgt/")) {
634 635 636 637
        int lastSlashIndex = path.lastIndexOf("/");
        if (lastSlashIndex > 0)
            path = path.mid(0, lastSlashIndex + 1);
    }
Claudio Valerio's avatar
Claudio Valerio committed
638

639 640
    QFile plistFile(path + "/Info.plist");
    plistFile.open(QFile::ReadOnly);
Claudio Valerio's avatar
Claudio Valerio committed
641

642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661
    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);

    load(mMainHtmlUrl);

    QPixmap defaultPixmap(pWidgetUrl.toLocalFile() + "/Default.png");

    setMaximumSize(defaultPixmap.size());

    mNominalSize = defaultPixmap.size();
Claudio Valerio's avatar
Claudio Valerio committed
662 663 664 665 666 667 668

    initialize();
}


UBGraphicsAppleWidgetItem::~UBGraphicsAppleWidgetItem()
{
669 670 671 672 673 674
    /* NOOP */
}

int UBGraphicsAppleWidgetItem::type() const
{
    return Type;
Claudio Valerio's avatar
Claudio Valerio committed
675 676
}

677 678 679 680 681
void UBGraphicsAppleWidgetItem::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
}
Claudio Valerio's avatar
Claudio Valerio committed
682 683 684

UBItem* UBGraphicsAppleWidgetItem::deepCopy() const
{
685
    UBGraphicsAppleWidgetItem *appleWidget = new UBGraphicsAppleWidgetItem(QGraphicsWebView::url(), parentItem());
Claudio Valerio's avatar
Claudio Valerio committed
686

687 688 689
    copyItemParameters(appleWidget);

    return appleWidget;
Claudio Valerio's avatar
Claudio Valerio committed
690

691 692 693 694 695 696
}

void UBGraphicsAppleWidgetItem::copyItemParameters(UBItem *copy) const
{
    UBGraphicsAppleWidgetItem *cp = dynamic_cast<UBGraphicsAppleWidgetItem*>(copy);
    if (cp)
Claudio Valerio's avatar
Claudio Valerio committed
697
    {
698 699 700 701
        foreach(QString key, mPreferences.keys())
        {
            cp->setPreference(key, mPreferences.value(key));
        }
Claudio Valerio's avatar
Claudio Valerio committed
702

703 704 705 706
        foreach(QString key, mDatastore.keys())
        {
            cp->setDatastoreEntry(key, mDatastore.value(key));
        }
Claudio Valerio's avatar
Claudio Valerio committed
707

708 709
        cp->setSourceUrl(this->sourceUrl());
    }
Claudio Valerio's avatar
Claudio Valerio committed
710 711 712

}

713 714 715 716 717 718



bool UBGraphicsW3CWidgetItem::sTemplateLoaded = false;
QString UBGraphicsW3CWidgetItem::sNPAPIWrappperConfigTemplate;
QMap<QString, QString> UBGraphicsW3CWidgetItem::sNPAPIWrapperTemplates;
Claudio Valerio's avatar
Claudio Valerio committed
719

720
UBGraphicsW3CWidgetItem::UBGraphicsW3CWidgetItem(const QUrl& pWidgetUrl, QGraphicsItem *parent)
Yimgo's avatar
Yimgo committed
721
    : UBGraphicsWidgetItem(pWidgetUrl, parent)
Claudio Valerio's avatar
Claudio Valerio committed
722 723
    , mW3CWidgetAPI(0)
{
724 725 726
    QString path = pWidgetUrl.toLocalFile();
    QDir potentialDir(path);

727
    if (!path.endsWith(".wgt") && !path.endsWith(".wgt/") && !potentialDir.exists()) {
728 729 730 731 732
        int lastSlashIndex = path.lastIndexOf("/");
        if (lastSlashIndex > 0)
            path = path.mid(0, lastSlashIndex + 1);
    }

733
    if (!path.endsWith("/"))
734 735 736 737 738 739 740 741 742 743 744 745
        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");

746
    if (widgetDomList.count() > 0) {
747 748 749 750 751 752 753
        QDomElement widgetElement = widgetDomList.item(0).toElement();

        width = widgetElement.attribute("width", "300").toInt();
        height = widgetElement.attribute("height", "150").toInt();

        mMetadatas.id = widgetElement.attribute("id", "");

754
        /* some early widget (<= 4.3.4) where using identifier instead of id */
755 756 757 758 759
        if (mMetadatas.id.length() == 0)
             mMetadatas.id = widgetElement.attribute("identifier", "");

        mMetadatas.version = widgetElement.attribute("version", "");

760
        /* TODO UB 4.x map properly ub namespace */
761 762 763 764 765
        mIsResizable = widgetElement.attribute("ub:resizable", "false") == "true";
        mIsFreezable = widgetElement.attribute("ub:freezable", "true") == "true";

        QString roles = widgetElement.attribute("ub:roles", "content tool").trimmed().toLower();

766
        /* ------------------------------ */
767

768
        if (roles == "" || roles.contains("tool"))
769 770
            mCanBeTool = UBGraphicsWidgetItem::type_ALL;

771
        if (roles.contains("twin"))
772 773
            mCanBeTool |= UBGraphicsWidgetItem::type_WIN;

774
        if (roles.contains("tmac"))
775 776
            mCanBeTool |= UBGraphicsWidgetItem::type_MAC;
        
777
        if (roles.contains("tunix"))
778 779
            mCanBeTool |= UBGraphicsWidgetItem::type_UNIX;

780
        /* --------- */
781

782
        if (roles == "" || roles.contains("content"))
783 784
            mCanBeContent = UBGraphicsWidgetItem::type_ALL;

785
        if (roles.contains("cwin"))
786 787
            mCanBeContent |= UBGraphicsWidgetItem::type_WIN;

788
        if (roles.contains("cmac"))
789 790
            mCanBeContent |= UBGraphicsWidgetItem::type_MAC;

791
        if (roles.contains("cunix"))
792 793 794 795 796 797
            mCanBeContent |= UBGraphicsWidgetItem::type_UNIX;

        //------------------------------//

        QDomNodeList contentDomList = widgetElement.elementsByTagName("content");

798
        if (contentDomList.count() > 0) {
799 800 801 802 803 804 805 806 807
            QDomElement contentElement = contentDomList.item(0).toElement();
            mMainHtmlFileName = contentElement.attribute("src", "");
        }

        mMetadatas.name = textForSubElementByLocale(widgetElement, "name", QLocale::system());
        mMetadatas.description = textForSubElementByLocale(widgetElement, "description ", QLocale::system());

        QDomNodeList authorDomList = widgetElement.elementsByTagName("author");

808
        if (authorDomList.count() > 0) {
809 810 811 812 813 814 815 816 817
            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");

818
        for (uint i = 0; i < propertiesDomList.length(); i++) {
819 820 821
            QDomElement preferenceElement = propertiesDomList.at(i).toElement();
            QString prefName = preferenceElement.attribute("name", "");

822
            if (prefName.length() > 0) {
823 824 825 826 827
                QString prefValue = preferenceElement.attribute("value", "");
                bool readOnly = (preferenceElement.attribute("readonly", "false") == "true");

                mPreferences.insert(prefName, PreferenceValue(prefValue, readOnly));
            }
828
        }
829 830
    }

831
    if (mMainHtmlFileName.length() == 0) {
832 833 834 835
        QFile defaultStartFile(path + "index.htm");

        if (defaultStartFile.exists())
            mMainHtmlFileName = "index.htm";
836
        else {
837 838 839 840 841 842 843 844 845
            QFile secondDefaultStartFile(path + "index.html");

            if (secondDefaultStartFile.exists())
                mMainHtmlFileName = "index.html";
        }
    }

    mMainHtmlUrl = pWidgetUrl;
    mMainHtmlUrl.setPath(pWidgetUrl.path() + "/" + mMainHtmlFileName);
846
    /* is it a valid local file ? */
847 848 849 850 851 852 853 854 855 856 857 858 859 860
    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()));

    load(mMainHtmlUrl);

    setMaximumSize(QSize(width, height));

    mNominalSize = QSize(width, height);

Claudio Valerio's avatar
Claudio Valerio committed
861
    initialize();
862
    setOwnFolder(pWidgetUrl);
Claudio Valerio's avatar
Claudio Valerio committed
863 864 865 866
}

UBGraphicsW3CWidgetItem::~UBGraphicsW3CWidgetItem()
{
867
    /* NOOP */
Claudio Valerio's avatar
Claudio Valerio committed
868 869
}

870
int UBGraphicsW3CWidgetItem::type() const
Claudio Valerio's avatar
Claudio Valerio committed
871
{
872
    return Type;
Claudio Valerio's avatar
Claudio Valerio committed
873 874
}

root's avatar
root committed
875
void UBGraphicsW3CWidgetItem::setUuid(const QUuid &pUuid)
Claudio Valerio's avatar
Claudio Valerio committed
876
{
root's avatar
root committed
877 878
    UBItem::setUuid(pUuid);
    setData(UBGraphicsItemData::ItemUuid, QVariant(pUuid)); //store item uuid inside the QGraphicsItem to fast operations with Items on the scene
Claudio Valerio's avatar
Claudio Valerio committed
879 880 881 882
}

UBItem* UBGraphicsW3CWidgetItem::deepCopy() const
{
Yimgo's avatar
Yimgo committed
883
    UBGraphicsW3CWidgetItem *copy = new UBGraphicsW3CWidgetItem(mWidgetUrl, parentItem());
Claudio Valerio's avatar
Claudio Valerio committed
884
    copy->setUuid(this->uuid()); // this is OK for now as long as Widgets are imutable
Yimgo's avatar
Yimgo committed
885
    copyItemParameters(copy);
Claudio Valerio's avatar
Claudio Valerio committed
886 887 888 889 890 891 892 893 894 895 896

    return copy;
}

void UBGraphicsW3CWidgetItem::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
{
    UBGraphicsScene::RenderingContext rc = UBGraphicsScene::Screen;

    if (scene())
      rc =  scene()->renderingContext();

Yimgo's avatar
Yimgo committed
897
    if (rc == UBGraphicsScene::NonScreen || rc == UBGraphicsScene::PdfExport) {
Yimgo's avatar
Yimgo committed
898 899
        if (!snapshot().isNull())
           painter->drawPixmap(0, 0, snapshot());
900 901
    }
    else
Yimgo's avatar
Yimgo committed
902
        UBGraphicsWidgetItem::paint(painter, option, widget);
903 904 905 906 907
}

QMap<QString, UBGraphicsW3CWidgetItem::PreferenceValue> UBGraphicsW3CWidgetItem::preferences()
{
    return mPreferences;
908 909
}

910 911 912 913
UBGraphicsW3CWidgetItem::Metadata UBGraphicsW3CWidgetItem::metadatas() const
{
    return mMetadatas;
}
914

915
QString UBGraphicsW3CWidgetItem::createNPAPIWrapper(const QString& url, const QString& pMimeType, const QSize& sizeHint, const QString& pName)
916 917 918 919 920 921 922
{
    const QString userWidgetPath = UBSettings::settings()->userInteractiveDirectory() + "/" + tr("Web");
    QDir userWidgetDir(userWidgetPath);

    return createNPAPIWrapperInDir(url, userWidgetDir, pMimeType, sizeHint, pName);
}

923
QString UBGraphicsW3CWidgetItem::createNPAPIWrapperInDir(const QString& pUrl, const QDir& pDir, const QString& pMimeType, const QSize& sizeHint, const QString& pName)
924 925 926 927 928 929 930 931 932 933
{
    QString url = pUrl;
    url = UBFileSystemUtils::removeLocalFilePrefix(url);
    QString name = pName;

    QFileInfo fi(url);

    if (name.length() == 0)
        name = fi.baseName();

934
    if (fi.exists())
935 936 937 938 939 940
        url = fi.fileName();

    loadNPAPIWrappersTemplates();

    QString htmlTemplate;

941
    if (pMimeType.length() > 0 && sNPAPIWrapperTemplates.contains(pMimeType))
942 943 944 945 946 947 948
        htmlTemplate = sNPAPIWrapperTemplates.value(pMimeType);
    else {
        QString extension = UBFileSystemUtils::extension(url);
        if (sNPAPIWrapperTemplates.contains(extension))
            htmlTemplate = sNPAPIWrapperTemplates.value(extension);
    }

949
    if (htmlTemplate.length() > 0) {
950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972
        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);
973
        if (fi.exists()) {
974 975 976 977 978 979 980 981
            QString target = widgetLibraryPath + "/" + fi.fileName();
            QString source = pUrl;
            source = UBFileSystemUtils::removeLocalFilePrefix(source);
            QFile::copy(source, target);
        }

        QFile configFile(widgetLibraryPath + "/config.xml");

982
        if (!configFile.open(QIODevice::WriteOnly)) {
983
            qWarning() << "Cannot open file " << configFile.fileName();
984
            return QString();
Claudio Valerio's avatar
Claudio Valerio committed
985
        }
986 987 988 989 990 991 992 993 994

        QTextStream outConfig(&configFile);
        outConfig.setCodec("UTF-8");

        outConfig << configTemplate;
        configFile.close();

        QFile indexFile(widgetLibraryPath + "/index.htm");

995
        if (!indexFile.open(QIODevice::WriteOnly)) {
996
            qWarning() << "Cannot open file " << indexFile.fileName();
997
            return QString();
998 999 1000 1001 1002 1003 1004 1005 1006
        }

        QTextStream outIndex(&indexFile);
        outIndex.setCodec("UTF-8");

        outIndex << htmlTemplate;
        indexFile.close();

        return widgetLibraryPath;
Claudio Valerio's avatar
Claudio Valerio committed
1007 1008
    }
    else
1009
        return QString();
1010 1011
}

1012
QString UBGraphicsW3CWidgetItem::createHtmlWrapperInDir(const QString& html, const QDir& pDir, const QSize& sizeHint, const QString& pName)
1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
{
    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());

1026
    if (!configFile.open(QIODevice::WriteOnly)) {
1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054
        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());
1055
    if (!widgetHtmlFile.open(QIODevice::WriteOnly)) {
1056
        qWarning() << "cannot open file " << widgetHtmlFile.fileName();
1057
        return QString();
Claudio Valerio's avatar
Claudio Valerio committed
1058
    }
1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075

    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;
Claudio Valerio's avatar
Claudio Valerio committed
1076 1077
}

1078
QString UBGraphicsW3CWidgetItem::freezedWidgetPage()
root's avatar
root committed
1079
{
1080 1081 1082
    static QString defaultcontent;

    if (defaultcontent.isNull()) {
1083
        QString freezedWidgetDefaultContentFilePath = freezedWidgetFilePath();
1084 1085 1086 1087
        QFile wrapperFile(freezedWidgetDefaultContentFilePath);
        if (!wrapperFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
            qDebug() << "can't open wrapper file " + freezedWidgetDefaultContentFilePath;
            defaultcontent = "";
1088 1089
        } 
        else {
1090
            QByteArray arr = wrapperFile.readAll();
1091 1092 1093
            if (!arr.isEmpty())
                defaultcontent = QString(arr); 
            else {
1094
                qDebug() << "content of " + freezedWidgetDefaultContentFilePath + "is empty";
1095
                defaultcontent = QString();
1096 1097 1098 1099 1100 1101 1102
            }
        }
    }

    return defaultcontent;
}

1103 1104 1105 1106 1107
QString UBGraphicsW3CWidgetItem::freezedWidgetFilePath()
{
    return UBPlatformUtils::applicationResourcesDirectory() + "/etc/" + "freezedWidgetWrapper.html";
}

1108 1109 1110 1111 1112
bool UBGraphicsW3CWidgetItem::hasNPAPIWrapper(const QString& pMimeType)
{
    loadNPAPIWrappersTemplates();

    return sNPAPIWrapperTemplates.contains(pMimeType);
root's avatar
root committed
1113 1114
}

Claudio Valerio's avatar
Claudio Valerio committed
1115 1116 1117 1118 1119 1120 1121
void UBGraphicsW3CWidgetItem::javaScriptWindowObjectCleared()
{
    UBGraphicsWidgetItem::javaScriptWindowObjectCleared();

    if(!mW3CWidgetAPI)
        mW3CWidgetAPI = new UBW3CWidgetAPI(this);

1122
    page()->mainFrame()->addToJavaScriptWindowObject("widget", mW3CWidgetAPI);
Claudio Valerio's avatar
Claudio Valerio committed
1123 1124 1125

}

1126
void UBGraphicsW3CWidgetItem::loadNPAPIWrappersTemplates()
Claudio Valerio's avatar
Claudio Valerio committed
1127
{
1128
    if (!sTemplateLoaded) {
1129
        sNPAPIWrapperTemplates.clear();
Claudio Valerio's avatar
Claudio Valerio committed
1130

1131
        QString etcPath = UBPlatformUtils::applicationResourcesDirectory() + "/etc/";
Claudio Valerio's avatar
Claudio Valerio committed
1132

1133
        QDir etcDir(etcPath);
Claudio Valerio's avatar
Claudio Valerio committed
1134

1135 1136
        foreach(QString fileName, etcDir.entryList()) {
            if (fileName.startsWith("npapi-wrapper") && (fileName.endsWith(".htm") || fileName.endsWith(".html"))) {
Claudio Valerio's avatar
Claudio Valerio committed
1137

1138 1139
                QString htmlContent = UBFileSystemUtils::readTextFile(etcPath + fileName);

1140
                if (htmlContent.length() > 0) {
1141 1142
                    QStringList tokens = fileName.split(".");

1143
                    if (tokens.length() >= 4) {
1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160
                        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 UBGraphicsW3CWidgetItem::textForSubElementByLocale(QDomElement rootElement, QString subTagName, QLocale locale)
Claudio Valerio's avatar
Claudio Valerio committed
1161
{
1162
    QDomNodeList subList = rootElement.elementsByTagName(subTagName);
Claudio Valerio's avatar
Claudio Valerio committed
1163

1164 1165 1166 1167 1168
    QString lang = locale.name();

    if (lang.length() > 2)
        lang[2] = QLatin1Char('-');

1169 1170
    if (subList.count() > 1) {
        for(int i = 0; i < subList.count(); i++) {
1171 1172 1173 1174 1175 1176 1177 1178 1179 1180
            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();
        }
    }

1181
    if (subList.count() >= 1) {
1182 1183 1184 1185
        QDomElement element = subList.item(0).toElement();
        return element.text();
    }

1186
    return QString();
1187
}
Claudio Valerio's avatar
Claudio Valerio committed
1188

1189 1190 1191 1192
void UBGraphicsW3CWidgetItem::copyItemParameters(UBItem *copy) const
{
    UBGraphicsW3CWidgetItem *cp = dynamic_cast<UBGraphicsW3CWidgetItem*>(copy);
    if (cp)
Claudio Valerio's avatar
Claudio Valerio committed
1193
    {
1194 1195 1196 1197 1198 1199 1200
        cp->setPos(this->pos());
        cp->setTransform(this->transform());
        cp->setFlag(QGraphicsItem::ItemIsMovable, true);
        cp->setFlag(QGraphicsItem::ItemIsSelectable, true);
        cp->setData(UBGraphicsItemData::ItemLayerType, this->data(UBGraphicsItemData::ItemLayerType));
        cp->setData(UBGraphicsItemData::ItemLocked, this->data(UBGraphicsItemData::ItemLocked));
        cp->setSourceUrl(this->sourceUrl());
Claudio Valerio's avatar
Claudio Valerio committed
1201

1202
        cp->resize(this->size());
Claudio Valerio's avatar
Claudio Valerio committed
1203

1204
        foreach(QString key, UBGraphicsWidgetItem::preferences().keys())
1205
        {
Yimgo's avatar
Yimgo committed
1206
            cp->setPreference(key, UBGraphicsWidgetItem::preferences().value(key));
1207 1208 1209 1210 1211 1212 1213
        }

        foreach(QString key, mDatastore.keys())
        {
            cp->setDatastoreEntry(key, mDatastore.value(key));
        }
    }
Yimgo's avatar
Yimgo committed
1214 1215
}