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