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