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 QtxWorkstack* ws = workstack();
172 if ( ws && myItem.contains( VSplit ) )
173 myItem[VSplit]->setAccel( ws->accel( QtxWorkstack::SplitVertical ) );
174 if ( ws && myItem.contains( HSplit ) )
175 myItem[HSplit]->setAccel( ws->accel( QtxWorkstack::SplitHorizontal ) );
177 updatePopup( (QPopupMenu*)obj );
180 void QtxWorkstackAction::onPopupDestroyed( QObject* obj )
182 myMenu.remove( (QPopupMenu*)obj );
185 void QtxWorkstackAction::checkPopup( QPopupMenu* pm )
187 if ( !myMenu.contains( pm ) )
191 for ( QIntList::const_iterator it = myMenu[pm].begin(); it != myMenu[pm].end(); ++it )
193 if ( pm->indexOf( *it ) != -1 )
194 updList.append( *it );
199 if ( !updList.isEmpty() )
200 myMenu.insert( pm, updList );
203 disconnect( pm, SIGNAL( aboutToShow() ), this, SLOT( onAboutToShow() ) );
204 disconnect( pm, SIGNAL( destroyed( QObject* ) ), this, SLOT( onPopupDestroyed( QObject* ) ) );
208 void QtxWorkstackAction::updatePopup( QPopupMenu* pm )
210 if ( !myMenu.contains( pm ) )
213 fillPopup( pm, clearPopup( pm ) );
215 int count = workstack() ? workstack()->splitWindowList().count() : 0;
216 myItem[VSplit]->setEnabled( count > 1 );
217 myItem[HSplit]->setEnabled( count > 1 );
220 int QtxWorkstackAction::clearPopup( QPopupMenu* pm )
222 if ( !myMenu.contains( pm ) )
226 const QIntList& lst = myMenu[pm];
227 for ( QIntList::const_iterator it = lst.begin(); it != lst.end() && idx == -1; ++it )
228 idx = pm->indexOf( *it );
230 for ( ItemMap::ConstIterator mit = myItem.begin(); mit != myItem.end(); ++mit )
231 mit.data()->removeFrom( pm );
233 for ( QIntList::const_iterator itr = lst.begin(); itr != lst.end(); ++itr )
234 pm->removeItem( *itr );
239 void QtxWorkstackAction::fillPopup( QPopupMenu* pm, const int idx )
244 int index = idx < 0 ? pm->count() : QMIN( (int)pm->count(), idx );
246 myMenu.insert( pm, QIntList() );
247 QIntList& lst = myMenu[pm];
249 for ( ItemMap::ConstIterator mit = myItem.begin(); mit != myItem.end(); ++mit )
251 if ( !hasItems( mit.key() ) )
254 mit.data()->addTo( pm, index );
255 lst.append( pm->idAt( index++ ) );
258 QtxWorkstack* ws = workstack();
259 if ( !ws || !hasItems( Windows ) )
262 QWidgetList wList = ws->windowList();
263 if ( wList.isEmpty() )
266 lst.append( pm->insertSeparator( index++ ) );
269 pm->setCheckable( true );
270 for ( QWidgetListIt it( wList ); it.current(); ++it )
272 int id = pm->insertItem( it.current()->caption(), this, SLOT( onItemActivated( int ) ), 0, -1, index++ );
273 pm->setItemParameter( id, param++ );
274 pm->setItemChecked( id, it.current() == ws->activeWindow() );
279 void QtxWorkstackAction::onItemActivated( int idx )
281 QtxWorkstack* ws = workstack();
285 QWidgetList wList = ws->windowList();
286 if ( idx < 0 || idx >= (int)wList.count() )
289 wList.at( idx )->setFocus();