kdeui Library API Documentation

kdialog.cpp

00001 /*  This file is part of the KDE Libraries
00002  *  Copyright (C) 1998 Thomas Tanghus (tanghus@earthling.net)
00003  *  Additions 1999-2000 by Espen Sand (espen@kde.org)
00004  *
00005  *  This library is free software; you can redistribute it and/or
00006  *  modify it under the terms of the GNU Library General Public
00007  *  License as published by the Free Software Foundation; either
00008  *  version 2 of the License, or (at your option) any later version.
00009  *
00010  *  This library is distributed in the hope that it will be useful,
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  *  Library General Public License for more details.
00014  *
00015  *  You should have received a copy of the GNU Library General Public License
00016  *  along with this library; see the file COPYING.LIB.  If not, write to
00017  *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00018  *  Boston, MA 02111-1307, USA.
00019  */
00020 
00021 #include <qlayout.h>
00022 #include <qobjectlist.h>
00023 #include <qguardedptr.h>
00024 #include <qlineedit.h>
00025 #include <qvaluelist.h>
00026 #include <qtimer.h>
00027 #include <netwm.h>
00028 
00029 #include <kapplication.h>
00030 #include <kdialog.h>
00031 #include <kdebug.h>
00032 #include <kstaticdeleter.h>
00033 
00034 int KDialog::mMarginSize = 11;
00035 int KDialog::mSpacingSize = 6;
00036 
00037 template class QPtrList<QLayoutItem>;
00038 
00039 KDialog::KDialog(QWidget *parent, const char *name, bool modal, WFlags f)
00040   : QDialog(parent, name, modal, f)
00041 {
00042 }
00043 
00044 //
00045 // Grab QDialogs keypresses if non-modal.
00046 //
00047 void KDialog::keyPressEvent(QKeyEvent *e)
00048 {
00049   if ( e->state() == 0 )
00050   {
00051     switch ( e->key() )
00052     {
00053       case Key_Escape:
00054       case Key_Enter:
00055       case Key_Return:
00056       {
00057         if(testWFlags(WType_Dialog | WShowModal))
00058         {
00059           QDialog::keyPressEvent(e);
00060         }
00061         else
00062         {
00063           e->ignore();
00064         }
00065       }
00066       break;
00067       default:
00068         e->ignore();
00069         return;
00070     }
00071   }
00072   else
00073   {
00074       // accept the dialog when Ctrl-Return is pressed
00075       if ( e->state() == ControlButton && 
00076            qApp->focusWidget()  && 
00077            (qApp->focusWidget()->inherits( "QTextEdit" ) ||
00078             qApp->focusWidget()->inherits( "QLineEdit" )) &&
00079            (e->key() == Key_Return || e->key() == Key_Enter) )
00080       {
00081           e->accept();
00082           accept();
00083       }
00084       else
00085       {
00086           e->ignore();
00087       }
00088   }
00089 }
00090 
00091 
00092 int KDialog::marginHint()
00093 {
00094   return( mMarginSize );
00095 }
00096 
00097 
00098 int KDialog::spacingHint()
00099 {
00100   return( mSpacingSize );
00101 }
00102 
00103 
00104 void KDialog::polish()
00105 {
00106   QDialog::polish();
00107   QWidget *w = focusWidget();
00108   if( w && w->isEnabled() && w->inherits( "QLineEdit" ) &&
00109       !w->inherits( "KPasswordEdit" ))
00110     ((QLineEdit*)w)->selectAll();
00111 }
00112 
00113 
00114 void KDialog::setCaption( const QString &_caption )
00115 {
00116   QString caption = kapp ? kapp->makeStdCaption( _caption ) : _caption;
00117   setPlainCaption( caption );
00118 }
00119 
00120 
00121 void KDialog::setPlainCaption( const QString &caption )
00122 {
00123   QDialog::setCaption( caption );
00124 
00125 #ifdef Q_WS_X11 //FIXME(E) Implement for Qt/E
00126   NETWinInfo info( qt_xdisplay(), winId(), qt_xrootwin(), 0 );
00127   info.setName( caption.utf8().data() );
00128 #endif
00129 }
00130 
00131 
00132 void KDialog::resizeLayout( QWidget *w, int margin, int spacing )
00133 {
00134   if( w->layout() )
00135   {
00136     resizeLayout( w->layout(), margin, spacing );
00137   }
00138 
00139   if( w->children() )
00140   {
00141     QObjectList *l = (QObjectList*)w->children(); // silence please
00142     for( uint i=0; i < l->count(); i++ )
00143     {
00144       QObject *o = l->at(i);
00145       if( o->isWidgetType() )
00146       {
00147         resizeLayout( (QWidget*)o, margin, spacing );
00148       }
00149     }
00150   }
00151 }
00152 
00153 
00154 void KDialog::resizeLayout( QLayoutItem *lay, int margin, int spacing )
00155 {
00156   QLayoutIterator it = lay->iterator();
00157   QLayoutItem *child;
00158   while ( (child = it.current() ) )
00159   {
00160     resizeLayout( child, margin, spacing );
00161     ++it;
00162   }
00163   if( lay->layout() != 0 )
00164   {
00165     lay->layout()->setMargin( margin );
00166     lay->layout()->setSpacing( spacing );
00167   }
00168 }
00169 
00170 void KDialog::centerOnScreen( QWidget *w, int screen )
00171 {
00172   if ( !w )
00173     return;
00174 
00175   QDesktopWidget *desktop = QApplication::desktop();
00176   if ( screen < 0 || screen >= desktop->numScreens() )
00177   {
00178     screen = desktop->screenNumber( w );
00179     if ( screen == -1 )
00180       screen = desktop->primaryScreen();
00181   }
00182 
00183   QRect r = desktop->screenGeometry( screen );
00184   w->move( r.center().x() - w->width()/2,
00185            r.center().y() - w->height()/2 );
00186 }
00187 
00188 class KDialogQueuePrivate
00189 {
00190 public:
00191   QValueList< QGuardedPtr<QDialog> > queue;
00192   bool busy;
00193 };
00194 
00195 static KStaticDeleter<KDialogQueue> ksdkdq;
00196 
00197 KDialogQueue *KDialogQueue::_self=0;
00198 
00199 KDialogQueue* KDialogQueue::self()
00200 {
00201    if (!_self)
00202       _self = ksdkdq.setObject(new KDialogQueue);
00203    return _self;
00204 }
00205 
00206 KDialogQueue::KDialogQueue()
00207 {
00208    d = new KDialogQueuePrivate;
00209    d->busy = false;
00210 }
00211 
00212 KDialogQueue::~KDialogQueue()
00213 {
00214    delete d; d = 0;
00215    _self = 0;
00216 }
00217 
00218 // static
00219 void KDialogQueue::queueDialog(QDialog *dialog)
00220 {
00221    KDialogQueue *_this = self();
00222    _this->d->queue.append(dialog);
00223    QTimer::singleShot(0, _this, SLOT(slotShowQueuedDialog()));
00224 }
00225 
00226 void KDialogQueue::slotShowQueuedDialog()
00227 {
00228    if (d->busy)
00229       return;
00230    QDialog *dialog;
00231    do {
00232       if(!d->queue.count())
00233          return;
00234       dialog = d->queue.first();
00235       d->queue.remove(d->queue.begin());
00236    }
00237    while(!dialog);
00238 
00239    d->busy = true;
00240    dialog->exec();
00241    d->busy = false;
00242    delete dialog;
00243 
00244    if (d->queue.count())
00245       QTimer::singleShot(20, this, SLOT(slotShowQueuedDialog()));
00246    else
00247       ksdkdq.destructObject(); // Suicide.
00248 }
00249 
00250 void KDialog::virtual_hook( int, void* )
00251 { /*BASE::virtual_hook( id, data );*/ }
00252 
00253 #include "kdialog.moc"
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.5.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Wed Jan 28 12:56:28 2004 by doxygen 1.3.4 written by Dimitri van Heesch, © 1997-2001