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.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sun Jan 15 13:33:44 2006 by doxygen 1.4.2 written by Dimitri van Heesch, © 1997-2003