diff options
Diffstat (limited to 'knewsticker/newssourcedlgimpl.cpp')
-rw-r--r-- | knewsticker/newssourcedlgimpl.cpp | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/knewsticker/newssourcedlgimpl.cpp b/knewsticker/newssourcedlgimpl.cpp new file mode 100644 index 00000000..2cf39511 --- /dev/null +++ b/knewsticker/newssourcedlgimpl.cpp @@ -0,0 +1,240 @@ +/* + * newssourcedlgimpl.cpp + * + * Copyright (c) 2001 Frerich Raabe <[email protected]> + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. For licensing and distribution details, check the + * accompanying file 'COPYING'. + */ +#include "newssourcedlgimpl.h" +#include "xmlnewsaccess.h" +#include "configaccess.h" +#include "newsiconmgr.h" + +#include <kcombobox.h> +#include <klineedit.h> +#include <kmessagebox.h> +#include <knuminput.h> +#include <kurlrequester.h> + +#include <qcheckbox.h> +#include <qlabel.h> +#include <qprogressbar.h> +#include <qtimer.h> +#include <qvbox.h> + +SuggestProgressDlg::SuggestProgressDlg(const KURL &url, QWidget *parent, const char *name) + : KDialogBase(parent, name, true, i18n("Downloading Data"), Cancel, Cancel), + m_gotSourceFile(false), + m_gotIcon(false) +{ + QVBox *mainWidget = makeVBoxMainWidget(); + + new QLabel(i18n("<qt>Please wait while KNewsTicker is downloading some " + "data necessary to suggest reasonable values.<br/>" + "<br/>" + "This will not take longer than one minute.</qt>" ), + mainWidget); + + m_progressBar = new QProgressBar(60, mainWidget); + m_progressBar->setPercentageVisible(false); + + m_timeoutTimer = new QTimer(this); + connect(m_timeoutTimer, SIGNAL(timeout()), this, SLOT(slotTimeoutTick())); + m_timeoutTimer->start(1000); + + m_xmlSrc = new XMLNewsSource; + connect(m_xmlSrc, SIGNAL(loadComplete(XMLNewsSource *, bool)), + this, SLOT(slotLoadComplete(XMLNewsSource *, bool))); + m_xmlSrc->loadFrom(url); + + connect(NewsIconMgr::self(), SIGNAL(gotIcon(const KURL &, const QPixmap &)), + this, SLOT(slotGotIcon(const KURL &, const QPixmap &))); + KURL u = url; + if (url.isLocalFile()) + u = QString::null; + else + u.setEncodedPathAndQuery(QString::fromLatin1("/favicon.ico")); + NewsIconMgr::self()->getIcon(u); +} + +SuggestProgressDlg::~SuggestProgressDlg() +{ + delete m_xmlSrc; +} + +void SuggestProgressDlg::slotTimeoutTick() +{ + if (m_progressBar->progress() == m_progressBar->totalSteps()) { + m_timeoutTimer->stop(); + KMessageBox::error(this, i18n("Could not retrieve the specified source file.")); + reject(); + return; + } + m_progressBar->setProgress(m_progressBar->progress() + 1); +} + +void SuggestProgressDlg::slotLoadComplete(XMLNewsSource *, bool succeeded) +{ + m_gotSourceFile = true; + m_succeeded = succeeded; + + if (m_gotIcon) + done(succeeded ? QDialog::Accepted : QDialog::Rejected); +} + +void SuggestProgressDlg::slotGotIcon(const KURL &url, const QPixmap &pixmap) +{ + m_gotIcon = true; + m_icon = pixmap; + m_iconURL = url; + + if (m_gotIcon) + done(m_succeeded ? QDialog::Accepted : QDialog::Rejected); +} + +NewsSourceDlgImpl::NewsSourceDlgImpl(QWidget *parent, const char *name, bool modal, WFlags fl) + : NewsSourceDlg(parent, name, modal, fl), + m_modified(false) +{ + connect(NewsIconMgr::self(), SIGNAL(gotIcon(const KURL &, const QPixmap &)), + this, SLOT(slotGotIcon(const KURL &, const QPixmap &))); + + for (unsigned int i = 0; i < DEFAULT_SUBJECTS; i++) + comboCategory->insertItem( + NewsSourceBase::subjectText(static_cast<NewsSourceBase::Subject>(i))); + +} + +void NewsSourceDlgImpl::slotCancelClicked() +{ + close(); +} + +void NewsSourceDlgImpl::slotOkClicked() +{ + KURL url (polishedURL(KURL(urlSourceFile->url()))); + + if (!validateURL(url)) + return; + + if (leName->text().isEmpty()) { + KMessageBox::error(this, i18n("You have to specify a name for this news" + " source to be able to use it."), i18n("No Name Specified")); + return; + } + + // This finds out which subject is selected in the 'Subject' combo box. + NewsSourceBase::Subject subject = NewsSourceBase::Computers; + for (unsigned int i = 0; i < DEFAULT_SUBJECTS; i++) { + NewsSourceBase::Subject thisSubj = static_cast<NewsSourceBase::Subject>(i); + if (comboCategory->currentText() == NewsSourceBase::subjectText(thisSubj)) { + subject = thisSubj; + break; + } + } + + KURL iconURL ( leIcon->text() ); + if (iconURL.protocol().isEmpty()) + if (iconURL.host().startsWith(QString::fromLatin1("ftp."))) + iconURL.setProtocol(QString::fromLatin1("ftp")); + else if (iconURL.host().startsWith(QString::fromLatin1("www."))) + iconURL.setProtocol(QString::fromLatin1("http")); + else + iconURL.setProtocol(QString::fromLatin1("file")); + + NewsSourceBase::Data nsd(leName->text(), url.url(), iconURL.url(), subject, + sbMaxArticles->value(), true, cbProgram->isChecked()); + + emit newsSource(nsd); + + close(); +} + +void NewsSourceDlgImpl::slotSourceFileChanged() +{ + bSuggest->setEnabled(!urlSourceFile->url().isEmpty()); +} + +void NewsSourceDlgImpl::slotSuggestClicked() +{ + KURL url ( polishedURL(KURL( urlSourceFile->url() )) ); + + if (!validateURL(url)) + return; + + SuggestProgressDlg dlg(url, this); + if (dlg.exec() == QDialog::Accepted) { + pixmapIcon->setPixmap(dlg.icon()); + if (NewsIconMgr::self()->isStdIcon(dlg.icon())) + leIcon->clear(); + else + leIcon->setText(dlg.iconURL().url()); + cbProgram->setChecked(false); + leName->setText(dlg.xmlSrc()->newsSourceName()); + sbMaxArticles->setValue(dlg.xmlSrc()->articles().count()); + } +} + +void NewsSourceDlgImpl::slotModified() +{ + m_modified = true; +} + +void NewsSourceDlgImpl::setup(const NewsSourceBase::Data &nsd, bool modify) +{ + leName->setText(nsd.name); + urlSourceFile->setURL(nsd.sourceFile); + cbProgram->setChecked(nsd.isProgram); + comboCategory->setCurrentItem(nsd.subject); + sbMaxArticles->setValue(nsd.maxArticles); + KURL iconURL ( nsd.icon ); + if (iconURL.protocol() == QString::fromLatin1("file")) + iconURL.setProtocol(QString::null); + leIcon->setText(iconURL.url()); + NewsIconMgr::self()->getIcon(iconURL); + if (modify == true) { + setCaption(i18n("Edit News Source")); + } +} + +KURL NewsSourceDlgImpl::polishedURL(const KURL &url) const +{ + KURL newURL = url; + + if (url.protocol().isEmpty()) + if (url.url().startsWith(QString::fromLatin1("ftp"))) + newURL = QString::fromLatin1("ftp://") + url.url(); + else + newURL = QString::fromLatin1("http://") + url.url(); + + return newURL; +} + +bool NewsSourceDlgImpl::validateURL(const KURL &url) +{ + if (url.isEmpty()) { + KMessageBox::error(this, i18n("You have to specify the source file for this" + " news source to be able to use it."), i18n("No Source File" + " Specified")); + return false; + } + + if (!url.isValid() || !url.hasPath() || url.encodedPathAndQuery() == QString::fromLatin1("/")) { + KMessageBox::error(this, i18n("KNewsTicker needs a valid RDF or RSS file to" + " suggest sensible values. The specified source file is invalid."), + i18n("Invalid Source File")); + return false; + } + + return true; +} + +void NewsSourceDlgImpl::slotGotIcon(const KURL &, const QPixmap &pixmap) +{ + pixmapIcon->setPixmap(pixmap); +} + +#include "newssourcedlgimpl.moc" |