knewstuff Library API Documentation

downloaddialog.cpp

00001 /* 00002 This file is part of KNewStuff. 00003 Copyright (c) 2003 Josef Spillner <spillner@kde.org> 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License as published by the Free Software Foundation; either 00008 version 2 of the License, or (at your option) any later version. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Library General Public License 00016 along with this library; see the file COPYING.LIB. If not, write to 00017 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00018 Boston, MA 02111-1307, USA. 00019 */ 00020 00021 #include "downloaddialog.h" 00022 #include "downloaddialog.moc" 00023 00024 #include <klocale.h> 00025 #include <ktabctl.h> 00026 #include <klistview.h> 00027 #include <kdebug.h> 00028 #include <kio/job.h> 00029 #include <kio/netaccess.h> 00030 #include <kmessagebox.h> 00031 #include <kurl.h> 00032 #include <kconfig.h> 00033 #include <kapplication.h> 00034 #include <kiconloader.h> 00035 00036 #include <knewstuff/entry.h> 00037 #include <knewstuff/knewstuffgeneric.h> 00038 #include <knewstuff/engine.h> 00039 00040 #include <qlayout.h> 00041 #include <qpushbutton.h> 00042 #include <qdom.h> 00043 #include <qlabel.h> 00044 #include <qtextbrowser.h> 00045 #include <qtimer.h> // hack 00046 00047 using namespace KNS; 00048 00049 struct DownloadDialog::Private 00050 { 00051 QString m_providerlist; 00052 QWidget *m_page; 00053 }; 00054 00055 class NumSortListViewItem : public KListViewItem 00056 { 00057 public: 00058 NumSortListViewItem( QListView * parent, QString label1, QString label2 = QString::null, QString label3 = QString::null, QString label4 = QString::null, QString label5 = QString::null, QString label6 = QString::null, QString label7 = QString::null, QString label8 = QString::null ) : 00059 KListViewItem( parent, label1, label2, label3, label4, label5, label6, label7, label8 ) 00060 { 00061 } 00062 00063 QString key(int col, bool asc) const { 00064 if (col == 2) 00065 { 00066 QString s; 00067 s.sprintf("%08d", text(col).toInt()); 00068 return s; 00069 } 00070 return KListViewItem::key( col, asc ); 00071 } 00072 }; 00073 00074 class DateSortListViewItem : public KListViewItem 00075 { 00076 public: 00077 DateSortListViewItem( QListView * parent, QString label1, QString label2 = QString::null, QString label3 = QString::null, QString label4 = QString::null, QString label5 = QString::null, QString label6 = QString::null, QString label7 = QString::null, QString label8 = QString::null ) : 00078 KListViewItem( parent, label1, label2, label3, label4, label5, label6, label7, label8 ) 00079 { 00080 } 00081 00082 QString key(int col, bool asc) const { 00083 if (col == 2) 00084 { 00085 QString s; 00086 QDate date = KGlobal::locale()->readDate(text(col)); 00087 s.sprintf("%08d", date.year() * 366 + date.dayOfYear()); 00088 return s; 00089 } 00090 return KListViewItem::key( col, asc ); 00091 } 00092 }; 00093 00094 // BEGIN deprecated for KDE 4 00095 DownloadDialog::DownloadDialog(Engine *engine, QWidget *) 00096 : KDialogBase(KDialogBase::IconList, i18n("Get Hot New Stuff"), 00097 KDialogBase::Close, KDialogBase::Close) 00098 { 00099 init(engine); 00100 } 00101 00102 DownloadDialog::DownloadDialog(QWidget *) 00103 : KDialogBase(KDialogBase::IconList, i18n("Get Hot New Stuff"), 00104 KDialogBase::Close, KDialogBase::Close) 00105 { 00106 init(0); 00107 } 00108 00109 void DownloadDialog::open(QString type) 00110 { 00111 DownloadDialog d; 00112 d.setType(type); 00113 d.load(); 00114 d.exec(); 00115 } 00116 // END deprecated for KDE 4 00117 00118 DownloadDialog::DownloadDialog(Engine *engine, QWidget *, const QString& caption) 00119 : KDialogBase(KDialogBase::IconList, (caption.isNull() ? i18n("Get Hot New Stuff") : caption), 00120 KDialogBase::Close, KDialogBase::Close) 00121 { 00122 init(engine); 00123 } 00124 00125 DownloadDialog::DownloadDialog(QWidget *, const QString& caption) 00126 : KDialogBase(KDialogBase::IconList, (caption.isNull() ? i18n("Get Hot New Stuff") : caption), 00127 KDialogBase::Close, KDialogBase::Close) 00128 { 00129 init(0); 00130 } 00131 00132 void DownloadDialog::init(Engine *engine) 00133 { 00134 resize(700, 400); 00135 d = new Private(); 00136 00137 m_engine = engine; 00138 d->m_page = NULL; 00139 00140 connect(this, SIGNAL(aboutToShowPage(QWidget*)), SLOT(slotPage(QWidget*))); 00141 00142 if(!engine) 00143 { 00144 m_loader = new ProviderLoader(this); 00145 connect(m_loader, SIGNAL(providersLoaded(Provider::List*)), SLOT(slotProviders(Provider::List*))); 00146 } 00147 } 00148 00149 DownloadDialog::~DownloadDialog() 00150 { 00151 delete d; 00152 } 00153 00154 void DownloadDialog::load() 00155 { 00156 m_loader->load(m_filter, d->m_providerlist); 00157 } 00158 00159 void DownloadDialog::load(QString providerList) 00160 { 00161 m_loader->load(m_filter, providerList); 00162 } 00163 00164 void DownloadDialog::clear() 00165 { 00166 QMap<QWidget*, QValueList<KListView*>* >::Iterator it; 00167 for(it = m_map.begin(); it != m_map.end(); it++) 00168 { 00169 QValueList<KListView*> *v = it.data(); 00170 kdDebug() << "clear listviews in " << v << endl; 00171 if(v) 00172 { 00173 (*(v->at(0)))->clear(); 00174 (*(v->at(1)))->clear(); 00175 (*(v->at(2)))->clear(); 00176 00177 //delete (*it); 00178 } 00179 00180 delete it.key(); 00181 } 00182 m_map.clear(); 00183 } 00184 00185 void DownloadDialog::slotProviders(Provider::List *list) 00186 { 00187 Provider *p; 00188 /*QFrame *frame;*/ 00189 00190 for(p = list->first(); p; p = list->next()) 00191 { 00192 kdDebug() << "++ provider ++ " << p->name() << endl; 00193 00194 if(!m_filter.isEmpty()) 00195 loadProvider(p); 00196 else 00197 addProvider(p); 00198 /*if(p == list->getFirst()) 00199 slotPage(m_frame);*/ // only if !qtbug 00200 } 00201 } 00202 00203 void DownloadDialog::addProvider(Provider *p) 00204 { 00205 QFrame *frame; 00206 KTabCtl *ctl; 00207 QWidget *w_d, *w_r, *w_l; 00208 QWidget *w2; 00209 KListView *lvtmp_r, *lvtmp_d, *lvtmp_l; 00210 QTextBrowser *rt; 00211 QString tmp; 00212 int ret; 00213 QPixmap pix; 00214 00215 if(m_map.count() == 0) 00216 { 00217 frame = addPage(i18n("Welcome"), i18n("Welcome"), QPixmap("")); 00218 delete frame; 00219 } 00220 00221 kdDebug() << "addProvider()/begin" << endl; 00222 00223 ret = true; 00224 if(!p->icon().isValid()) ret = false; 00225 else ret = KIO::NetAccess::download(p->icon(), tmp, this); 00226 if(ret) pix = QPixmap(tmp); 00227 else pix = KGlobal::iconLoader()->loadIcon("knewstuff", KIcon::Panel); 00228 frame = addPage(p->name(), p->name(), pix); 00229 m_frame = frame; 00230 00231 w2 = new QWidget(frame); 00232 w_d = new QWidget(frame); 00233 w_r = new QWidget(frame); 00234 w_l = new QWidget(frame); 00235 00236 ctl = new KTabCtl(frame); 00237 ctl->addTab(w_r, i18n("Highest Rated")); 00238 ctl->addTab(w_d, i18n("Most Downloads")); 00239 ctl->addTab(w_l, i18n("Latest")); 00240 00241 m_curtab = 0; 00242 connect(ctl, SIGNAL(tabSelected(int)), SLOT(slotTab(int))); 00243 00244 QHBoxLayout *box = new QHBoxLayout(frame); 00245 box->add(ctl); 00246 00247 lvtmp_r = new KListView(w_r); 00248 lvtmp_r->addColumn(i18n("Name")); 00249 lvtmp_r->addColumn(i18n("Version")); 00250 lvtmp_r->addColumn(i18n("Rating")); 00251 lvtmp_r->setSorting(2, false); 00252 00253 lvtmp_d = new KListView(w_d); 00254 lvtmp_d->addColumn(i18n("Name")); 00255 lvtmp_d->addColumn(i18n("Version")); 00256 lvtmp_d->addColumn(i18n("Downloads")); 00257 lvtmp_d->setSorting(2, false); 00258 00259 lvtmp_l = new KListView(w_l); 00260 lvtmp_l->addColumn(i18n("Name")); 00261 lvtmp_l->addColumn(i18n("Version")); 00262 lvtmp_l->addColumn(i18n("Release Date")); 00263 lvtmp_l->setSorting(2, false); 00264 00265 connect(lvtmp_r, SIGNAL(selectionChanged()), SLOT(slotSelected())); 00266 connect(lvtmp_d, SIGNAL(selectionChanged()), SLOT(slotSelected())); 00267 connect(lvtmp_l, SIGNAL(selectionChanged()), SLOT(slotSelected())); 00268 00269 rt = new QTextBrowser(frame); 00270 rt->setMinimumWidth(150); 00271 00272 QPushButton *in = new QPushButton(i18n("Install"), frame); 00273 QPushButton *de = new QPushButton(i18n("Details"), frame); 00274 in->setEnabled(false); 00275 de->setEnabled(false); 00276 00277 box->addSpacing(spacingHint()); 00278 QVBoxLayout *vbox = new QVBoxLayout(box); 00279 vbox->add(rt); 00280 vbox->addSpacing(spacingHint()); 00281 vbox->add(de); 00282 vbox->add(in); 00283 00284 connect(in, SIGNAL(clicked()), SLOT(slotInstall())); 00285 connect(de, SIGNAL(clicked()), SLOT(slotDetails())); 00286 00287 QVBoxLayout *box2 = new QVBoxLayout(w_r); 00288 box2->add(lvtmp_r); 00289 QVBoxLayout *box3 = new QVBoxLayout(w_d); 00290 box3->add(lvtmp_d); 00291 QVBoxLayout *box4 = new QVBoxLayout(w_l); 00292 box4->add(lvtmp_l); 00293 00294 QValueList<KListView*> *v = new QValueList<KListView*>; 00295 *v << lvtmp_r << lvtmp_d << lvtmp_l; 00296 m_map[frame] = v; 00297 m_rts[frame] = rt; 00298 QValueList<QPushButton*> *vb = new QValueList<QPushButton*>; 00299 *vb << in << de; 00300 m_buttons[frame] = vb; 00301 m_providers[frame] = p; 00302 00303 kdDebug() << "addProvider()/end; lvtmp_r = " << lvtmp_r << endl; 00304 00305 if(m_engine) slotPage(frame); 00306 00307 QTimer::singleShot(100, this, SLOT(slotFinish())); 00308 } 00309 00310 void DownloadDialog::slotResult(KIO::Job *job) 00311 { 00312 QDomDocument dom; 00313 QDomElement knewstuff; 00314 00315 kdDebug() << "got data: " << m_data[job] << endl; 00316 00317 kapp->config()->setGroup("KNewStuffStatus"); 00318 00319 dom.setContent(m_data[job]); 00320 knewstuff = dom.documentElement(); 00321 00322 for(QDomNode pn = knewstuff.firstChild(); !pn.isNull(); pn = pn.nextSibling()) 00323 { 00324 QDomElement stuff = pn.toElement(); 00325 00326 kdDebug() << "element: " << stuff.tagName() << endl; 00327 00328 if(stuff.tagName() == "stuff") 00329 { 00330 Entry *entry = new Entry(stuff); 00331 kdDebug() << "TYPE::" << entry->type() << " FILTER::" << m_filter << endl; 00332 if(!entry->type().isEmpty()) 00333 { 00334 if((!m_filter.isEmpty()) && (entry->type() != m_filter)) continue; 00335 } 00336 00337 if((!m_filter.isEmpty()) && (m_jobs[job])) 00338 { 00339 Provider *p = m_jobs[job]; 00340 addProvider(p); 00341 slotPage(m_frame); 00342 m_jobs[job] = 0; 00343 } 00344 addEntry(entry); 00345 } 00346 } 00347 00348 m_data[job] = ""; 00349 } 00350 00351 int DownloadDialog::installStatus(Entry *entry) 00352 { 00353 QDate date; 00354 QString datestring; 00355 int installed; 00356 00357 kapp->config()->setGroup("KNewStuffStatus"); 00358 datestring = kapp->config()->readEntry(entry->name()); 00359 if(datestring.isNull()) installed = 0; 00360 else 00361 { 00362 date = QDate::fromString(datestring, Qt::ISODate); 00363 if(!date.isValid()) installed = 0; 00364 else if(date < entry->releaseDate()) installed = -1; 00365 else installed = 1; 00366 } 00367 00368 return installed; 00369 } 00370 00371 void DownloadDialog::addEntry(Entry *entry) 00372 { 00373 QPixmap pix; 00374 int installed; 00375 00376 /*if(m_engine) 00377 { 00378 if(m_map.count() == 0) 00379 { 00380 m_frame = addPage(i18n("Welcome"), i18n("Welcome"), QPixmap("")); 00381 Provider *p = new Provider(); 00382 p->setName(i18n("Generic")); 00383 addProvider(p); 00384 slotPage(m_frame); 00385 } 00386 }*/ 00387 installed = installStatus(entry); 00388 00389 if(installed > 0) pix = KGlobal::iconLoader()->loadIcon("ok", KIcon::Small); 00390 else if(installed < 0) pix = KGlobal::iconLoader()->loadIcon("history", KIcon::Small); 00391 else pix = QPixmap(); 00392 00393 KListViewItem *tmp_r = new NumSortListViewItem(lv_r, 00394 entry->name(), entry->version(), QString("%1").arg(entry->rating())); 00395 KListViewItem *tmp_d = new NumSortListViewItem(lv_d, 00396 entry->name(), entry->version(), QString("%1").arg(entry->downloads())); 00397 KListViewItem *tmp_l = new DateSortListViewItem(lv_l, 00398 entry->name(), entry->version(), KGlobal::locale()->formatDate(entry->releaseDate())); 00399 00400 tmp_r->setPixmap(0, pix); 00401 tmp_d->setPixmap(0, pix); 00402 tmp_l->setPixmap(0, pix); 00403 00404 m_entries.append(entry); 00405 00406 kdDebug() << "added entry " << entry->name() << endl; 00407 } 00408 00409 void DownloadDialog::slotData(KIO::Job *job, const QByteArray &a) 00410 { 00411 QCString tmp(a, a.size() + 1); 00412 m_data[job].append(QString::fromUtf8(tmp)); 00413 } 00414 00415 void DownloadDialog::slotDetails() 00416 { 00417 Entry *e = getEntry(); 00418 if(!e) return; 00419 00420 QString lang = KGlobal::locale()->language(); 00421 00422 QString info = i18n 00423 ( 00424 "Name: %1\n" 00425 "Author: %2\n" 00426 "License: %3\n" 00427 "Version: %4\n" 00428 "Release: %5\n" 00429 "Rating: %6\n" 00430 "Downloads: %7\n" 00431 "Release date: %8\n" 00432 "Summary: %9\n" 00433 ).arg(e->name() 00434 ).arg(e->author() 00435 ).arg(e->license() 00436 ).arg(e->version() 00437 ).arg(e->release() 00438 ).arg(e->rating() 00439 ).arg(e->downloads() 00440 ).arg(KGlobal::locale()->formatDate(e->releaseDate()) 00441 ).arg(e->summary(lang) 00442 ); 00443 00444 info.append(i18n 00445 ( 00446 "Preview: %1\n" 00447 "Payload: %2\n" 00448 ).arg(e->preview().url() 00449 ).arg(e->payload().url() 00450 )); 00451 00452 KMessageBox::information(this, info, i18n("Details")); 00453 } 00454 00455 void DownloadDialog::slotInstall() 00456 { 00457 Entry *e = getEntry(); 00458 if(!e) return; 00459 00460 kdDebug() << "download entry now" << endl; 00461 00462 if(m_engine) 00463 { 00464 m_engine->download(e); 00465 install(e); 00466 } 00467 else 00468 { 00469 m_s = new KNewStuffGeneric(e->type(), this); 00470 00471 m_entry = e; 00472 00473 KURL source = e->payload(); 00474 KURL dest = KURL(m_s->downloadDestination(e)); 00475 00476 KIO::FileCopyJob *job = KIO::file_copy(source, dest, -1, true); 00477 connect(job, SIGNAL(result(KIO::Job*)), SLOT(slotInstalled(KIO::Job*))); 00478 } 00479 } 00480 00481 void DownloadDialog::install(Entry *e) 00482 { 00483 kapp->config()->setGroup("KNewStuffStatus"); 00484 kapp->config()->writeEntry(m_entryname, e->releaseDate().toString(Qt::ISODate)); 00485 kapp->config()->sync(); 00486 00487 QPixmap pix = KGlobal::iconLoader()->loadIcon("ok", KIcon::Small); 00488 m_entryitem = lv_r->findItem(m_entryname, 0); 00489 if(m_entryitem) m_entryitem->setPixmap(0, pix); 00490 m_entryitem = lv_d->findItem(m_entryname, 0); 00491 if(m_entryitem) m_entryitem->setPixmap(0, pix); 00492 m_entryitem = lv_l->findItem(m_entryname, 0); 00493 if(m_entryitem) m_entryitem->setPixmap(0, pix); 00494 00495 00496 QPushButton *in; 00497 in = *(m_buttons[d->m_page]->at(0)); 00498 if(in) in->setEnabled(false); 00499 } 00500 00501 void DownloadDialog::slotInstalled(KIO::Job *job) 00502 { 00503 bool ret = (job->error() == 0); 00504 KIO::FileCopyJob *cjob; 00505 00506 if(ret) 00507 { 00508 cjob = static_cast<KIO::FileCopyJob*>(job); 00509 if(cjob) 00510 { 00511 ret = m_s->install(cjob->destURL().path()); 00512 } 00513 else ret = false; 00514 } 00515 00516 if(ret) 00517 { 00518 install(m_entry); 00519 00520 KMessageBox::information(this, i18n("Installation successful."), i18n("Installation")); 00521 } 00522 else KMessageBox::error(this, i18n("Installation failed."), i18n("Installation")); 00523 00524 delete m_s; 00525 } 00526 00527 void DownloadDialog::slotTab(int tab) 00528 { 00529 kdDebug() << "switch tab to: " << tab << endl; 00530 m_curtab = tab; 00531 } 00532 00533 void DownloadDialog::slotSelected() 00534 { 00535 QString tmp; 00536 bool enabled; 00537 Entry *e = getEntry(); 00538 QString lang = KGlobal::locale()->language(); 00539 00540 if(e) 00541 { 00542 if(!e->preview(lang).isValid()) 00543 { 00544 m_rt->setText(QString("<b>%1</b><br>%2<br>%3<br><br><i>%4</i><br>(%5)").arg( 00545 e->name()).arg(e->author()).arg(KGlobal::locale()->formatDate(e->releaseDate())).arg(e->summary(lang)).arg(e->license())); 00546 } 00547 else 00548 { 00549 KIO::NetAccess::download(e->preview(lang), tmp, this); 00550 m_rt->setText(QString("<b>%1</b><br>%2<br>%3<br><br><img src='%4'><br><i>%5</i><br>(%6)").arg( 00551 e->name()).arg(e->author()).arg(KGlobal::locale()->formatDate(e->releaseDate())).arg(tmp).arg(e->summary(lang)).arg(e->license())); 00552 } 00553 00554 if(installStatus(e) == 1) enabled = false; 00555 else enabled = true; 00556 00557 QPushButton *de, *in; 00558 in = *(m_buttons[d->m_page]->at(0)); 00559 de = *(m_buttons[d->m_page]->at(1)); 00560 if(in) in->setEnabled(enabled); 00561 if(de) de->setEnabled(true); 00562 } 00563 } 00564 00565 Entry *DownloadDialog::getEntry() 00566 { 00567 if(m_curtab == 0) m_entryitem = lv_r->currentItem(); 00568 else if(m_curtab == 1) m_entryitem = lv_d->currentItem(); 00569 else if(m_curtab == 2) m_entryitem = lv_l->currentItem(); 00570 else return 0; 00571 00572 m_entryname = m_entryitem->text(0); 00573 00574 for(Entry *e = m_entries.first(); e; e = m_entries.next()) 00575 { 00576 if(e->name() == m_entryname) return e; 00577 } 00578 00579 return 0; 00580 } 00581 00582 void DownloadDialog::slotPage(QWidget *w) 00583 { 00584 Provider *p; 00585 00586 kdDebug() << "changed widget!!!" << endl; 00587 00588 if(m_map.find(w) == m_map.end()) return; 00589 00590 d->m_page = w; 00591 00592 lv_r = *(m_map[w]->at(0)); 00593 lv_d = *(m_map[w]->at(1)); 00594 lv_l = *(m_map[w]->at(2)); 00595 p = m_providers[w]; 00596 m_rt = m_rts[w]; 00597 00598 kdDebug() << "valid change!!!; lv_r = " << lv_r << endl; 00599 00600 if(m_engine) return; 00601 00602 if(!m_filter.isEmpty()) return; 00603 00604 lv_r->clear(); 00605 lv_d->clear(); 00606 lv_l->clear(); 00607 00608 kdDebug() << "-- fetch -- " << p->downloadUrl() << endl; 00609 00610 loadProvider(p); 00611 } 00612 00613 void DownloadDialog::loadProvider(Provider *p) 00614 { 00615 KIO::TransferJob *job = KIO::get(p->downloadUrl()); 00616 00617 m_jobs[job] = p; 00618 00619 connect(job, SIGNAL(result(KIO::Job*)), SLOT(slotResult(KIO::Job*))); 00620 connect(job, SIGNAL(data(KIO::Job*, const QByteArray&)), 00621 SLOT(slotData(KIO::Job*, const QByteArray&))); 00622 } 00623 00624 void DownloadDialog::setType(QString type) 00625 { 00626 m_filter = type; 00627 } 00628 00629 void DownloadDialog::setProviderList(const QString& providerList) 00630 { 00631 d->m_providerlist = providerList; 00632 } 00633 00634 void DownloadDialog::slotOk() 00635 { 00636 } 00637 00638 void DownloadDialog::slotApply() 00639 { 00640 } 00641 00642 void DownloadDialog::open(const QString& type, const QString& caption) 00643 { 00644 DownloadDialog d(0, caption); 00645 d.setType(type); 00646 d.load(); 00647 d.exec(); 00648 } 00649 00650 void DownloadDialog::slotFinish() 00651 { 00652 showPage(1); 00653 //updateBackground(); 00654 } 00655
KDE Logo
This file is part of the documentation for knewstuff Library Version 3.4.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Apr 12 23:22:20 2005 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003