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