Salome HOME
Fix for Bug IPAL9053( 3.0.0: "Check Geometry" and "Load script" functionalities from...
[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 //***************************************************************
15 SUIT_ViewManager::SUIT_ViewManager( SUIT_Study* theStudy,
16                                     SUIT_Desktop* theDesktop,
17                                     SUIT_ViewModel* theViewModel )
18 : QObject( 0 ),
19 myDesktop( theDesktop ),
20 myTitle( "Default viewer" ),
21 myStudy( NULL )
22 {
23   myViewModel = 0;
24   myActiveView = 0;
25   setViewModel(theViewModel);
26   connect(theDesktop, SIGNAL(windowActivated(SUIT_ViewWindow*)), 
27           this,       SLOT(onWindowActivated(SUIT_ViewWindow*)));
28
29   myStudy = theStudy;
30   if( myStudy )
31     connect( myStudy, SIGNAL( destroyed() ), this, SLOT( onDeleteStudy() ) );
32 }
33
34 //***************************************************************
35 SUIT_ViewManager::~SUIT_ViewManager()
36 {
37   if (myViewModel) {
38     myViewModel->setViewManager(0);
39     delete myViewModel;
40   }
41 }
42
43 //***************************************************************
44 void SUIT_ViewManager::setViewModel(SUIT_ViewModel* theViewModel) 
45 {
46   if (myViewModel && myViewModel != theViewModel) {
47     myViewModel->setViewManager(0);
48     delete myViewModel;
49   }
50   myViewModel = theViewModel;
51   if (myViewModel)
52     myViewModel->setViewManager(this);
53 }
54
55 //***************************************************************
56 void SUIT_ViewManager::setViewName(SUIT_ViewWindow* theView)
57 {
58   int aPos = myViews.find(theView);
59   theView->setCaption(myTitle + QString(":%1").arg(aPos+1));
60 }
61
62 //***************************************************************
63 SUIT_ViewWindow* SUIT_ViewManager::createViewWindow()
64 {
65   SUIT_ViewWindow* aView = myViewModel->createView(myDesktop);
66
67   if ( !insertView( aView ) )
68     delete aView;
69   
70   setViewName( aView );
71   //myDesktop->addViewWindow( aView );
72   //it is done automatically during creation of view
73
74   aView->setViewManager(this);
75   emit viewCreated(aView);
76   return aView;
77 }
78
79 //***************************************************************
80 void SUIT_ViewManager::createView()
81 {
82   createViewWindow();
83 }
84
85 //***************************************************************
86 bool SUIT_ViewManager::insertView(SUIT_ViewWindow* theView)
87 {
88   unsigned int aSize = myViews.size();
89   unsigned int aNbItems = myViews.count()+1;
90   if (aNbItems > aSize) {
91     if (!myViews.resize(aNbItems)) {
92       QMessageBox::critical(myDesktop, tr("Critical error"), tr("There is no memory for the new view!!!"));
93       return false;
94     }
95     aSize = myViews.size();
96   }
97   
98   connect(theView, SIGNAL(closing(SUIT_ViewWindow*)),
99           this,    SLOT(onDeleteView(SUIT_ViewWindow*)));
100
101   connect(theView, SIGNAL(mousePressed(SUIT_ViewWindow*, QMouseEvent*)),
102           this,    SLOT(onMousePressed(SUIT_ViewWindow*, QMouseEvent*)));
103
104   connect(theView, SIGNAL(mouseReleased(SUIT_ViewWindow*, QMouseEvent*)),
105           this,    SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)));
106
107   connect(theView, SIGNAL(mouseDoubleClicked(SUIT_ViewWindow*, QMouseEvent*)),
108           this,    SIGNAL(mouseDoubleClick(SUIT_ViewWindow*, QMouseEvent*)));
109
110   connect(theView, SIGNAL(mouseMoving(SUIT_ViewWindow*, QMouseEvent*)),
111           this,    SIGNAL(mouseMove(SUIT_ViewWindow*, QMouseEvent*)));
112
113   connect(theView, SIGNAL(wheeling(SUIT_ViewWindow*, QWheelEvent*)),
114           this,    SIGNAL(wheel(SUIT_ViewWindow*, QWheelEvent*)));
115
116   connect(theView, SIGNAL(keyPressed(SUIT_ViewWindow*, QKeyEvent*)),
117           this,    SIGNAL(keyPress(SUIT_ViewWindow*, QKeyEvent*)));
118
119   connect(theView, SIGNAL(keyReleased(SUIT_ViewWindow*, QKeyEvent*)),
120           this,    SIGNAL(keyRelease(SUIT_ViewWindow*, QKeyEvent*)));
121
122   connect(theView, SIGNAL(contextMenuRequested( QContextMenuEvent * )),
123           this,    SLOT  (onContextMenuRequested( QContextMenuEvent * )));
124
125   for (uint i = 0; i < aSize; i++) {
126     if (myViews[i]==0) {
127       myViews.insert(i, theView);
128       return true;
129     }
130   }
131   return false;
132 }
133
134
135 //***************************************************************
136 void SUIT_ViewManager::onDeleteView(SUIT_ViewWindow* theView)
137 {
138   emit deleteView(theView);
139   removeView(theView);
140 }
141
142 //***************************************************************
143 void SUIT_ViewManager::removeView(SUIT_ViewWindow* theView) 
144 {
145   theView->disconnect(this);
146   myViews.remove(myViews.find(theView));
147   if (myActiveView == theView)
148     myActiveView = 0;
149   int aNumItems = myViews.count();
150   if (aNumItems == 0)
151     emit lastViewClosed(this);
152 }
153
154 //***************************************************************
155 void SUIT_ViewManager::onMousePressed(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
156 {
157   emit mousePress(theView, theEvent);
158 }
159
160 //***************************************************************
161 void SUIT_ViewManager::onWindowActivated(SUIT_ViewWindow* view)
162 {
163   if (view) {
164     unsigned int aSize = myViews.size();
165     for (uint i = 0; i < aSize; i++) {
166       if (myViews[i] && myViews[i] == view) {
167         myActiveView = view;
168         emit activated( this );
169         return;
170       }
171     }
172   }
173 }
174
175 //***************************************************************
176 void SUIT_ViewManager::closeAllViews()
177 {
178   unsigned int aSize = myViews.size();
179   for (uint i = 0; i < aSize; i++) {
180     if (myViews[i])
181       myViews[i]->close();
182   }
183 }
184
185
186 //***************************************************************
187 QString  SUIT_ViewManager::getType() const 
188
189   return (!myViewModel)? "": myViewModel->getType(); 
190 }
191
192 //***************************************************************
193 SUIT_Study* SUIT_ViewManager::study() const
194 {
195     return myStudy;
196 }
197
198 //***************************************************************
199 void SUIT_ViewManager::onDeleteStudy()
200 {
201     myStudy = NULL;
202 }
203
204 //***************************************************************
205 void SUIT_ViewManager::onContextMenuRequested( QContextMenuEvent* e )
206 {
207   // invoke method of SUIT_PopupClient, which notifies about popup
208   contextMenuRequest( e );
209 }
210
211 //***************************************************************
212 void SUIT_ViewManager::contextMenuPopup( QPopupMenu* popup )
213 {
214   SUIT_ViewModel* vm = getViewModel();
215   if ( vm )
216     vm->contextMenuPopup( popup );
217 }