00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <qcheckbox.h>
00021 #include <qguardedptr.h>
00022 #include <qhbox.h>
00023 #include <qlabel.h>
00024 #include <qlineedit.h>
00025 #include <qmessagebox.h>
00026 #include <qstringlist.h>
00027 #include <qvbox.h>
00028 #include <qvgroupbox.h>
00029 #include <qstylesheet.h>
00030 #include <qsimplerichtext.h>
00031 #include <qpushbutton.h>
00032 #include <qlayout.h>
00033
00034 #include <kapplication.h>
00035 #include <kconfig.h>
00036 #include <kdebug.h>
00037 #include <kdialogbase.h>
00038 #include <kguiitem.h>
00039 #include <klistbox.h>
00040 #include <klocale.h>
00041 #include <kmessagebox.h>
00042 #include <knotifyclient.h>
00043 #include <kstdguiitem.h>
00044 #include <kactivelabel.h>
00045 #include <kiconloader.h>
00046 #include <kglobalsettings.h>
00047 #include <kwin.h>
00048
00049 #ifdef Q_WS_X11
00050 #include <X11/Xlib.h>
00051 #endif
00052
00062 static bool KMessageBox_queue = false;
00063
00064 static QPixmap themedMessageBoxIcon(QMessageBox::Icon icon)
00065 {
00066 QString icon_name;
00067
00068 switch(icon)
00069 {
00070 case QMessageBox::NoIcon:
00071 return QPixmap();
00072 break;
00073 case QMessageBox::Information:
00074 icon_name = "messagebox_info";
00075 break;
00076 case QMessageBox::Warning:
00077 icon_name = "messagebox_warning";
00078 break;
00079 case QMessageBox::Critical:
00080 icon_name = "messagebox_critical";
00081 break;
00082 default:
00083 break;
00084 }
00085
00086 QPixmap ret = KApplication::kApplication()->iconLoader()->loadIcon(icon_name, KIcon::NoGroup, KIcon::SizeMedium, KIcon::DefaultState, 0, true);
00087
00088 if (ret.isNull())
00089 return QMessageBox::standardIcon(icon);
00090 else
00091 return ret;
00092 }
00093
00094 static void sendNotification( QString message,
00095 const QStringList& strlist,
00096 QMessageBox::Icon icon,
00097 WId parent_id )
00098 {
00099
00100 QString messageType;
00101 switch ( icon )
00102 {
00103 case QMessageBox::Warning:
00104 messageType = "messageWarning";
00105 break;
00106 case QMessageBox::Critical:
00107 messageType = "messageCritical";
00108 break;
00109 #if QT_VERSION >= 0x030200
00110 case QMessageBox::Question:
00111 messageType = "messageQuestion";
00112 break;
00113 #endif
00114 default:
00115 messageType = "messageInformation";
00116 break;
00117 }
00118
00119 if ( !strlist.isEmpty() )
00120 {
00121 for ( QStringList::ConstIterator it = strlist.begin(); it != strlist.end(); ++it )
00122 message += "\n" + *it;
00123 }
00124
00125 if ( !message.isEmpty() )
00126 KNotifyClient::event( (int)parent_id, messageType, message );
00127 }
00128
00129 static QString qrichtextify( const QString& text )
00130 {
00131 if ( text.isEmpty() || text[0] == '<' )
00132 return text;
00133
00134 QStringList lines = QStringList::split('\n', text);
00135 for(QStringList::Iterator it = lines.begin(); it != lines.end(); ++it)
00136 {
00137 *it = QStyleSheet::convertFromPlainText( *it, QStyleSheetItem::WhiteSpaceNormal );
00138 }
00139
00140 return lines.join(QString::null);
00141 }
00142
00143 int KMessageBox::createKMessageBox(KDialogBase *dialog, QMessageBox::Icon icon,
00144 const QString &text, const QStringList &strlist,
00145 const QString &ask, bool *checkboxReturn,
00146 int options, const QString &details)
00147 {
00148 return createKMessageBox(dialog, themedMessageBoxIcon(icon), text, strlist,
00149 ask, checkboxReturn, options, details, icon);
00150 }
00151
00152 int KMessageBox::createKMessageBox(KDialogBase *dialog, QPixmap icon,
00153 const QString &text, const QStringList &strlist,
00154 const QString &ask, bool *checkboxReturn, int options,
00155 const QString &details, QMessageBox::Icon notifyType)
00156 {
00157 QVBox *topcontents = new QVBox (dialog);
00158 topcontents->setSpacing(KDialog::spacingHint()*2);
00159 topcontents->setMargin(KDialog::marginHint());
00160
00161 QWidget *contents = new QWidget(topcontents);
00162 QHBoxLayout * lay = new QHBoxLayout(contents);
00163 lay->setSpacing(KDialog::spacingHint());
00164
00165 QLabel *label1 = new QLabel( contents);
00166
00167 if (!icon.isNull())
00168 label1->setPixmap(icon);
00169
00170 lay->addWidget( label1, 0, Qt::AlignCenter );
00171 lay->addSpacing(KDialog::spacingHint());
00172
00173 QString qt_text = qrichtextify( text );
00174
00175 int pref_width = 0;
00176 int pref_height = 0;
00177
00178 {
00179 QSimpleRichText rt(qt_text, dialog->font());
00180 QRect d = KGlobalSettings::desktopGeometry(dialog);
00181
00182 pref_width = d.width() / 3;
00183 rt.setWidth(pref_width);
00184 int used_width = rt.widthUsed();
00185 pref_height = rt.height();
00186 if (3*pref_height > 2*d.height())
00187 {
00188
00189 pref_width = d.width() / 2;
00190 rt.setWidth(pref_width);
00191 used_width = rt.widthUsed();
00192 pref_height = rt.height();
00193 }
00194 if (used_width <= pref_width)
00195 {
00196 while(true)
00197 {
00198 int new_width = (used_width * 9) / 10;
00199 rt.setWidth(new_width);
00200 int new_height = rt.height();
00201 if (new_height > pref_height)
00202 break;
00203 used_width = rt.widthUsed();
00204 if (used_width > new_width)
00205 break;
00206 }
00207 pref_width = used_width;
00208 }
00209 else
00210 {
00211 if (used_width > (pref_width *2))
00212 pref_width = pref_width *2;
00213 else
00214 pref_width = used_width;
00215 }
00216 }
00217 KActiveLabel *label2 = new KActiveLabel( qt_text, contents );
00218 if (!(options & KMessageBox::AllowLink))
00219 {
00220 QObject::disconnect(label2, SIGNAL(linkClicked(const QString &)),
00221 label2, SLOT(openLink(const QString &)));
00222 }
00223
00224
00225
00226 label2->setFixedSize(QSize(pref_width+10, pref_height));
00227 lay->addWidget( label2 );
00228 lay->addStretch();
00229
00230 KListBox *listbox = 0;
00231 if (!strlist.isEmpty())
00232 {
00233 listbox=new KListBox( topcontents );
00234 listbox->insertStringList( strlist );
00235 listbox->setSelectionMode( QListBox::NoSelection );
00236 topcontents->setStretchFactor(listbox, 1);
00237 }
00238
00239 QGuardedPtr<QCheckBox> checkbox = 0;
00240 if (!ask.isEmpty())
00241 {
00242 checkbox = new QCheckBox(ask, topcontents);
00243 if (checkboxReturn)
00244 checkbox->setChecked(*checkboxReturn);
00245 }
00246
00247 if (!details.isEmpty())
00248 {
00249 QVGroupBox *detailsGroup = new QVGroupBox( i18n("Details"), dialog);
00250 if ( details.length() < 512 ) {
00251 KActiveLabel *label3 = new KActiveLabel(qrichtextify(details),
00252 detailsGroup);
00253 label3->setMinimumSize(label3->sizeHint());
00254 if (!(options & KMessageBox::AllowLink))
00255 {
00256 QObject::disconnect(label3, SIGNAL(linkClicked(const QString &)),
00257 label3, SLOT(openLink(const QString &)));
00258 }
00259 } else {
00260 QTextEdit* te = new QTextEdit(details, QString::null, detailsGroup);
00261 te->setReadOnly( true );
00262 te->setMinimumHeight( te->fontMetrics().lineSpacing() * 11 );
00263 }
00264 dialog->setDetailsWidget(detailsGroup);
00265 }
00266
00267 dialog->setMainWidget(topcontents);
00268 dialog->enableButtonSeparator(false);
00269 if (!listbox)
00270 dialog->disableResize();
00271
00272 const KDialogBase::ButtonCode buttons[] = {
00273 KDialogBase::Help,
00274 KDialogBase::Default,
00275 KDialogBase::Ok,
00276 KDialogBase::Apply,
00277 KDialogBase::Try,
00278 KDialogBase::Cancel,
00279 KDialogBase::Close,
00280 KDialogBase::User1,
00281 KDialogBase::User2,
00282 KDialogBase::User3,
00283 KDialogBase::No,
00284 KDialogBase::Yes,
00285 KDialogBase::Details };
00286 for( unsigned int i = 0;
00287 i < sizeof( buttons )/sizeof( buttons[ 0 ] );
00288 ++i )
00289 if( QPushButton* btn = dialog->actionButton( buttons[ i ] ))
00290 if( btn->isDefault())
00291 btn->setFocus();
00292
00293 if ( (options & KMessageBox::Notify) )
00294 sendNotification( text, strlist, notifyType, dialog->topLevelWidget()->winId());
00295
00296 if (KMessageBox_queue)
00297 {
00298 KDialogQueue::queueDialog(dialog);
00299 return KMessageBox::Cancel;
00300 }
00301
00302 if ( (options & KMessageBox::NoExec) )
00303 {
00304 return KMessageBox::Cancel;
00305 }
00306
00307
00308
00309
00310 QGuardedPtr<KDialogBase> guardedDialog = dialog;
00311 KWin::setState( dialog->winId(), NET::StaysOnTop );
00312 int result = guardedDialog->exec();
00313 if (checkbox && checkboxReturn)
00314 *checkboxReturn = checkbox->isChecked();
00315 delete (KDialogBase *) guardedDialog;
00316 return result;
00317 }
00318
00319 int
00320 KMessageBox::questionYesNo(QWidget *parent, const QString &text,
00321 const QString &caption,
00322 const KGuiItem &buttonYes,
00323 const KGuiItem &buttonNo,
00324 const QString &dontAskAgainName,
00325 int options)
00326 {
00327 return questionYesNoList(parent, text, QStringList(), caption,
00328 buttonYes, buttonNo, dontAskAgainName, options);
00329 }
00330
00331 int
00332 KMessageBox::questionYesNoWId(WId parent_id, const QString &text,
00333 const QString &caption,
00334 const KGuiItem &buttonYes,
00335 const KGuiItem &buttonNo,
00336 const QString &dontAskAgainName,
00337 int options)
00338 {
00339 return questionYesNoListWId(parent_id, text, QStringList(), caption,
00340 buttonYes, buttonNo, dontAskAgainName, options);
00341 }
00342
00343 bool
00344 KMessageBox::shouldBeShownYesNo(const QString &dontShowAgainName,
00345 ButtonCode &result)
00346 {
00347 if ( dontShowAgainName.isEmpty() ) return true;
00348 QString grpNotifMsgs = QString::fromLatin1("Notification Messages");
00349 KConfig *config = againConfig ? againConfig : KGlobal::config();
00350 KConfigGroupSaver saver( config, grpNotifMsgs );
00351 QString dontAsk = config->readEntry(dontShowAgainName).lower();
00352 if (dontAsk == "yes") {
00353 result = Yes;
00354 return false;
00355 }
00356 if (dontAsk == "no") {
00357 result = No;
00358 return false;
00359 }
00360 return true;
00361 }
00362
00363 bool
00364 KMessageBox::shouldBeShownContinue(const QString &dontShowAgainName)
00365 {
00366 if ( dontShowAgainName.isEmpty() ) return true;
00367 QString grpNotifMsgs = QString::fromLatin1("Notification Messages");
00368 KConfig *config = againConfig ? againConfig : KGlobal::config();
00369 KConfigGroupSaver saver( config, grpNotifMsgs );
00370 return config->readBoolEntry(dontShowAgainName, true);
00371 }
00372
00373 void
00374 KMessageBox::saveDontShowAgainYesNo(const QString &dontShowAgainName,
00375 ButtonCode result)
00376 {
00377 if ( dontShowAgainName.isEmpty() ) return;
00378 QString grpNotifMsgs = QString::fromLatin1("Notification Messages");
00379 KConfig *config = againConfig ? againConfig : KGlobal::config();
00380 KConfigGroupSaver saver( config, grpNotifMsgs );
00381 config->writeEntry( dontShowAgainName, result==Yes ? "yes" : "no", true, (dontShowAgainName[0] == ':'));
00382 config->sync();
00383 }
00384
00385 void
00386 KMessageBox::saveDontShowAgainContinue(const QString &dontShowAgainName)
00387 {
00388 if ( dontShowAgainName.isEmpty() ) return;
00389 QString grpNotifMsgs = QString::fromLatin1("Notification Messages");
00390 KConfig *config = againConfig ? againConfig : KGlobal::config();
00391 KConfigGroupSaver saver( config, grpNotifMsgs );
00392 config->writeEntry( dontShowAgainName, false, true, (dontShowAgainName[0] == ':'));
00393 config->sync();
00394 }
00395
00396 KConfig* KMessageBox::againConfig = NULL;
00397 void
00398 KMessageBox::setDontShowAskAgainConfig(KConfig* cfg)
00399 {
00400 againConfig = cfg;
00401 }
00402
00403 int
00404 KMessageBox::questionYesNoList(QWidget *parent, const QString &text,
00405 const QStringList &strlist,
00406 const QString &caption,
00407 const KGuiItem &buttonYes,
00408 const KGuiItem &buttonNo,
00409 const QString &dontAskAgainName,
00410 int options)
00411 {
00412 return questionYesNoListWId( parent ? parent->winId() : 0, text, strlist,
00413 caption, buttonYes, buttonNo, dontAskAgainName, options );
00414 }
00415
00416 int
00417 KMessageBox::questionYesNoListWId(WId parent_id, const QString &text,
00418 const QStringList &strlist,
00419 const QString &caption,
00420 const KGuiItem &buttonYes,
00421 const KGuiItem &buttonNo,
00422 const QString &dontAskAgainName,
00423 int options)
00424 {
00425 ButtonCode res;
00426 if ( !shouldBeShownYesNo(dontAskAgainName, res) )
00427 return res;
00428
00429 QWidget* parent = QWidget::find( parent_id );
00430 KDialogBase *dialog= new KDialogBase(
00431 caption.isEmpty() ? i18n("Question") : caption,
00432 KDialogBase::Yes | KDialogBase::No,
00433 KDialogBase::Yes, KDialogBase::No,
00434 parent, "questionYesNo", true, true,
00435 buttonYes, buttonNo);
00436 if( options & PlainCaption )
00437 dialog->setPlainCaption( caption );
00438 #ifdef Q_WS_X11
00439 if( parent == NULL && parent_id )
00440 XSetTransientForHint( qt_xdisplay(), dialog->winId(), parent_id );
00441 #endif
00442
00443 bool checkboxResult = false;
00444 int result = createKMessageBox(dialog, QMessageBox::Information, text, strlist,
00445 dontAskAgainName.isEmpty() ? QString::null : i18n("Do not ask again"),
00446 &checkboxResult, options);
00447 res = (result==KDialogBase::Yes ? Yes : No);
00448
00449 if (checkboxResult)
00450 saveDontShowAgainYesNo(dontAskAgainName, res);
00451 return res;
00452 }
00453
00454 int
00455 KMessageBox::questionYesNoCancel(QWidget *parent,
00456 const QString &text,
00457 const QString &caption,
00458 const KGuiItem &buttonYes,
00459 const KGuiItem &buttonNo,
00460 const QString &dontAskAgainName,
00461 int options)
00462 {
00463 return questionYesNoCancelWId( parent ? parent->winId() : 0, text, caption, buttonYes, buttonNo,
00464 dontAskAgainName, options );
00465 }
00466
00467 int
00468 KMessageBox::questionYesNoCancelWId(WId parent_id,
00469 const QString &text,
00470 const QString &caption,
00471 const KGuiItem &buttonYes,
00472 const KGuiItem &buttonNo,
00473 const QString &dontAskAgainName,
00474 int options)
00475 {
00476 ButtonCode res;
00477 if ( !shouldBeShownYesNo(dontAskAgainName, res) )
00478 return res;
00479
00480 QWidget* parent = QWidget::find( parent_id );
00481 KDialogBase *dialog= new KDialogBase(
00482 caption.isEmpty() ? i18n("Question") : caption,
00483 KDialogBase::Yes | KDialogBase::No | KDialogBase::Cancel,
00484 KDialogBase::Yes, KDialogBase::Cancel,
00485 parent, "questionYesNoCancel", true, true,
00486 buttonYes, buttonNo);
00487 if( options & PlainCaption )
00488 dialog->setPlainCaption( caption );
00489 #ifdef Q_WS_X11
00490 if( parent == NULL && parent_id )
00491 XSetTransientForHint( qt_xdisplay(), dialog->winId(), parent_id );
00492 #endif
00493
00494 bool checkboxResult = false;
00495 int result = createKMessageBox(dialog, QMessageBox::Information,
00496 text, QStringList(),
00497 dontAskAgainName.isEmpty() ? QString::null : i18n("Do not ask again"),
00498 &checkboxResult, options);
00499 if ( result==KDialogBase::Cancel ) return Cancel;
00500 res = (result==KDialogBase::Yes ? Yes : No);
00501
00502 if (checkboxResult)
00503 saveDontShowAgainYesNo(dontAskAgainName, res);
00504 return res;
00505 }
00506
00507 int
00508 KMessageBox::warningYesNo(QWidget *parent, const QString &text,
00509 const QString &caption,
00510 const KGuiItem &buttonYes,
00511 const KGuiItem &buttonNo,
00512 const QString &dontAskAgainName,
00513 int options)
00514 {
00515 return warningYesNoList(parent, text, QStringList(), caption,
00516 buttonYes, buttonNo, dontAskAgainName, options);
00517 }
00518
00519 int
00520 KMessageBox::warningYesNoWId(WId parent_id, const QString &text,
00521 const QString &caption,
00522 const KGuiItem &buttonYes,
00523 const KGuiItem &buttonNo,
00524 const QString &dontAskAgainName,
00525 int options)
00526 {
00527 return warningYesNoListWId(parent_id, text, QStringList(), caption,
00528 buttonYes, buttonNo, dontAskAgainName, options);
00529 }
00530
00531 int
00532 KMessageBox::warningYesNoList(QWidget *parent, const QString &text,
00533 const QStringList &strlist,
00534 const QString &caption,
00535 const KGuiItem &buttonYes,
00536 const KGuiItem &buttonNo,
00537 const QString &dontAskAgainName,
00538 int options)
00539 {
00540 return warningYesNoListWId( parent ? parent->winId() : 0, text, strlist, caption,
00541 buttonYes, buttonNo, dontAskAgainName, options );
00542 }
00543
00544 int
00545 KMessageBox::warningYesNoListWId(WId parent_id, const QString &text,
00546 const QStringList &strlist,
00547 const QString &caption,
00548 const KGuiItem &buttonYes,
00549 const KGuiItem &buttonNo,
00550 const QString &dontAskAgainName,
00551 int options)
00552 {
00553
00554
00555
00556 options |= Dangerous;
00557
00558 ButtonCode res;
00559 if ( !shouldBeShownYesNo(dontAskAgainName, res) )
00560 return res;
00561
00562 QWidget* parent = QWidget::find( parent_id );
00563 KDialogBase *dialog= new KDialogBase(
00564 caption.isEmpty() ? i18n("Warning") : caption,
00565 KDialogBase::Yes | KDialogBase::No,
00566 KDialogBase::No, KDialogBase::No,
00567 parent, "warningYesNoList", true, true,
00568 buttonYes, buttonNo);
00569 if( options & PlainCaption )
00570 dialog->setPlainCaption( caption );
00571 #ifdef Q_WS_X11
00572 if( parent == NULL && parent_id )
00573 XSetTransientForHint( qt_xdisplay(), dialog->winId(), parent_id );
00574 #endif
00575
00576 bool checkboxResult = false;
00577 int result = createKMessageBox(dialog, QMessageBox::Warning, text, strlist,
00578 dontAskAgainName.isEmpty() ? QString::null : i18n("Do not ask again"),
00579 &checkboxResult, options);
00580 res = (result==KDialogBase::Yes ? Yes : No);
00581
00582 if (checkboxResult)
00583 saveDontShowAgainYesNo(dontAskAgainName, res);
00584 return res;
00585 }
00586
00587 int
00588 KMessageBox::warningContinueCancel(QWidget *parent,
00589 const QString &text,
00590 const QString &caption,
00591 const KGuiItem &buttonContinue,
00592 const QString &dontAskAgainName,
00593 int options)
00594 {
00595 return warningContinueCancelList(parent, text, QStringList(), caption,
00596 buttonContinue, dontAskAgainName, options);
00597 }
00598
00599 int
00600 KMessageBox::warningContinueCancelWId(WId parent_id,
00601 const QString &text,
00602 const QString &caption,
00603 const KGuiItem &buttonContinue,
00604 const QString &dontAskAgainName,
00605 int options)
00606 {
00607 return warningContinueCancelListWId(parent_id, text, QStringList(), caption,
00608 buttonContinue, dontAskAgainName, options);
00609 }
00610
00611 int
00612 KMessageBox::warningContinueCancelList(QWidget *parent, const QString &text,
00613 const QStringList &strlist,
00614 const QString &caption,
00615 const KGuiItem &buttonContinue,
00616 const QString &dontAskAgainName,
00617 int options)
00618 {
00619 return warningContinueCancelListWId( parent ? parent->winId() : 0, text, strlist,
00620 caption, buttonContinue, dontAskAgainName, options );
00621 }
00622
00623 int
00624 KMessageBox::warningContinueCancelListWId(WId parent_id, const QString &text,
00625 const QStringList &strlist,
00626 const QString &caption,
00627 const KGuiItem &buttonContinue,
00628 const QString &dontAskAgainName,
00629 int options)
00630 {
00631 if ( !shouldBeShownContinue(dontAskAgainName) )
00632 return Continue;
00633
00634 QWidget* parent = QWidget::find( parent_id );
00635 KDialogBase *dialog= new KDialogBase(
00636 caption.isEmpty() ? i18n("Warning") : caption,
00637 KDialogBase::Yes | KDialogBase::No,
00638 KDialogBase::Yes, KDialogBase::No,
00639 parent, "warningYesNo", true, true,
00640 buttonContinue, KStdGuiItem::cancel() );
00641 if( options & PlainCaption )
00642 dialog->setPlainCaption( caption );
00643 #ifdef Q_WS_X11
00644 if( parent == NULL && parent_id )
00645 XSetTransientForHint( qt_xdisplay(), dialog->winId(), parent_id );
00646 #endif
00647
00648 bool checkboxResult = false;
00649 int result = createKMessageBox(dialog, QMessageBox::Warning, text, strlist,
00650 dontAskAgainName.isEmpty() ? QString::null : i18n("Do not ask again"),
00651 &checkboxResult, options);
00652
00653 if ( result==KDialogBase::No )
00654 return Cancel;
00655 if (checkboxResult)
00656 saveDontShowAgainContinue(dontAskAgainName);
00657 return Continue;
00658 }
00659
00660 int
00661 KMessageBox::warningYesNoCancel(QWidget *parent, const QString &text,
00662 const QString &caption,
00663 const KGuiItem &buttonYes,
00664 const KGuiItem &buttonNo,
00665 const QString &dontAskAgainName,
00666 int options)
00667 {
00668 return warningYesNoCancelList(parent, text, QStringList(), caption,
00669 buttonYes, buttonNo, dontAskAgainName, options);
00670 }
00671
00672 int
00673 KMessageBox::warningYesNoCancelWId(WId parent_id, const QString &text,
00674 const QString &caption,
00675 const KGuiItem &buttonYes,
00676 const KGuiItem &buttonNo,
00677 const QString &dontAskAgainName,
00678 int options)
00679 {
00680 return warningYesNoCancelListWId(parent_id, text, QStringList(), caption,
00681 buttonYes, buttonNo, dontAskAgainName, options);
00682 }
00683
00684 int
00685 KMessageBox::warningYesNoCancelList(QWidget *parent, const QString &text,
00686 const QStringList &strlist,
00687 const QString &caption,
00688 const KGuiItem &buttonYes,
00689 const KGuiItem &buttonNo,
00690 const QString &dontAskAgainName,
00691 int options)
00692 {
00693 return warningYesNoCancelListWId( parent ? parent->winId() : 0, text, strlist,
00694 caption, buttonYes, buttonNo, dontAskAgainName, options );
00695 }
00696
00697 int
00698 KMessageBox::warningYesNoCancelListWId(WId parent_id, const QString &text,
00699 const QStringList &strlist,
00700 const QString &caption,
00701 const KGuiItem &buttonYes,
00702 const KGuiItem &buttonNo,
00703 const QString &dontAskAgainName,
00704 int options)
00705 {
00706 ButtonCode res;
00707 if ( !shouldBeShownYesNo(dontAskAgainName, res) )
00708 return res;
00709
00710 QWidget* parent = QWidget::find( parent_id );
00711 KDialogBase *dialog= new KDialogBase(
00712 caption.isEmpty() ? i18n("Warning") : caption,
00713 KDialogBase::Yes | KDialogBase::No | KDialogBase::Cancel,
00714 KDialogBase::Yes, KDialogBase::Cancel,
00715 parent, "warningYesNoCancel", true, true,
00716 buttonYes, buttonNo);
00717 if( options & PlainCaption )
00718 dialog->setPlainCaption( caption );
00719 #ifdef Q_WS_X11
00720 if( parent == NULL && parent_id )
00721 XSetTransientForHint( qt_xdisplay(), dialog->winId(), parent_id );
00722 #endif
00723
00724 bool checkboxResult = false;
00725 int result = createKMessageBox(dialog, QMessageBox::Warning, text, strlist,
00726 dontAskAgainName.isEmpty() ? QString::null : i18n("Do not ask again"),
00727 &checkboxResult, options);
00728 if ( result==KDialogBase::Cancel ) return Cancel;
00729 res = (result==KDialogBase::Yes ? Yes : No);
00730
00731 if (checkboxResult)
00732 saveDontShowAgainYesNo(dontAskAgainName, res);
00733 return res;
00734 }
00735
00736 void
00737 KMessageBox::error(QWidget *parent, const QString &text,
00738 const QString &caption, int options)
00739 {
00740 return errorListWId( parent ? parent->winId() : 0, text, QStringList(), caption, options );
00741 }
00742
00743 void
00744 KMessageBox::errorWId(WId parent_id, const QString &text,
00745 const QString &caption, int options)
00746 {
00747 errorListWId( parent_id, text, QStringList(), caption, options );
00748 }
00749
00750 void
00751 KMessageBox::errorList(QWidget *parent, const QString &text, const QStringList &strlist,
00752 const QString &caption, int options)
00753 {
00754 return errorListWId( parent ? parent->winId() : 0, text, strlist, caption, options );
00755 }
00756
00757 void
00758 KMessageBox::errorListWId(WId parent_id, const QString &text, const QStringList &strlist,
00759 const QString &caption, int options)
00760 {
00761 QWidget* parent = QWidget::find( parent_id );
00762 KDialogBase *dialog= new KDialogBase(
00763 caption.isEmpty() ? i18n("Error") : caption,
00764 KDialogBase::Yes,
00765 KDialogBase::Yes, KDialogBase::Yes,
00766 parent, "error", true, true,
00767 KStdGuiItem::ok() );
00768 if( options & PlainCaption )
00769 dialog->setPlainCaption( caption );
00770 #ifdef Q_WS_X11
00771 if( parent == NULL && parent_id )
00772 XSetTransientForHint( qt_xdisplay(), dialog->winId(), parent_id );
00773 #endif
00774
00775 createKMessageBox(dialog, QMessageBox::Critical, text, strlist, QString::null, 0, options);
00776 }
00777
00778 void
00779 KMessageBox::detailedError(QWidget *parent, const QString &text,
00780 const QString &details,
00781 const QString &caption, int options)
00782 {
00783 return detailedErrorWId( parent ? parent->winId() : 0, text, details, caption, options );
00784 }
00785
00786 void
00787 KMessageBox::detailedErrorWId(WId parent_id, const QString &text,
00788 const QString &details,
00789 const QString &caption, int options)
00790 {
00791 QWidget* parent = QWidget::find( parent_id );
00792 KDialogBase *dialog= new KDialogBase(
00793 caption.isEmpty() ? i18n("Error") : caption,
00794 KDialogBase::Yes | KDialogBase::Details,
00795 KDialogBase::Yes, KDialogBase::Yes,
00796 parent, "error", true, true,
00797 KStdGuiItem::ok() );
00798 if( options & PlainCaption )
00799 dialog->setPlainCaption( caption );
00800 #ifdef Q_WS_X11
00801 if( parent == NULL && parent_id )
00802 XSetTransientForHint( qt_xdisplay(), dialog->winId(), parent_id );
00803 #endif
00804
00805 createKMessageBox(dialog, QMessageBox::Critical, text, QStringList(), QString::null, 0, options, details);
00806 }
00807
00808 void
00809 KMessageBox::queuedDetailedError(QWidget *parent, const QString &text,
00810 const QString &details,
00811 const QString &caption)
00812 {
00813 return queuedDetailedErrorWId( parent ? parent->winId() : 0, text, details, caption );
00814 }
00815
00816 void
00817 KMessageBox::queuedDetailedErrorWId(WId parent_id, const QString &text,
00818 const QString &details,
00819 const QString &caption)
00820 {
00821 KMessageBox_queue = true;
00822 (void) detailedErrorWId(parent_id, text, details, caption);
00823 KMessageBox_queue = false;
00824 }
00825
00826
00827 void
00828 KMessageBox::sorry(QWidget *parent, const QString &text,
00829 const QString &caption, int options)
00830 {
00831 return sorryWId( parent ? parent->winId() : 0, text, caption, options );
00832 }
00833
00834 void
00835 KMessageBox::sorryWId(WId parent_id, const QString &text,
00836 const QString &caption, int options)
00837 {
00838 QWidget* parent = QWidget::find( parent_id );
00839 KDialogBase *dialog= new KDialogBase(
00840 caption.isEmpty() ? i18n("Sorry") : caption,
00841 KDialogBase::Yes,
00842 KDialogBase::Yes, KDialogBase::Yes,
00843 parent, "sorry", true, true,
00844 KStdGuiItem::ok() );
00845 if( options & PlainCaption )
00846 dialog->setPlainCaption( caption );
00847 #ifdef Q_WS_X11
00848 if( parent == NULL && parent_id )
00849 XSetTransientForHint( qt_xdisplay(), dialog->winId(), parent_id );
00850 #endif
00851
00852 createKMessageBox(dialog, QMessageBox::Warning, text, QStringList(), QString::null, 0, options);
00853 }
00854
00855 void
00856 KMessageBox::detailedSorry(QWidget *parent, const QString &text,
00857 const QString &details,
00858 const QString &caption, int options)
00859 {
00860 return detailedSorryWId( parent ? parent->winId() : 0, text, details, caption, options );
00861 }
00862
00863 void
00864 KMessageBox::detailedSorryWId(WId parent_id, const QString &text,
00865 const QString &details,
00866 const QString &caption, int options)
00867 {
00868 QWidget* parent = QWidget::find( parent_id );
00869 KDialogBase *dialog= new KDialogBase(
00870 caption.isEmpty() ? i18n("Sorry") : caption,
00871 KDialogBase::Yes | KDialogBase::Details,
00872 KDialogBase::Yes, KDialogBase::Yes,
00873 parent, "sorry", true, true,
00874 KStdGuiItem::ok() );
00875 if( options & PlainCaption )
00876 dialog->setPlainCaption( caption );
00877 #ifdef Q_WS_X11
00878 if( parent == NULL && parent_id )
00879 XSetTransientForHint( qt_xdisplay(), dialog->winId(), parent_id );
00880 #endif
00881
00882 createKMessageBox(dialog, QMessageBox::Warning, text, QStringList(), QString::null, 0, options, details);
00883 }
00884
00885 void
00886 KMessageBox::information(QWidget *parent,const QString &text,
00887 const QString &caption, const QString &dontShowAgainName, int options)
00888 {
00889 informationList(parent, text, QStringList(), caption, dontShowAgainName, options);
00890 }
00891
00892 void
00893 KMessageBox::informationWId(WId parent_id,const QString &text,
00894 const QString &caption, const QString &dontShowAgainName, int options)
00895 {
00896 informationListWId(parent_id, text, QStringList(), caption, dontShowAgainName, options);
00897 }
00898
00899 void
00900 KMessageBox::informationList(QWidget *parent,const QString &text, const QStringList & strlist,
00901 const QString &caption, const QString &dontShowAgainName, int options)
00902 {
00903 return informationListWId( parent ? parent->winId() : 0, text, strlist, caption,
00904 dontShowAgainName, options );
00905 }
00906
00907 void
00908 KMessageBox::informationListWId(WId parent_id,const QString &text, const QStringList & strlist,
00909 const QString &caption, const QString &dontShowAgainName, int options)
00910 {
00911 if ( !shouldBeShownContinue(dontShowAgainName) )
00912 return;
00913
00914 QWidget* parent = QWidget::find( parent_id );
00915 KDialogBase *dialog= new KDialogBase(
00916 caption.isEmpty() ? i18n("Information") : caption,
00917 KDialogBase::Yes,
00918 KDialogBase::Yes, KDialogBase::Yes,
00919 parent, "information", true, true,
00920 KStdGuiItem::ok() );
00921 if( options & PlainCaption )
00922 dialog->setPlainCaption( caption );
00923 #ifdef Q_WS_X11
00924 if( parent == NULL && parent_id )
00925 XSetTransientForHint( qt_xdisplay(), dialog->winId(), parent_id );
00926 #endif
00927
00928 bool checkboxResult = false;
00929
00930 createKMessageBox(dialog, QMessageBox::Information, text, strlist,
00931 dontShowAgainName.isEmpty() ? QString::null : i18n("Do not show this message again"),
00932 &checkboxResult, options);
00933
00934 if (checkboxResult)
00935 saveDontShowAgainContinue(dontShowAgainName);
00936 }
00937
00938 void
00939 KMessageBox::enableAllMessages()
00940 {
00941 KConfig *config = againConfig ? againConfig : KGlobal::config();
00942 QString grpNotifMsgs = QString::fromLatin1("Notification Messages");
00943 if (!config->hasGroup(grpNotifMsgs))
00944 return;
00945
00946 KConfigGroupSaver saver( config, grpNotifMsgs );
00947
00948 typedef QMap<QString, QString> configMap;
00949
00950 configMap map = config->entryMap(grpNotifMsgs);
00951
00952 configMap::Iterator it;
00953 for (it = map.begin(); it != map.end(); ++it)
00954 config->deleteEntry( it.key() );
00955 config->sync();
00956 }
00957
00958 void
00959 KMessageBox::enableMessage(const QString &dontShowAgainName)
00960 {
00961 KConfig *config = againConfig ? againConfig : KGlobal::config();
00962 QString grpNotifMsgs = QString::fromLatin1("Notification Messages");
00963 if (!config->hasGroup(grpNotifMsgs))
00964 return;
00965
00966 KConfigGroupSaver saver( config, grpNotifMsgs );
00967
00968 config->deleteEntry(dontShowAgainName);
00969 config->sync();
00970 }
00971
00972 void
00973 KMessageBox::about(QWidget *parent, const QString &text,
00974 const QString &caption, int options)
00975 {
00976 QString _caption = caption;
00977 if (_caption.isEmpty())
00978 _caption = i18n("About %1").arg(kapp->caption());
00979
00980 KDialogBase *dialog = new KDialogBase(
00981 caption,
00982 KDialogBase::Yes,
00983 KDialogBase::Yes, KDialogBase::Yes,
00984 parent, "about", true, true,
00985 KStdGuiItem::ok() );
00986
00987 QPixmap ret = KApplication::kApplication()->icon();
00988 if (ret.isNull())
00989 ret = QMessageBox::standardIcon(QMessageBox::Information);
00990 dialog->setIcon(ret);
00991
00992 createKMessageBox(dialog, ret, text, QStringList(), QString::null, 0, options);
00993
00994 return;
00995 }
00996
00997 int KMessageBox::messageBox( QWidget *parent, DialogType type, const QString &text,
00998 const QString &caption, const KGuiItem &buttonYes,
00999 const KGuiItem &buttonNo, const QString &dontShowAskAgainName,
01000 int options )
01001 {
01002 return messageBoxWId( parent ? parent->winId() : 0, type, text, caption,
01003 buttonYes, buttonNo, dontShowAskAgainName, options );
01004 }
01005
01006 int KMessageBox::messageBox( QWidget *parent, DialogType type, const QString &text,
01007 const QString &caption, const KGuiItem &buttonYes,
01008 const KGuiItem &buttonNo, int options )
01009 {
01010 return messageBoxWId( parent ? parent->winId() : 0, type, text, caption,
01011 buttonYes, buttonNo, QString::null, options );
01012 }
01013
01014 int KMessageBox::messageBoxWId( WId parent_id, DialogType type, const QString &text,
01015 const QString &caption, const KGuiItem &buttonYes,
01016 const KGuiItem &buttonNo, const QString &dontShow,
01017 int options )
01018 {
01019 switch (type) {
01020 case QuestionYesNo:
01021 return KMessageBox::questionYesNoWId( parent_id,
01022 text, caption, buttonYes, buttonNo, dontShow, options );
01023 case QuestionYesNoCancel:
01024 return KMessageBox::questionYesNoCancelWId( parent_id,
01025 text, caption, buttonYes, buttonNo, dontShow, options );
01026 case WarningYesNo:
01027 return KMessageBox::warningYesNoWId( parent_id,
01028 text, caption, buttonYes, buttonNo, dontShow, options );
01029 case WarningContinueCancel:
01030 return KMessageBox::warningContinueCancelWId( parent_id,
01031 text, caption, buttonYes.text(), dontShow, options );
01032 case WarningYesNoCancel:
01033 return KMessageBox::warningYesNoCancelWId( parent_id,
01034 text, caption, buttonYes, buttonNo, dontShow, options );
01035 case Information:
01036 KMessageBox::informationWId( parent_id,
01037 text, caption, dontShow, options );
01038 return KMessageBox::Ok;
01039
01040 case Error:
01041 KMessageBox::errorWId( parent_id, text, caption, options );
01042 return KMessageBox::Ok;
01043
01044 case Sorry:
01045 KMessageBox::sorryWId( parent_id, text, caption, options );
01046 return KMessageBox::Ok;
01047 }
01048 return KMessageBox::Cancel;
01049 }
01050
01051 void KMessageBox::queuedMessageBox( QWidget *parent, DialogType type, const QString &text, const QString &caption, int options )
01052 {
01053 return queuedMessageBoxWId( parent ? parent->winId() : 0, type, text, caption, options );
01054 }
01055
01056 void KMessageBox::queuedMessageBoxWId( WId parent_id, DialogType type, const QString &text, const QString &caption, int options )
01057 {
01058 KMessageBox_queue = true;
01059 (void) messageBoxWId(parent_id, type, text, caption, KStdGuiItem::yes(),
01060 KStdGuiItem::no(), QString::null, options);
01061 KMessageBox_queue = false;
01062 }
01063
01064 void KMessageBox::queuedMessageBox( QWidget *parent, DialogType type, const QString &text, const QString &caption )
01065 {
01066 return queuedMessageBoxWId( parent ? parent->winId() : 0, type, text, caption );
01067 }
01068
01069 void KMessageBox::queuedMessageBoxWId( WId parent_id, DialogType type, const QString &text, const QString &caption )
01070 {
01071 KMessageBox_queue = true;
01072 (void) messageBoxWId(parent_id, type, text, caption);
01073 KMessageBox_queue = false;
01074 }