00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "kdxsbutton.h"
00020
00021 #include "knewstuff2/dxs/dxs.h"
00022
00023 #include "knewstuff2/core/entry.h"
00024 #include "knewstuff2/core/category.h"
00025
00026 #include "downloaddialog.h"
00027 #include "kdxsrating.h"
00028 #include "kdxscomment.h"
00029 #include "kdxscomments.h"
00030 #include "kdxschanges.h"
00031 #include "kdxstranslation.h"
00032
00033 #include <QtGui/QLayout>
00034 #include <QtXml/qdom.h>
00035 #include <QtGui/QToolButton>
00036
00037 #include <ktoolinvocation.h>
00038 #include <kmessagebox.h>
00039 #include <kdebug.h>
00040 #include <klocale.h>
00041 #include <kcursor.h>
00042 #include <krun.h>
00043
00044 #include <kmenu.h>
00045 #include <kiconloader.h>
00046 #include <kapplication.h>
00047 #include <kprocess.h>
00048 #include <kpassworddialog.h>
00049
00050 using namespace KNS;
00051
00052 KDXSButton::KDXSButton(QWidget *parent)
00053 : QToolButton(parent), d(0)
00054 {
00055 m_entry = 0;
00056 m_provider = 0;
00057 m_dxs = 0;
00058 m_engine = 0;
00059
00060
00061
00062
00063 m_p = new KMenu(this);
00064 action_install = m_p->addAction(SmallIcon("get-hot-new-stuff"),
00065 i18n("Install"));
00066 action_uninstall = m_p->addAction(i18n("Uninstall"));
00067 action_comments = m_p->addAction(SmallIcon("help-about"),
00068 i18n("Comments"));
00069 action_changes = m_p->addAction(SmallIcon("help-about"),
00070 i18n("Changelog"));
00071
00072 m_history = new KMenu(this);
00073 m_history->setTitle(i18n("Switch version"));
00074
00075
00076
00077
00078
00079 action_historysub = m_p->addMenu(m_history);
00080
00081 m_p->addSeparator();
00082 action_info = m_p->addAction(i18n("Provider information"));
00083
00084 m_contact = new KMenu(this);
00085 m_contact->setIcon(SmallIcon("mail-message-new"));
00086 m_contact->setTitle(i18n("Contact author"));
00087
00088 KMenu *pcollab = new KMenu(this);
00089 pcollab->setTitle(i18n("Collaboration"));
00090
00091 action_collabrating = pcollab->addAction(i18n("Add Rating"));
00092 action_collabcomment = pcollab->addAction(i18n("Add Comment"));
00093 action_collabtranslation = pcollab->addAction(i18n("Translate"));
00094 action_collabsubscribe = pcollab->addAction(i18n("Subscribe"));
00095 action_collabremoval = pcollab->addAction(i18n("Report bad entry"));
00096 pcollab->addMenu(m_contact);
00097
00098 m_p->addSeparator();
00099 action_collaboratesub = m_p->addMenu(pcollab);
00100
00101 connect(this, SIGNAL(clicked()), SLOT(slotClicked()));
00102
00103 connect(m_p, SIGNAL(triggered(QAction*)), SLOT(slotTriggered(QAction*)));
00104
00105 connect(m_contact, SIGNAL(triggered(QAction*)), SLOT(slotTriggered(QAction*)));
00106 connect(pcollab, SIGNAL(triggered(QAction*)), SLOT(slotTriggered(QAction*)));
00107
00108
00109
00110
00111
00112 setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
00113 setPopupMode(QToolButton::MenuButtonPopup);
00114 setMenu(m_p);
00115
00116 setEnabled(false);
00117 show();
00118 }
00119
00120 KDXSButton::~KDXSButton()
00121 {
00122 }
00123
00124 void KDXSButton::setEntry(Entry *e)
00125 {
00126 m_entry = e;
00127
00128 if (m_engine) setEnabled(true);
00129
00130 Entry::Status status = e->status();
00131 switch (status) {
00132 case Entry::Installed:
00133 setText(i18n("Uninstall"));
00134 action_install->setVisible(false);
00135 action_uninstall->setVisible(true);
00136 break;
00137 case Entry::Updateable:
00138 setText(i18n("Update"));
00139 action_uninstall->setVisible(false);
00140 action_install->setVisible(true);
00141 break;
00142 case Entry::Deleted:
00144 setText(i18n("Install"));
00145 action_uninstall->setVisible(false);
00146 action_install->setVisible(true);
00147 break;
00148 default:
00149 setText(i18n("Install"));
00150 action_uninstall->setVisible(false);
00151 action_install->setVisible(true);
00152 }
00153
00154 Author author = e->author();
00155 if (!author.email().isEmpty()) {
00156 m_contact->setEnabled(true);
00157 action_contactbymail = m_contact->addAction(SmallIcon("mail-message-new"),
00158 i18n("Send Mail"));
00159 } else
00160 m_contact->setEnabled(false);
00161 if (!author.jabber().isEmpty()) {
00162 action_contactbyjabber = m_contact->addAction(i18n("Contact on Jabber"));
00163 }
00164 }
00165
00166 void KDXSButton::setProvider(const KNS::Provider *provider)
00167 {
00168 m_provider = provider;
00169
00170 if (!provider) return;
00171
00172
00173
00174 if (provider->webService().isValid()) {
00175
00176 action_collabrating->setEnabled(true);
00177 action_collabcomment->setEnabled(true);
00178 action_collabtranslation->setEnabled(true);
00179 action_collabsubscribe->setEnabled(true);
00180 action_collabremoval->setEnabled(true);
00181
00182 action_comments->setEnabled(true);
00183 action_changes->setEnabled(true);
00184
00185 m_history->setEnabled(true);
00186 } else {
00187 action_collabrating->setEnabled(false);
00188 action_collabcomment->setEnabled(false);
00189 action_collabtranslation->setEnabled(false);
00190 action_collabsubscribe->setEnabled(false);
00191 action_collabremoval->setEnabled(false);
00192
00193 action_comments->setEnabled(false);
00194 action_changes->setEnabled(false);
00195
00196 m_history->setEnabled(false);
00197 }
00198 }
00199
00200 void KDXSButton::setEngine(DxsEngine *engine)
00201 {
00202 m_engine = engine;
00203
00204 if (m_entry) setEnabled(true);
00205
00206 m_dxs = new KNS::Dxs(m_engine, NULL);
00207 m_dxs->setEndpoint(KUrl("http://new.kstuff.org/cgi-bin/hotstuff-dxs"));
00208
00209
00210
00211
00212 connect(m_dxs,
00213 SIGNAL(signalInfo(QString, QString, QString)),
00214 SLOT(slotInfo(QString, QString, QString)));
00215 connect(m_dxs,
00216 SIGNAL(signalCategories(QList<KNS::Category*>)),
00217 SLOT(slotCategories(QList<KNS::Category*>)));
00218 connect(m_dxs,
00219 SIGNAL(signalEntries(KNS::Entry::List, Feed *)),
00220 SLOT(slotEntries(KNS::Entry::List, Feed *)));
00221 connect(m_dxs,
00222 SIGNAL(signalComments(QStringList)),
00223 SLOT(slotComments(QStringList)));
00224 connect(m_dxs,
00225 SIGNAL(signalChanges(QStringList)),
00226 SLOT(slotChanges(QStringList)));
00227 connect(m_dxs,
00228 SIGNAL(signalHistory(QStringList)),
00229 SLOT(slotHistory(QStringList)));
00230 connect(m_dxs,
00231 SIGNAL(signalRemoval(bool)),
00232 SLOT(slotRemoval(bool)));
00233 connect(m_dxs,
00234 SIGNAL(signalSubscription(bool)),
00235 SLOT(slotSubscription(bool)));
00236 connect(m_dxs,
00237 SIGNAL(signalComment(bool)),
00238 SLOT(slotComment(bool)));
00239 connect(m_dxs,
00240 SIGNAL(signalRating(bool)),
00241 SLOT(slotRating(bool)));
00242 connect(m_dxs,
00243 SIGNAL(signalFault()),
00244 SLOT(slotFault()));
00245 connect(m_dxs,
00246 SIGNAL(signalError()),
00247 SLOT(slotError()));
00248 }
00249
00250 void KDXSButton::slotInfo(QString provider, QString server, QString version)
00251 {
00252 QString infostring = i18n("Server: %1", server);
00253 infostring += '\n' + i18n("Provider: %1", provider);
00254 infostring += '\n' + i18n("Version: %1", version);
00255
00256 KMessageBox::information(this,
00257 infostring,
00258 i18n("Provider information"));
00259 }
00260
00261 void KDXSButton::slotCategories(QList<KNS::Category*> categories)
00262 {
00263 for (QList<KNS::Category*>::Iterator it = categories.begin(); it != categories.end(); ++it) {
00264 KNS::Category *category = (*it);
00265
00266 }
00267 }
00268
00269 void KDXSButton::slotEntries(KNS::Entry::List entries, Feed * feed)
00270 {
00271 for (KNS::Entry::List::Iterator it = entries.begin(); it != entries.end(); ++it) {
00272 KNS::Entry *entry = (*it);
00273
00274 }
00275 }
00276
00277 void KDXSButton::slotComments(QStringList comments)
00278 {
00279 KDXSComments commentsdlg(this);
00280
00281 for (QStringList::const_iterator it = comments.begin(); it != comments.end(); ++it) {
00282
00283 commentsdlg.addComment("foo", (*it));
00284 }
00285
00286 commentsdlg.exec();
00287 }
00288
00289 void KDXSButton::slotChanges(QStringList changes)
00290 {
00291 KDXSChanges changesdlg(this);
00292
00293 for (QStringList::const_iterator it = changes.begin(); it != changes.end(); ++it) {
00294
00295 changesdlg.addChangelog("v???", (*it));
00296 }
00297
00298 changesdlg.exec();
00299 }
00300
00301 void KDXSButton::slotHistory(QStringList entries)
00302 {
00303 m_history->clear();
00304
00305 int i = 0;
00306 for (QStringList::const_iterator it = entries.begin(); it != entries.end(); ++it) {
00307
00308
00309
00310
00311
00312 i++;
00313 }
00314
00315 if (entries.size() == 0) {
00316
00317
00318
00319 }
00320
00321 m_history->setCursor(Qt::ArrowCursor);
00322 }
00323
00324 void KDXSButton::slotRemoval(bool success)
00325 {
00326 if (success) {
00327 KMessageBox::information(this,
00328 i18n("The removal request was successfully registered."),
00329 i18n("Removal of entry"));
00330 } else {
00331 KMessageBox::error(this,
00332 i18n("The removal request failed."),
00333 i18n("Removal of entry"));
00334 }
00335 }
00336
00337 void KDXSButton::slotSubscription(bool success)
00338 {
00339 if (success) {
00340 KMessageBox::information(this,
00341 i18n("The subscription was successfully completed."),
00342 i18n("Subscription to entry"));
00343 } else {
00344 KMessageBox::error(this,
00345 i18n("The subscription request failed."),
00346 i18n("Subscription to entry"));
00347 }
00348 }
00349
00350 void KDXSButton::slotRating(bool success)
00351 {
00352 if (success) {
00353 KMessageBox::information(this,
00354 i18n("The rating was submitted successfully."),
00355 i18n("Rating for entry"));
00356 } else {
00357 KMessageBox::error(this,
00358 i18n("The rating could not be submitted."),
00359 i18n("Rating for entry"));
00360 }
00361 }
00362
00363 void KDXSButton::slotComment(bool success)
00364 {
00365 if (success) {
00366 KMessageBox::information(this,
00367 i18n("The comment was submitted successfully."),
00368 i18n("Comment on entry"));
00369 } else {
00370 KMessageBox::error(this,
00371 i18n("The comment could not be submitted."),
00372 i18n("Comment on entry"));
00373 }
00374 }
00375
00376 void KDXSButton::slotFault()
00377 {
00378 KMessageBox::error(this,
00379 i18n("A protocol fault has occurred. The request has failed."),
00380 i18n("Desktop Exchange Service"));
00381 }
00382
00383 void KDXSButton::slotError()
00384 {
00385 KMessageBox::error(this,
00386 i18n("A network error has occurred. The request has failed."),
00387 i18n("Desktop Exchange Service"));
00388 }
00389
00390 void KDXSButton::slotVersionsActivated(int id)
00391 {
00392 int version = id - historyslots;
00393
00394 Q_UNUSED(version);
00395
00396 }
00397
00398 void KDXSButton::slotTriggered(QAction *action)
00399 {
00400 int ret;
00401
00402 if (action == action_info) {
00403
00404 if (m_provider->webService().isValid()) {
00405 m_dxs->call_info();
00406 } else {
00407 slotInfo(m_provider->name().representation(),
00408 QString(),
00409 QString());
00410 }
00411 }
00412 if (action == action_comments) {
00413 m_dxs->call_comments(0);
00414 }
00415 if (action == action_changes) {
00416 m_dxs->call_changes(2);
00417 }
00418 if (action == action_contactbymail) {
00419 QString address = m_entry->author().email();
00420 KToolInvocation::invokeMailer(address, i18n("KNewStuff contributions"), "");
00421 }
00422 if (action == action_contactbyjabber) {
00423 new KRun(KUrl(QLatin1String("xmpp:") + m_entry->author().jabber()), this);
00424 }
00425 if (action == action_collabtranslation) {
00426 if (!authenticate())
00427 return;
00428 KDXSTranslation translation(this);
00429 ret = translation.exec();
00430 if (ret == QDialog::Accepted) {
00431
00432
00433
00434
00435
00436 }
00437 }
00438 if (action == action_collabremoval) {
00439 if (authenticate())
00440 m_dxs->call_removal(0);
00441 }
00442 if (action == action_collabsubscribe) {
00443 if (authenticate())
00444 m_dxs->call_subscription(0, true);
00445 }
00446 if (action == action_uninstall) {
00447 if (m_engine->uninstall(m_entry)) {
00448 setText(i18n("Install"));
00449 action_uninstall->setVisible(false);
00450 action_install->setVisible(true);
00451 }
00452 }
00453 if (action == action_install) {
00454 connect(m_engine,
00455 SIGNAL(signalPayloadLoaded(KUrl)),
00456 SLOT(slotPayloadLoaded(KUrl)));
00457 connect(m_engine,
00458 SIGNAL(signalPayloadFailed(KNS::Entry *)),
00459 SLOT(slotPayloadFailed(KNS::Entry *)));
00460
00461 m_engine->downloadPayload(m_entry);
00462 }
00463 if (action == action_collabcomment) {
00464 if (!authenticate())
00465 return;
00466 KDXSComment comment(this);
00467 ret = comment.exec();
00468 if (ret == QDialog::Accepted) {
00469 QString s = comment.comment();
00470 if (!s.isEmpty()) {
00471 m_dxs->call_comment(0, s);
00472 }
00473 }
00474 }
00475 if (action == action_collabrating) {
00476 if (!authenticate())
00477 return;
00478 KDXSRating rating(this);
00479 ret = rating.exec();
00480 if (ret == QDialog::Accepted) {
00481 int r = rating.rating();
00482 if (r >= 0) {
00483 m_dxs->call_rating(0, r);
00484 }
00485 }
00486 }
00487 }
00488
00489 void KDXSButton::slotVersionsHighlighted(int id)
00490 {
00491
00492
00493 if (id == historyinactive) {
00494
00495 m_history->setCursor(QCursor(Qt::WaitCursor));
00496
00497
00498 m_dxs->call_history(0);
00499
00500 }
00501 }
00502
00503 void KDXSButton::slotClicked()
00504 {
00505 if (action_install->isVisible())
00506 slotTriggered(action_install);
00507 else
00508 slotTriggered(action_uninstall);
00509 }
00510
00511 bool KDXSButton::authenticate()
00512 {
00513 if ((!m_username.isEmpty()) && (!m_password.isEmpty())) return true;
00514
00515 KPasswordDialog dlg(this);
00516 dlg.setPrompt(i18n("This operation requires authentication."));
00517 int ret = dlg.exec();
00518 if (ret == QDialog::Accepted) {
00519 m_username = dlg.username();
00520 m_password = dlg.password();
00521
00522 return true;
00523 }
00524
00525 return false;
00526 }
00527
00528 void KDXSButton::slotPayloadLoaded(KUrl url)
00529 {
00530
00531
00532 Entry::Status status = m_entry->status();
00533 if (status == Entry::Installed) {
00534 setText(i18n("Uninstall"));
00535 action_install->setVisible(false);
00536 action_uninstall->setVisible(true);
00537 } else {
00538 setText(i18n("Install"));
00539 action_uninstall->setVisible(false);
00540 action_install->setVisible(true);
00541 }
00542
00543 m_engine->install(url.pathOrUrl());
00544 }
00545
00546 void KDXSButton::slotPayloadFailed(KNS::Entry *)
00547 {
00548
00549 }
00550
00551 #include "kdxsbutton.moc"