UBGraphicsWidgetItem.cpp 37.1 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)
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
48
    : QGraphicsWebView(parent)
49 50
    , 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
{
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
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

87 88
    setDelegate(new UBGraphicsWidgetItemDelegate(this));
    Delegate()->init();
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
89 90 91

    setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
    QGraphicsWebView::setAcceptHoverEvents(true);
Claudio Valerio's avatar
Claudio Valerio committed
92 93 94 95
}


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

100
void UBGraphicsWidgetItem::initialize()
Claudio Valerio's avatar
Claudio Valerio committed
101
{
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
102
    setMinimumSize(nominalSize());
103
    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
104

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

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

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

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

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

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

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

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

151 152
    return false;
}
Claudio Valerio's avatar
Claudio Valerio committed
153

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

162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
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
179

180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
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
197

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

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

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

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


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


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

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

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

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

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


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

259

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

265 266 267 268 269
void UBGraphicsWidgetItem::removeScript()
{
    if (page() && page()->mainFrame())
        page()->mainFrame()->evaluateJavaScript("if(widget && widget.onremove) { widget.onremove();}");
}
Claudio Valerio's avatar
Claudio Valerio committed
270

271
void UBGraphicsWidgetItem::processDropEvent(QGraphicsSceneDragDropEvent *event)
272
{
273
    mUniboardAPI->ProcessDropEvent(event);
274 275
}
bool UBGraphicsWidgetItem::isDropableData(const QMimeData *data) const
Claudio Valerio's avatar
Claudio Valerio committed
276
{
277
    return mUniboardAPI->isDropableData(data);
Claudio Valerio's avatar
Claudio Valerio committed
278 279
}

280 281 282
QUrl UBGraphicsWidgetItem::getOwnFolder() const {
    return ownFolder;
}
Claudio Valerio's avatar
Claudio Valerio committed
283

284
void UBGraphicsWidgetItem::setOwnFolder(const QUrl &newFolder)
Claudio Valerio's avatar
Claudio Valerio committed
285
{
286
    ownFolder = newFolder;
Claudio Valerio's avatar
Claudio Valerio committed
287 288
}

289 290 291 292
void UBGraphicsWidgetItem::setSnapshotPath(const QUrl &newFilePath)
{
    SnapshotFile = newFilePath;
}
Claudio Valerio's avatar
Claudio Valerio committed
293

294
QUrl UBGraphicsWidgetItem::getSnapshotPath()
Claudio Valerio's avatar
Claudio Valerio committed
295
{
296
    return SnapshotFile;
Claudio Valerio's avatar
Claudio Valerio committed
297 298
}

299 300 301 302 303
void UBGraphicsWidgetItem::clearSource()
{
    UBFileSystemUtils::deleteDir(getOwnFolder().toLocalFile());
    UBFileSystemUtils::deleteFile(getSnapshotPath().toLocalFile());
}
Claudio Valerio's avatar
Claudio Valerio committed
304

305
void UBGraphicsWidgetItem::setUuid(const QUuid &pUuid)
Claudio Valerio's avatar
Claudio Valerio committed
306
{
307 308
    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
309 310
}

311 312 313 314
QSize UBGraphicsWidgetItem::nominalSize() const
{
    return mNominalSize;
}
Claudio Valerio's avatar
Claudio Valerio committed
315

316
bool UBGraphicsWidgetItem::hasLoadedSuccessfully() const
Claudio Valerio's avatar
Claudio Valerio committed
317
{
318
    return (mInitialLoadDone && !mLoadIsErronous);
Claudio Valerio's avatar
Claudio Valerio committed
319 320
}

321 322 323 324
bool UBGraphicsWidgetItem::freezable() 
{ 
    return mIsFreezable;
}
Claudio Valerio's avatar
Claudio Valerio committed
325

326 327 328 329 330 331 332 333
bool UBGraphicsWidgetItem::resizable()
{ 
    return mIsResizable;
}        

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

336 337 338 339
QPixmap UBGraphicsWidgetItem::snapshot()
{
    return mSnapshot;
}
Claudio Valerio's avatar
Claudio Valerio committed
340

341
QPixmap UBGraphicsWidgetItem::takeSnapshot()
Claudio Valerio's avatar
Claudio Valerio committed
342
{
343
    mIsTakingSnapshot = true;
Claudio Valerio's avatar
Claudio Valerio committed
344

345 346 347 348 349 350
    QPixmap pixmap(size().toSize());
    pixmap.fill(Qt::transparent);
    QPainter painter(&pixmap);
 
    QStyleOptionGraphicsItem options;
    paint(&painter, &options);
Claudio Valerio's avatar
Claudio Valerio committed
351

352
    mIsTakingSnapshot = false;
Claudio Valerio's avatar
Claudio Valerio committed
353

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
354 355
    mSnapshot = pixmap;

356 357 358 359
    return pixmap;
}

void UBGraphicsWidgetItem::setSnapshot(const QPixmap& pix)
Claudio Valerio's avatar
Claudio Valerio committed
360
{
361
    mSnapshot = pix;
Claudio Valerio's avatar
Claudio Valerio committed
362 363
}

364 365 366 367
UBGraphicsScene* UBGraphicsWidgetItem::scene()
{
    return qobject_cast<UBGraphicsScene*>(QGraphicsItem::scene());
}
Claudio Valerio's avatar
Claudio Valerio committed
368

369
int UBGraphicsWidgetItem::widgetType(const QUrl& pUrl)
Claudio Valerio's avatar
Claudio Valerio committed
370
{
371 372 373 374 375 376 377 378
    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
379 380
}

381 382 383 384 385 386 387
QString UBGraphicsWidgetItem::widgetName(const QUrl& widgetPath)
{
    QString name;
    QString version;
    QFile w3CConfigFile(widgetPath.toLocalFile() + "/config.xml");
    QFile appleConfigFile(widgetPath.toLocalFile() + "/Info.plist");

388
    if (w3CConfigFile.exists() && w3CConfigFile.open(QFile::ReadOnly)) {
389 390 391
        QDomDocument doc;
        doc.setContent(w3CConfigFile.readAll());
        QDomElement root = doc.firstChildElement("widget");
392
        if (!root.isNull()) {
393 394 395 396 397 398 399
            QDomElement nameElement = root.firstChildElement("name");
            if (!nameElement.isNull())
                name = nameElement.text();
            version = root.attribute("version", "");
        }
        w3CConfigFile.close();
    }
400
    else if (appleConfigFile.exists() && appleConfigFile.open(QFile::ReadOnly)) {
401 402 403
        QDomDocument doc;
        doc.setContent(appleConfigFile.readAll());
        QDomElement root = doc.firstChildElement("plist");
404
        if (!root.isNull()) {
405
            QDomElement dictElement = root.firstChildElement("dict");
406
            if (!dictElement.isNull()) {
407 408
                QDomNodeList childNodes  = dictElement.childNodes();

409 410 411 412 413 414
                /* looking for something like
                 * ..
                 * <key>CFBundleDisplayName</key>
                 * <string>brain scans</string>
                 * ..
                 */
415

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

439
    if (name.length() > 0) {
440
        result = name;
441
        if (version.length() > 0) {
442 443 444 445 446 447 448
            result += " ";
            result += version;
        }
    }
    return result;
}

449
QString UBGraphicsWidgetItem::iconFilePath(const QUrl& pUrl)
Claudio Valerio's avatar
Claudio Valerio committed
450
{
451
    /* TODO UB 4.x read config.xml widget.icon param first */
452

453
    QStringList files;
454

455 456 457 458 459
    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 */
460

461 462 463
    QString file = UBFileSystemUtils::getFirstExistingFileFromList(pUrl.toLocalFile(), files);
    /* default */
    if (file.length() == 0)
464
    {
465
        file = QString(":/images/defaultWidgetIcon.png");
466
    }
467
    return file;
Claudio Valerio's avatar
Claudio Valerio committed
468 469
}

470 471 472 473 474 475
void UBGraphicsWidgetItem::freeze()
{
    QPixmap pix = takeSnapshot();
    mIsFrozen = true;
    setSnapshot(pix);
}
Claudio Valerio's avatar
Claudio Valerio committed
476

477
void UBGraphicsWidgetItem::unFreeze()
Claudio Valerio's avatar
Claudio Valerio committed
478
{
479
    mIsFrozen = false;
Claudio Valerio's avatar
Claudio Valerio committed
480 481
}

482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497
bool UBGraphicsWidgetItem::event(QEvent *event)
{
    if (mShouldMoveWidget && event->type() == QEvent::MouseMove) {
        QMouseEvent *mouseMoveEvent = static_cast<QMouseEvent*>(event);
        if (mouseMoveEvent->buttons() & Qt::LeftButton) {
            QPointF scenePos = mapToScene(mouseMoveEvent->pos());
            QPointF newPos = pos() + scenePos - mLastMousePos;
            setPos(newPos);
            mLastMousePos = scenePos;
            event->accept();
            return true;
        }
    }    
    else if (event->type() == QEvent::ShortcutOverride)
        event->accept();

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
498
    return QGraphicsWebView::event(event);
499 500 501 502 503 504 505 506
}

void UBGraphicsWidgetItem::dropEvent(QGraphicsSceneDragDropEvent *event)
{
    processDropEvent(event);
    QGraphicsWebView::dropEvent(event);
}

Claudio Valerio's avatar
Claudio Valerio committed
507 508
void UBGraphicsWidgetItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
509
    if (!Delegate()->mousePressEvent(event))
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
510 511 512
        setSelected(true); /* forcing selection */

    QGraphicsWebView::mousePressEvent(event);
Claudio Valerio's avatar
Claudio Valerio committed
513 514 515 516 517 518 519 520 521 522

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

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

    event->accept();
}

void UBGraphicsWidgetItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
523
{
Claudio Valerio's avatar
Claudio Valerio committed
524
    mShouldMoveWidget = false;
525

526
    Delegate()->mouseReleaseEvent(event);
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
527
    QGraphicsWebView::mouseReleaseEvent(event);
528
}
529

530
void UBGraphicsWidgetItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
Claudio Valerio's avatar
Claudio Valerio committed
531
{
532
    sendJSEnterEvent();
533
    Delegate()->hoverEnterEvent(event);
Claudio Valerio's avatar
Claudio Valerio committed
534
}
535
void UBGraphicsWidgetItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
Claudio Valerio's avatar
Claudio Valerio committed
536
{
537
    sendJSLeaveEvent();
538
    Delegate()->hoverLeaveEvent(event);
539 540
}

541 542
void UBGraphicsWidgetItem::sendJSEnterEvent()
{
543 544
    if (page() && page()->mainFrame())
        page()->mainFrame()->evaluateJavaScript("if(widget && widget.onenter) { widget.onenter();}");
545
}
546

547 548
void UBGraphicsWidgetItem::sendJSLeaveEvent()
{
549 550
    if (page() && page()->mainFrame())
        page()->mainFrame()->evaluateJavaScript("if(widget && widget.onleave) { widget.onleave();}");
551 552 553 554 555 556 557
}

void UBGraphicsWidgetItem::injectInlineJavaScript()
{
    if (!sInlineJavaScriptLoaded) {
        sInlineJavaScripts = UBApplication::applicationController->widgetInlineJavaScripts();
        sInlineJavaScriptLoaded = true;
558
    }
559 560 561

    foreach(QString script, sInlineJavaScripts)
        page()->mainFrame()->evaluateJavaScript(script);
562
}
563

564
void UBGraphicsWidgetItem::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
565
{
Claudio Valerio's avatar
Claudio Valerio committed
566

Claudio Valerio's avatar
Claudio Valerio committed
567
    if (scene() && scene()->renderingContext() != UBGraphicsScene::Screen)
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
568 569 570
    {
        painter->drawPixmap(0, 0, snapshot());
    }
571
    else
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
572 573 574 575
    {
        if (!mInitialLoadDone || mLoadIsErronous) 
        {
            QString message;
576

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
577 578 579 580
            if (mInitialLoadDone && mLoadIsErronous)
                message = tr("Cannot load content");
            else
                message = tr("Loading ...");
581

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
582
            painter->setFont(QFont("Arial", 12));
583

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
584 585
            QFontMetrics fm = painter->fontMetrics();
            QRect txtBoundingRect = fm.boundingRect(message);
586

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
587 588
            txtBoundingRect.moveCenter(rect().center().toPoint());
            txtBoundingRect.adjust(-10, -5, 10, 5);
589

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
590 591 592
            painter->setPen(Qt::NoPen);
            painter->setBrush(UBSettings::paletteColor);
            painter->drawRoundedRect(txtBoundingRect, 3, 3);
593

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
594 595 596 597 598
            painter->setPen(Qt::white);
            painter->drawText(rect(), Qt::AlignCenter, message);
        }
        else
            QGraphicsWebView::paint(painter, option, widget);
599
    }
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
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
}

Claudio Valerio's avatar
Claudio Valerio committed
626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671
void UBGraphicsWidgetItem::wheelEvent(QGraphicsSceneWheelEvent *event)
{
    if (Delegate()->weelEvent(event))
    {
        QGraphicsWebView::wheelEvent(event);
        event->accept();
    }
}

QVariant UBGraphicsWidgetItem::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 = Delegate()->itemChange(change, value);
    return QGraphicsWebView::itemChange(change, newValue);
}

void UBGraphicsWidgetItem::resize(qreal w, qreal h)
{
    UBGraphicsWidgetItem::resize(QSizeF(w, h));
}


void UBGraphicsWidgetItem::resize(const QSizeF & pSize)
{
    if (pSize != size()) {
        QGraphicsWebView::setMaximumSize(pSize.width(), pSize.height());
        QGraphicsWebView::resize(pSize.width(), pSize.height());
        if (Delegate())
            Delegate()->positionHandles();
        if (scene())
            scene()->setModified(true);
    }
}

QSizeF UBGraphicsWidgetItem::size() const
{
    return QGraphicsWebView::size();
}

Claudio Valerio's avatar
Claudio Valerio committed
672 673 674


UBGraphicsAppleWidgetItem::UBGraphicsAppleWidgetItem(const QUrl& pWidgetUrl, QGraphicsItem *parent)
Yimgo's avatar
Yimgo committed
675
    : UBGraphicsWidgetItem(pWidgetUrl, parent)
Claudio Valerio's avatar
Claudio Valerio committed
676
{
677
    QString path = pWidgetUrl.toLocalFile();
Claudio Valerio's avatar
Claudio Valerio committed
678

679
    if (!path.endsWith(".wdgt") && !path.endsWith(".wdgt/")) {
680 681 682 683
        int lastSlashIndex = path.lastIndexOf("/");
        if (lastSlashIndex > 0)
            path = path.mid(0, lastSlashIndex + 1);
    }
Claudio Valerio's avatar
Claudio Valerio committed
684

685 686
    QFile plistFile(path + "/Info.plist");
    plistFile.open(QFile::ReadOnly);
Claudio Valerio's avatar
Claudio Valerio committed
687

688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707
    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
708 709 710 711 712 713 714

    initialize();
}


UBGraphicsAppleWidgetItem::~UBGraphicsAppleWidgetItem()
{
715 716 717 718 719 720 721 722
    /* NOOP */
}

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
723 724 725

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

728 729 730
    copyItemParameters(appleWidget);

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

732 733 734 735 736 737
}

void UBGraphicsAppleWidgetItem::copyItemParameters(UBItem *copy) const
{
    UBGraphicsAppleWidgetItem *cp = dynamic_cast<UBGraphicsAppleWidgetItem*>(copy);
    if (cp)
Claudio Valerio's avatar
Claudio Valerio committed
738
    {
739 740 741 742
        foreach(QString key, mPreferences.keys())
        {
            cp->setPreference(key, mPreferences.value(key));
        }
Claudio Valerio's avatar
Claudio Valerio committed
743

744 745 746 747
        foreach(QString key, mDatastore.keys())
        {
            cp->setDatastoreEntry(key, mDatastore.value(key));
        }
Claudio Valerio's avatar
Claudio Valerio committed
748

749 750
        cp->setSourceUrl(this->sourceUrl());
    }
Claudio Valerio's avatar
Claudio Valerio committed
751 752 753

}

754 755 756 757 758 759



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

761
UBGraphicsW3CWidgetItem::UBGraphicsW3CWidgetItem(const QUrl& pWidgetUrl, QGraphicsItem *parent)
Yimgo's avatar
Yimgo committed
762
    : UBGraphicsWidgetItem(pWidgetUrl, parent)
Claudio Valerio's avatar
Claudio Valerio committed
763 764
    , mW3CWidgetAPI(0)
{
765 766 767
    QString path = pWidgetUrl.toLocalFile();
    QDir potentialDir(path);

768
    if (!path.endsWith(".wgt") && !path.endsWith(".wgt/") && !potentialDir.exists()) {
769 770 771 772 773
        int lastSlashIndex = path.lastIndexOf("/");
        if (lastSlashIndex > 0)
            path = path.mid(0, lastSlashIndex + 1);
    }

774
    if (!path.endsWith("/"))
775 776 777 778 779 780 781 782 783 784 785 786
        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");

787
    if (widgetDomList.count() > 0) {
788 789 790 791 792 793 794
        QDomElement widgetElement = widgetDomList.item(0).toElement();

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

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

795
        /* some early widget (<= 4.3.4) where using identifier instead of id */
796 797 798 799 800
        if (mMetadatas.id.length() == 0)
             mMetadatas.id = widgetElement.attribute("identifier", "");

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

801
        /* TODO UB 4.x map properly ub namespace */
802 803 804 805 806
        mIsResizable = widgetElement.attribute("ub:resizable", "false") == "true";
        mIsFreezable = widgetElement.attribute("ub:freezable", "true") == "true";

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

807
        /* ------------------------------ */
808

809
        if (roles == "" || roles.contains("tool"))
810 811
            mCanBeTool = UBGraphicsWidgetItem::type_ALL;

812
        if (roles.contains("twin"))
813 814
            mCanBeTool |= UBGraphicsWidgetItem::type_WIN;

815
        if (roles.contains("tmac"))
816 817
            mCanBeTool |= UBGraphicsWidgetItem::type_MAC;
        
818
        if (roles.contains("tunix"))
819 820
            mCanBeTool |= UBGraphicsWidgetItem::type_UNIX;

821
        /* --------- */
822

823
        if (roles == "" || roles.contains("content"))
824 825
            mCanBeContent = UBGraphicsWidgetItem::type_ALL;

826
        if (roles.contains("cwin"))
827 828
            mCanBeContent |= UBGraphicsWidgetItem::type_WIN;

829
        if (roles.contains("cmac"))
830 831
            mCanBeContent |= UBGraphicsWidgetItem::type_MAC;

832
        if (roles.contains("cunix"))
833 834 835 836 837 838
            mCanBeContent |= UBGraphicsWidgetItem::type_UNIX;

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

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

839
        if (contentDomList.count() > 0) {
840 841 842 843 844 845 846 847 848
            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");

849
        if (authorDomList.count() > 0) {
850 851 852 853 854 855 856 857 858
            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");

859
        for (uint i = 0; i < propertiesDomList.length(); i++) {
860 861 862
            QDomElement preferenceElement = propertiesDomList.at(i).toElement();
            QString prefName = preferenceElement.attribute("name", "");

863
            if (prefName.length() > 0) {
864 865 866 867 868
                QString prefValue = preferenceElement.attribute("value", "");
                bool readOnly = (preferenceElement.attribute("readonly", "false") == "true");

                mPreferences.insert(prefName, PreferenceValue(prefValue, readOnly));
            }
869
        }
870 871
    }

872
    if (mMainHtmlFileName.length() == 0) {
873 874 875 876
        QFile defaultStartFile(path + "index.htm");

        if (defaultStartFile.exists())
            mMainHtmlFileName = "index.htm";
877
        else {
878 879 880 881 882 883 884 885 886
            QFile secondDefaultStartFile(path + "index.html");

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

    mMainHtmlUrl = pWidgetUrl;
    mMainHtmlUrl.setPath(pWidgetUrl.path() + "/" + mMainHtmlFileName);
887
    /* is it a valid local file ? */
888 889
    QFile f(mMainHtmlUrl.toLocalFile());

890 891 892
    qDebug() << mMainHtmlFileName;
    qDebug() << mMainHtmlUrl.toLocalFile();

893 894 895 896 897 898 899 900 901 902 903 904
    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
905
    initialize();
906
    setOwnFolder(pWidgetUrl);
Claudio Valerio's avatar
Claudio Valerio committed
907 908 909 910
}

UBGraphicsW3CWidgetItem::~UBGraphicsW3CWidgetItem()
{
911
    /* NOOP */
Claudio Valerio's avatar
Claudio Valerio committed
912 913
}

root's avatar
root committed
914
void UBGraphicsW3CWidgetItem::setUuid(const QUuid &pUuid)
Claudio Valerio's avatar
Claudio Valerio committed
915
{
root's avatar
root committed
916 917
    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
918 919 920 921
}

UBItem* UBGraphicsW3CWidgetItem::deepCopy() const
{
Yimgo's avatar
Yimgo committed
922
    UBGraphicsW3CWidgetItem *copy = new UBGraphicsW3CWidgetItem(mWidgetUrl, parentItem());
Claudio Valerio's avatar
Claudio Valerio committed
923
    copy->setUuid(this->uuid()); // this is OK for now as long as Widgets are imutable
Yimgo's avatar
Yimgo committed
924
    copyItemParameters(copy);
Claudio Valerio's avatar
Claudio Valerio committed
925 926 927 928

    return copy;
}

929 930 931
QMap<QString, UBGraphicsW3CWidgetItem::PreferenceValue> UBGraphicsW3CWidgetItem::preferences()
{
    return mPreferences;
932 933
}

934 935 936 937
UBGraphicsW3CWidgetItem::Metadata UBGraphicsW3CWidgetItem::metadatas() const
{
    return mMetadatas;
}
938

939
QString UBGraphicsW3CWidgetItem::createNPAPIWrapper(const QString& url, const QString& pMimeType, const QSize& sizeHint, const QString& pName)
940 941 942 943 944 945 946
{
    const QString userWidgetPath = UBSettings::settings()->userInteractiveDirectory() + "/" + tr("Web");
    QDir userWidgetDir(userWidgetPath);

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

947
QString UBGraphicsW3CWidgetItem::createNPAPIWrapperInDir(const QString& pUrl, const QDir& pDir, const QString& pMimeType, const QSize& sizeHint, const QString& pName)
948 949 950 951 952 953 954 955 956 957
{
    QString url = pUrl;
    url = UBFileSystemUtils::removeLocalFilePrefix(url);
    QString name = pName;

    QFileInfo fi(url);

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

958
    if (fi.exists())
959 960 961 962 963 964
        url = fi.fileName();

    loadNPAPIWrappersTemplates();

    QString htmlTemplate;

965
    if (pMimeType.length() > 0 && sNPAPIWrapperTemplates.contains(pMimeType))
966 967 968 969 970 971 972
        htmlTemplate = sNPAPIWrapperTemplates.value(pMimeType);
    else {
        QString extension = UBFileSystemUtils::extension(url);
        if (sNPAPIWrapperTemplates.contains(extension))
            htmlTemplate = sNPAPIWrapperTemplates.value(extension);
    }

973
    if (htmlTemplate.length() > 0) {
974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996
        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);
997
        if (fi.exists()) {
998 999 1000 1001 1002 1003 1004 1005
            QString target = widgetLibraryPath + "/" + fi.fileName();
            QString source = pUrl;
            source = UBFileSystemUtils::removeLocalFilePrefix(source);
            QFile::copy(source, target);
        }

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

1006
        if (!configFile.open(QIODevice::WriteOnly)) {
1007
            qWarning() << "Cannot open file " << configFile.fileName();
1008
            return QString();
Claudio Valerio's avatar
Claudio Valerio committed
1009
        }
1010 1011 1012 1013 1014 1015 1016 1017 1018

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

        outConfig << configTemplate;
        configFile.close();

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

1019
        if (!indexFile.open(QIODevice::WriteOnly)) {
1020
            qWarning() << "Cannot open file " << indexFile.fileName();
1021
            return QString();
1022 1023 1024 1025 1026 1027 1028 1029 1030
        }

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

        outIndex << htmlTemplate;
        indexFile.close();

        return widgetLibraryPath;
Claudio Valerio's avatar
Claudio Valerio committed
1031 1032
    }
    else
1033
        return QString();
1034 1035
}

1036
QString UBGraphicsW3CWidgetItem::createHtmlWrapperInDir(const QString& html, const QDir& pDir, const QSize& sizeHint, const QString& pName)
1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049
{
    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());

1050
    if (!configFile.open(QIODevice::WriteOnly)) {
1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
        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());
1079
    if (!widgetHtmlFile.open(QIODevice::WriteOnly)) {
1080
        qWarning() << "cannot open file " << widgetHtmlFile.fileName();
1081
        return QString();
Claudio Valerio's avatar
Claudio Valerio committed
1082
    }
1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099

    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
1100 1101
}

1102
QString UBGraphicsW3CWidgetItem::freezedWidgetPage()
root's avatar
root committed
1103
{
1104 1105 1106
    static QString defaultcontent;

    if (defaultcontent.isNull()) {
1107
        QString freezedWidgetDefaultContentFilePath = freezedWidgetFilePath();
1108 1109 1110 1111
        QFile wrapperFile(freezedWidgetDefaultContentFilePath);
        if (!wrapperFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
            qDebug() << "can't open wrapper file " + freezedWidgetDefaultContentFilePath;
            defaultcontent = "";
1112 1113
        } 
        else {
1114
            QByteArray arr = wrapperFile.readAll();
1115 1116 1117
            if (!arr.isEmpty())
                defaultcontent = QString(arr); 
            else {
1118
                qDebug() << "content of " + freezedWidgetDefaultContentFilePath + "is empty";
1119
                defaultcontent = QString();
1120 1121 1122 1123 1124 1125 1126
            }
        }
    }

    return defaultcontent;
}

1127 1128 1129 1130 1131
QString UBGraphicsW3CWidgetItem::freezedWidgetFilePath()
{
    return UBPlatformUtils::applicationResourcesDirectory() + "/etc/" + "freezedWidgetWrapper.html";
}

1132 1133 1134 1135 1136
bool UBGraphicsW3CWidgetItem::hasNPAPIWrapper(const QString& pMimeType)
{
    loadNPAPIWrappersTemplates();

    return sNPAPIWrapperTemplates.contains(pMimeType);
root's avatar
root committed
1137 1138
}

Claudio Valerio's avatar
Claudio Valerio committed
1139 1140 1141 1142 1143 1144 1145
void UBGraphicsW3CWidgetItem::javaScriptWindowObjectCleared()
{
    UBGraphicsWidgetItem::javaScriptWindowObjectCleared();

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

1146
    page()->mainFrame()->addToJavaScriptWindowObject("widget", mW3CWidgetAPI);
Claudio Valerio's avatar
Claudio Valerio committed
1147 1148 1149

}

1150
void UBGraphicsW3CWidgetItem::loadNPAPIWrappersTemplates()
Claudio Valerio's avatar
Claudio Valerio committed
1151
{
1152
    if (!sTemplateLoaded) {
1153
        sNPAPIWrapperTemplates.clear();
Claudio Valerio's avatar
Claudio Valerio committed
1154

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

1157
        QDir etcDir(etcPath);
Claudio Valerio's avatar
Claudio Valerio committed
1158

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

1162 1163
                QString htmlContent = UBFileSystemUtils::readTextFile(etcPath + fileName);

1164
                if (htmlContent.length() > 0) {
1165 1166
                    QStringList tokens = fileName.split(".");

1167
                    if (tokens.length() >= 4) {
1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184
                        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
1185
{
1186
    QDomNodeList subList = rootElement.elementsByTagName(subTagName);
Claudio Valerio's avatar
Claudio Valerio committed
1187

1188 1189 1190 1191 1192
    QString lang = locale.name();

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

1193 1194
    if (subList.count() > 1) {
        for(int i = 0; i < subList.count(); i++) {
1195 1196 1197 1198 1199 1200 1201 1202 1203 1204
            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();
        }
    }

1205
    if (subList.count() >= 1) {
1206 1207 1208 1209
        QDomElement element = subList.item(0).toElement();
        return element.text();
    }

1210
    return QString();
1211
}
Claudio Valerio's avatar
Claudio Valerio committed
1212

1213 1214 1215 1216
void UBGraphicsW3CWidgetItem::copyItemParameters(UBItem *copy) const
{
    UBGraphicsW3CWidgetItem *cp = dynamic_cast<UBGraphicsW3CWidgetItem*>(copy);
    if (cp)
Claudio Valerio's avatar
Claudio Valerio committed
1217
    {
1218 1219 1220 1221 1222 1223 1224
        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
1225

1226
        cp->resize(this->size());
Claudio Valerio's avatar
Claudio Valerio committed
1227

1228
        foreach(QString key, UBGraphicsWidgetItem::preferences().keys())
1229
        {
Yimgo's avatar
Yimgo committed
1230
            cp->setPreference(key, UBGraphicsWidgetItem::preferences().value(key));
1231 1232 1233 1234 1235 1236 1237
        }

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