5d21e43767a8ad1220a67c8954e95d687a433783vboxsync/* $Id$ */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync/** @file
d34409ad02ea0d28e08a6c4b089a412fdb3b4c9cvboxsync * VBox Qt GUI - UINetworkRequestWidget stuff implementation.
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync/*
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync * Copyright (C) 2011-2012 Oracle Corporation
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync *
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync * available from http://www.virtualbox.org. This file is free software;
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync * you can redistribute it and/or modify it under the terms of the GNU
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync * General Public License (GPL) as published by the Free Software
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync#ifdef VBOX_WITH_PRECOMPILED_HEADERS
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include <precomp.h>
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync#else /* !VBOX_WITH_PRECOMPILED_HEADERS */
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync/* Global includes: */
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include <QTimer>
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include <QGridLayout>
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include <QProgressBar>
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync/* Local includes: */
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include "UINetworkRequestWidget.h"
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include "UINetworkRequest.h"
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include "UINetworkManager.h"
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include "UINetworkManagerDialog.h"
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include "UIIconPool.h"
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include "QIToolButton.h"
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include "QIRichTextLabel.h"
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsyncUINetworkRequestWidget::UINetworkRequestWidget(UINetworkManagerDialog *pParent, UINetworkRequest *pNetworkRequest)
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync : QIWithRetranslateUI<UIPopupBox>(pParent)
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync , m_pContentWidget(new QWidget(this))
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync , m_pMainLayout(new QGridLayout(m_pContentWidget))
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync , m_pProgressBar(new QProgressBar(m_pContentWidget))
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync , m_pRetryButton(new QIToolButton(m_pContentWidget))
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync , m_pCancelButton(new QIToolButton(m_pContentWidget))
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync , m_pErrorPane(new QIRichTextLabel(m_pContentWidget))
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync , m_pNetworkRequest(pNetworkRequest)
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync , m_pTimer(new QTimer(this))
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync{
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Setup self: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync setTitleIcon(UIIconPool::iconSet(":/nw_16px.png"));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync setContentWidget(m_pContentWidget);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync setOpen(true);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Prepare listeners for m_pNetworkRequest: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync connect(m_pNetworkRequest, SIGNAL(sigProgress(qint64, qint64)), this, SLOT(sltSetProgress(qint64, qint64)));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync connect(m_pNetworkRequest, SIGNAL(sigStarted()), this, SLOT(sltSetProgressToStarted()));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync connect(m_pNetworkRequest, SIGNAL(sigFinished()), this, SLOT(sltSetProgressToFinished()));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync connect(m_pNetworkRequest, SIGNAL(sigFailed(const QString&)), this, SLOT(sltSetProgressToFailed(const QString&)));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Setup timer: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pTimer->setInterval(5000);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync connect(m_pTimer, SIGNAL(timeout()), this, SLOT(sltTimeIsOut()));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Setup main-layout: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pMainLayout->setContentsMargins(6, 6, 6, 6);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Setup progress-bar: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pProgressBar->setRange(0, 0);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pProgressBar->setMaximumHeight(16);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Setup retry-button: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pRetryButton->setHidden(true);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pRetryButton->removeBorder();
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pRetryButton->setFocusPolicy(Qt::NoFocus);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pRetryButton->setIcon(UIIconPool::iconSet(":/refresh_16px.png"));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync connect(m_pRetryButton, SIGNAL(clicked(bool)), this, SIGNAL(sigRetry()));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Setup cancel-button: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pCancelButton->removeBorder();
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pCancelButton->setFocusPolicy(Qt::NoFocus);
aee625e805c79f14fbefcf212d05e4c41c266f01vboxsync m_pCancelButton->setIcon(UIIconPool::iconSet(":/cancel_16px.png"));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync connect(m_pCancelButton, SIGNAL(clicked(bool)), this, SIGNAL(sigCancel()));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Setup error-label: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pErrorPane->setHidden(true);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pErrorPane->setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Calculate required width: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync int iMinimumWidth = pParent->minimumWidth();
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync int iLeft, iTop, iRight, iBottom;
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Take into account content-widget layout margins: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pMainLayout->getContentsMargins(&iLeft, &iTop, &iRight, &iBottom);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync iMinimumWidth -= iLeft;
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync iMinimumWidth -= iRight;
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Take into account this layout margins: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync layout()->getContentsMargins(&iLeft, &iTop, &iRight, &iBottom);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync iMinimumWidth -= iLeft;
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync iMinimumWidth -= iRight;
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Take into account parent layout margins: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync QLayout *pParentLayout = qobject_cast<QMainWindow*>(parent())->centralWidget()->layout();
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync pParentLayout->getContentsMargins(&iLeft, &iTop, &iRight, &iBottom);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync iMinimumWidth -= iLeft;
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync iMinimumWidth -= iRight;
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Set minimum text width: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pErrorPane->setMinimumTextWidth(iMinimumWidth);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Layout content: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pMainLayout->addWidget(m_pProgressBar, 0, 0);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pMainLayout->addWidget(m_pRetryButton, 0, 1);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pMainLayout->addWidget(m_pCancelButton, 0, 2);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pMainLayout->addWidget(m_pErrorPane, 1, 0, 1, 3);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Retranslate UI: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync retranslateUi();
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync}
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsyncvoid UINetworkRequestWidget::sltSetProgress(qint64 iReceived, qint64 iTotal)
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync{
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Restart timer: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pTimer->start();
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Set current progress to passed: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pProgressBar->setRange(0, iTotal);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pProgressBar->setValue(iReceived);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync}
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsyncvoid UINetworkRequestWidget::sltSetProgressToStarted()
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync{
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Start timer: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pTimer->start();
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Set current progress to 'started': */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pProgressBar->setRange(0, 1);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pProgressBar->setValue(0);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Hide 'retry' button: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pRetryButton->setHidden(true);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Hide error label: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pErrorPane->setHidden(true);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pErrorPane->setText(QString());
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync}
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsyncvoid UINetworkRequestWidget::sltSetProgressToFinished()
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync{
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Stop timer: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pTimer->stop();
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Set current progress to 'started': */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pProgressBar->setRange(0, 1);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pProgressBar->setValue(1);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync}
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsyncvoid UINetworkRequestWidget::sltSetProgressToFailed(const QString &strError)
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync{
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Stop timer: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pTimer->stop();
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Set current progress to 'failed': */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pProgressBar->setRange(0, 1);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pProgressBar->setValue(1);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Show 'retry' button: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pRetryButton->setHidden(false);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Try to find all the links in the error-message,
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync * replace them with %increment if present: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync QString strErrorText(strError);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync QRegExp linkRegExp("[\\S]+[\\./][\\S]+");
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync QStringList links;
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync for (int i = 1; linkRegExp.indexIn(strErrorText) != -1; ++i)
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync {
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync links << linkRegExp.cap();
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync strErrorText.replace(linkRegExp.cap(), QString("%%1").arg(i));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync }
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Return back all the links, just in bold: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync if (!links.isEmpty())
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync for (int i = 0; i < links.size(); ++i)
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync strErrorText = strErrorText.arg(QString("<b>%1</b>").arg(links[i]));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Show error label: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pErrorPane->setHidden(false);
22c01c0da1c882e8e6bc68ce31e619a4d24983e5vboxsync m_pErrorPane->setText(UINetworkManagerDialog::tr("The network operation failed with the following error: %1.").arg(strErrorText));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync}
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsyncvoid UINetworkRequestWidget::sltTimeIsOut()
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync{
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Stop timer: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pTimer->stop();
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Set current progress to unknown: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pProgressBar->setRange(0, 0);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync}
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsyncvoid UINetworkRequestWidget::retranslateUi()
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync{
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Get corresponding title: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync const QString &strTitle = m_pNetworkRequest->description();
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Set popup title (default if missed): */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync setTitle(strTitle.isEmpty() ? UINetworkManagerDialog::tr("Network Operation") : strTitle);
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Translate retry button: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pRetryButton->setStatusTip(UINetworkManagerDialog::tr("Restart network operation"));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync /* Translate cancel button: */
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync m_pCancelButton->setStatusTip(UINetworkManagerDialog::tr("Cancel network operation"));
5d21e43767a8ad1220a67c8954e95d687a433783vboxsync}