00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "kmdichildview.h"
00033 #include "kmdichildview.moc"
00034
00035 #include <qdatetime.h>
00036 #include <qobjectlist.h>
00037
00038 #include "kmdimainfrm.h"
00039 #include "kmdichildfrm.h"
00040 #include "kmdidefines.h"
00041 #include <kdebug.h>
00042 #include <klocale.h>
00043 #include <qiconset.h>
00044
00045
00046
00047 KMdiChildView::KMdiChildView( const QString& caption, QWidget* parentWidget, const char* name, WFlags f )
00048 : QWidget( parentWidget, name, f )
00049 , m_focusedChildWidget( 0L )
00050 , m_firstFocusableChildWidget( 0L )
00051 , m_lastFocusableChildWidget( 0L )
00052 , m_stateChanged( true )
00053 , m_bToolView( false )
00054 , m_bInterruptActivation( false )
00055 , m_bMainframesActivateViewIsPending( false )
00056 , m_bFocusInEventIsPending( false )
00057 , m_trackChanges( 0 )
00058 {
00059 setGeometry( 0, 0, 0, 0 );
00060 if ( caption != 0L )
00061 m_szCaption = caption;
00062 else
00063 m_szCaption = i18n( "Unnamed" );
00064
00065 m_sTabCaption = m_szCaption;
00066 setFocusPolicy( ClickFocus );
00067 installEventFilter( this );
00068
00069
00070 updateTimeStamp();
00071 }
00072
00073
00074
00075
00076 KMdiChildView::KMdiChildView( QWidget* parentWidget, const char* name, WFlags f )
00077 : QWidget( parentWidget, name, f )
00078 , m_focusedChildWidget( 0L )
00079 , m_firstFocusableChildWidget( 0L )
00080 , m_lastFocusableChildWidget( 0L )
00081 , m_stateChanged( true )
00082 , m_bToolView( false )
00083 , m_bInterruptActivation( false )
00084 , m_bMainframesActivateViewIsPending( false )
00085 , m_bFocusInEventIsPending( false )
00086 {
00087 setGeometry( 0, 0, 0, 0 );
00088 m_szCaption = i18n( "Unnamed" );
00089 m_sTabCaption = m_szCaption;
00090 setFocusPolicy( ClickFocus );
00091 installEventFilter( this );
00092
00093
00094 updateTimeStamp();
00095 }
00096
00097
00098
00099 KMdiChildView::~KMdiChildView()
00100 {
00101 kdDebug( 760 ) << k_funcinfo << endl;
00102 }
00103
00104 void KMdiChildView::trackIconAndCaptionChanges( QWidget *view )
00105 {
00106 m_trackChanges = view;
00107 }
00108
00109
00110
00111
00112 QRect KMdiChildView::internalGeometry() const
00113 {
00114 if ( mdiParent() )
00115 {
00116
00117 QRect posInFrame = geometry();
00118
00119
00120 QPoint ptTopLeft = mdiParent() ->mapToParent( posInFrame.topLeft() );
00121 QSize sz = size();
00122 return QRect( ptTopLeft, sz );
00123 }
00124 else
00125 {
00126 QRect geo = geometry();
00127 QRect frameGeo = externalGeometry();
00128 return QRect( frameGeo.x(), frameGeo.y(), geo.width(), geo.height() );
00129
00130 }
00131 }
00132
00133
00134
00135 void KMdiChildView::setInternalGeometry( const QRect& newGeometry )
00136 {
00137 if ( mdiParent() )
00138 {
00139
00140 QRect geo = internalGeometry();
00141 QRect frameGeo = externalGeometry();
00142 int nFrameSizeTop = geo.y() - frameGeo.y();
00143 int nFrameSizeLeft = geo.x() - frameGeo.x();
00144
00145
00146 QRect newGeoQt;
00147 newGeoQt.setX( newGeometry.x() - nFrameSizeLeft );
00148 newGeoQt.setY( newGeometry.y() - nFrameSizeTop );
00149
00150 newGeoQt.setWidth( newGeometry.width() + nFrameSizeLeft + KMDI_CHILDFRM_DOUBLE_BORDER / 2 );
00151 newGeoQt.setHeight( newGeometry.height() + nFrameSizeTop + KMDI_CHILDFRM_DOUBLE_BORDER / 2 );
00152
00153
00154
00155
00156 mdiParent()->setGeometry( newGeoQt );
00157 }
00158 else
00159 {
00160
00161 QRect geo = internalGeometry();
00162 QRect frameGeo = externalGeometry();
00163 int nFrameSizeTop = geo.y() - frameGeo.y();
00164 int nFrameSizeLeft = geo.x() - frameGeo.x();
00165
00166
00167 QRect newGeoQt;
00168
00169 newGeoQt.setX( newGeometry.x() - nFrameSizeLeft );
00170 newGeoQt.setY( newGeometry.y() - nFrameSizeTop );
00171
00172 newGeoQt.setWidth( newGeometry.width() );
00173 newGeoQt.setHeight( newGeometry.height() );
00174
00175
00176 setGeometry( newGeoQt );
00177 }
00178 }
00179
00180
00181
00182 QRect KMdiChildView::externalGeometry() const
00183 {
00184 return mdiParent() ? mdiParent()->frameGeometry() : frameGeometry();
00185 }
00186
00187
00188
00189 void KMdiChildView::setExternalGeometry( const QRect& newGeometry )
00190 {
00191 if ( mdiParent() )
00192 {
00193 mdiParent() ->setGeometry( newGeometry );
00194 }
00195 else
00196 {
00197
00198 QRect geo = internalGeometry();
00199 QRect frameGeo = externalGeometry();
00200 int nTotalFrameWidth = frameGeo.width() - geo.width();
00201 int nTotalFrameHeight = frameGeo.height() - geo.height();
00202 int nFrameSizeTop = geo.y() - frameGeo.y();
00203 int nFrameSizeLeft = geo.x() - frameGeo.x();
00204
00205
00206
00207 QRect newGeoQt;
00208 newGeoQt.setX( newGeometry.x() + nFrameSizeLeft );
00209 newGeoQt.setY( newGeometry.y() + nFrameSizeTop );
00210 newGeoQt.setWidth( newGeometry.width() - nTotalFrameWidth );
00211 newGeoQt.setHeight( newGeometry.height() - nTotalFrameHeight );
00212
00213
00214 setGeometry( newGeoQt );
00215 }
00216 }
00217
00218
00219
00220 void KMdiChildView::minimize( bool bAnimate )
00221 {
00222 if ( mdiParent() )
00223 {
00224 if ( !isMinimized() )
00225 {
00226 mdiParent() ->setState( KMdiChildFrm::Minimized, bAnimate );
00227 }
00228 }
00229 else
00230 showMinimized();
00231 }
00232
00233 void KMdiChildView::showMinimized()
00234 {
00235 emit isMinimizedNow();
00236 QWidget::showMinimized();
00237 }
00238
00239
00240 void KMdiChildView::minimize()
00241 {
00242 minimize( true );
00243 }
00244
00245
00246
00247 void KMdiChildView::maximize( bool bAnimate )
00248 {
00249 if ( mdiParent() )
00250 {
00251 if ( !isMaximized() )
00252 {
00253 mdiParent() ->setState( KMdiChildFrm::Maximized, bAnimate );
00254 emit mdiParentNowMaximized( true );
00255 }
00256 }
00257 else
00258 showMaximized();
00259 }
00260
00261 void KMdiChildView::showMaximized()
00262 {
00263 emit isMaximizedNow();
00264 QWidget::showMaximized();
00265 }
00266
00267
00268 void KMdiChildView::maximize()
00269 {
00270 maximize( true );
00271 }
00272
00273
00274
00275 QRect KMdiChildView::restoreGeometry()
00276 {
00277 if ( mdiParent() )
00278 return mdiParent() ->restoreGeometry();
00279 else
00280 return geometry();
00281 }
00282
00283
00284
00285 void KMdiChildView::setRestoreGeometry( const QRect& newRestGeo )
00286 {
00287 if ( mdiParent() )
00288 mdiParent()->setRestoreGeometry( newRestGeo );
00289 }
00290
00291
00292
00293 void KMdiChildView::attach()
00294 {
00295 emit attachWindow( this, true );
00296 }
00297
00298
00299
00300 void KMdiChildView::detach()
00301 {
00302 emit detachWindow( this, true );
00303 }
00304
00305
00306
00307 bool KMdiChildView::isMinimized() const
00308 {
00309 if ( mdiParent() )
00310 return ( mdiParent()->state() == KMdiChildFrm::Minimized );
00311 else
00312 return QWidget::isMinimized();
00313 }
00314
00315
00316
00317 bool KMdiChildView::isMaximized() const
00318 {
00319 if ( mdiParent() )
00320 return ( mdiParent()->state() == KMdiChildFrm::Maximized );
00321 else
00322 return QWidget::isMaximized();
00323 }
00324
00325
00326
00327 void KMdiChildView::restore()
00328 {
00329 if ( mdiParent() )
00330 {
00331 if ( isMaximized() )
00332 emit mdiParentNowMaximized( false );
00333
00334 if ( isMinimized() || isMaximized() )
00335 mdiParent()->setState( KMdiChildFrm::Normal );
00336 }
00337 else
00338 showNormal();
00339 }
00340
00341 void KMdiChildView::showNormal()
00342 {
00343 emit isRestoredNow();
00344 QWidget::showNormal();
00345 }
00346
00347
00348
00349 void KMdiChildView::youAreAttached( KMdiChildFrm *lpC )
00350 {
00351 lpC->setCaption( m_szCaption );
00352 emit isAttachedNow();
00353 }
00354
00355
00356
00357 void KMdiChildView::youAreDetached()
00358 {
00359 setCaption( m_szCaption );
00360
00361 setTabCaption( m_sTabCaption );
00362 if ( myIconPtr() )
00363 setIcon( *( myIconPtr() ) );
00364
00365 setFocusPolicy( QWidget::StrongFocus );
00366
00367 emit isDetachedNow();
00368 }
00369
00370
00371
00372 void KMdiChildView::setCaption( const QString& szCaption )
00373 {
00374
00375 m_szCaption = szCaption;
00376 if ( mdiParent() )
00377 mdiParent() ->setCaption( m_szCaption );
00378 else
00379 QWidget::setCaption( m_szCaption );
00380
00381 emit windowCaptionChanged( m_szCaption );
00382 }
00383
00384
00385
00386 void KMdiChildView::closeEvent( QCloseEvent *e )
00387 {
00388 e->ignore();
00389 emit childWindowCloseRequest( this );
00390 }
00391
00392
00393
00394 QPixmap* KMdiChildView::myIconPtr()
00395 {
00396 return 0;
00397 }
00398
00399
00400
00401 void KMdiChildView::focusInEvent( QFocusEvent *e )
00402 {
00403 QWidget::focusInEvent( e );
00404
00405
00406 if ( e && ( ( e->reason() ) == QFocusEvent::Popup ) )
00407 return ;
00408
00409
00410 m_bFocusInEventIsPending = true;
00411 activate();
00412 m_bFocusInEventIsPending = false;
00413
00414 emit gotFocus( this );
00415 }
00416
00417
00418
00419 void KMdiChildView::activate()
00420 {
00421
00422 static bool s_bActivateIsPending = false;
00423 if ( s_bActivateIsPending )
00424 return ;
00425
00426 s_bActivateIsPending = true;
00427
00428
00429 if ( !m_bMainframesActivateViewIsPending )
00430 emit focusInEventOccurs( this );
00431
00432
00433 if ( m_bInterruptActivation )
00434 m_bInterruptActivation = false;
00435 else
00436 {
00437 if ( !m_bFocusInEventIsPending )
00438 setFocus();
00439
00440 kdDebug( 760 ) << k_funcinfo << endl;
00441 emit activated( this );
00442 }
00443
00444 if ( m_focusedChildWidget != 0L )
00445 m_focusedChildWidget->setFocus();
00446 else
00447 {
00448 if ( m_firstFocusableChildWidget != 0L )
00449 {
00450 m_firstFocusableChildWidget->setFocus();
00451 m_focusedChildWidget = m_firstFocusableChildWidget;
00452 }
00453 }
00454 s_bActivateIsPending = false;
00455 }
00456
00457
00458
00459 void KMdiChildView::focusOutEvent( QFocusEvent* e )
00460 {
00461 QWidget::focusOutEvent( e );
00462 emit lostFocus( this );
00463 }
00464
00465
00466
00467 void KMdiChildView::resizeEvent( QResizeEvent* e )
00468 {
00469 QWidget::resizeEvent( e );
00470
00471 if ( m_stateChanged )
00472 {
00473 m_stateChanged = false;
00474 if ( isMaximized() )
00475 {
00476 emit isMaximizedNow();
00477 }
00478 else if ( isMinimized() )
00479 {
00480 emit isMinimizedNow();
00481 }
00482 else
00483 {
00484 emit isRestoredNow();
00485 }
00486 }
00487 }
00488
00489 void KMdiChildView::slot_childDestroyed()
00490 {
00491
00492
00493
00494
00495 const QObject * pLostChild = QObject::sender();
00496 if ( pLostChild && ( pLostChild->isWidgetType() ) )
00497 {
00498 QObjectList* list = ( ( QObject* ) ( pLostChild ) ) ->queryList( "QWidget" );
00499 list->insert( 0, pLostChild );
00500 QObjectListIt it( *list );
00501 QObject* obj;
00502 while ( ( obj = it.current() ) != 0 )
00503 {
00504 QWidget * widg = ( QWidget* ) obj;
00505 ++it;
00506 widg->removeEventFilter( this );
00507 if ( m_firstFocusableChildWidget == widg )
00508 m_firstFocusableChildWidget = 0L;
00509
00510 if ( m_lastFocusableChildWidget == widg )
00511 m_lastFocusableChildWidget = 0L;
00512
00513 if ( m_focusedChildWidget == widg )
00514 m_focusedChildWidget = 0L;
00515 }
00516 delete list;
00517 }
00518 }
00519
00520
00521 bool KMdiChildView::eventFilter( QObject *obj, QEvent *e )
00522 {
00523 if ( e->type() == QEvent::KeyPress && isAttached() )
00524 {
00525 QKeyEvent* ke = ( QKeyEvent* ) e;
00526 if ( ke->key() == Qt::Key_Tab )
00527 {
00528 QWidget* w = ( QWidget* ) obj;
00529 FocusPolicy wfp = w->focusPolicy();
00530 if ( wfp == QWidget::StrongFocus || wfp == QWidget::TabFocus || w->focusPolicy() == QWidget::WheelFocus )
00531 {
00532 if ( m_lastFocusableChildWidget != 0 )
00533 {
00534 if ( w == m_lastFocusableChildWidget )
00535 {
00536 if ( w != m_firstFocusableChildWidget )
00537 m_firstFocusableChildWidget->setFocus();
00538 }
00539 }
00540 }
00541 }
00542 }
00543 else if ( e->type() == QEvent::FocusIn )
00544 {
00545 if ( obj->isWidgetType() )
00546 {
00547 QObjectList * list = queryList( "QWidget" );
00548 if ( list->find( obj ) != -1 )
00549 m_focusedChildWidget = ( QWidget* ) obj;
00550
00551 delete list;
00552 }
00553 if ( !isAttached() )
00554 {
00555 static bool m_bActivationIsPending = false;
00556 if ( !m_bActivationIsPending )
00557 {
00558 m_bActivationIsPending = true;
00559 activate();
00560 m_bActivationIsPending = false;
00561 }
00562 }
00563 }
00564 else if ( e->type() == QEvent::ChildRemoved )
00565 {
00566
00567
00568 QObject * pLostChild = ( ( QChildEvent* ) e ) ->child();
00569 if ( ( pLostChild != 0L ) && ( pLostChild->isWidgetType() ) )
00570 {
00571 QObjectList * list = pLostChild->queryList( "QWidget" );
00572 list->insert( 0, pLostChild );
00573 QObjectListIt it( *list );
00574 QObject * o;
00575 while ( ( o = it.current() ) != 0 )
00576 {
00577 QWidget * widg = ( QWidget* ) o;
00578 ++it;
00579 widg->removeEventFilter( this );
00580 FocusPolicy wfp = widg->focusPolicy();
00581 if ( wfp == QWidget::StrongFocus || wfp == QWidget::TabFocus || widg->focusPolicy() == QWidget::WheelFocus )
00582 {
00583 if ( m_firstFocusableChildWidget == widg )
00584 m_firstFocusableChildWidget = 0L;
00585
00586 if ( m_lastFocusableChildWidget == widg )
00587 m_lastFocusableChildWidget = 0L;
00588 }
00589 }
00590 delete list;
00591 }
00592 }
00593 else if ( e->type() == QEvent::ChildInserted )
00594 {
00595
00596
00597
00598 QObject * pNewChild = ( ( QChildEvent* ) e ) ->child();
00599 if ( ( pNewChild != 0L ) && ( pNewChild->isWidgetType() ) )
00600 {
00601 QWidget * pNewWidget = ( QWidget* ) pNewChild;
00602 if ( pNewWidget->testWFlags( Qt::WType_Dialog | Qt::WShowModal ) )
00603 return false;
00604 QObjectList *list = pNewWidget->queryList( "QWidget" );
00605 list->insert( 0, pNewChild );
00606 QObjectListIt it( *list );
00607 QObject * o;
00608 while ( ( o = it.current() ) != 0 )
00609 {
00610 QWidget * widg = ( QWidget* ) o;
00611 ++it;
00612 widg->installEventFilter( this );
00613 connect( widg, SIGNAL( destroyed() ), this, SLOT( slot_childDestroyed() ) );
00614 FocusPolicy wfp = widg->focusPolicy();
00615 if ( wfp == QWidget::StrongFocus || wfp == QWidget::TabFocus || widg->focusPolicy() == QWidget::WheelFocus )
00616 {
00617 if ( m_firstFocusableChildWidget == 0 )
00618 m_firstFocusableChildWidget = widg;
00619
00620 m_lastFocusableChildWidget = widg;
00621 }
00622 }
00623 delete list;
00624 }
00625 }
00626 else
00627 {
00628 if ( e->type() == QEvent::IconChange )
00629 {
00630
00631 if ( obj == this )
00632 iconUpdated( this, icon() ? ( *icon() ) : QPixmap() );
00633 else if ( obj == m_trackChanges )
00634 setIcon( m_trackChanges->icon() ? ( *( m_trackChanges->icon() ) ) : QPixmap() );
00635 }
00636 if ( e->type() == QEvent::CaptionChange )
00637 {
00638 if ( obj == this )
00639 captionUpdated( this, caption() );
00640 }
00641 }
00642
00643 return false;
00644 }
00645
00647 void KMdiChildView::removeEventFilterForAllChildren()
00648 {
00649 QObjectList* list = queryList( "QWidget" );
00650 QObjectListIt it( *list );
00651 QObject* obj;
00652 while ( ( obj = it.current() ) != 0 )
00653 {
00654 QWidget* widg = ( QWidget* ) obj;
00655 ++it;
00656 widg->removeEventFilter( this );
00657 }
00658 delete list;
00659 }
00660
00661 QWidget* KMdiChildView::focusedChildWidget()
00662 {
00663 return m_focusedChildWidget;
00664 }
00665
00666 void KMdiChildView::setFirstFocusableChildWidget( QWidget* firstFocusableChildWidget )
00667 {
00668 m_firstFocusableChildWidget = firstFocusableChildWidget;
00669 }
00670
00671 void KMdiChildView::setLastFocusableChildWidget( QWidget* lastFocusableChildWidget )
00672 {
00673 m_lastFocusableChildWidget = lastFocusableChildWidget;
00674 }
00675
00677 void KMdiChildView::setTabCaption ( const QString& stbCaption )
00678 {
00679 m_sTabCaption = stbCaption;
00680 emit tabCaptionChanged( m_sTabCaption );
00681 }
00682
00683 void KMdiChildView::setMDICaption ( const QString& caption )
00684 {
00685 setCaption( caption );
00686 setTabCaption( caption );
00687 }
00688
00690 void KMdiChildView::setWindowMenuID( int id )
00691 {
00692 m_windowMenuID = id;
00693 }
00694
00695
00696
00698 void KMdiChildView::slot_clickedInWindowMenu()
00699 {
00700 updateTimeStamp();
00701 emit clickedInWindowMenu( m_windowMenuID );
00702 }
00703
00704
00705
00707 void KMdiChildView::slot_clickedInDockMenu()
00708 {
00709 emit clickedInDockMenu( m_windowMenuID );
00710 }
00711
00712
00713
00714 void KMdiChildView::setMinimumSize( int minw, int minh )
00715 {
00716 QWidget::setMinimumSize( minw, minh );
00717 if ( mdiParent() && mdiParent()->state() != KMdiChildFrm::Minimized )
00718 {
00719 mdiParent() ->setMinimumSize( minw + KMDI_CHILDFRM_DOUBLE_BORDER,
00720 minh + KMDI_CHILDFRM_DOUBLE_BORDER + KMDI_CHILDFRM_SEPARATOR + mdiParent() ->captionHeight() );
00721 }
00722 }
00723
00724
00725
00726 void KMdiChildView::setMaximumSize( int maxw, int maxh )
00727 {
00728 if ( mdiParent() && mdiParent()->state() == KMdiChildFrm::Normal )
00729 {
00730 int w = maxw + KMDI_CHILDFRM_DOUBLE_BORDER;
00731 if ( w > QWIDGETSIZE_MAX )
00732 w = QWIDGETSIZE_MAX;
00733
00734 int h = maxh + KMDI_CHILDFRM_DOUBLE_BORDER + KMDI_CHILDFRM_SEPARATOR + mdiParent() ->captionHeight();
00735 if ( h > QWIDGETSIZE_MAX )
00736 h = QWIDGETSIZE_MAX;
00737
00738 mdiParent()->setMaximumSize( w, h );
00739 }
00740 QWidget::setMaximumSize( maxw, maxh );
00741 }
00742
00743
00744
00745 void KMdiChildView::show()
00746 {
00747 if ( mdiParent() )
00748 mdiParent()->show();
00749
00750 QWidget::show();
00751 }
00752
00753
00754
00755 void KMdiChildView::hide()
00756 {
00757 if ( mdiParent() )
00758 mdiParent()->hide();
00759
00760 QWidget::hide();
00761 }
00762
00763
00764
00765 void KMdiChildView::raise()
00766 {
00767 if ( mdiParent() )
00768 mdiParent()->raise();
00769
00770 QWidget::raise();
00771 }
00772
00773