1 // File: QtxWorkstackAction.cxx
2 // Author: Sergey TELKOV
4 #include "QtxWorkstackAction.h"
6 #include "QtxWorkstack.h"
8 #include <qpopupmenu.h>
9 #include <qwidgetlist.h>
11 QtxWorkstackAction::QtxWorkstackAction( QtxWorkstack* ws, QObject* parent, const char* name )
12 : QtxAction( tr( "Controls windows into workstack" ), tr( "Workstack management" ), 0, parent, name ),
16 myItem.insert( VSplit, new QtxAction( tr( "Split the active window on two vertical parts" ),
17 tr( "Split vertically" ), 0, this, 0, false ) );
18 myItem.insert( HSplit, new QtxAction( tr( "Split the active window on two horizontal parts" ),
19 tr( "Split horizontally" ), 0, this, 0, false ) );
21 connect( myItem[VSplit], SIGNAL( activated() ), ws, SLOT( splitVertical() ) );
22 connect( myItem[HSplit], SIGNAL( activated() ), ws, SLOT( splitHorizontal() ) );
25 QtxWorkstackAction::~QtxWorkstackAction()
29 QtxWorkstack* QtxWorkstackAction::workstack() const
34 int QtxWorkstackAction::items() const
39 void QtxWorkstackAction::setItems( const int flags )
41 if ( !flags || flags == myFlags || !( flags & Split ) )
47 bool QtxWorkstackAction::hasItems( const int flags ) const
49 return ( myFlags & flags ) == flags;
52 int QtxWorkstackAction::accel( const int id ) const
55 if ( myItem.contains( id ) )
56 a = myItem[id]->accel();
60 QIconSet QtxWorkstackAction::iconSet( const int id ) const
63 if ( myItem.contains( id ) )
64 ico = myItem[id]->iconSet();
68 QString QtxWorkstackAction::menuText( const int id ) const
71 if ( myItem.contains( id ) )
72 txt = myItem[id]->menuText();
76 QString QtxWorkstackAction::statusTip( const int id ) const
79 if ( myItem.contains( id ) )
80 txt = myItem[id]->statusTip();
84 void QtxWorkstackAction::setAccel( const int id, const int a )
86 if ( myItem.contains( id ) )
87 myItem[id]->setAccel( a );
90 void QtxWorkstackAction::setIconSet( const int id, const QIconSet& ico )
92 if ( myItem.contains( id ) )
93 myItem[id]->setIconSet( ico );
96 void QtxWorkstackAction::setMenuText( const int id, const QString& txt )
98 if ( myItem.contains( id ) )
99 myItem[id]->setMenuText( txt );
102 void QtxWorkstackAction::setStatusTip( const int id, const QString& txt )
104 if ( myItem.contains( id ) )
105 myItem[id]->setStatusTip( txt );
108 bool QtxWorkstackAction::addTo( QWidget* wid )
110 return addTo( wid, -1 );
113 bool QtxWorkstackAction::addTo( QWidget* wid, const int idx )
115 if ( !wid || !wid->inherits( "QPopupMenu" ) )
118 QPopupMenu* pm = (QPopupMenu*)wid;
121 if ( myMenu.contains( pm ) )
124 myMenu.insert( pm, QIntList() );
125 fillPopup( pm, idx );
127 connect( pm, SIGNAL( aboutToShow() ), this, SLOT( onAboutToShow() ) );
128 connect( pm, SIGNAL( destroyed( QObject* ) ), this, SLOT( onPopupDestroyed( QObject* ) ) );
133 bool QtxWorkstackAction::removeFrom( QWidget* wid )
135 if ( !wid || !wid->inherits( "QPopupMenu" ) )
138 QPopupMenu* pm = (QPopupMenu*)wid;
139 if ( !myMenu.contains( pm ) )
144 disconnect( pm, SIGNAL( aboutToShow() ), this, SLOT( onAboutToShow() ) );
145 disconnect( pm, SIGNAL( destroyed( QObject* ) ), this, SLOT( onPopupDestroyed( QObject* ) ) );
152 void QtxWorkstackAction::perform( const int type )
157 workstack()->splitVertical();
160 workstack()->splitHorizontal();
165 void QtxWorkstackAction::onAboutToShow()
167 const QObject* obj = sender();
168 if ( !obj || !obj->inherits( "QPopupMenu" ) )
171 updatePopup( (QPopupMenu*)obj );
174 void QtxWorkstackAction::onPopupDestroyed( QObject* obj )
176 myMenu.remove( (QPopupMenu*)obj );
179 void QtxWorkstackAction::checkPopup( QPopupMenu* pm )
181 if ( !myMenu.contains( pm ) )
185 for ( QIntList::const_iterator it = myMenu[pm].begin(); it != myMenu[pm].end(); ++it )
187 if ( pm->indexOf( *it ) != -1 )
188 updList.append( *it );
193 if ( !updList.isEmpty() )
194 myMenu.insert( pm, updList );
197 disconnect( pm, SIGNAL( aboutToShow() ), this, SLOT( onAboutToShow() ) );
198 disconnect( pm, SIGNAL( destroyed( QObject* ) ), this, SLOT( onPopupDestroyed( QObject* ) ) );
202 void QtxWorkstackAction::updatePopup( QPopupMenu* pm )
204 if ( !myMenu.contains( pm ) )
207 fillPopup( pm, clearPopup( pm ) );
209 int count = workstack() ? workstack()->splitWindowList().count() : 0;
210 myItem[VSplit]->setEnabled( count > 1 );
211 myItem[HSplit]->setEnabled( count > 1 );
214 int QtxWorkstackAction::clearPopup( QPopupMenu* pm )
216 if ( !myMenu.contains( pm ) )
220 const QIntList& lst = myMenu[pm];
221 for ( QIntList::const_iterator it = lst.begin(); it != lst.end() && idx == -1; ++it )
222 idx = pm->indexOf( *it );
224 for ( ItemMap::ConstIterator mit = myItem.begin(); mit != myItem.end(); ++mit )
225 mit.data()->removeFrom( pm );
227 for ( QIntList::const_iterator itr = lst.begin(); itr != lst.end(); ++itr )
228 pm->removeItem( *itr );
233 void QtxWorkstackAction::fillPopup( QPopupMenu* pm, const int idx )
238 int index = idx < 0 ? pm->count() : QMIN( (int)pm->count(), idx );
240 myMenu.insert( pm, QIntList() );
241 QIntList& lst = myMenu[pm];
243 for ( ItemMap::ConstIterator mit = myItem.begin(); mit != myItem.end(); ++mit )
245 if ( !hasItems( mit.key() ) )
248 mit.data()->addTo( pm, index );
249 lst.append( pm->idAt( index++ ) );
252 QtxWorkstack* ws = workstack();
253 if ( !ws || !hasItems( Windows ) )
256 QWidgetList wList = ws->windowList();
257 if ( wList.isEmpty() )
260 lst.append( pm->insertSeparator( index++ ) );
263 pm->setCheckable( true );
264 for ( QWidgetListIt it( wList ); it.current(); ++it )
266 int id = pm->insertItem( it.current()->caption(), this, SLOT( onItemActivated( int ) ), 0, -1, index++ );
267 pm->setItemParameter( id, param++ );
268 pm->setItemChecked( id, it.current() == ws->activeWindow() );
273 void QtxWorkstackAction::onItemActivated( int idx )
275 QtxWorkstack* ws = workstack();
279 QWidgetList wList = ws->windowList();
280 if ( idx < 0 || idx >= (int)wList.count() )
283 wList.at( idx )->setFocus();