Salome HOME
Merge branch 'master' of https://git.salome-platform.org/git/modules/gui
[modules/gui.git] / src / OCCViewer / OCCViewer_ViewWindow.cxx
index d8002d6372bd590aee1fb64f122a9cb2afc89629..a0e96792bba525452df09cffa38363629dd3dc4c 100755 (executable)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -35,8 +35,6 @@
 #include "OCCViewer_CubeAxesDlg.h"
 #include "OCCViewer_ClippingDlg.h"
 
-#include <Basics_OCCTVersion.hxx>
-
 #include <SUIT_Desktop.h>
 #include <SUIT_Session.h>
 #include <SUIT_ViewManager.h>
@@ -49,7 +47,7 @@
 #include <QtxMultiAction.h>
 #include <QtxRubberBand.h>
 
-#include <OpenGLUtils_FrameBuffer.h>
+#include <Basics_OCCTVersion.hxx>
 
 #include <QPainter>
 #include <QTime>
@@ -57,6 +55,7 @@
 #include <QKeyEvent>
 #include <QMouseEvent>
 #include <QApplication>
+#include <QActionGroup>
 #include <QMenu>
 
 #include <AIS_ListOfInteractive.hxx>
 #include <GProp_GProps.hxx>
 #include <TopoDS.hxx>
 
+#include <Graphic3d_SequenceOfHClipPlane.hxx>
+#include <Graphic3d_ClipPlane.hxx>
+#include <OpenGl_GraphicDriver.hxx>
+#include <OpenGLUtils_FrameBuffer.h>
+
 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
 #include <Graphic3d_MapOfStructure.hxx>
 #include <Graphic3d_Structure.hxx>
 #include <Graphic3d_ExportFormat.hxx>
+#if OCC_VERSION_LARGE > 0x06090000
+#include <Graphic3d_StereoMode.hxx>
+#include <Graphic3d_RenderingParams.hxx>
+#endif
+
 
 #include <Visual3d_View.hxx>
 #include <V3d_Plane.hxx>
 #include <gp_GTrsf.hxx>
 #include <TColgp_Array1OfPnt2d.hxx>
 
-#if OCC_VERSION_LARGE > 0x06060000 
-#include <Graphic3d_SequenceOfHClipPlane.hxx>
-#include <Graphic3d_ClipPlane.hxx>
-
-#endif
-
 #include <Image_PixMap.hxx>
 
 #include <Standard_Version.hxx>
@@ -107,6 +110,12 @@ static QEvent* l_mbPressEvent = 0;
 
 #include <GL/gl.h>
 
+// To avoid conflict between KeyPress from the X.h (define KeyPress 2)
+// and QEvent::KeyPress (qevent.h)
+#ifdef KeyPress
+#undef KeyPress
+#endif
+
 const char* imageZoomCursor[] = {
 "32 32 3 1",
 ". c None",
@@ -234,12 +243,13 @@ OCCViewer_ViewWindow::OCCViewer_ViewWindow( SUIT_Desktop*     theDesktop,
   myModel = theModel;
   myRestoreFlag = 0;
   myEnableDrawMode = false;
+  myDrawRectEnabled = true;
   myDrawRect=false;
   updateEnabledDrawMode();
   myScalingDlg = 0;
   mySetRotationPointDlg = 0;
   myRectBand = 0;
-  
+
   IsSketcherStyle = false;
   myIsKeyFree = false;
 
@@ -251,9 +261,9 @@ OCCViewer_ViewWindow::OCCViewer_ViewWindow( SUIT_Desktop*     theDesktop,
   myPreselectionEnabled = true;
   mySelectionEnabled = true;
 
+  myCursorIsHand = false;
 
   clearViewAspects();
-  
 }
 
 /*!
@@ -302,7 +312,7 @@ void OCCViewer_ViewWindow::initLayout()
   QtxAction* anAction = dynamic_cast<QtxAction*>( toolMgr()->action( GraduatedAxesId ) );
   myCubeAxesDlg = new OCCViewer_CubeAxesDlg( anAction, this, "OCCViewer_CubeAxesDlg" );
   myCubeAxesDlg->initialize();
-  
+
   connect( myViewPort, SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ), this, SLOT( emitViewModified() ) );
 }
 
@@ -366,14 +376,29 @@ bool OCCViewer_ViewWindow::eventFilter( QObject* watched, QEvent* e )
     case QEvent::Wheel:
       {
         QWheelEvent* aEvent = (QWheelEvent*) e;
-  myViewPort->startZoomAtPoint( aEvent->x(), aEvent->y() );
-  double delta = (double)( aEvent->delta() ) / ( 15 * 8 );
-  int x  = aEvent->x();
-  int y  = aEvent->y();
-  int x1 = (int)( aEvent->x() + width()*delta/100 );
-  int y1 = (int)( aEvent->y() + height()*delta/100 );
-  myViewPort->zoom( x, y, x1, y1 );
-  myViewPort->getView()->ZFitAll();
+
+        if ( aEvent->modifiers().testFlag(Qt::ControlModifier) ) {
+          Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
+          if ( isPreselectionEnabled() && ic->HasOpenedContext() ) {
+            if ( aEvent->delta() > 0 ) {
+              ic->HilightNextDetected( myViewPort->getView() );
+            } else {
+              ic->HilightPreviousDetected( myViewPort->getView() );
+            }
+          }
+        }
+        else {
+          emit vpTransformationStarted ( ZOOMVIEW );
+          myViewPort->startZoomAtPoint( aEvent->x(), aEvent->y() );
+          double delta = (double)( aEvent->delta() ) / ( 15 * 8 );
+          int x  = aEvent->x();
+          int y  = aEvent->y();
+          int x1 = (int)( aEvent->x() + width()*delta/100 );
+          int y1 = (int)( aEvent->y() + height()*delta/100 );
+          myViewPort->zoom( x, y, x1, y1 );
+          myViewPort->getView()->ZFitAll();
+          emit vpTransformationFinished ( ZOOMVIEW );
+        }
       }
       return true;
 
@@ -396,13 +421,25 @@ bool OCCViewer_ViewWindow::eventFilter( QObject* watched, QEvent* e )
   return SUIT_ViewWindow::eventFilter(watched, e);
 }
 
+/*!
+  \brief Enable / disable draw rect (rubber band) mode
+*/
+bool OCCViewer_ViewWindow::enableDrawMode( bool on )
+{
+  bool prev = myDrawRectEnabled;
+  myDrawRectEnabled = on;
+  updateEnabledDrawMode();
+  return prev;
+}
+
 /*!
   \brief Update state of enable draw mode state.
 */
 void OCCViewer_ViewWindow::updateEnabledDrawMode()
 {
+  myEnableDrawMode = myDrawRectEnabled;
   if ( myModel )
-    myEnableDrawMode = myModel->isSelectionEnabled() && myModel->isMultiSelectionEnabled();
+    myEnableDrawMode = myEnableDrawMode && myModel->isSelectionEnabled() && myModel->isMultiSelectionEnabled();
 }
 
 /*!
@@ -416,10 +453,10 @@ void OCCViewer_ViewWindow::vpMousePressEvent( QMouseEvent* theEvent )
   int anInteractionStyle = interactionStyle();
 
   // in "key free" interaction style zoom operation is activated by two buttons (simultaneously pressed),
-  // which are assigned for pan and rotate - these operations are activated immediately after pressing 
+  // which are assigned for pan and rotate - these operations are activated immediately after pressing
   // of the first button, so it is necessary to switch to zoom when the second button is pressed
   bool aSwitchToZoom = false;
-  if ( anInteractionStyle == SUIT_ViewModel::KEY_FREE && 
+  if ( anInteractionStyle == SUIT_ViewModel::KEY_FREE &&
        ( myOperation == PANVIEW || myOperation == ROTATE ) ) {
     aSwitchToZoom = getButtonState( theEvent, anInteractionStyle ) == ZOOMVIEW;
   }
@@ -541,7 +578,7 @@ void OCCViewer_ViewWindow::vpMousePressEvent( QMouseEvent* theEvent )
     }
     /* notify that we start a transformation */
     if ( transformRequested() )
-            emit vpTransformationStarted ( myOperation );
+      emit vpTransformationStarted ( myOperation );
   }
   if ( transformRequested() )
     setTransformInProcess( true );
@@ -561,7 +598,7 @@ void OCCViewer_ViewWindow::vpMousePressEvent( QMouseEvent* theEvent )
 void OCCViewer_ViewWindow::activateZoom()
 {
   if ( !transformRequested() && !myCursorIsHand )
-    myCursor = cursor();                /* save old cursor */
+    saveCursor();                /* save old cursor */
 
   if ( myOperation != ZOOMVIEW ) {
     QPixmap zoomPixmap (imageZoomCursor);
@@ -580,7 +617,7 @@ void OCCViewer_ViewWindow::activateZoom()
 void OCCViewer_ViewWindow::activatePanning()
 {
   if ( !transformRequested() && !myCursorIsHand )
-    myCursor = cursor();                // save old cursor
+    saveCursor();                // save old cursor
 
   if ( myOperation != PANVIEW ) {
     QCursor panCursor (Qt::SizeAllCursor);
@@ -597,7 +634,7 @@ void OCCViewer_ViewWindow::activatePanning()
 void OCCViewer_ViewWindow::activateRotation()
 {
   if ( !transformRequested() && !myCursorIsHand )
-    myCursor = cursor();                // save old cursor
+    saveCursor();                // save old cursor
 
   if ( myOperation != ROTATE ) {
     QPixmap rotatePixmap (imageRotateCursor);
@@ -650,11 +687,20 @@ bool OCCViewer_ViewWindow::computeGravityCenter( double& theX, double& theY, dou
 
   for( ; aStructureIt.More(); aStructureIt.Next() ) {
     const Handle(Graphic3d_Structure)& aStructure = aStructureIt.Key();
-    if ( aStructure->IsEmpty() ) {
+    if ( aStructure->IsEmpty() || !aStructure->IsVisible() || aStructure->CStructure()->IsForHighlight )
       continue;
-    }
 
+#if OCC_VERSION_LARGE > 0x06070100
+    Bnd_Box aBox = aStructure->MinMaxValues();
+    aXmin = aBox.IsVoid() ? RealFirst() : aBox.CornerMin().X();
+    aYmin = aBox.IsVoid() ? RealFirst() : aBox.CornerMin().Y();
+    aZmin = aBox.IsVoid() ? RealFirst() : aBox.CornerMin().Z();
+    aXmax = aBox.IsVoid() ? RealLast()  : aBox.CornerMax().X();
+    aYmax = aBox.IsVoid() ? RealLast()  : aBox.CornerMax().Y();
+    aZmax = aBox.IsVoid() ? RealLast()  : aBox.CornerMax().Z();
+#else
     aStructure->MinMaxValues( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax );
+#endif
 
     // Infinite structures are skipped
     Standard_Real aLIM = ShortRealLast() - 1.0;
@@ -797,7 +843,7 @@ void OCCViewer_ViewWindow::activateStartPointSelection( TopAbs_ShapeEnum theShap
   {
     QCursor handCursor (Qt::PointingHandCursor);
     myCursorIsHand = true;
-    myCursor = cursor();
+    saveCursor();
     myViewPort->setCursor( handCursor );
   }
   myRotationPointSelection = true;
@@ -816,7 +862,7 @@ void OCCViewer_ViewWindow::activateGlobalPanning()
     QCursor glPanCursor (globalPanPixmap);
     myCurScale = aView3d->Scale();
     aView3d->FitAll(0.01, false);
-    myCursor = cursor();                // save old cursor
+    saveCursor();                // save old cursor
     myViewPort->fitAll(); // fits view before selecting a new scene center
     if( setTransformRequested( PANGLOBAL ) )
       myViewPort->setCursor( glPanCursor );
@@ -831,7 +877,7 @@ void OCCViewer_ViewWindow::activateGlobalPanning()
 void OCCViewer_ViewWindow::activateWindowFit()
 {
   if ( !transformRequested() && !myCursorIsHand )
-    myCursor = cursor();                /* save old cursor */
+    saveCursor();                /* save old cursor */
 
   if ( myOperation != WINDOWFIT ) {
     QCursor handCursor (Qt::PointingHandCursor);
@@ -850,7 +896,7 @@ bool OCCViewer_ViewWindow::setTransformRequested( OperationType op )
 {
   bool ok = transformEnabled( op );
   myOperation = ok ? op : NOTHING;
-  myViewPort->setMouseTracking( myOperation == NOTHING );  
+  myViewPort->setMouseTracking( myOperation == NOTHING );
   return ok;
 }
 
@@ -926,7 +972,7 @@ void OCCViewer_ViewWindow::vpMouseMoveEvent( QMouseEvent* theEvent )
           if ( !myCursorIsHand )        {   // we are going to sketch a rectangle
             QCursor handCursor (Qt::PointingHandCursor);
             myCursorIsHand = true;
-            myCursor = cursor();
+            saveCursor();
             myViewPort->setCursor( handCursor );
           }
         }
@@ -1086,7 +1132,7 @@ void OCCViewer_ViewWindow::drawRect()
     //myRectBand->setPalette(palette);
   }
   //myRectBand->hide();
-  
+
   myRectBand->setUpdatesEnabled ( false );
   QRect aRect = SUIT_Tools::makeRect(myStartX, myStartY, myCurrX, myCurrY);
   myRectBand->initGeometry( aRect );
@@ -1126,7 +1172,7 @@ void OCCViewer_ViewWindow::createActions()
 {
   if( !toolMgr()->isEmpty() )
     return;
-  
+
   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
 
   QtxAction* aAction;
@@ -1151,7 +1197,14 @@ void OCCViewer_ViewWindow::createActions()
   aAction->setStatusTip(tr("DSC_FITRECT"));
   connect(aAction, SIGNAL(triggered()), this, SLOT(activateWindowFit()));
   toolMgr()->registerAction( aAction, FitRectId );
-  
+
+  // FitSelection
+  aAction = new QtxAction(tr("MNU_FITSELECTION"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_FITSELECTION" ) ),
+                           tr( "MNU_FITSELECTION" ), 0, this);
+  aAction->setStatusTip(tr("DSC_FITSELECTION"));
+  connect(aAction, SIGNAL(triggered()), this, SLOT(onFitSelection()));
+  toolMgr()->registerAction( aAction, FitSelectionId );
+
   // Zoom
   aAction = new QtxAction(tr("MNU_ZOOM_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_ZOOM" ) ),
                            tr( "MNU_ZOOM_VIEW" ), 0, this);
@@ -1216,7 +1269,7 @@ void OCCViewer_ViewWindow::createActions()
   connect(aAction, SIGNAL(triggered()), this, SLOT(onBottomView()));
   this->addAction(aAction);
   toolMgr()->registerAction( aAction, BottomId );
-  
+
   aAction = new QtxAction(tr("MNU_LEFT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_LEFT" ) ),
                            tr( "MNU_LEFT_VIEW" ), 0, this, false, "Viewers:Left view");
   aAction->setStatusTip(tr("DSC_LEFT_VIEW"));
@@ -1247,6 +1300,36 @@ void OCCViewer_ViewWindow::createActions()
   this->addAction(aAction);
   toolMgr()->registerAction( aAction, ClockWiseId );
 
+  // Projection mode group
+
+  // - orthographic projection
+  aAction = new QtxAction(tr("MNU_ORTHOGRAPHIC_MODE"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_ORTHOGRAPHIC" ) ),
+                          tr( "MNU_ORTHOGRAPHIC_MODE" ), 0, this);
+  aAction->setStatusTip(tr("DSC_ORTHOGRAPHIC_MODE"));
+  aAction->setCheckable(true);
+  toolMgr()->registerAction( aAction, OrthographicId );
+
+  // - perspective projection
+  aAction = new QtxAction(tr("MNU_PERSPECTIVE_MODE"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_PERSPECTIVE" ) ),
+                          tr( "MNU_PERSPECTIVE_MODE" ), 0, this);
+  aAction->setStatusTip(tr("DSC_PERSPECTIVE_MODE"));
+  aAction->setCheckable(true);
+  toolMgr()->registerAction( aAction, PerspectiveId );
+#if OCC_VERSION_LARGE > 0x06090000
+  // - stereo projection
+  aAction = new QtxAction(tr("MNU_STEREO_MODE"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_STEREO" ) ),
+                          tr( "MNU_STEREO_MODE" ), 0, this);
+  aAction->setStatusTip(tr("DSC_STEREO_MODE"));
+  aAction->setCheckable(true);
+  toolMgr()->registerAction( aAction, StereoId );
+  connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onStereoType(bool)));
+#endif
+  // - add exclusive action group
+  QActionGroup* aProjectionGroup = new QActionGroup( this );
+  aProjectionGroup->addAction( toolMgr()->action( OrthographicId ) );
+  aProjectionGroup->addAction( toolMgr()->action( PerspectiveId ) );
+  connect(aProjectionGroup, SIGNAL(triggered(QAction*)), this, SLOT(onProjectionType(QAction*)));
+  
   // Reset
   aAction = new QtxAction(tr("MNU_RESET_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_RESET" ) ),
                            tr( "MNU_RESET_VIEW" ), 0, this, false, "Viewers:Reset view");
@@ -1315,7 +1398,7 @@ void OCCViewer_ViewWindow::createActions()
   connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchSelection(bool)));
   toolMgr()->registerAction( aAction, SwitchSelectionId );
 
-  // Graduated axes 
+  // Graduated axes
   aAction = new QtxAction(tr("MNU_GRADUATED_AXES"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_GRADUATED_AXES" ) ),
                            tr( "MNU_GRADUATED_AXES" ), 0, this);
   aAction->setStatusTip(tr("DSC_GRADUATED_AXES"));
@@ -1361,7 +1444,7 @@ void OCCViewer_ViewWindow::createActions()
     toolMgr()->registerAction( aAction, ReturnTo3dViewId );
   }
 
-  // Synchronize View 
+  // Synchronize View
   toolMgr()->registerAction( synchronizeAction(), SynchronizeId );
 }
 
@@ -1391,9 +1474,7 @@ void OCCViewer_ViewWindow::createToolBar()
   }
   toolMgr()->append( DumpId, tid );
   toolMgr()->append( SwitchInteractionStyleId, tid );
-#if OCC_VERSION_LARGE > 0x0603000A // available only with OCC-6.3-sp11 and higher version
   toolMgr()->append( SwitchZoomingStyleId, tid );
-#endif
   toolMgr()->append( SwitchPreselectionId, tid );
   toolMgr()->append( SwitchSelectionId, tid );
   if( myModel->trihedronActivated() )
@@ -1402,6 +1483,9 @@ void OCCViewer_ViewWindow::createToolBar()
   QtxMultiAction* aScaleAction = new QtxMultiAction( this );
   aScaleAction->insertAction( toolMgr()->action( FitAllId ) );
   aScaleAction->insertAction( toolMgr()->action( FitRectId ) );
+#if OCC_VERSION_LARGE > 0x06090000
+  aScaleAction->insertAction( toolMgr()->action( FitSelectionId ) );
+#endif
   aScaleAction->insertAction( toolMgr()->action( ZoomId ) );
   toolMgr()->append( aScaleAction, tid );
 
@@ -1426,6 +1510,12 @@ void OCCViewer_ViewWindow::createToolBar()
     toolMgr()->append( AntiClockWiseId, tid );
     toolMgr()->append( ClockWiseId, tid );
 
+    toolMgr()->append( OrthographicId, tid );
+    toolMgr()->append( PerspectiveId, tid );
+#if OCC_VERSION_LARGE > 0x06090000
+    toolMgr()->append( StereoId, tid );
+#endif
+
     toolMgr()->append( ResetId, tid );
   }
 
@@ -1436,13 +1526,11 @@ void OCCViewer_ViewWindow::createToolBar()
 
   toolMgr()->append( toolMgr()->separator(), tid );
   toolMgr()->append( CloneId, tid );
-  
+
   toolMgr()->append( toolMgr()->separator(), tid );
   toolMgr()->append( ClippingId, tid );
   toolMgr()->append( AxialScaleId, tid );
-#if OCC_VERSION_LARGE > 0x06030009 // available only with OCC-6.3-sp10 and higher version
   toolMgr()->append( GraduatedAxesId, tid );
-#endif
   toolMgr()->append( AmbientId, tid );
 
   toolMgr()->append( MaximizedId, tid );
@@ -1561,10 +1649,173 @@ void OCCViewer_ViewWindow::onResetView()
   myViewPort->getView()->Reset( false );
   myViewPort->fitAll( false, true, false );
   myViewPort->getView()->SetImmediateUpdate( upd );
+  onProjectionType(); // needed to apply projection type properly after reset
   myViewPort->getView()->Update();
   emit vpTransformationFinished( RESETVIEW );
 }
 
+/*!
+  \brief Set the given projection mode.
+
+  Set the given projection mode: Orthographic or Perspective.
+*/
+void OCCViewer_ViewWindow::onProjectionType( QAction* theAction )
+{
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    if (theAction == toolMgr()->action( OrthographicId )) {
+      myModel->setProjectionType(Orthographic);
+      aCamera->SetProjectionType ( Graphic3d_Camera::Projection_Orthographic );
+      aCamera->SetFOVy(45.0);
+    }
+    else if (theAction == toolMgr()->action( PerspectiveId )) {
+      myModel->setProjectionType(Perspective);
+      aCamera->SetProjectionType ( Graphic3d_Camera::Projection_Perspective );
+      aCamera->SetFOVy(30.0);
+    }
+#if OCC_VERSION_LARGE > 0x06090000
+    if (toolMgr()->action( StereoId )->isChecked()) {
+      aCamera->SetProjectionType ( Graphic3d_Camera::Projection_Stereo );
+      aCamera->SetFOVy(30.0);
+    }
+#endif
+    aView3d->Redraw();
+    onViewFitAll();
+  }
+}
+
+/*!
+  \brief Sets Stereo projection mode.
+
+  Sets Stereo projection mode.
+*/
+void OCCViewer_ViewWindow::onStereoType( bool activate )
+{
+#if OCC_VERSION_LARGE > 0x06090000
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    if (activate) {
+      toolMgr()->action( PerspectiveId )->setChecked(true);
+      aCamera->SetProjectionType(Graphic3d_Camera::Projection_Perspective);
+      toolMgr()->action( PerspectiveId )->actionGroup()->setEnabled(false);
+
+      aCamera->SetProjectionType ( Graphic3d_Camera::Projection_Stereo );
+      SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
+      setStereoType( aResMgr->integerValue( "OCCViewer", "stereo_type", 0 ) );
+      setAnaglyphFilter( aResMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 ) );
+      setReverseStereo( aResMgr->booleanValue( "OCCViewer", "reverse_stereo", false ) );
+      setVSync( aResMgr->booleanValue( "OCCViewer", "enable_vsync", true ) );
+      setQuadBufferSupport( aResMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false ) );
+    }
+    else {
+      toolMgr()->action( PerspectiveId )->actionGroup()->setEnabled(true);
+      if (myModel->projectionType() == Orthographic) {
+        toolMgr()->action( OrthographicId )->setChecked(true);
+        aCamera->SetProjectionType(Graphic3d_Camera::Projection_Orthographic);
+      }
+      else if (myModel->projectionType() == Perspective) {
+        toolMgr()->action( PerspectiveId )->setChecked(true);
+        aCamera->SetProjectionType(Graphic3d_Camera::Projection_Perspective);
+      }
+    }
+    aView3d->Redraw();
+    onViewFitAll();
+  }
+
+  if ( isQuadBufferSupport() && !isOpenGlStereoSupport() && stereoType() == QuadBuffer &&
+       toolMgr()->action( StereoId )->isChecked() )
+    SUIT_MessageBox::warning( 0, tr( "WRN_WARNING" ),  tr( "WRN_SUPPORT_QUAD_BUFFER" ) );
+#endif
+}
+
+/*!
+  \brief Restore the view.
+
+  Restore the projection mode based on tool-buttons states.
+*/
+void OCCViewer_ViewWindow::onProjectionType()
+{
+  emit vpTransformationStarted( PROJECTION );
+  if (toolMgr()->action( OrthographicId )->isChecked())
+    setProjectionType( Orthographic );
+  if (toolMgr()->action( PerspectiveId )->isChecked())
+    setProjectionType( Perspective );
+#if OCC_VERSION_LARGE > 0x06090000
+  if (toolMgr()->action( StereoId )->isChecked())
+    setProjectionType( Stereo );
+#endif
+  emit vpTransformationFinished( PROJECTION );
+}
+
+void OCCViewer_ViewWindow::setProjectionType( int mode )
+{
+  QtxAction* anOrthographicAction = dynamic_cast<QtxAction*>( toolMgr()->action( OrthographicId ) );
+  QtxAction* aPerspectiveAction = dynamic_cast<QtxAction*>( toolMgr()->action( PerspectiveId ) );
+#if OCC_VERSION_LARGE > 0x06090000
+  QtxAction* aStereoAction = dynamic_cast<QtxAction*>( toolMgr()->action( StereoId ) );
+#endif
+  switch ( mode ) {
+    case Orthographic:
+      onProjectionType( anOrthographicAction );
+      break;
+    case Perspective:
+      onProjectionType( aPerspectiveAction );
+      break;
+    case Stereo:
+      onStereoType( true );
+      break;
+  }
+  // update action state if method is called outside
+  if ( mode == Orthographic && !anOrthographicAction->isChecked() ) {
+         anOrthographicAction->setChecked( true );
+    #if OCC_VERSION_LARGE > 0x06090000
+         aStereoAction->setChecked( false );
+    #endif
+  }
+  if ( mode == Perspective && !aPerspectiveAction->isChecked() ) {
+         aPerspectiveAction->setChecked( true );
+    #if OCC_VERSION_LARGE > 0x06090000
+         aStereoAction->setChecked( false );
+    #endif
+  }
+#if OCC_VERSION_LARGE > 0x06090000
+  if ( mode == Stereo ) {
+    aStereoAction->setChecked( true );
+    if ( anOrthographicAction->isEnabled() ) {
+      anOrthographicAction->setEnabled( false );
+      anOrthographicAction->setChecked( false );
+      aStereoAction->setChecked( false );
+    }
+    else {
+      anOrthographicAction->setEnabled( true );
+      aStereoAction->setChecked( false );
+      anOrthographicAction->setChecked(myModel->projectionType() == Orthographic);
+    }
+    if ( aPerspectiveAction->isEnabled() ) {
+      aPerspectiveAction->setEnabled( false );
+      aPerspectiveAction->setChecked( true );
+      if ( isQuadBufferSupport() && !isOpenGlStereoSupport() && stereoType() == QuadBuffer &&
+           toolMgr()->action( StereoId )->isChecked() )
+        SUIT_MessageBox::warning( 0, tr( "WRN_WARNING" ),  tr( "WRN_SUPPORT_QUAD_BUFFER" ) );
+    }
+    else {
+      aPerspectiveAction->setEnabled( true );
+      aStereoAction->setChecked( false );
+      aPerspectiveAction->setChecked(myModel->projectionType() == Perspective);
+      onProjectionType();
+    }
+  }
+  else {
+    if ( !anOrthographicAction->isEnabled() )
+      anOrthographicAction->setEnabled( true );
+    if ( !aPerspectiveAction->isEnabled() )
+      aPerspectiveAction->setEnabled( true );
+  }
+#endif
+}
+
 /*!
   \brief Perform "fit all" transformation.
 */
@@ -1575,6 +1826,18 @@ void OCCViewer_ViewWindow::onFitAll()
   emit vpTransformationFinished( FITALLVIEW );
 }
 
+/*!
+  \brief Perform "fit selection" transformation.
+*/
+void OCCViewer_ViewWindow::onFitSelection()
+{
+  emit vpTransformationStarted( FITSELECTION );
+#if OCC_VERSION_LARGE > 0x06090000
+  myModel->getAISContext()->FitSelected( getViewPort()->getView() );
+#endif
+  emit vpTransformationFinished( FITSELECTION );
+}
+
 /*!
   \brief Called if 'change rotation point' operation is activated.
   \param on action state
@@ -1625,7 +1888,7 @@ void OCCViewer_ViewWindow::onAxialScale()
 {
   if ( !myScalingDlg )
     myScalingDlg = new OCCViewer_AxialScaleDlg( this );
-  
+
   if ( !myScalingDlg->isVisible() )
   {
     myScalingDlg->Update();
@@ -1728,8 +1991,7 @@ void OCCViewer_ViewWindow::performRestoring( const viewAspect& anItem, bool base
 
     myModel->setTrihedronShown( anItem.isVisible );
     myModel->setTrihedronSize( anItem.size );
-        
-#if OCC_VERSION_LARGE > 0x06030009 // available only with OCC-6.3-sp10 and higher version
+
     // graduated trihedron
     bool anIsVisible = anItem.gtIsVisible;
     OCCViewer_AxisWidget::AxisData anAxisData[3];
@@ -1775,7 +2037,6 @@ void OCCViewer_ViewWindow::performRestoring( const viewAspect& anItem, bool base
 
     myCubeAxesDlg->SetData( anIsVisible, anAxisData );
     myCubeAxesDlg->ApplyData( aView3d );
-#endif
 
   } // if ( !baseParamsOnly )
 
@@ -1825,7 +2086,7 @@ void OCCViewer_ViewWindow::onSwitchSelection( bool on )
 {
   mySelectionEnabled = on;
   myModel->setSelectionOptions( myModel->isPreselectionEnabled(), isSelectionEnabled() );
-  
+
   // update action state if method is called outside
 
   // preselection
@@ -1912,22 +2173,23 @@ QImage OCCViewer_ViewWindow::dumpView()
   Handle(V3d_View) view = myViewPort->getView();
   if ( view.IsNull() )
     return QImage();
-  
+
   int aWidth = myViewPort->width();
   int aHeight = myViewPort->height();
 
   // rnv: An old approach to dump the OCCViewer content
   //      Now used OCCT built-in procedure.
-  /*     
+  /*
   QApplication::syncX();
   view->Redraw(); // In order to reactivate GL context
   //view->Update();
 
+#ifndef DISABLE_GLVIEWER
   OpenGLUtils_FrameBuffer aFrameBuffer;
   if( aFrameBuffer.init( aWidth, aHeight ) )
   {
     QImage anImage( aWidth, aHeight, QImage::Format_RGB32 );
-   
+
     glPushAttrib( GL_VIEWPORT_BIT );
     glViewport( 0, 0, aWidth, aHeight );
     aFrameBuffer.bind();
@@ -1955,8 +2217,9 @@ QImage OCCViewer_ViewWindow::dumpView()
 
   glReadPixels( p.x(), p.y(), aWidth, aHeight, GL_RGBA, GL_UNSIGNED_BYTE,
                 data);
+#endif
   */
-  
+
   Image_PixMap aPix;
   view->ToPixMap(aPix,aWidth, aHeight,Graphic3d_BT_RGBA);
 
@@ -1965,8 +2228,8 @@ QImage OCCViewer_ViewWindow::dumpView()
   return anImage;
 }
 
-bool OCCViewer_ViewWindow::dumpViewToFormat( const QImage& img, 
-                                             const QString& fileName, 
+bool OCCViewer_ViewWindow::dumpViewToFormat( const QImage& img,
+                                             const QString& fileName,
                                              const QString& format )
 {
   if ( format != "PS" && format != "EPS")
@@ -2016,7 +2279,7 @@ void OCCViewer_ViewWindow::setCuttingPlane( bool on, const double x,  const doub
     gp_Pln pln (gp_Pnt(x, y, z), gp_Dir(dx, dy, dz));
     double a, b, c, d;
     pln.Coefficients(a, b, c, d);
-    
+
     Graphic3d_SequenceOfHClipPlane aPlanes = view->GetClipPlanes();
     if(aPlanes.Size() > 0 ) {
       Graphic3d_SequenceOfHClipPlane::Iterator anIter (aPlanes);
@@ -2115,7 +2378,6 @@ viewAspect OCCViewer_ViewWindow::getViewParams() const
   aView3d->Center( params.centerX, params.centerY );
 #endif
 
-#if OCC_VERSION_LARGE > 0x06030009 // available only with OCC-6.3-sp10 and higher version
   // graduated trihedron
   bool anIsVisible = false;
   OCCViewer_AxisWidget::AxisData anAxisData[3];
@@ -2161,7 +2423,6 @@ viewAspect OCCViewer_ViewWindow::getViewParams() const
   params.gtTickmarkLengthX = anAxisData[0].TickmarkLength;
   params.gtTickmarkLengthY = anAxisData[1].TickmarkLength;
   params.gtTickmarkLengthZ = anAxisData[2].TickmarkLength;
-#endif
 
   return params;
 }
@@ -2238,8 +2499,6 @@ QString OCCViewer_ViewWindow::getVisualParameters()
     data << ClippingPlane;
   }
 
-
-#if OCC_VERSION_LARGE > 0x06030009 // available only with OCC-6.3-sp10 or newer version
   // graduated trihedron
   data << QString( "gtIsVisible=%1" )      .arg( params.gtIsVisible );
   data << QString( "gtDrawNameX=%1" )      .arg( params.gtDrawNameX );
@@ -2281,7 +2540,6 @@ QString OCCViewer_ViewWindow::getVisualParameters()
   data << QString( "gtTickmarkLengthX=%1" ).arg( params.gtTickmarkLengthX );
   data << QString( "gtTickmarkLengthY=%1" ).arg( params.gtTickmarkLengthY );
   data << QString( "gtTickmarkLengthZ=%1" ).arg( params.gtTickmarkLengthZ );
-#endif
   QString bg = Qtx::backgroundToString( background() ).replace( "=", "$" );
   data << QString( "background=%1" ).arg( bg );
 
@@ -2428,7 +2686,7 @@ void OCCViewer_ViewWindow::setVisualParameters( const QString& parameters )
     params.isVisible = data.count() > idx ? data[idx++].toInt()    : 1;
     params.size      = data.count() > idx ? data[idx++].toDouble() : 100.0;
   }
-  performRestoring( params );  
+  performRestoring( params );
   setBackground( bgData );
   myModel->setClipPlanes(aClipPlanes);
 }
@@ -2458,6 +2716,18 @@ void OCCViewer_ViewWindow::hideEvent( QHideEvent* theEvent )
 }
 
 
+/*!
+    Save old cursor. [ protected ]
+*/
+void OCCViewer_ViewWindow::saveCursor()
+{
+  QCursor* aCursor = NULL;
+  if ( myViewPort )
+    aCursor = myViewPort->getDefaultCursor();
+  myCursor = ( aCursor ? *aCursor : cursor() );
+}
+
+
 /*!
     Creates default sketcher. [ virtual protected ]
 */
@@ -2660,8 +2930,8 @@ void OCCViewer_ViewWindow::setMaximized(bool toMaximize, bool toSendSignal)
   QAction* anAction2 =  toolMgr()->action( ReturnTo3dViewId );
   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
   if ( toMaximize ) {
-    anAction->setText( tr( "MNU_MINIMIZE_VIEW" ) );  
-    anAction->setToolTip( tr( "MNU_MINIMIZE_VIEW" ) );  
+    anAction->setText( tr( "MNU_MINIMIZE_VIEW" ) );
+    anAction->setToolTip( tr( "MNU_MINIMIZE_VIEW" ) );
     anAction->setIcon( aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_MINIMIZE" ) ) );
     anAction->setStatusTip( tr( "DSC_MINIMIZE_VIEW" ) );
     if ( anAction2 && my2dMode != No2dMode ) toolMgr()->show( ReturnTo3dViewId );
@@ -2670,8 +2940,8 @@ void OCCViewer_ViewWindow::setMaximized(bool toMaximize, bool toSendSignal)
     }
   }
   else {
-    anAction->setText( tr( "MNU_MAXIMIZE_VIEW" ) );  
-    anAction->setToolTip( tr( "MNU_MAXIMIZE_VIEW" ) );  
+    anAction->setText( tr( "MNU_MAXIMIZE_VIEW" ) );
+    anAction->setToolTip( tr( "MNU_MAXIMIZE_VIEW" ) );
     anAction->setIcon( aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_MAXIMIZE" ) ) );
     anAction->setStatusTip( tr( "DSC_MAXIMIZE_VIEW" ) );
     if ( anAction2 && my2dMode != No2dMode ) toolMgr()->hide( ReturnTo3dViewId );
@@ -2687,13 +2957,13 @@ bool OCCViewer_ViewWindow::isMaximized() const
 }
 
 void OCCViewer_ViewWindow::setSketcherStyle( bool enable )
-{ 
-  IsSketcherStyle = enable; 
+{
+  IsSketcherStyle = enable;
 }
 
-bool OCCViewer_ViewWindow::isSketcherStyle() const 
-{ 
-  return IsSketcherStyle; 
+bool OCCViewer_ViewWindow::isSketcherStyle() const
+{
+  return IsSketcherStyle;
 }
 
 
@@ -2702,12 +2972,248 @@ void OCCViewer_ViewWindow::set2dMode(Mode2dType theType)
   my2dMode = theType;
 }
 
-// obsolete   
+int OCCViewer_ViewWindow::projectionType() const
+{
+  int mode = Orthographic;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    if (aCamera->ProjectionType() == Graphic3d_Camera::Projection_Perspective)
+      mode = Perspective;
+    if (aCamera->ProjectionType() == Graphic3d_Camera::Projection_Orthographic)
+      mode = Orthographic;
+  #if OCC_VERSION_LARGE > 0x06090000
+    if (aCamera->ProjectionType() == Graphic3d_Camera::Projection_Stereo)
+      mode = Stereo;
+  #endif
+  }
+  return mode;
+}
+
+void OCCViewer_ViewWindow::setStereoType( int type )
+{
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams();
+    aParams->StereoMode = (Graphic3d_StereoMode)type;
+  #endif
+  }
+}
+
+int OCCViewer_ViewWindow::stereoType() const
+{
+  int type = QuadBuffer;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams();
+    type = (OCCViewer_ViewWindow::StereoType)aParams->StereoMode;
+  #endif
+  }
+  return type;
+}
+
+void OCCViewer_ViewWindow::setAnaglyphFilter( int type )
+{
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams();
+    if (type == RedCyan)
+      aParams->AnaglyphFilter = Graphic3d_RenderingParams::Anaglyph_RedCyan_Optimized;
+    if (type == YellowBlue)
+      aParams->AnaglyphFilter = Graphic3d_RenderingParams::Anaglyph_YellowBlue_Optimized;
+    if (type == GreenMagenta)
+      aParams->AnaglyphFilter = Graphic3d_RenderingParams::Anaglyph_GreenMagenta_Simple;
+  #endif
+  }
+}
+
+int OCCViewer_ViewWindow::anaglyphFilter() const
+{
+  int type = RedCyan;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams();
+    if (aParams->AnaglyphFilter == Graphic3d_RenderingParams::Anaglyph_RedCyan_Optimized)
+      type = RedCyan;
+    if (aParams->AnaglyphFilter == Graphic3d_RenderingParams::Anaglyph_YellowBlue_Optimized)
+      type = YellowBlue;
+    if (aParams->AnaglyphFilter == Graphic3d_RenderingParams::Anaglyph_GreenMagenta_Simple)
+      type = GreenMagenta;
+  #endif
+  }
+  return type;
+}
+
+void OCCViewer_ViewWindow::setStereographicFocus( int type, double value )
+{
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    aCamera->SetZFocus( (Graphic3d_Camera::FocusType) type, value );
+  #endif
+  }
+}
+
+int OCCViewer_ViewWindow::stereographicFocusType() const
+{
+  int type = Relative;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    type = (OCCViewer_ViewWindow::FocusIODType)aCamera->ZFocusType();
+  #endif
+  }
+  return type;
+}
+
+double OCCViewer_ViewWindow::stereographicFocusValue() const
+{
+  double value = 1.0;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    value = aCamera->ZFocus();
+  #endif
+  }
+  return value;
+}
+
+void OCCViewer_ViewWindow::setInterocularDistance( int type, double value )
+{
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    aCamera->SetIOD( (Graphic3d_Camera::IODType) type, value );
+  #endif
+  }
+}
+
+int OCCViewer_ViewWindow::interocularDistanceType() const
+{
+  int type = Relative;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    type = (OCCViewer_ViewWindow::FocusIODType)aCamera->GetIODType();
+  #endif
+  }
+  return type;
+}
+
+double OCCViewer_ViewWindow::interocularDistanceValue() const
+{
+  double value = 0.05;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    value = aCamera->IOD();
+  #endif
+  }
+  return value;
+}
+
+void OCCViewer_ViewWindow::setReverseStereo( bool reverse )
+{
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams();
+    aParams->ToReverseStereo = reverse;
+  #endif
+  }
+}
+
+bool OCCViewer_ViewWindow::isReverseStereo() const
+{
+  int reverse = false;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams();
+    reverse = aParams->ToReverseStereo;
+  #endif
+  }
+  return reverse;
+}
+
+void OCCViewer_ViewWindow::setVSync( bool enable )
+{
+  Handle(AIS_InteractiveContext) anIntCont = myModel->getAISContext();
+  if ( !anIntCont.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast(anIntCont->CurrentViewer()->Driver());
+    OpenGl_Caps* aCaps = &aDriver->ChangeOptions();
+    aCaps->swapInterval = enable;
+  #endif
+  }
+}
+
+bool OCCViewer_ViewWindow::isVSync() const
+{
+  int enable = true;
+  Handle(AIS_InteractiveContext) anIntCont = myModel->getAISContext();
+  if ( !anIntCont.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast(anIntCont->CurrentViewer()->Driver());
+    OpenGl_Caps* aCaps = &aDriver->ChangeOptions();
+    enable = aCaps->swapInterval;
+  #endif
+  }
+  return enable;
+}
+
+void OCCViewer_ViewWindow::setQuadBufferSupport( bool enable )
+{
+  Handle(AIS_InteractiveContext) anIntCont = myModel->getAISContext();
+  if ( !anIntCont.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast(anIntCont->CurrentViewer()->Driver());
+    OpenGl_Caps* aCaps = &aDriver->ChangeOptions();
+    aCaps->contextStereo = enable;
+  #endif
+  }
+}
+
+bool OCCViewer_ViewWindow::isQuadBufferSupport() const
+{
+  int enable = true;
+  Handle(AIS_InteractiveContext) anIntCont = myModel->getAISContext();
+  if ( !anIntCont.IsNull() ) {
+  #if OCC_VERSION_LARGE > 0x06090000
+    Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast(anIntCont->CurrentViewer()->Driver());
+    OpenGl_Caps* aCaps = &aDriver->ChangeOptions();
+    enable = aCaps->contextStereo;
+  #endif
+  }
+  return enable;
+}
+
+
+bool OCCViewer_ViewWindow::isOpenGlStereoSupport() const
+{
+  GLboolean support[1];
+  glGetBooleanv (GL_STEREO, support);
+  if ( support[0] )
+    return true;
+  return false;
+}
+
+// obsolete
 QColor OCCViewer_ViewWindow::backgroundColor() const
 {
   return myViewPort ? myViewPort->backgroundColor() : Qt::black;
 }
-   
+
 // obsolete
 void OCCViewer_ViewWindow::setBackgroundColor( const QColor& theColor )
 {
@@ -2718,7 +3224,7 @@ Qtx::BackgroundData OCCViewer_ViewWindow::background() const
 {
   return myViewPort ? myViewPort->background() : Qtx::BackgroundData();
 }
-   
+
 void OCCViewer_ViewWindow::setBackground( const Qtx::BackgroundData& theBackground )
 {
   if ( myViewPort ) myViewPort->setBackground( theBackground );
@@ -3020,7 +3526,7 @@ void OCCViewer_ViewWindow::onClipping (bool theIsOn)
 {
   if(!myModel) return;
   OCCViewer_ClippingDlg* aClippingDlg = myModel->getClippingDlg();
-  
+
   if (theIsOn) {
     if (!aClippingDlg) {
       aClippingDlg = new OCCViewer_ClippingDlg (this, myModel);