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 DownloadDialog::DownloadDialog(Engine *engine, QWidget *) 00050 : KDialogBase(KDialogBase::IconList, i18n("Get Hot New Stuff"), 00051 KDialogBase::Close, KDialogBase::Close) 00052 { 00053 init(engine); 00054 } 00055 00056 DownloadDialog::DownloadDialog(QWidget *) 00057 : KDialogBase(KDialogBase::IconList, i18n("Get Hot New Stuff"), 00058 KDialogBase::Close, KDialogBase::Close) 00059 { 00060 init(0); 00061 } 00062 00063 void DownloadDialog::init(Engine *engine) 00064 { 00065 resize(700, 400); 00066 00067 m_engine = engine; 00068 m_page = NULL; 00069 00070 connect(this, SIGNAL(aboutToShowPage(QWidget*)), SLOT(slotPage(QWidget*))); 00071 00072 if(!engine) 00073 { 00074 m_loader = new ProviderLoader(this); 00075 connect(m_loader, SIGNAL(providersLoaded(Provider::List*)), SLOT(slotProviders(Provider::List*))); 00076 } 00077 } 00078 00079 DownloadDialog::~DownloadDialog() 00080 { 00081 } 00082 00083 void DownloadDialog::load() 00084 { 00085 m_loader->load(m_filter); 00086 } 00087 00088 void DownloadDialog::clear() 00089 { 00090 QMap<QWidget*, QValueList<KListView*>* >::Iterator it; 00091 for(it = m_map.begin(); it != m_map.end(); it++) 00092 { 00093 QValueList<KListView*> *v = it.data(); 00094 kdDebug() << "clear listviews in " << v << endl; 00095 if(v) 00096 { 00097 (*(v->at(0)))->clear(); 00098 (*(v->at(1)))->clear(); 00099 (*(v->at(2)))->clear(); 00100 00101 //delete (*it); 00102 } 00103 00104 delete it.key(); 00105 } 00106 m_map.clear(); 00107 } 00108 00109 void DownloadDialog::slotProviders(Provider::List *list) 00110 { 00111 Provider *p; 00112 /*QFrame *frame;*/ 00113 00114 for(p = list->first(); p; p = list->next()) 00115 { 00116 kdDebug() << "++ provider ++ " << p->name() << endl; 00117 00118 if(!m_filter.isEmpty()) 00119 loadProvider(p); 00120 else 00121 addProvider(p); 00122 /*if(p == list->getFirst()) 00123 slotPage(m_frame);*/ // only if !qtbug 00124 } 00125 } 00126 00127 void DownloadDialog::addProvider(Provider *p) 00128 { 00129 QFrame *frame; 00130 KTabCtl *ctl; 00131 QWidget *w_d, *w_r, *w_l; 00132 QWidget *w2; 00133 KListView *lvtmp_r, *lvtmp_d, *lvtmp_l; 00134 QTextBrowser *rt; 00135 QString tmp; 00136 00137 if(m_map.count() == 0) 00138 { 00139 frame = addPage(i18n("Welcome"), i18n("Welcome"), QPixmap("")); 00140 delete frame; 00141 } 00142 00143 kdDebug() << "addProvider()/begin" << endl; 00144 00145 KIO::NetAccess::download(p->icon(), tmp, this); 00146 frame = addPage(p->name(), p->name(), QPixmap(tmp)); 00147 m_frame = frame; 00148 00149 w2 = new QWidget(frame); 00150 w_d = new QWidget(frame); 00151 w_r = new QWidget(frame); 00152 w_l = new QWidget(frame); 00153 00154 ctl = new KTabCtl(frame); 00155 ctl->addTab(w_r, i18n("Highest Rated")); 00156 ctl->addTab(w_d, i18n("Most Downloads")); 00157 ctl->addTab(w_l, i18n("Latest")); 00158 00159 m_curtab = 0; 00160 connect(ctl, SIGNAL(tabSelected(int)), SLOT(slotTab(int))); 00161 00162 QHBoxLayout *box = new QHBoxLayout(frame); 00163 box->add(ctl); 00164 00165 lvtmp_r = new KListView(w_r); 00166 lvtmp_r->addColumn(i18n("Name")); 00167 lvtmp_r->addColumn(i18n("Version")); 00168 lvtmp_r->addColumn(i18n("Rating")); 00169 lvtmp_r->setSorting(2, false); 00170 00171 lvtmp_d = new KListView(w_d); 00172 lvtmp_d->addColumn(i18n("Name")); 00173 lvtmp_d->addColumn(i18n("Version")); 00174 lvtmp_d->addColumn(i18n("Downloads")); 00175 lvtmp_d->setSorting(2, false); 00176 00177 lvtmp_l = new KListView(w_l); 00178 lvtmp_l->addColumn(i18n("Name")); 00179 lvtmp_l->addColumn(i18n("Version")); 00180 lvtmp_l->addColumn(i18n("Release Date")); 00181 lvtmp_l->setSorting(2, false); 00182 00183 connect(lvtmp_r, SIGNAL(selectionChanged()), SLOT(slotSelected())); 00184 connect(lvtmp_d, SIGNAL(selectionChanged()), SLOT(slotSelected())); 00185 connect(lvtmp_l, SIGNAL(selectionChanged()), SLOT(slotSelected())); 00186 00187 rt = new QTextBrowser(frame); 00188 rt->setMinimumWidth(150); 00189 00190 QPushButton *in = new QPushButton(i18n("Install"), frame); 00191 QPushButton *de = new QPushButton(i18n("Details"), frame); 00192 in->setEnabled(false); 00193 de->setEnabled(false); 00194 00195 box->addSpacing(spacingHint()); 00196 QVBoxLayout *vbox = new QVBoxLayout(box); 00197 vbox->add(rt); 00198 vbox->addSpacing(spacingHint()); 00199 vbox->add(de); 00200 vbox->add(in); 00201 00202 connect(in, SIGNAL(clicked()), SLOT(slotInstall())); 00203 connect(de, SIGNAL(clicked()), SLOT(slotDetails())); 00204 00205 QVBoxLayout *box2 = new QVBoxLayout(w_r); 00206 box2->add(lvtmp_r); 00207 QVBoxLayout *box3 = new QVBoxLayout(w_d); 00208 box3->add(lvtmp_d); 00209 QVBoxLayout *box4 = new QVBoxLayout(w_l); 00210 box4->add(lvtmp_l); 00211 00212 QValueList<KListView*> *v = new QValueList<KListView*>; 00213 *v << lvtmp_r << lvtmp_d << lvtmp_l; 00214 m_map[frame] = v; 00215 m_rts[frame] = rt; 00216 QValueList<QPushButton*> *vb = new QValueList<QPushButton*>; 00217 *vb << in << de; 00218 m_buttons[frame] = vb; 00219 m_providers[frame] = p; 00220 00221 kdDebug() << "addProvider()/end; lvtmp_r = " << lvtmp_r << endl; 00222 00223 if(m_engine) slotPage(frame); 00224 00225 QTimer::singleShot(100, this, SLOT(slotFinish())); 00226 } 00227 00228 void DownloadDialog::slotResult(KIO::Job *job) 00229 { 00230 QDomDocument dom; 00231 QDomElement knewstuff; 00232 00233 kdDebug() << "got data: " << m_data[job] << endl; 00234 00235 kapp->config()->setGroup("KNewStuffStatus"); 00236 00237 dom.setContent(m_data[job]); 00238 knewstuff = dom.documentElement(); 00239 00240 for(QDomNode pn = knewstuff.firstChild(); !pn.isNull(); pn = pn.nextSibling()) 00241 { 00242 QDomElement stuff = pn.toElement(); 00243 00244 kdDebug() << "element: " << stuff.tagName() << endl; 00245 00246 if(stuff.tagName() == "stuff") 00247 { 00248 Entry *entry = new Entry(stuff); 00249 kdDebug() << "TYPE::" << entry->type() << " FILTER::" << m_filter << endl; 00250 if(!entry->type().isEmpty()) 00251 { 00252 if((!m_filter.isEmpty()) && (entry->type() != m_filter)) continue; 00253 } 00254 00255 if((!m_filter.isEmpty()) && (m_jobs[job])) 00256 { 00257 Provider *p = m_jobs[job]; 00258 addProvider(p); 00259 slotPage(m_frame); 00260 m_jobs[job] = 0; 00261 } 00262 addEntry(entry); 00263 } 00264 } 00265 00266 m_data[job] = ""; 00267 } 00268 00269 int DownloadDialog::installStatus(Entry *entry) 00270 { 00271 QDate date; 00272 int installed; 00273 00274 kapp->config()->setGroup("KNewStuffStatus"); 00275 date = QDate::fromString(kapp->config()->readEntry(entry->name())); 00276 if(!date.isValid()) installed = 0; 00277 else if(date < entry->releaseDate()) installed = -1; 00278 else installed = 1; 00279 00280 return installed; 00281 } 00282 00283 void DownloadDialog::addEntry(Entry *entry) 00284 { 00285 QPixmap pix; 00286 int installed; 00287 00288 /*if(m_engine) 00289 { 00290 if(m_map.count() == 0) 00291 { 00292 m_frame = addPage(i18n("Welcome"), i18n("Welcome"), QPixmap("")); 00293 Provider *p = new Provider(); 00294 p->setName(i18n("Generic")); 00295 addProvider(p); 00296 slotPage(m_frame); 00297 } 00298 }*/ 00299 installed = installStatus(entry); 00300 00301 if(installed > 0) pix = KGlobal::iconLoader()->loadIcon("ok", KIcon::Small); 00302 else if(installed < 0) pix = KGlobal::iconLoader()->loadIcon("history", KIcon::Small); 00303 else pix = QPixmap(); 00304 00305 KListViewItem *tmp_r = new KListViewItem(lv_r, 00306 entry->name(), entry->version(), QString("%1").arg(entry->rating())); 00307 KListViewItem *tmp_d = new KListViewItem(lv_d, 00308 entry->name(), entry->version(), QString("%1").arg(entry->downloads())); 00309 KListViewItem *tmp_l = new KListViewItem(lv_l, 00310 entry->name(), entry->version(), entry->releaseDate().toString()); 00311 00312 tmp_r->setPixmap(0, pix); 00313 tmp_d->setPixmap(0, pix); 00314 tmp_l->setPixmap(0, pix); 00315 00316 m_entries.append(entry); 00317 00318 kdDebug() << "added entry " << entry->name() << endl; 00319 } 00320 00321 void DownloadDialog::slotData(KIO::Job *job, const QByteArray &a) 00322 { 00323 QCString tmp(a, a.size() + 1); 00324 m_data[job].append(QString::fromUtf8(tmp)); 00325 } 00326 00327 void DownloadDialog::slotDetails() 00328 { 00329 Entry *e = getEntry(); 00330 if(!e) return; 00331 00332 QString lang = KGlobal::locale()->language(); 00333 00334 QString info = i18n 00335 ( 00336 "Name: %1\n" 00337 "Author: %2\n" 00338 "License: %3\n" 00339 "Version: %4\n" 00340 "Release: %5\n" 00341 "Rating: %6\n" 00342 "Downloads: %7\n" 00343 "Release date: %8\n" 00344 "Summary: %9\n" 00345 ).arg(e->name() 00346 ).arg(e->author() 00347 ).arg(e->license() 00348 ).arg(e->version() 00349 ).arg(e->release() 00350 ).arg(e->rating() 00351 ).arg(e->downloads() 00352 ).arg(e->releaseDate().toString() 00353 ).arg(e->summary(lang) 00354 ); 00355 00356 info.append(i18n 00357 ( 00358 "Preview: %1\n" 00359 "Payload: %2\n" 00360 ).arg(e->preview().url() 00361 ).arg(e->payload().url() 00362 )); 00363 00364 KMessageBox::information(this, info, i18n("Details")); 00365 } 00366 00367 void DownloadDialog::slotInstall() 00368 { 00369 Entry *e = getEntry(); 00370 if(!e) return; 00371 00372 kdDebug() << "download entry now" << endl; 00373 00374 if(m_engine) 00375 { 00376 m_engine->download(e); 00377 install(e); 00378 } 00379 else 00380 { 00381 m_s = new KNewStuffGeneric(e->type(), this); 00382 00383 m_entry = e; 00384 00385 KURL source = e->payload(); 00386 KURL dest = KURL(m_s->downloadDestination(e)); 00387 00388 KIO::FileCopyJob *job = KIO::file_copy(source, dest, -1, true); 00389 connect(job, SIGNAL(result(KIO::Job*)), SLOT(slotInstalled(KIO::Job*))); 00390 } 00391 } 00392 00393 void DownloadDialog::install(Entry *e) 00394 { 00395 kapp->config()->setGroup("KNewStuffStatus"); 00396 kapp->config()->writeEntry(m_entryname, e->releaseDate().toString()); 00397 kapp->config()->sync(); 00398 00399 QPixmap pix = KGlobal::iconLoader()->loadIcon("ok", KIcon::Small); 00400 m_entryitem = lv_r->findItem(m_entryname, 0); 00401 if(m_entryitem) m_entryitem->setPixmap(0, pix); 00402 m_entryitem = lv_d->findItem(m_entryname, 0); 00403 if(m_entryitem) m_entryitem->setPixmap(0, pix); 00404 m_entryitem = lv_l->findItem(m_entryname, 0); 00405 if(m_entryitem) m_entryitem->setPixmap(0, pix); 00406 00407 00408 QPushButton *de, *in; 00409 in = *(m_buttons[m_page]->at(0)); 00410 if(in) in->setEnabled(false); 00411 } 00412 00413 void DownloadDialog::slotInstalled(KIO::Job *job) 00414 { 00415 bool ret = (job->error() == 0); 00416 KIO::FileCopyJob *cjob; 00417 00418 if(ret) 00419 { 00420 cjob = static_cast<KIO::FileCopyJob*>(job); 00421 if(cjob) 00422 { 00423 ret = m_s->install(cjob->destURL().path()); 00424 } 00425 else ret = false; 00426 } 00427 00428 if(ret) 00429 { 00430 install(m_entry); 00431 00432 KMessageBox::information(this, i18n("Installation successful."), i18n("Installation")); 00433 } 00434 else KMessageBox::error(this, i18n("Installation failed."), i18n("Installation")); 00435 00436 delete m_s; 00437 } 00438 00439 void DownloadDialog::slotTab(int tab) 00440 { 00441 kdDebug() << "switch tab to: " << tab << endl; 00442 m_curtab = tab; 00443 } 00444 00445 void DownloadDialog::slotSelected() 00446 { 00447 QString tmp; 00448 bool enabled; 00449 Entry *e = getEntry(); 00450 QString lang = KGlobal::locale()->language(); 00451 00452 if(e) 00453 { 00454 if(!e->preview(lang).isValid()) 00455 { 00456 m_rt->setText(QString("<b>%1</b><br>%2<br>%3<br><br><i>%4</i><br>(%5)").arg( 00457 e->name()).arg(e->author()).arg(e->releaseDate().toString()).arg(e->summary(lang)).arg(e->license())); 00458 } 00459 else 00460 { 00461 KIO::NetAccess::download(e->preview(lang), tmp, this); 00462 m_rt->setText(QString("<b>%1</b><br>%2<br>%3<br><br><img src='%4'><br><i>%5</i><br>(%6)").arg( 00463 e->name()).arg(e->author()).arg(e->releaseDate().toString()).arg(tmp).arg(e->summary(lang)).arg(e->license())); 00464 } 00465 00466 if(installStatus(e) == 1) enabled = false; 00467 else enabled = true; 00468 00469 QPushButton *de, *in; 00470 in = *(m_buttons[m_page]->at(0)); 00471 de = *(m_buttons[m_page]->at(1)); 00472 if(in) in->setEnabled(enabled); 00473 if(de) de->setEnabled(true); 00474 } 00475 } 00476 00477 Entry *DownloadDialog::getEntry() 00478 { 00479 if(m_curtab == 0) m_entryitem = lv_r->currentItem(); 00480 else if(m_curtab == 1) m_entryitem = lv_d->currentItem(); 00481 else if(m_curtab == 2) m_entryitem = lv_l->currentItem(); 00482 else return 0; 00483 00484 m_entryname = m_entryitem->text(0); 00485 00486 for(Entry *e = m_entries.first(); e; e = m_entries.next()) 00487 { 00488 if(e->name() == m_entryname) return e; 00489 } 00490 00491 return 0; 00492 } 00493 00494 void DownloadDialog::slotPage(QWidget *w) 00495 { 00496 Provider *p; 00497 00498 kdDebug() << "changed widget!!!" << endl; 00499 00500 if(m_map.find(w) == m_map.end()) return; 00501 00502 m_page = w; 00503 00504 lv_r = *(m_map[w]->at(0)); 00505 lv_d = *(m_map[w]->at(1)); 00506 lv_l = *(m_map[w]->at(2)); 00507 p = m_providers[w]; 00508 m_rt = m_rts[w]; 00509 00510 kdDebug() << "valid change!!!; lv_r = " << lv_r << endl; 00511 00512 if(m_engine) return; 00513 00514 if(!m_filter.isEmpty()) return; 00515 00516 lv_r->clear(); 00517 lv_d->clear(); 00518 lv_l->clear(); 00519 00520 kdDebug() << "-- fetch -- " << p->downloadUrl() << endl; 00521 00522 loadProvider(p); 00523 } 00524 00525 void DownloadDialog::loadProvider(Provider *p) 00526 { 00527 KIO::TransferJob *job = KIO::get(p->downloadUrl()); 00528 00529 m_jobs[job] = p; 00530 00531 connect(job, SIGNAL(result(KIO::Job*)), SLOT(slotResult(KIO::Job*))); 00532 connect(job, SIGNAL(data(KIO::Job*, const QByteArray&)), 00533 SLOT(slotData(KIO::Job*, const QByteArray&))); 00534 } 00535 00536 void DownloadDialog::setType(QString type) 00537 { 00538 m_filter = type; 00539 } 00540 00541 void DownloadDialog::slotOk() 00542 { 00543 } 00544 00545 void DownloadDialog::slotApply() 00546 { 00547 } 00548 00549 void DownloadDialog::open(QString type) 00550 { 00551 DownloadDialog d; 00552 d.setType(type); 00553 d.load(); 00554 d.exec(); 00555 } 00556 00557 void DownloadDialog::slotFinish() 00558 { 00559 showPage(1); 00560 //updateBackground(); 00561 } 00562
KDE Logo
This file is part of the documentation for knewstuff Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Sep 29 09:41:21 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003