Salome HOME
dd48c05516ac02bc33acc473f8a78d2d15fcc92d
[modules/gui.git] / src / OCCViewer / OCCViewer_ViewFrame.cxx
1 // Copyright (C) 2007-2022  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 #include "OCCViewer_ViewFrame.h"
24 #include "OCCViewer_ViewWindow.h"
25 #include "OCCViewer_ViewModel.h"
26 #include "OCCViewer_ViewPort3d.h"
27
28 #include <SUIT_ViewManager.h>
29 #include <SUIT_Session.h>
30 #include <SUIT_ResourceMgr.h>
31
32 #include <QtxResourceMgr.h>
33 #include <QtxWorkstackAction.h>
34
35 #include <QFrame>
36 #include <QLayout>
37 #include <QApplication>
38
39 OCCViewer_ViewFrame::OCCViewer_ViewFrame(SUIT_Desktop* theDesktop, OCCViewer_Viewer* theModel)
40   : OCCViewer_ViewWindow( theDesktop, theModel ), mySplitMode(-1), myPopupRequestedView(0)
41 {
42   QFrame* centralFrame = new QFrame( this );
43   setCentralWidget( centralFrame );
44
45   OCCViewer_ViewWindow* view0 = theModel->createSubWindow();
46   updateWindowTitle( view0 );
47   view0->setParent( centralFrame );
48   myViews.append( view0 ); // MAIN_VIEW
49
50   myLayout = new QGridLayout( centralFrame );
51   myLayout->setMargin( 0 );
52   myLayout->setSpacing( 1 );
53
54   myLayout->addWidget( view0, 0, 0 );
55   myMaximizedView = view0;
56   myActiveView = view0;
57   connectViewSignals(view0);
58 }
59
60 OCCViewer_ViewFrame::~OCCViewer_ViewFrame()
61 {
62 }
63
64 bool OCCViewer_ViewFrame::event( QEvent* e )
65 {
66   if ( e->type() == QEvent::WindowTitleChange ) {
67     updateWindowTitle( getView( MAIN_VIEW ) );
68     updateWindowTitle( getView( BOTTOM_LEFT ) );
69     updateWindowTitle( getView( TOP_LEFT ) );
70     updateWindowTitle( getView( TOP_RIGHT ) );
71   }
72   return OCCViewer_ViewWindow::event( e );
73 }
74
75 //**************************************************************************************
76 OCCViewer_ViewWindow* OCCViewer_ViewFrame::getView( const int i ) const
77 {
78   return ( i >= 0 && i < myViews.count() ) ? myViews.at( i ) : 0 ;
79 }
80
81 //**************************************************************************************
82 OCCViewer_ViewWindow* OCCViewer_ViewFrame::getActiveView( ) const
83 {
84   return myActiveView;
85 }
86
87 //**************************************************************************************
88 void OCCViewer_ViewFrame::setViewManager( SUIT_ViewManager* theMgr )
89 {
90   OCCViewer_ViewWindow::setViewManager(theMgr);
91   foreach (OCCViewer_ViewWindow* aView, myViews) {
92     aView->setViewManager(theMgr); 
93   }
94 }
95
96 //**************************************************************************************
97 void OCCViewer_ViewFrame::returnTo3dView()
98 {
99   OCCViewer_ViewWindow* view = 0;
100   for (int i = BOTTOM_RIGHT; i <= TOP_RIGHT; i++ ) {
101     view = myViews.at(i);
102     view->setVisible( view->get2dMode() == No2dMode );
103     view->setMaximized( true, false );
104     if (view->get2dMode() == No2dMode) {
105       myMaximizedView = view;
106       myActiveView = view;
107     }
108   }
109   myLayout->setColumnStretch(0, 0);
110   myLayout->setColumnStretch(1, 0);
111   myLayout->addWidget( myMaximizedView, 0, 0 );
112   mySplitMode = -1;
113   myViewsMode.clear();
114   myLayout->invalidate();
115 }
116
117 //**************************************************************************************
118 void OCCViewer_ViewFrame::onMaximizedView( OCCViewer_ViewWindow* theView, bool isMaximized)
119 {
120   myMaximizedView = theView;
121   myActiveView = theView;
122   if (isMaximized) {
123     if (myViews.count() <= 1)
124       return;
125     myLayout->setColumnStretch(0, 0);
126     myLayout->setColumnStretch(1, 0);
127     myLayout->addWidget( theView, 0, 0 );
128     int i = 0;
129     OCCViewer_ViewWindow* view = 0;
130     for ( i = BOTTOM_RIGHT; i <= TOP_RIGHT; i++ ) {
131       view = myViews.at(i);
132       view->setVisible( view == theView );
133       view->setMaximized( view == theView, false );
134     }
135     mySplitMode = -1;
136     myViewsMode.clear();
137   }
138   else {
139     createSubViews();
140
141     QtxSplitDlg CreateSubViewsDlg( this, NULL, CreateSubViews );
142     if ( CreateSubViewsDlg.exec() ) {
143       mySplitMode = CreateSubViewsDlg.getSplitMode();
144       myViewsMode = CreateSubViewsDlg.getViewsMode();
145       splitSubViews();
146       myMaximizedView->setMaximized(false, false);
147     }
148   }
149   myLayout->invalidate();
150 }
151
152 //**************************************************************************************
153 void OCCViewer_ViewFrame::createSubViews()
154 {
155   OCCViewer_Viewer* aModel = dynamic_cast<OCCViewer_Viewer*>(myManager->getViewModel());
156   if (!aModel) return;
157   int i = 0;
158   if (myViews.count() == 1) {
159     //QColor aColor = myViews.at( MAIN_VIEW )->backgroundColor();
160     OCCViewer_ViewWindow* view = 0;
161     for ( i = BOTTOM_LEFT; i <= TOP_RIGHT; i++) {
162       view = aModel->createSubWindow();
163       view->set2dMode( (Mode2dType) i );
164       view->setParent( centralWidget() );
165       view->setViewManager(myManager);
166       updateWindowTitle( view );
167       myViews.append( view );
168       aModel->initView(view);
169       view->setMaximized(false, false);
170       view->setDropDownButtons( dropDownButtons() );
171       connectViewSignals(view);
172       view->setBackground(aModel->background(i));
173       setSubViewParams( view );
174     }
175   }
176 }
177
178 //**************************************************************************************
179 void OCCViewer_ViewFrame::setSubViewParams( OCCViewer_ViewWindow* theView )
180 {
181   Handle(V3d_View) aView = theView->getViewPort()->getView();
182   Handle(V3d_View) aMainView = myViews.at( MAIN_VIEW )->getViewPort()->getView();
183
184   // set ray tracing parameters
185   aView->ChangeRenderingParams() = aMainView->RenderingParams();
186
187   // set environment texture parameters
188   aView->SetTextureEnv( aMainView->TextureEnv() );
189 }
190
191 void OCCViewer_ViewFrame::splitSubViews()
192 {
193         if( mySplitMode == -1 )
194                 return;
195
196   int aNbViews = 1;
197   if ( mySplitMode >= 0 && mySplitMode < 2)
198     aNbViews = 2;
199   else if( mySplitMode >= 2 && mySplitMode < 8 )
200     aNbViews = 3;
201   else if( mySplitMode >=8 && mySplitMode < 29 )
202     aNbViews = 4;
203
204   if( aNbViews != myViewsMode.count() )
205     return;
206
207   int SubViews3Map[6][3][4] = {
208     { {0,0,1,1}, {0,1,1,1}, {0,2,1,1} },
209     { {0,0,1,1}, {1,0,1,1}, {2,0,1,1} },
210     { {0,0,1,1}, {1,0,1,1}, {0,1,2,1} },
211     { {0,0,2,1}, {0,1,1,1}, {1,1,1,1} },
212     { {0,0,1,2}, {1,0,1,1}, {1,1,1,1} },
213     { {0,0,1,1}, {0,1,1,1}, {1,0,1,2} }
214   };
215
216   int SubViews4Map[21][4][4] = {
217     { {0,0,1,1}, {0,1,1,1}, {0,2,1,1}, {0,3,1,1} },
218     { {0,0,1,1}, {1,0,1,1}, {2,0,1,1}, {3,0,1,1} },
219     { {0,0,1,1}, {0,1,1,1}, {1,0,1,1}, {1,1,1,1} },
220     { {0,0,1,1}, {1,0,1,1}, {0,1,2,1}, {0,2,2,1} },
221     { {0,0,2,1}, {0,1,1,1}, {1,1,1,1}, {0,2,2,1} },
222     { {0,0,2,1}, {0,1,2,1}, {0,2,1,1}, {1,2,1,1} },
223     { {0,0,1,1}, {0,1,1,1}, {1,0,1,2}, {2,0,1,2} },
224     { {0,0,1,2}, {1,0,1,1}, {1,1,1,1}, {2,0,1,2} },
225     { {0,0,1,2}, {1,0,1,2}, {2,0,1,1}, {2,1,1,1} },
226     { {0,0,1,1}, {1,0,1,1}, {0,1,2,1}, {2,0,1,2} },
227     { {0,0,2,1}, {0,1,1,1}, {1,1,1,1}, {2,0,1,2} },
228     { {0,0,1,2}, {1,0,1,1}, {2,0,1,1}, {1,1,2,1} },
229     { {0,0,1,2}, {1,0,2,1}, {1,1,1,1}, {2,1,1,1} },
230     { {0,0,2,1}, {0,1,1,1}, {0,2,1,1}, {1,1,1,2} },
231     { {0,0,2,1}, {0,1,1,2}, {1,1,1,1}, {1,2,1,1} },
232     { {0,0,1,1}, {0,1,1,1}, {1,0,1,2}, {0,2,2,1} },
233     { {0,0,1,2}, {1,0,1,1}, {1,1,1,1}, {0,2,2,1} },
234     { {0,0,1,3}, {1,0,1,1}, {1,1,1,1}, {1,2,1,1} },
235     { {0,0,1,1}, {0,1,1,1}, {0,2,1,1}, {1,0,1,3} },
236     { {0,0,1,1}, {1,0,1,1}, {2,0,1,1}, {0,1,3,1} },
237     { {0,0,3,1}, {0,1,1,1}, {1,1,1,1}, {2,1,1,1} },
238   };
239
240   if( aNbViews == 2 ) {
241     if( mySplitMode == 0 ) {
242       myLayout->addWidget( myViews.at(myViewsMode[0]), 0,0,2,1 );
243       myLayout->addWidget( myViews.at(myViewsMode[1]), 0,1,2,1 );
244     }
245     else if( mySplitMode == 1 ) {
246       myLayout->addWidget( myViews.at(myViewsMode[0]), 0,0,1,2 );
247       myLayout->addWidget( myViews.at(myViewsMode[1]), 1,0,1,2 );
248     }
249   }
250   else if( aNbViews == 3 ) {
251         int aSplitMode = mySplitMode - 2;
252     for( int i = 0; i < 3; i++ ) {
253     myLayout->addWidget( myViews.at(myViewsMode[i]),
254                          SubViews3Map[aSplitMode][i][0],
255                          SubViews3Map[aSplitMode][i][1],
256                          SubViews3Map[aSplitMode][i][2],
257                          SubViews3Map[aSplitMode][i][3]);
258     }
259   }
260   else if( aNbViews == 4 ) {
261         int aSplitMode = mySplitMode - 8;
262     for( int i = 0; i < 4; i++ ) {
263     myLayout->addWidget( myViews.at(myViewsMode[i]),
264                          SubViews4Map[aSplitMode][i][0],
265                          SubViews4Map[aSplitMode][i][1],
266                          SubViews4Map[aSplitMode][i][2],
267                          SubViews4Map[aSplitMode][i][3]);
268     }
269   }
270
271   OCCViewer_ViewWindow* view = 0;
272   bool isVisible3dView = false;
273   for ( int i = 0; i< myViews.count(); i++ ) {
274     view = myViews.at(i);
275     bool isShowed = false;
276     for( int j = 0; j < myViewsMode.count(); j++ ) {
277       OCCViewer_ViewWindow* view2 = 0;
278       view2 = myViews.at( myViewsMode[j] );
279       if( view == view2 )
280         isShowed = true;
281     }
282     if( isShowed ) {
283       view->show();
284       view->setMaximized( false, false );
285       if ( view->get2dMode() == No2dMode ) isVisible3dView = true;
286       ///////////////QApplication::processEvents(); // VSR: hangs up ?
287       if ( view != myMaximizedView )
288         view->onViewFitAll();
289     }
290     else
291       view->setVisible( false );
292   }
293   if ( !isVisible3dView ) {
294     for ( int i = 0; i< myViews.count(); i++ ){
295       view = myViews.at(i);
296       if( view->isVisible() )
297         view->setReturnedTo3dView( false );
298     }
299   }
300 }
301
302 //**************************************************************************************
303 OCCViewer_ViewPort3d* OCCViewer_ViewFrame::getViewPort(int theView) 
304
305   return getView(theView)? getView(theView)->getViewPort() : 0;
306 }
307   
308 //**************************************************************************************
309 void OCCViewer_ViewFrame::updateEnabledDrawMode() 
310
311   foreach (OCCViewer_ViewWindow* aView, myViews) {
312     aView->updateEnabledDrawMode(); 
313   }
314 }
315
316 //**************************************************************************************
317 void OCCViewer_ViewFrame::setCuttingPlane( bool on, const double x , const double y , const double z,
318                                            const double dx, const double dy, const double dz)  
319
320   foreach (OCCViewer_ViewWindow* aView, myViews) {
321     aView->setCuttingPlane(on, x, y, z, dx, dy, dz); 
322     aView->update();
323   }
324 }
325
326 //**************************************************************************************
327 void OCCViewer_ViewFrame::setCuttingPlane( bool on, const gp_Pln thePln ) 
328
329   foreach (OCCViewer_ViewWindow* aView, myViews) {
330     aView->setCuttingPlane(on, thePln); 
331     aView->update();
332   }
333 }
334   
335 //**************************************************************************************
336 void OCCViewer_ViewFrame::setInteractionStyle( const int i ) 
337
338   foreach (OCCViewer_ViewWindow* aView, myViews) {
339     aView->setInteractionStyle(i); 
340   }
341 }
342
343 //**************************************************************************************
344 int OCCViewer_ViewFrame::projectionType() const
345 {
346   return getView(MAIN_VIEW)->projectionType();
347 }
348
349 //**************************************************************************************
350 void OCCViewer_ViewFrame::setProjectionType( int t)
351 {
352   foreach (OCCViewer_ViewWindow* aView, myViews) {
353     aView->setProjectionType(t);
354   }
355 }
356
357 //**************************************************************************************
358 OCCViewer_ViewWindow::SelectionStyle OCCViewer_ViewFrame::selectionStyle() const
359 {
360   return getView(MAIN_VIEW)->selectionStyle();
361 }
362
363 //**************************************************************************************
364 void OCCViewer_ViewFrame::setSelectionStyle(OCCViewer_ViewWindow::SelectionStyle t)
365 {
366   foreach(OCCViewer_ViewWindow* aView, myViews) {
367     aView->setSelectionStyle(t);
368   }
369 }
370
371 //**************************************************************************************
372 int OCCViewer_ViewFrame::stereoType() const
373 {
374   return getView(MAIN_VIEW)->stereoType();
375 }
376
377 //**************************************************************************************
378 void OCCViewer_ViewFrame::setStereoType( int t)
379 {
380   foreach (OCCViewer_ViewWindow* aView, myViews) {
381     aView->setStereoType(t);
382   }
383 }
384
385 //**************************************************************************************
386 int OCCViewer_ViewFrame::anaglyphFilter() const
387 {
388   return getView(MAIN_VIEW)->anaglyphFilter();
389 }
390
391 //**************************************************************************************
392 void OCCViewer_ViewFrame::setAnaglyphFilter( int t)
393 {
394   foreach (OCCViewer_ViewWindow* aView, myViews) {
395     aView->setAnaglyphFilter(t);
396   }
397 }
398
399 //**************************************************************************************
400 int OCCViewer_ViewFrame::stereographicFocusType() const
401 {
402   return getView(MAIN_VIEW)->stereographicFocusType();
403 }
404
405 //**************************************************************************************
406 double OCCViewer_ViewFrame::stereographicFocusValue() const
407 {
408   return getView(MAIN_VIEW)->stereographicFocusValue();
409 }
410
411 //**************************************************************************************
412 void OCCViewer_ViewFrame::setStereographicFocus( int t, double v)
413 {
414   foreach (OCCViewer_ViewWindow* aView, myViews) {
415     aView->setStereographicFocus(t, v);
416   }
417 }
418
419 //**************************************************************************************
420 int OCCViewer_ViewFrame::interocularDistanceType() const
421 {
422   return getView(MAIN_VIEW)->interocularDistanceType();
423 }
424
425 //**************************************************************************************
426 double OCCViewer_ViewFrame::interocularDistanceValue() const
427 {
428   return getView(MAIN_VIEW)->interocularDistanceValue();
429 }
430
431 //**************************************************************************************
432 void OCCViewer_ViewFrame::setInterocularDistance( int t, double v)
433 {
434   foreach (OCCViewer_ViewWindow* aView, myViews) {
435     aView->setInterocularDistance(t, v);
436   }
437 }
438
439 //**************************************************************************************
440 bool OCCViewer_ViewFrame::isReverseStereo() const
441 {
442   return getView(MAIN_VIEW)->isReverseStereo();
443 }
444
445 //**************************************************************************************
446 void OCCViewer_ViewFrame::setReverseStereo( bool t)
447 {
448   foreach (OCCViewer_ViewWindow* aView, myViews) {
449     aView->setReverseStereo(t);
450   }
451 }
452
453 //**************************************************************************************
454 bool OCCViewer_ViewFrame::isVSync() const
455 {
456   return getView(MAIN_VIEW)->isVSync();
457 }
458
459 //**************************************************************************************
460 void OCCViewer_ViewFrame::setVSync( bool t)
461 {
462   foreach (OCCViewer_ViewWindow* aView, myViews) {
463     aView->setVSync(t);
464   }
465 }
466
467 //**************************************************************************************
468 bool OCCViewer_ViewFrame::isQuadBufferSupport() const
469 {
470   return getView(MAIN_VIEW)->isQuadBufferSupport();
471 }
472
473 //**************************************************************************************
474 void OCCViewer_ViewFrame::setQuadBufferSupport( bool t)
475 {
476   foreach (OCCViewer_ViewWindow* aView, myViews) {
477     aView->setQuadBufferSupport(t);
478   }
479 }
480
481 //**************************************************************************************
482 void OCCViewer_ViewFrame::setZoomingStyle( const int i ) 
483
484   foreach (OCCViewer_ViewWindow* aView, myViews) {
485     aView->setZoomingStyle(i); 
486   }
487 }
488   
489 //**************************************************************************************
490 void OCCViewer_ViewFrame::connectViewSignals(OCCViewer_ViewWindow* theView)
491 {
492   connect( theView, SIGNAL( returnedTo3d( ) ), this, SLOT( returnTo3dView( ) ) );
493
494   connect( theView, SIGNAL( maximized( OCCViewer_ViewWindow*, bool ) ), 
495            this, SLOT( onMaximizedView( OCCViewer_ViewWindow*, bool ) ) );
496
497   connect( theView, SIGNAL( wheeling(SUIT_ViewWindow*, QWheelEvent*) ), 
498            this, SIGNAL( wheeling(SUIT_ViewWindow*, QWheelEvent*) ) );
499
500   connect( theView, SIGNAL( keyReleased(SUIT_ViewWindow*, QKeyEvent*) ), 
501            this, SIGNAL( keyReleased(SUIT_ViewWindow*, QKeyEvent*) ) );
502   connect( theView, SIGNAL( keyPressed(SUIT_ViewWindow*, QKeyEvent*) ), 
503            this, SIGNAL( keyPressed(SUIT_ViewWindow*, QKeyEvent*) ) );
504
505   connect( theView, SIGNAL( mouseDoubleClicked(SUIT_ViewWindow*, QMouseEvent*) ), 
506            this, SIGNAL( mouseDoubleClicked(SUIT_ViewWindow*, QMouseEvent*) ) );
507   connect( theView, SIGNAL( mousePressed(SUIT_ViewWindow*, QMouseEvent*) ), 
508            this, SIGNAL( mousePressed(SUIT_ViewWindow*, QMouseEvent*) ) );
509   // The signal is used to mouse pressed for choose the current window
510   connect( theView, SIGNAL( mousePressed(SUIT_ViewWindow*, QMouseEvent*) ),
511            this, SLOT( onMousePressed(SUIT_ViewWindow*, QMouseEvent*) ) );
512   connect( theView, SIGNAL( mouseReleased(SUIT_ViewWindow*, QMouseEvent*) ), 
513            this, SIGNAL( mouseReleased(SUIT_ViewWindow*, QMouseEvent*) ) );
514   connect( theView, SIGNAL( mouseMoving(SUIT_ViewWindow*, QMouseEvent*) ), 
515            this, SIGNAL( mouseMoving(SUIT_ViewWindow*, QMouseEvent*) ) );
516
517   // The signal is used to process get/set background color from popup
518   connect( theView, SIGNAL( contextMenuRequested(QContextMenuEvent*) ), 
519            this, SLOT( onContextMenuRequested(QContextMenuEvent*) ) );
520
521   connect( theView, SIGNAL( contextMenuRequested(QContextMenuEvent*) ), 
522            this, SIGNAL( contextMenuRequested(QContextMenuEvent*) ) );
523
524   connect( theView, SIGNAL( viewCloned( SUIT_ViewWindow* ) ),
525            this,    SIGNAL( viewCloned( SUIT_ViewWindow* ) ) );
526 }
527
528 // obsolete
529 void OCCViewer_ViewFrame::setBackgroundColor( const QColor& theColor )
530 {
531   if (myPopupRequestedView)
532     myPopupRequestedView->setBackgroundColor(theColor); 
533   else {
534     foreach (OCCViewer_ViewWindow* aView, myViews) {
535       if (aView->isVisible())
536         aView->setBackgroundColor(theColor); 
537     }
538   }
539 }
540 void OCCViewer_ViewFrame::setBackground( const Qtx::BackgroundData& theBackground )
541 {
542   if (myPopupRequestedView)
543     myPopupRequestedView->setBackground(theBackground); 
544   else {
545     foreach (OCCViewer_ViewWindow* aView, myViews) {
546       if (aView->isVisible())
547         aView->setBackground(theBackground); 
548     }
549   }
550 }
551
552 void OCCViewer_ViewFrame::onViewFitAll()
553 {
554   foreach (OCCViewer_ViewWindow* aView, myViews) {
555     aView->onViewFitAll(); 
556   }
557 }
558
559 void OCCViewer_ViewFrame::onFitAll()
560 {
561   foreach (OCCViewer_ViewWindow* aView, myViews) {
562     aView->onFitAll(); 
563   }
564 }
565
566 // obsolete  
567 QColor OCCViewer_ViewFrame::backgroundColor() const 
568
569   if (myPopupRequestedView)
570     return myPopupRequestedView->backgroundColor(); 
571
572   foreach (OCCViewer_ViewWindow* aView, myViews) {
573     if (aView->isVisible())
574       return aView->backgroundColor(); 
575   }
576   return getView(MAIN_VIEW)->backgroundColor(); 
577 }
578
579 Qtx::BackgroundData OCCViewer_ViewFrame::background() const 
580
581   if (myPopupRequestedView)
582     return myPopupRequestedView->background(); 
583
584   foreach (OCCViewer_ViewWindow* aView, myViews) {
585     if (aView->isVisible())
586       return aView->background(); 
587   }
588   return getView(MAIN_VIEW)->background(); 
589 }
590
591 void OCCViewer_ViewFrame::showStaticTrihedron( bool on )
592 {
593   if ( myPopupRequestedView )
594     myPopupRequestedView->showStaticTrihedron( on ); 
595   else {
596     foreach ( OCCViewer_ViewWindow* aView, myViews ) {
597       aView->showStaticTrihedron( on ); 
598     }
599   }
600 }
601
602 QImage OCCViewer_ViewFrame::dumpView()
603 {
604   foreach (OCCViewer_ViewWindow* aView, myViews) {
605     if (aView->isVisible())
606       return aView->dumpView();
607   }
608   return QImage();
609 }
610
611 bool OCCViewer_ViewFrame::dumpViewToFormat( const QImage& image, const QString& fileName, const QString& format )
612 {
613   foreach (OCCViewer_ViewWindow* aView, myViews) {
614     if (aView->isVisible())
615       return aView->dumpViewToFormat( image, fileName, format );
616   }
617   return false;
618 }
619
620 void OCCViewer_ViewFrame::onContextMenuRequested(QContextMenuEvent*)
621 {
622   myPopupRequestedView = dynamic_cast<OCCViewer_ViewWindow*>(sender());
623 }
624
625 void OCCViewer_ViewFrame::onMousePressed(SUIT_ViewWindow* view, QMouseEvent*)
626 {
627   myActiveView = dynamic_cast<OCCViewer_ViewWindow*>(view);
628 }
629
630 void OCCViewer_ViewFrame::onDumpView()
631 {
632   if (myPopupRequestedView) {
633     myPopupRequestedView->onDumpView(); 
634   }
635   else {
636     getView(MAIN_VIEW)->onDumpView(); 
637   }
638 }
639
640 void OCCViewer_ViewFrame::setDropDownButtons( bool on )
641 {
642   foreach( OCCViewer_ViewWindow* aView, myViews ) {
643     aView->setDropDownButtons( on );
644   }
645   OCCViewer_ViewWindow::setDropDownButtons( on );
646 }
647
648 QString OCCViewer_ViewFrame::getVisualParameters()
649 {
650   QStringList params;
651   QStringList splitParams;
652   if( mySplitMode != -1 && myViewsMode.count() != 0 ) {
653     splitParams << QString::number( mySplitMode );
654     foreach ( int aViewMode, myViewsMode )
655       splitParams << QString::number( aViewMode );
656     params.append( splitParams.join("*") );
657   }
658   else
659     params.append( QString::number( mySplitMode ) );
660   int maximizedView = 999;
661   for ( int i = BOTTOM_RIGHT; i <= TOP_RIGHT && i < myViews.count(); i++) {
662     if ( getView(i)->isVisible() )
663       maximizedView = ( maximizedView != -1 ) ? ( maximizedView == 999 ? i : -1 ) : ( maximizedView );
664     params << getView(i)->getVisualParameters();
665   }
666   params.prepend( QString::number( maximizedView ) );
667   return params.join( "|" );
668 }
669
670 void OCCViewer_ViewFrame::setVisualParameters( const QString& parameters ) 
671 {
672   QStringList params = parameters.split( "|" );
673   if ( params.count() > 1 ) {
674     int maximizedView = params[0].toInt();
675     if ( myViews.count() < params.count()-2 )
676       createSubViews(); // secondary views are not created yet, but should be
677
678     for ( int i = 2; i < params.count(); i++ ) {
679       int idx = i-2;
680       getView( idx )->setVisualParameters( params[i] );
681     }
682
683     QStringList aSplitParams = params[1].split("*");
684     if( aSplitParams.count() > 1 ) {
685       mySplitMode = aSplitParams[0].toInt();
686       for( int i = 1; i < aSplitParams.count(); i++ )
687         myViewsMode << aSplitParams[i].toInt();
688     }
689     if( mySplitMode != -1 )
690       splitSubViews();
691     else
692       onMaximizedView( getView( maximizedView ), true ); // set proper sub-window maximized
693   }
694   else {
695     // handle obsolete versions - no parameters for xy, yz, xz views
696     getView(MAIN_VIEW)->setVisualParameters( parameters );
697   }
698 }
699
700 SUIT_CameraProperties OCCViewer_ViewFrame::cameraProperties()
701 {
702   // view frame does not have camera properties
703   return SUIT_CameraProperties();
704 }
705
706 void OCCViewer_ViewFrame::updateWindowTitle(OCCViewer_ViewWindow* theView)
707 {
708   if ( !theView )
709     return;
710   QString title;
711   switch ( theView->get2dMode() ) {
712   case No2dMode:
713     title = "3D"; break;
714   case XYPlane:
715     title = "YX"; break;
716   case XZPlane:
717     title = "XZ"; break;
718   case YZPlane:
719     title = "YZ"; break;
720   default:
721     break;
722   }
723   if ( !title.isEmpty() )
724     theView->setWindowTitle( windowTitle() + " - " + title );
725 }
726
727 void OCCViewer_ViewFrame::enableSelection( bool isEnabled )
728 {
729   foreach (OCCViewer_ViewWindow* aView, myViews) {
730     aView->enableSelection(isEnabled); 
731   }
732 }
733
734 void OCCViewer_ViewFrame::enablePreselection( bool isEnabled )
735 {
736   foreach (OCCViewer_ViewWindow* aView, myViews) {
737     aView->enablePreselection(isEnabled); 
738   }
739 }
740
741 bool OCCViewer_ViewFrame::enableDrawMode( bool on )
742 {
743   bool prev = false;
744   foreach (OCCViewer_ViewWindow* aView, myViews) {
745     prev = prev || aView->enableDrawMode( on ); 
746   }
747   return prev;
748 }