1 /////////////////////////////////////////////////////////////////////////////
3 // File : qworkspaceP.cxx
4 // Description : the patch for Qt's QWorkspace class (qworkspace.cpp)
5 /////////////////////////////////////////////////////////////////////////////
7 /****************************************************************************
10 ** Implementation of the QWorkspace class
14 ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
16 ** This file is part of the workspace module of the Qt GUI Toolkit.
18 ** This file may be distributed under the terms of the Q Public License
19 ** as defined by Trolltech AS of Norway and appearing in the file
20 ** LICENSE.QPL included in the packaging of this file.
22 ** This file may be distributed and/or modified under the terms of the
23 ** GNU General Public License version 2 as published by the Free Software
24 ** Foundation and appearing in the file LICENSE.GPL included in the
25 ** packaging of this file.
27 ** Licensees holding valid Qt Enterprise Edition licenses may use this
28 ** file in accordance with the Qt Commercial License Agreement provided
31 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
32 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
34 ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
35 ** information about Qt Commercial License Agreements.
36 ** See http://www.trolltech.com/qpl/ for QPL licensing information.
37 ** See http://www.trolltech.com/gpl/ for GPL licensing information.
39 ** Contact info@trolltech.com if any conditions of this licensing are
42 **********************************************************************/
44 #include "qworkspaceP.h"
46 #include <qapplication.h>
47 #include <qobjectlist.h>
49 #include <qtoolbutton.h>
54 #include <qpopupmenu.h>
56 #include <qguardedptr.h>
58 #include <qfocusdata.h>
59 #include <qdatetime.h>
63 #include <qscrollbar.h>
67 #include <qt_windows.h>
69 #include <qplatformdefs.h>
73 #include <private/qapplication_p.h>
74 #include <private/qinternal_p.h>
77 #define BUTTON_WIDTH 16
78 #define BUTTON_HEIGHT 14
82 \class QWorkspaceP qworkspace.h
83 \brief The QWorkspaceP widget provides a workspace window that can
84 contain decorated windows, e.g. for MDI.
92 An MDI (multiple document interface) application has one main
93 window with a menu bar. The central widget of this window is a
94 workspace. The workspace itself contains zero, one or more
95 document windows, each of which displays a document.
97 The workspace itself is an ordinary Qt widget. It has a standard
98 constructor that takes a parent widget and an object name. The
99 parent window is usually a QMainWindow, but it need not be.
101 Document windows (i.e. MDI windows) are also ordinary Qt widgets
102 which have the workspace as parent widget. When you call show(),
103 hide(), showMaximized(), setCaption(), etc. on a document window,
104 it is shown, hidden, etc. with a frame, caption, icon and icon
105 text, just as you'd expect. You can provide widget flags which
106 will be used for the layout of the decoration or the behaviour of
109 To change the geometry of the MDI windows it is necessary to make
110 the function calls to the parentWidget() of the widget, as this
111 will move or resize the decorated window.
113 A document window becomes active when it gets the keyboard focus.
114 You can activate it using setFocus(), and the user can activate it
115 by moving focus in the normal ways. The workspace emits a signal
116 windowActivated() when it detects the activation change, and the
117 function activeWindow() always returns a pointer to the active
120 The convenience function windowList() returns a list of all
121 document windows. This is useful to create a popup menu
122 "<u>W</u>indows" on the fly, for example.
124 QWorkspaceP provides two built-in layout strategies for child
125 windows: cascade() and tile(). Both are slots so you can easily
126 connect menu entries to them.
128 If you want your users to be able to work with document windows
129 larger than the actual workspace, set the scrollBarsEnabled
132 If the top-level window contains a menu bar and a document window
133 is maximised, QWorkspaceP moves the document window's minimize,
134 restore and close buttons from the document window's frame to the
135 workspace window's menu bar. It then inserts a window operations
136 menu at the far left of the menu bar.
139 static bool inCaptionChange = FALSE;
141 class QWorkspacePPrivate {
143 QWorkspacePChild* active;
144 QPtrList<QWorkspacePChild> windows;
145 QPtrList<QWorkspacePChild> focus;
146 QPtrList<QWidget> icons;
147 QWorkspacePChild* maxWindow;
149 QGuardedPtr<QFrame> maxcontrols;
150 QGuardedPtr<QMenuBar> maxmenubar;
154 QWidget *becomeActive;
155 QGuardedPtr<QLabel> maxtools;
157 QPopupMenu* toolPopup;
161 bool autoFocusChange;
163 QScrollBar *vbar, *hbar;
165 int yoffset, xoffset;
169 Constructs a workspace with a \a parent and a \a name.
171 QWorkspaceP::QWorkspaceP( QWidget *parent, const char *name )
172 : QWidget( parent, name, WNoMousePropagation )
174 d = new QWorkspacePPrivate;
182 d->autoFocusChange = FALSE;
183 #if defined(Q_WS_WIN)
184 d->popup = new QPopupMenu( this, "qt_internal_mdi_popup" );
185 d->toolPopup = new QPopupMenu( this, "qt_internal_mdi_popup" );
187 d->popup = new QPopupMenu( parentWidget(), "qt_internal_mdi_popup" );
188 d->toolPopup = new QPopupMenu( parentWidget(), "qt_internal_mdi_popup" );
193 connect( d->popup, SIGNAL( aboutToShow() ), this, SLOT(operationMenuAboutToShow() ));
194 connect( d->popup, SIGNAL( activated(int) ), this, SLOT( operationMenuActivated(int) ) );
195 d->popup->insertItem(QIconSet(style().stylePixmap(QStyle::SP_TitleBarNormalButton)), tr("&Restore"), 1);
196 d->popup->insertItem(tr("&Move"), 2);
197 d->popup->insertItem(tr("&Size"), 3);
198 d->popup->insertItem(QIconSet(style().stylePixmap(QStyle::SP_TitleBarMinButton)), tr("Mi&nimize"), 4);
199 d->popup->insertItem(QIconSet(style().stylePixmap(QStyle::SP_TitleBarMaxButton)), tr("Ma&ximize"), 5);
200 d->popup->insertSeparator();
201 d->popup->insertItem(QIconSet(style().stylePixmap(QStyle::SP_TitleBarCloseButton)),
204 +"\t"+QAccel::keyToString(CTRL+Key_F4)
206 , this, SLOT( closeActiveWindow() ) );
208 connect( d->toolPopup, SIGNAL( aboutToShow() ), this, SLOT(toolMenuAboutToShow() ));
209 connect( d->toolPopup, SIGNAL( activated(int) ), this, SLOT( operationMenuActivated(int) ) );
210 d->toolPopup->insertItem(tr("&Move"), 2);
211 d->toolPopup->insertItem(tr("&Size"), 3);
212 d->toolPopup->insertItem(tr("Stay on &Top"), 7);
213 d->toolPopup->setItemChecked( 7, TRUE );
214 d->toolPopup->setCheckable( TRUE );
215 d->toolPopup->insertSeparator();
216 d->toolPopup->insertItem(QIconSet(style().stylePixmap(QStyle::SP_TitleBarShadeButton)), tr("Sh&ade"), 6);
217 d->toolPopup->insertItem(QIconSet(style().stylePixmap(QStyle::SP_TitleBarCloseButton)),
220 +"\t"+QAccel::keyToString( CTRL+Key_F4)
222 , this, SLOT( closeActiveWindow() ) );
225 QAccel* a = new QAccel( this );
226 a->connectItem( a->insertItem( ALT + Key_Minus),
227 this, SLOT( showOperationMenu() ) );
229 a->connectItem( a->insertItem( CTRL + Key_F6),
230 this, SLOT( activateNextWindow() ) );
231 a->connectItem( a->insertItem( CTRL + Key_Tab),
232 this, SLOT( activateNextWindow() ) );
234 a->connectItem( a->insertItem( CTRL + SHIFT + Key_F6),
235 this, SLOT( activatePreviousWindow() ) );
236 a->connectItem( a->insertItem( CTRL + SHIFT + Key_Tab),
237 this, SLOT( activatePreviousWindow() ) );
239 a->connectItem( a->insertItem( CTRL + Key_F4 ),
240 this, SLOT( closeActiveWindow() ) );
243 setBackgroundMode( PaletteDark );
244 setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
246 #ifndef QT_NO_WIDGET_TOPEXTRA
247 d->topCaption = topLevelWidget()->caption();
250 d->hbar = d->vbar = 0;
252 d->xoffset = d->yoffset = 0;
256 topLevelWidget()->installEventFilter( this );
259 /*! Destroys the workspace and frees any allocated resources. */
261 QWorkspaceP::~QWorkspaceP()
268 QSize QWorkspaceP::sizeHint() const
270 QSize s( QApplication::desktop()->size() );
271 return QSize( s.width()*2/3, s.height()*2/3);
275 void QWorkspaceP::setPaletteBackgroundColor( const QColor & c )
282 void QWorkspaceP::setPaletteBackgroundPixmap( const QPixmap & pm )
284 setErasePixmap( pm );
288 void QWorkspaceP::childEvent( QChildEvent * e)
290 if (e->inserted() && e->child()->isWidgetType()) {
291 QWidget* w = (QWidget*) e->child();
292 if ( !w || !w->testWFlags( WStyle_Title | WStyle_NormalBorder | WStyle_DialogBorder )
293 || d->icons.contains( w ) || w == d->vbar || w == d->hbar || w == d->corner )
294 return; // nothing to do
296 bool hasBeenHidden = w->isHidden();
297 bool hasSize = w->testWState( WState_Resized );
300 bool hasPos = x != 0 || y != 0;
301 QSize s = w->size().expandedTo( w->minimumSizeHint() );
302 if ( !hasSize && w->sizeHint().isValid() )
305 QWorkspacePChild* child = new QWorkspacePChild( w, this, "qt_workspacechild" );
306 child->installEventFilter( this );
308 connect( child, SIGNAL( popupOperationMenu( const QPoint& ) ),
309 this, SLOT( popupOperationMenu( const QPoint& ) ) );
310 connect( child, SIGNAL( showOperationMenu() ),
311 this, SLOT( showOperationMenu() ) );
312 d->windows.append( child );
313 if ( child->isVisibleTo( this ) )
314 d->focus.append( child );
315 child->internalRaise();
319 else if ( !isVisible() ) // that's a case were we don't receive a showEvent in time. Tricky.
325 child->resize( s + child->baseSize() );
333 } else if (e->removed() ) {
334 if ( d->windows.contains( (QWorkspacePChild*)e->child() ) ) {
335 d->windows.removeRef( (QWorkspacePChild*)e->child() );
336 d->focus.removeRef( (QWorkspacePChild*)e->child() );
337 if (d->windows.count() <= 0) { // VSR+ 26/03/03 -->
340 hideMaximizeControls();
341 } // <-- VSR+ 26/03/03
349 #ifndef QT_NO_WHEELEVENT
350 void QWorkspaceP::wheelEvent( QWheelEvent *e )
352 if ( !scrollBarsEnabled() )
354 if ( d->vbar && d->vbar->isVisible() && !( e->state() & AltButton ) )
355 QApplication::sendEvent( d->vbar, e );
356 else if ( d->hbar && d->hbar->isVisible() )
357 QApplication::sendEvent( d->hbar, e );
361 void QWorkspaceP::activateWindow( QWidget* w, bool change_focus )
365 emit windowActivated( 0 );
368 if ( !isVisibleTo( 0 ) ) {
372 if ( d->active && d->active->windowWidget() == w )
374 QPtrListIterator<QWorkspacePChild> it( d->windows );
375 while ( it.current () ) {
376 QWorkspacePChild* c = it.current();
378 c->setActive( c->windowWidget() == w );
379 if (c->windowWidget() == w)
386 if ( d->maxWindow && d->maxWindow != d->active && d->active->windowWidget() &&
387 d->active->windowWidget()->testWFlags( WStyle_MinMax ) &&
388 !d->active->windowWidget()->testWFlags( WStyle_Tool ) ) {
389 maximizeWindow( d->active->windowWidget() );
391 #ifndef QT_NO_WIDGET_TOPEXTRA
393 QPixmap pm(*w->icon());
394 if(pm.width() != 14 || pm.height() != 14) {
397 pm = im.smoothScale( 14, 14 );
399 d->maxtools->setPixmap( pm );
405 d->maxtools->setPixmap( pm );
410 d->active->internalRaise();
412 if ( change_focus ) {
413 if ( d->focus.find( d->active ) >=0 ) {
414 d->focus.removeRef( d->active );
415 // d->focus.append( d->active ); //VSR-
417 d->focus.append( d->active ); //VSR+
421 emit windowActivated( w );
426 Returns the active window, or 0 if no window is active.
428 QWidget* QWorkspaceP::activeWindow() const
430 return d->active?d->active->windowWidget():0;
434 void QWorkspaceP::place( QWidget* w)
436 int overlap, minOverlap = 0;
439 QRect r1(0, 0, 0, 0);
440 QRect r2(0, 0, 0, 0);
441 QRect maxRect = rect();
442 int x = maxRect.left(), y = maxRect.top();
443 QPoint wpos(maxRect.left(), maxRect.top());
445 bool firstPass = TRUE;
448 if ( y + w->height() > maxRect.bottom() ) {
450 } else if( x + w->width() > maxRect.right() ) {
455 r1.setRect(x, y, w->width(), w->height());
458 QPtrListIterator<QWorkspacePChild> it( d->windows );
459 while ( it.current () ) {
462 if (! d->icons.contains(l) && ! l->isHidden() && l != w ) {
463 if ( d->maxWindow == l )
466 r2.setRect(l->x(), l->y(), l->width(), l->height());
468 if (r2.intersects(r1)) {
469 r2.setCoords(QMAX(r1.left(), r2.left()),
470 QMAX(r1.top(), r2.top()),
471 QMIN(r1.right(), r2.right()),
472 QMIN(r1.bottom(), r2.bottom())
475 overlap += (r2.right() - r2.left()) *
476 (r2.bottom() - r2.top());
489 minOverlap = overlap;
490 } else if ( overlap >= 0 && overlap < minOverlap) {
491 minOverlap = overlap;
496 possible = maxRect.right();
497 if ( possible - w->width() > x) possible -= w->width();
500 QPtrListIterator<QWorkspacePChild> it( d->windows );
501 while ( it.current () ) {
504 if (! d->icons.contains(l) && ! l->isHidden() && l != w ) {
505 if ( d->maxWindow == l )
508 r2.setRect(l->x(), l->y(), l->width(), l->height());
510 if( ( y < r2.bottom() ) && ( r2.top() < w->height() + y ) ) {
512 possible = possible < r2.right() ?
513 possible : r2.right();
515 if( r2.left() - w->width() > x )
516 possible = possible < r2.left() - w->width() ?
517 possible : r2.left() - w->width();
523 } else if ( overlap == -2 ) {
525 possible = maxRect.bottom();
527 if ( possible - w->height() > y ) possible -= w->height();
530 QPtrListIterator<QWorkspacePChild> it( d->windows );
531 while ( it.current () ) {
534 if (l != w && ! d->icons.contains(w)) {
535 if ( d->maxWindow == l )
538 r2.setRect(l->x(), l->y(), l->width(), l->height());
541 possible = possible < r2.bottom() ?
542 possible : r2.bottom();
544 if( r2.top() - w->height() > y )
545 possible = possible < r2.top() - w->height() ?
546 possible : r2.top() - w->height();
553 while( overlap != 0 && overlap != -1 );
560 void QWorkspaceP::insertIcon( QWidget* w )
562 if ( !w || d->icons.contains( w ) )
564 d->icons.append( w );
565 if (w->parentWidget() != this )
566 w->reparent( this, 0, QPoint(0,0), FALSE);
569 QRect cr = updateWorkspace();
571 int y = cr.height() - w->height();
573 QPtrListIterator<QWidget> it( d->icons );
574 while ( it.current () ) {
575 QWidget* i = it.current();
577 if ( x > 0 && x + i->width() > cr.width() ){
583 i->geometry().intersects( QRect( x, y, w->width(), w->height() ) ) )
588 if ( isVisibleTo( parentWidget() ) ) {
596 void QWorkspaceP::removeIcon( QWidget* w)
598 if ( !d->icons.contains( w ) )
600 d->icons.remove( w );
606 void QWorkspaceP::resizeEvent( QResizeEvent * )
608 if ( d->maxWindow ) {
609 d->maxWindow->adjustToFullscreen();
610 ((QWorkspaceP*)d->maxWindow->windowWidget())->setWState( WState_Maximized );
613 QRect cr = updateWorkspace();
615 QPtrListIterator<QWorkspacePChild> it( d->windows );
616 while ( it.current () ) {
617 QWorkspacePChild* c = it.current();
619 if ( c->windowWidget() && !c->windowWidget()->testWFlags( WStyle_Tool ) )
624 if ( c->snappedDown )
625 y = cr.height() - c->height();
626 if ( c->snappedRight )
627 x = cr.width() - c->width();
629 if ( x != c->x() || y != c->y() )
636 void QWorkspaceP::showEvent( QShowEvent *e )
638 if ( d->maxWindow && !style().styleHint(QStyle::SH_Workspace_FillSpaceOnMaximize, this))
639 showMaximizeControls();
640 QWidget::showEvent( e );
641 if ( d->becomeActive ) {
642 activateWindow( d->becomeActive );
645 else if ( d->windows.count() > 0 && !d->active )
646 activateWindow( d->windows.first()->windowWidget() );
652 void QWorkspaceP::hideEvent( QHideEvent * )
655 if ( !isVisibleTo(0) && !style().styleHint(QStyle::SH_Workspace_FillSpaceOnMaximize, this))
656 hideMaximizeControls();
659 void QWorkspaceP::minimizeWindow( QWidget* w)
661 QWorkspacePChild* c = findChild( w );
662 QWorkspacePChild* oldActive = d->active; //VSR+
664 if ( !w || w && (!w->testWFlags( WStyle_Minimize ) || w->testWFlags( WStyle_Tool) ) )
668 QWorkspaceP *fake = (QWorkspaceP*)w;
670 setUpdatesEnabled( FALSE );
672 if ( c == d->maxWindow ) {
675 inCaptionChange = TRUE;
676 #ifndef QT_NO_WIDGET_TOPEXTRA
677 if ( !!d->topCaption )
678 topLevelWidget()->setCaption( d->topCaption );
680 inCaptionChange = FALSE;
681 if ( !style().styleHint(QStyle::SH_Workspace_FillSpaceOnMaximize, this) )
682 hideMaximizeControls();
683 for (QPtrListIterator<QWorkspacePChild> it( d->windows ); it.current(); ++it ) {
684 QWorkspacePChild* c = it.current();
686 c->titlebar->setMovable( TRUE );
687 c->widgetResizeHandler->setActive( TRUE );
690 insertIcon( c->iconWidget() );
691 bool wasFocused = c->titlebar->isActive();
692 blockSignals( TRUE );//VSR+
694 blockSignals( FALSE );//VSR+
695 if ( wasFocused && ( !d->active || d->active && d->active->testWState( WState_Minimized ) ) ) { //VSR+
696 // if ( wasFocused && d->active && d->active->testWState( WState_Minimized ) ) { //VSR-
697 //VSR- blockSignals( TRUE );
698 activateWindow( w, FALSE );
699 //VSR- blockSignals( FALSE );
701 else if ( oldActive != d->active ) { //VSR+
702 emit ( windowActivated( d->active ? d->active->windowWidget() : 0 ) ); //VSR+
705 c->setGeometry( d->maxRestore );
706 if ( d->focus.find( c ) < 0 ) // VSR+
707 d->focus.append( c );
709 setUpdatesEnabled( TRUE );
712 fake->clearWState( WState_Maximized );
713 fake->setWState( WState_Minimized );
714 c->clearWState( WState_Maximized );
715 c->setWState( WState_Minimized );
719 void QWorkspaceP::normalizeWindow( QWidget* w)
721 QWorkspacePChild* c = findChild( w );
725 QWorkspaceP *fake = (QWorkspaceP*)w;
726 fake->clearWState( WState_Minimized | WState_Maximized );
727 if ( !style().styleHint(QStyle::SH_Workspace_FillSpaceOnMaximize, this) && d->maxWindow ) {
728 hideMaximizeControls();
730 c->widgetResizeHandler->setActive( TRUE );
732 c->titlebar->setMovable(TRUE);
734 fake->clearWState( WState_Minimized | WState_Maximized );
735 c->clearWState( WState_Minimized | WState_Maximized );
737 if ( c == d->maxWindow ) {
738 c->setGeometry( d->maxRestore );
740 #ifndef QT_NO_WIDGET_TOPEXTRA
741 inCaptionChange = TRUE;
742 if ( !!d->topCaption )
743 topLevelWidget()->setCaption( d->topCaption );
744 inCaptionChange = FALSE;
748 removeIcon( c->iconw->parentWidget() );
752 if ( !style().styleHint(QStyle::SH_Workspace_FillSpaceOnMaximize, this))
753 hideMaximizeControls();
754 for (QPtrListIterator<QWorkspacePChild> it( d->windows ); it.current(); ++it ) {
755 QWorkspacePChild* c = it.current();
757 c->titlebar->setMovable( TRUE );
758 c->widgetResizeHandler->setActive( TRUE );
760 activateWindow( w, TRUE );
766 void QWorkspaceP::maximizeWindow( QWidget* w)
768 QWorkspacePChild* c = findChild( w );
770 if ( !w || w && (!w->testWFlags( WStyle_Maximize ) || w->testWFlags( WStyle_Tool) ) )
772 if ( w->maximumSize().isValid() && ( w->maximumWidth() < width() || w->maximumHeight() < height() ) ) {
773 w->resize( w->maximumSize() );
778 setUpdatesEnabled( FALSE );
779 if (c->iconw && d->icons.contains( c->iconw->parentWidget() ) )
780 normalizeWindow( w );
781 QWorkspaceP *fake = (QWorkspaceP*)w;
783 QRect r( c->geometry() );
784 c->adjustToFullscreen();
787 qApp->sendPostedEvents( c, QEvent::Resize );
788 qApp->sendPostedEvents( c, QEvent::Move );
789 qApp->sendPostedEvents( c, QEvent::ShowWindowRequest );
790 if ( d->maxWindow != c ) {
792 d->maxWindow->setGeometry( d->maxRestore );
798 if(!style().styleHint(QStyle::SH_Workspace_FillSpaceOnMaximize, this)) {
799 showMaximizeControls();
801 c->widgetResizeHandler->setActive( FALSE );
803 c->titlebar->setMovable( FALSE );
805 #ifndef QT_NO_WIDGET_TOPEXTRA
806 inCaptionChange = TRUE;
807 if ( !!d->topCaption )
808 topLevelWidget()->setCaption( tr("%1 - [%2]")
809 .arg(d->topCaption).arg(c->caption()) );
810 inCaptionChange = FALSE;
812 setUpdatesEnabled( TRUE );
816 fake->clearWState( WState_Minimized );
817 fake->setWState( WState_Maximized );
818 c->clearWState( WState_Minimized );
819 c->setWState( WState_Maximized );
823 void QWorkspaceP::showWindow( QWidget* w)
825 if ( d->maxWindow && w->testWFlags( WStyle_Maximize ) && !w->testWFlags( WStyle_Tool) )
827 else if ( !w->testWFlags( WStyle_Tool ) )
828 normalizeWindow( w );
830 w->parentWidget()->show();
832 d->maxWindow->raise();
837 QWorkspacePChild* QWorkspaceP::findChild( QWidget* w)
839 QPtrListIterator<QWorkspacePChild> it( d->windows );
840 while ( it.current () ) {
841 QWorkspacePChild* c = it.current();
843 if (c->windowWidget() == w)
850 Returns a list of all windows.
852 QWidgetList QWorkspaceP::windowList() const
855 QPtrListIterator<QWorkspacePChild> it( d->windows );
856 while ( it.current () ) {
857 QWorkspacePChild* c = it.current();
859 if ( c->windowWidget() )
860 windows.append( c->windowWidget() );
866 bool QWorkspaceP::eventFilter( QObject *o, QEvent * e)
869 static QWorkspaceP* tc = 0;
870 #ifndef QT_NO_MENUBAR
871 if ( o == d->maxtools && d->menuId != -1 ) {
872 switch ( e->type() ) {
873 case QEvent::MouseButtonPress:
875 QMenuBar* b = (QMenuBar*)o->parent();
878 if ( tc != this || t->elapsed() > QApplication::doubleClickInterval() ) {
879 if ( QApplication::reverseLayout() ) {
880 QPoint p = b->mapToGlobal( QPoint( b->x() + b->width(), b->y() + b->height() ) );
881 p.rx() -= d->popup->sizeHint().width();
882 popupOperationMenu( p );
884 popupOperationMenu( b->mapToGlobal( QPoint( b->x(), b->y() + b->height() ) ) );
897 return QWidget::eventFilter( o, e );
900 switch ( e->type() ) {
902 case QEvent::HideToParent:
903 if ( !o->isA( "QWorkspacePChild" ) || !isVisible() )
905 d->focus.removeRef( (QWorkspacePChild*)o );
906 if ( d->active != o )
908 if ( d->focus.isEmpty() ) {
911 d->autoFocusChange = TRUE;
912 activatePreviousWindow();
913 QWorkspacePChild* c = d->active;
915 d->active->windowWidget() &&
916 d->active->windowWidget()->testWFlags( WStyle_Tool ) ) {
917 activatePreviousWindow();
918 if ( d->active == c )
921 d->autoFocusChange = FALSE;
923 if ( d->maxWindow == o && d->maxWindow->isHidden() ) {
924 d->maxWindow->setGeometry( d->maxRestore );
927 maximizeWindow( d->active );
929 if ( !d->maxWindow ) {
931 if ( style().styleHint(QStyle::SH_Workspace_FillSpaceOnMaximize, this)) {
932 QWorkspacePChild *wc = (QWorkspacePChild *)o;
933 wc->widgetResizeHandler->setActive( TRUE );
935 wc->titlebar->setMovable( TRUE );
937 hideMaximizeControls();
939 #ifndef QT_NO_WIDGET_TOPEXTRA
940 inCaptionChange = TRUE;
941 if ( !!d->topCaption )
942 topLevelWidget()->setCaption( d->topCaption );
943 inCaptionChange = FALSE;
949 if ( o->isA("QWorkspacePChild") && !d->focus.containsRef( (QWorkspacePChild*)o ) )
950 d->focus.append( (QWorkspacePChild*)o );
953 case QEvent::CaptionChange:
954 if ( inCaptionChange )
957 #ifndef QT_NO_WIDGET_TOPEXTRA
958 inCaptionChange = TRUE;
959 if ( o == topLevelWidget() )
960 d->topCaption = ((QWidget*)o)->caption();
962 if ( d->maxWindow && !!d->topCaption )
963 topLevelWidget()->setCaption( tr("%1 - [%2]")
964 .arg(d->topCaption).arg(d->maxWindow->caption()));
965 inCaptionChange = FALSE;
970 if ( o == topLevelWidget() )
972 QPtrListIterator<QWorkspacePChild> it( d->windows );
973 while ( it.current () ) {
974 QWorkspacePChild* c = it.current();
979 } else if ( o->inherits("QWorkspacePChild") ) {
982 if ( d->windows.count() > 1 || d->windows.first() && d->active != d->windows.first() )
983 activatePreviousWindow();
989 return QWidget::eventFilter( o, e);
992 void QWorkspaceP::showMaximizeControls()
994 #ifndef QT_NO_MENUBAR
995 Q_ASSERT(d->maxWindow);
998 // Do a breadth-first search first on every parent,
999 QWidget* w = parentWidget();
1000 QObjectList * l = 0;
1002 l = w->queryList( "QMenuBar", 0, FALSE, FALSE );
1003 w = w->parentWidget();
1004 if ( l && !l->count() ) {
1010 // and query recursively if nothing is found.
1011 if ( !l || !l->count() ) {
1014 l = topLevelWidget()->queryList( "QMenuBar", 0, 0, TRUE );
1016 if ( l && l->count() )
1017 b = (QMenuBar *)l->first();
1023 if ( !d->maxcontrols ) {
1025 d->maxcontrols = new QFrame( topLevelWidget(), "qt_maxcontrols" );
1026 QHBoxLayout* l = new QHBoxLayout( d->maxcontrols,
1027 d->maxcontrols->frameWidth(), 0 );
1028 if ( d->maxWindow->windowWidget()->testWFlags(WStyle_Minimize) ) {
1029 QToolButton* iconB = new QToolButton( d->maxcontrols, "iconify" );
1030 #ifndef QT_NO_TOOLTIP
1031 QToolTip::add( iconB, tr( "Minimize" ) );
1033 l->addWidget( iconB );
1034 iconB->setFocusPolicy( NoFocus );
1035 iconB->setIconSet(style().stylePixmap(QStyle::SP_TitleBarMinButton));
1036 iconB->setFixedSize(BUTTON_WIDTH, BUTTON_HEIGHT);
1037 connect( iconB, SIGNAL( clicked() ),
1038 this, SLOT( minimizeActiveWindow() ) );
1041 QToolButton* restoreB = new QToolButton( d->maxcontrols, "restore" );
1042 #ifndef QT_NO_TOOLTIP
1043 QToolTip::add( restoreB, tr( "Restore Down" ) );
1045 l->addWidget( restoreB );
1046 restoreB->setFocusPolicy( NoFocus );
1047 restoreB->setIconSet( style().stylePixmap(QStyle::SP_TitleBarNormalButton));
1048 restoreB->setFixedSize(BUTTON_WIDTH, BUTTON_HEIGHT);
1049 connect( restoreB, SIGNAL( clicked() ),
1050 this, SLOT( normalizeActiveWindow() ) );
1053 QToolButton* closeB = new QToolButton( d->maxcontrols, "close" );
1054 #ifndef QT_NO_TOOLTIP
1055 QToolTip::add( closeB, tr( "Close" ) );
1057 l->addWidget( closeB );
1058 closeB->setFocusPolicy( NoFocus );
1059 closeB->setIconSet( style().stylePixmap(QStyle::SP_TitleBarCloseButton) );
1060 closeB->setFixedSize(BUTTON_WIDTH, BUTTON_HEIGHT);
1061 connect( closeB, SIGNAL( clicked() ),
1062 this, SLOT( closeActiveWindow() ) );
1064 d->maxcontrols->setFixedSize( d->maxcontrols->minimumSizeHint() );
1067 if ( d->controlId == -1 || b->indexOf( d->controlId ) == -1 ) {
1068 QFrame* dmaxcontrols = d->maxcontrols;
1069 d->controlId = b->insertItem( dmaxcontrols, -1, b->count() );
1071 if ( d->active && ( d->menuId == -1 || b->indexOf( d->menuId ) == -1 ) ) {
1072 if ( !d->maxtools ) {
1073 d->maxtools = new QLabel( topLevelWidget(), "qt_maxtools" );
1074 d->maxtools->installEventFilter( this );
1076 #ifndef QT_NO_WIDGET_TOPEXTRA
1077 if ( d->active->windowWidget() && d->active->windowWidget()->icon() ) {
1078 QPixmap pm(*d->active->windowWidget()->icon());
1079 if(pm.width() != 14 || pm.height() != 14) {
1082 pm = im.smoothScale( 14, 14 );
1084 d->maxtools->setPixmap( pm );
1090 d->maxtools->setPixmap( pm );
1092 d->menuId = b->insertItem( d->maxtools, -1, 0 );
1098 void QWorkspaceP::hideMaximizeControls()
1100 #ifndef QT_NO_MENUBAR
1101 if ( d->maxmenubar ) {
1104 if ( d->maxmenubar->indexOf( mi ) != -1 )
1105 d->maxmenubar->removeItem( mi );
1108 int ci = d->controlId;
1109 if ( ci != -1 && d->maxmenubar->indexOf( ci ) != -1 )
1110 d->maxmenubar->removeItem( ci );
1118 void QWorkspaceP::closeActiveWindow()
1120 setUpdatesEnabled( FALSE );
1121 if ( d->maxWindow && d->maxWindow->windowWidget() )
1122 d->maxWindow->windowWidget()->close();
1123 else if ( d->active && d->active->windowWidget() )
1124 d->active->windowWidget()->close();
1125 setUpdatesEnabled( TRUE );
1129 void QWorkspaceP::closeAllWindows()
1131 QPtrListIterator<QWorkspacePChild> it( d->windows );
1132 QWorkspacePChild *c = 0;
1133 while ( ( c = it.current() ) != 0 ) {
1135 if ( c->windowWidget() )
1136 c->windowWidget()->close();
1140 void QWorkspaceP::normalizeActiveWindow()
1143 d->maxWindow->showNormal();
1144 else if ( d->active )
1145 d->active->showNormal();
1148 void QWorkspaceP::minimizeActiveWindow()
1151 d->maxWindow->showMinimized();
1152 else if ( d->active )
1153 d->active->showMinimized();
1156 void QWorkspaceP::showOperationMenu()
1158 if ( !d->active || !d->active->windowWidget() )
1160 Q_ASSERT( d->active->windowWidget()->testWFlags( WStyle_SysMenu ) );
1162 QPopupMenu *popup = d->active->windowWidget()->testWFlags( WStyle_Tool ) ? d->toolPopup : d->popup;
1163 if ( QApplication::reverseLayout() ) {
1164 p = QPoint( d->active->windowWidget()->mapToGlobal( QPoint(d->active->windowWidget()->width(),0) ) );
1165 p.rx() -= popup->sizeHint().width();
1167 p = QPoint( d->active->windowWidget()->mapToGlobal( QPoint(0,0) ) );
1169 if ( !d->active->isVisible() ) {
1170 p = d->active->iconWidget()->mapToGlobal( QPoint(0,0) );
1171 p.ry() -= popup->sizeHint().height();
1173 popupOperationMenu( p );
1176 void QWorkspaceP::popupOperationMenu( const QPoint& p)
1178 if ( !d->active || !d->active->windowWidget() || !d->active->windowWidget()->testWFlags( WStyle_SysMenu ) )
1180 if ( d->active->windowWidget()->testWFlags( WStyle_Tool ))
1181 d->toolPopup->popup( p );
1183 d->popup->popup( p );
1186 void QWorkspaceP::operationMenuAboutToShow()
1188 for ( int i = 1; i < 6; i++ ) {
1189 bool enable = d->active != 0;
1190 d->popup->setItemEnabled( i, enable );
1193 if ( !d->active || !d->active->windowWidget() )
1196 d->popup->setItemEnabled( 4, d->active->windowWidget()->testWFlags( WStyle_Minimize ) );
1197 d->popup->setItemEnabled( 5, d->active->windowWidget()->testWFlags( WStyle_Maximize ) );
1199 if ( d->active == d->maxWindow ) {
1200 d->popup->setItemEnabled( 2, FALSE );
1201 d->popup->setItemEnabled( 3, FALSE );
1202 d->popup->setItemEnabled( 5, FALSE );
1203 } else if ( d->active->isVisible() ){
1204 d->popup->setItemEnabled( 1, FALSE );
1206 d->popup->setItemEnabled( 2, FALSE );
1207 d->popup->setItemEnabled( 3, FALSE );
1208 d->popup->setItemEnabled( 4, FALSE );
1212 void QWorkspaceP::toolMenuAboutToShow()
1214 if ( !d->active || !d->active->windowWidget() )
1217 d->toolPopup->setItemEnabled( 3, !d->active->shademode );
1218 if ( d->active->shademode )
1219 d->toolPopup->changeItem( 6,
1220 QIconSet(style().stylePixmap(QStyle::SP_TitleBarUnshadeButton)), tr("&Unshade") );
1222 d->toolPopup->changeItem( 6, QIconSet(style().stylePixmap(QStyle::SP_TitleBarShadeButton)), tr("Sh&ade") );
1223 d->toolPopup->setItemEnabled( 6, d->active->windowWidget()->testWFlags( WStyle_MinMax ) );
1224 d->toolPopup->setItemChecked( 7, d->active->windowWidget()->testWFlags( WStyle_StaysOnTop ) );
1227 void QWorkspaceP::operationMenuActivated( int a )
1233 d->active->showNormal();
1236 d->active->doMove();
1239 if ( d->active->shademode )
1240 d->active->showShaded();
1241 d->active->doResize();
1244 d->active->showMinimized();
1247 d->active->showMaximized();
1250 d->active->showShaded();
1254 QWorkspaceP* w = (QWorkspaceP*)d->active->windowWidget();
1257 if ( w->testWFlags( WStyle_StaysOnTop ) ) {
1258 w->clearWFlags( WStyle_StaysOnTop );
1260 w->setWFlags( WStyle_StaysOnTop );
1261 w->parentWidget()->raise();
1270 void QWorkspaceP::activateNextWindow()
1272 if ( d->focus.isEmpty() )
1275 if ( d->focus.first() )
1276 activateWindow( d->focus.first()->windowWidget(), FALSE );
1280 int a = d->focus.find( d->active ) + 1;
1282 a = a % d->focus.count();
1284 if ( d->focus.at( a ) )
1285 activateWindow( d->focus.at( a )->windowWidget(), FALSE );
1290 void QWorkspaceP::activatePreviousWindow()
1292 if ( d->focus.isEmpty() ) {
1293 if ( d->windows.count() > 0 ) { //VSR+
1294 activateWindow( d->windows.last()->windowWidget() ); //VSR+
1299 if ( d->focus.last() )
1300 activateWindow( d->focus.first()->windowWidget(), FALSE );
1302 activateWindow( 0 );
1307 int a = d->focus.find( d->active ) - 1;
1310 a = d->focus.count()-1;
1312 if ( d->autoFocusChange ) {
1313 QWidget *widget = 0;
1314 while ( a >= 0 && d->focus.at( a ) && ( widget = d->focus.at( a )->windowWidget() ) && !widget->isVisible() )
1317 a = d->focus.count() - 1;
1320 if ( d->focus.at( a ) )
1321 activateWindow( d->focus.at( a )->windowWidget(), FALSE );
1323 activateWindow( 0 );
1328 \fn void QWorkspaceP::windowActivated( QWidget* w )
1330 This signal is emitted when the window widget \a w becomes active.
1331 Note that \a w can be null, and that more than one signal may be
1332 fired for one activation event.
1334 \sa activeWindow(), windowList()
1340 Arranges all child windows in a cascade pattern.
1344 void QWorkspaceP::cascade()
1347 d->maxWindow->showNormal();
1350 d->vbar->blockSignals( TRUE );
1351 d->vbar->setValue( 0 );
1352 d->vbar->blockSignals( FALSE );
1353 d->hbar->blockSignals( TRUE );
1354 d->hbar->setValue( 0 );
1355 d->hbar->blockSignals( FALSE );
1359 const int xoffset = 13;
1360 const int yoffset = 20;
1362 // make a list of all relevant mdi clients
1363 QPtrList<QWorkspacePChild> widgets;
1364 QWorkspacePChild* wc = 0;
1365 for ( wc = d->windows.first(); wc; wc = d->windows.next() )
1367 normalizeWindow( wc->windowWidget() );
1368 for ( wc = d->focus.first(); wc; wc = d->focus.next() )
1369 if ( wc->windowWidget()->isVisibleTo( this ) && !wc->windowWidget()->testWFlags( WStyle_Tool ) )
1370 widgets.append( wc );
1375 setUpdatesEnabled( FALSE );
1376 QPtrListIterator<QWorkspacePChild> it( widgets );
1377 int children = d->windows.count() - 1;
1378 while ( it.current () ) {
1379 QWorkspacePChild *child = it.current();
1381 child->setUpdatesEnabled( FALSE );
1382 bool hasSizeHint = FALSE;
1383 QSize prefSize = child->windowWidget()->sizeHint().expandedTo( child->windowWidget()->minimumSizeHint() );
1385 if ( !prefSize.isValid() )
1386 prefSize = QSize( width() - children * xoffset, height() - children * yoffset );
1389 prefSize = prefSize.expandedTo( child->windowWidget()->minimumSize() ).boundedTo( child->windowWidget()->maximumSize() );
1391 prefSize += QSize( child->baseSize().width(), child->baseSize().height() );
1393 int w = prefSize.width();
1394 int h = prefSize.height();
1396 child->showNormal();
1397 qApp->sendPostedEvents( 0, QEvent::ShowNormal );
1398 if ( y + h > height() )
1400 if ( x + w > width() )
1402 child->setGeometry( x, y, w, h );
1405 child->internalRaise();
1406 child->setUpdatesEnabled( TRUE );
1408 setUpdatesEnabled( TRUE );
1413 Arranges all child windows in a tile pattern.
1417 void QWorkspaceP::tile()
1420 d->maxWindow->showNormal();
1423 d->vbar->blockSignals( TRUE );
1424 d->vbar->setValue( 0 );
1425 d->vbar->blockSignals( FALSE );
1426 d->hbar->blockSignals( TRUE );
1427 d->hbar->setValue( 0 );
1428 d->hbar->blockSignals( FALSE );
1435 QWorkspacePChild* c;
1437 QPtrListIterator<QWorkspacePChild> it( d->windows );
1438 while ( it.current () ) {
1441 if ( !c->windowWidget()->isHidden() &&
1442 !c->windowWidget()->testWFlags( WStyle_StaysOnTop ) &&
1443 !c->windowWidget()->testWFlags( WStyle_Tool ) )
1447 while ( rows * cols < n ) {
1453 int add = cols * rows - n;
1454 bool* used = new bool[ cols*rows ];
1455 for ( int i = 0; i < rows*cols; i++ )
1460 int w = width() / cols;
1461 int h = height() / rows;
1464 while ( it.current () ) {
1467 if ( c->windowWidget()->isHidden() || c->windowWidget()->testWFlags( WStyle_Tool ) )
1469 if ( c->windowWidget()->testWFlags( WStyle_StaysOnTop ) ) {
1470 QPoint p = c->pos();
1471 if ( p.x()+c->width() < 0 )
1473 if ( p.x() > width() )
1474 p.setX( width() - c->width() );
1475 if ( p.y() + 10 < 0 )
1477 if ( p.y() > height() )
1478 p.setY( height() - c->height() );
1481 if ( p != c->pos() )
1482 c->QFrame::move( p );
1485 qApp->sendPostedEvents( 0, QEvent::ShowNormal );
1486 used[row*cols+col] = TRUE;
1488 c->setGeometry( col*w, row*h, QMIN( w, c->windowWidget()->maximumWidth()+c->baseSize().width() ),
1489 QMIN( 2*h, c->windowWidget()->maximumHeight()+c->baseSize().height() ) );
1490 used[(row+1)*cols+col] = TRUE;
1493 c->setGeometry( col*w, row*h, QMIN( w, c->windowWidget()->maximumWidth()+c->baseSize().width() ),
1494 QMIN( h, c->windowWidget()->maximumHeight()+c->baseSize().height() ) );
1496 while( row < rows && col < cols && used[row*cols+col] ) {
1498 if ( col == cols ) {
1509 QWorkspacePChild::QWorkspacePChild( QWidget* window, QWorkspaceP *parent,
1511 : QFrame( parent, name,
1512 WStyle_Customize | WStyle_NoBorder | WDestructiveClose | WNoMousePropagation | WSubWindow )
1514 setMouseTracking( TRUE );
1520 snappedRight = FALSE;
1521 snappedDown = FALSE;
1524 switch (window->focusPolicy()) {
1525 case QWidget::NoFocus:
1526 window->setFocusPolicy(QWidget::ClickFocus);
1528 case QWidget::TabFocus:
1529 window->setFocusPolicy(QWidget::StrongFocus);
1536 if ( window && window->testWFlags( WStyle_Title ) ) {
1537 titlebar = new QTitleBarP( window, this, "qt_ws_titlebar" );
1538 connect( titlebar, SIGNAL( doActivate() ),
1539 this, SLOT( activate() ) );
1540 connect( titlebar, SIGNAL( doClose() ),
1541 window, SLOT( close() ) );
1542 connect( titlebar, SIGNAL( doMinimize() ),
1543 this, SLOT( showMinimized() ) );
1544 connect( titlebar, SIGNAL( doNormal() ),
1545 this, SLOT( showNormal() ) );
1546 connect( titlebar, SIGNAL( doMaximize() ),
1547 this, SLOT( showMaximized() ) );
1548 connect( titlebar, SIGNAL( popupOperationMenu( const QPoint& ) ),
1549 this, SIGNAL( popupOperationMenu( const QPoint& ) ) );
1550 connect( titlebar, SIGNAL( showOperationMenu() ),
1551 this, SIGNAL( showOperationMenu() ) );
1552 connect( titlebar, SIGNAL( doShade() ),
1553 this, SLOT( showShaded() ) );
1554 connect( titlebar, SIGNAL( doubleClicked() ),
1555 this, SLOT( titleBarDoubleClicked() ) );
1558 if ( window && window->testWFlags( WStyle_Tool ) ) {
1559 setFrameStyle( QFrame::StyledPanel | QFrame::Raised );
1561 setMinimumSize( 128, 0 );
1563 setFrameStyle( QFrame::StyledPanel | QFrame::Raised );
1565 setMinimumSize( 128, 0 );
1568 childWidget = window;
1572 #ifndef QT_NO_WIDGET_TOPEXTRA
1573 setCaption( childWidget->caption() );
1580 bool hasBeenResized = childWidget->testWState( WState_Resized );
1582 if ( !hasBeenResized )
1583 cs = childWidget->sizeHint().expandedTo( childWidget->minimumSizeHint() );
1585 cs = childWidget->size();
1587 int th = titlebar ? titlebar->sizeHint().height() : 0;
1589 #ifndef QT_NO_WIDGET_TOPEXTRA
1590 if( childWidget->icon() ) {
1591 QPixmap pm(*childWidget->icon());
1592 if(pm.width() != 14 || pm.height() != 14) {
1595 pm = im.smoothScale( 14, 14 );
1597 titlebar->setIcon( pm );
1600 p = QPoint( contentsRect().x(),
1601 th + contentsRect().y() );
1602 s = QSize( cs.width() + 2*frameWidth(),
1603 cs.height() + 2*frameWidth() + th + 2 );
1605 p = QPoint( contentsRect().x(), contentsRect().y() );
1606 s = QSize( cs.width() + 2*frameWidth(),
1607 cs.height() + 2*frameWidth() );
1610 childWidget->reparent( this, p);
1613 childWidget->installEventFilter( this );
1615 widgetResizeHandler = new QWidgetResizeHandlerP( this, window );
1616 widgetResizeHandler->setMovingEnabled( FALSE );
1617 widgetResizeHandler->setSizeProtection( !parent->scrollBarsEnabled() );
1618 connect( widgetResizeHandler, SIGNAL( activate() ),
1619 this, SLOT( activate() ) );
1620 widgetResizeHandler->setExtraHeight( th + 2 );
1622 setBaseSize( baseSize() );
1625 QWorkspacePChild::~QWorkspacePChild()
1628 delete iconw->parentWidget();
1631 void QWorkspacePChild::moveEvent( QMoveEvent * )
1633 ((QWorkspaceP*) parentWidget() )->updateWorkspace();
1636 void QWorkspacePChild::resizeEvent( QResizeEvent * )
1638 QRect r = contentsRect();
1642 int th = titlebar->sizeHint().height();
1643 QRect tbrect( 0, 0, width(), th );
1644 if ( !style().styleHint( QStyle::SH_TitleBar_NoBorder ) )
1645 tbrect = QRect( r.x(), r.y(), r.width(), th );
1646 titlebar->setGeometry( tbrect );
1647 cr = QRect( r.x(), r.y() + titlebar->height() + (shademode ? 5 : 1),
1648 r.width(), r.height() - titlebar->height() - 2 );
1656 windowSize = cr.size();
1657 childWidget->setGeometry( cr );
1658 ((QWorkspaceP*) parentWidget() )->updateWorkspace();
1661 QSize QWorkspacePChild::baseSize() const
1663 int th = titlebar ? titlebar->sizeHint().height() : 0;
1664 return QSize( 2*frameWidth(), 2*frameWidth() + th + 2 );
1667 QSize QWorkspacePChild::sizeHint() const
1670 return QFrame::sizeHint() + baseSize();
1671 return childWidget->sizeHint().expandedTo( childWidget->minimumSizeHint() ) + baseSize();
1674 QSize QWorkspacePChild::minimumSizeHint() const
1677 return QFrame::minimumSizeHint() + baseSize();
1678 QSize s = childWidget->minimumSize();
1680 s = childWidget->minimumSizeHint();
1681 return s + baseSize();
1684 void QWorkspacePChild::activate()
1686 ((QWorkspaceP*)parentWidget())->activateWindow( windowWidget() );
1689 bool QWorkspacePChild::eventFilter( QObject * o, QEvent * e)
1691 if ( !isActive() && ( e->type() == QEvent::MouseButtonPress ||
1692 e->type() == QEvent::FocusIn ) ) {
1694 ((QWorkspaceP*)parentWidget())->normalizeWindow( windowWidget() );
1696 ((QWorkspaceP*)parentWidget())->removeIcon( iconw->parentWidget() );
1697 delete iconw->parentWidget();
1704 // for all widgets except the window, we that's the only thing we
1705 // process, and if we have no childWidget we skip totally
1706 if ( o != childWidget || childWidget == 0 )
1709 switch ( e->type() ) {
1711 if ( ((QWorkspaceP*)parentWidget())->d->focus.find( this ) < 0 )
1712 ((QWorkspaceP*)parentWidget())->d->focus.append( this );
1713 if ( isVisibleTo( parentWidget() ) )
1715 if (( (QShowEvent*)e)->spontaneous() )
1718 case QEvent::ShowToParent:
1719 if ( windowWidget() && windowWidget()->testWFlags( WStyle_StaysOnTop ) ) {
1723 ((QWorkspaceP*)parentWidget())->showWindow( windowWidget() );
1725 case QEvent::ShowMaximized:
1726 if ( windowWidget()->maximumSize().isValid() &&
1727 ( windowWidget()->maximumWidth() < parentWidget()->width() ||
1728 windowWidget()->maximumHeight() < parentWidget()->height() ) ) {
1729 windowWidget()->resize( windowWidget()->maximumSize() );
1732 if ( windowWidget()->testWFlags( WStyle_Maximize ) && !windowWidget()->testWFlags( WStyle_Tool ) )
1733 ((QWorkspaceP*)parentWidget())->maximizeWindow( windowWidget() );
1735 ((QWorkspaceP*)parentWidget())->normalizeWindow( windowWidget() );
1737 case QEvent::ShowMinimized:
1738 ((QWorkspaceP*)parentWidget())->minimizeWindow( windowWidget() );
1740 case QEvent::ShowNormal:
1741 ((QWorkspaceP*)parentWidget())->normalizeWindow( windowWidget() );
1743 ((QWorkspaceP*)parentWidget())->removeIcon( iconw->parentWidget() );
1744 delete iconw->parentWidget();
1748 case QEvent::HideToParent:
1749 if ( !childWidget->isVisibleTo( this ) ) {
1750 QWidget * w = iconw;
1751 if ( w && ( w = w->parentWidget() ) ) {
1752 ((QWorkspaceP*)parentWidget())->removeIcon( w );
1758 case QEvent::CaptionChange:
1759 #ifndef QT_NO_WIDGET_TOPEXTRA
1760 setCaption( childWidget->caption() );
1762 iconw->setCaption( childWidget->caption() );
1765 case QEvent::IconChange:
1767 QWorkspaceP* ws = (QWorkspaceP*)parentWidget();
1770 #ifndef QT_NO_WIDGET_TOPEXTRA
1771 if ( childWidget->icon() ) {
1772 titlebar->setIcon( *childWidget->icon() );
1777 titlebar->setIcon( pm );
1780 if ( ws->d->maxWindow != this )
1783 if ( ws->d->maxtools ) {
1784 #ifndef QT_NO_WIDGET_TOPEXTRA
1785 if ( childWidget->icon() ) {
1786 QPixmap pm(*childWidget->icon());
1787 if(pm.width() != 14 || pm.height() != 14) {
1790 pm = im.smoothScale( 14, 14 );
1792 ws->d->maxtools->setPixmap( pm );
1798 ws->d->maxtools->setPixmap( pm );
1803 case QEvent::Resize:
1805 QResizeEvent* re = (QResizeEvent*)e;
1806 if ( re->size() != windowSize && !shademode )
1807 resize( re->size() + baseSize() );
1811 case QEvent::WindowDeactivate:
1813 titlebar->setActive( FALSE );
1816 case QEvent::WindowActivate:
1818 titlebar->setActive( act );
1825 return QFrame::eventFilter(o, e);
1828 bool QWorkspacePChild::focusNextPrevChild( bool next )
1830 QFocusData *f = focusData();
1832 QWidget *startingPoint = f->home();
1833 QWidget *candidate = 0;
1834 QWidget *w = next ? f->next() : f->prev();
1835 while( !candidate && w != startingPoint ) {
1836 if ( w != startingPoint &&
1837 (w->focusPolicy() & TabFocus) == TabFocus
1838 && w->isEnabled() &&!w->focusProxy() && w->isVisible() )
1840 w = next ? f->next() : f->prev();
1844 QObjectList *ol = queryList();
1845 bool ischild = ol->findRef( candidate ) != -1;
1848 startingPoint = f->home();
1849 QWidget *nw = next ? f->prev() : f->next();
1850 QObjectList *ol2 = queryList();
1851 QWidget *lastValid = 0;
1852 candidate = startingPoint;
1853 while ( nw != startingPoint ) {
1854 if ( ( candidate->focusPolicy() & TabFocus ) == TabFocus
1855 && candidate->isEnabled() &&!candidate->focusProxy() && candidate->isVisible() )
1856 lastValid = candidate;
1857 if ( ol2->findRef( nw ) == -1 ) {
1858 candidate = lastValid;
1862 nw = next ? f->prev() : f->next();
1871 candidate->setFocus();
1875 void QWorkspacePChild::childEvent( QChildEvent* e)
1877 if ( e->type() == QEvent::ChildRemoved && e->child() == childWidget ) {
1880 ((QWorkspaceP*)parentWidget())->removeIcon( iconw->parentWidget() );
1881 delete iconw->parentWidget();
1888 void QWorkspacePChild::doResize()
1890 widgetResizeHandler->doResize();
1893 void QWorkspacePChild::doMove()
1895 widgetResizeHandler->doMove();
1898 void QWorkspacePChild::enterEvent( QEvent * )
1902 void QWorkspacePChild::leaveEvent( QEvent * )
1904 #ifndef QT_NO_CURSOR
1905 if ( !widgetResizeHandler->isButtonDown() )
1906 setCursor( arrowCursor );
1910 void QWorkspacePChild::drawFrame( QPainter *p )
1912 QStyle::SFlags flags = QStyle::Style_Default;
1913 QStyleOption opt(lineWidth(),midLineWidth());
1916 flags |= QStyle::Style_Active;
1918 style().drawPrimitive( QStyle::PE_WindowFrame, p, rect(), colorGroup(), flags, opt );
1921 void QWorkspacePChild::styleChange( QStyle & )
1925 QVBox *vbox = (QVBox*)iconw->parentWidget()->qt_cast( "QVBox" );
1927 if ( !style().styleHint( QStyle::SH_TitleBar_NoBorder ) ) {
1928 vbox->setFrameStyle( QFrame::WinPanel | QFrame::Raised );
1929 vbox->resize( 196+2*vbox->frameWidth(), 20 + 2*vbox->frameWidth() );
1931 vbox->resize( 196, 20 );
1936 static bool isChildOf( QWidget * child, QWidget * parent )
1938 if ( !parent || !child )
1940 QWidget * w = child;
1941 while( w && w != parent )
1942 w = w->parentWidget();
1947 void QWorkspacePChild::setActive( bool b )
1959 titlebar->setActive( act );
1961 iconw->setActive( act );
1963 QObjectList* ol = childWidget->queryList( "QWidget" );
1966 for ( o = ol->first(); o; o = ol->next() )
1967 o->removeEventFilter( this );
1968 bool hasFocus = isChildOf( focusWidget(), childWidget );
1970 if ( lastfocusw && ol->contains( lastfocusw ) &&
1971 lastfocusw->focusPolicy() != NoFocus ) {
1972 // this is a bug if lastfocusw has been deleted, a new
1973 // widget has been created, and the new one is a child
1974 // of the same window as the old one. but even though
1975 // it's a bug the behaviour is reasonable
1976 lastfocusw->setFocus();
1977 } else if ( childWidget->focusPolicy() != NoFocus ) {
1978 childWidget->setFocus();
1980 // find something, anything, that accepts focus, and use that.
1982 while( o && ((QWidget*)o)->focusPolicy() == NoFocus )
1985 ((QWidget*)o)->setFocus();
1990 if ( isChildOf( focusWidget(), childWidget ) )
1991 lastfocusw = focusWidget();
1993 for ( o = ol->first(); o; o = ol->next() ) {
1994 o->removeEventFilter( this );
1995 o->installEventFilter( this );
2001 bool QWorkspacePChild::isActive() const
2006 QWidget* QWorkspacePChild::windowWidget() const
2012 QWidget* QWorkspacePChild::iconWidget() const
2015 QWorkspacePChild* that = (QWorkspacePChild*) this;
2016 QVBox* vbox = new QVBox(0, "qt_vbox" );
2017 if ( !style().styleHint( QStyle::SH_TitleBar_NoBorder ) ) {
2018 vbox->setFrameStyle( QFrame::WinPanel | QFrame::Raised );
2019 vbox->resize( 196+2*vbox->frameWidth(), 20 + 2*vbox->frameWidth() );
2021 vbox->resize( 196, 20 );
2023 QTitleBarP *tb = new QTitleBarP( windowWidget(), vbox, "_workspacechild_icon_");
2024 ((QWorkspacePChild*)tb)->setWState( WState_Minimized );
2026 iconw->setActive( isActive() );
2027 connect( iconw, SIGNAL( doActivate() ),
2028 this, SLOT( activate() ) );
2029 connect( iconw, SIGNAL( doClose() ),
2030 windowWidget(), SLOT( close() ) );
2031 connect( iconw, SIGNAL( doNormal() ),
2032 this, SLOT( showNormal() ) );
2033 connect( iconw, SIGNAL( doMaximize() ),
2034 this, SLOT( showMaximized() ) );
2035 connect( iconw, SIGNAL( popupOperationMenu( const QPoint& ) ),
2036 this, SIGNAL( popupOperationMenu( const QPoint& ) ) );
2037 connect( iconw, SIGNAL( showOperationMenu() ),
2038 this, SIGNAL( showOperationMenu() ) );
2039 connect( iconw, SIGNAL( doubleClicked() ),
2040 this, SLOT( titleBarDoubleClicked() ) );
2042 #ifndef QT_NO_WIDGET_TOPEXTRA
2043 if ( windowWidget() ) {
2044 iconw->setCaption( windowWidget()->caption() );
2045 if ( windowWidget()->icon() )
2046 iconw->setIcon( *windowWidget()->icon() );
2049 return iconw->parentWidget();
2052 void QWorkspacePChild::showMinimized()
2054 QApplication::postEvent( windowWidget(), new QEvent( QEvent::ShowMinimized ) );
2057 void QWorkspacePChild::showMaximized()
2059 QApplication::postEvent( windowWidget(), new QEvent( QEvent::ShowMaximized ) );
2062 void QWorkspacePChild::showNormal()
2064 QApplication::postEvent( windowWidget(), new QEvent( QEvent::ShowNormal ) );
2067 void QWorkspacePChild::showShaded()
2071 Q_ASSERT( windowWidget()->testWFlags( WStyle_MinMax ) && windowWidget()->testWFlags( WStyle_Tool ) );
2072 ((QWorkspaceP*)parentWidget())->activateWindow( windowWidget() );
2074 QWorkspacePChild* fake = (QWorkspacePChild*)windowWidget();
2075 fake->clearWState( WState_Minimized );
2076 clearWState( WState_Minimized );
2079 resize( shadeRestore );
2080 setMinimumSize( shadeRestoreMin );
2082 shadeRestore = size();
2083 shadeRestoreMin = minimumSize();
2084 setMinimumHeight(0);
2086 QWorkspacePChild* fake = (QWorkspacePChild*)windowWidget();
2087 fake->setWState( WState_Minimized );
2088 setWState( WState_Minimized );
2090 resize( width(), titlebar->height() + 2*lineWidth() + 1 );
2095 void QWorkspacePChild::titleBarDoubleClicked()
2097 if ( !windowWidget() )
2099 if ( windowWidget()->testWFlags( WStyle_MinMax ) ) {
2100 if ( windowWidget()->testWFlags( WStyle_Tool ) )
2104 else if ( windowWidget()->testWFlags( WStyle_Maximize ) )
2109 void QWorkspacePChild::adjustToFullscreen()
2111 qApp->sendPostedEvents( this, QEvent::Resize );
2112 qApp->sendPostedEvents( childWidget, QEvent::Resize );
2113 qApp->sendPostedEvents( childWidget, QEvent::Move );
2114 if(style().styleHint(QStyle::SH_Workspace_FillSpaceOnMaximize, this)) {
2115 setGeometry( 0, 0, parentWidget()->width(), parentWidget()->height());
2117 setGeometry( -childWidget->x(), -childWidget->y(),
2118 parentWidget()->width() + width() - childWidget->width(),
2119 parentWidget()->height() + height() - childWidget->height() );
2121 setWState( WState_Maximized );
2122 ((QWorkspacePChild*)childWidget)->setWState( WState_Maximized );
2125 void QWorkspacePChild::adjustSize()
2127 if ( !testWState(WState_Polished) )
2130 QSize prefSize = windowWidget()->sizeHint().expandedTo( windowWidget()->minimumSizeHint() );
2131 prefSize = prefSize.expandedTo( windowWidget()->minimumSize() ).boundedTo( windowWidget()->maximumSize() );
2132 prefSize += baseSize();
2137 void QWorkspacePChild::setCaption( const QString& cap )
2140 titlebar->setCaption( cap );
2141 #ifndef QT_NO_WIDGET_TOPEXTRA
2142 QWidget::setCaption( cap );
2146 void QWorkspacePChild::internalRaise()
2148 setUpdatesEnabled( FALSE );
2150 iconw->parentWidget()->raise();
2153 if ( !windowWidget() || windowWidget()->testWFlags( WStyle_StaysOnTop ) ) {
2154 setUpdatesEnabled( TRUE );
2158 QPtrListIterator<QWorkspacePChild> it( ((QWorkspaceP*)parent())->d->windows );
2159 while ( it.current () ) {
2160 QWorkspacePChild* c = it.current();
2162 if ( c->windowWidget() &&
2163 !c->windowWidget()->isHidden() &&
2164 c->windowWidget()->testWFlags( WStyle_StaysOnTop ) )
2168 setUpdatesEnabled( TRUE );
2171 void QWorkspacePChild::move( int x, int y )
2176 if ( windowWidget() && windowWidget()->testWFlags( WStyle_Tool ) ) {
2180 if ( QABS( x ) < dx )
2182 if ( QABS( y ) < dy )
2184 if ( QABS( x + width() - parentWidget()->width() ) < dx ) {
2185 nx = parentWidget()->width() - width();
2186 snappedRight = TRUE;
2188 snappedRight = FALSE;
2190 if ( QABS( y + height() - parentWidget()->height() ) < dy ) {
2191 ny = parentWidget()->height() - height();
2194 snappedDown = FALSE;
2196 QFrame::move( nx, ny );
2199 bool QWorkspaceP::scrollBarsEnabled() const
2201 return d->vbar != 0;
2204 /*! \property QWorkspaceP::scrollBarsEnabled
2205 \brief whether the workspace provides scrollbars
2207 If this property is set to TRUE, it is possible to resize child
2208 windows over the right or the bottom edge out of the visible area
2209 of the workspace. The workspace shows scrollbars to make it
2210 possible for the user to access those windows. If this property is
2211 set to FALSE (the default), resizing windows out of the visible
2212 area of the workspace is not permitted.
2214 void QWorkspaceP::setScrollBarsEnabled( bool enable )
2216 if ( (d->vbar != 0) == enable )
2219 d->xoffset = d->yoffset = 0;
2221 d->vbar = new QScrollBar( Vertical, this, "vertical scrollbar" );
2222 connect( d->vbar, SIGNAL( valueChanged(int) ), this, SLOT( scrollBarChanged() ) );
2223 d->hbar = new QScrollBar( Horizontal, this, "horizontal scrollbar" );
2224 connect( d->hbar, SIGNAL( valueChanged(int) ), this, SLOT( scrollBarChanged() ) );
2225 d->corner = new QWidget( this, "qt_corner" );
2231 d->vbar = d->hbar = 0;
2235 QPtrListIterator<QWorkspacePChild> it( d->windows );
2236 while ( it.current () ) {
2237 QWorkspacePChild *child = it.current();
2239 child->widgetResizeHandler->setSizeProtection( !enable );
2243 QRect QWorkspaceP::updateWorkspace()
2245 if ( !isUpdatesEnabled() )
2250 if ( scrollBarsEnabled() && !d->maxWindow ) {
2255 d->maxWindow->raise();
2257 QRect r( 0, 0, 0, 0 );
2258 QPtrListIterator<QWorkspacePChild> it( d->windows );
2259 while ( it.current () ) {
2260 QWorkspacePChild *child = it.current();
2262 if ( !child->isHidden() )
2263 r = r.unite( child->geometry() );
2265 d->vbar->blockSignals( TRUE );
2266 d->hbar->blockSignals( TRUE );
2268 int hsbExt = d->hbar->sizeHint().height();
2269 int vsbExt = d->vbar->sizeHint().width();
2272 bool showv = d->yoffset || d->yoffset + r.bottom() - height() + 1 > 0 || d->yoffset + r.top() < 0;
2273 bool showh = d->xoffset || d->xoffset + r.right() - width() + 1 > 0 || d->xoffset + r.left() < 0;
2275 if ( showh && !showv)
2276 showv = d->yoffset + r.bottom() - height() + hsbExt + 1 > 0;
2277 if ( showv && !showh )
2278 showh = d->xoffset + r.right() - width() + vsbExt + 1 > 0;
2286 d->vbar->setSteps( QMAX( height() / 12, 30 ), height() - hsbExt );
2287 d->vbar->setRange( QMIN( 0, d->yoffset + QMIN( 0, r.top() ) ), QMAX( 0, d->yoffset + QMAX( 0, r.bottom() - height() + hsbExt + 1) ) );
2288 d->vbar->setGeometry( width() - vsbExt, 0, vsbExt, height() - hsbExt );
2289 d->vbar->setValue( d->yoffset );
2296 d->hbar->setSteps( QMAX( width() / 12, 30 ), width() - vsbExt );
2297 d->hbar->setRange( QMIN( 0, d->xoffset + QMIN( 0, r.left() ) ), QMAX( 0, d->xoffset + QMAX( 0, r.right() - width() + vsbExt + 1) ) );
2298 d->hbar->setGeometry( 0, height() - hsbExt, width() - vsbExt, hsbExt );
2299 d->hbar->setValue( d->xoffset );
2305 if ( showh && showv ) {
2306 d->corner->setGeometry( width() - vsbExt, height() - hsbExt, vsbExt, hsbExt );
2312 d->vbar->blockSignals( FALSE );
2313 d->hbar->blockSignals( FALSE );
2315 cr.setRect( 0, 0, width() - vsbExt, height() - hsbExt );
2318 QPtrListIterator<QWidget> ii( d->icons );
2319 while ( ii.current() ) {
2320 QWorkspacePChild* w = (QWorkspacePChild*)ii.current();
2325 if ( x+w->width() > cr.width() ) {
2327 x = cr.width() - w->width();
2329 if ( y+w->height() > cr.height() ) {
2330 y = cr.height() - w->height();
2341 void QWorkspaceP::scrollBarChanged()
2343 int ver = d->yoffset - d->vbar->value();
2344 int hor = d->xoffset - d->hbar->value();
2345 d->yoffset = d->vbar->value();
2346 d->xoffset = d->hbar->value();
2348 QPtrListIterator<QWorkspacePChild> it( d->windows );
2349 while ( it.current () ) {
2350 QWorkspacePChild *child = it.current();
2352 // we do not use move() due to the reimplementation in QWorkspacePChild
2353 child->setGeometry( child->x() + hor, child->y() + ver, child->width(), child->height() );
2360 void QWorkspaceP::styleChange( QStyle &olds )
2362 int fs = style().styleHint(QStyle::SH_Workspace_FillSpaceOnMaximize, this);
2363 if ( isVisibleTo(0) && d->maxWindow &&
2364 fs != olds.styleHint(QStyle::SH_Workspace_FillSpaceOnMaximize, this)) {
2366 hideMaximizeControls();
2368 showMaximizeControls();
2370 QWidget::styleChange(olds);
2376 static bool resizeHorizontalDirectionFixed = FALSE;
2377 static bool resizeVerticalDirectionFixed = FALSE;
2379 QWidgetResizeHandlerP::QWidgetResizeHandlerP( QWidget *parent, QWidget *cw, const char *name )
2380 : QObject( parent, name ), widget( parent ), childWidget( cw ? cw : parent ),
2381 extrahei( 0 ), buttonDown( FALSE ), moveResizeMode( FALSE ), sizeprotect( TRUE ), moving( TRUE )
2384 widget->setMouseTracking( TRUE );
2385 range = widget->inherits( "QFrame" ) ? ((QFrame*)widget)->frameWidth() : RANGE;
2386 range = QMAX( RANGE, range );
2388 qApp->installEventFilter( this );
2391 static QWidget *childOf( QWidget *w, QWidget *child )
2396 child = child->parentWidget();
2401 bool QWidgetResizeHandlerP::eventFilter( QObject *o, QEvent *ee )
2403 if ( !active || !o->isWidgetType() )
2406 QWidget *w = childOf( widget, (QWidget*)o );
2407 if ( !w || o->inherits( "QSizeGrip" ) )
2410 QMouseEvent *e = (QMouseEvent*)ee;
2411 switch ( e->type() ) {
2412 case QEvent::MouseButtonPress: {
2413 if ( w->isMaximized() )
2415 if ( !widget->rect().contains( widget->mapFromGlobal( e->globalPos() ) ) )
2417 if ( e->button() == LeftButton ) {
2419 bool me = isMovingEnabled();
2420 setMovingEnabled( me && o == widget );
2421 mouseMoveEvent( e );
2422 setMovingEnabled( me );
2424 moveOffset = widget->mapFromGlobal( e->globalPos() );
2425 invertedMoveOffset = widget->rect().bottomRight() - moveOffset;
2428 case QEvent::MouseButtonRelease:
2429 if ( w->isMaximized() )
2431 if ( e->button() == LeftButton ) {
2432 moveResizeMode = FALSE;
2434 widget->releaseMouse();
2435 widget->releaseKeyboard();
2438 case QEvent::MouseMove: {
2439 if ( w->isMaximized() )
2441 bool me = isMovingEnabled();
2442 setMovingEnabled( me && o == widget );
2443 mouseMoveEvent( e );
2444 setMovingEnabled( me );
2445 if ( buttonDown && mode != Center )
2448 case QEvent::KeyPress:
2449 keyPressEvent( (QKeyEvent*)e );
2451 case QEvent::AccelOverride:
2453 ((QKeyEvent*)ee)->accept();
2463 void QWidgetResizeHandlerP::mouseMoveEvent( QMouseEvent *e )
2465 QPoint pos = widget->mapFromGlobal( e->globalPos() );
2466 if ( !moveResizeMode && ( !buttonDown || ( e->state() & LeftButton ) == 0 ) ) {
2467 if ( pos.y() <= range && pos.x() <= range)
2469 else if ( pos.y() >= widget->height()-range && pos.x() >= widget->width()-range)
2471 else if ( pos.y() >= widget->height()-range && pos.x() <= range)
2473 else if ( pos.y() <= range && pos.x() >= widget->width()-range)
2475 else if ( pos.y() <= range )
2477 else if ( pos.y() >= widget->height()-range )
2479 else if ( pos.x() <= range )
2481 else if ( pos.x() >= widget->width()-range )
2486 if ( widget->isMinimized() )
2488 #ifndef QT_NO_CURSOR
2489 setMouseCursor( mode );
2494 if ( buttonDown && !isMovingEnabled() && mode == Center && !moveResizeMode )
2497 if ( widget->testWState( WState_ConfigPending ) )
2500 QPoint globalPos = widget->parentWidget( TRUE ) ?
2501 widget->parentWidget( TRUE )->mapFromGlobal( e->globalPos() ) : e->globalPos();
2502 if ( widget->parentWidget( TRUE ) && !widget->parentWidget( TRUE )->rect().contains( globalPos ) ) {
2503 if ( globalPos.x() < 0 )
2505 if ( globalPos.y() < 0 )
2507 if ( sizeprotect && globalPos.x() > widget->parentWidget()->width() )
2508 globalPos.rx() = widget->parentWidget()->width();
2509 if ( sizeprotect && globalPos.y() > widget->parentWidget()->height() )
2510 globalPos.ry() = widget->parentWidget()->height();
2513 QPoint p = globalPos + invertedMoveOffset;
2514 QPoint pp = globalPos - moveOffset;
2517 int mw = QMAX( childWidget->minimumSizeHint().width(),
2518 childWidget->minimumWidth() );
2519 int mh = QMAX( childWidget->minimumSizeHint().height(),
2520 childWidget->minimumHeight() );
2521 if ( childWidget != widget ) {
2522 if ( widget->inherits( "QFrame" ) )
2523 fw = ( (QFrame *) widget )->frameWidth();
2525 mh += 2 * fw + extrahei;
2528 QSize mpsize( widget->geometry().right() - pp.x() + 1,
2529 widget->geometry().bottom() - pp.y() + 1 );
2530 mpsize = mpsize.expandedTo( widget->minimumSize() ).expandedTo( QSize(mw, mh) );
2531 QPoint mp( widget->geometry().right() - mpsize.width() + 1,
2532 widget->geometry().bottom() - mpsize.height() + 1 );
2534 QRect geom = widget->geometry();
2538 geom = QRect( mp, widget->geometry().bottomRight() ) ;
2541 geom = QRect( widget->geometry().topLeft(), p ) ;
2544 geom = QRect( QPoint(mp.x(), widget->geometry().y() ), QPoint( widget->geometry().right(), p.y()) ) ;
2547 geom = QRect( QPoint( widget->geometry().x(), mp.y() ), QPoint( p.x(), widget->geometry().bottom()) ) ;
2550 geom = QRect( QPoint( widget->geometry().left(), mp.y() ), widget->geometry().bottomRight() ) ;
2553 geom = QRect( widget->geometry().topLeft(), QPoint( widget->geometry().right(), p.y() ) ) ;
2556 geom = QRect( QPoint( mp.x(), widget->geometry().top() ), widget->geometry().bottomRight() ) ;
2559 geom = QRect( widget->geometry().topLeft(), QPoint( p.x(), widget->geometry().bottom() ) ) ;
2562 if ( isMovingEnabled() || moveResizeMode )
2563 geom.moveTopLeft( pp );
2569 QSize maxsize( childWidget->maximumSize() );
2570 if ( childWidget != widget )
2571 maxsize += QSize( 2 * fw, 2 * fw + extrahei );
2573 geom = QRect( geom.topLeft(),
2574 geom.size().expandedTo( widget->minimumSize() )
2575 .expandedTo( QSize(mw, mh) )
2576 .boundedTo( maxsize ) );
2578 if ( geom != widget->geometry() &&
2579 ( widget->isTopLevel() || widget->parentWidget()->rect().intersects( geom ) ) ) {
2580 if ( widget->isMinimized() )
2581 widget->move( geom.topLeft() );
2583 widget->setGeometry( geom );
2586 #if defined(Q_WS_WIN)
2588 #if defined(UNICODE)
2590 if ( qWinVersion() & WV_NT_based ) {
2592 while(PeekMessageW( &msg, widget->winId(), WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE ))
2600 while(PeekMessageA( &msg, widget->winId(), WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE ))
2606 QApplication::syncX();
2609 void QWidgetResizeHandlerP::setMouseCursor( MousePosition m )
2611 #ifndef QT_NO_CURSOR
2615 widget->setCursor( sizeFDiagCursor );
2619 widget->setCursor( sizeBDiagCursor );
2623 widget->setCursor( sizeVerCursor );
2627 widget->setCursor( sizeHorCursor );
2630 widget->setCursor( arrowCursor );
2636 void QWidgetResizeHandlerP::keyPressEvent( QKeyEvent * e )
2638 if ( !isMove() && !isResize() )
2640 bool is_control = e->state() & ControlButton;
2641 int delta = is_control?1:8;
2642 QPoint pos = QCursor::pos();
2643 switch ( e->key() ) {
2646 if ( pos.x() <= QApplication::desktop()->geometry().left() ) {
2647 if ( mode == TopLeft || mode == BottomLeft ) {
2648 moveOffset.rx() += delta;
2649 invertedMoveOffset.rx() += delta;
2651 moveOffset.rx() -= delta;
2652 invertedMoveOffset.rx() -= delta;
2655 if ( isResize() && !resizeHorizontalDirectionFixed ) {
2656 resizeHorizontalDirectionFixed = TRUE;
2657 if ( mode == BottomRight )
2659 else if ( mode == TopRight )
2661 #ifndef QT_NO_CURSOR
2662 setMouseCursor( mode );
2663 widget->grabMouse( widget->cursor() );
2665 widget->grabMouse();
2671 if ( pos.x() >= QApplication::desktop()->geometry().right() ) {
2672 if ( mode == TopRight || mode == BottomRight ) {
2673 moveOffset.rx() += delta;
2674 invertedMoveOffset.rx() += delta;
2676 moveOffset.rx() -= delta;
2677 invertedMoveOffset.rx() -= delta;
2680 if ( isResize() && !resizeHorizontalDirectionFixed ) {
2681 resizeHorizontalDirectionFixed = TRUE;
2682 if ( mode == BottomLeft )
2684 else if ( mode == TopLeft )
2686 #ifndef QT_NO_CURSOR
2687 setMouseCursor( mode );
2688 widget->grabMouse( widget->cursor() );
2690 widget->grabMouse();
2696 if ( pos.y() <= QApplication::desktop()->geometry().top() ) {
2697 if ( mode == TopLeft || mode == TopRight ) {
2698 moveOffset.ry() += delta;
2699 invertedMoveOffset.ry() += delta;
2701 moveOffset.ry() -= delta;
2702 invertedMoveOffset.ry() -= delta;
2705 if ( isResize() && !resizeVerticalDirectionFixed ) {
2706 resizeVerticalDirectionFixed = TRUE;
2707 if ( mode == BottomLeft )
2709 else if ( mode == BottomRight )
2711 #ifndef QT_NO_CURSOR
2712 setMouseCursor( mode );
2713 widget->grabMouse( widget->cursor() );
2715 widget->grabMouse();
2721 if ( pos.y() >= QApplication::desktop()->geometry().bottom() ) {
2722 if ( mode == BottomLeft || mode == BottomRight ) {
2723 moveOffset.ry() += delta;
2724 invertedMoveOffset.ry() += delta;
2726 moveOffset.ry() -= delta;
2727 invertedMoveOffset.ry() -= delta;
2730 if ( isResize() && !resizeVerticalDirectionFixed ) {
2731 resizeVerticalDirectionFixed = TRUE;
2732 if ( mode == TopLeft )
2734 else if ( mode == TopRight )
2736 #ifndef QT_NO_CURSOR
2737 setMouseCursor( mode );
2738 widget->grabMouse( widget->cursor() );
2740 widget->grabMouse();
2748 moveResizeMode = FALSE;
2749 widget->releaseMouse();
2750 widget->releaseKeyboard();
2756 QCursor::setPos( pos );
2760 void QWidgetResizeHandlerP::doResize()
2765 moveResizeMode = TRUE;
2767 moveOffset = widget->mapFromGlobal( QCursor::pos() );
2768 if ( moveOffset.x() < widget->width()/2) {
2769 if ( moveOffset.y() < widget->height()/2)
2774 if ( moveOffset.y() < widget->height()/2)
2779 invertedMoveOffset = widget->rect().bottomRight() - moveOffset;
2780 #ifndef QT_NO_CURSOR
2781 setMouseCursor( mode );
2782 widget->grabMouse( widget->cursor() );
2784 widget->grabMouse();
2786 widget->grabKeyboard();
2787 resizeHorizontalDirectionFixed = FALSE;
2788 resizeVerticalDirectionFixed = FALSE;
2791 void QWidgetResizeHandlerP::doMove()
2797 moveResizeMode = TRUE;
2799 moveOffset = widget->mapFromGlobal( QCursor::pos() );
2800 invertedMoveOffset = widget->rect().bottomRight() - moveOffset;
2801 #ifndef QT_NO_CURSOR
2802 widget->grabMouse( SizeAllCursor );
2804 widget->grabMouse();
2806 widget->grabKeyboard();
2809 #ifndef QT_NO_TOOLTIP
2810 class QTitleBarPTip : public QToolTip
2813 QTitleBarPTip( QWidget * parent ) : QToolTip( parent ) { }
2815 void maybeTip( const QPoint &pos )
2817 if ( !parentWidget()->inherits( "QTitleBarP" ) )
2819 QTitleBarP *t = (QTitleBarP *)parentWidget();
2822 QStyle::SubControl ctrl = t->style().querySubControl(QStyle::CC_TitleBar, t, pos);
2823 QSize controlSize = t->style().querySubControlMetrics(QStyle::CC_TitleBar, t, ctrl).size();
2825 QWidget *window = t->window();
2828 case QStyle::SC_TitleBarSysMenu:
2829 if ( t->testWFlags( WStyle_SysMenu ) )
2830 tipstring = QTitleBarP::tr( "System Menu" );
2833 case QStyle::SC_TitleBarShadeButton:
2834 if ( t->testWFlags( WStyle_Tool ) && t->testWFlags( WStyle_MinMax ) )
2835 tipstring = QTitleBarP::tr( "Shade" );
2838 case QStyle::SC_TitleBarUnshadeButton:
2839 if ( t->testWFlags( WStyle_Tool ) && t->testWFlags( WStyle_MinMax ) )
2840 tipstring = QTitleBarP::tr( "Unshade" );
2843 case QStyle::SC_TitleBarNormalButton:
2844 case QStyle::SC_TitleBarMinButton:
2845 if ( !t->testWFlags( WStyle_Tool ) && t->testWFlags( WStyle_Minimize ) ) {
2846 if( window->isMinimized() )
2847 tipstring = QTitleBarP::tr( "Normalize" );
2849 tipstring = QTitleBarP::tr( "Minimize" );
2853 case QStyle::SC_TitleBarMaxButton:
2854 if ( !t->testWFlags( WStyle_Tool ) && t->testWFlags( WStyle_Maximize ) )
2855 tipstring = QTitleBarP::tr( "Maximize" );
2858 case QStyle::SC_TitleBarCloseButton:
2859 if ( t->testWFlags( WStyle_SysMenu ) )
2860 tipstring = QTitleBarP::tr( "Close" );
2867 #ifndef QT_NO_WIDGET_TOPEXTRA
2868 if ( tipstring.isEmpty() ) {
2869 if ( t->visibleText() != t->caption() )
2870 tipstring = t->caption();
2873 if(!tipstring.isEmpty())
2874 tip( QRect(pos, controlSize), tipstring );
2879 class QTitleBarPPrivate
2883 : toolTip( 0 ), act( 0 ), window( 0 ), movable( 1 ), pressed( 0 ), autoraise(0)
2887 QStyle::SCFlags buttonDown;
2898 QTitleBarP::QTitleBarP(QWidget* w, QWidget* parent, const char* name)
2899 : QWidget( parent, name, WStyle_Customize | WStyle_NoBorder | WResizeNoErase | WRepaintNoErase )
2901 d = new QTitleBarPPrivate();
2903 #ifndef QT_NO_TOOLTIP
2904 d->toolTip = new QTitleBarPTip( this );
2907 d->buttonDown = QStyle::SC_None;
2910 setWFlags( ((QTitleBarP*)w)->getWFlags() | WResizeNoErase | WRepaintNoErase );
2911 #ifndef QT_NO_WIDGET_TOPEXTRA
2912 setCaption( w->caption() );
2915 setWFlags( WStyle_Customize | WResizeNoErase | WRepaintNoErase );
2919 setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
2920 setMouseTracking(TRUE);
2923 QTitleBarP::~QTitleBarP()
2925 #ifndef QT_NO_TOOLTIP
2934 extern QRgb qt_colorref2qrgb(COLORREF col);
2937 void QTitleBarP::readColors()
2939 QPalette pal = palette();
2941 #ifdef Q_WS_WIN // ask system properties on windows
2942 #ifndef SPI_GETGRADIENTCAPTIONS
2943 #define SPI_GETGRADIENTCAPTIONS 0x1008
2945 #ifndef COLOR_GRADIENTACTIVECAPTION
2946 #define COLOR_GRADIENTACTIVECAPTION 27
2948 #ifndef COLOR_GRADIENTINACTIVECAPTION
2949 #define COLOR_GRADIENTINACTIVECAPTION 28
2951 if ( QApplication::desktopSettingsAware() ) {
2952 pal.setColor( QPalette::Active, QColorGroup::Highlight, qt_colorref2qrgb(GetSysColor(COLOR_ACTIVECAPTION)) );
2953 pal.setColor( QPalette::Inactive, QColorGroup::Highlight, qt_colorref2qrgb(GetSysColor(COLOR_INACTIVECAPTION)) );
2954 pal.setColor( QPalette::Active, QColorGroup::HighlightedText, qt_colorref2qrgb(GetSysColor(COLOR_CAPTIONTEXT)) );
2955 pal.setColor( QPalette::Inactive, QColorGroup::HighlightedText, qt_colorref2qrgb(GetSysColor(COLOR_INACTIVECAPTIONTEXT)) );
2956 if ( qt_winver != Qt::WV_95 && qt_winver != WV_NT ) {
2959 SystemParametersInfo( SPI_GETGRADIENTCAPTIONS, 0, &gradient, 0 );
2961 #if defined(UNICODE)
2962 if ( qt_winver & Qt::WV_NT_based )
2963 SystemParametersInfo( SPI_GETGRADIENTCAPTIONS, 0, &gradient, 0 );
2966 SystemParametersInfoA( SPI_GETGRADIENTCAPTIONS, 0, &gradient, 0 );
2969 pal.setColor( QPalette::Active, QColorGroup::Base, qt_colorref2qrgb(GetSysColor(COLOR_GRADIENTACTIVECAPTION)) );
2970 pal.setColor( QPalette::Inactive, QColorGroup::Base, qt_colorref2qrgb(GetSysColor(COLOR_GRADIENTINACTIVECAPTION)) );
2972 pal.setColor( QPalette::Active, QColorGroup::Base, palette().active().highlight() );
2973 pal.setColor( QPalette::Inactive, QColorGroup::Base, palette().inactive().highlight() );
2979 pal.setColor( QPalette::Active, QColorGroup::Highlight, palette().active().highlight() );
2980 pal.setColor( QPalette::Active, QColorGroup::Base, palette().active().highlight() );
2981 pal.setColor( QPalette::Inactive, QColorGroup::Highlight, palette().inactive().dark() );
2982 pal.setColor( QPalette::Inactive, QColorGroup::Base, palette().inactive().dark() );
2983 pal.setColor( QPalette::Inactive, QColorGroup::HighlightedText, palette().inactive().background() );
2987 setActive( d->act );
2990 void QTitleBarP::mousePressEvent( QMouseEvent * e)
2993 if ( e->button() == LeftButton ) {
2995 QStyle::SCFlags ctrl = style().querySubControl(QStyle::CC_TitleBar, this, e->pos());
2997 case QStyle::SC_TitleBarSysMenu:
2998 if ( testWFlags( WStyle_SysMenu ) && !testWFlags( WStyle_Tool ) ) {
2999 d->buttonDown = QStyle::SC_None;
3000 static QTime* t = 0;
3001 static QTitleBarP* tc = 0;
3004 if ( tc != this || t->elapsed() > QApplication::doubleClickInterval() ) {
3005 emit showOperationMenu();
3016 case QStyle::SC_TitleBarShadeButton:
3017 case QStyle::SC_TitleBarUnshadeButton:
3018 if ( testWFlags( WStyle_MinMax ) && testWFlags( WStyle_Tool ) )
3019 d->buttonDown = ctrl;
3022 case QStyle::SC_TitleBarNormalButton:
3023 if( testWFlags( WStyle_Minimize ) && !testWFlags( WStyle_Tool ) )
3024 d->buttonDown = ctrl;
3027 case QStyle::SC_TitleBarMinButton:
3028 if( testWFlags( WStyle_Minimize ) && !testWFlags( WStyle_Tool ) )
3029 d->buttonDown = ctrl;
3032 case QStyle::SC_TitleBarMaxButton:
3033 if ( testWFlags( WStyle_Maximize ) && !testWFlags( WStyle_Tool ) )
3034 d->buttonDown = ctrl;
3037 case QStyle::SC_TitleBarCloseButton:
3038 if ( testWFlags( WStyle_SysMenu ) )
3039 d->buttonDown = ctrl;
3042 case QStyle::SC_TitleBarLabel:
3043 d->buttonDown = ctrl;
3044 d->moveOffset = mapToParent( e->pos() );
3056 void QTitleBarP::contextMenuEvent( QContextMenuEvent *e )
3058 QStyle::SCFlags ctrl = style().querySubControl(QStyle::CC_TitleBar, this, e->pos());
3059 if( ctrl == QStyle::SC_TitleBarLabel || ctrl == QStyle::SC_TitleBarSysMenu ) {
3060 emit popupOperationMenu(e->globalPos());
3065 void QTitleBarP::mouseReleaseEvent( QMouseEvent * e)
3067 if ( e->button() == LeftButton && d->pressed) {
3068 QStyle::SCFlags ctrl = style().querySubControl(QStyle::CC_TitleBar, this, e->pos());
3070 if (ctrl == d->buttonDown) {
3072 case QStyle::SC_TitleBarShadeButton:
3073 case QStyle::SC_TitleBarUnshadeButton:
3074 if( testWFlags( WStyle_MinMax ) && testWFlags( WStyle_Tool ) )
3078 case QStyle::SC_TitleBarNormalButton:
3079 if( testWFlags( WStyle_MinMax ) && !testWFlags( WStyle_Tool ) )
3083 case QStyle::SC_TitleBarMinButton:
3084 if( testWFlags( WStyle_Minimize ) && !testWFlags( WStyle_Tool ) )
3088 case QStyle::SC_TitleBarMaxButton:
3089 if( d->window && testWFlags( WStyle_Maximize ) && !testWFlags( WStyle_Tool ) ) {
3090 if(d->window->isMaximized())
3097 case QStyle::SC_TitleBarCloseButton:
3098 if( testWFlags( WStyle_SysMenu ) ) {
3099 d->buttonDown = QStyle::SC_None;
3110 d->buttonDown = QStyle::SC_None;
3116 void QTitleBarP::mouseMoveEvent( QMouseEvent * e)
3118 switch (d->buttonDown) {
3119 case QStyle::SC_None:
3123 case QStyle::SC_TitleBarSysMenu:
3125 case QStyle::SC_TitleBarShadeButton:
3126 case QStyle::SC_TitleBarUnshadeButton:
3127 case QStyle::SC_TitleBarNormalButton:
3128 case QStyle::SC_TitleBarMinButton:
3129 case QStyle::SC_TitleBarMaxButton:
3130 case QStyle::SC_TitleBarCloseButton:
3132 QStyle::SCFlags last_ctrl = d->buttonDown;
3133 d->buttonDown = style().querySubControl(QStyle::CC_TitleBar, this, e->pos());
3134 if( d->buttonDown != last_ctrl)
3135 d->buttonDown = QStyle::SC_None;
3137 d->buttonDown = last_ctrl;
3141 case QStyle::SC_TitleBarLabel:
3142 if ( d->buttonDown == QStyle::SC_TitleBarLabel && d->movable && d->pressed ) {
3143 if ( (d->moveOffset - mapToParent( e->pos() ) ).manhattanLength() >= 4 ) {
3144 QPoint p = mapFromGlobal(e->globalPos());
3145 #ifndef QT_NO_WORKSPACE
3146 if(d->window && d->window->parentWidget()->inherits("QWorkspacePChild")) {
3147 QWidget *w = d->window->parentWidget()->parentWidget();
3148 if(w && w->inherits("QWorkspaceP")) {
3149 QWorkspaceP *workspace = (QWorkspaceP*)w;
3150 p = workspace->mapFromGlobal( e->globalPos() );
3151 if ( !workspace->rect().contains(p) ) {
3156 if ( p.x() > workspace->width() )
3157 p.rx() = workspace->width();
3158 if ( p.y() > workspace->height() )
3159 p.ry() = workspace->height();
3164 QPoint pp = p - d->moveOffset;
3165 parentWidget()->move( pp );
3168 QStyle::SCFlags last_ctrl = d->buttonDown;
3169 d->buttonDown = QStyle::SC_None;
3170 if( d->buttonDown != last_ctrl)
3177 void QTitleBarP::resizeEvent( QResizeEvent *r)
3179 QWidget::resizeEvent(r);
3183 void QTitleBarP::paintEvent(QPaintEvent *)
3185 QStyle::SCFlags ctrls = QStyle::SC_TitleBarLabel;
3186 if ( testWFlags( WStyle_SysMenu) ) {
3187 if ( testWFlags( WStyle_Tool ) ) {
3188 ctrls |= QStyle::SC_TitleBarCloseButton;
3189 if ( d->window && testWFlags( WStyle_MinMax ) ) {
3190 if ( d->window->isMinimized() )
3191 ctrls |= QStyle::SC_TitleBarUnshadeButton;
3193 ctrls |= QStyle::SC_TitleBarShadeButton;
3196 ctrls |= QStyle::SC_TitleBarSysMenu | QStyle::SC_TitleBarCloseButton;
3197 if ( d->window && testWFlags( WStyle_Minimize ) ) {
3198 if( d->window && d->window->isMinimized() )
3199 ctrls |= QStyle::SC_TitleBarNormalButton;
3201 ctrls |= QStyle::SC_TitleBarMinButton;
3203 if ( d->window && testWFlags( WStyle_Maximize ) && !d->window->isMaximized() )
3204 ctrls |= QStyle::SC_TitleBarMaxButton;
3208 QStyle::SCFlags under_mouse = QStyle::SC_None;
3209 if( autoRaise() && hasMouse() ) {
3210 QPoint p(mapFromGlobal(QCursor::pos()));
3211 under_mouse = style().querySubControl(QStyle::CC_TitleBar, this, p);
3212 ctrls ^= under_mouse;
3215 // QSharedDoubleBuffer buffer( (bool)FALSE, (bool)FALSE );
3216 // buffer.begin( this, rect() );
3217 QSharedDoubleBuffer buffer( this, rect() );
3218 style().drawComplexControl(QStyle::CC_TitleBar, buffer.painter(), this, rect(),
3220 isEnabled() ? QStyle::Style_Enabled :
3221 QStyle::Style_Default, ctrls, d->buttonDown);
3222 if(under_mouse != QStyle::SC_None)
3223 style().drawComplexControl(QStyle::CC_TitleBar, buffer.painter(), this, rect(),
3225 QStyle::Style_MouseOver |
3226 (isEnabled() ? QStyle::Style_Enabled : 0),
3227 under_mouse, d->buttonDown);
3230 void QTitleBarP::mouseDoubleClickEvent( QMouseEvent *e )
3232 if ( e->button() != LeftButton )
3235 switch(style().querySubControl(QStyle::CC_TitleBar, this, e->pos())) {
3236 case QStyle::SC_TitleBarLabel:
3237 emit doubleClicked();
3240 case QStyle::SC_TitleBarSysMenu:
3241 if ( testWFlags( WStyle_SysMenu ) )
3250 void QTitleBarP::cutText()
3252 #ifndef QT_NO_WIDGET_TOPEXTRA
3253 QFontMetrics fm( font() );
3255 int maxw = style().querySubControlMetrics(QStyle::CC_TitleBar, this,
3256 QStyle::SC_TitleBarLabel).width();
3258 maxw = width() - 20;
3259 const QString txt = caption();
3261 if ( fm.width( txt + "m" ) > maxw ) {
3262 int i = txt.length();
3263 int dotlength = fm.width( "..." );
3264 while ( i>0 && fm.width(txt.left( i )) + dotlength > maxw )
3266 if(i != (int)txt.length())
3267 d->cuttext = txt.left( i ) + "...";
3272 void QTitleBarP::setCaption( const QString& title )
3274 #ifndef QT_NO_WIDGET_TOPEXTRA
3275 if( caption() == title)
3277 QWidget::setCaption( title );
3285 void QTitleBarP::setIcon( const QPixmap& icon )
3287 #ifndef QT_NO_WIDGET_TOPEXTRA
3288 #ifndef QT_NO_IMAGE_SMOOTHSCALE
3289 QRect menur = style().querySubControlMetrics(QStyle::CC_TitleBar, this,
3290 QStyle::SC_TitleBarSysMenu);
3293 if (icon.width() > menur.width()) {
3294 // try to keep something close to the same aspect
3295 int aspect = (icon.height() * 100) / icon.width();
3296 int newh = (aspect * menur.width()) / 100;
3297 theIcon.convertFromImage( icon.convertToImage().smoothScale(menur.width(),
3299 } else if (icon.height() > menur.height()) {
3300 // try to keep something close to the same aspect
3301 int aspect = (icon.width() * 100) / icon.height();
3302 int neww = (aspect * menur.height()) / 100;
3303 theIcon.convertFromImage( icon.convertToImage().smoothScale(neww,
3308 QWidget::setIcon( theIcon );
3310 QWidget::setIcon( icon );
3317 void QTitleBarP::leaveEvent( QEvent * )
3319 if(autoRaise() && !d->pressed)
3323 void QTitleBarP::enterEvent( QEvent * )
3325 if(autoRaise() && !d->pressed)
3327 QEvent e( QEvent::Leave );
3328 QApplication::sendEvent( parentWidget(), &e );
3331 void QTitleBarP::setActive( bool active )
3333 if ( d->act == active )
3340 bool QTitleBarP::isActive() const
3345 bool QTitleBarP::usesActiveColor() const
3347 return ( isActive() && isActiveWindow() ) ||
3348 ( !window() && topLevelWidget()->isActiveWindow() );
3351 QString QTitleBarP::visibleText() const
3356 QWidget *QTitleBarP::window() const
3361 bool QTitleBarP::event( QEvent* e )
3363 if ( e->type() == QEvent::ApplicationPaletteChange ) {
3366 } else if ( e->type() == QEvent::WindowActivate ) {
3367 setActive( d->act );
3368 } else if ( e->type() == QEvent::WindowDeactivate ) {
3369 bool wasActive = d->act;
3374 return QWidget::event( e );
3377 void QTitleBarP::setMovable(bool b)
3382 bool QTitleBarP::isMovable() const
3387 void QTitleBarP::setAutoRaise(bool b)
3392 bool QTitleBarP::autoRaise() const
3394 return d->autoraise;
3397 QSize QTitleBarP::sizeHint() const
3400 QRect menur = style().querySubControlMetrics(QStyle::CC_TitleBar, this,
3401 QStyle::SC_TitleBarSysMenu);
3402 return QSize( menur.width(), style().pixelMetric( QStyle::PM_TitleBarHeight, this ) );