00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "downloaddialog.h"
00023 #include "downloaddialog.moc"
00024
00025 #include <tdelocale.h>
00026 #include <tdelistview.h>
00027 #include <kdebug.h>
00028 #include <tdeio/job.h>
00029 #include <tdeio/netaccess.h>
00030 #include <tdemessagebox.h>
00031 #include <kurl.h>
00032 #include <tdeconfig.h>
00033 #include <tdeapplication.h>
00034 #include <kiconloader.h>
00035
00036 #include <tdenewstuff/entry.h>
00037 #include <tdenewstuff/knewstuffgeneric.h>
00038 #include <tdenewstuff/engine.h>
00039
00040 #include <tqlayout.h>
00041 #include <tqpushbutton.h>
00042 #include <tqdom.h>
00043 #include <tqlabel.h>
00044 #include <tqtextbrowser.h>
00045 #include <tqtabwidget.h>
00046 #include <tqtimer.h>
00047
00048 #define OPENDESKTOP_REDIRECT_URL "opendesktop.org/content/download.php?content="
00049 #define OPENDESKTOP_REDIRECT_TEXT "If the download does not start in 3 seconds:</span><span class=\"defaulttext\"> <a href=\""
00050
00051 using namespace KNS;
00052
00053 struct DownloadDialog::Private
00054 {
00055 TQString m_providerlist;
00056 TQWidget *m_page;
00057 TQFrame *m_loadingFrame;
00058 TQLabel *m_loadingLabel;
00059 TDEListView *m_lvtmp_r, *m_lvtmp_d, *m_lvtmp_l;
00060 TQPtrList<Entry> m_installlist;
00061 TQMap<TDEIO::Job*, Provider*> m_variantjobs;
00062 TQMap<TDEIO::Job*, TQStringList> m_variants;
00063 TQMap<Provider*, Provider*> m_newproviders;
00064 };
00065
00066 class NumSortListViewItem : public TDEListViewItem
00067 {
00068 public:
00069 NumSortListViewItem( TQListView * parent, TQString label1, TQString label2 = TQString::null, TQString label3 = TQString::null, TQString label4 = TQString::null, TQString label5 = TQString::null, TQString label6 = TQString::null, TQString label7 = TQString::null, TQString label8 = TQString::null ) :
00070 TDEListViewItem( parent, label1, label2, label3, label4, label5, label6, label7, label8 )
00071 {
00072 }
00073
00074 TQString key(int col, bool asc) const {
00075 if (col == 2)
00076 {
00077 TQString s;
00078 s.sprintf("%08d", text(col).toInt());
00079 return s;
00080 }
00081 return TDEListViewItem::key( col, asc );
00082 }
00083 };
00084
00085 class DateSortListViewItem : public TDEListViewItem
00086 {
00087 public:
00088 DateSortListViewItem( TQListView * parent, TQString label1, TQString label2 = TQString::null, TQString label3 = TQString::null, TQString label4 = TQString::null, TQString label5 = TQString::null, TQString label6 = TQString::null, TQString label7 = TQString::null, TQString label8 = TQString::null ) :
00089 TDEListViewItem( parent, label1, label2, label3, label4, label5, label6, label7, label8 )
00090 {
00091 }
00092
00093 TQString key(int col, bool asc) const {
00094 if (col == 2)
00095 {
00096 TQString s;
00097 TQDate date = TDEGlobal::locale()->readDate(text(col));
00098 s.sprintf("%08d", date.year() * 366 + date.dayOfYear());
00099 return s;
00100 }
00101 return TDEListViewItem::key( col, asc );
00102 }
00103 };
00104
00105
00106 DownloadDialog::DownloadDialog(Engine *engine, TQWidget *)
00107 : KDialogBase(KDialogBase::IconList, i18n("Get Hot New Stuff"),
00108 KDialogBase::Close, KDialogBase::Close)
00109 {
00110 init(engine);
00111 }
00112
00113 DownloadDialog::DownloadDialog(TQWidget *)
00114 : KDialogBase(KDialogBase::IconList, i18n("Get Hot New Stuff"),
00115 KDialogBase::Close, KDialogBase::Close)
00116 {
00117 init(0);
00118 }
00119
00120 void DownloadDialog::open(TQString type)
00121 {
00122 DownloadDialog d;
00123 d.setType(type);
00124 d.load();
00125 d.exec();
00126 }
00127
00128
00129 DownloadDialog::DownloadDialog(Engine *engine, TQWidget *, const TQString& caption)
00130 : KDialogBase(KDialogBase::IconList, (caption.isNull() ? i18n("Get Hot New Stuff") : caption),
00131 KDialogBase::Close, KDialogBase::Close)
00132 {
00133 init(engine);
00134 }
00135
00136 DownloadDialog::DownloadDialog(TQWidget *, const TQString& caption)
00137 : KDialogBase(KDialogBase::IconList, (caption.isNull() ? i18n("Get Hot New Stuff") : caption),
00138 KDialogBase::Close, KDialogBase::Close)
00139 {
00140 init(0);
00141 }
00142
00143 void DownloadDialog::init(Engine *engine)
00144 {
00145 resize(700, 400);
00146 d = new Private();
00147
00148 m_engine = engine;
00149 d->m_page = NULL;
00150
00151
00152 d->m_loadingFrame = addPage(i18n("Welcome"), i18n("Welcome"), TQPixmap(TQString("")));
00153 d->m_loadingLabel = new TQLabel(d->m_loadingFrame);
00154 d->m_loadingLabel->setText(i18n("Loading data providers..."));
00155 TQVBoxLayout *box = new TQVBoxLayout(d->m_loadingFrame);
00156 box->add(d->m_loadingLabel);
00157 box->addItem(new TQSpacerItem(0, 0, TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding));
00158
00159 connect(this, TQT_SIGNAL(aboutToShowPage(TQWidget*)), TQT_SLOT(slotPage(TQWidget*)));
00160
00161 if(!engine)
00162 {
00163 m_loader = new ProviderLoader(this);
00164 connect(m_loader, TQT_SIGNAL(providersLoaded(Provider::List*)), TQT_SLOT(slotProviders(Provider::List*)));
00165 }
00166
00167 m_entries.setAutoDelete(true);
00168 }
00169
00170 DownloadDialog::~DownloadDialog()
00171 {
00172 for (TQMap<TQWidget *, TQValueList<TQPushButton *>* >::const_iterator it = m_buttons.constBegin(); it != m_buttons.constEnd(); ++it)
00173 delete it.data();
00174 for (TQMap<TQWidget *, TQValueList<TDEListView *>* >::const_iterator it = m_map.constBegin(); it != m_map.constEnd(); ++it)
00175 delete it.data();
00176 delete d;
00177 }
00178
00179 void DownloadDialog::load()
00180 {
00181 m_loader->load(m_filter, d->m_providerlist);
00182 }
00183
00184 void DownloadDialog::load(TQString providerList)
00185 {
00186 m_loader->load(m_filter, providerList);
00187 }
00188
00189 void DownloadDialog::clear()
00190 {
00191 TQMap<TQWidget*, TQValueList<TDEListView*>* >::Iterator it;
00192 TQMap<TQWidget*, TQValueList<TDEListView*>* >::Iterator end(m_map.end());
00193 for(it = m_map.begin(); it != end; ++it)
00194 {
00195 TQValueList<TDEListView*> *v = it.data();
00196 kdDebug() << "clear listviews in " << v << endl;
00197 if(v)
00198 {
00199 (*(v->at(0)))->clear();
00200 (*(v->at(1)))->clear();
00201 (*(v->at(2)))->clear();
00202
00203
00204 }
00205
00206 delete it.key();
00207 }
00208 m_map.clear();
00209 }
00210
00211 void DownloadDialog::slotProviders(Provider::List *list)
00212 {
00213 d->m_loadingLabel->setText(i18n("Loading data listings..."));
00214
00215 Provider *p;
00216
00217
00218 for(p = list->first(); p; p = list->next())
00219 {
00220 kdDebug() << "++ provider ++ " << p->name() << endl;
00221
00222 if(!m_filter.isEmpty())
00223 loadProvider(p);
00224 else
00225 addProvider(p);
00226
00227
00228 }
00229 }
00230
00231 void DownloadDialog::addProvider(Provider *p)
00232 {
00233 TQFrame *frame;
00234 TQTabWidget *ctl;
00235 TQWidget *w_d, *w_r, *w_l;
00236 TQTextBrowser *rt;
00237 TQString tmp;
00238 int ret;
00239 TQPixmap pix;
00240
00241 kdDebug() << "addProvider()/begin" << endl;
00242
00243 ret = true;
00244 if(p->icon().path().isEmpty()) ret = false;
00245 else
00246 {
00247 if(!p->icon().protocol().isEmpty())
00248 {
00249 ret = TDEIO::NetAccess::download(p->icon(), tmp, this);
00250 if(ret) pix = TQPixmap(tmp);
00251 }
00252 else
00253 {
00254 pix = TDEGlobal::iconLoader()->loadIcon(p->icon().path(), TDEIcon::Panel);
00255 ret = true;
00256 }
00257 }
00258 if(!ret) pix = TDEGlobal::iconLoader()->loadIcon("knewstuff", TDEIcon::Panel);
00259 if (d->m_loadingFrame) {
00260 delete d->m_loadingFrame;
00261 d->m_loadingFrame = NULL;
00262 }
00263 frame = addPage(p->name(), p->name(), pix);
00264 m_frame = frame;
00265
00266 w_d = new TQWidget(frame);
00267 w_r = new TQWidget(frame);
00268 w_l = new TQWidget(frame);
00269
00270 ctl = new TQTabWidget(frame);
00271 ctl->addTab(w_r, i18n("Highest Rated"));
00272 ctl->addTab(w_d, i18n("Most Downloads"));
00273 ctl->addTab(w_l, i18n("Latest"));
00274
00275 m_curtab = 0;
00276 connect(ctl, TQT_SIGNAL(currentChanged(TQWidget *)), TQT_SLOT(slotTab()));
00277
00278 TQHBoxLayout *box = new TQHBoxLayout(frame);
00279 box->add(ctl);
00280
00281 d->m_lvtmp_r = new TDEListView(w_r);
00282 d->m_lvtmp_r->addColumn(i18n("Name"));
00283 d->m_lvtmp_r->addColumn(i18n("Version"));
00284 d->m_lvtmp_r->addColumn(i18n("Rating"));
00285 d->m_lvtmp_r->setSorting(2, false);
00286
00287 d->m_lvtmp_d = new TDEListView(w_d);
00288 d->m_lvtmp_d->addColumn(i18n("Name"));
00289 d->m_lvtmp_d->addColumn(i18n("Version"));
00290 d->m_lvtmp_d->addColumn(i18n("Downloads"));
00291 d->m_lvtmp_d->setSorting(2, false);
00292
00293 d->m_lvtmp_l = new TDEListView(w_l);
00294 d->m_lvtmp_l->addColumn(i18n("Name"));
00295 d->m_lvtmp_l->addColumn(i18n("Version"));
00296 d->m_lvtmp_l->addColumn(i18n("Release Date"));
00297 d->m_lvtmp_l->setSorting(2, false);
00298
00299 connect(d->m_lvtmp_r, TQT_SIGNAL(clicked(TQListViewItem*)), TQT_SLOT(slotSelected()));
00300 connect(d->m_lvtmp_d, TQT_SIGNAL(clicked(TQListViewItem*)), TQT_SLOT(slotSelected()));
00301 connect(d->m_lvtmp_l, TQT_SIGNAL(clicked(TQListViewItem*)), TQT_SLOT(slotSelected()));
00302
00303 rt = new TQTextBrowser(frame);
00304 rt->setMinimumWidth(150);
00305
00306 TQPushButton *in = new TQPushButton(i18n("Install"), frame);
00307 TQPushButton *de = new TQPushButton(i18n("Details"), frame);
00308 in->setEnabled(false);
00309 de->setEnabled(false);
00310
00311 box->addSpacing(spacingHint());
00312 TQVBoxLayout *vbox = new TQVBoxLayout(box);
00313 vbox->add(rt);
00314 vbox->addSpacing(spacingHint());
00315 vbox->add(de);
00316 vbox->add(in);
00317
00318 connect(rt, TQT_SIGNAL(linkClicked(const TQString&)), TQT_SLOT(slotEmail(const TQString&)));
00319
00320 connect(in, TQT_SIGNAL(clicked()), TQT_SLOT(slotInstall()));
00321 connect(de, TQT_SIGNAL(clicked()), TQT_SLOT(slotDetails()));
00322
00323 TQVBoxLayout *box2 = new TQVBoxLayout(w_r);
00324 box2->add(d->m_lvtmp_r);
00325 TQVBoxLayout *box3 = new TQVBoxLayout(w_d);
00326 box3->add(d->m_lvtmp_d);
00327 TQVBoxLayout *box4 = new TQVBoxLayout(w_l);
00328 box4->add(d->m_lvtmp_l);
00329
00330 TQValueList<TDEListView*> *v = new TQValueList<TDEListView*>;
00331 *v << d->m_lvtmp_r << d->m_lvtmp_d << d->m_lvtmp_l;
00332 m_map[frame] = v;
00333 m_rts[frame] = rt;
00334 TQValueList<TQPushButton*> *vb = new TQValueList<TQPushButton*>;
00335 *vb << in << de;
00336 m_buttons[frame] = vb;
00337 m_providers[frame] = p;
00338
00339 kdDebug() << "addProvider()/end; d->m_lvtmp_r = " << d->m_lvtmp_r << endl;
00340
00341 if(m_engine) slotPage(frame);
00342
00343 TQTimer::singleShot(100, this, TQT_SLOT(slotFinish()));
00344 }
00345
00346 void DownloadDialog::slotResult(TDEIO::Job *job)
00347 {
00348 TQDomDocument dom;
00349 TQDomElement knewstuff;
00350 TQDomElement content;
00351
00352 kdDebug() << "got data: " << m_data[job] << endl;
00353
00354 kapp->config()->setGroup("TDENewStuffStatus");
00355
00356 dom.setContent(m_data[job]);
00357 knewstuff = dom.documentElement();
00358
00359 for(TQDomNode pn = knewstuff.firstChild(); !pn.isNull(); pn = pn.nextSibling())
00360 {
00361 TQDomElement stuff = pn.toElement();
00362
00363 if(stuff.tagName() == "data")
00364 {
00365 content = pn.toElement();
00366 }
00367 }
00368
00369 for(TQDomNode pn = content.firstChild(); !pn.isNull(); pn = pn.nextSibling())
00370 {
00371 TQDomElement stuff = pn.toElement();
00372
00373 kdDebug() << "element: " << stuff.tagName() << endl;
00374
00375 if(stuff.tagName() == "content")
00376 {
00377 Entry *entry = new Entry(stuff);
00378 kdDebug() << "TYPE::" << entry->type() << " FILTER::" << m_filter << endl;
00379 if(!entry->type().isEmpty())
00380 {
00381 if((!m_filter.isEmpty()) && (entry->type() != m_filter)) continue;
00382 }
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394 if((!m_filter.isEmpty()) && (d->m_variantjobs[job]))
00395 {
00396 Provider *p = d->m_variantjobs[job];
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408 if(d->m_newproviders[p])
00409 {
00410 addProvider(p);
00411 slotPage(m_frame);
00412 d->m_newproviders[p] = 0;
00413 }
00414 }
00415
00416
00417
00418 if(d->m_variantjobs[job]) {
00419 addEntry(entry, d->m_variants[job]);
00420 }
00421 }
00422 }
00423
00424 if(d->m_variantjobs[job]) {
00425 d->m_variantjobs.remove(job);
00426 }
00427 }
00428
00429 int DownloadDialog::installStatus(Entry *entry)
00430 {
00431 TQDate date;
00432 TQString datestring;
00433 int installed;
00434
00435 TQString lang = TDEGlobal::locale()->language();
00436
00437 kapp->config()->setGroup("TDENewStuffStatus");
00438 datestring = kapp->config()->readEntry(entry->name(lang));
00439 if(datestring.isNull()) installed = 0;
00440 else
00441 {
00442 date = TQT_TQDATE_OBJECT(TQDate::fromString(datestring, Qt::ISODate));
00443 if(!date.isValid()) installed = 0;
00444 else if(date < entry->releaseDate()) installed = -1;
00445 else installed = 1;
00446 }
00447
00448 return installed;
00449 }
00450
00451 void DownloadDialog::addEntry(Entry *entry, const TQStringList& variants)
00452 {
00453 TQPixmap pix;
00454 int installed;
00455
00456 installed = installStatus(entry);
00457
00458 if(installed > 0) pix = TDEGlobal::iconLoader()->loadIcon("ok", TDEIcon::Small);
00459 else if(installed < 0) pix = TDEGlobal::iconLoader()->loadIcon("history", TDEIcon::Small);
00460 else pix = TQPixmap();
00461
00462 TQString lang = TDEGlobal::locale()->language();
00463
00464 if(variants.contains("score"))
00465 {
00466 TDEListViewItem *tmp_r = new NumSortListViewItem(lv_r,
00467 entry->name(lang), entry->version(), TQString("%1").arg(entry->rating()));
00468 tmp_r->setPixmap(0, pix);
00469 }
00470 if(variants.contains("downloads"))
00471 {
00472 TDEListViewItem *tmp_d = new NumSortListViewItem(lv_d,
00473 entry->name(lang), entry->version(), TQString("%1").arg(entry->downloads()));
00474 tmp_d->setPixmap(0, pix);
00475 }
00476 if(variants.contains("latest"))
00477 {
00478 TDEListViewItem *tmp_l = new DateSortListViewItem(lv_l,
00479 entry->name(lang), entry->version(), TDEGlobal::locale()->formatDate(entry->releaseDate()));
00480 tmp_l->setPixmap(0, pix);
00481 }
00482
00483 m_entries.append(entry);
00484
00485 kdDebug() << "added entry " << entry->name() << " for variants " << variants << endl;
00486 }
00487
00488 void DownloadDialog::addEntry(Entry *entry)
00489 {
00490 TQStringList variants;
00491
00492 variants << "score";
00493 variants << "downloads";
00494 variants << "latest";
00495
00496 addEntry(entry, variants);
00497
00498
00499 kdDebug() << "added entry " << entry->name() << endl;
00500 }
00501
00502 void DownloadDialog::slotData(TDEIO::Job *job, const TQByteArray &a)
00503 {
00504 TQCString tmp(a, a.size() + 1);
00505 m_data[job].append(TQString::fromUtf8(tmp));
00506 }
00507
00508 void DownloadDialog::slotDetails()
00509 {
00510 Entry *e = getEntry();
00511 if(!e) return;
00512
00513 TQString lang = TDEGlobal::locale()->language();
00514
00515 TQString info = i18n
00516 (
00517 "Name: %1\n"
00518 "Author: %2\n"
00519 "License: %3\n"
00520 "Version: %4\n"
00521 "Release: %5\n"
00522 "Rating: %6\n"
00523 "Downloads: %7\n"
00524 "Release date: %8\n"
00525 "Summary: %9\n"
00526 ).arg(e->name(lang)
00527 ).arg(e->author()
00528 ).arg(e->license()
00529 ).arg(e->version()
00530 ).arg(e->release()
00531 ).arg(e->rating()
00532 ).arg(e->downloads()
00533 ).arg(TDEGlobal::locale()->formatDate(e->releaseDate())
00534 ).arg(e->summary(lang)
00535 );
00536
00537 info.append(i18n
00538 (
00539 "Preview: %1\n"
00540 "Payload: %2\n"
00541 ).arg(e->preview().url()
00542 ).arg(e->payload().url()
00543 ));
00544
00545 KMessageBox::information(this, info, i18n("Details"));
00546 }
00547
00548 TQListViewItem *DownloadDialog::currentEntryItem()
00549 {
00550 if((m_curtab == 0) && (lv_r->selectedItem())) return lv_r->selectedItem();
00551 if((m_curtab == 1) && (lv_d->selectedItem())) return lv_d->selectedItem();
00552 if((m_curtab == 2) && (lv_l->selectedItem())) return lv_l->selectedItem();
00553
00554 return 0;
00555 }
00556
00557 void DownloadDialog::slotInstall()
00558 {
00559 Entry *e = getEntry();
00560 if(!e) return;
00561
00562 TQPushButton *de, *in;
00563 in = *(m_buttons[d->m_page]->at(0));
00564 de = *(m_buttons[d->m_page]->at(1));
00565
00566 if(in) in->setEnabled(false);
00567 if(de) de->setEnabled(false);
00568
00569 d->m_lvtmp_r->setEnabled( false );
00570 d->m_lvtmp_l->setEnabled( false );
00571 d->m_lvtmp_d->setEnabled( false );
00572
00573 kdDebug() << "download entry now" << endl;
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584 if (e->payload().url().contains(OPENDESKTOP_REDIRECT_URL)) {
00585 TDEIO::TransferJob *job = TDEIO::get( KURL( e->payload() ), false, false );
00586 connect( job, TQT_SIGNAL( result( TDEIO::Job * ) ),
00587 TQT_SLOT( slotJobResult( TDEIO::Job * ) ) );
00588 connect( job, TQT_SIGNAL( data( TDEIO::Job *, const TQByteArray & ) ),
00589 TQT_SLOT( slotJobData( TDEIO::Job *, const TQByteArray & ) ) );
00590 }
00591 else {
00592 slotInstallPhase2();
00593 }
00594 }
00595
00596 void DownloadDialog::slotInstallPhase2()
00597 {
00598 Entry *e = getEntry();
00599 if(!e) return;
00600
00601 m_entryitem = currentEntryItem();
00602 m_entryname = m_entryitem->text(0);
00603
00604 kdDebug() << "download entry now (phase 2)" << endl;
00605
00606 if(m_engine)
00607 {
00608 m_engine->download(e);
00609 install(e);
00610 }
00611 else
00612 {
00613 m_s = new TDENewStuffGeneric(m_filter, this);
00614 m_entry = e;
00615 KURL source = e->payload();
00616 KURL dest = KURL(m_s->downloadDestination(e));
00617
00618 TDEIO::FileCopyJob *job = TDEIO::file_copy(source, dest, -1, true);
00619 connect(job, TQT_SIGNAL(result(TDEIO::Job*)), TQT_SLOT(slotInstalled(TDEIO::Job*)));
00620 }
00621 }
00622
00623 void DownloadDialog::slotJobData( TDEIO::Job *, const TQByteArray &data )
00624 {
00625 kdDebug() << "DownloadDialog::slotJobData()" << endl;
00626
00627 if ( data.size() == 0 ) return;
00628
00629 TQCString str( data, data.size() + 1 );
00630
00631 mJobData.append( TQString::fromUtf8( str ) );
00632 }
00633
00634 void DownloadDialog::slotJobResult( TDEIO::Job *job )
00635 {
00636 if ( job->error() ) {
00637 job->showErrorDialog( this );
00638 return;
00639 }
00640
00641 Entry *e = getEntry();
00642 if(!e) return;
00643
00644
00645 if (e->payload().url().contains(OPENDESKTOP_REDIRECT_URL)) {
00646 int pos = mJobData.find("<a href=\"/CONTENT/content-files/");
00647 if (pos >= 0) {
00648 TQString realURL = mJobData.mid(pos);
00649 realURL = realURL.mid(0, realURL.find("\">"));
00650 realURL = realURL.mid(strlen("<a href=\""));
00651 realURL = e->payload().protocol() + "://opendesktop.org" + realURL;
00652 e->setPayload(realURL);
00653 }
00654 else if ((pos = mJobData.find(OPENDESKTOP_REDIRECT_TEXT)) > 0) {
00655 pos = pos + strlen(OPENDESKTOP_REDIRECT_TEXT);
00656 TQString realURL = mJobData.mid(pos);
00657 realURL = realURL.mid(0, realURL.find("\">"));
00658 e->setPayload(realURL);
00659 }
00660 }
00661
00662
00663 mJobData = TQString::null;
00664
00665 slotInstallPhase2();
00666 }
00667
00668 void DownloadDialog::install(Entry *e)
00669 {
00670 kapp->config()->setGroup("TDENewStuffStatus");
00671 kapp->config()->writeEntry(m_entryname, TQString(e->releaseDate().toString(Qt::ISODate)));
00672 kapp->config()->sync();
00673
00674 TQPixmap pix = TDEGlobal::iconLoader()->loadIcon("ok", TDEIcon::Small);
00675
00676 TQString lang = TDEGlobal::locale()->language();
00677
00678 if(m_entryitem)
00679 {
00680 m_entryitem->setPixmap(0, pix);
00681
00682 TQListViewItem *item;
00683 item = lv_r->findItem(e->name(lang), 0);
00684 if(item) item->setPixmap(0, pix);
00685 item = lv_d->findItem(e->name(lang), 0);
00686 if(item) item->setPixmap(0, pix);
00687 item = lv_l->findItem(e->name(lang), 0);
00688 if(item) item->setPixmap(0, pix);
00689 }
00690
00691 if(currentEntryItem() == m_entryitem)
00692 {
00693 TQPushButton *in;
00694 in = *(m_buttons[d->m_page]->at(0));
00695 if(in) in->setEnabled(false);
00696 }
00697
00698 d->m_installlist.append(e);
00699 d->m_lvtmp_r->setEnabled( true );
00700 d->m_lvtmp_l->setEnabled( true );
00701 d->m_lvtmp_d->setEnabled( true );
00702 }
00703
00704 void DownloadDialog::slotInstalled(TDEIO::Job *job)
00705 {
00706 TQPushButton *de, *in;
00707 in = *(m_buttons[d->m_page]->at(0));
00708 de = *(m_buttons[d->m_page]->at(1));
00709
00710 if(in) in->setEnabled(true);
00711 if(de) de->setEnabled(true);
00712
00713 bool ret = job && (job->error() == 0);
00714 if(ret)
00715 {
00716 TDEIO::FileCopyJob *cjob = ::tqqt_cast<TDEIO::FileCopyJob*>(job);
00717 if(cjob)
00718 {
00719 ret = m_s->install(cjob->destURL().path());
00720 }
00721 else ret = false;
00722 }
00723
00724 if(ret)
00725 {
00726 install(m_entry);
00727
00728 KMessageBox::information(this, i18n("Installation successful."), i18n("Installation"));
00729 }
00730 else KMessageBox::error(this, i18n("Installation failed."), i18n("Installation"));
00731 d->m_lvtmp_r->setEnabled( true );
00732 d->m_lvtmp_l->setEnabled( true );
00733 d->m_lvtmp_d->setEnabled( true );
00734
00735 delete m_s;
00736 }
00737
00738 void DownloadDialog::slotTab()
00739 {
00740 int tab = static_cast<const TQTabWidget *>(sender())->currentPageIndex();
00741 kdDebug() << "switch tab to: " << tab << endl;
00742
00743 Entry *eold = getEntry();
00744 m_curtab = tab;
00745 Entry *e = getEntry();
00746
00747 if(e == eold) return;
00748
00749 if(e)
00750 {
00751 slotSelected();
00752 }
00753 else
00754 {
00755 TQPushButton *de, *in;
00756 in = *(m_buttons[d->m_page]->at(0));
00757 de = *(m_buttons[d->m_page]->at(1));
00758
00759 if(in) in->setEnabled(false);
00760 if(de) de->setEnabled(false);
00761
00762 m_rt->clear();
00763 }
00764 }
00765
00766 void DownloadDialog::slotSelected()
00767 {
00768 TQString tmp;
00769 bool enabled;
00770 Entry *e = getEntry();
00771 TQString lang = TDEGlobal::locale()->language();
00772 bool ret;
00773
00774 if(e)
00775 {
00776 TQString lang = TDEGlobal::locale()->language();
00777
00778 TQListViewItem *item;
00779 if(m_curtab != 0)
00780 {
00781 lv_r->clearSelection();
00782 item = lv_r->findItem(e->name(lang), 0);
00783 if(item) lv_r->setSelected(item, true);
00784 }
00785 if(m_curtab != 1)
00786 {
00787 lv_d->clearSelection();
00788 item = lv_d->findItem(e->name(lang), 0);
00789 if(item) lv_d->setSelected(item, true);
00790 }
00791 if(m_curtab != 2)
00792 {
00793 lv_l->clearSelection();
00794 item = lv_l->findItem(e->name(lang), 0);
00795 if(item) lv_l->setSelected(item, true);
00796 }
00797
00798 if(!e->preview(lang).isValid())
00799 {
00800 ret = 0;
00801 }
00802 else
00803 {
00804 ret = TDEIO::NetAccess::download(e->preview(lang), tmp, this);
00805 }
00806
00807 TQString desc = TQString("<b>%1</b><br>").arg(e->name(lang));
00808 if(!e->authorEmail().isNull())
00809 {
00810 desc += TQString("<a href='mailto:" + e->authorEmail() + "'>" + e->author() + "</a>");
00811 }
00812 else
00813 {
00814 desc += TQString("%1").arg(e->author());
00815 }
00816 desc += TQString("<br>%1").arg(TDEGlobal::locale()->formatDate(e->releaseDate()));
00817 desc += TQString("<br><br>");
00818 if(ret)
00819 {
00820 desc += TQString("<img src='%1'>").arg(tmp);
00821 }
00822 else
00823 {
00824 desc += i18n("Preview not available.");
00825 }
00826 desc += TQString("<br><i>%1</i>").arg(e->summary(lang));
00827 desc += TQString("<br>(%1)").arg(e->license());
00828
00829 m_rt->clear();
00830 m_rt->setText(desc);
00831
00832 if(installStatus(e) == 1) enabled = false;
00833 else enabled = true;
00834
00835 TQPushButton *de, *in;
00836 in = *(m_buttons[d->m_page]->at(0));
00837 de = *(m_buttons[d->m_page]->at(1));
00838 if(in) in->setEnabled(enabled);
00839 if(de) de->setEnabled(true);
00840 }
00841 }
00842
00843 void DownloadDialog::slotEmail(const TQString& link)
00844 {
00845 kdDebug() << "EMAIL: " << link << endl;
00846 kapp->invokeMailer(link);
00847 slotSelected();
00848 }
00849
00850 Entry *DownloadDialog::getEntry()
00851 {
00852 TQListViewItem *entryItem = currentEntryItem();
00853
00854 if(!entryItem)
00855 return 0;
00856
00857 TQString entryName = entryItem->text(0);
00858
00859 TQString lang = TDEGlobal::locale()->language();
00860
00861 for(Entry *e = m_entries.first(); e; e = m_entries.next())
00862 if(e->name(lang) == entryName)
00863 return e;
00864
00865 return 0;
00866 }
00867
00868 void DownloadDialog::slotPage(TQWidget *w)
00869 {
00870 Provider *p;
00871
00872 kdDebug() << "changed widget!!!" << endl;
00873
00874 if(m_map.find(w) == m_map.end()) return;
00875
00876 d->m_page = w;
00877
00878 lv_r = *(m_map[w]->at(0));
00879 lv_d = *(m_map[w]->at(1));
00880 lv_l = *(m_map[w]->at(2));
00881 p = m_providers[w];
00882 m_rt = m_rts[w];
00883
00884 kdDebug() << "valid change!!!; lv_r = " << lv_r << endl;
00885
00886 if(m_engine) return;
00887
00888 if(!m_filter.isEmpty()) return;
00889
00890 lv_r->clear();
00891 lv_d->clear();
00892 lv_l->clear();
00893
00894 kdDebug() << "-- fetch -- " << p->downloadUrl() << endl;
00895
00896 loadProvider(p);
00897 }
00898
00899 void DownloadDialog::loadProvider(Provider *p)
00900 {
00901 TQMap<TDEIO::Job*, Provider*>::Iterator it;
00902
00903 for(it = d->m_variantjobs.begin(); it != d->m_variantjobs.end(); it++)
00904 {
00905 if(it.data() == p)
00906 {
00907 kdDebug() << "-- found provider data in cache" << endl;
00908 slotResult(it.key());
00909 return;
00910 }
00911 }
00912
00913 TQStringList variants;
00914 variants << "score";
00915 variants << "downloads";
00916 variants << "latest";
00917
00918
00919
00920 TQMap<TQString, TQStringList> urls;
00921
00922 for(TQStringList::Iterator it = variants.begin(); it != variants.end(); it++)
00923 {
00924 TQString url = p->downloadUrlVariant((*it)).url();
00925 if(!urls.contains(url))
00926 {
00927 urls[url] = TQStringList();
00928 }
00929 urls[url] << (*it);
00930
00931 it = variants.remove(it);
00932 }
00933
00934
00935
00936 for(TQMap<TQString, TQStringList>::Iterator it = urls.begin(); it != urls.end(); it++)
00937 {
00938 TQString url = it.key();
00939 TQStringList urlvariants = it.data();
00940
00941 TDEIO::TransferJob *variantjob = TDEIO::get(url, false, false);
00942 d->m_newproviders[p] = p;
00943 d->m_variantjobs[variantjob] = p;
00944 d->m_variants[variantjob] = urlvariants;
00945 m_data[variantjob] = "";
00946
00947 connect(variantjob, TQT_SIGNAL(result(TDEIO::Job*)), TQT_SLOT(slotResult(TDEIO::Job*)));
00948 connect(variantjob, TQT_SIGNAL(data(TDEIO::Job*, const TQByteArray&)),
00949 TQT_SLOT(slotData(TDEIO::Job*, const TQByteArray&)));
00950 }
00951
00952 if(variants.count() == 0) return;
00953
00954
00955
00956 kdDebug() << "-- reached old downloadurl section; variants left: " << variants.count() << endl;
00957
00958 TDEIO::TransferJob *job = TDEIO::get(p->downloadUrl());
00959
00960 d->m_newproviders[p] = p;
00961 d->m_variantjobs[job] = p;
00962 d->m_variants[job] = variants;
00963
00964 m_data[job] = "";
00965
00966 connect(job, TQT_SIGNAL(result(TDEIO::Job*)), TQT_SLOT(slotResult(TDEIO::Job*)));
00967 connect(job, TQT_SIGNAL(data(TDEIO::Job*, const TQByteArray&)),
00968 TQT_SLOT(slotData(TDEIO::Job*, const TQByteArray&)));
00969 }
00970
00971 void DownloadDialog::setType(TQString type)
00972 {
00973 m_filter = type;
00974 }
00975
00976 void DownloadDialog::setProviderList(const TQString& providerList)
00977 {
00978 d->m_providerlist = providerList;
00979 }
00980
00981 void DownloadDialog::slotOk()
00982 {
00983 }
00984
00985 void DownloadDialog::slotApply()
00986 {
00987 }
00988
00989 void DownloadDialog::open(const TQString& type, const TQString& caption)
00990 {
00991 DownloadDialog d(0, caption);
00992 d.setType(type);
00993 d.load();
00994 d.exec();
00995 }
00996
00997 void DownloadDialog::slotFinish()
00998 {
00999 showPage(1);
01000
01001 }
01002
01003 TQPtrList<Entry> DownloadDialog::installedEntries()
01004 {
01005 return d->m_installlist;
01006 }