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