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