1d0825bca7fe65beaee391d30da42e937db621564Steve Block/*
2d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
3d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
4d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2006 George Staikos <staikos@kde.org>
5d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2006 Dirk Mueller <mueller@kde.org>
6d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2006 Zack Rusin <zack@kde.org>
7d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2006 Simon Hausmann <hausmann@kde.org>
8d0825bca7fe65beaee391d30da42e937db621564Steve Block *
9d0825bca7fe65beaee391d30da42e937db621564Steve Block * All rights reserved.
10d0825bca7fe65beaee391d30da42e937db621564Steve Block *
11d0825bca7fe65beaee391d30da42e937db621564Steve Block * Redistribution and use in source and binary forms, with or without
12d0825bca7fe65beaee391d30da42e937db621564Steve Block * modification, are permitted provided that the following conditions
13d0825bca7fe65beaee391d30da42e937db621564Steve Block * are met:
14d0825bca7fe65beaee391d30da42e937db621564Steve Block * 1. Redistributions of source code must retain the above copyright
15d0825bca7fe65beaee391d30da42e937db621564Steve Block *    notice, this list of conditions and the following disclaimer.
16d0825bca7fe65beaee391d30da42e937db621564Steve Block * 2. Redistributions in binary form must reproduce the above copyright
17d0825bca7fe65beaee391d30da42e937db621564Steve Block *    notice, this list of conditions and the following disclaimer in the
18d0825bca7fe65beaee391d30da42e937db621564Steve Block *    documentation and/or other materials provided with the distribution.
19d0825bca7fe65beaee391d30da42e937db621564Steve Block *
20d0825bca7fe65beaee391d30da42e937db621564Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
21d0825bca7fe65beaee391d30da42e937db621564Steve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22d0825bca7fe65beaee391d30da42e937db621564Steve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23d0825bca7fe65beaee391d30da42e937db621564Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
24d0825bca7fe65beaee391d30da42e937db621564Steve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25d0825bca7fe65beaee391d30da42e937db621564Steve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26d0825bca7fe65beaee391d30da42e937db621564Steve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27d0825bca7fe65beaee391d30da42e937db621564Steve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
28d0825bca7fe65beaee391d30da42e937db621564Steve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29d0825bca7fe65beaee391d30da42e937db621564Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30d0825bca7fe65beaee391d30da42e937db621564Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31d0825bca7fe65beaee391d30da42e937db621564Steve Block */
32d0825bca7fe65beaee391d30da42e937db621564Steve Block
33d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QtGui>
34d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QtNetwork/QNetworkRequest>
35d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !defined(QT_NO_PRINTER)
36d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QPrintPreviewDialog>
37d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
38d0825bca7fe65beaee391d30da42e937db621564Steve Block
39d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifndef QT_NO_UITOOLS
40d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QtUiTools/QUiLoader>
41d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
42d0825bca7fe65beaee391d30da42e937db621564Steve Block
43d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QDebug>
44d0825bca7fe65beaee391d30da42e937db621564Steve Block
45d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <cstdio>
46d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "mainwindow.h"
47d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <qevent.h>
48d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <qwebelement.h>
49d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <qwebframe.h>
50d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <qwebinspector.h>
51d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <qwebsettings.h>
52d0825bca7fe65beaee391d30da42e937db621564Steve Block
53d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifdef Q_WS_MAEMO_5
54d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <qx11info_x11.h>
55d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
56d0825bca7fe65beaee391d30da42e937db621564Steve Block
57d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "urlloader.h"
58d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "utils.h"
59d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "webinspector.h"
60d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "webpage.h"
61d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "webview.h"
62d0825bca7fe65beaee391d30da42e937db621564Steve Block
63d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifdef Q_WS_MAEMO_5
64d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <X11/Xatom.h>
65d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <X11/Xlib.h>
66d0825bca7fe65beaee391d30da42e937db621564Steve Block#undef KeyPress
67d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
68d0825bca7fe65beaee391d30da42e937db621564Steve Block
69d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifndef NDEBUG
70d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid QWEBKIT_EXPORT qt_drt_garbageCollector_collect();
71d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
72d0825bca7fe65beaee391d30da42e937db621564Steve Block
738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockstatic bool gUseGraphicsView = false;
758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockstatic bool gUseCompositing = false;
768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockstatic bool gCacheWebView = false;
778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockstatic bool gShowFrameRate = false;
788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockstatic QGraphicsView::ViewportUpdateMode gViewportUpdateMode = QGraphicsView::MinimalViewportUpdate;
798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
81d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass LauncherWindow : public MainWindow {
82d0825bca7fe65beaee391d30da42e937db621564Steve Block    Q_OBJECT
83d0825bca7fe65beaee391d30da42e937db621564Steve Block
84d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic:
85d0825bca7fe65beaee391d30da42e937db621564Steve Block    LauncherWindow(QString url = QString());
86d0825bca7fe65beaee391d30da42e937db621564Steve Block    virtual ~LauncherWindow();
87d0825bca7fe65beaee391d30da42e937db621564Steve Block
88d0825bca7fe65beaee391d30da42e937db621564Steve Block    virtual void keyPressEvent(QKeyEvent* event);
89d0825bca7fe65beaee391d30da42e937db621564Steve Block    void grabZoomKeys(bool grab);
90d0825bca7fe65beaee391d30da42e937db621564Steve Block
91d0825bca7fe65beaee391d30da42e937db621564Steve Block#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
92d0825bca7fe65beaee391d30da42e937db621564Steve Block    void sendTouchEvent();
93d0825bca7fe65beaee391d30da42e937db621564Steve Block    bool eventFilter(QObject* obj, QEvent* event);
94d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
95d0825bca7fe65beaee391d30da42e937db621564Steve Block
96d0825bca7fe65beaee391d30da42e937db621564Steve Blockprotected slots:
97d0825bca7fe65beaee391d30da42e937db621564Steve Block    void loadStarted();
98d0825bca7fe65beaee391d30da42e937db621564Steve Block    void loadFinished();
99d0825bca7fe65beaee391d30da42e937db621564Steve Block
100d0825bca7fe65beaee391d30da42e937db621564Steve Block    void showLinkHover(const QString &link, const QString &toolTip);
101d0825bca7fe65beaee391d30da42e937db621564Steve Block
102d0825bca7fe65beaee391d30da42e937db621564Steve Block    void zoomIn();
103d0825bca7fe65beaee391d30da42e937db621564Steve Block    void zoomOut();
104d0825bca7fe65beaee391d30da42e937db621564Steve Block    void resetZoom();
105d0825bca7fe65beaee391d30da42e937db621564Steve Block    void toggleZoomTextOnly(bool on);
106d0825bca7fe65beaee391d30da42e937db621564Steve Block
107d0825bca7fe65beaee391d30da42e937db621564Steve Block    void print();
108d0825bca7fe65beaee391d30da42e937db621564Steve Block    void screenshot();
109d0825bca7fe65beaee391d30da42e937db621564Steve Block
110d0825bca7fe65beaee391d30da42e937db621564Steve Block    void setEditable(bool on);
111d0825bca7fe65beaee391d30da42e937db621564Steve Block
112d0825bca7fe65beaee391d30da42e937db621564Steve Block    /* void dumpPlugins() */
113d0825bca7fe65beaee391d30da42e937db621564Steve Block    void dumpHtml();
114d0825bca7fe65beaee391d30da42e937db621564Steve Block
115d0825bca7fe65beaee391d30da42e937db621564Steve Block    void selectElements();
116d0825bca7fe65beaee391d30da42e937db621564Steve Block
117d0825bca7fe65beaee391d30da42e937db621564Steve Block    void setTouchMocking(bool on);
1188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    void toggleAcceleratedCompositing(bool toggle);
1198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    void initializeView(bool useGraphicsView = false);
120d0825bca7fe65beaee391d30da42e937db621564Steve Block
121d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic slots:
122d0825bca7fe65beaee391d30da42e937db621564Steve Block    void newWindow(const QString& url = QString());
123d0825bca7fe65beaee391d30da42e937db621564Steve Block
124d0825bca7fe65beaee391d30da42e937db621564Steve Blockprivate:
125d0825bca7fe65beaee391d30da42e937db621564Steve Block    // create the status bar, tool bar & menu
126d0825bca7fe65beaee391d30da42e937db621564Steve Block    void setupUI();
127d0825bca7fe65beaee391d30da42e937db621564Steve Block
128d0825bca7fe65beaee391d30da42e937db621564Steve Blockprivate:
129d0825bca7fe65beaee391d30da42e937db621564Steve Block    QVector<int> zoomLevels;
130d0825bca7fe65beaee391d30da42e937db621564Steve Block    int currentZoom;
131d0825bca7fe65beaee391d30da42e937db621564Steve Block
1328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    QWidget* m_view;
133d0825bca7fe65beaee391d30da42e937db621564Steve Block    WebInspector* inspector;
134d0825bca7fe65beaee391d30da42e937db621564Steve Block
135d0825bca7fe65beaee391d30da42e937db621564Steve Block    QAction* formatMenuAction;
136d0825bca7fe65beaee391d30da42e937db621564Steve Block
137d0825bca7fe65beaee391d30da42e937db621564Steve Block#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
138d0825bca7fe65beaee391d30da42e937db621564Steve Block    QList<QTouchEvent::TouchPoint> touchPoints;
139d0825bca7fe65beaee391d30da42e937db621564Steve Block    bool touchMocking;
140d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
141d0825bca7fe65beaee391d30da42e937db621564Steve Block};
142d0825bca7fe65beaee391d30da42e937db621564Steve Block
143d0825bca7fe65beaee391d30da42e937db621564Steve Block
144d0825bca7fe65beaee391d30da42e937db621564Steve BlockLauncherWindow::LauncherWindow(QString url)
145d0825bca7fe65beaee391d30da42e937db621564Steve Block    : MainWindow(url)
146d0825bca7fe65beaee391d30da42e937db621564Steve Block    , currentZoom(100)
147d0825bca7fe65beaee391d30da42e937db621564Steve Block{
148d0825bca7fe65beaee391d30da42e937db621564Steve Block    QSplitter* splitter = new QSplitter(Qt::Vertical, this);
149d0825bca7fe65beaee391d30da42e937db621564Steve Block    setCentralWidget(splitter);
150d0825bca7fe65beaee391d30da42e937db621564Steve Block
1518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#if defined(Q_WS_S60)
1528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    showMaximized();
1538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#else
1548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    resize(800, 600);
155d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
156d0825bca7fe65beaee391d30da42e937db621564Steve Block
1578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    m_view = 0;
1588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    initializeView();
1598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
160d0825bca7fe65beaee391d30da42e937db621564Steve Block    connect(page(), SIGNAL(loadStarted()), this, SLOT(loadStarted()));
161d0825bca7fe65beaee391d30da42e937db621564Steve Block    connect(page(), SIGNAL(loadFinished(bool)), this, SLOT(loadFinished()));
162d0825bca7fe65beaee391d30da42e937db621564Steve Block    connect(page(), SIGNAL(linkHovered(const QString&, const QString&, const QString&)),
163d0825bca7fe65beaee391d30da42e937db621564Steve Block            this, SLOT(showLinkHover(const QString&, const QString&)));
164d0825bca7fe65beaee391d30da42e937db621564Steve Block
165d0825bca7fe65beaee391d30da42e937db621564Steve Block    inspector = new WebInspector(splitter);
166d0825bca7fe65beaee391d30da42e937db621564Steve Block    inspector->setPage(page());
167d0825bca7fe65beaee391d30da42e937db621564Steve Block    inspector->hide();
168d0825bca7fe65beaee391d30da42e937db621564Steve Block    connect(this, SIGNAL(destroyed()), inspector, SLOT(deleteLater()));
169d0825bca7fe65beaee391d30da42e937db621564Steve Block
170d0825bca7fe65beaee391d30da42e937db621564Steve Block    setupUI();
171d0825bca7fe65beaee391d30da42e937db621564Steve Block
172d0825bca7fe65beaee391d30da42e937db621564Steve Block    // the zoom values are chosen to be like in Mozilla Firefox 3
173d0825bca7fe65beaee391d30da42e937db621564Steve Block    zoomLevels << 30 << 50 << 67 << 80 << 90;
174d0825bca7fe65beaee391d30da42e937db621564Steve Block    zoomLevels << 100;
175d0825bca7fe65beaee391d30da42e937db621564Steve Block    zoomLevels << 110 << 120 << 133 << 150 << 170 << 200 << 240 << 300;
176d0825bca7fe65beaee391d30da42e937db621564Steve Block
177d0825bca7fe65beaee391d30da42e937db621564Steve Block    grabZoomKeys(true);
178d0825bca7fe65beaee391d30da42e937db621564Steve Block
179d0825bca7fe65beaee391d30da42e937db621564Steve Block    load(url);
180d0825bca7fe65beaee391d30da42e937db621564Steve Block}
181d0825bca7fe65beaee391d30da42e937db621564Steve Block
182d0825bca7fe65beaee391d30da42e937db621564Steve BlockLauncherWindow::~LauncherWindow()
183d0825bca7fe65beaee391d30da42e937db621564Steve Block{
184d0825bca7fe65beaee391d30da42e937db621564Steve Block    grabZoomKeys(false);
185d0825bca7fe65beaee391d30da42e937db621564Steve Block}
186d0825bca7fe65beaee391d30da42e937db621564Steve Block
187d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::keyPressEvent(QKeyEvent* event)
188d0825bca7fe65beaee391d30da42e937db621564Steve Block{
189d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifdef Q_WS_MAEMO_5
190d0825bca7fe65beaee391d30da42e937db621564Steve Block    switch (event->key()) {
191d0825bca7fe65beaee391d30da42e937db621564Steve Block    case Qt::Key_F7:
192d0825bca7fe65beaee391d30da42e937db621564Steve Block        zoomIn();
193d0825bca7fe65beaee391d30da42e937db621564Steve Block        event->accept();
194d0825bca7fe65beaee391d30da42e937db621564Steve Block        break;
195d0825bca7fe65beaee391d30da42e937db621564Steve Block    case Qt::Key_F8:
196d0825bca7fe65beaee391d30da42e937db621564Steve Block        zoomOut();
197d0825bca7fe65beaee391d30da42e937db621564Steve Block        event->accept();
198d0825bca7fe65beaee391d30da42e937db621564Steve Block        break;
199d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
200d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
201d0825bca7fe65beaee391d30da42e937db621564Steve Block    MainWindow::keyPressEvent(event);
202d0825bca7fe65beaee391d30da42e937db621564Steve Block}
203d0825bca7fe65beaee391d30da42e937db621564Steve Block
204d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::grabZoomKeys(bool grab)
205d0825bca7fe65beaee391d30da42e937db621564Steve Block{
206d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifdef Q_WS_MAEMO_5
207d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!winId()) {
208d0825bca7fe65beaee391d30da42e937db621564Steve Block        qWarning("Can't grab keys unless we have a window id");
209d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
210d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
211d0825bca7fe65beaee391d30da42e937db621564Steve Block
212d0825bca7fe65beaee391d30da42e937db621564Steve Block    Atom atom = XInternAtom(QX11Info::display(), "_HILDON_ZOOM_KEY_ATOM", False);
213d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!atom) {
214d0825bca7fe65beaee391d30da42e937db621564Steve Block        qWarning("Unable to obtain _HILDON_ZOOM_KEY_ATOM");
215d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
216d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
217d0825bca7fe65beaee391d30da42e937db621564Steve Block
218d0825bca7fe65beaee391d30da42e937db621564Steve Block    unsigned long val = (grab) ? 1 : 0;
219d0825bca7fe65beaee391d30da42e937db621564Steve Block    XChangeProperty(QX11Info::display(), winId(), atom, XA_INTEGER, 32, PropModeReplace, reinterpret_cast<unsigned char*>(&val), 1);
220d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
221d0825bca7fe65beaee391d30da42e937db621564Steve Block}
222d0825bca7fe65beaee391d30da42e937db621564Steve Block
223d0825bca7fe65beaee391d30da42e937db621564Steve Block#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
224d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::sendTouchEvent()
225d0825bca7fe65beaee391d30da42e937db621564Steve Block{
226d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (touchPoints.isEmpty())
227d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
228d0825bca7fe65beaee391d30da42e937db621564Steve Block
229d0825bca7fe65beaee391d30da42e937db621564Steve Block    QEvent::Type type = QEvent::TouchUpdate;
230d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (touchPoints.size() == 1) {
231d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (touchPoints[0].state() == Qt::TouchPointReleased)
232d0825bca7fe65beaee391d30da42e937db621564Steve Block            type = QEvent::TouchEnd;
233d0825bca7fe65beaee391d30da42e937db621564Steve Block        else if (touchPoints[0].state() == Qt::TouchPointPressed)
234d0825bca7fe65beaee391d30da42e937db621564Steve Block            type = QEvent::TouchBegin;
235d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
236d0825bca7fe65beaee391d30da42e937db621564Steve Block
237d0825bca7fe65beaee391d30da42e937db621564Steve Block    QTouchEvent touchEv(type);
238d0825bca7fe65beaee391d30da42e937db621564Steve Block    touchEv.setTouchPoints(touchPoints);
239d0825bca7fe65beaee391d30da42e937db621564Steve Block    QCoreApplication::sendEvent(page(), &touchEv);
240d0825bca7fe65beaee391d30da42e937db621564Steve Block
241d0825bca7fe65beaee391d30da42e937db621564Steve Block    // After sending the event, remove all touchpoints that were released
242d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (touchPoints[0].state() == Qt::TouchPointReleased)
243d0825bca7fe65beaee391d30da42e937db621564Steve Block        touchPoints.removeAt(0);
244d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (touchPoints.size() > 1 && touchPoints[1].state() == Qt::TouchPointReleased)
245d0825bca7fe65beaee391d30da42e937db621564Steve Block        touchPoints.removeAt(1);
246d0825bca7fe65beaee391d30da42e937db621564Steve Block}
247d0825bca7fe65beaee391d30da42e937db621564Steve Block
248d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool LauncherWindow::eventFilter(QObject* obj, QEvent* event)
249d0825bca7fe65beaee391d30da42e937db621564Steve Block{
2508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!touchMocking || obj != m_view)
251d0825bca7fe65beaee391d30da42e937db621564Steve Block        return QObject::eventFilter(obj, event);
252d0825bca7fe65beaee391d30da42e937db621564Steve Block
253d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (event->type() == QEvent::MouseButtonPress
254d0825bca7fe65beaee391d30da42e937db621564Steve Block        || event->type() == QEvent::MouseButtonRelease
255d0825bca7fe65beaee391d30da42e937db621564Steve Block        || event->type() == QEvent::MouseButtonDblClick
256d0825bca7fe65beaee391d30da42e937db621564Steve Block        || event->type() == QEvent::MouseMove) {
257d0825bca7fe65beaee391d30da42e937db621564Steve Block
258d0825bca7fe65beaee391d30da42e937db621564Steve Block        QMouseEvent* ev = static_cast<QMouseEvent*>(event);
259d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (ev->type() == QEvent::MouseMove
260d0825bca7fe65beaee391d30da42e937db621564Steve Block            && !(ev->buttons() & Qt::LeftButton))
261d0825bca7fe65beaee391d30da42e937db621564Steve Block            return false;
262d0825bca7fe65beaee391d30da42e937db621564Steve Block
263d0825bca7fe65beaee391d30da42e937db621564Steve Block        QTouchEvent::TouchPoint touchPoint;
264d0825bca7fe65beaee391d30da42e937db621564Steve Block        touchPoint.setState(Qt::TouchPointMoved);
265d0825bca7fe65beaee391d30da42e937db621564Steve Block        if ((ev->type() == QEvent::MouseButtonPress
266d0825bca7fe65beaee391d30da42e937db621564Steve Block             || ev->type() == QEvent::MouseButtonDblClick))
267d0825bca7fe65beaee391d30da42e937db621564Steve Block            touchPoint.setState(Qt::TouchPointPressed);
268d0825bca7fe65beaee391d30da42e937db621564Steve Block        else if (ev->type() == QEvent::MouseButtonRelease)
269d0825bca7fe65beaee391d30da42e937db621564Steve Block            touchPoint.setState(Qt::TouchPointReleased);
270d0825bca7fe65beaee391d30da42e937db621564Steve Block
271d0825bca7fe65beaee391d30da42e937db621564Steve Block        touchPoint.setId(0);
272d0825bca7fe65beaee391d30da42e937db621564Steve Block        touchPoint.setScreenPos(ev->globalPos());
273d0825bca7fe65beaee391d30da42e937db621564Steve Block        touchPoint.setPos(ev->pos());
274d0825bca7fe65beaee391d30da42e937db621564Steve Block        touchPoint.setPressure(1);
275d0825bca7fe65beaee391d30da42e937db621564Steve Block
276d0825bca7fe65beaee391d30da42e937db621564Steve Block        // If the point already exists, update it. Otherwise create it.
277d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (touchPoints.size() > 0 && !touchPoints[0].id())
278d0825bca7fe65beaee391d30da42e937db621564Steve Block            touchPoints[0] = touchPoint;
279d0825bca7fe65beaee391d30da42e937db621564Steve Block        else if (touchPoints.size() > 1 && !touchPoints[1].id())
280d0825bca7fe65beaee391d30da42e937db621564Steve Block            touchPoints[1] = touchPoint;
281d0825bca7fe65beaee391d30da42e937db621564Steve Block        else
282d0825bca7fe65beaee391d30da42e937db621564Steve Block            touchPoints.append(touchPoint);
283d0825bca7fe65beaee391d30da42e937db621564Steve Block
284d0825bca7fe65beaee391d30da42e937db621564Steve Block        sendTouchEvent();
285d0825bca7fe65beaee391d30da42e937db621564Steve Block    } else if (event->type() == QEvent::KeyPress
286d0825bca7fe65beaee391d30da42e937db621564Steve Block        && static_cast<QKeyEvent*>(event)->key() == Qt::Key_F
287d0825bca7fe65beaee391d30da42e937db621564Steve Block        && static_cast<QKeyEvent*>(event)->modifiers() == Qt::ControlModifier) {
288d0825bca7fe65beaee391d30da42e937db621564Steve Block
289d0825bca7fe65beaee391d30da42e937db621564Steve Block        // If the keyboard point is already pressed, release it.
290d0825bca7fe65beaee391d30da42e937db621564Steve Block        // Otherwise create it and append to touchPoints.
291d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (touchPoints.size() > 0 && touchPoints[0].id() == 1) {
292d0825bca7fe65beaee391d30da42e937db621564Steve Block            touchPoints[0].setState(Qt::TouchPointReleased);
293d0825bca7fe65beaee391d30da42e937db621564Steve Block            sendTouchEvent();
294d0825bca7fe65beaee391d30da42e937db621564Steve Block        } else if (touchPoints.size() > 1 && touchPoints[1].id() == 1) {
295d0825bca7fe65beaee391d30da42e937db621564Steve Block            touchPoints[1].setState(Qt::TouchPointReleased);
296d0825bca7fe65beaee391d30da42e937db621564Steve Block            sendTouchEvent();
297d0825bca7fe65beaee391d30da42e937db621564Steve Block        } else {
298d0825bca7fe65beaee391d30da42e937db621564Steve Block            QTouchEvent::TouchPoint touchPoint;
299d0825bca7fe65beaee391d30da42e937db621564Steve Block            touchPoint.setState(Qt::TouchPointPressed);
300d0825bca7fe65beaee391d30da42e937db621564Steve Block            touchPoint.setId(1);
301d0825bca7fe65beaee391d30da42e937db621564Steve Block            touchPoint.setScreenPos(QCursor::pos());
3028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            touchPoint.setPos(m_view->mapFromGlobal(QCursor::pos()));
303d0825bca7fe65beaee391d30da42e937db621564Steve Block            touchPoint.setPressure(1);
304d0825bca7fe65beaee391d30da42e937db621564Steve Block            touchPoints.append(touchPoint);
305d0825bca7fe65beaee391d30da42e937db621564Steve Block            sendTouchEvent();
306d0825bca7fe65beaee391d30da42e937db621564Steve Block
307d0825bca7fe65beaee391d30da42e937db621564Steve Block            // After sending the event, change the touchpoint state to stationary
308d0825bca7fe65beaee391d30da42e937db621564Steve Block            touchPoints.last().setState(Qt::TouchPointStationary);
309d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
310d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
311d0825bca7fe65beaee391d30da42e937db621564Steve Block    return false;
312d0825bca7fe65beaee391d30da42e937db621564Steve Block}
313d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif // QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
314d0825bca7fe65beaee391d30da42e937db621564Steve Block
315d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::loadStarted()
316d0825bca7fe65beaee391d30da42e937db621564Steve Block{
3178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    m_view->setFocus(Qt::OtherFocusReason);
318d0825bca7fe65beaee391d30da42e937db621564Steve Block}
319d0825bca7fe65beaee391d30da42e937db621564Steve Block
320d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::loadFinished()
321d0825bca7fe65beaee391d30da42e937db621564Steve Block{
322d0825bca7fe65beaee391d30da42e937db621564Steve Block    QUrl url = page()->mainFrame()->url();
323d0825bca7fe65beaee391d30da42e937db621564Steve Block    setAddressUrl(url.toString());
324d0825bca7fe65beaee391d30da42e937db621564Steve Block    addCompleterEntry(url);
325d0825bca7fe65beaee391d30da42e937db621564Steve Block}
326d0825bca7fe65beaee391d30da42e937db621564Steve Block
327d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::showLinkHover(const QString &link, const QString &toolTip)
328d0825bca7fe65beaee391d30da42e937db621564Steve Block{
329d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifndef Q_WS_MAEMO_5
330d0825bca7fe65beaee391d30da42e937db621564Steve Block    statusBar()->showMessage(link);
331d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
332d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifndef QT_NO_TOOLTIP
333d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!toolTip.isEmpty())
334d0825bca7fe65beaee391d30da42e937db621564Steve Block        QToolTip::showText(QCursor::pos(), toolTip);
335d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
336d0825bca7fe65beaee391d30da42e937db621564Steve Block}
337d0825bca7fe65beaee391d30da42e937db621564Steve Block
338d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::zoomIn()
339d0825bca7fe65beaee391d30da42e937db621564Steve Block{
340d0825bca7fe65beaee391d30da42e937db621564Steve Block    int i = zoomLevels.indexOf(currentZoom);
341d0825bca7fe65beaee391d30da42e937db621564Steve Block    Q_ASSERT(i >= 0);
342d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (i < zoomLevels.count() - 1)
343d0825bca7fe65beaee391d30da42e937db621564Steve Block        currentZoom = zoomLevels[i + 1];
344d0825bca7fe65beaee391d30da42e937db621564Steve Block
345d0825bca7fe65beaee391d30da42e937db621564Steve Block    page()->mainFrame()->setZoomFactor(qreal(currentZoom) / 100.0);
346d0825bca7fe65beaee391d30da42e937db621564Steve Block}
347d0825bca7fe65beaee391d30da42e937db621564Steve Block
348d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::zoomOut()
349d0825bca7fe65beaee391d30da42e937db621564Steve Block{
350d0825bca7fe65beaee391d30da42e937db621564Steve Block    int i = zoomLevels.indexOf(currentZoom);
351d0825bca7fe65beaee391d30da42e937db621564Steve Block    Q_ASSERT(i >= 0);
352d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (i > 0)
353d0825bca7fe65beaee391d30da42e937db621564Steve Block        currentZoom = zoomLevels[i - 1];
354d0825bca7fe65beaee391d30da42e937db621564Steve Block
355d0825bca7fe65beaee391d30da42e937db621564Steve Block    page()->mainFrame()->setZoomFactor(qreal(currentZoom) / 100.0);
356d0825bca7fe65beaee391d30da42e937db621564Steve Block}
357d0825bca7fe65beaee391d30da42e937db621564Steve Block
358d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::resetZoom()
359d0825bca7fe65beaee391d30da42e937db621564Steve Block{
360d0825bca7fe65beaee391d30da42e937db621564Steve Block   currentZoom = 100;
361d0825bca7fe65beaee391d30da42e937db621564Steve Block   page()->mainFrame()->setZoomFactor(1.0);
362d0825bca7fe65beaee391d30da42e937db621564Steve Block}
363d0825bca7fe65beaee391d30da42e937db621564Steve Block
364d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::toggleZoomTextOnly(bool b)
365d0825bca7fe65beaee391d30da42e937db621564Steve Block{
366d0825bca7fe65beaee391d30da42e937db621564Steve Block    page()->settings()->setAttribute(QWebSettings::ZoomTextOnly, b);
367d0825bca7fe65beaee391d30da42e937db621564Steve Block}
368d0825bca7fe65beaee391d30da42e937db621564Steve Block
369d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::print()
370d0825bca7fe65beaee391d30da42e937db621564Steve Block{
371d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !defined(QT_NO_PRINTER)
372d0825bca7fe65beaee391d30da42e937db621564Steve Block    QPrintPreviewDialog dlg(this);
373d0825bca7fe65beaee391d30da42e937db621564Steve Block    connect(&dlg, SIGNAL(paintRequested(QPrinter*)),
3748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            m_view, SLOT(print(QPrinter*)));
375d0825bca7fe65beaee391d30da42e937db621564Steve Block    dlg.exec();
376d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
377d0825bca7fe65beaee391d30da42e937db621564Steve Block}
378d0825bca7fe65beaee391d30da42e937db621564Steve Block
379d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::screenshot()
380d0825bca7fe65beaee391d30da42e937db621564Steve Block{
3818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    QPixmap pixmap = QPixmap::grabWidget(m_view);
382d0825bca7fe65beaee391d30da42e937db621564Steve Block    QLabel* label = new QLabel;
383d0825bca7fe65beaee391d30da42e937db621564Steve Block    label->setAttribute(Qt::WA_DeleteOnClose);
384d0825bca7fe65beaee391d30da42e937db621564Steve Block    label->setWindowTitle("Screenshot - Preview");
385d0825bca7fe65beaee391d30da42e937db621564Steve Block    label->setPixmap(pixmap);
386d0825bca7fe65beaee391d30da42e937db621564Steve Block    label->show();
387d0825bca7fe65beaee391d30da42e937db621564Steve Block
388d0825bca7fe65beaee391d30da42e937db621564Steve Block    QString fileName = QFileDialog::getSaveFileName(label, "Screenshot");
389d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!fileName.isEmpty()) {
390d0825bca7fe65beaee391d30da42e937db621564Steve Block        pixmap.save(fileName, "png");
391d0825bca7fe65beaee391d30da42e937db621564Steve Block        label->setWindowTitle(QString("Screenshot - Saved at %1").arg(fileName));
392d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
393d0825bca7fe65beaee391d30da42e937db621564Steve Block}
394d0825bca7fe65beaee391d30da42e937db621564Steve Block
395d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::setEditable(bool on)
396d0825bca7fe65beaee391d30da42e937db621564Steve Block{
3978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    page()->setContentEditable(on);
398d0825bca7fe65beaee391d30da42e937db621564Steve Block    formatMenuAction->setVisible(on);
399d0825bca7fe65beaee391d30da42e937db621564Steve Block}
400d0825bca7fe65beaee391d30da42e937db621564Steve Block
401d0825bca7fe65beaee391d30da42e937db621564Steve Block/*
402d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::dumpPlugins() {
403d0825bca7fe65beaee391d30da42e937db621564Steve Block    QList<QWebPluginInfo> plugins = QWebSettings::pluginDatabase()->plugins();
404d0825bca7fe65beaee391d30da42e937db621564Steve Block    foreach (const QWebPluginInfo plugin, plugins) {
405d0825bca7fe65beaee391d30da42e937db621564Steve Block        qDebug() << "Plugin:" << plugin.name();
406d0825bca7fe65beaee391d30da42e937db621564Steve Block        foreach (const QWebPluginInfo::MimeType mime, plugin.mimeTypes()) {
407d0825bca7fe65beaee391d30da42e937db621564Steve Block            qDebug() << "   " << mime.name;
408d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
409d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
410d0825bca7fe65beaee391d30da42e937db621564Steve Block}
411d0825bca7fe65beaee391d30da42e937db621564Steve Block*/
412d0825bca7fe65beaee391d30da42e937db621564Steve Block
413d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::dumpHtml()
414d0825bca7fe65beaee391d30da42e937db621564Steve Block{
415d0825bca7fe65beaee391d30da42e937db621564Steve Block    qDebug() << "HTML: " << page()->mainFrame()->toHtml();
416d0825bca7fe65beaee391d30da42e937db621564Steve Block}
417d0825bca7fe65beaee391d30da42e937db621564Steve Block
418d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::selectElements()
419d0825bca7fe65beaee391d30da42e937db621564Steve Block{
420d0825bca7fe65beaee391d30da42e937db621564Steve Block    bool ok;
421d0825bca7fe65beaee391d30da42e937db621564Steve Block    QString str = QInputDialog::getText(this, "Select elements", "Choose elements",
422d0825bca7fe65beaee391d30da42e937db621564Steve Block                                        QLineEdit::Normal, "a", &ok);
423d0825bca7fe65beaee391d30da42e937db621564Steve Block
424d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (ok && !str.isEmpty()) {
425d0825bca7fe65beaee391d30da42e937db621564Steve Block        QWebElementCollection result =  page()->mainFrame()->findAllElements(str);
426d0825bca7fe65beaee391d30da42e937db621564Steve Block        foreach (QWebElement e, result)
427d0825bca7fe65beaee391d30da42e937db621564Steve Block            e.setStyleProperty("background-color", "yellow");
428d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifndef Q_WS_MAEMO_5
429d0825bca7fe65beaee391d30da42e937db621564Steve Block        statusBar()->showMessage(QString("%1 element(s) selected").arg(result.count()), 5000);
430d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
431d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
432d0825bca7fe65beaee391d30da42e937db621564Steve Block}
433d0825bca7fe65beaee391d30da42e937db621564Steve Block
434d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::setTouchMocking(bool on)
435d0825bca7fe65beaee391d30da42e937db621564Steve Block{
436d0825bca7fe65beaee391d30da42e937db621564Steve Block#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
437d0825bca7fe65beaee391d30da42e937db621564Steve Block    touchMocking = on;
438d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
439d0825bca7fe65beaee391d30da42e937db621564Steve Block}
440d0825bca7fe65beaee391d30da42e937db621564Steve Block
4418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockvoid LauncherWindow::toggleAcceleratedCompositing(bool toggle)
4428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
4438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    page()->settings()->setAttribute(QWebSettings::AcceleratedCompositingEnabled, toggle);
4448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block}
4458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockvoid LauncherWindow::initializeView(bool useGraphicsView)
4478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
4488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    delete m_view;
4498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    QSplitter* splitter = static_cast<QSplitter*>(centralWidget());
4518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!useGraphicsView) {
4538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        WebViewTraditional* view = new WebViewTraditional(splitter);
4548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        view->setPage(page());
4558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        m_view = view;
4568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    } else {
4578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        WebViewGraphicsBased* view = new WebViewGraphicsBased(splitter);
4588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        view->setPage(page());
4598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        view->setViewportUpdateMode(gViewportUpdateMode);
4608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        view->setItemCacheMode(gCacheWebView ? QGraphicsItem::DeviceCoordinateCache : QGraphicsItem::NoCache);
4618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (gShowFrameRate)
4628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            view->enableFrameRateMeasurement();
4638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        page()->settings()->setAttribute(QWebSettings::AcceleratedCompositingEnabled, gUseCompositing);
4648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        m_view = view;
4658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
4668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
4688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    m_view->installEventFilter(this);
4698a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    touchMocking = false;
4708a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#endif
4718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block}
4728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
473d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::newWindow(const QString& url)
474d0825bca7fe65beaee391d30da42e937db621564Steve Block{
475d0825bca7fe65beaee391d30da42e937db621564Steve Block    LauncherWindow* mw = new LauncherWindow(url);
476d0825bca7fe65beaee391d30da42e937db621564Steve Block    mw->show();
477d0825bca7fe65beaee391d30da42e937db621564Steve Block}
478d0825bca7fe65beaee391d30da42e937db621564Steve Block
479d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LauncherWindow::setupUI()
480d0825bca7fe65beaee391d30da42e937db621564Steve Block{
481d0825bca7fe65beaee391d30da42e937db621564Steve Block    QMenu* fileMenu = menuBar()->addMenu("&File");
482d0825bca7fe65beaee391d30da42e937db621564Steve Block    fileMenu->addAction("New Window", this, SLOT(newWindow()), QKeySequence::New);
483d0825bca7fe65beaee391d30da42e937db621564Steve Block    fileMenu->addAction(tr("Open File..."), this, SLOT(openFile()), QKeySequence::Open);
484d0825bca7fe65beaee391d30da42e937db621564Steve Block    fileMenu->addAction("Close Window", this, SLOT(close()), QKeySequence::Close);
485d0825bca7fe65beaee391d30da42e937db621564Steve Block    fileMenu->addSeparator();
486d0825bca7fe65beaee391d30da42e937db621564Steve Block    fileMenu->addAction("Take Screen Shot...", this, SLOT(screenshot()));
487d0825bca7fe65beaee391d30da42e937db621564Steve Block    fileMenu->addAction(tr("Print..."), this, SLOT(print()), QKeySequence::Print);
488d0825bca7fe65beaee391d30da42e937db621564Steve Block    fileMenu->addSeparator();
489d0825bca7fe65beaee391d30da42e937db621564Steve Block    fileMenu->addAction("Quit", QApplication::instance(), SLOT(closeAllWindows()), QKeySequence(Qt::CTRL | Qt::Key_Q));
490d0825bca7fe65beaee391d30da42e937db621564Steve Block
491d0825bca7fe65beaee391d30da42e937db621564Steve Block    QMenu* editMenu = menuBar()->addMenu("&Edit");
492d0825bca7fe65beaee391d30da42e937db621564Steve Block    editMenu->addAction(page()->action(QWebPage::Undo));
493d0825bca7fe65beaee391d30da42e937db621564Steve Block    editMenu->addAction(page()->action(QWebPage::Redo));
494d0825bca7fe65beaee391d30da42e937db621564Steve Block    editMenu->addSeparator();
495d0825bca7fe65beaee391d30da42e937db621564Steve Block    editMenu->addAction(page()->action(QWebPage::Cut));
496d0825bca7fe65beaee391d30da42e937db621564Steve Block    editMenu->addAction(page()->action(QWebPage::Copy));
497d0825bca7fe65beaee391d30da42e937db621564Steve Block    editMenu->addAction(page()->action(QWebPage::Paste));
498d0825bca7fe65beaee391d30da42e937db621564Steve Block    editMenu->addSeparator();
499d0825bca7fe65beaee391d30da42e937db621564Steve Block    QAction* setEditable = editMenu->addAction("Set Editable", this, SLOT(setEditable(bool)));
500d0825bca7fe65beaee391d30da42e937db621564Steve Block    setEditable->setCheckable(true);
501d0825bca7fe65beaee391d30da42e937db621564Steve Block
502d0825bca7fe65beaee391d30da42e937db621564Steve Block    QMenu* viewMenu = menuBar()->addMenu("&View");
5038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    viewMenu->addAction(page()->action(QWebPage::Stop));
5048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    viewMenu->addAction(page()->action(QWebPage::Reload));
505d0825bca7fe65beaee391d30da42e937db621564Steve Block    viewMenu->addSeparator();
506d0825bca7fe65beaee391d30da42e937db621564Steve Block    QAction* zoomIn = viewMenu->addAction("Zoom &In", this, SLOT(zoomIn()));
507d0825bca7fe65beaee391d30da42e937db621564Steve Block    QAction* zoomOut = viewMenu->addAction("Zoom &Out", this, SLOT(zoomOut()));
508d0825bca7fe65beaee391d30da42e937db621564Steve Block    QAction* resetZoom = viewMenu->addAction("Reset Zoom", this, SLOT(resetZoom()));
509d0825bca7fe65beaee391d30da42e937db621564Steve Block    QAction* zoomTextOnly = viewMenu->addAction("Zoom Text Only", this, SLOT(toggleZoomTextOnly(bool)));
510d0825bca7fe65beaee391d30da42e937db621564Steve Block    zoomTextOnly->setCheckable(true);
511d0825bca7fe65beaee391d30da42e937db621564Steve Block    zoomTextOnly->setChecked(false);
512d0825bca7fe65beaee391d30da42e937db621564Steve Block    viewMenu->addSeparator();
513d0825bca7fe65beaee391d30da42e937db621564Steve Block    viewMenu->addAction("Dump HTML", this, SLOT(dumpHtml()));
514d0825bca7fe65beaee391d30da42e937db621564Steve Block    // viewMenu->addAction("Dump plugins", this, SLOT(dumpPlugins()));
515d0825bca7fe65beaee391d30da42e937db621564Steve Block
516d0825bca7fe65beaee391d30da42e937db621564Steve Block    QMenu* formatMenu = new QMenu("F&ormat", this);
517d0825bca7fe65beaee391d30da42e937db621564Steve Block    formatMenuAction = menuBar()->addMenu(formatMenu);
518d0825bca7fe65beaee391d30da42e937db621564Steve Block    formatMenuAction->setVisible(false);
519d0825bca7fe65beaee391d30da42e937db621564Steve Block    formatMenu->addAction(page()->action(QWebPage::ToggleBold));
520d0825bca7fe65beaee391d30da42e937db621564Steve Block    formatMenu->addAction(page()->action(QWebPage::ToggleItalic));
521d0825bca7fe65beaee391d30da42e937db621564Steve Block    formatMenu->addAction(page()->action(QWebPage::ToggleUnderline));
522d0825bca7fe65beaee391d30da42e937db621564Steve Block    QMenu* writingMenu = formatMenu->addMenu(tr("Writing Direction"));
523d0825bca7fe65beaee391d30da42e937db621564Steve Block    writingMenu->addAction(page()->action(QWebPage::SetTextDirectionDefault));
524d0825bca7fe65beaee391d30da42e937db621564Steve Block    writingMenu->addAction(page()->action(QWebPage::SetTextDirectionLeftToRight));
525d0825bca7fe65beaee391d30da42e937db621564Steve Block    writingMenu->addAction(page()->action(QWebPage::SetTextDirectionRightToLeft));
526d0825bca7fe65beaee391d30da42e937db621564Steve Block
527d0825bca7fe65beaee391d30da42e937db621564Steve Block    zoomIn->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Plus));
528d0825bca7fe65beaee391d30da42e937db621564Steve Block    zoomOut->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Minus));
529d0825bca7fe65beaee391d30da42e937db621564Steve Block    resetZoom->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0));
530d0825bca7fe65beaee391d30da42e937db621564Steve Block
531d0825bca7fe65beaee391d30da42e937db621564Steve Block    QMenu* toolsMenu = menuBar()->addMenu("&Develop");
532d0825bca7fe65beaee391d30da42e937db621564Steve Block    toolsMenu->addAction("Select Elements...", this, SLOT(selectElements()));
533d0825bca7fe65beaee391d30da42e937db621564Steve Block    QAction* showInspectorAction = toolsMenu->addAction("Show Web Inspector", inspector, SLOT(setVisible(bool)), QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_I));
534d0825bca7fe65beaee391d30da42e937db621564Steve Block    showInspectorAction->setCheckable(true);
535d0825bca7fe65beaee391d30da42e937db621564Steve Block    showInspectorAction->connect(inspector, SIGNAL(visibleChanged(bool)), SLOT(setChecked(bool)));
536d0825bca7fe65beaee391d30da42e937db621564Steve Block
537d0825bca7fe65beaee391d30da42e937db621564Steve Block#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
538d0825bca7fe65beaee391d30da42e937db621564Steve Block    QAction* touchMockAction = toolsMenu->addAction("Toggle multitouch mocking", this, SLOT(setTouchMocking(bool)));
539d0825bca7fe65beaee391d30da42e937db621564Steve Block    touchMockAction->setCheckable(true);
540d0825bca7fe65beaee391d30da42e937db621564Steve Block    touchMockAction->setShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_T));
541d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
5428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
5438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    QAction* toggleAcceleratedCompositing = toolsMenu->addAction("Toggle Accelerated Compositing", this, SLOT(toggleAcceleratedCompositing(bool)));
5448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    toggleAcceleratedCompositing->setCheckable(true);
5458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    toggleAcceleratedCompositing->setChecked(false);
5468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
5478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    QAction* toggleGraphicsView = toolsMenu->addAction("Toggle use of QGraphicsView", this, SLOT(initializeView(bool)));
5488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    toggleGraphicsView->setCheckable(true);
5498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    toggleGraphicsView->setChecked(false);
550d0825bca7fe65beaee391d30da42e937db621564Steve Block}
551d0825bca7fe65beaee391d30da42e937db621564Steve Block
5528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockQWebPage* WebPage::createWindow(QWebPage::WebWindowType type)
553d0825bca7fe65beaee391d30da42e937db621564Steve Block{
554d0825bca7fe65beaee391d30da42e937db621564Steve Block    LauncherWindow* mw = new LauncherWindow;
5558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (type == WebModalDialog)
5568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        mw->setWindowModality(Qt::ApplicationModal);
557d0825bca7fe65beaee391d30da42e937db621564Steve Block    mw->show();
558d0825bca7fe65beaee391d30da42e937db621564Steve Block    return mw->page();
559d0825bca7fe65beaee391d30da42e937db621564Steve Block}
560d0825bca7fe65beaee391d30da42e937db621564Steve Block
561d0825bca7fe65beaee391d30da42e937db621564Steve BlockQObject* WebPage::createPlugin(const QString &classId, const QUrl&, const QStringList&, const QStringList&)
562d0825bca7fe65beaee391d30da42e937db621564Steve Block{
563d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (classId == "alien_QLabel") {
564d0825bca7fe65beaee391d30da42e937db621564Steve Block        QLabel* l = new QLabel;
565d0825bca7fe65beaee391d30da42e937db621564Steve Block        l->winId();
566d0825bca7fe65beaee391d30da42e937db621564Steve Block        return l;
567d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
568d0825bca7fe65beaee391d30da42e937db621564Steve Block
569d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifndef QT_NO_UITOOLS
570d0825bca7fe65beaee391d30da42e937db621564Steve Block    QUiLoader loader;
571d0825bca7fe65beaee391d30da42e937db621564Steve Block    return loader.createWidget(classId, view());
572d0825bca7fe65beaee391d30da42e937db621564Steve Block#else
573d0825bca7fe65beaee391d30da42e937db621564Steve Block    Q_UNUSED(classId);
574d0825bca7fe65beaee391d30da42e937db621564Steve Block    return 0;
575d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
576d0825bca7fe65beaee391d30da42e937db621564Steve Block}
577d0825bca7fe65beaee391d30da42e937db621564Steve Block
578d0825bca7fe65beaee391d30da42e937db621564Steve Block
579d0825bca7fe65beaee391d30da42e937db621564Steve Blockint launcherMain(const QApplication& app)
580d0825bca7fe65beaee391d30da42e937db621564Steve Block{
581d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifndef NDEBUG
582d0825bca7fe65beaee391d30da42e937db621564Steve Block    int retVal = app.exec();
583d0825bca7fe65beaee391d30da42e937db621564Steve Block    qt_drt_garbageCollector_collect();
584d0825bca7fe65beaee391d30da42e937db621564Steve Block    QWebSettings::clearMemoryCaches();
585d0825bca7fe65beaee391d30da42e937db621564Steve Block    return retVal;
586d0825bca7fe65beaee391d30da42e937db621564Steve Block#else
587d0825bca7fe65beaee391d30da42e937db621564Steve Block    return app.exec();
588d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
589d0825bca7fe65beaee391d30da42e937db621564Steve Block}
590d0825bca7fe65beaee391d30da42e937db621564Steve Block
5915e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockclass LauncherApplication : public QApplication {
5925e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    Q_OBJECT
593d0825bca7fe65beaee391d30da42e937db621564Steve Block
5945e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockpublic:
5955e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    LauncherApplication(int& argc, char** argv);
5965e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QStringList urls() const { return m_urls; }
5975e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    bool isRobotized() const { return m_isRobotized; }
5985e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
5995e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockprivate:
6005e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    void handleUserOptions();
6015e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    void applyDefaultSettings();
602d0825bca7fe65beaee391d30da42e937db621564Steve Block
6035e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockprivate:
6045e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    bool m_isRobotized;
6055e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QStringList m_urls;
6065e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block};
6075e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
6085e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid LauncherApplication::applyDefaultSettings()
6095e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
6105e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QWebSettings::setMaximumPagesInCache(4);
611d0825bca7fe65beaee391d30da42e937db621564Steve Block
612d0825bca7fe65beaee391d30da42e937db621564Steve Block    QWebSettings::setObjectCacheCapacities((16*1024*1024) / 8, (16*1024*1024) / 8, 16*1024*1024);
613d0825bca7fe65beaee391d30da42e937db621564Steve Block
614d0825bca7fe65beaee391d30da42e937db621564Steve Block    QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true);
615d0825bca7fe65beaee391d30da42e937db621564Steve Block    QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
616d0825bca7fe65beaee391d30da42e937db621564Steve Block    QWebSettings::enablePersistentStorage();
6175e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
618d0825bca7fe65beaee391d30da42e937db621564Steve Block
6195e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockLauncherApplication::LauncherApplication(int& argc, char** argv)
6205e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    : QApplication(argc, argv)
6215e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    , m_isRobotized(false)
6225e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
623d0825bca7fe65beaee391d30da42e937db621564Steve Block    // To allow QWebInspector's configuration persistence
6245e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    setOrganizationName("Nokia");
6255e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    setApplicationName("QtLauncher");
6265e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    setApplicationVersion("0.1");
627d0825bca7fe65beaee391d30da42e937db621564Steve Block
6285e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    applyDefaultSettings();
629d0825bca7fe65beaee391d30da42e937db621564Steve Block
6305e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    handleUserOptions();
6315e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
6325e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
6338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockstatic void requiresGraphicsView(const QString& option)
6345e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
6358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (gUseGraphicsView)
6368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return;
6378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    appQuit(1, QString("%1 only works in combination with the -graphicsbased option").arg(option));
6385e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
6395e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
6405e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid LauncherApplication::handleUserOptions()
6415e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
6425e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QStringList args = arguments();
6435e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QFileInfo program(args.at(0));
6445e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QString programName("QtLauncher");
6455e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (program.exists())
6465e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        programName = program.baseName();
6475e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
6485e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QList<QString> updateModes(enumToKeys(QGraphicsView::staticMetaObject,
6495e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block            "ViewportUpdateMode", "ViewportUpdate"));
6505e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
6518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (args.contains("-help")) {
6525e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        qDebug() << "Usage:" << programName.toLatin1().data()
6538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block             << "[-graphicsbased]"
6548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block             << "[-compositing]"
6558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block             << QString("[-viewport-update-mode %1]").arg(formatKeys(updateModes)).toLatin1().data()
6568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block             << "[-cache-webview]"
6578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block             << "[-show-fps]"
6585e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block             << "[-r list]"
6595e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block             << "URLs";
6608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        appQuit(0);
6615e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    }
6625e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
6638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (args.contains("-graphicsbased"))
6648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        gUseGraphicsView = true;
6655e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
6668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (args.contains("-compositing")) {
6678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        requiresGraphicsView("-compositing");
6688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        gUseCompositing = true;
6698a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
6705e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
6718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (args.contains("-show-fps")) {
6728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        requiresGraphicsView("-show-fps");
6738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        gShowFrameRate = true;
6748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
6755e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
6768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (args.contains("-cache-webview")) {
6778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        requiresGraphicsView("-cache-webview");
6788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        gCacheWebView = true;
6798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
6805e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
6818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    QString arg1("-viewport-update-mode");
6828a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    int modeIndex = args.indexOf(arg1);
6838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (modeIndex != -1) {
6848a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        requiresGraphicsView(arg1);
6858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
6868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        QString mode = takeOptionValue(&args, modeIndex);
6878a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (mode.isEmpty())
6888a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            appQuit(1, QString("%1 needs a value of one of [%2]").arg(arg1).arg(formatKeys(updateModes)));
6898a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        int idx = updateModes.indexOf(mode);
6908a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (idx == -1)
6918a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            appQuit(1, QString("%1 value has to be one of [%2]").arg(arg1).arg(formatKeys(updateModes)));
6928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
6938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        gViewportUpdateMode = static_cast<QGraphicsView::ViewportUpdateMode>(idx);
6945e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    }
6955e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
6965e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    int robotIndex = args.indexOf("-r");
6975e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (robotIndex != -1) {
6988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        QString listFile = takeOptionValue(&args, robotIndex);
6998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (listFile.isEmpty())
7008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            appQuit(1, "-r needs a list file to start in robotized mode");
7018a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (!QFile::exists(listFile))
7028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            appQuit(1, "The list file supplied to -r does not exist.");
7038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        m_isRobotized = true;
7058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        m_urls = QStringList(listFile);
7068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return;
7075e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    }
7085e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
7095e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    int lastArg = args.lastIndexOf(QRegExp("^-.*"));
7105e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    m_urls = (lastArg != -1) ? args.mid(++lastArg) : args.mid(1);
7115e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
7125e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
7135e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
7145e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockint main(int argc, char **argv)
7155e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
7165e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    LauncherApplication app(argc, argv);
7175e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
7185e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (app.isRobotized()) {
7198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        LauncherWindow* window = new LauncherWindow();
7208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        UrlLoader loader(window->page()->mainFrame(), app.urls().at(0));
7218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        QObject::connect(window->page()->mainFrame(), SIGNAL(loadFinished(bool)), &loader, SLOT(loadNext()));
722d0825bca7fe65beaee391d30da42e937db621564Steve Block        loader.loadNext();
723d0825bca7fe65beaee391d30da42e937db621564Steve Block        window->show();
7245e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        return launcherMain(app);
7255e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    }
726d0825bca7fe65beaee391d30da42e937db621564Steve Block
7275e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QStringList urls = app.urls();
728d0825bca7fe65beaee391d30da42e937db621564Steve Block
7295e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (urls.isEmpty()) {
7305e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        QString defaultUrl = QString("file://%1/%2").arg(QDir::homePath()).arg(QLatin1String("index.html"));
7315e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        if (QDir(defaultUrl).exists())
7325e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block            urls.append(defaultUrl);
7335e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        else
7345e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block            urls.append("");
7355e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    }
7365e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
7375e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    LauncherWindow* window = 0;
7385e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    foreach (QString url, urls) {
7395e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        if (!window)
7405e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block            window = new LauncherWindow(url);
7415e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        else
7425e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block            window->newWindow(url);
743d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
7445e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
7455e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    window->show();
7465e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    return launcherMain(app);
747d0825bca7fe65beaee391d30da42e937db621564Steve Block}
7485e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
7495e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "main.moc"
750