diff options
Diffstat (limited to 'tqtinterface/qt4/src/dialogs/tqdialog.cpp')
-rw-r--r-- | tqtinterface/qt4/src/dialogs/tqdialog.cpp | 1192 |
1 files changed, 0 insertions, 1192 deletions
diff --git a/tqtinterface/qt4/src/dialogs/tqdialog.cpp b/tqtinterface/qt4/src/dialogs/tqdialog.cpp deleted file mode 100644 index bbb0ad5..0000000 --- a/tqtinterface/qt4/src/dialogs/tqdialog.cpp +++ /dev/null @@ -1,1192 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQDialog class -** -** Created : 950502 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the dialogs module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqdialog.h" - -#ifndef TQT_NO_DIALOG - -#include "tqpushbutton.h" -#include "tqfocusdata.h" -#include "tqapplication.h" -#include "tqobjectlist.h" -#include "tqwidgetlist.h" -#include "tqlayout.h" -#include "tqsizegrip.h" -#include "tqwhatsthis.h" -#include "tqpopupmenu.h" -#include "tqcursor.h" -#if defined(TQT_ACCESSIBILITY_SUPPORT) -#include "tqaccessible.h" -#endif -#if defined( TQ_OS_TEMP ) -#include "tqt_windows.h" -#endif - -/*! - \class TQDialog - \brief The TQDialog class is the base class of dialog windows. - - \ingroup dialogs - \ingroup abstractwidgets - \mainclass - - A dialog window is a top-level window mostly used for short-term - tasks and brief communications with the user. TQDialogs may be - modal or modeless. TQDialogs support \link #extensibility - extensibility\endlink and can provide a \link #return return - value\endlink. They can have \link #default default - buttons\endlink. TQDialogs can also have a TQSizeGrip in their - lower-right corner, using setSizeGripEnabled(). - - Note that TQDialog uses the parent widget slightly differently from - other classes in TQt. A dialog is always a top-level widget, but if - it has a parent, its default location is centered on top of the - parent's top-level widget (if it is not top-level itself). It will - also share the parent's taskbar entry. - - \target modal - \section1 Modal Dialogs - - A <b>modal</b> dialog is a dialog that blocks input to other - visible windows in the same application. Users must finish - interacting with the dialog and close it before they can access - any other window in the application. Dialogs that are used to - request a file name from the user or that are used to set - application preferences are usually modal. - - The most common way to display a modal dialog is to call its - exec() function. When the user closes the dialog, exec() will - provide a useful \link #return return value\endlink. Typically we - connect a default button, e.g. "OK", to the accept() slot and a - "Cancel" button to the reject() slot, to get the dialog to close - and return the appropriate value. Alternatively you can connect to - the done() slot, passing it \c Accepted or \c Rejected. - - An alternative is to call setModal(TRUE), then show(). Unlike - exec(), show() returns control to the caller immediately. Calling - setModal(TRUE) is especially useful for progress dialogs, where - the user must have the ability to interact with the dialog, e.g. - to cancel a long running operation. If you use show() and - setModal(TRUE) together you must call - TQApplication::processEvents() periodically during processing to - enable the user to interact with the dialog. (See \l - TQProgressDialog.) - - \target modeless - \section1 Modeless Dialogs - - A <b>modeless</b> dialog is a dialog that operates - independently of other windows in the same application. Find and - replace dialogs in word-processors are often modeless to allow the - user to interact with both the application's main window and with - the dialog. - - Modeless dialogs are displayed using show(), which returns control - to the caller immediately. - - \target default - \section1 Default button - - A dialog's \e default button is the button that's pressed when the - user presses Enter (Return). This button is used to signify that - the user accepts the dialog's settings and wants to close the - dialog. Use TQPushButton::setDefault(), TQPushButton::isDefault() - and TQPushButton::autoDefault() to set and control the dialog's - default button. - - \target escapekey - \section1 Escape Key - - If the user presses the Esc key in a dialog, TQDialog::reject() - will be called. This will cause the window to close: the \link - TQCloseEvent closeEvent \endlink cannot be \link - TQCloseEvent::ignore() ignored \endlink. - - \target extensibility - \section1 Extensibility - - Extensibility is the ability to show the dialog in two ways: a - partial dialog that shows the most commonly used options, and a - full dialog that shows all the options. Typically an extensible - dialog will initially appear as a partial dialog, but with a - "More" toggle button. If the user presses the "More" button down, - the full dialog will appear. The extension widget will be resized - to its tqsizeHint(). If orientation is \c Horizontal the extension - widget's height() will be expanded to the height() of the dialog. - If the orientation is \c Vertical the extension widget's width() - will be expanded to the width() of the dialog. Extensibility is - controlled with setExtension(), setOrientation() and - showExtension(). - - \target return - \section1 Return value (modal dialogs) - - Modal dialogs are often used in situations where a return value is - required, e.g. to indicate whether the user pressed "OK" or - "Cancel". A dialog can be closed by calling the accept() or the - reject() Q_SLOTS, and exec() will return \c Accepted or \c Rejected - as appropriate. The exec() call returns the result of the dialog. - The result is also available from result() if the dialog has not - been destroyed. If the \c WDestructiveClose flag is set, the - dialog is deleted after exec() returns. - - \target examples - \section1 Examples - - A modal dialog. - - \quotefile network/networkprotocol/view.cpp - \skipto TQFileDialog *dlg - \printuntil return - - A modeless dialog. After the show() call, control returns to the main - event loop. - \quotefile life/main.cpp - \skipto argv - \printuntil TQApplication - \skipto scale - \printline - \skipto LifeDialog - \printuntil show - \skipto exec - \printuntil } - - \sa TQTabDialog TQWidget TQProgressDialog - \link guibooks.html#fowler GUI Design Handbook: Dialogs, Standard\endlink -*/ - -/*! \enum TQDialog::DialogCode - - The value returned by a modal dialog. - - \value Accepted - \value Rejected - -*/ - -/*! - \property TQDialog::sizeGripEnabled - \brief whether the size grip is enabled - - A TQSizeGrip is placed in the bottom right corner of the dialog when this - property is enabled. By default, the size grip is disabled. -*/ - -class TQDialogPrivate : public TQt -{ -public: - - TQDialogPrivate() - : mainDef(0), orientation(Qt::Horizontal),extension(0), doShowExtension(FALSE) -#ifndef TQT_NO_SIZEGRIP - ,resizer(0) -#endif - { - } - - TQPushButton* mainDef; - Qt::Orientation orientation; - TQWidget* extension; - bool doShowExtension; - TQSize size, min, max; -#ifndef TQT_NO_SIZEGRIP - TQSizeGrip* resizer; -#endif - TQPoint lastRMBPress; - TQPoint relPos; // relative position to the main window -}; - -/*! - Constructs a dialog called \a name, with parent \a parent. - - A dialog is always a top-level widget, but if it has a parent, its - default location is centered on top of the parent. It will also - share the parent's taskbar entry. - - The widget flags \a f are passed on to the TQWidget constructor. - If, for example, you don't want a What's This button in the titlebar - of the dialog, pass WStyle_Customize | WStyle_NormalBorder | - WStyle_Title | WStyle_SysMenu in \a f. - - \warning In TQt 3.2, the \a modal flag is obsolete. There is now a - setModal() function that can be used for obtaining a modal behavior - when calling show(). This is rarely needed, because modal dialogs - are usually invoked using exec(), which ignores the \a modal flag. - - \sa TQWidget::setWFlags() TQt::WidgetFlags -*/ - -TQDialog::TQDialog( TQWidget *parent, const char *name, bool modal, WFlags f ) - : TQWidget( parent, name, - (WFlags)((modal ? (WFlags)(f|TQt::WShowModal) : f) | TQt::WType_Dialog )), - rescode(0), did_move(0), has_relpos(0), did_resize(0), in_loop(0) -{ - d = new TQDialogPrivate; -} - -/*! - Destroys the TQDialog, deleting all its tqchildren. -*/ - -TQDialog::~TQDialog() -{ - // Need to hide() here, as our (to-be) overridden hide() - // will not be called in ~TQWidget. - hide(); - delete d; -} - -/*! - \internal - This function is called by the push button \a pushButton when it - becomes the default button. If \a pushButton is 0, the dialogs - default default button becomes the default button. This is what a - push button calls when it loses focus. -*/ - -void TQDialog::setDefault( TQPushButton *pushButton ) -{ -#ifndef TQT_NO_PUSHBUTTON - TQObjectList *list = queryList( "TQPushButton" ); - TQ_ASSERT(list); - TQObjectListIt it( *list ); - TQPushButton *pb; - bool hasMain = FALSE; - while ( (pb = (TQPushButton*)it.current()) ) { - ++it; - if ( pb->tqtopLevelWidget() != this ) - continue; - if ( pb == d->mainDef ) - hasMain = TRUE; - if ( pb != pushButton ) - pb->setDefault( FALSE ); - } - if (!pushButton && hasMain) - d->mainDef->setDefault( TRUE ); - if (!hasMain) - d->mainDef = pushButton; - delete list; -#endif -} - -/*! - \internal - This function sets the default default pushbutton to \a pushButton. - This function is called by TQPushButton::setDefault(). -*/ -void TQDialog::setMainDefault( TQPushButton *pushButton ) -{ -#ifndef TQT_NO_PUSHBUTTON - d->mainDef = 0; - setDefault(pushButton); -#endif -} - -/*! - \internal - Hides the default button indicator. Called when non auto-default - push button get focus. - */ -void TQDialog::hideDefault() -{ -#ifndef TQT_NO_PUSHBUTTON - TQObjectList *list = queryList( "TQPushButton" ); - TQObjectListIt it( *list ); - TQPushButton *pb; - while ( (pb = (TQPushButton*)it.current()) ) { - ++it; - pb->setDefault( FALSE ); - } - delete list; -#endif -} - -#ifdef TQ_OS_TEMP -/*! - \internal - Hides special buttons which are rather shown in the titlebar - on WinCE, to conserve screen space. -*/ -# include "tqmessagebox.h" -extern const char * mb_texts[]; // Defined in qmessagebox.cpp -void TQDialog::hideSpecial() -{ - // "OK" buttons are hidden, and (Ok) shown on titlebar - // "Cancel" buttons are hidden, and (X) shown on titlebar - // "Help" buttons are hidden, and (?) shown on titlebar - bool showOK = FALSE, - showX = FALSE, - showQ = FALSE; - TQObjectList *list = queryList( "TQPushButton" ); - TQObjectListIt it( *list ); - TQPushButton *pb; - while ( (pb = (TQPushButton*)it.current()) ) { - if ( !showOK && - pb->text() == tqApp->translate( "TQMessageBox", mb_texts[TQMessageBox::Ok] ) ) { - pb->hide(); - showOK = TRUE; - } else if ( !showX && - pb->text() == tqApp->translate( "TQMessageBox", mb_texts[TQMessageBox::Cancel] ) ) { - pb->hide(); - showX = TRUE; - } else if ( !showQ && - pb->text() == tqApp->tr("Help") ) { - pb->hide(); - showQ = TRUE; - } - ++it; - } - delete list; - if ( showOK || showQ ) { - DWORD ext = GetWindowLong( winId(), GWL_EXSTYLE ); - ext |= showOK ? WS_EX_CAPTIONOKBTN : 0; - ext |= showQ ? WS_EX_CONTEXTHELP: 0; - SetWindowLong( winId(), GWL_EXSTYLE, ext ); - } - if ( !showX ) { - DWORD ext = GetWindowLong( winId(), GWL_STYLE ); - ext &= ~WS_SYSMENU; - SetWindowLong( winId(), GWL_STYLE, ext ); - } -} -#endif - -/*! - \fn int TQDialog::result() const - - Returns the modal dialog's result code, \c Accepted or \c Rejected. - - Do not call this function if the dialog was constructed with the \c - WDestructiveClose flag. -*/ - -/*! - \fn void TQDialog::setResult( int i ) - - Sets the modal dialog's result code to \a i. -*/ - - -/*! - Shows the dialog as a \link #modal modal \endlink dialog, - blocking until the user closes it. The function returns a \l - DialogCode result. - - Users cannot interact with any other window in the same - application until they close the dialog. - - \sa show(), result() -*/ - -int TQDialog::exec() -{ - if ( in_loop ) { - qWarning( "TQDialog::exec: Recursive call detected" ); - return -1; - } - - bool destructiveClose = testWFlags( TQt::WDestructiveClose ); - clearWFlags( TQt::WDestructiveClose ); - - bool wasShowModal = testWFlags( TQt::WShowModal ); - setWFlags( TQt::WShowModal ); - setResult( 0 ); - - show(); - - in_loop = TRUE; - tqApp->enter_loop(); - - if ( !wasShowModal ) - clearWFlags( TQt::WShowModal ); - - int res = result(); - - if ( destructiveClose ) - delete this; - - return res; -} - - -/*! Closes the dialog and sets its result code to \a r. If this dialog - is shown with exec(), done() causes the local event loop to finish, - and exec() to return \a r. - - As with TQWidget::close(), done() deletes the dialog if the \c - WDestructiveClose flag is set. If the dialog is the application's - main widget, the application terminates. If the dialog is the - last window closed, the TQApplication::lastWindowClosed() signal is - emitted. - - \sa accept(), reject(), TQApplication::mainWidget(), TQApplication::quit() -*/ - -void TQDialog::done( int r ) -{ - hide(); - setResult( r ); - - // emulate TQWidget::close() - bool isMain = tqApp->mainWidget() == this; - bool checkLastWindowClosed = isTopLevel() && !isPopup(); - if ( checkLastWindowClosed - && TQT_TQOBJECT(tqApp)->tqreceivers(TQT_SIGNAL(lastWindowClosed())) ) { - /* if there is no non-withdrawn top level window left (except - the desktop, popups, or dialogs with parents), we emit the - lastWindowClosed signal */ - TQWidgetList *list = tqApp->tqtopLevelWidgets(); - TQWidget *widget = list->first(); - while ( widget ) { - if ( !widget->isHidden() - && !widget->isDesktop() - && !widget->isPopup() - && (!widget->isDialog() || !widget->parentWidget())) - break; - widget = list->next(); - } - delete list; - if ( widget == 0 ) - emit tqApp->lastWindowClosed(); - } - if ( isMain ) - tqApp->quit(); - else if ( testWFlags(TQt::WDestructiveClose) ) { - clearWFlags(TQt::WDestructiveClose); - deleteLater(); - } -} - -/*! - Hides the modal dialog and sets the result code to \c Accepted. - - \sa reject() done() -*/ - -void TQDialog::accept() -{ - done( Accepted ); -} - -/*! - Hides the modal dialog and sets the result code to \c Rejected. - - \sa accept() done() -*/ - -void TQDialog::reject() -{ - done( Rejected ); -} - -/*! \reimp */ -bool TQDialog::eventFilter( TQObject *o, TQEvent *e ) -{ - return TQWidget::eventFilter( o, e ); -} - -/***************************************************************************** - Event handlers - *****************************************************************************/ - -/*! \reimp */ -void TQDialog::contextMenuEvent( TQContextMenuEvent *e ) -{ -#if !defined(TQT_NO_WHATSTHIS) && !defined(TQT_NO_POPUPMENU) - TQWidget* w = tqchildAt( e->pos(), TRUE ); - if ( !w ) - return; - TQString s; - while ( s.isEmpty() && w ) { - s = TQWhatsThis::textFor( w, e->pos(), FALSE ); - if ( s.isEmpty() ) - w = w->parentWidget(TRUE); - } - if ( !s.isEmpty() ) { - TQPopupMenu p(0,"qt_whats_this_menu"); - p.insertItem( tr("What's This?"), 42 ); - if ( p.exec( e->globalPos() ) >= 42 ) - TQWhatsThis::display( s, w->mapToGlobal( w->rect().center() ), w ); - } -#endif -} - -/*! \reimp */ -void TQDialog::keyPressEvent( TQKeyEvent *e ) -{ - // Calls reject() if Escape is pressed. Simulates a button - // click for the default button if Enter is pressed. Move focus - // for the arrow keys. Ignore the rest. -#ifdef TQ_OS_MAC - if(e->state() == ControlButton && e->key() == Qt::Key_Period) { - reject(); - } else -#endif - if ( e->state() == 0 || ( e->state() & TQt::Keypad && e->key() == Qt::Key_Enter ) ) { - switch ( e->key() ) { - case Qt::Key_Enter: - case Qt::Key_Return: { -#ifndef TQT_NO_PUSHBUTTON - TQObjectList *list = queryList( "TQPushButton" ); - TQObjectListIt it( *list ); - TQPushButton *pb; - while ( (pb = (TQPushButton*)it.current()) ) { - if ( pb->isDefault() && pb->isVisible() ) { - delete list; - if ( pb->isEnabled() ) { - emit pb->clicked(); - } - return; - } - ++it; - } - delete list; -#endif - } - break; - case Key_Escape: - reject(); - break; - case Qt::Key_Up: - case Qt::Key_Left: - if ( tqfocusWidget() && - ( tqfocusWidget()->focusPolicy() == Qt::StrongFocus || - tqfocusWidget()->focusPolicy() == Qt::WheelFocus ) ) { - e->ignore(); - break; - } - // call ours, since c++ blocks us from calling the one - // belonging to tqfocusWidget(). -#ifndef USE_QT4 - TQFocusEvent::setReason(TQFocusEvent::Backtab); -#endif // USE_QT4 - focusNextPrevChild( FALSE ); -#ifndef USE_QT4 - TQFocusEvent::resetReason(); -#endif // USE_QT4 - break; - case Qt::Key_Down: - case Qt::Key_Right: - if ( tqfocusWidget() && - ( tqfocusWidget()->focusPolicy() == Qt::StrongFocus || - tqfocusWidget()->focusPolicy() == Qt::WheelFocus ) ) { - e->ignore(); - break; - } -#ifndef USE_QT4 - TQFocusEvent::setReason(TQFocusEvent::Tab); -#endif // USE_QT4 - focusNextPrevChild( TRUE ); -#ifndef USE_QT4 - TQFocusEvent::resetReason(); -#endif // USE_QT4 - break; - default: - e->ignore(); - return; - } - } else { - e->ignore(); - } -} - -/*! \reimp */ -void TQDialog::closeEvent( TQCloseEvent *e ) -{ -#ifndef TQT_NO_WHATSTHIS - if ( isModal() && TQWhatsThis::inWhatsThisMode() ) - TQWhatsThis::leaveWhatsThisMode(); -#endif - if ( isShown() ) - reject(); - if ( isHidden() ) - e->accept(); -} - -#ifdef TQ_OS_TEMP -/*! \internal - \reimp -*/ -bool TQDialog::event( TQEvent *e ) -{ - switch ( e->type() ) { - case TQEvent::OkRequest: - case TQEvent::HelpRequest: - { - TQString bName = - (e->type() == TQEvent::OkRequest) - ? tqApp->translate( "TQMessageBox", mb_texts[TQMessageBox::Ok] ) - : tqApp->tr( "Help" ); - - TQObjectList *list = queryList( "TQPushButton" ); - TQObjectListIt it( *list ); - TQPushButton *pb; - while ( (pb = (TQPushButton*)it.current()) ) { - if ( pb->text() == bName ) { - delete list; - if ( pb->isEnabled() ) - emit pb->clicked(); - return pb->isEnabled(); - } - ++it; - } - delete list; - } - } - return TQWidget::event( e ); -} -#endif - - -/***************************************************************************** - Geometry management. - *****************************************************************************/ - -#if defined(TQ_WS_X11) -extern "C" { int XSetTransientForHint( Display *, unsigned long, unsigned long ); } -#include <private/tqt_x11_p.h> -#undef FocusIn -// defined in qapplication_x11.cpp -extern Atom qt_net_wm_full_placement; -extern bool qt_net_supports(Atom atom); -#endif // TQ_WS_X11 - -/*! - Shows the dialog as a \link #modeless modeless \endlink dialog. - Control returns immediately to the calling code. - - The dialog will be modal or modeless according to the value - of the \l modal property. - - \sa exec(), modal -*/ - -void TQDialog::show() -{ - if ( testWState(TQt::WState_Visible) ) - return; - - uint state = windowState(); - - if ( !did_resize ) - adjustSize(); - if( !qt_net_supports( qt_net_wm_full_placement )) { - if ( has_relpos && !did_move ) { - adjustPositionInternal( parentWidget(), TRUE ); - } else if ( !did_move ) { - adjustPositionInternal( parentWidget() ); - } - } - - if (windowState() != state) - setWindowState((WState)state); - -#if defined(TQ_WS_X11) - if (!parentWidget() && testWFlags(TQt::WShowModal) - && tqApp->mainWidget() && tqApp->mainWidget()->isVisible() - && !tqApp->mainWidget()->isMinimized()) { - // make sure the transient for hint is set properly for modal dialogs - x11SetWindowTransient( tqApp->mainWidget()); - } -#endif // TQ_WS_X11 - -#ifdef TQ_OS_TEMP - hideSpecial(); -#endif - - TQWidget::show(); - showExtension( d->doShowExtension ); -#ifndef TQT_NO_PUSHBUTTON - TQWidget *fw = tqfocusWidget(); - TQFocusData *fd = focusData(); - - /* - The following block is to handle a special case, and does not - really follow propper logic in concern of autoDefault and TAB - order. However, it's here to ease usage for the users. If a - dialog has a default TQPushButton, and first widget in the TAB - order also is a TQPushButton, then we give focus to the main - default TQPushButton. This simplifies code for the developers, - and actually catches most cases... If not, then they simply - have to use [widget*]->setFocus() themselves... - */ - if ( !fw || fw->focusPolicy() == Qt::NoFocus ) { - fd->home(); // Skip main form - TQWidget *first = fd->next(); // Get first main widget - if ( d->mainDef && - first != d->mainDef && - ::tqqt_cast<TQPushButton*>(first) ) - d->mainDef->setFocus(); - } - - if ( !d->mainDef && isTopLevel() ) { - if ( !fw || fw->focusPolicy() == Qt::NoFocus ) { - focusNextPrevChild( TRUE ); - fw = tqfocusWidget(); - } - if ( fw ) { - fd = focusData(); - TQWidget *home = fd->home(); - TQWidget *candidate = home; - TQ_ASSERT( candidate == fw ); - do { - TQPushButton *pb = ::tqqt_cast<TQPushButton*>(candidate); - if ( pb && pb->autoDefault() ) { - pb->setDefault( TRUE ); - break; - } - candidate = fd->next(); - } while ( candidate != home ); - } - } - if ( fw ) { - TQFocusEvent e( TQEvent::FocusIn ); -#ifndef USE_QT4 - TQFocusEvent::setReason( TQFocusEvent::Tab ); -#endif // USE_QT4 - TQApplication::sendEvent( fw, &e ); -#ifndef USE_QT4 - TQFocusEvent::resetReason(); -#endif // USE_QT4 - } - -#endif -#if defined(TQT_ACCESSIBILITY_SUPPORT) - TQAccessible::updateAccessibility( this, 0, TQAccessible::DialogStart ); -#endif -} - -/*! \internal */ -void TQDialog::adjustPosition( TQWidget* w) -{ - adjustPositionInternal( w ); -} - - -void TQDialog::adjustPositionInternal( TQWidget*w, bool useRelPos) -{ - /* need to make sure these events are already sent to be sure - our information below is correct --sam */ - TQApplication::sendPostedEvents( this, TQEvent::LayoutHint ); - TQApplication::sendPostedEvents( this, TQEvent::Resize ); - - // processing the events might call polish(), which is a nice place - // to restore geometries, so return if the dialog has been positioned - if ( did_move || has_relpos ) - return; - - TQPoint p( 0, 0 ); - int extraw = 0, extrah = 0, scrn = 0; - if ( w ) - w = w->tqtopLevelWidget(); - TQRect desk; - if ( w ) { - // Use mapToGlobal rather than tqgeometry() in case w might - // be embedded in another application - scrn = TQApplication::desktop()->screenNumber( w->mapToGlobal( TQPoint(0,0) ) ); - } else if ( TQApplication::desktop()->isVirtualDesktop() ) { - scrn = TQApplication::desktop()->screenNumber( TQCursor::pos() ); - } else { - scrn = TQApplication::desktop()->screenNumber( this ); - } - desk = TQApplication::desktop()->availableGeometry( scrn ); - - TQWidgetList *list = TQApplication::tqtopLevelWidgets(); - TQWidgetListIt it( *list ); - while ( (extraw == 0 || extrah == 0) && - it.current() != 0 ) { - int framew, frameh; - TQWidget * current = it.current(); - ++it; - if ( ! current->isVisible() ) - continue; - - framew = current->tqgeometry().x() - current->x(); - frameh = current->tqgeometry().y() - current->y(); - - extraw = TQMAX( extraw, framew ); - extrah = TQMAX( extrah, frameh ); - } - delete list; - - // sanity check for decoration frames. With embedding, we - // might get extraordinary values - if ( extraw == 0 || extrah == 0 || extraw >= 10 || extrah >= 40 ) { - extrah = 40; - extraw = 10; - } - - if ( useRelPos && w ) { - p = w->pos() + d->relPos; - } else { -#ifndef TQ_OS_TEMP - if ( w ) { - // Use mapToGlobal rather than tqgeometry() in case w might - // be embedded in another application - TQPoint pp = w->mapToGlobal( TQPoint(0,0) ); - p = TQPoint( pp.x() + w->width()/2, - pp.y() + w->height()/ 2 ); - } else { - // p = middle of the desktop - p = TQPoint( desk.x() + desk.width()/2, desk.y() + desk.height()/2 ); - } -#else - p = TQPoint( desk.x() + desk.width()/2, desk.y() + desk.height()/2 ); -#endif - - // p = origin of this - p = TQPoint( p.x()-width()/2 - extraw, - p.y()-height()/2 - extrah ); - } - - - if ( p.x() + extraw + width() > desk.x() + desk.width() ) - p.setX( desk.x() + desk.width() - width() - extraw ); - if ( p.x() < desk.x() ) - p.setX( desk.x() ); - - if ( p.y() + extrah + height() > desk.y() + desk.height() ) - p.setY( desk.y() + desk.height() - height() - extrah ); - if ( p.y() < desk.y() ) - p.setY( desk.y() ); - - move( p ); - did_move = !useRelPos; -} - - -/*! \reimp */ -void TQDialog::hide() -{ - if ( isHidden() ) - return; - -#if defined(TQT_ACCESSIBILITY_SUPPORT) - if ( isVisible() ) - TQAccessible::updateAccessibility( this, 0, TQAccessible::DialogEnd ); -#endif - - if ( parentWidget() && !did_move ) { - d->relPos = pos() - parentWidget()->tqtopLevelWidget()->pos(); - has_relpos = 1; - } - - // Reimplemented to exit a modal when the dialog is hidden. - TQWidget::hide(); - if ( in_loop ) { - in_loop = FALSE; - tqApp->exit_loop(); - } -} - - -/***************************************************************************** - Detects any widget tqgeometry changes done by the user. - *****************************************************************************/ - -/*! \reimp */ - -void TQDialog::move( int x, int y ) -{ - did_move = TRUE; - TQWidget::move( x, y ); -} - -/*! \reimp */ - -void TQDialog::move( const TQPoint &p ) -{ - did_move = TRUE; - TQWidget::move( p ); -} - -/*! \reimp */ - -void TQDialog::resize( int w, int h ) -{ - did_resize = TRUE; - TQWidget::resize( w, h ); -} - -/*! \reimp */ - -void TQDialog::resize( const TQSize &s ) -{ - did_resize = TRUE; - TQWidget::resize( s ); -} - -/*! \reimp */ - -void TQDialog::setGeometry( int x, int y, int w, int h ) -{ - did_move = TRUE; - did_resize = TRUE; - TQWidget::setGeometry( x, y, w, h ); -} - -/*! \reimp */ - -void TQDialog::setGeometry( const TQRect &r ) -{ - did_move = TRUE; - did_resize = TRUE; - TQWidget::setGeometry( r ); -} - - -/*! - If \a orientation is \c Horizontal, the extension will be displayed - to the right of the dialog's main area. If \a orientation is \c - Vertical, the extension will be displayed below the dialog's main - area. - - \sa orientation(), setExtension() -*/ -void TQDialog::setOrientation( Qt::Orientation orientation ) -{ - d->orientation = orientation; -} - -/*! - Returns the dialog's extension orientation. - - \sa setOrientation() -*/ -TQt::Orientation TQDialog::orientation() const -{ - return d->orientation; -} - -/*! - Sets the widget, \a extension, to be the dialog's extension, - deleting any previous extension. The dialog takes ownership of the - extension. Note that if 0 is passed any existing extension will be - deleted. - - This function must only be called while the dialog is hidden. - - \sa showExtension(), setOrientation(), extension() - */ -void TQDialog::setExtension( TQWidget* extension ) -{ - delete d->extension; - d->extension = extension; - - if ( !extension ) - return; - - if ( extension->parentWidget() != this ) - extension->reparent( this, TQPoint(0,0) ); - extension->hide(); -} - -/*! - Returns the dialog's extension or 0 if no extension has been - defined. - - \sa setExtension() - */ -TQWidget* TQDialog::extension() const -{ - return d->extension; -} - - -/*! - If \a showIt is TRUE, the dialog's extension is shown; otherwise the - extension is hidden. - - This slot is usually connected to the \l TQButton::toggled() signal - of a TQPushButton. - - A dialog with a visible extension is not resizeable. - - \sa show(), setExtension(), setOrientation() - */ -void TQDialog::showExtension( bool showIt ) -{ - d->doShowExtension = showIt; - if ( !d->extension ) - return; - if ( !testWState(TQt::WState_Visible) ) - return; - if ( d->extension->isVisible() == showIt ) - return; - - if ( showIt ) { - d->size = size(); - d->min = tqminimumSize(); - d->max = tqmaximumSize(); -#ifndef TQT_NO_LAYOUT - if ( tqlayout() ) - tqlayout()->setEnabled( FALSE ); -#endif - TQSize s( d->extension->tqsizeHint() - .expandedTo( d->extension->tqminimumSize() ) - .boundedTo( d->extension->tqmaximumSize() ) ); - if ( d->orientation == Qt::Horizontal ) { - int h = TQMAX( height(), s.height() ); - d->extension->setGeometry( width(), 0, s.width(), h ); - setFixedSize( width() + s.width(), h ); - } else { - int w = TQMAX( width(), s.width() ); - d->extension->setGeometry( 0, height(), w, s.height() ); - setFixedSize( w, height() + s.height() ); - } - d->extension->show(); - } else { - d->extension->hide(); - // workaround for CDE window manager that won't shrink with (-1,-1) - setMinimumSize( d->min.expandedTo( TQSize( 1, 1 ) ) ); - setMaximumSize( d->max ); - resize( d->size ); -#ifndef TQT_NO_LAYOUT - if ( tqlayout() ) - tqlayout()->setEnabled( TRUE ); -#endif - } -} - - -/*! \reimp */ -TQSize TQDialog::tqsizeHint() const -{ - if ( d->extension ) { - if ( d->orientation == Qt::Horizontal ) - return TQSize( TQWidget::tqsizeHint().width(), - TQMAX( TQWidget::tqsizeHint().height(),d->extension->tqsizeHint().height() ) ); - else - return TQSize( TQMAX( TQWidget::tqsizeHint().width(), d->extension->tqsizeHint().width() ), - TQWidget::tqsizeHint().height() ); - } - - return TQWidget::tqsizeHint(); -} - - -/*! \reimp */ -TQSize TQDialog::tqminimumSizeHint() const -{ - if ( d->extension ) { - if (d->orientation == Qt::Horizontal ) - return TQSize( TQWidget::tqminimumSizeHint().width(), - TQMAX( TQWidget::tqminimumSizeHint().height(), d->extension->tqminimumSizeHint().height() ) ); - else - return TQSize( TQMAX( TQWidget::tqminimumSizeHint().width(), d->extension->tqminimumSizeHint().width() ), - TQWidget::tqminimumSizeHint().height() ); - } - - return TQWidget::tqminimumSizeHint(); -} - -/*! \property TQDialog::modal - \brief whether show() should pop up the dialog as modal or modeless - - By default, this property is false and show() pops up the dialog as - modeless. - - exec() ignores the value of this property and always pops up the - dialog as modal. - - \sa show(), exec() -*/ - -void TQDialog::setModal( bool modal ) -{ - if ( modal ) - setWFlags( TQt::WShowModal ); - else - clearWFlags( TQt::WShowModal ); -} - -bool TQDialog::isModal() const -{ - return testWFlags( TQt::WShowModal ) != 0; -} - -bool TQDialog::isSizeGripEnabled() const -{ -#ifndef TQT_NO_SIZEGRIP - return !!d->resizer; -#else - return FALSE; -#endif -} - - -void TQDialog::setSizeGripEnabled(bool enabled) -{ -#ifndef TQT_NO_SIZEGRIP - if ( !enabled != !d->resizer ) { - if ( enabled ) { - d->resizer = new TQSizeGrip( this, "TQDialog::resizer" ); - // adjustSize() processes all events, which is suboptimal - d->resizer->resize( d->resizer->tqsizeHint() ); - if ( TQApplication::reverseLayout() ) - d->resizer->move( rect().bottomLeft() -d->resizer->rect().bottomLeft() ); - else - d->resizer->move( rect().bottomRight() -d->resizer->rect().bottomRight() ); - d->resizer->raise(); - d->resizer->show(); - } else { - delete d->resizer; - d->resizer = 0; - } - } -#endif //TQT_NO_SIZEGRIP -} - - - -/*! \reimp */ -void TQDialog::resizeEvent( TQResizeEvent * ) -{ -#ifndef TQT_NO_SIZEGRIP - if ( d->resizer ) { - if ( TQApplication::reverseLayout() ) - d->resizer->move( rect().bottomLeft() -d->resizer->rect().bottomLeft() ); - else - d->resizer->move( rect().bottomRight() -d->resizer->rect().bottomRight() ); - } -#endif -} - -#endif // TQT_NO_DIALOG |