Home | History | Annotate | Download | only in QtTestBrowser
      1 /*
      2  * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
      3  * Copyright (C) 2009 Girish Ramakrishnan <girish (at) forwardbias.in>
      4  * Copyright (C) 2006 George Staikos <staikos (at) kde.org>
      5  * Copyright (C) 2006 Dirk Mueller <mueller (at) kde.org>
      6  * Copyright (C) 2006 Zack Rusin <zack (at) kde.org>
      7  * Copyright (C) 2006 Simon Hausmann <hausmann (at) kde.org>
      8  *
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions and the following disclaimer.
     16  * 2. Redistributions in binary form must reproduce the above copyright
     17  *    notice, this list of conditions and the following disclaimer in the
     18  *    documentation and/or other materials provided with the distribution.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     21  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     28  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 #include "mainwindow.h"
     34 
     35 #include "locationedit.h"
     36 #include "utils.h"
     37 
     38 MainWindow::MainWindow()
     39     : m_page(new WebPage(this))
     40     , m_toolBar(0)
     41     , urlEdit(0)
     42 {
     43     setAttribute(Qt::WA_DeleteOnClose);
     44     if (qgetenv("QTTESTBROWSER_USE_ARGB_VISUALS").toInt() == 1)
     45         setAttribute(Qt::WA_TranslucentBackground);
     46 
     47     buildUI();
     48 }
     49 
     50 void MainWindow::buildUI()
     51 {
     52 #if defined(Q_OS_SYMBIAN)
     53     delete urlEdit;
     54 #endif
     55     delete m_toolBar;
     56 
     57     m_toolBar = addToolBar("Navigation");
     58 #if defined(Q_OS_SYMBIAN)
     59     m_toolBar->setIconSize(QSize(16, 16));
     60 #endif
     61     QAction* reloadAction = page()->action(QWebPage::Reload);
     62     connect(reloadAction, SIGNAL(triggered()), this, SLOT(changeLocation()));
     63 
     64     m_toolBar->addAction(page()->action(QWebPage::Back));
     65     m_toolBar->addAction(page()->action(QWebPage::Forward));
     66     m_toolBar->addAction(reloadAction);
     67     m_toolBar->addAction(page()->action(QWebPage::Stop));
     68 
     69 #ifndef QT_NO_INPUTDIALOG
     70     urlEdit = new LocationEdit(m_toolBar);
     71     urlEdit->setSizePolicy(QSizePolicy::Expanding, urlEdit->sizePolicy().verticalPolicy());
     72     connect(urlEdit, SIGNAL(returnPressed()), SLOT(changeLocation()));
     73     QCompleter* completer = new QCompleter(m_toolBar);
     74     urlEdit->setCompleter(completer);
     75     completer->setModel(&urlModel);
     76 #if defined(Q_OS_SYMBIAN)
     77     addToolBarBreak();
     78     addToolBar("Location")->addWidget(urlEdit);
     79 #else
     80     m_toolBar->addWidget(urlEdit);
     81 #endif
     82 
     83     connect(page()->mainFrame(), SIGNAL(urlChanged(QUrl)), this, SLOT(setAddressUrl(QUrl)));
     84     connect(page(), SIGNAL(loadProgress(int)), urlEdit, SLOT(setProgress(int)));
     85 #endif
     86 
     87     connect(page()->mainFrame(), SIGNAL(loadStarted()), this, SLOT(onLoadStarted()));
     88     connect(page()->mainFrame(), SIGNAL(iconChanged()), this, SLOT(onIconChanged()));
     89     connect(page()->mainFrame(), SIGNAL(titleChanged(QString)), this, SLOT(onTitleChanged(QString)));
     90     connect(page(), SIGNAL(windowCloseRequested()), this, SLOT(close()));
     91 
     92 #ifndef QT_NO_SHORTCUT
     93     // short-cuts
     94     page()->action(QWebPage::Back)->setShortcut(QKeySequence::Back);
     95     page()->action(QWebPage::Stop)->setShortcut(Qt::Key_Escape);
     96     page()->action(QWebPage::Forward)->setShortcut(QKeySequence::Forward);
     97     page()->action(QWebPage::Reload)->setShortcut(QKeySequence::Refresh);
     98 #ifndef QT_NO_UNDOSTACK
     99     page()->action(QWebPage::Undo)->setShortcut(QKeySequence::Undo);
    100     page()->action(QWebPage::Redo)->setShortcut(QKeySequence::Redo);
    101 #endif
    102     page()->action(QWebPage::Cut)->setShortcut(QKeySequence::Cut);
    103     page()->action(QWebPage::Copy)->setShortcut(QKeySequence::Copy);
    104     page()->action(QWebPage::Paste)->setShortcut(QKeySequence::Paste);
    105     page()->action(QWebPage::SelectAll)->setShortcut(QKeySequence::SelectAll);
    106 
    107     page()->action(QWebPage::ToggleBold)->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_B));
    108     page()->action(QWebPage::ToggleItalic)->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_I));
    109     page()->action(QWebPage::ToggleUnderline)->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_U));
    110 #endif
    111 }
    112 
    113 void MainWindow::setPage(WebPage* page)
    114 {
    115     if (page && m_page)
    116         page->setUserAgent(m_page->userAgentForUrl(QUrl()));
    117 
    118     delete m_page;
    119     m_page = page;
    120 
    121     buildUI();
    122 }
    123 
    124 WebPage* MainWindow::page() const
    125 {
    126     return m_page;
    127 }
    128 
    129 void MainWindow::setAddressUrl(const QUrl& url)
    130 {
    131     setAddressUrl(url.toString(QUrl::RemoveUserInfo));
    132 }
    133 
    134 void MainWindow::setAddressUrl(const QString& url)
    135 {
    136 #ifndef QT_NO_INPUTDIALOG
    137     if (!url.contains("about:"))
    138         urlEdit->setText(url);
    139 #endif
    140 }
    141 
    142 void MainWindow::addCompleterEntry(const QUrl& url)
    143 {
    144     QUrl::FormattingOptions opts;
    145     opts |= QUrl::RemoveScheme;
    146     opts |= QUrl::RemoveUserInfo;
    147     opts |= QUrl::StripTrailingSlash;
    148     QString s = url.toString(opts);
    149     s = s.mid(2);
    150     if (s.isEmpty())
    151         return;
    152 
    153     if (!urlList.contains(s))
    154         urlList += s;
    155     urlModel.setStringList(urlList);
    156 }
    157 
    158 void MainWindow::load(const QString& url)
    159 {
    160     QUrl qurl = urlFromUserInput(url);
    161     if (qurl.scheme().isEmpty())
    162         qurl = QUrl("http://" + url + "/");
    163     load(qurl);
    164 }
    165 
    166 void MainWindow::load(const QUrl& url)
    167 {
    168     if (!url.isValid())
    169         return;
    170 
    171     setAddressUrl(url.toString());
    172     page()->mainFrame()->load(url);
    173 }
    174 
    175 QString MainWindow::addressUrl() const
    176 {
    177 #ifndef QT_NO_INPUTDIALOG
    178     return urlEdit->text();
    179 #endif
    180     return QString();
    181 }
    182 
    183 void MainWindow::changeLocation()
    184 {
    185 #ifndef QT_NO_INPUTDIALOG
    186     QString string = urlEdit->text();
    187     QUrl mainFrameURL = page()->mainFrame()->url();
    188 
    189     if (mainFrameURL.isValid() && string == mainFrameURL.toString()) {
    190         page()->triggerAction(QWebPage::Reload);
    191         return;
    192     }
    193 
    194     load(string);
    195 #endif
    196 }
    197 
    198 void MainWindow::openFile()
    199 {
    200 #ifndef QT_NO_FILEDIALOG
    201     static const QString filter("HTML Files (*.htm *.html);;Text Files (*.txt);;Image Files (*.gif *.jpg *.png);;All Files (*)");
    202 
    203     QFileDialog fileDialog(this, tr("Open"), QString(), filter);
    204     fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
    205     fileDialog.setFileMode(QFileDialog::ExistingFile);
    206     fileDialog.setOptions(QFileDialog::ReadOnly);
    207 
    208     if (fileDialog.exec()) {
    209         QString selectedFile = fileDialog.selectedFiles()[0];
    210         if (!selectedFile.isEmpty())
    211             load(QUrl::fromLocalFile(selectedFile));
    212     }
    213 #endif
    214 }
    215 
    216 void MainWindow::openLocation()
    217 {
    218 #ifndef QT_NO_INPUTDIALOG
    219     urlEdit->selectAll();
    220     urlEdit->setFocus();
    221 #endif
    222 }
    223 
    224 void MainWindow::onIconChanged()
    225 {
    226 #ifndef QT_NO_INPUTDIALOG
    227     urlEdit->setPageIcon(page()->mainFrame()->icon());
    228 #endif
    229 }
    230 
    231 void MainWindow::onLoadStarted()
    232 {
    233 #ifndef QT_NO_INPUTDIALOG
    234     urlEdit->setPageIcon(QIcon());
    235 #endif
    236 }
    237 
    238 void MainWindow::onTitleChanged(const QString& title)
    239 {
    240     if (title.isEmpty())
    241         setWindowTitle(QCoreApplication::applicationName());
    242     else
    243         setWindowTitle(QString::fromLatin1("%1 - %2").arg(title).arg(QCoreApplication::applicationName()));
    244 }
    245