Salome HOME
919cd67ecc973ce1fc32d7228ccfbe627da9fc17
[modules/gui.git] / src / STD / STD_MDIDesktop.cxx
1 #include "STD_MDIDesktop.h"
2
3 #include <SUIT_Session.h>
4 #include <SUIT_ViewWindow.h>
5 #include <SUIT_ResourceMgr.h>
6
7 #include <QtxAction.h>
8 #include <QtxActionMenuMgr.h>
9 #include <QtxWorkspaceAction.h>
10
11 #include <qvbox.h>
12 #include <qmenubar.h>
13 #include <qworkspace.h>
14 #include <qobjectlist.h>
15
16 #include <stdarg.h>
17
18 /*!Constructor.*/
19 STD_MDIDesktop::STD_MDIDesktop()
20 : SUIT_Desktop(),
21 myWorkspace( 0 ),
22 myWorkspaceAction( 0 )
23 {
24   QVBox* base = new QVBox( this );
25   base->setFrameStyle( QFrame::Panel | QFrame::Sunken );
26
27   setCentralWidget( base );
28
29   myWorkspace = new QWorkspace( base );
30
31   connect( myWorkspace, SIGNAL( windowActivated( QWidget* ) ),
32            this, SLOT( onWindowActivated( QWidget* ) ) );
33
34   createActions();
35 }
36
37 /*!destructor.*/
38 STD_MDIDesktop::~STD_MDIDesktop()
39 {
40 }
41
42 /*!\retval SUIT_ViewWindow - return const active window.*/
43 SUIT_ViewWindow* STD_MDIDesktop::activeWindow() const
44 {
45   SUIT_ViewWindow* wnd = 0;
46
47   QWidget* wid = myWorkspace->activeWindow();
48   if ( wid && wid->inherits( "SUIT_ViewWindow" ) )
49     wnd = (SUIT_ViewWindow*)wid;
50
51   return wnd;
52 }
53
54 /*!\retval QPtrList<SUIT_ViewWindow> - return const active window list.*/
55 QPtrList<SUIT_ViewWindow> STD_MDIDesktop::windows() const
56 {
57   QPtrList<SUIT_ViewWindow> winList;
58
59   QWidgetList children = myWorkspace->windowList();
60   for ( QWidgetListIt it( children ); it.current(); ++it )
61   {
62     if ( it.current()->inherits( "SUIT_ViewWindow" ) )
63       winList.append( (SUIT_ViewWindow*)it.current() );
64   }
65
66   return winList;
67 }
68
69 /*!\retval QWidget - pointer to work space.*/
70 QWidget* STD_MDIDesktop::parentArea() const
71 {
72   return workspace();
73 }
74
75 /*!Call method perform for operation \a type.*/
76 void STD_MDIDesktop::windowOperation( const int type )
77 {
78   myWorkspaceAction->perform( operationFlag( type ) );
79 }
80
81 /*!Sets window operations by \a first ... parameters.*/
82 void STD_MDIDesktop::setWindowOperations( const int first, ... )
83 {
84   va_list ints;
85         va_start( ints, first );
86
87         QValueList<int> typeList;
88
89         int cur = first;
90         while ( cur )
91         {
92           typeList.append( cur );
93                 cur = va_arg( ints, int );
94   }
95
96         setWindowOperations( typeList );
97 }
98
99 /*!Sets window operations by variable \a opList - operation list.*/
100 void STD_MDIDesktop::setWindowOperations( const QValueList<int>& opList )
101 {
102   int flags = 0;
103
104   for ( QValueList<int>::const_iterator it = opList.begin(); it != opList.end(); ++it )
105     flags = flags | operationFlag( *it );
106
107   myWorkspaceAction->setItems( flags );
108 }
109
110 /*!\retval QWorkspace pointer - work space.*/
111 QWorkspace* STD_MDIDesktop::workspace() const
112 {
113   return myWorkspace;
114 }
115
116 /*!Emit window activated.*/
117 void STD_MDIDesktop::onWindowActivated( QWidget* w )
118 {
119   if ( w && w->inherits( "SUIT_ViewWindow" ) )
120     emit windowActivated( (SUIT_ViewWindow*)w );
121 }
122
123 /*!Create actions: cascade, Tile, Tile Horizontal, Tile Vertical*/
124 void STD_MDIDesktop::createActions()
125 {
126   if ( myWorkspaceAction )
127     return;
128
129   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
130   if ( !resMgr )
131     return;
132
133   myWorkspaceAction = new QtxWorkspaceAction( workspace(), this );
134
135   myWorkspaceAction->setItems( QtxWorkspaceAction::Cascade | QtxWorkspaceAction::Tile |
136                                QtxWorkspaceAction::HTile | QtxWorkspaceAction::VTile |
137                                QtxWorkspaceAction::Windows );
138
139   // Cascade
140   myWorkspaceAction->setIconSet( QtxWorkspaceAction::Cascade,
141                                  resMgr->loadPixmap( "STD", tr( "ICON_DESK_WINDOW_CASCADE" ) ) );
142   myWorkspaceAction->setMenuText( QtxWorkspaceAction::Cascade, tr( "MEN_DESK_WINDOW_CASCADE" ) );
143   myWorkspaceAction->setStatusTip( QtxWorkspaceAction::Cascade, tr( "PRP_DESK_WINDOW_CASCADE" ) );
144
145   // Tile
146   myWorkspaceAction->setIconSet( QtxWorkspaceAction::Tile,
147                                  resMgr->loadPixmap( "STD", tr( "ICON_DESK_WINDOW_TILE" ) ) );
148   myWorkspaceAction->setMenuText( QtxWorkspaceAction::Tile, tr( "MEN_DESK_WINDOW_TILE" ) );
149   myWorkspaceAction->setStatusTip( QtxWorkspaceAction::Tile, tr( "PRP_DESK_WINDOW_TILE" ) );
150
151   // Tile Horizontal
152   myWorkspaceAction->setIconSet( QtxWorkspaceAction::HTile,
153                                  resMgr->loadPixmap( "STD", tr( "ICON_DESK_WINDOW_HTILE" ) ) );
154   myWorkspaceAction->setMenuText( QtxWorkspaceAction::HTile, tr( "MEN_DESK_WINDOW_HTILE" ) );
155   myWorkspaceAction->setStatusTip( QtxWorkspaceAction::HTile, tr( "PRP_DESK_WINDOW_HTILE" ) );
156
157   // Tile Vertical
158   myWorkspaceAction->setIconSet( QtxWorkspaceAction::VTile,
159                                  resMgr->loadPixmap( "STD", tr( "ICON_DESK_WINDOW_VTILE" ) ) );
160   myWorkspaceAction->setMenuText( QtxWorkspaceAction::VTile, tr( "MEN_DESK_WINDOW_VTILE" ) );
161   myWorkspaceAction->setStatusTip( QtxWorkspaceAction::VTile, tr( "PRP_DESK_WINDOW_VTILE" ) );
162
163
164   QtxActionMenuMgr* mMgr = menuMgr();
165   if ( !mMgr )
166     return;
167
168   int winMenuId = mMgr->insert( tr( "MEN_DESK_WINDOW" ), -1, 100 );
169   mMgr->insert( myWorkspaceAction, winMenuId, -1 );
170   mMgr->insert( QtxActionMenuMgr::separator(), winMenuId, -1 );
171 }
172
173 /*!Convert STD_MDIDesktop enumerations to QtxWorkspaceAction.*/
174 int STD_MDIDesktop::operationFlag( const int type ) const
175 {
176   int res = 0;
177   switch ( type )
178   {
179   case Cascade:
180     res = QtxWorkspaceAction::Cascade;
181     break;
182   case Tile:
183     res = QtxWorkspaceAction::Tile;
184     break;
185   case HTile:
186     res = QtxWorkspaceAction::HTile;
187     break;
188   case VTile:
189     res = QtxWorkspaceAction::VTile;
190     break;
191   }
192   return res;
193 }