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