mainwindow.cpp revision 65f03d4f644ce73618e5f4f50dd694b26f55ae12
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 "mainwindow.h" 34d0825bca7fe65beaee391d30da42e937db621564Steve Block 35d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "locationedit.h" 36d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "utils.h" 37d0825bca7fe65beaee391d30da42e937db621564Steve Block 3868513a70bcd92384395513322f1b801e7bf9c729Steve BlockMainWindow::MainWindow() 39d0825bca7fe65beaee391d30da42e937db621564Steve Block : m_page(new WebPage(this)) 4068513a70bcd92384395513322f1b801e7bf9c729Steve Block , m_toolBar(0) 41a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch , urlEdit(0) 42d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 43d0825bca7fe65beaee391d30da42e937db621564Steve Block setAttribute(Qt::WA_DeleteOnClose); 44e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (qgetenv("QTTESTBROWSER_USE_ARGB_VISUALS").toInt() == 1) 45d0825bca7fe65beaee391d30da42e937db621564Steve Block setAttribute(Qt::WA_TranslucentBackground); 46d0825bca7fe65beaee391d30da42e937db621564Steve Block 47d0825bca7fe65beaee391d30da42e937db621564Steve Block buildUI(); 48d0825bca7fe65beaee391d30da42e937db621564Steve Block} 49d0825bca7fe65beaee391d30da42e937db621564Steve Block 50d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid MainWindow::buildUI() 51d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 52a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if defined(Q_OS_SYMBIAN) 53a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch delete urlEdit; 54a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif 5568513a70bcd92384395513322f1b801e7bf9c729Steve Block delete m_toolBar; 5668513a70bcd92384395513322f1b801e7bf9c729Steve Block 5768513a70bcd92384395513322f1b801e7bf9c729Steve Block m_toolBar = addToolBar("Navigation"); 58f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#if defined(Q_OS_SYMBIAN) 5968513a70bcd92384395513322f1b801e7bf9c729Steve Block m_toolBar->setIconSize(QSize(16, 16)); 608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#endif 61ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block QAction* reloadAction = page()->action(QWebPage::Reload); 62ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block connect(reloadAction, SIGNAL(triggered()), this, SLOT(changeLocation())); 63ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 6468513a70bcd92384395513322f1b801e7bf9c729Steve Block m_toolBar->addAction(page()->action(QWebPage::Back)); 6568513a70bcd92384395513322f1b801e7bf9c729Steve Block m_toolBar->addAction(page()->action(QWebPage::Forward)); 6668513a70bcd92384395513322f1b801e7bf9c729Steve Block m_toolBar->addAction(reloadAction); 6768513a70bcd92384395513322f1b801e7bf9c729Steve Block m_toolBar->addAction(page()->action(QWebPage::Stop)); 68d0825bca7fe65beaee391d30da42e937db621564Steve Block 6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef QT_NO_INPUTDIALOG 7068513a70bcd92384395513322f1b801e7bf9c729Steve Block urlEdit = new LocationEdit(m_toolBar); 71d0825bca7fe65beaee391d30da42e937db621564Steve Block urlEdit->setSizePolicy(QSizePolicy::Expanding, urlEdit->sizePolicy().verticalPolicy()); 72d0825bca7fe65beaee391d30da42e937db621564Steve Block connect(urlEdit, SIGNAL(returnPressed()), SLOT(changeLocation())); 7368513a70bcd92384395513322f1b801e7bf9c729Steve Block QCompleter* completer = new QCompleter(m_toolBar); 74d0825bca7fe65beaee391d30da42e937db621564Steve Block urlEdit->setCompleter(completer); 75d0825bca7fe65beaee391d30da42e937db621564Steve Block completer->setModel(&urlModel); 76f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#if defined(Q_OS_SYMBIAN) 778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block addToolBarBreak(); 788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block addToolBar("Location")->addWidget(urlEdit); 798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#else 8068513a70bcd92384395513322f1b801e7bf9c729Steve Block m_toolBar->addWidget(urlEdit); 818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#endif 82d0825bca7fe65beaee391d30da42e937db621564Steve Block 83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block connect(page()->mainFrame(), SIGNAL(urlChanged(QUrl)), this, SLOT(setAddressUrl(QUrl))); 84d0825bca7fe65beaee391d30da42e937db621564Steve Block connect(page(), SIGNAL(loadProgress(int)), urlEdit, SLOT(setProgress(int))); 8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch connect(page()->mainFrame(), SIGNAL(titleChanged(const QString&)), 8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch this, SLOT(setWindowTitle(const QString&))); 89d0825bca7fe65beaee391d30da42e937db621564Steve Block connect(page(), SIGNAL(windowCloseRequested()), this, SLOT(close())); 90d0825bca7fe65beaee391d30da42e937db621564Steve Block 9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef QT_NO_SHORTCUT 92d0825bca7fe65beaee391d30da42e937db621564Steve Block // short-cuts 93d0825bca7fe65beaee391d30da42e937db621564Steve Block page()->action(QWebPage::Back)->setShortcut(QKeySequence::Back); 94d0825bca7fe65beaee391d30da42e937db621564Steve Block page()->action(QWebPage::Stop)->setShortcut(Qt::Key_Escape); 95d0825bca7fe65beaee391d30da42e937db621564Steve Block page()->action(QWebPage::Forward)->setShortcut(QKeySequence::Forward); 96d0825bca7fe65beaee391d30da42e937db621564Steve Block page()->action(QWebPage::Reload)->setShortcut(QKeySequence::Refresh); 9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef QT_NO_UNDOSTACK 98d0825bca7fe65beaee391d30da42e937db621564Steve Block page()->action(QWebPage::Undo)->setShortcut(QKeySequence::Undo); 99d0825bca7fe65beaee391d30da42e937db621564Steve Block page()->action(QWebPage::Redo)->setShortcut(QKeySequence::Redo); 10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 101d0825bca7fe65beaee391d30da42e937db621564Steve Block page()->action(QWebPage::Cut)->setShortcut(QKeySequence::Cut); 102d0825bca7fe65beaee391d30da42e937db621564Steve Block page()->action(QWebPage::Copy)->setShortcut(QKeySequence::Copy); 103d0825bca7fe65beaee391d30da42e937db621564Steve Block page()->action(QWebPage::Paste)->setShortcut(QKeySequence::Paste); 104cad810f21b803229eb11403f9209855525a25d57Steve Block page()->action(QWebPage::SelectAll)->setShortcut(QKeySequence::SelectAll); 105d0825bca7fe65beaee391d30da42e937db621564Steve Block 106d0825bca7fe65beaee391d30da42e937db621564Steve Block page()->action(QWebPage::ToggleBold)->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_B)); 107d0825bca7fe65beaee391d30da42e937db621564Steve Block page()->action(QWebPage::ToggleItalic)->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_I)); 108d0825bca7fe65beaee391d30da42e937db621564Steve Block page()->action(QWebPage::ToggleUnderline)->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_U)); 10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 110d0825bca7fe65beaee391d30da42e937db621564Steve Block} 111d0825bca7fe65beaee391d30da42e937db621564Steve Block 11268513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid MainWindow::setPage(WebPage* page) 11368513a70bcd92384395513322f1b801e7bf9c729Steve Block{ 1144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (page && m_page) 1154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang page->setUserAgent(m_page->userAgentForUrl(QUrl())); 1164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11768513a70bcd92384395513322f1b801e7bf9c729Steve Block delete m_page; 11868513a70bcd92384395513322f1b801e7bf9c729Steve Block m_page = page; 11968513a70bcd92384395513322f1b801e7bf9c729Steve Block 12068513a70bcd92384395513322f1b801e7bf9c729Steve Block buildUI(); 12168513a70bcd92384395513322f1b801e7bf9c729Steve Block} 12268513a70bcd92384395513322f1b801e7bf9c729Steve Block 12368513a70bcd92384395513322f1b801e7bf9c729Steve BlockWebPage* MainWindow::page() const 124d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 125d0825bca7fe65beaee391d30da42e937db621564Steve Block return m_page; 126d0825bca7fe65beaee391d30da42e937db621564Steve Block} 127d0825bca7fe65beaee391d30da42e937db621564Steve Block 128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid MainWindow::setAddressUrl(const QUrl& url) 129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner setAddressUrl(url.toString(QUrl::RemoveUserInfo)); 131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 133d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid MainWindow::setAddressUrl(const QString& url) 134d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef QT_NO_INPUTDIALOG 1366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (!url.contains("about:")) 1376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner urlEdit->setText(url); 13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 139d0825bca7fe65beaee391d30da42e937db621564Steve Block} 140d0825bca7fe65beaee391d30da42e937db621564Steve Block 141d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid MainWindow::addCompleterEntry(const QUrl& url) 142d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 143d0825bca7fe65beaee391d30da42e937db621564Steve Block QUrl::FormattingOptions opts; 144d0825bca7fe65beaee391d30da42e937db621564Steve Block opts |= QUrl::RemoveScheme; 145d0825bca7fe65beaee391d30da42e937db621564Steve Block opts |= QUrl::RemoveUserInfo; 146d0825bca7fe65beaee391d30da42e937db621564Steve Block opts |= QUrl::StripTrailingSlash; 147d0825bca7fe65beaee391d30da42e937db621564Steve Block QString s = url.toString(opts); 148d0825bca7fe65beaee391d30da42e937db621564Steve Block s = s.mid(2); 149d0825bca7fe65beaee391d30da42e937db621564Steve Block if (s.isEmpty()) 150d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 151d0825bca7fe65beaee391d30da42e937db621564Steve Block 152d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!urlList.contains(s)) 153d0825bca7fe65beaee391d30da42e937db621564Steve Block urlList += s; 154d0825bca7fe65beaee391d30da42e937db621564Steve Block urlModel.setStringList(urlList); 155d0825bca7fe65beaee391d30da42e937db621564Steve Block} 156d0825bca7fe65beaee391d30da42e937db621564Steve Block 157d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid MainWindow::load(const QString& url) 158d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 159d0825bca7fe65beaee391d30da42e937db621564Steve Block QUrl qurl = urlFromUserInput(url); 160d0825bca7fe65beaee391d30da42e937db621564Steve Block if (qurl.scheme().isEmpty()) 161d0825bca7fe65beaee391d30da42e937db621564Steve Block qurl = QUrl("http://" + url + "/"); 162d0825bca7fe65beaee391d30da42e937db621564Steve Block load(qurl); 163d0825bca7fe65beaee391d30da42e937db621564Steve Block} 164d0825bca7fe65beaee391d30da42e937db621564Steve Block 165d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid MainWindow::load(const QUrl& url) 166d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 167d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!url.isValid()) 168d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 169d0825bca7fe65beaee391d30da42e937db621564Steve Block 170d0825bca7fe65beaee391d30da42e937db621564Steve Block setAddressUrl(url.toString()); 171d0825bca7fe65beaee391d30da42e937db621564Steve Block page()->mainFrame()->load(url); 172d0825bca7fe65beaee391d30da42e937db621564Steve Block} 173d0825bca7fe65beaee391d30da42e937db621564Steve Block 174d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid MainWindow::changeLocation() 175d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef QT_NO_INPUTDIALOG 177d0825bca7fe65beaee391d30da42e937db621564Steve Block QString string = urlEdit->text(); 178ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block QUrl mainFrameURL = page()->mainFrame()->url(); 179ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 180ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (mainFrameURL.isValid() && string == mainFrameURL.toString()) { 181ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block page()->triggerAction(QWebPage::Reload); 182ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return; 183ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } 184ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 185d0825bca7fe65beaee391d30da42e937db621564Steve Block load(string); 18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 187d0825bca7fe65beaee391d30da42e937db621564Steve Block} 188d0825bca7fe65beaee391d30da42e937db621564Steve Block 189d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid MainWindow::openFile() 190d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef QT_NO_FILEDIALOG 192d0825bca7fe65beaee391d30da42e937db621564Steve Block static const QString filter("HTML Files (*.htm *.html);;Text Files (*.txt);;Image Files (*.gif *.jpg *.png);;All Files (*)"); 193d0825bca7fe65beaee391d30da42e937db621564Steve Block 194d0825bca7fe65beaee391d30da42e937db621564Steve Block QFileDialog fileDialog(this, tr("Open"), QString(), filter); 195d0825bca7fe65beaee391d30da42e937db621564Steve Block fileDialog.setAcceptMode(QFileDialog::AcceptOpen); 196d0825bca7fe65beaee391d30da42e937db621564Steve Block fileDialog.setFileMode(QFileDialog::ExistingFile); 197d0825bca7fe65beaee391d30da42e937db621564Steve Block fileDialog.setOptions(QFileDialog::ReadOnly); 198d0825bca7fe65beaee391d30da42e937db621564Steve Block 199d0825bca7fe65beaee391d30da42e937db621564Steve Block if (fileDialog.exec()) { 200d0825bca7fe65beaee391d30da42e937db621564Steve Block QString selectedFile = fileDialog.selectedFiles()[0]; 201d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!selectedFile.isEmpty()) 202d0825bca7fe65beaee391d30da42e937db621564Steve Block load(QUrl::fromLocalFile(selectedFile)); 203d0825bca7fe65beaee391d30da42e937db621564Steve Block } 20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 205d0825bca7fe65beaee391d30da42e937db621564Steve Block} 206d0825bca7fe65beaee391d30da42e937db621564Steve Block 207e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid MainWindow::openLocation() 208e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{ 20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef QT_NO_INPUTDIALOG 210e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke urlEdit->selectAll(); 211e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke urlEdit->setFocus(); 21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 213e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 214