kdeui Library API Documentation

kmessagebox.cpp

00001 /* This file is part of the KDE libraries 00002 Copyright (C) 1999 Waldo Bastian (bastian@kde.org) 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License as published by the Free Software Foundation; version 2 00007 of the License. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public License 00015 along with this library; see the file COPYING.LIB. If not, write to 00016 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00017 Boston, MA 02111-1307, USA. 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 // create the message for KNotify 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 // Enforce <p>text</p> otherwise the word-wrap doesn't work well 00172 QString qt_text = qrichtextify( text ); 00173 00174 int pref_width = 0; 00175 int pref_height = 0; 00176 // Calculate a proper size for the text. 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 // Very high dialog.. make it wider 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 // We add 10 pixels extra to compensate for some KActiveLabel margins. 00224 // TODO: find out why this is 10. 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; // We have to return something. 00299 } 00300 00301 if ( (options & KMessageBox::NoExec) ) 00302 { 00303 return KMessageBox::Cancel; // We have to return something. 00304 } 00305 00306 // We use a QGuardedPtr because the dialog may get deleted 00307 // during exec() if the parent of the dialog gets deleted. 00308 // In that case the guarded ptr will reset to 0. 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 { // in order to avoid code duplication, convert to WId, it will be converted back 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 // warningYesNo and warningYesNoList are always "dangerous" 00553 // ### Remove this line for KDE 4, when the 'options' default parameter 00554 // takes effects. 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 }
KDE Logo
This file is part of the documentation for kdeui Library Version 3.4.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Apr 14 00:10:14 2005 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003