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