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