00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include <kconfig.h>
00022
#include <kapplication.h>
00023
#include <kdialog.h>
00024
#include <kdebug.h>
00025
#include <kstaticdeleter.h>
00026
00027
#include <qlayout.h>
00028
#include <qobjectlist.h>
00029
#include <qguardedptr.h>
00030
#include <qlineedit.h>
00031
#include <qvaluelist.h>
00032
#include <qtimer.h>
00033
#include <qcursor.h>
00034
00035
#include "config.h"
00036
#if defined Q_WS_X11 && ! defined K_WS_QTONLY
00037
#include <netwm.h>
00038
#endif
00039
00040
int KDialog::mMarginSize = 11;
00041
int KDialog::mSpacingSize = 6;
00042
00043
template class QPtrList<QLayoutItem>;
00044
00045 KDialog::KDialog(
QWidget *parent,
const char *name,
bool modal, WFlags f)
00046 :
QDialog(parent, name, modal, f)
00047 {
00048 }
00049
00050
00051
00052
00053
void KDialog::keyPressEvent(
QKeyEvent *e)
00054 {
00055
if ( e->
state() == 0 )
00056 {
00057
switch ( e->
key() )
00058 {
00059
case Key_Escape:
00060
case Key_Enter:
00061
case Key_Return:
00062 {
00063
if(testWFlags(WType_Dialog | WShowModal))
00064 {
00065 QDialog::keyPressEvent(e);
00066 }
00067
else
00068 {
00069 e->
ignore();
00070 }
00071 }
00072
break;
00073
default:
00074 e->
ignore();
00075
return;
00076 }
00077 }
00078
else
00079 {
00080
00081
if ( e->
state() == ControlButton &&
00082 (e->
key() == Key_Return || e->
key() == Key_Enter) )
00083 {
00084 e->
accept();
00085
accept();
00086 }
00087
else
00088 {
00089 e->
ignore();
00090 }
00091 }
00092 }
00093
00094
00095 int KDialog::marginHint()
00096 {
00097
return( mMarginSize );
00098 }
00099
00100
00101 int KDialog::spacingHint()
00102 {
00103
return( mSpacingSize );
00104 }
00105
00106
00107 void KDialog::polish()
00108 {
00109 QDialog::polish();
00110
QWidget *w = focusWidget();
00111
if( w && w->
isEnabled() && w->inherits(
"QLineEdit" ) &&
00112 !w->inherits(
"KPasswordEdit" ))
00113 ((
QLineEdit*)w)->selectAll();
00114 }
00115
00116
00117 void KDialog::setCaption(
const QString &_caption )
00118 {
00119
QString caption = kapp ? kapp->makeStdCaption( _caption ) : _caption;
00120
setPlainCaption( caption );
00121 }
00122
00123
00124 void KDialog::setPlainCaption(
const QString &caption )
00125 {
00126 QDialog::setCaption( caption );
00127
00128
#if defined Q_WS_X11 && ! defined K_WS_QTONLY
00129
00130 NETWinInfo info( qt_xdisplay(), winId(), qt_xrootwin(), 0 );
00131 info.setName( caption.
utf8().data() );
00132
#endif
00133
}
00134
00135
00136 void KDialog::resizeLayout(
QWidget *w,
int margin,
int spacing )
00137 {
00138
if( w->
layout() )
00139 {
00140
resizeLayout( w->
layout(), margin, spacing );
00141 }
00142
00143
if( w->children() )
00144 {
00145
QObjectList *l = (
QObjectList*)w->children();
00146
for( uint i=0; i < l->count(); i++ )
00147 {
00148
QObject *o = l->at(i);
00149
if( o->
isWidgetType() )
00150 {
00151
resizeLayout( (
QWidget*)o, margin, spacing );
00152 }
00153 }
00154 }
00155 }
00156
00157
00158 void KDialog::resizeLayout(
QLayoutItem *lay,
int margin,
int spacing )
00159 {
00160
QLayoutIterator it = lay->
iterator();
00161
QLayoutItem *child;
00162
while ( (child = it.
current() ) )
00163 {
00164
resizeLayout( child, margin, spacing );
00165 ++it;
00166 }
00167
if( lay->
layout() != 0 )
00168 {
00169 lay->
layout()->setMargin( margin );
00170 lay->
layout()->setSpacing( spacing );
00171 }
00172 }
00173
00174
static QRect screenRect(
QWidget *w,
int screen )
00175 {
00176
QDesktopWidget *desktop =
QApplication::desktop();
00177
KConfig gc(
"kdeglobals",
false,
false);
00178 gc.
setGroup(
"Windows");
00179
if (desktop->
isVirtualDesktop() &&
00180 gc.
readBoolEntry(
"XineramaEnabled",
true) &&
00181 gc.
readBoolEntry(
"XineramaPlacementEnabled",
true)) {
00182
if ( screen < 0 || screen >= desktop->
numScreens() ) {
00183
if ( screen == -1 ) {
00184 screen = desktop->
primaryScreen();
00185 }
else if ( screen == -3 ) {
00186 screen = desktop->
screenNumber( QCursor::pos() );
00187 }
else {
00188 screen = desktop->
screenNumber( w );
00189 }
00190 }
00191
return desktop->
screenGeometry(screen);
00192 }
else {
00193
return desktop->geometry();
00194 }
00195 }
00196
00197 void KDialog::centerOnScreen(
QWidget *w,
int screen )
00198 {
00199
if ( !w )
00200
return;
00201
QRect r = screenRect( w, screen );
00202
00203 w->
move( r.
center().x() - w->
width()/2,
00204 r.
center().y() - w->
height()/2 );
00205 }
00206
00207 bool KDialog::avoidArea(
QWidget *w,
const QRect& area,
int screen )
00208 {
00209
if ( !w )
00210
return false;
00211
QRect fg = w->
frameGeometry();
00212
if ( !fg.
intersects( area ) )
00213
return true;
00214
00215
QRect scr = screenRect( w, screen );
00216
QRect avoid( area );
00217 avoid.
moveBy( -5, -5 );
00218 avoid.
rRight() += 10;
00219 avoid.
rBottom() += 10;
00220
00221
if ( QMAX( fg.
top(), avoid.
top() ) <= QMIN( fg.
bottom(), avoid.
bottom() ) )
00222 {
00223
00224
int spaceAbove = QMAX(0, avoid.
top() - scr.
top());
00225
int spaceBelow = QMAX(0, scr.
bottom() - avoid.
bottom());
00226
if ( spaceAbove > spaceBelow )
00227
if ( fg.
height() <= spaceAbove )
00228 fg.
setY( avoid.
top() - fg.
height() );
00229
else
00230
return false;
00231
else
00232
if ( fg.
height() <= spaceBelow )
00233 fg.
setY( avoid.
bottom() );
00234
else
00235
return false;
00236 }
00237
00238
if ( QMAX( fg.
left(), avoid.
left() ) <= QMIN( fg.
right(), avoid.
right() ) )
00239 {
00240
00241
int spaceLeft = QMAX(0, avoid.
left() - scr.
left());
00242
int spaceRight = QMAX(0, scr.
right() - avoid.
right());
00243
if ( spaceLeft > spaceRight )
00244
if ( fg.
width() <= spaceLeft )
00245 fg.
setX( avoid.
left() - fg.
width() );
00246
else
00247
return false;
00248
else
00249
if ( fg.
width() <= spaceRight )
00250 fg.
setX( avoid.
right() );
00251
else
00252
return false;
00253 }
00254
00255 w->
move(fg.
x(), fg.
y());
00256
return true;
00257 }
00258
00259
class KDialogQueuePrivate
00260 {
00261
public:
00262
QValueList< QGuardedPtr<QDialog> > queue;
00263
bool busy;
00264 };
00265
00266
static KStaticDeleter<KDialogQueue> ksdkdq;
00267
00268 KDialogQueue *KDialogQueue::_self=0;
00269
00270 KDialogQueue* KDialogQueue::self()
00271 {
00272
if (!_self)
00273 _self = ksdkdq.setObject(_self,
new KDialogQueue);
00274
return _self;
00275 }
00276
00277 KDialogQueue::KDialogQueue()
00278 {
00279 d =
new KDialogQueuePrivate;
00280 d->busy =
false;
00281 }
00282
00283 KDialogQueue::~KDialogQueue()
00284 {
00285
delete d; d = 0;
00286 _self = 0;
00287 }
00288
00289
00290
void KDialogQueue::queueDialog(
QDialog *dialog)
00291 {
00292 KDialogQueue *_this =
self();
00293 _this->d->queue.append(dialog);
00294
QTimer::singleShot(0, _this, SLOT(slotShowQueuedDialog()));
00295 }
00296
00297
void KDialogQueue::slotShowQueuedDialog()
00298 {
00299
if (d->busy)
00300
return;
00301
QDialog *dialog;
00302
do {
00303
if(!d->queue.count())
00304
return;
00305 dialog = d->queue.first();
00306 d->queue.remove(d->queue.begin());
00307 }
00308
while(!dialog);
00309
00310 d->busy =
true;
00311 dialog->
exec();
00312 d->busy =
false;
00313
delete dialog;
00314
00315
if (d->queue.count())
00316
QTimer::singleShot(20,
this, SLOT(slotShowQueuedDialog()));
00317
else
00318 ksdkdq.destructObject();
00319 }
00320
00321
void KDialog::virtual_hook(
int,
void* )
00322 { }
00323
00324
#include "kdialog.moc"