]> SALOME platform Git repositories - modules/gui.git/blob - src/SUIT/SUIT_ViewManager.cxx
Salome HOME
1243289014de9bbd52d3bc60c3232c5da24cb9ee
[modules/gui.git] / src / SUIT / SUIT_ViewManager.cxx
1 #include "SUIT_ViewManager.h"
2
3 #include "SUIT_Desktop.h"
4 #include "SUIT_ViewModel.h"
5 #include "SUIT_Study.h"
6
7 #include <qcursor.h>
8 #include <qmessagebox.h>
9
10 #ifdef WNT
11 #include <windows.h>
12 #endif
13
14 /*!\class SUIT_ViewManager.
15  * Class provide manipulation with view windows.
16  */
17
18 /*!Constructor.*/
19 SUIT_ViewManager::SUIT_ViewManager( SUIT_Study* theStudy,
20                                     SUIT_Desktop* theDesktop,
21                                     SUIT_ViewModel* theViewModel )
22 : QObject( 0 ),
23 myDesktop( theDesktop ),
24 myTitle( "Default viewer" ),
25 myStudy( NULL )
26 {
27   myViewModel = 0;
28   myActiveView = 0;
29   setViewModel(theViewModel);
30   connect(theDesktop, SIGNAL(windowActivated(SUIT_ViewWindow*)), 
31           this,       SLOT(onWindowActivated(SUIT_ViewWindow*)));
32
33   myStudy = theStudy;
34   if( myStudy )
35     connect( myStudy, SIGNAL( destroyed() ), this, SLOT( onDeleteStudy() ) );
36 }
37
38 /*!Destructor.*/
39 SUIT_ViewManager::~SUIT_ViewManager()
40 {
41   if ( myViewModel )
42   {
43     myViewModel->setViewManager( 0 );
44     delete myViewModel;
45   }
46 }
47
48 /*!Sets view model \a theViewModel to view manager.*/
49 void SUIT_ViewManager::setViewModel(SUIT_ViewModel* theViewModel) 
50 {
51   if (myViewModel && myViewModel != theViewModel) {
52     myViewModel->setViewManager(0);
53     delete myViewModel;
54   }
55   myViewModel = theViewModel;
56   if (myViewModel)
57     myViewModel->setViewManager(this);
58 }
59
60 /*!Sets view name for view window \a theView.*/
61 void SUIT_ViewManager::setViewName(SUIT_ViewWindow* theView)
62 {
63   int aPos = myViews.find(theView);
64   theView->setCaption(myTitle + QString(":%1").arg(aPos+1));
65 }
66
67 /*! Creates View, adds it into list of views and returns just created view window*/
68 SUIT_ViewWindow* SUIT_ViewManager::createViewWindow()
69 {
70   SUIT_ViewWindow* aView = myViewModel->createView(myDesktop);
71
72   if ( !insertView( aView ) ){
73     delete aView;
74     return 0;
75   }
76   
77   setViewName( aView );
78   //myDesktop->addViewWindow( aView );
79   //it is done automatically during creation of view
80
81   aView->setViewManager(this);
82
83   emit viewCreated(aView);
84
85   // Special treatment for the case when <aView> is the first one in this view manager
86   // -> call onWindowActivated() directly, because somebody may always want
87   // to use getActiveView()
88   if ( !myActiveView )
89     onWindowActivated( aView );
90
91   return aView;
92 }
93
94 /*!Create view window.*/
95 void SUIT_ViewManager::createView()
96 {
97   createViewWindow();
98 }
99
100 /*!Insert view window to view manager.
101  *\retval false - if something wrong, else true.
102  */
103 bool SUIT_ViewManager::insertView(SUIT_ViewWindow* theView)
104 {
105   unsigned int aSize = myViews.size();
106   unsigned int aNbItems = myViews.count()+1;
107   if (aNbItems > aSize) {
108     if (!myViews.resize(aNbItems)) {
109       QMessageBox::critical(myDesktop, tr("Critical error"), tr("There is no memory for the new view!!!"));
110       return false;
111     }
112     aSize = myViews.size();
113   }
114   
115   connect(theView, SIGNAL(closing(SUIT_ViewWindow*)),
116           this,    SLOT(onDeleteView(SUIT_ViewWindow*)));
117
118   connect(theView, SIGNAL(mousePressed(SUIT_ViewWindow*, QMouseEvent*)),
119           this,    SLOT(onMousePressed(SUIT_ViewWindow*, QMouseEvent*)));
120
121   connect(theView, SIGNAL(mouseReleased(SUIT_ViewWindow*, QMouseEvent*)),
122           this,    SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)));
123
124   connect(theView, SIGNAL(mouseDoubleClicked(SUIT_ViewWindow*, QMouseEvent*)),
125           this,    SIGNAL(mouseDoubleClick(SUIT_ViewWindow*, QMouseEvent*)));
126
127   connect(theView, SIGNAL(mouseMoving(SUIT_ViewWindow*, QMouseEvent*)),
128           this,    SIGNAL(mouseMove(SUIT_ViewWindow*, QMouseEvent*)));
129
130   connect(theView, SIGNAL(wheeling(SUIT_ViewWindow*, QWheelEvent*)),
131           this,    SIGNAL(wheel(SUIT_ViewWindow*, QWheelEvent*)));
132
133   connect(theView, SIGNAL(keyPressed(SUIT_ViewWindow*, QKeyEvent*)),
134           this,    SIGNAL(keyPress(SUIT_ViewWindow*, QKeyEvent*)));
135
136   connect(theView, SIGNAL(keyReleased(SUIT_ViewWindow*, QKeyEvent*)),
137           this,    SIGNAL(keyRelease(SUIT_ViewWindow*, QKeyEvent*)));
138
139   connect(theView, SIGNAL(contextMenuRequested( QContextMenuEvent * )),
140           this,    SLOT  (onContextMenuRequested( QContextMenuEvent * )));
141
142   for (uint i = 0; i < aSize; i++) {
143     if (myViews[i]==0) {
144       myViews.insert(i, theView);
145       return true;
146     }
147   }
148   return false;
149 }
150
151 /*!Emit delete view. Remove view window \a theView from view manager.
152 */
153 void SUIT_ViewManager::onDeleteView(SUIT_ViewWindow* theView)
154 {
155   emit deleteView(theView);
156   removeView(theView);
157 }
158
159 /*!Remove view window \a theView from view manager.
160  *And close the last view, if it has \a theView.
161 */
162 void SUIT_ViewManager::removeView(SUIT_ViewWindow* theView) 
163 {
164   theView->disconnect(this);
165   myViews.remove(myViews.find(theView));
166   if (myActiveView == theView)
167     myActiveView = 0;
168   int aNumItems = myViews.count();
169   if (aNumItems == 0)
170     emit lastViewClosed(this);
171 }
172
173 /*!
174   Show or hide all views (view windows)
175 */
176 void SUIT_ViewManager::setShown( const bool on )
177 {
178   for ( uint i = 0; i < myViews.count(); i++ )
179     myViews.at( i )->setShown( on );
180 }
181
182 /*!Emit on \a theEvent mouse pressed in \a theView.*/
183 void SUIT_ViewManager::onMousePressed(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
184 {
185   emit mousePress(theView, theEvent);
186 }
187
188 /*!Emit activated for view \a view.
189 */
190 void SUIT_ViewManager::onWindowActivated(SUIT_ViewWindow* view)
191 {
192   if (view) {
193     unsigned int aSize = myViews.size();
194     for (uint i = 0; i < aSize; i++) {
195       if (myViews[i] && myViews[i] == view) {
196         myActiveView = view;
197         emit activated( this );
198         return;
199       }
200     }
201   }
202 }
203
204 /*!Close all views.
205 */
206 void SUIT_ViewManager::closeAllViews()
207 {
208   unsigned int aSize = myViews.size();
209   for (uint i = 0; i < aSize; i++) {
210     if (myViews[i])
211       myViews[i]->close();
212   }
213 }
214
215 /*!
216  *\retval QString - type of view model.
217  */
218 QString  SUIT_ViewManager::getType() const 
219
220   return (!myViewModel)? "": myViewModel->getType(); 
221 }
222
223 /*!
224  *\retval SUIT_Study* - current study.
225  */
226 SUIT_Study* SUIT_ViewManager::study() const
227 {
228     return myStudy;
229 }
230
231 /*!
232  * Sets stydy to NULL.
233  */
234 void SUIT_ViewManager::onDeleteStudy()
235 {
236     myStudy = NULL;
237 }
238
239 void SUIT_ViewManager::onContextMenuRequested( QContextMenuEvent* e )
240 {
241   /*! invoke method of SUIT_PopupClient, which notifies about popup*/
242   contextMenuRequest( e );
243 }
244
245 /*!Context menu popup for \a popup.*/
246 void SUIT_ViewManager::contextMenuPopup( QPopupMenu* popup )
247 {
248   SUIT_ViewModel* vm = getViewModel();
249   if ( vm )
250     vm->contextMenuPopup( popup );
251 }