From 786f9e6c240b7791c30d6299e23878ca32222b61 Mon Sep 17 00:00:00 2001 From: vsr Date: Thu, 10 May 2007 10:23:17 +0000 Subject: [PATCH] Porting to Qt4 --- src/Qtx/QtxDockAction.cxx | 1274 ++++--------------------------------- src/Qtx/QtxDockAction.h | 134 +--- 2 files changed, 139 insertions(+), 1269 deletions(-) diff --git a/src/Qtx/QtxDockAction.cxx b/src/Qtx/QtxDockAction.cxx index 1b25e280a..d2fdb1616 100755 --- a/src/Qtx/QtxDockAction.cxx +++ b/src/Qtx/QtxDockAction.cxx @@ -21,739 +21,150 @@ #include "QtxDockAction.h" -#include "QtxResourceMgr.h" - -#include -#include -#include -#include -#include -#include -#include - -/*! - Name: QtxDockAction [public] - Desc: Constructs an Dock action with given main window and name. -*/ - -QtxDockAction::QtxDockAction( QMainWindow* mw, const char* name ) -: QtxAction( "Windows and Toolbars", "Windows and Toolbars", 0, mw, name ), -myMain( mw ), -myAutoAdd( true ), -mySeparate( true ), -myAutoPlace( false ) -{ - initialize( mw ); -} - -/*! - Name: QtxDockAction [public] - Desc: This constructor creates an action with the following properties: the - description text, the menu text and. It is a child of given main window - and named specified name. -*/ - -QtxDockAction::QtxDockAction( const QString& text, const QString& menuText, QMainWindow* mw, const char* name ) -: QtxAction( text, menuText, 0, mw, name ), -myMain( mw ), -myAutoAdd( true ), -mySeparate( true ), -myAutoPlace( false ) -{ - initialize( mw ); -} - -/*! - Name: QtxDockAction [public] - Desc: This constructor creates an action with the following properties: the - description text, the menu text, the icon or iconset icon and keyboard - accelerator. It is a child of given main window and named specified name. -*/ - -QtxDockAction::QtxDockAction( const QString& text, const QIconSet& icon, const QString& menuText, QMainWindow* mw, const char* name ) -: QtxAction( text, icon, menuText, 0, mw, name ), -myMain( mw ), -myAutoAdd( true ), -mySeparate( true ), -myAutoPlace( false ) -{ - initialize( mw ); -} - -/*! - Name: ~QtxDockAction [public] - Desc: Removes all added popup items. -*/ - -QtxDockAction::~QtxDockAction() -{ - for ( MenuMap::ConstIterator mIt = myMenu.begin(); mIt != myMenu.end(); ++mIt ) - removeFrom( mIt.key() ); - - for ( InfoMap::ConstIterator iIt = myInfo.begin(); iIt != myInfo.end(); ++iIt ) - delete iIt.data().a; -} - -/*! - Name: mainWindow [public] - Desc: Returns the main window which contains managed dock windows. -*/ - -QMainWindow* QtxDockAction::mainWindow() const -{ - return myMain; -} - -/*! - Name: isAutoAdd [public] - Desc: Returns the auto add property. If this property is setted then all newly - appeared dock windows will be automatically added. -*/ - -bool QtxDockAction::isAutoAdd() const -{ - return myAutoAdd; -} - -/*! - Name: setAutoAdd [public] - Desc: Sets the auto add property. If this property is setted then all newly - appeared dock windows will be automatically added. -*/ - -void QtxDockAction::setAutoAdd( const bool on ) -{ - myAutoAdd = on; -} - -/*! - Name: isAutoPlace [public] - Desc: Returns the auto place property. If this property is setted then all newly - added dock windows will be automatically placed according stored place information. -*/ - -bool QtxDockAction::isAutoPlace() const -{ - return myAutoPlace; -} - -/*! - Name: setAutoPlace [public] - Desc: Sets the auto place property. If this property is setted then all newly - added dock windows will be automatically placed according stored place - information. -*/ - -void QtxDockAction::setAutoPlace( const bool on ) -{ - myAutoPlace = on; -} - -/*! - Name: isSeparate [public] - Desc: Returns the 'separate' property. -*/ - -bool QtxDockAction::isSeparate() const -{ - return mySeparate; -} - -/*! - Name: setSeparate [public] - Desc: Sets the 'separate' property. If this property is 'true' then toolbars and - dock windows menu items will be placed in different popup menus otherwise - their will be placed in one common popup menu. This property will be - affected in next method 'addTo'. -*/ - -void QtxDockAction::setSeparate( const bool on ) -{ - if ( mySeparate == on ) - return; - - mySeparate = on; - updateMenus(); -} - -/*! - Name: addTo [public] - Desc: Add the dock windows sub menu item to the end of specified popup. -*/ - -bool QtxDockAction::addTo( QWidget* wid ) -{ - return addTo( wid, -1 ); -} - -/*! - Name: addTo [public] - Desc: Add the dock windows sub menu item to specified popup at the given index. -*/ - -bool QtxDockAction::addTo( QWidget* wid, const int idx ) -{ - if ( !wid || !wid->inherits( "QPopupMenu" ) ) - return false; - - QPopupMenu* pm = (QPopupMenu*)wid; - checkPopup( pm ); - - if ( myMenu.contains( pm ) ) - return false; - - MenuInfo mInfo; - mInfo.dock = new QPopupMenu( pm ); - mInfo.tool = isSeparate() ? new QPopupMenu( pm ) : 0; - - QString dock, tool; - splitMenuText( dock, tool ); - - myMenu.insert( pm, mInfo ); - - int index = idx; - - if ( mInfo.dock ) - iconSet().isNull() ? pm->insertItem ( dock, mInfo.dock, -1, index ) : - pm->insertItem ( iconSet(), dock, mInfo.dock, -1, index ); - - if ( index >= 0 ) - index++; - - if ( mInfo.tool ) - iconSet().isNull() ? pm->insertItem ( tool, mInfo.tool, -1, index ) : - pm->insertItem ( iconSet(), tool, mInfo.tool, -1, index ); - - connect( pm, SIGNAL( aboutToShow() ), this, SLOT( onAboutToShow() ) ); - connect( pm, SIGNAL( destroyed( QObject* ) ), this, SLOT( onPopupDestroyed( QObject* ) ) ); - - return true; -} +#include +#include +#include +#include /*! - Name: removeFrom [public] - Desc: Removes dock window sub menu from specified popup. -*/ - -bool QtxDockAction::removeFrom( QWidget* wid ) -{ - QPopupMenu* pm = (QPopupMenu*)wid; - - if ( myMenu.contains( pm ) ) - { - pm->removeItem( findId( pm, myMenu[pm].dock ) ); - pm->removeItem( findId( pm, myMenu[pm].tool ) ); - - delete myMenu[pm].dock; - delete myMenu[pm].tool; - myMenu.remove( pm ); + \class QtxDockAction + \brief Dockable windows & toolbars list action. - disconnect( pm, SIGNAL( aboutToShow() ), this, SLOT( onAboutToShow() ) ); - disconnect( pm, SIGNAL( destroyed( QObject* ) ), this, SLOT( onPopupDestroyed( QObject* ) ) ); - } - - return QtxAction::removeFrom( wid ); -} - -/*! - Sets menu text of action - \param txt - new menu text + Implements the action which provides the popup menu with the list + of toolbars and/or dockable windows list owned by the main window. + This action can be used, for example, in the menu "Windows". */ -void QtxDockAction::setMenuText( const QString& txt ) -{ - if ( menuText() == txt ) - return; - - QtxAction::setMenuText( txt ); - updateMenus(); -} /*! - Name: addDockWindow [public] - Desc: Add dock window to internal data structures. Action will be include all added - dock windows in to menu and manage their place configuration. + \brief Constructor. + \param mw parent main window */ - -bool QtxDockAction::addDockWindow( QDockWindow* dw ) +QtxDockAction::QtxDockAction( QMainWindow* mw ) +: QtxAction( "Windows and Toolbars", "Windows and Toolbars", 0, mw ), + myType( Both ), + myMain( mw ) { - if ( !dw || !mainWindow() ) - return false; - - if ( myInfo.contains( dw ) ) - return false; - - myInfo.insert( dw, DockInfo() ); - - DockInfo& inf = myInfo[dw]; - inf.name = windowName( dw ); - QAction* a = inf.a = new QAction( mainWindow(), 0, true ); - - autoLoadPlaceInfo( dw ); - - bool block = a->signalsBlocked(); - a->blockSignals( true ); - a->setOn( dw->isVisibleTo( mainWindow() ) ); - a->blockSignals( block ); - - updateInfo( dw ); - savePlaceInfo( dw ); - - dw->installEventFilter( this ); - - connect( a, SIGNAL( toggled( bool ) ), this, SLOT( onToggled( bool ) ) ); - connect( dw, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWindowDestroyed( QObject* ) ) ); - connect( dw, SIGNAL( visibilityChanged( bool ) ), this, SLOT( onVisibilityChanged( bool ) ) ); - - return true; + initialize(); } /*! - Name: removeDockWindow [public] - Desc: Remove dock window from internal data structures. Action will not manage this window. + \brief Constructor. + \param text description (tooltip) text + \param menuText menu text + \param mw parent main window */ - -bool QtxDockAction::removeDockWindow( QDockWindow* dw ) +QtxDockAction::QtxDockAction( const QString& text, const QString& menuText, QMainWindow* mw ) +: QtxAction( text, menuText, 0, mw ), + myType( Both ), + myMain( mw ) { - if ( !myInfo.contains( dw ) ) - return false; - - myGeom.remove( myInfo[dw].name ); - - delete myInfo[dw].a; - myInfo.remove( dw ); - - dw->removeEventFilter( this ); - - disconnect( dw, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWindowDestroyed( QObject* ) ) ); - disconnect( dw, SIGNAL( visibilityChanged( bool ) ), this, SLOT( onVisibilityChanged( bool ) ) ); - - return true; + initialize(); } /*! - Name: eventFilter [public] - Desc: Event filter process caption and icon changing of managed dock windows - and try to add newly appeared dock windows. + \brief Constructor. + \param text description (tooltip) text + \param icon action icon + \param menuText menu text + \param mw parent main window */ - -bool QtxDockAction::eventFilter( QObject* o, QEvent* e ) +QtxDockAction::QtxDockAction( const QString& text, const QIcon& icon, const QString& menuText, QMainWindow* mw ) +: QtxAction( text, icon, menuText, 0, mw ), + myType( Both ), + myMain( mw ) { - if ( o->inherits( "QDockWindow" ) && ( e->type() == QEvent::CaptionChange || - e->type() == QEvent::IconChange ) ) - updateInfo( (QDockWindow*)o ); - - if ( o->inherits( "QDockArea" ) && e->type() == QEvent::ChildRemoved ) - { - QChildEvent* ce = (QChildEvent*)e; - if ( ce->child() && ce->child()->inherits( "QDockWindow" ) ) - savePlaceInfo( (QDockWindow*)ce->child() ); - } - - if ( o->inherits( "QDockArea" ) && e->type() == QEvent::ChildInserted ) - { - QChildEvent* ce = (QChildEvent*)e; - if ( ce->child() && ce->child()->inherits( "QDockWindow" ) ) - QApplication::postEvent( this, new QCustomEvent( (QEvent::Type)AutoAdd, ce->child() ) ); - } - - return false; + initialize(); } /*! - Name: restoreGeometry [public] - Desc: Retrieve the dock window geometry. If dock window specified as 0 - then all windows geometry will be restored. + \brief Desctructor + + Does nothing currently. */ - -void QtxDockAction::restoreGeometry( QDockWindow* dw ) const +QtxDockAction::~QtxDockAction() { - if ( !dw ) - loadPlaceInfo(); - else - loadPlaceInfo( dw ); } /*! - Name: storeGeometry [public] - Desc: Store the dock window geometry. If dock window specified as 0 - then all windows geometry will be stored. + \brief Get parent main window. + \return main window pointer. */ - -void QtxDockAction::storeGeometry( QDockWindow* dw ) +QMainWindow* QtxDockAction::mainWindow() const { - QPtrList dwList; - - if ( dw ) - dwList.append( dw ); - else - dockWindows( dwList ); - - for ( QPtrListIterator it( dwList ); it.current(); ++it ) - savePlaceInfo( it.current() ); + return myMain; } /*! - Name: loadGeometry [public] - Desc: Retrieve the dock windows geometry information from the specified resource manager section. + \brief Get dock action type. + \return dock type (QtxDockAction::DockType) */ - -void QtxDockAction::loadGeometry( QtxResourceMgr* resMgr, const QString& section, const bool clear ) +int QtxDockAction::dockType() const { - QString sec = section.stripWhiteSpace(); - if ( !resMgr || sec.isEmpty() ) - return; - - myNames = QStringList::split( "|", resMgr->stringValue( sec, "windows_list", QString::null ) ); - - QMap map; - QStringList params = resMgr->parameters( sec ); - for ( QStringList::const_iterator it = params.begin(); it != params.end(); ++it ) - { - QString p = QStringList::split( ".", *it, true ).first().stripWhiteSpace(); - if ( !p.isEmpty() ) - map.insert( p, 0 ); - } - - for ( QMap::ConstIterator itr = map.begin(); itr != map.end(); ++itr ) - { - GeomInfo inf; - if ( !clear && myGeom.contains( itr.key() ) ) - inf = myGeom[itr.key()]; - else - { - inf.vis = true; inf.newLine = false; inf.place = DockTop; - inf.index = 0; inf.offset = 0; - inf.x = 0; inf.y = 0; inf.w = 0; inf.h = 0; - inf.fixW = -1; inf.fixH = -1; - } - if ( loadGeometry( resMgr, sec, itr.key(), inf ) ) - myGeom.insert( itr.key(), inf ); - } + return myType; } /*! - Name: saveGeometry [public] - Desc: Store the dock windows geometry information into the specified resource manager section. + \brief Set dock action type. + \param type dock type (QtxDockAction::DockType) */ - -void QtxDockAction::saveGeometry( QtxResourceMgr* resMgr, const QString& section, const bool clear ) const +void QtxDockAction::setDockType( const int type ) { - QString sec = section.stripWhiteSpace(); - if ( !resMgr || sec.isEmpty() ) - return; - - QtxDockAction* that = (QtxDockAction*)this; - that->storeGeometry(); - - that->myNames.clear(); - collectNames( Minimized, that->myNames ); - for ( int i = DockTornOff; i < Minimized; i++ ) - collectNames( i, that->myNames ); - - if ( clear ) - resMgr->remove( sec ); - - resMgr->setValue( sec, "windows_list", myNames.join( "|" ) ); - - for ( GeomMap::ConstIterator it = myGeom.begin(); it != myGeom.end(); ++it ) - saveGeometry( resMgr, sec, it.key(), it.data() ); + myType = type; } /*! - Name: onAboutToShow [private slots] - Desc: Prepare sub popup with dock windows list when parent popup is shown. + \brief Prepare popup menu with dock windows list when + parent popup menu is shown. */ - void QtxDockAction::onAboutToShow() { - const QObject* obj = sender(); - if ( obj && obj->inherits( "QPopupMenu" ) ) - { - QPopupMenu* pm = (QPopupMenu*)obj; - fillPopup( pm ); - pm->setItemEnabled( findId( pm, myMenu[pm].dock ), isEnabled() && myMenu[pm].dock && myMenu[pm].dock->count() ); - pm->setItemEnabled( findId( pm, myMenu[pm].tool ), isEnabled() && myMenu[pm].tool && myMenu[pm].tool->count() ); - } -} - -/*! - Name: onToggled [private slots] - Desc: Show or hide dock window when user toggled window item in popup. -*/ - -void QtxDockAction::onToggled( bool on ) -{ - QDockWindow* dw = dockWindow( (QAction*)sender() ); - if ( dw ) - on ? dw->show() : dw->hide(); -} - -/*! - Name: onPopupDestroyed [private slots] - Desc: Remove destroyed popup from data structures. -*/ - -void QtxDockAction::onPopupDestroyed( QObject* obj ) -{ - myMenu.remove( (QPopupMenu*)obj ); -} - -/*! - Name: onWindowDestroyed [private slots] - Desc: Remove information about destroyed dock window. -*/ - -void QtxDockAction::onWindowDestroyed( QObject* obj ) -{ - QDockWindow* dw = (QDockWindow*)obj; - if ( !myInfo.contains( dw ) ) - return; - - delete myInfo[dw].a; - myInfo.remove( dw ); -} - -/*! - Name: onVisibilityChanged [private slots] - Desc: Toggle corresponded action when visibility state of dock window changed. -*/ - -void QtxDockAction::onVisibilityChanged( bool on ) -{ - const QObject* obj = sender(); - if ( !obj || !obj->inherits( "QDockWindow" ) ) - return; - - QDockWindow* dw = (QDockWindow*)obj; - - QAction* a = action( dw ); - if ( a && a->isOn() != on ) - { - bool block = a->signalsBlocked(); - a->blockSignals( true ); - a->setOn( on ); - a->blockSignals( block ); - } - - savePlaceInfo( dw ); -} - -/*! - Name: onDockWindowPositionChanged [private slots] - Desc: Update dock window place information -*/ - -void QtxDockAction::onDockWindowPositionChanged( QDockWindow* dw ) -{ - savePlaceInfo( dw ); -} - -/*! - Name: event [protected] - Desc: Check consistency the popup content and internal datas. - Synchronize internal data structures with popup content. -*/ - -bool QtxDockAction::event( QEvent* e ) -{ - if ( e->type() == (int)AutoAdd ) - { - QCustomEvent* ce = (QCustomEvent*)e; - QDockWindow* dw = (QDockWindow*)ce->data(); - if ( !myInfo.contains( dw ) ) - { - autoAddDockWindow( dw ); - autoLoadPlaceInfo( dw ); - } - } - - return QtxAction::event( e ); + updateMenu(); + setVisible( menu() && !menu()->isEmpty() ); } /*! - Name: checkPopup [private] - Desc: Check consistency the popup content and internal datas. - Synchronize internal data structures with popup content. + \brief Get all toolbars owned by parent main window. + \param lst returned list of all toolbars owned by main window */ - -void QtxDockAction::checkPopup( QPopupMenu* pm ) +void QtxDockAction::toolBars( QList& lst ) const { - if ( !myMenu.contains( pm ) ) - return; - - int id = findId( pm, myMenu[pm].dock ); - if ( id == -1 ) - { - delete myMenu[pm].dock; - myMenu[pm].dock = 0; - } - id = findId( pm, myMenu[pm].tool ); - if ( id == -1 ) - { - delete myMenu[pm].tool; - myMenu[pm].tool = 0; - } - - if ( !myMenu[pm].dock ) - { - delete myMenu[pm].tool; - myMenu.remove( pm ); - disconnect( pm, SIGNAL( destroyed( QObject* ) ), this, SLOT( onDestroyed( QObject* ) ) ); - } -} - -/*! - Name: fillPopup [private] - Desc: Clear the popup and the add to it required actions. -*/ - -void QtxDockAction::fillPopup( QPopupMenu* pm ) const -{ - if ( !pm || !mainWindow() ) - return; - - if ( !myMenu.contains( pm ) ) - return; - - QPopupMenu* dockMenu = myMenu[pm].dock; - QPopupMenu* toolMenu = myMenu[pm].tool; - - for ( InfoMap::ConstIterator mit = myInfo.begin(); mit != myInfo.end(); ++mit ) - { - mit.data().a->removeFrom( dockMenu ); - mit.data().a->removeFrom( toolMenu ); - } - - if ( dockMenu ) - dockMenu->clear(); - - if ( toolMenu ) - toolMenu->clear(); - - QPtrList dockList; - dockWindows( dockList, mainWindow() ); + lst.clear(); - if ( dockList.isEmpty() ) + QMainWindow* mw = mainWindow(); + if ( !mw ) return; - QPtrList toolBars, windows; - for ( QPtrListIterator it( dockList ); it.current(); ++it ) - { - if ( !myInfo.contains( it.current() ) ) - { - QtxDockAction* that = (QtxDockAction*)this; - that->autoAddDockWindow( it.current() ); - } - - if ( !mainWindow()->appropriate( it.current() ) || - it.current()->caption().isEmpty() || !action( it.current() ) ) - continue; - - if ( isToolBar( it.current() ) ) - toolBars.append( action( it.current() ) ); - else - windows.append( action( it.current() ) ); - } - - for ( QPtrListIterator wit( windows ); wit.current(); ++wit ) - wit.current()->addTo( dockMenu ); - - dockMenu->insertSeparator(); - - for ( QPtrListIterator tit( toolBars ); tit.current(); ++tit ) - tit.current()->addTo( toolMenu ? toolMenu : dockMenu ); - - Qtx::simplifySeparators( dockMenu ); - Qtx::simplifySeparators( toolMenu ); -} - -/*! - Name: isToolBar [private] - Desc: Returns 'true' if dock window is a toolbar. -*/ - -bool QtxDockAction::isToolBar( QDockWindow* dw ) const -{ - return dw && dw->inherits( "QToolBar" ); -} - -/*! - Name: findId [private] - Desc: Returns identificator of popup item which contains sub popup 'pm' in the popup 'cont'. -*/ - -int QtxDockAction::findId( QPopupMenu* cont, QPopupMenu* pm ) const -{ - if ( !cont || !pm ) - return -1; - - int id = -1; - - for ( int i = 0; i < (int)cont->count() && id == -1; i++ ) + QList toolbars = qFindChildren( mw ); + for ( QList::iterator it = toolbars.begin(); it != toolbars.end(); ++it ) { - QMenuData* md = 0; - QMenuItem* item = cont->findItem( cont->idAt( i ), &md ); - if ( item && md == cont && item->popup() == pm ) - id = item->id(); + QToolBar* tb = *it; + if ( tb->parentWidget() == mw ) + lst.append( tb ); } - return id; } /*! - Name: dockWindows [private] - Desc: Returns all dock windows of the main window. + \brief Get all dockable windows owned by parent main window. + \param lst returned list of all dockable windows owned by main window */ - -void QtxDockAction::dockWindows( QPtrList& lst, QMainWindow* main ) const +void QtxDockAction::dockWidgets( QList& lst ) const { lst.clear(); - QMainWindow* mw = main ? main : mainWindow(); + QMainWindow* mw = mainWindow(); if ( !mw ) return; - QObjectList* objs = mw->queryList( "QDockWindow" ); - if ( objs ) + QList dockwidgets = qFindChildren( mw ); + for ( QList::iterator it = dockwidgets.begin(); it != dockwidgets.end(); ++it ) { - for ( QObjectListIt it( *objs ); it.current(); ++it ) - { - QDockWindow* dockWin = ::qt_cast( it.current() ); - if ( dockWin && dockMainWindow( mw, dockWin ) ) - lst.append( dockWin ); - } + QDockWidget* dw = *it; + if ( dw->parentWidget() == mw ) + lst.append( dw ); } - delete objs; } -/*! - \return true if main window is parent of object - \param mw - main window - \param win - object -*/ -bool QtxDockAction::dockMainWindow( QMainWindow* mw, QObject* win ) const -{ - if ( !mw || !win ) - return false; - - while ( win ) - { - if ( win->parent() && win->parent() == mw ) - return true; - - if ( ::qt_cast( win->parent() ) ) - return false; - - win = win->parent(); - } - - return false; -} - -/*! - Name: updateInfo [private] - Desc: Updates icon and caption info of dock window in the corresponded action. -*/ - +/* void QtxDockAction::updateInfo( QDockWindow* dw ) { QAction* a = action( dw ); @@ -772,533 +183,72 @@ void QtxDockAction::updateInfo( QDockWindow* dw ) if ( icon ) a->setIconSet( *icon ); } - -/*! - Name: savePlaceInfo [private] - Desc: Store the place and geometry information from specified dock window. -*/ - -void QtxDockAction::savePlaceInfo( QDockWindow* dw ) -{ - if ( !myInfo.contains( dw ) ) - return; - - if ( !myGeom.contains( myInfo[dw].name ) ) - myGeom.insert( myInfo[dw].name, GeomInfo() ); - - GeomInfo& inf = myGeom[myInfo[dw].name]; - - Dock dock; - inf.vis = dw->isVisibleTo( mainWindow() ); - mainWindow()->getLocation( dw, dock, inf.index, inf.newLine, inf.offset ); - - inf.place = dock; - inf.x = dw->x(); - inf.y = dw->y(); - inf.w = dw->width(); - inf.h = dw->height(); - inf.fixW = dw->fixedExtent().width(); - inf.fixH = dw->fixedExtent().height(); -} - -/*! - Name: loadPlaceInfo [private] - Desc: Retrieve the stored place and geometry information to specified dock window. -*/ - -void QtxDockAction::loadPlaceInfo( QDockWindow* dw ) const -{ - if ( !myInfo.contains( dw ) ) - return; - - QMainWindow* mw = mainWindow(); - if ( !mw ) - return; - - QObject* p = dw->parent(); - if ( !( !p || p == mw || ( p->parent() && p->parent() == mw ) ) ) - return; - - QString winName = myInfo[dw].name; - if ( winName.isEmpty() || !myGeom.contains( winName ) ) - return; - - GeomInfo inf = myGeom[myInfo[dw].name]; - - mainWindow()->moveDockWindow( dw, (Qt::Dock)inf.place, inf.newLine, inf.index, inf.offset ); - dw->setGeometry( inf.x, inf.y, inf.w, inf.h ); - - dw->setFixedExtentWidth( inf.fixW ); - dw->setFixedExtentHeight( inf.fixH ); - - QtxDockAction* that = (QtxDockAction*)this; - that->myGeom.insert( myInfo[dw].name, inf ); -} - -/*! - Name: loadPlaceInfo [private] - Desc: Retrieve the stored place and geometry information to all dock windows. -*/ - -void QtxDockAction::loadPlaceInfo() const -{ - QMainWindow* mw = mainWindow(); - if ( !mw ) - return; - - typedef QPtrList DockWinList; - - DockWinList lst; - dockWindows( lst, mw ); - - QMap nameMap; - for ( QPtrListIterator itr( lst ); itr.current(); ++itr ) - { - QObject* p = itr.current()->parent(); - if ( !( !p || p == mw || ( p->parent() && p->parent() == mw ) ) ) - continue; - - QString name; - if ( myInfo.contains( itr.current() ) ) - name = myInfo[itr.current()].name; - - if ( !myGeom.contains( name ) ) - continue; - - nameMap.insert( name, itr.current() ); - } - - DockWinList winList; - for ( QStringList::const_iterator iter = myNames.begin(); iter != myNames.end(); ++iter ) - { - if ( nameMap.contains( *iter ) ) - winList.append( nameMap[*iter] ); - nameMap.remove( *iter ); - } - - for ( QMap::ConstIterator mIt = nameMap.begin(); mIt != nameMap.end(); ++mIt ) - winList.append( mIt.data() ); - - QMap winMap; - QMap geomMap; - - for ( QPtrListIterator it( winList ); it.current(); ++it ) - { - QString name; - if ( myInfo.contains( it.current() ) ) - name = myInfo[it.current()].name; - - if ( !myGeom.contains( name ) ) - continue; - - //! collect pointer of info to have fresh info data after processEvents(); - GeomInfo* inf = (GeomInfo*)&( myGeom[name] ); - geomMap.insert( it.current(), inf ); - if ( !winMap.contains( inf->place ) ) - winMap.insert( inf->place, DockWinList() ); - winMap[inf->place].append( it.current() ); - } - - loadPlaceArea( DockMinimized, mw, 0, - winMap.contains( DockMinimized ) ? winMap[DockMinimized] : DockWinList(), geomMap ); - for ( int i = DockTornOff; i < DockMinimized; i++ ) - { - loadPlaceArea( i, mw, dockArea( i ), winMap.contains( i ) ? winMap[i] : DockWinList(), geomMap ); - } -} - -/*! - Name: loadPlaceArea [private] - Desc: Set the place and geometry information to all dock windows in the area. -*/ - -void QtxDockAction::loadPlaceArea( const int place, QMainWindow* mw, QDockArea* area, - const QPtrList& dockList, - const QMap& geomMap ) const -{ - for ( QPtrListIterator it( dockList ); it.current(); ++it ) - { - if ( !geomMap.contains( it.current() ) ) - continue; - - GeomInfo* inf = geomMap[it.current()]; - mw->moveDockWindow( it.current(), (Qt::Dock)place, inf->newLine, inf->index, inf->offset ); - } - - if ( !area ) - return; - - qApp->processEvents(); - - for ( QPtrListIterator itr( dockList ); itr.current(); ++itr ) - { - QDockWindow* dw = itr.current(); - if ( !geomMap.contains( dw ) ) - continue; - - GeomInfo* inf = geomMap[dw]; - if ( place != DockTornOff ) - { - dw->setNewLine( inf->newLine ); - dw->setOffset( inf->offset ); - dw->setFixedExtentWidth( inf->fixW ); - dw->setFixedExtentHeight( inf->fixH ); - } - dw->setGeometry( inf->x, inf->y, inf->w, inf->h ); - - QAction* a = action( dw ); - if ( a ) - { - bool block = a->signalsBlocked(); - a->blockSignals( true ); - a->setOn( inf->vis ); - a->blockSignals( block ); - } - - if ( mainWindow() && mainWindow()->appropriate( dw ) ) - inf->vis ? dw->show() : dw->hide(); - } - - QWidget* wid = area; - if ( wid->layout() ) - { - wid->layout()->invalidate(); - wid->layout()->activate(); - } -} - -/*! - Name: action [private] - Desc: Returns action for the given dock window. */ -QAction* QtxDockAction::action( QDockWindow* dw ) const -{ - QAction* a = 0; - if ( myInfo.contains( dw ) ) - a = myInfo[dw].a; - return a; -} - /*! - Name: dockWindow [private] - Desc: Returns dock window for the given action. -*/ - -QDockWindow* QtxDockAction::dockWindow( const QAction* a ) const -{ - QDockWindow* dw = 0; - for ( InfoMap::ConstIterator it = myInfo.begin(); it != myInfo.end() && !dw; ++it ) - { - if ( it.data().a == a ) - dw = it.key(); - } - return dw; -} + \brief Customize action adding to the widget operation. + + Called when the action is added to the widget. + Reimplemented from QtxAction class. -/*! - Name: initialize [private] - Desc: Initialisation of the object. Sets the event filters and add existing dock windows. + \param w widget this action is added to (menu or toolbar) */ - -void QtxDockAction::initialize( QMainWindow* mw ) +void QtxDockAction::addedTo( QWidget* w ) { - if ( !mw ) - return; - - QPtrList lst; - dockWindows( lst, mw ); - - for ( QPtrListIterator it( lst ); it.current(); ++it ) - QApplication::postEvent( this, new QCustomEvent( (QEvent::Type)AutoAdd, it.current() ) ); - - if ( mw->topDock() ) - mw->topDock()->installEventFilter( this ); - if ( mw->leftDock() ) - mw->leftDock()->installEventFilter( this ); - if ( mw->rightDock() ) - mw->rightDock()->installEventFilter( this ); - if ( mw->bottomDock() ) - mw->bottomDock()->installEventFilter( this ); - - connect( mw, SIGNAL( dockWindowPositionChanged( QDockWindow* ) ), - this, SLOT( onDockWindowPositionChanged( QDockWindow* ) ) ); + if ( w->inherits( "QMenu" ) ) + connect( w, SIGNAL( aboutToShow() ), this, SLOT( onAboutToShow() ) ); } /*! - Name: windowName [private] - Desc: Generate the dock window name. -*/ - -QString QtxDockAction::windowName( QDockWindow* dw ) const -{ - QString name; + \brief Customize action removing from the widget operation. + + Called when the action is removed from the widget. + Reimplemented from QtxAction class. - if ( dw ) - { - name = dw->name( "" ); - if ( name.isEmpty() ) - name = dw->caption(); - } - - return name; -} - -/*! - Name: autoAddDockWindow [private] - Desc: Add the dock window if auto add property is setted. + \param w widget this action is removed from to (menu or toolbar) */ - -bool QtxDockAction::autoAddDockWindow( QDockWindow* dw ) +void QtxDockAction::removedFrom( QWidget* w ) { - if ( !isAutoAdd() ) - return false; - - return addDockWindow( dw ); + if ( w->inherits( "QMenu" ) ) + disconnect( w, SIGNAL( aboutToShow() ), this, SLOT( onAboutToShow() ) ); } /*! - Name: autoLoadPlaceInfo [private] - Desc: Retieve the dock window place geometry if auto place property is setted. + \brief Initialize the action. */ - -void QtxDockAction::autoLoadPlaceInfo( QDockWindow* dw ) +void QtxDockAction::initialize() { - if ( isAutoPlace() ) - loadPlaceInfo( dw ); + setMenu( new QMenu( 0 ) ); } /*! - Name: splitMenuText [private] - Desc: + \brief Update action child popup menu. */ - -void QtxDockAction::splitMenuText( QString& dock, QString& tool ) const +void QtxDockAction::updateMenu() { - dock = tool = menuText(); - if ( !isSeparate() ) + QMenu* pm = menu(); + if ( !pm ) return; - QStringList lst = splitText( menuText(), "|" ); - if ( lst.count() < 2 ) - lst = splitText( menuText(), "and" ); - - dock = lst.first(); - tool = lst.last(); -} - -/*! - Name: splitText [private] - Desc: -*/ - -QStringList QtxDockAction::splitText( const QString& str, const QString& sep ) const -{ - QStringList res; - - int idx = str.lower().find( sep.lower() ); - if ( idx != -1 ) - { - res.append( str.mid( 0, idx ).stripWhiteSpace() ); - res.append( str.mid( idx + sep.length() ).stripWhiteSpace() ); - } - - return res; -} - -/*! - Name: dockPlace [private] - Desc: -*/ - -int QtxDockAction::dockPlace( const QString& dockName ) const -{ - static QMap dockNameMap; - if ( dockNameMap.isEmpty() ) - { - dockNameMap["top"] = DockTop; - dockNameMap["bottom"] = DockBottom; - dockNameMap["left"] = DockLeft; - dockNameMap["right"] = DockRight; - dockNameMap["tornoff"] = DockTornOff; - dockNameMap["torn_off"] = DockTornOff; - dockNameMap["outside"] = DockTornOff; - dockNameMap["undock"] = DockTornOff; - dockNameMap["minimized"] = DockMinimized; - dockNameMap["unmanaged"] = DockUnmanaged; - } - - int res = -1; - if ( dockNameMap.contains( dockName.lower() ) ) - res = dockNameMap[dockName.lower()]; - return res; -} + pm->clear(); -/*! - Name: dockArea [private] - Desc: -*/ - -QDockArea* QtxDockAction::dockArea( const int place ) const -{ - if ( !mainWindow() ) - return 0; - - QDockArea* area = 0; - switch ( place ) + if ( dockType() == DockWidget || dockType() == Both ) { - case DockTop: - area = mainWindow()->topDock(); - break; - case DockBottom: - area = mainWindow()->bottomDock(); - break; - case DockLeft: - area = mainWindow()->leftDock(); - break; - case DockRight: - area = mainWindow()->rightDock(); - break; + QList dwList; + dockWidgets( dwList ); + for ( QList::iterator it = dwList.begin(); it != dwList.end(); ++it ) + pm->addAction( (*it)->toggleViewAction() ); } - return area; -} - -/*! - Name: loadGeometry [private] - Desc: -*/ - -bool QtxDockAction::loadGeometry( QtxResourceMgr* resMgr, const QString& sec, - const QString& name, GeomInfo& inf ) const -{ - if ( !resMgr || sec.isEmpty() || name.isEmpty() ) - return false; - - QString tmpl = QString( "%1.%2" ).arg( name ); - - inf.vis = resMgr->booleanValue( sec, tmpl.arg( "visible" ), inf.vis ); - inf.newLine = resMgr->booleanValue( sec, tmpl.arg( "new_line" ), inf.newLine ); - - inf.index = resMgr->integerValue( sec, tmpl.arg( "index" ), inf.index ); - inf.offset = resMgr->integerValue( sec, tmpl.arg( "offset" ), inf.offset ); - - inf.x = resMgr->integerValue( sec, tmpl.arg( "x" ), inf.x ); - inf.y = resMgr->integerValue( sec, tmpl.arg( "y" ), inf.y ); - inf.w = resMgr->integerValue( sec, tmpl.arg( "width" ), inf.w ); - inf.h = resMgr->integerValue( sec, tmpl.arg( "height" ), inf.h ); - - inf.fixW = resMgr->integerValue( sec, tmpl.arg( "fixed_width" ), inf.fixW ); - inf.fixH = resMgr->integerValue( sec, tmpl.arg( "fixed_height" ), inf.fixH ); - - int place = -1; - if ( !resMgr->value( sec, tmpl.arg( "place" ), place ) ) - { - QString placeStr; - if ( resMgr->value( sec, tmpl.arg( "place" ), placeStr ) ) - place = dockPlace( placeStr ); - } - - if ( place >= DockUnmanaged && place <= DockMinimized ) - inf.place = place; - - return true; -} - -/*! - Name: saveGeometry [private] - Desc: -*/ - -bool QtxDockAction::saveGeometry( QtxResourceMgr* resMgr, const QString& sec, - const QString& name, const GeomInfo& inf ) const -{ - if ( !resMgr || sec.isEmpty() || name.isEmpty() ) - return false; - QString tmpl = QString( "%1.%2" ).arg( name ); + pm->addSeparator(); - resMgr->setValue( sec, tmpl.arg( "visible" ), inf.vis ); - resMgr->setValue( sec, tmpl.arg( "new_line" ), inf.newLine ); - resMgr->setValue( sec, tmpl.arg( "index" ), inf.index ); - resMgr->setValue( sec, tmpl.arg( "offset" ), inf.offset ); - resMgr->setValue( sec, tmpl.arg( "x" ), inf.x ); - resMgr->setValue( sec, tmpl.arg( "y" ), inf.y ); - resMgr->setValue( sec, tmpl.arg( "width" ), inf.w ); - resMgr->setValue( sec, tmpl.arg( "height" ), inf.h ); - resMgr->setValue( sec, tmpl.arg( "fixed_width" ), inf.fixW ); - resMgr->setValue( sec, tmpl.arg( "fixed_height" ), inf.fixH ); - resMgr->setValue( sec, tmpl.arg( "place" ), inf.place ); - - return true; -} - -/*! - Name: collectNames [private] - Desc: -*/ - -void QtxDockAction::collectNames( const int place, QStringList& lst ) const -{ - QPtrList winList; - QDockArea* area = dockArea( place ); - if ( area ) - winList = area->dockWindowList(); - else - winList = mainWindow()->dockWindows( (Qt::Dock)place ); - - for ( QPtrListIterator it( winList ); it.current(); ++it ) + if ( dockType() == ToolBar || dockType() == Both ) { - QString name; - if ( myInfo.contains( it.current() ) ) - name = myInfo[it.current()].name; - if ( name.isEmpty() ) - name = windowName( it.current() ); - if ( name.isEmpty() ) - continue; - - lst.append( name ); + QList tbList; + toolBars( tbList ); + for ( QList::iterator it = tbList.begin(); it != tbList.end(); ++it ) + pm->addAction( (*it)->toggleViewAction() ); } -} -/*! - Updates menu of action -*/ -void QtxDockAction::updateMenus() -{ - for ( MenuMap::Iterator it = myMenu.begin(); it != myMenu.end(); ++it ) - { - QPopupMenu* pm = it.key(); - MenuInfo& inf = it.data(); - - int toolId = findId( pm, inf.tool ); - int dockId = findId( pm, inf.dock ); - - int index = pm->indexOf( dockId ); - - if ( isSeparate() && !inf.tool ) - inf.tool = new QPopupMenu( pm ); - - pm->removeItem( dockId ); - pm->removeItem( toolId ); - - if ( !isSeparate() && inf.tool ) - { - delete inf.tool; - inf.tool = 0; - } - - QString dock, tool; - splitMenuText( dock, tool ); - - if ( inf.dock ) - iconSet().isNull() ? pm->insertItem ( dock, inf.dock, -1, index ) : - pm->insertItem ( iconSet(), dock, inf.dock, -1, index ); - - if ( index >= 0 ) - index++; - - if ( inf.tool ) - iconSet().isNull() ? pm->insertItem ( tool, inf.tool, -1, index ) : - pm->insertItem ( iconSet(), tool, inf.tool, -1, index ); - } + Qtx::simplifySeparators( pm ); } diff --git a/src/Qtx/QtxDockAction.h b/src/Qtx/QtxDockAction.h index a18d102fb..f55db024b 100755 --- a/src/Qtx/QtxDockAction.h +++ b/src/Qtx/QtxDockAction.h @@ -24,15 +24,13 @@ #include "QtxAction.h" -#include -#include -#include +#include -class QAction; -class QDockArea; -class QDockWindow; +class QIcon; +class QString; +class QToolBar; +class QDockWidget; class QMainWindow; -class QtxResourceMgr; #ifdef WIN32 #pragma warning( disable:4251 ) @@ -42,123 +40,45 @@ class QTX_EXPORT QtxDockAction : public QtxAction { Q_OBJECT - Q_PROPERTY( bool autoAdd READ isAutoAdd WRITE setAutoAdd ) - Q_PROPERTY( bool autoPlace READ isAutoPlace WRITE setAutoPlace ) - Q_PROPERTY( bool separate READ isSeparate WRITE setSeparate ) +public: + //! Dock windows type. + enum { ToolBar, //!< list toolbars only + DockWidget, //!< list dockable windows only + Both //!< list toolbars and dockable windows + } DockType; public: - QtxDockAction( QMainWindow*, const char* = 0 ); - QtxDockAction( const QString&, const QString&, QMainWindow*, const char* = 0 ); - QtxDockAction( const QString&, const QIconSet&, const QString&, QMainWindow*, const char* = 0 ); + QtxDockAction( QMainWindow* ); + QtxDockAction( const QString&, const QString&, QMainWindow* ); + QtxDockAction( const QString&, const QIcon&, const QString&, QMainWindow* ); virtual ~QtxDockAction(); - QMainWindow* mainWindow() const; - - bool isAutoAdd() const; - void setAutoAdd( const bool ); - - bool isAutoPlace() const; - void setAutoPlace( const bool ); - - bool isSeparate() const; - void setSeparate( const bool ); - - virtual bool addTo( QWidget* ); - virtual bool addTo( QWidget*, const int ); - virtual bool removeFrom( QWidget* ); - virtual void setMenuText( const QString& ); - - bool addDockWindow( QDockWindow* ); - bool removeDockWindow( QDockWindow* ); + int dockType() const; + void setDockType( const int ); - virtual bool eventFilter( QObject*, QEvent* ); - - virtual void storeGeometry( QDockWindow* = 0 ); - virtual void restoreGeometry( QDockWindow* = 0 ) const; - - virtual void loadGeometry( QtxResourceMgr*, const QString&, const bool = true ); - virtual void saveGeometry( QtxResourceMgr*, const QString&, const bool = true ) const; + QMainWindow* mainWindow() const; -private slots: +private Q_SLOTS: void onAboutToShow(); - void onToggled( bool ); - void onVisibilityChanged( bool ); - void onPopupDestroyed( QObject* ); - void onWindowDestroyed( QObject* ); - void onDockWindowPositionChanged( QDockWindow* ); protected: - virtual bool event( QEvent* ); + virtual void addedTo( QWidget* ); + virtual void removedFrom( QWidget* ); private: - QAction* action( QDockWindow* ) const; - QDockWindow* dockWindow( const QAction* ) const; - - void checkPopup( QPopupMenu* ); - void fillPopup( QPopupMenu* ) const; - int findId( QPopupMenu*, QPopupMenu* ) const; - - void initialize( QMainWindow* ); - void updateInfo( QDockWindow* ); - bool isToolBar( QDockWindow* ) const; - void dockWindows( QPtrList&, QMainWindow* = 0 ) const; - - QString windowName( QDockWindow* ) const; - void savePlaceInfo( QDockWindow* ); - void loadPlaceInfo( QDockWindow* ) const; - void loadPlaceInfo() const; + void initialize(); + void updateMenu(); - bool autoAddDockWindow( QDockWindow* ); - void autoLoadPlaceInfo( QDockWindow* ); - - void splitMenuText( QString&, QString& ) const; - QStringList splitText( const QString&, const QString& ) const; - - QDockArea* dockArea( const int ) const; - int dockPlace( const QString& ) const; - - void collectNames( const int, QStringList& ) const; - - void updateMenus(); - - bool dockMainWindow( QMainWindow*, QObject* ) const; - -private: - enum { AutoAdd = QEvent::User, LoadArea }; - - typedef struct { bool vis, newLine; - int place, index, offset; - int x, y, w, h, fixW, fixH; } GeomInfo; - typedef struct { QString name; QAction* a; } DockInfo; - typedef struct { QPopupMenu *dock, *tool; } MenuInfo; - - typedef QMap InfoMap; - typedef QMap GeomMap; - typedef QMap MenuMap; + void toolBars( QList& ) const; + void dockWidgets( QList& ) const; private: - bool loadGeometry( QtxResourceMgr*, const QString&, - const QString&, GeomInfo& ) const; - bool saveGeometry( QtxResourceMgr*, const QString&, - const QString&, const GeomInfo& ) const; - void loadPlaceArea( const int, QMainWindow*, QDockArea*, - const QPtrList&, - const QMap& ) const; - -private: - InfoMap myInfo; - MenuMap myMenu; - GeomMap myGeom; - QMainWindow* myMain; - QStringList myNames; - - bool myAutoAdd; - bool mySeparate; - bool myAutoPlace; + int myType; //!< dock action type + QMainWindow* myMain; //!< parent main window }; #ifdef WIN32 #pragma warning( default:4251 ) #endif -#endif +#endif // QTX_DOCKACTION_H -- 2.39.2