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