Salome HOME
New item (FontItem), allowing to show information about font setting and to select...
[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     return 0;
70   }
71   
72   setViewName( aView );
73   //myDesktop->addViewWindow( aView );
74   //it is done automatically during creation of view
75
76   aView->setViewManager(this);
77
78   emit viewCreated(aView);
79
80   // Special treatment for the case when <aView> is the first one in this view manager
81   // -> call onWindowActivated() directly, because somebody may always want
82   // to use getActiveView()
83   if ( !myActiveView )
84     onWindowActivated( aView );
85
86   return aView;
87 }
88
89 //***************************************************************
90 void SUIT_ViewManager::createView()
91 {
92   createViewWindow();
93 }
94
95 //***************************************************************
96 bool SUIT_ViewManager::insertView(SUIT_ViewWindow* theView)
97 {
98   unsigned int aSize = myViews.size();
99   unsigned int aNbItems = myViews.count()+1;
100   if (aNbItems > aSize) {
101     if (!myViews.resize(aNbItems)) {
102       QMessageBox::critical(myDesktop, tr("Critical error"), tr("There is no memory for the new view!!!"));
103       return false;
104     }
105     aSize = myViews.size();
106   }
107   
108   connect(theView, SIGNAL(closing(SUIT_ViewWindow*)),
109           this,    SLOT(onDeleteView(SUIT_ViewWindow*)));
110
111   connect(theView, SIGNAL(mousePressed(SUIT_ViewWindow*, QMouseEvent*)),
112           this,    SLOT(onMousePressed(SUIT_ViewWindow*, QMouseEvent*)));
113
114   connect(theView, SIGNAL(mouseReleased(SUIT_ViewWindow*, QMouseEvent*)),
115           this,    SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)));
116
117   connect(theView, SIGNAL(mouseDoubleClicked(SUIT_ViewWindow*, QMouseEvent*)),
118           this,    SIGNAL(mouseDoubleClick(SUIT_ViewWindow*, QMouseEvent*)));
119
120   connect(theView, SIGNAL(mouseMoving(SUIT_ViewWindow*, QMouseEvent*)),
121           this,    SIGNAL(mouseMove(SUIT_ViewWindow*, QMouseEvent*)));
122
123   connect(theView, SIGNAL(wheeling(SUIT_ViewWindow*, QWheelEvent*)),
124           this,    SIGNAL(wheel(SUIT_ViewWindow*, QWheelEvent*)));
125
126   connect(theView, SIGNAL(keyPressed(SUIT_ViewWindow*, QKeyEvent*)),
127           this,    SIGNAL(keyPress(SUIT_ViewWindow*, QKeyEvent*)));
128
129   connect(theView, SIGNAL(keyReleased(SUIT_ViewWindow*, QKeyEvent*)),
130           this,    SIGNAL(keyRelease(SUIT_ViewWindow*, QKeyEvent*)));
131
132   connect(theView, SIGNAL(contextMenuRequested( QContextMenuEvent * )),
133           this,    SLOT  (onContextMenuRequested( QContextMenuEvent * )));
134
135   for (uint i = 0; i < aSize; i++) {
136     if (myViews[i]==0) {
137       myViews.insert(i, theView);
138       return true;
139     }
140   }
141   return false;
142 }
143
144
145 //***************************************************************
146 void SUIT_ViewManager::onDeleteView(SUIT_ViewWindow* theView)
147 {
148   emit deleteView(theView);
149   removeView(theView);
150 }
151
152 //***************************************************************
153 void SUIT_ViewManager::removeView(SUIT_ViewWindow* theView) 
154 {
155   theView->disconnect(this);
156   myViews.remove(myViews.find(theView));
157   if (myActiveView == theView)
158     myActiveView = 0;
159   int aNumItems = myViews.count();
160   if (aNumItems == 0)
161     emit lastViewClosed(this);
162 }
163
164 //***************************************************************
165 void SUIT_ViewManager::onMousePressed(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
166 {
167   emit mousePress(theView, theEvent);
168 }
169
170 //***************************************************************
171 void SUIT_ViewManager::onWindowActivated(SUIT_ViewWindow* view)
172 {
173   if (view) {
174     unsigned int aSize = myViews.size();
175     for (uint i = 0; i < aSize; i++) {
176       if (myViews[i] && myViews[i] == view) {
177         myActiveView = view;
178         emit activated( this );
179         return;
180       }
181     }
182   }
183 }
184
185 //***************************************************************
186 void SUIT_ViewManager::closeAllViews()
187 {
188   unsigned int aSize = myViews.size();
189   for (uint i = 0; i < aSize; i++) {
190     if (myViews[i])
191       myViews[i]->close();
192   }
193 }
194
195
196 //***************************************************************
197 QString  SUIT_ViewManager::getType() const 
198
199   return (!myViewModel)? "": myViewModel->getType(); 
200 }
201
202 //***************************************************************
203 SUIT_Study* SUIT_ViewManager::study() const
204 {
205     return myStudy;
206 }
207
208 //***************************************************************
209 void SUIT_ViewManager::onDeleteStudy()
210 {
211     myStudy = NULL;
212 }
213
214 //***************************************************************
215 void SUIT_ViewManager::onContextMenuRequested( QContextMenuEvent* e )
216 {
217   /*! invoke method of SUIT_PopupClient, which notifies about popup*/
218   contextMenuRequest( e );
219 }
220
221 //***************************************************************
222 void SUIT_ViewManager::contextMenuPopup( QPopupMenu* popup )
223 {
224   SUIT_ViewModel* vm = getViewModel();
225   if ( vm )
226     vm->contextMenuPopup( popup );
227 }