1e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke/*
2e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
3e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Copyright (C) 2010 University of Szeged
4e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
5e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * All rights reserved.
6e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
7e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Redistribution and use in source and binary forms, with or without
8e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * modification, are permitted provided that the following conditions
9e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * are met:
10e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * 1. Redistributions of source code must retain the above copyright
11e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *    notice, this list of conditions and the following disclaimer.
12e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * 2. Redistributions in binary form must reproduce the above copyright
13e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *    notice, this list of conditions and the following disclaimer in the
14e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *    documentation and/or other materials provided with the distribution.
15e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
16e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
17e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
20e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke */
28e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
29e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "BrowserWindow.h"
30e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "UrlLoader.h"
322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "qwkpreferences.h"
332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic QWKPage* newPageFunction(QWKPage* page)
35cad810f21b803229eb11403f9209855525a25d57Steve Block{
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    BrowserWindow* window = new BrowserWindow(page->context());
37cad810f21b803229eb11403f9209855525a25d57Steve Block    return window->page();
38cad810f21b803229eb11403f9209855525a25d57Steve Block}
39cad810f21b803229eb11403f9209855525a25d57Steve Block
402fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockQVector<qreal> BrowserWindow::m_zoomLevels;
41cad810f21b803229eb11403f9209855525a25d57Steve Block
422fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockBrowserWindow::BrowserWindow(QWKContext* context, WindowOptions* options)
432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : m_isZoomTextOnly(false)
442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_currentZoom(1)
452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_urlLoader(0)
462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_context(context)
47e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (options)
492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_windowOptions = *options;
502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else {
512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        WindowOptions tmpOptions;
522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_windowOptions = tmpOptions;
532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_windowOptions.useTiledBackingStore)
562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_browser = new BrowserView(QGraphicsWKView::Tiled, context);
572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else
582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_browser = new BrowserView(QGraphicsWKView::Simple, context);
59e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    setAttribute(Qt::WA_DeleteOnClose);
616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    connect(m_browser->view(), SIGNAL(loadProgress(int)), SLOT(loadProgress(int)));
632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    connect(m_browser->view(), SIGNAL(titleChanged(const QString&)), SLOT(setWindowTitle(const QString&)));
642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    connect(m_browser->view(), SIGNAL(urlChanged(const QUrl&)), SLOT(urlChanged(const QUrl&)));
65e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
662bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_windowOptions.printLoadedUrls)
672bde8e466a4451c7319e3a072d118917957d6554Steve Block        connect(page(), SIGNAL(urlChanged(QUrl)), this, SLOT(printURL(QUrl)));
682bde8e466a4451c7319e3a072d118917957d6554Steve Block
692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    this->setCentralWidget(m_browser);
70e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    m_browser->setFocus(Qt::OtherFocusReason);
71e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QMenu* fileMenu = menuBar()->addMenu("&File");
732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    fileMenu->addAction("New Window", this, SLOT(newWindow()), QKeySequence::New);
742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    fileMenu->addAction("Open File", this, SLOT(openFile()), QKeySequence::Open);
752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    fileMenu->addSeparator();
762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    fileMenu->addAction("Quit", this, SLOT(close()));
772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QMenu* viewMenu = menuBar()->addMenu("&View");
792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    viewMenu->addAction(page()->action(QWKPage::Stop));
802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    viewMenu->addAction(page()->action(QWKPage::Reload));
812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    viewMenu->addSeparator();
822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QAction* zoomIn = viewMenu->addAction("Zoom &In", this, SLOT(zoomIn()));
832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QAction* zoomOut = viewMenu->addAction("Zoom &Out", this, SLOT(zoomOut()));
842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QAction* resetZoom = viewMenu->addAction("Reset Zoom", this, SLOT(resetZoom()));
852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QAction* zoomText = viewMenu->addAction("Zoom Text Only", this, SLOT(toggleZoomTextOnly(bool)));
862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    zoomText->setCheckable(true);
872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    zoomText->setChecked(false);
882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    viewMenu->addSeparator();
892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    viewMenu->addAction("Take Screen Shot...", this, SLOT(screenshot()));
902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    zoomIn->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Plus));
922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    zoomOut->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Minus));
932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    resetZoom->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0));
942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QMenu* windowMenu = menuBar()->addMenu("&Window");
962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QAction* toggleFullScreen = windowMenu->addAction("Toggle FullScreen", this, SIGNAL(enteredFullScreenMode(bool)));
972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    toggleFullScreen->setShortcut(Qt::Key_F11);
982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    toggleFullScreen->setCheckable(true);
992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    toggleFullScreen->setChecked(false);
1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // When exit fullscreen mode by clicking on the exit area (bottom right corner) we must
1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // uncheck the Toggle FullScreen action.
1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    toggleFullScreen->connect(this, SIGNAL(enteredFullScreenMode(bool)), SLOT(setChecked(bool)));
1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    connect(this, SIGNAL(enteredFullScreenMode(bool)), this, SLOT(toggleFullScreenMode(bool)));
1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QMenu* toolsMenu = menuBar()->addMenu("&Develop");
1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QAction* toggleFrameFlattening = toolsMenu->addAction("Toggle Frame Flattening", this, SLOT(toggleFrameFlattening(bool)));
1072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    toggleFrameFlattening->setCheckable(true);
1082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    toggleFrameFlattening->setChecked(false);
1092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    toolsMenu->addSeparator();
1102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    toolsMenu->addAction("Change User Agent", this, SLOT(showUserAgentDialog()));
1112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    toolsMenu->addSeparator();
1122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    toolsMenu->addAction("Load URLs from file", this, SLOT(loadURLListFromFile()));
1132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QMenu* settingsMenu = menuBar()->addMenu("&Settings");
1152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QAction* toggleAutoLoadImages = settingsMenu->addAction("Disable Auto Load Images", this, SLOT(toggleAutoLoadImages(bool)));
1162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    toggleAutoLoadImages->setCheckable(true);
1172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    toggleAutoLoadImages->setChecked(false);
1182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QAction* toggleDisableJavaScript = settingsMenu->addAction("Disable JavaScript", this, SLOT(toggleDisableJavaScript(bool)));
1192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    toggleDisableJavaScript->setCheckable(true);
1202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    toggleDisableJavaScript->setChecked(false);
1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_addressBar = new QLineEdit();
123e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    connect(m_addressBar, SIGNAL(returnPressed()), SLOT(changeLocation()));
124e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
125e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    QToolBar* bar = addToolBar("Navigation");
126cad810f21b803229eb11403f9209855525a25d57Steve Block    bar->addAction(page()->action(QWKPage::Back));
127cad810f21b803229eb11403f9209855525a25d57Steve Block    bar->addAction(page()->action(QWKPage::Forward));
128cad810f21b803229eb11403f9209855525a25d57Steve Block    bar->addAction(page()->action(QWKPage::Reload));
129cad810f21b803229eb11403f9209855525a25d57Steve Block    bar->addAction(page()->action(QWKPage::Stop));
130e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    bar->addWidget(m_addressBar);
131e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    QShortcut* selectAddressBar = new QShortcut(Qt::CTRL | Qt::Key_L, this);
1336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    connect(selectAddressBar, SIGNAL(activated()), this, SLOT(openLocation()));
1346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
135cad810f21b803229eb11403f9209855525a25d57Steve Block    page()->setCreateNewPageFunction(newPageFunction);
136cad810f21b803229eb11403f9209855525a25d57Steve Block
1372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // the zoom values are chosen to be like in Mozilla Firefox 3
1382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_zoomLevels.count()) {
1392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_zoomLevels << 0.3 << 0.5 << 0.67 << 0.8 << 0.9;
1402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_zoomLevels << 1;
1412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_zoomLevels << 1.1 << 1.2 << 1.33 << 1.5 << 1.7 << 2 << 2.4 << 3;
1422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_windowOptions.startMaximized)
1452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        setWindowState(windowState() | Qt::WindowMaximized);
1462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    else
1472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        resize(800, 600);
1485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    show();
149e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
150e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
151e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid BrowserWindow::load(const QString& url)
152e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
153e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    m_addressBar->setText(url);
1545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    m_browser->load(url);
155e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
156e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
157cad810f21b803229eb11403f9209855525a25d57Steve BlockQWKPage* BrowserWindow::page()
158cad810f21b803229eb11403f9209855525a25d57Steve Block{
159cad810f21b803229eb11403f9209855525a25d57Steve Block    return m_browser->view()->page();
160cad810f21b803229eb11403f9209855525a25d57Steve Block}
161cad810f21b803229eb11403f9209855525a25d57Steve Block
1625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenBrowserWindow* BrowserWindow::newWindow(const QString& url)
1635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
1642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    BrowserWindow* window;
1652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_windowOptions.useSeparateWebProcessPerWindow) {
1662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        QWKContext* context = new QWKContext();
1672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        window = new BrowserWindow(context);
1682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        context->setParent(window);
1692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    } else
1702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        window = new BrowserWindow(m_context);
1712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    window->load(url);
1735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return window;
1745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
1755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid BrowserWindow::openLocation()
1776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
1786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_addressBar->selectAll();
1796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_addressBar->setFocus();
1806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
1816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
182e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid BrowserWindow::changeLocation()
183e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
184e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    QString string = m_addressBar->text();
185e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    m_browser->load(string);
186e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
187e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
188967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid BrowserWindow::loadProgress(int progress)
189967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
190967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    QColor backgroundColor = QApplication::palette().color(QPalette::Base);
191967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    QColor progressColor = QColor(120, 180, 240);
192967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    QPalette pallete = m_addressBar->palette();
193967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
194967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (progress <= 0 || progress >= 100)
195967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        pallete.setBrush(QPalette::Base, backgroundColor);
196967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    else {
197967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        QLinearGradient gradient(0, 0, width(), 0);
198967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        gradient.setColorAt(0, progressColor);
199967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        gradient.setColorAt(((double) progress) / 100, progressColor);
200967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        if (progress != 100)
201967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            gradient.setColorAt((double) progress / 100 + 0.001, backgroundColor);
202967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        pallete.setBrush(QPalette::Base, gradient);
203967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
204967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    m_addressBar->setPalette(pallete);
205967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
206967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
207967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid BrowserWindow::urlChanged(const QUrl& url)
208967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
209967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    m_addressBar->setText(url.toString());
21081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_browser->setFocus();
21181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_browser->view()->setFocus();
212967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
213967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
2142fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid BrowserWindow::openFile()
2156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
2162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#ifndef QT_NO_FILEDIALOG
2172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const QString filter("HTML Files (*.htm *.html *.xhtml);;Text Files (*.txt);;Image Files (*.gif *.jpg *.png);;SVG Files (*.svg);;All Files (*)");
2182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QFileDialog fileDialog(this, tr("Open"), QString(), filter);
2202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
2212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    fileDialog.setFileMode(QFileDialog::ExistingFile);
2222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    fileDialog.setOptions(QFileDialog::ReadOnly);
2232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (fileDialog.exec()) {
2252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        QString selectedFile = fileDialog.selectedFiles()[0];
2262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (!selectedFile.isEmpty())
2272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            load(selectedFile);
2282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
2292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
2302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
2322fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid BrowserWindow::screenshot()
2332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QPixmap pixmap = QPixmap::grabWidget(m_browser);
2352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QLabel* label = 0;
2362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if !defined(Q_OS_SYMBIAN)
2372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    label = new QLabel;
2382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    label->setAttribute(Qt::WA_DeleteOnClose);
2392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    label->setWindowTitle("Screenshot - Preview");
2402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    label->setPixmap(pixmap);
2412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    label->show();
2422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
2432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#ifndef QT_NO_FILEDIALOG
2452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QString fileName = QFileDialog::getSaveFileName(label, "Screenshot", QString(), QString("PNG File (.png)"));
2462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!fileName.isEmpty()) {
2472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        QRegExp rx("*.png");
2482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        rx.setCaseSensitivity(Qt::CaseInsensitive);
2492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        rx.setPatternSyntax(QRegExp::Wildcard);
2502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (!rx.exactMatch(fileName))
2522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            fileName += ".png";
2532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        pixmap.save(fileName, "png");
2552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (label)
2562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            label->setWindowTitle(QString("Screenshot - Saved at %1").arg(fileName));
2576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
2582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
2592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
2612fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid BrowserWindow::zoomIn()
2622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_isZoomTextOnly)
2642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_currentZoom = page()->textZoomFactor();
2652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else
2662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_currentZoom = page()->pageZoomFactor();
2672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int i = m_zoomLevels.indexOf(m_currentZoom);
2692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Q_ASSERT(i >= 0);
2702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (i < m_zoomLevels.count() - 1)
2712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_currentZoom = m_zoomLevels[i + 1];
2722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    applyZoom();
2746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
2756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
2762fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid BrowserWindow::zoomOut()
2772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_isZoomTextOnly)
2792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_currentZoom = page()->textZoomFactor();
2802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else
2812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_currentZoom = page()->pageZoomFactor();
2822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int i = m_zoomLevels.indexOf(m_currentZoom);
2842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Q_ASSERT(i >= 0);
2852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (i > 0)
2862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_currentZoom = m_zoomLevels[i - 1];
2872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    applyZoom();
2892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2912fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid BrowserWindow::resetZoom()
2922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_currentZoom = 1;
2942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    applyZoom();
2952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2972fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid BrowserWindow::toggleZoomTextOnly(bool b)
2982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_isZoomTextOnly = b;
3002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3022fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid BrowserWindow::toggleFullScreenMode(bool enable)
3032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool alreadyEnabled = windowState() & Qt::WindowFullScreen;
3052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (enable ^ alreadyEnabled)
3062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        setWindowState(windowState() ^ Qt::WindowFullScreen);
3072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3092fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid BrowserWindow::toggleFrameFlattening(bool toggle)
3102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    page()->preferences()->setAttribute(QWKPreferences::FrameFlatteningEnabled, toggle);
3122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid BrowserWindow::showUserAgentDialog()
3166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
3176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    updateUserAgentList();
3186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
3196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    QDialog dialog(this);
3206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    dialog.setWindowTitle("Change User Agent");
3216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    dialog.resize(size().width() * 0.7, dialog.size().height());
3226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    QVBoxLayout* layout = new QVBoxLayout(&dialog);
3236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    dialog.setLayout(layout);
3246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
3256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    QComboBox* combo = new QComboBox(&dialog);
3266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    combo->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength);
3276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    combo->setEditable(true);
3286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    combo->insertItems(0, m_userAgentList);
3296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    layout->addWidget(combo);
3306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
331cad810f21b803229eb11403f9209855525a25d57Steve Block    int index = combo->findText(page()->customUserAgent());
3326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    combo->setCurrentIndex(index);
3336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
3346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel
3356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                                      , Qt::Horizontal, &dialog);
3366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    connect(buttonBox, SIGNAL(accepted()), &dialog, SLOT(accept()));
3376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    connect(buttonBox, SIGNAL(rejected()), &dialog, SLOT(reject()));
3386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    layout->addWidget(buttonBox);
3396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
3406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (dialog.exec() && !combo->currentText().isEmpty())
341cad810f21b803229eb11403f9209855525a25d57Steve Block        page()->setCustomUserAgent(combo->currentText());
3426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
3436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
3442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid BrowserWindow::loadURLListFromFile()
3452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QString selectedFile;
3472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#ifndef QT_NO_FILEDIALOG
3482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    selectedFile = QFileDialog::getOpenFileName(this, tr("Load URL list from file")
3492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                                                       , QString(), tr("Text Files (*.txt);;All Files (*)"));
3502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
3512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (selectedFile.isEmpty())
3522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch       return;
3532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_urlLoader = new UrlLoader(this, selectedFile, 0, 0);
3552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_urlLoader->loadNext();
3562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3582bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid BrowserWindow::printURL(const QUrl& url)
3592bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3602bde8e466a4451c7319e3a072d118917957d6554Steve Block    QTextStream output(stdout);
3612bde8e466a4451c7319e3a072d118917957d6554Steve Block    output << "Loaded: " << url.toString() << endl;
3622bde8e466a4451c7319e3a072d118917957d6554Steve Block}
3632bde8e466a4451c7319e3a072d118917957d6554Steve Block
3642fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid BrowserWindow::toggleDisableJavaScript(bool enable)
3652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    page()->preferences()->setAttribute(QWKPreferences::JavascriptEnabled, !enable);
3672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3692fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid BrowserWindow::toggleAutoLoadImages(bool enable)
3702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    page()->preferences()->setAttribute(QWKPreferences::AutoLoadImages, !enable);
3722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3742fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid BrowserWindow::updateUserAgentList()
3752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QFile file(":/useragentlist.txt");
3772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (file.open(QIODevice::ReadOnly)) {
3792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        while (!file.atEnd()) {
3802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            QString agent = file.readLine().trimmed();
3812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!m_userAgentList.contains(agent))
3822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                m_userAgentList << agent;
3832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
3842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        file.close();
3852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
3862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Q_ASSERT(!m_userAgentList.isEmpty());
3882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QWKPage* wkPage = page();
3892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!(wkPage->customUserAgent().isEmpty() || m_userAgentList.contains(wkPage->customUserAgent())))
3902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_userAgentList << wkPage->customUserAgent();
3912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3932fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid BrowserWindow::applyZoom()
3942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_isZoomTextOnly)
3962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        page()->setTextZoomFactor(m_currentZoom);
3972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else
3982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        page()->setPageZoomFactor(m_currentZoom);
3992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
401e458d70a0d18538346f41b503114c9ebe6b2ce12Leon ClarkeBrowserWindow::~BrowserWindow()
402e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
4032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    delete m_urlLoader;
404e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    delete m_addressBar;
405e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    delete m_browser;
406e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
407