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