Salome HOME
Moved some functionality to VTKViewer_Utilities.h
[modules/kernel.git] / src / OCCViewer / OCCViewer_ViewFrame.cxx
index 2ddc4325fc1abc068ffe48db69a951229cc378d5..90645fdb2256e293b762c5a2810737ff2e8ed581 100644 (file)
 //  Module : SALOME
 //  $Header$
 
-using namespace std;
 #include "OCCViewer_ViewFrame.h"
 #include "OCCViewer_Viewer3d.h"
 #include "OCCViewer_ViewPort.h"
 #include "OCCViewer_ViewPort3d.h"
+#include "OCCViewer_Prs.h"
 
 #include "QAD.h"
 #include "QAD_Tools.h"
@@ -44,6 +44,9 @@ using namespace std;
 #include "QAD_Settings.h"
 #include "SALOME_Selection.h"
 #include "SALOME_AISShape.hxx"
+#include "SALOMEGUI.h"
+#include "SALOMEDS_Tool.hxx"
+#include "ToolsGUI.h"
 
 // QT Include
 #include <qapplication.h>
@@ -53,35 +56,70 @@ using namespace std;
 #include <AIS_ListIteratorOfListOfInteractive.hxx>
 #include <Visual3d_View.hxx>
 
-/*!
-    Constructor
+// IDL headers
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SALOMEDS)
+#include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
+
+using namespace std;
+
+//=======================================================================
+// name    : getMapOfEntry
+// Purpose : Convert list of interactive objects in map <entry <--> interactive object>
+//=======================================================================
+static void getMapOfEntry( const AIS_ListOfInteractive&                    theList,
+                           QMap< QString, Handle(AIS_InteractiveObject) >& theMap )
+{
+  AIS_ListIteratorOfListOfInteractive anIter( theList );
+  for ( ; anIter.More(); anIter.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anIO =
+      Handle(SALOME_InteractiveObject)::DownCast( anIter.Value() );
+    if ( !anIO.IsNull() )
+      theMap[ anIO->getEntry() ] = anIter.Value();
+  }
+}
+
+
+/*
+  Class       : OCCViewer_ViewFrame
+  Description : View frame for Open CASCADE view
 */
-OCCViewer_ViewFrame::OCCViewer_ViewFrame(QWidget* parent, const QString& title) 
-  : QAD_ViewFrame (parent, "")
+
+
+//=======================================================================
+// name    : OCCViewer_ViewFrame
+// Purpose : Constructor
+//=======================================================================
+OCCViewer_ViewFrame::OCCViewer_ViewFrame( QWidget* parent, const QString& title ) 
+  : QAD_ViewFrame ( parent, "" )
 {
   initialize();
 }
 
-/*!
-    Constructor
-*/
+//=======================================================================
+// name    : OCCViewer_ViewFrame
+// Purpose : Constructor
+//=======================================================================
 OCCViewer_ViewFrame::OCCViewer_ViewFrame( QWidget* parent ) 
   : QAD_ViewFrame (parent, "")
 {
   initialize();
 }
 
-/*!
-    Destructor
-*/
+//=======================================================================
+// name    : ~OCCViewer_ViewFrame
+// Purpose : Destructor
+//=======================================================================
 OCCViewer_ViewFrame::~OCCViewer_ViewFrame()
 {
   cleanup();
 }
 
-/*!
-    Init viewframe
-*/
+//=======================================================================
+// name    : initialize
+// Purpose : Initialize view frame (called from constructors )
+//=======================================================================
 void OCCViewer_ViewFrame::initialize()
 {
   myViewPort = NULL;
@@ -92,17 +130,18 @@ void OCCViewer_ViewFrame::initialize()
   myViewer->enableMultipleSelection( true );
 }
 
-/*!
-    Cleanup viewframe 
-*/
+//=======================================================================
+// name    : cleanup
+// Purpose : Cleanup viewframe 
+//=======================================================================
 void OCCViewer_ViewFrame::cleanup()
 {
-  
 } 
 
-/*!
-    Sets the viewport for this frame
-*/
+//=======================================================================
+// name    : setViewPort
+// Purpose : Sets the viewport for this frame
+//=======================================================================
 void OCCViewer_ViewFrame::setViewPort( OCCViewer_ViewPort* view )
 {
   myViewPort = view;
@@ -110,76 +149,81 @@ void OCCViewer_ViewFrame::setViewPort( OCCViewer_ViewPort* view )
   setCentralWidget ( myViewPort );
 }
 
-/*!
-    Inits the viewport for this frame
-*/
+//=======================================================================
+// name    : initViewPort
+// Purpose : Inits the viewport for this frame
+//=======================================================================
 void OCCViewer_ViewFrame::initViewPort()
 {
   /* Active Key Event */
+  
   setFocus();
 
   /* Initial attributes */
+  
   myViewPort->setCursor( cursor() );
   myViewPort->setBackgroundColor( backgroundColor() );
   
-  QAD_ASSERT ( QObject::connect(myViewPort, SIGNAL(vpKeyPress (QKeyEvent*)), 
-                               this, SIGNAL(vfKeyPress(QKeyEvent*))) );
-
-  /*  Listen to my viewport */ 
-  QAD_ASSERT ( QObject::connect(myViewPort, 
-                               SIGNAL(vpTransformationStarted (OCCViewer_ViewPort::OperationType)), 
-                               this, 
-                               SIGNAL(vfTransformationStarted(OCCViewer_ViewPort::OperationType))) );
-  QAD_ASSERT ( QObject::connect( myViewPort, 
-                                SIGNAL(vpTransformationFinished (OCCViewer_ViewPort::OperationType)),
-                                this, 
-                                SIGNAL(vfTransformationFinished(OCCViewer_ViewPort::OperationType))) );
-
-  QAD_ASSERT ( QObject::connect(myViewPort, SIGNAL(vpDrawExternal (QPainter*)), 
-                               this, SIGNAL(vfDrawExternal(QPainter*))) );     
-  QAD_ASSERT ( QObject::connect(myViewPort, SIGNAL(vpMousePress (QMouseEvent*)), 
-                               this, SIGNAL(vfMousePress(QMouseEvent*))) );
-  QAD_ASSERT ( QObject::connect(myViewPort, SIGNAL(vpMouseRelease (QMouseEvent*)), 
-                               this, SIGNAL(vfMouseRelease(QMouseEvent*))) );
-  QAD_ASSERT ( QObject::connect(myViewPort, SIGNAL(vpMouseMove (QMouseEvent*)), 
-                               this, SIGNAL(vfMouseMove(QMouseEvent*))) );
-  QAD_ASSERT ( QObject::connect(myViewPort, SIGNAL(vpMouseDoubleClick (QMouseEvent*)), 
-                               this, SIGNAL(vfMouseDoubleClick(QMouseEvent*))) );
-
-  QAD_ASSERT ( QObject::connect(myViewPort, SIGNAL(vpKeyPress (QKeyEvent*)), 
-                               this, SIGNAL(vfKeyPress(QKeyEvent*))) );
-  QAD_ASSERT ( QObject::connect(myViewPort, SIGNAL(vpKeyRelease (QKeyEvent*)), 
-                               this, SIGNAL(vfKeyRelease(QKeyEvent*))) );
-}
-
-/*!
-  Returns widget containing 3D-Viewer
-*/
+  QAD_ASSERT( QObject::connect(myViewPort, SIGNAL( vpKeyPress ( QKeyEvent* ) ), 
+              this, SIGNAL(vfKeyPress(QKeyEvent*))) );
+
+  /*  Listen to my viewport */
+  
+  QAD_ASSERT( connect( myViewPort, SIGNAL( vpTransformationStarted( OCCViewer_ViewPort::OperationType ) ), 
+                       this, SIGNAL( vfTransformationStarted( OCCViewer_ViewPort::OperationType ) ) ) );
+  QAD_ASSERT( connect( myViewPort, SIGNAL( vpTransformationFinished ( OCCViewer_ViewPort::OperationType ) ),
+                       this, SIGNAL( vfTransformationFinished( OCCViewer_ViewPort::OperationType ) ) ) );
+
+  QAD_ASSERT( connect( myViewPort, SIGNAL( vpDrawExternal( QPainter* ) ), 
+                       this, SIGNAL( vfDrawExternal( QPainter* ) ) ) );        
+  QAD_ASSERT( connect( myViewPort, SIGNAL( vpMousePress( QMouseEvent* ) ), 
+                       this, SIGNAL( vfMousePress( QMouseEvent* ) ) ) );
+  QAD_ASSERT( connect( myViewPort, SIGNAL( vpMouseRelease( QMouseEvent* ) ),
+                       this, SIGNAL( vfMouseRelease( QMouseEvent* ) ) ) );
+  QAD_ASSERT( connect( myViewPort, SIGNAL( vpMouseMove( QMouseEvent* ) ), 
+                       this, SIGNAL( vfMouseMove( QMouseEvent* ) ) ) );
+  QAD_ASSERT( connect( myViewPort, SIGNAL( vpMouseDoubleClick( QMouseEvent* ) ), 
+                       this, SIGNAL( vfMouseDoubleClick( QMouseEvent* ) ) ) );
+
+  QAD_ASSERT( connect( myViewPort, SIGNAL( vpKeyPress( QKeyEvent* ) ), 
+                       this, SIGNAL( vfKeyPress( QKeyEvent* ) ) ) );
+  QAD_ASSERT( connect( myViewPort, SIGNAL( vpKeyRelease( QKeyEvent* ) ),
+                       this, SIGNAL( vfKeyRelease( QKeyEvent* ) ) ) );
+}
+
+//=======================================================================
+// name    : getViewWidget
+// Purpose : Returns widget containing 3D-Viewer
+//=======================================================================
 QWidget* OCCViewer_ViewFrame::getViewWidget() 
 {
   return (QWidget*)getViewPort();
 }
 
-/*!
-    Returns the viewport of this frame 
-*/
+//=======================================================================
+// name    : getViewPort
+// Purpose : Returns the viewport of this frame        
+//=======================================================================
 OCCViewer_ViewPort* OCCViewer_ViewFrame::getViewPort() const
 {
   return myViewPort;
 }
 
-/*!
-    Sets the cursor for the viewframe's viewport
-*/
+//=======================================================================
+// name    : Sets the cursor for the viewframe's viewport
+// Purpose : setCursor
+//=======================================================================
 void OCCViewer_ViewFrame::setCursor( const QCursor& cursor)
 {
   if ( myViewPort ) 
-    myViewPort->QWidget::setCursor(cursor);
+    myViewPort->QWidget::setCursor( cursor );
 }
 
-/*!
-    Returns the current cursor 
-*/
+
+//=======================================================================
+// name    : cursor
+// Purpose : Returns the current cursor 
+//=======================================================================
 QCursor OCCViewer_ViewFrame::cursor() const
 {
   if ( myViewPort ) 
@@ -187,18 +231,20 @@ QCursor OCCViewer_ViewFrame::cursor() const
   return QMainWindow::cursor();
 }
 
-/*!
-    Set background of the viewport
-*/
+//=======================================================================
+// name    : setBackgroundColor
+// Purpose : Set background of the viewport
+//=======================================================================
 void OCCViewer_ViewFrame::setBackgroundColor( const QColor& color)
 {
   if ( myViewPort )
-    myViewPort->setBackgroundColor(color);
+    myViewPort->setBackgroundColor( color );
 }
 
-/*!
-    Returns background of the viewport
-*/
+//=======================================================================
+// name    : backgroundColor
+// Purpose : Returns background of the viewport
+//=======================================================================
 QColor OCCViewer_ViewFrame::backgroundColor() const
 {
   if ( myViewPort )
@@ -206,116 +252,135 @@ QColor OCCViewer_ViewFrame::backgroundColor() const
   return QMainWindow::backgroundColor();
 }
 
-/*!
-    Sets the parent viewer for the window
-*/
-void OCCViewer_ViewFrame::setViewer(OCCViewer_Viewer3d* viewer)
+//=======================================================================
+// name    : setViewer
+// Purpose : Sets the parent viewer for the window
+//=======================================================================
+void OCCViewer_ViewFrame::setViewer( OCCViewer_Viewer3d* viewer )
 {
   myViewer = viewer;
 }
 
-/*!
-  Returns the parent viewer for the window
-*/
+//=======================================================================
+// name    : getViewer
+// Purpose : Returns the parent viewer for the window
+//=======================================================================
 OCCViewer_Viewer3d* OCCViewer_ViewFrame::getViewer() const
 {
   return myViewer;
 }
 
-/*!
-    Returns 'true' if viewframe is visible
-*/
-void OCCViewer_ViewFrame::setVisible( bool visible )
+//=======================================================================
+// name    : setVisible
+// Purpose : Show/hide view
+//=======================================================================
+void OCCViewer_ViewFrame::setVisible( const bool visible )
 {
   if ( visible == QWidget::isVisible() )
     return;
   
-  if ( visible ) show();
-  else hide();
+  if ( visible )
+    show();
+  else
+    hide();
 }
 
-/*!
-   Called when viewframe is about to close
-*/
-void OCCViewer_ViewFrame::closeEvent(QCloseEvent* e)
+//=======================================================================
+// name    : closeEvent
+// Purpose : Called when viewframe is about to close
+//=======================================================================
+void OCCViewer_ViewFrame::closeEvent( QCloseEvent* e )
 {
-  emit vfViewClosing(e);  /* notify our viewer */
+  emit vfViewClosing( e );  /* notify our viewer */
 }
 
-/*!
-   Called when viewframe is resized 
-*/
-void OCCViewer_ViewFrame::resizeEvent(QResizeEvent* e)
+//=======================================================================
+// name    : resizeEvent
+// Purpose : Called when viewframe is resized 
+//=======================================================================
+void OCCViewer_ViewFrame::resizeEvent( QResizeEvent* e )
 {
-  emit vfResize(e);    
+  emit vfResize( e );
 }
 
+//=======================================================================
+// name    : keyPressEvent
+// Purpose : Called when key is pressed
+//=======================================================================
 void OCCViewer_ViewFrame::keyPressEvent( QKeyEvent *k )
 {
   emit vfKeyPress(k);
 }
 
-/*!
-    Fits all objects in the active view
-*/
+//=======================================================================
+// name    : onViewFitAll
+// Purpose : Fits all objects in the active view
+//=======================================================================
 void OCCViewer_ViewFrame::onViewFitAll()
 {
   myViewPort->fitAll();
 }
 
-/*!
-    Fits all obejcts within a rectangular area of the active view
-*/
+//=======================================================================
+// name    : onViewFitArea
+// Purpose : Fits all obejcts within a rectangular area of the active view
+//=======================================================================
 void OCCViewer_ViewFrame::onViewFitArea()
 {
   myViewPort->activateWindowFit();
-  QAD_Application::getDesktop()->putInfo( tr("PRP_VW3D_SKETCHAREA") );
+  QAD_Application::getDesktop()->putInfo( tr( "PRP_VW3D_SKETCHAREA" ) );
 }
 
-/*!
-    Moves the active view
-*/
+//=======================================================================
+// name    : onViewPan
+// Purpose : Moves the active view
+//=======================================================================
 void OCCViewer_ViewFrame::onViewPan()
 {
   myViewPort->activatePanning();
 }
 
-/*!
-    Zooms the active view
-*/
+//=======================================================================
+// name    : onViewZoom
+// Purpose : Zooms the active view
+//=======================================================================
 void OCCViewer_ViewFrame::onViewZoom()
 {
   myViewPort->activateZoom();
 }
 
-/*!
-    Sets a new center of the active view
-*/
+//=======================================================================
+// name    : onViewGlobalPan
+// Purpose : Sets a new center of the active view
+//=======================================================================
 void OCCViewer_ViewFrame::onViewGlobalPan()
 {
   myViewPort->activateGlobalPanning();
   QAD_Application::getDesktop()->putInfo( tr("PRP_VW3D_POINTCENTER") );
 }
 
-/*!
-    Rotates the active view
-*/
+//=======================================================================
+// name    : onViewRotate
+// Purpose : Rotates the active view
+//=======================================================================
 void OCCViewer_ViewFrame::onViewRotate()
 {
   myViewPort->activateRotation();
 }
 
-/*!
-    Reset the active view
-*/
+//=======================================================================
+// name    : onViewReset
+// Purpose : Reset the active view
+//=======================================================================
 void OCCViewer_ViewFrame::onViewReset()
 {
   myViewPort->reset();
 }
 
-/*!
-    Provides front projection of the active view
-*/
+//=======================================================================
+// name    : onViewFront
+// Purpose : Provides front projection of the active view
+//=======================================================================
 void OCCViewer_ViewFrame::onViewFront()
 {
   Handle( V3d_View) view3d = ((OCCViewer_ViewPort3d*)myViewPort)->getView();
@@ -323,9 +388,10 @@ void OCCViewer_ViewFrame::onViewFront()
   onViewFitAll();
 }
 
-/*!
-    Provides back projection of the active view
-*/
+//=======================================================================
+// name    : onViewBack
+// Purpose : Provides back projection of the active view
+//=======================================================================
 void OCCViewer_ViewFrame::onViewBack()
 {
   Handle( V3d_View) view3d = ((OCCViewer_ViewPort3d*)myViewPort)->getView();
@@ -333,29 +399,34 @@ void OCCViewer_ViewFrame::onViewBack()
   onViewFitAll();
 }
 
-/*!
-    Provides right projection of the active view
-*/
+//=======================================================================
+// name    : onViewRight
+// Purpose : Provides right projection of the active view
+//=======================================================================
 void OCCViewer_ViewFrame::onViewRight()
 {
   Handle( V3d_View) view3d = ((OCCViewer_ViewPort3d*)myViewPort)->getView();
-  if ( !view3d.IsNull() ) view3d->SetProj (V3d_Yneg);
+  if ( !view3d.IsNull() )
+    view3d->SetProj( V3d_Ypos );
   onViewFitAll();
 }
 
-/*!
-    Provides left projection of the active view
-*/
+//=======================================================================
+// name    : onViewLeft
+// Purpose : Provides left projection of the active view
+//=======================================================================
 void OCCViewer_ViewFrame::onViewLeft()
 {
   Handle( V3d_View) view3d = ((OCCViewer_ViewPort3d*)myViewPort)->getView();
-  if ( !view3d.IsNull() ) view3d->SetProj (V3d_Ypos);
+  if ( !view3d.IsNull() )
+    view3d->SetProj( V3d_Yneg );
   onViewFitAll();
 }
 
-/*!
-    Provides bottom projection of the active view
-*/
+//=======================================================================
+// name    : onViewBottom
+// Purpose : Provides bottom projection of the active view
+//=======================================================================
 void OCCViewer_ViewFrame::onViewBottom()
 {
   Handle( V3d_View) view3d = ((OCCViewer_ViewPort3d*)myViewPort)->getView();
@@ -363,9 +434,10 @@ void OCCViewer_ViewFrame::onViewBottom()
   onViewFitAll();
 }
 
-/*!
-    Provides top projection of the active view
-*/
+//=======================================================================
+// name    : onViewTop
+// Purpose : Provides top projection of the active view
+//=======================================================================
 void OCCViewer_ViewFrame::onViewTop()
 {
   Handle( V3d_View) view3d = ((OCCViewer_ViewPort3d*)myViewPort)->getView();
@@ -373,9 +445,10 @@ void OCCViewer_ViewFrame::onViewTop()
   onViewFitAll();
 }
 
-/*!
-  Display/hide Trihedron
-*/
+//=======================================================================
+// name    : onViewTrihedron
+// Purpose : Display/hide Trihedron
+//=======================================================================
 void OCCViewer_ViewFrame::onViewTrihedron()
 {
   if (!myViewer->getAISContext()->IsDisplayed( myViewer->getTrihedron() ))
@@ -385,329 +458,771 @@ void OCCViewer_ViewFrame::onViewTrihedron()
   onAdjustTrihedron();
 }
 
-void OCCViewer_ViewFrame::rename( const Handle(SALOME_InteractiveObject)& IObject, QString newName )
+//=======================================================================
+// name    : rename
+// Purpose : Rename entry object
+//=======================================================================
+void OCCViewer_ViewFrame::rename( const Handle(SALOME_InteractiveObject)& IObject,
+                                  const QString newName )
 {
   myViewer->rename(IObject, newName);
 }
 
+//=======================================================================
+// name    : unHighlightAll
+// Purpose : Unhighlight all objects
+//=======================================================================
 void OCCViewer_ViewFrame::unHighlightAll() 
 {
   myViewer->unHighlightAll();
 }
 
-void OCCViewer_ViewFrame::highlight( const Handle(SALOME_InteractiveObject)& IObject, bool highlight, bool update ) 
+//=======================================================================
+// name    : highlight
+// Purpose : Highlight object
+//=======================================================================
+void OCCViewer_ViewFrame::highlight( const Handle(SALOME_InteractiveObject)& IObject,
+                                     const bool highlight,
+                                     const bool update ) 
 {
-  myViewer->highlight(IObject, highlight, update);
+  myViewer->highlight( IObject, highlight, update );
 }
 
+//=======================================================================
+// name    : isInViewer
+// Purpose : Magic function
+//=======================================================================
 bool OCCViewer_ViewFrame::isInViewer( const Handle(SALOME_InteractiveObject)& IObject ) 
 {
   return myViewer->isInViewer( IObject );
 }
 
+//=======================================================================
+// name    : isVisible
+// Purpose : Verify whether object is visible
+//=======================================================================
 bool OCCViewer_ViewFrame::isVisible( const Handle(SALOME_InteractiveObject)& IObject ) 
 {
   return myViewer->isVisible( IObject );
 }
 
+//=======================================================================
+// name    : setPopupServer
+// Purpose : Set popup server
+//=======================================================================
 void OCCViewer_ViewFrame::setPopupServer( QAD_Application* App )
 {
   myViewer->setPopupServer( App );
 }
 
-void OCCViewer_ViewFrame::undo(SALOMEDS::Study_var aStudy,
-                                 const char* StudyFrameEntry)
+//=======================================================================
+// name    : redisplayAll
+// Purpose : Redisplay all objects of active component in accordance with
+//           their display flags
+//=======================================================================
+void OCCViewer_ViewFrame::redisplayAll( QAD_Study* theQADStudy, const bool theToUpdate ) 
 {
-  AIS_ListOfInteractive List1;
-  myViewer->getAISContext()->ObjectsInCollector(List1);
-  AIS_ListIteratorOfListOfInteractive ite1(List1);
-  while (ite1.More()) {
-    if (ite1.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast(ite1.Value());
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IO->hasEntry() ) { 
-         if (!QAD_ViewFrame::isInViewer(aStudy, IO->getEntry(), StudyFrameEntry))
-           myViewer->getAISContext()->Display(aSh);
-       }
-      }
-    }
-    ite1.Next();
-  }
+  SALOMEDS::Study_var      aStudy     = theQADStudy->getStudyDocument();
+  QAD_Desktop*             aDesktop   = QAD_Application::getDesktop();
+  SALOMEGUI*               aGUI       = aDesktop->getActiveGUI();
+  const QString&           aCompName  = aDesktop->getComponentDataType();
+  SALOMEDS::SObject_var    aComponent =
+    SALOMEDS::SObject::_narrow( aStudy->FindComponent ( aCompName.latin1() ) );
+
+  if ( aComponent->_is_nil() )
+    return;
+
+  Handle(AIS_InteractiveContext) anIC = myViewer->getAISContext();
+  bool isTrhDisplayed = anIC->IsDisplayed( myViewer->getTrihedron() );
   
-  AIS_ListOfInteractive List;
-  myViewer->getAISContext()->DisplayedObjects(List);
-  AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast(ite.Value());
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IO->hasEntry() ) { 
-         if (!QAD_ViewFrame::isInViewer(aStudy, IO->getEntry(), StudyFrameEntry ))
-           myViewer->getAISContext()->Erase(aSh,true,true);
-       }
-      }
+  anIC->DisplayAll( true, false );
+  anIC->EraseAll( false, false );
+
+  if ( isTrhDisplayed )
+    anIC->Display( myViewer->getTrihedron(), false );
+
+  std::list<SALOMEDS::SObject_var> aList;
+  SALOMEDS_Tool::GetAllChildren( aStudy, aComponent, aList );
+
+  std::list<SALOMEDS::SObject_var>::iterator anIter = aList.begin();
+  for ( ; anIter != aList.end(); ++anIter )
+  {
+    SALOMEDS::SObject_var anObj = (*anIter);
+    if ( ToolsGUI::GetVisibility( aStudy, anObj, this ) )
+    {
+      Handle(SALOME_InteractiveObject) anIObj = new SALOME_InteractiveObject();
+      anIObj->setEntry( anObj->GetID() );
+      aGUI->BuildPresentation( anIObj, this );
     }
-    ite.Next();
   }
+
+  if ( theToUpdate )
+    Repaint();
 }
 
-void OCCViewer_ViewFrame::redo(SALOMEDS::Study_var aStudy,
-                                 const char* StudyFrameEntry)
+//=======================================================================
+// name    : undo
+// Purpose : Redisplay all objects of active component in accordance with
+//           their display flags. Called when undo operation is complited
+//=======================================================================
+void OCCViewer_ViewFrame::undo( QAD_Study* theQADStudy, const char* )
 {
-  SALOMEDS::SObject_var RefSO;
-  SALOMEDS::SObject_var SO = aStudy->FindObjectID( StudyFrameEntry );
-  SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(SO);
-  for (; it->More();it->Next()){
-    SALOMEDS::SObject_var CSO= it->Value();
-    if (CSO->ReferencedObject(RefSO)) {
-      
-      AIS_ListOfInteractive List;
-      myViewer->getAISContext()->ObjectsInCollector(List);
-      AIS_ListIteratorOfListOfInteractive ite(List);
-      while (ite.More()) {
-       if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-         Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast(ite.Value());
-         if ( aSh->hasIO() ) {
-           Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-           if ( IO->hasEntry() ) { 
-             if ( strcmp(IO->getEntry(),RefSO->GetID()) == 0 )
-               myViewer->getAISContext()->Display(aSh, false);
-           }
-         }
-       }
-       ite.Next();
-      }
-      
-    }
-  }
-  
-  AIS_ListOfInteractive List1;
-  myViewer->getAISContext()->DisplayedObjects(List1);
-  AIS_ListIteratorOfListOfInteractive ite1(List1);
-  while (ite1.More()) {
-    if (ite1.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast(ite1.Value());
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IO->hasEntry() ) { 
-         if (!QAD_ViewFrame::isInViewer(aStudy, IO->getEntry(), StudyFrameEntry ))
-           myViewer->getAISContext()->Erase(aSh,false,true);
-       }
-      }
-    }
-    ite1.Next();
-  }
-  Repaint();
+  redisplayAll( theQADStudy );
+}
+
+//=======================================================================
+// name    : redo
+// Purpose : Redisplay all objects of active component in accordance with
+//           their display flags. Called when undo operation is complited
+//=======================================================================
+void OCCViewer_ViewFrame::redo( QAD_Study* theQADStudy, const char* )
+{
+  redisplayAll( theQADStudy );
 }
 
-/* selection */
-Handle(SALOME_InteractiveObject) OCCViewer_ViewFrame::FindIObject(const char* Entry)
+//=======================================================================
+// name    : FindIObject
+// Purpose : Find in context SALOME_InteractiveObject by entry
+//=======================================================================
+Handle(SALOME_InteractiveObject) OCCViewer_ViewFrame::FindIObject( const char* Entry )
 {
-  Handle(SALOME_InteractiveObject) IO;
   Handle (AIS_InteractiveContext) ic = myViewer->getAISContext();
       
   AIS_ListOfInteractive List;
-  ic->DisplayedObjects(List);
+  ic->DisplayedObjects( List );
   AIS_ListOfInteractive List1;
-  ic->ObjectsInCollector(List1);
-  List.Append(List1);
-
-  AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh
-       = Handle(SALOME_AISShape)::DownCast(ite.Value());
-      if ( aSh->hasIO() ) {
-       IO = aSh->getIO();
-       if ( IO->hasEntry() ) {
-         if ( strcmp( IO->getEntry(), Entry ) == 0 ) {
-           MESSAGE ( "IO found")
-           return IO;
-         }
-       }
-      }
+  ic->ObjectsInCollector( List1 );
+  List.Append( List1 );
+
+  AIS_ListIteratorOfListOfInteractive ite( List );
+  for ( ; ite.More(); ite.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+      Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
+
+    if ( !anObj.IsNull() && anObj->hasEntry() && strcmp( anObj->getEntry(), Entry ) == 0 )
+    {
+      MESSAGE ( "IO found")
+      return anObj;
     }
-    ite.Next();
   }
   MESSAGE ( "IO not found")
-  return IO;
+  return Handle(SALOME_InteractiveObject)();
 }
 
-/* display */          
-void OCCViewer_ViewFrame::Display(const Handle(SALOME_InteractiveObject)& IObject, bool update)
+//=======================================================================
+// name    : Display
+// Purpose : Display object
+//=======================================================================
+void OCCViewer_ViewFrame::Display( const Handle(SALOME_InteractiveObject)& theIObject,
+                                   bool toUpdate )
 {
-  QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  SALOME_Selection* Sel
-    = SALOME_Selection::Selection( myStudy->getSelection() );
+  if ( theIObject.IsNull() )
+    return;
 
-  Handle (AIS_InteractiveContext) ic = myViewer->getAISContext();
+  QAD_Study*          aQADStudy = QAD_Application::getDesktop()->getActiveStudy();
+  SALOME_Selection*   aSel      = SALOME_Selection::Selection( aQADStudy->getSelection() );
+  SALOMEDS::Study_var aStudy    = aQADStudy->getStudyDocument();
 
-  AIS_ListOfInteractive List;
-  ic->DisplayedObjects(List);
-  AIS_ListOfInteractive List1;
-  ic->ObjectsInCollector(List1);
-  List.Append(List1);
-  
-  AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh
-       = Handle(SALOME_AISShape)::DownCast(ite.Value());
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IO->isSame( IObject ) ) {
-         ic->Display(aSh, false);
-         //      ic->AddOrRemoveCurrentObject(aSh, false); repeated in Viewer3d after next statement
-         Sel->AddIObject(IO, false);
-         break;
-       }
-      }
+  Handle(AIS_InteractiveContext) anIC = myViewer->getAISContext();
+
+  AIS_ListOfInteractive aList;
+  anIC->ObjectsInCollector( aList );
+  AIS_ListIteratorOfListOfInteractive anIter( aList );
+  for ( ; anIter.More(); anIter.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+      Handle(SALOME_InteractiveObject)::DownCast( anIter.Value()->GetOwner() );
+
+    if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( theIObject ) )
+    {
+      anIC->Display( anIter.Value(), false );
+      aSel->AddIObject( anObj, false );
+      ToolsGUI::SetVisibility( aStudy, anObj->getEntry(), true, this );
+      break;
     }
-    ite.Next();
   }
-  if (update)
+  
+  if ( toUpdate )
     Repaint();
 }
 
-void OCCViewer_ViewFrame::DisplayOnly(const Handle(SALOME_InteractiveObject)& IObject)
+//=======================================================================
+// name    : DisplayOnly
+// Purpose : Display object and erase all other ones
+//=======================================================================
+void OCCViewer_ViewFrame::DisplayOnly( const Handle(SALOME_InteractiveObject)& theIO )
+{
+  EraseAll();
+  Display( theIO );
+}
+
+//=======================================================================
+// name    : Erase
+// Purpose : Erase object
+//=======================================================================
+void OCCViewer_ViewFrame::Erase( const Handle(SALOME_InteractiveObject)& theIObject,
+                                 bool                                    toUpdate )
 {
-  QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  SALOME_Selection* Sel
-    = SALOME_Selection::Selection( myStudy->getSelection() );
+  QAD_Study* aStudy = QAD_Application::getDesktop()->getActiveStudy();
+  SALOME_Selection* aSel = SALOME_Selection::Selection( aStudy->getSelection() );
 
-  Handle (AIS_InteractiveContext) ic = myViewer->getAISContext();
+  Handle(AIS_InteractiveContext) anIC = myViewer->getAISContext();
   
-  AIS_ListOfInteractive List;
-  ic->DisplayedObjects(List);
-  AIS_ListOfInteractive List1;
-  ic->ObjectsInCollector(List1);
-  List.Append(List1);
+  AIS_ListOfInteractive aList;
+  anIC->DisplayedObjects( aList );
   
-  AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh
-       = Handle(SALOME_AISShape)::DownCast(ite.Value());
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( !IO->isSame( IObject ) ) {
-         ic->Erase(aSh, false);
-         Sel->RemoveIObject(IO, false);
-       } else {
-         ic->Display(aSh, false);
-         Sel->AddIObject(IO, false);
-       }
+  AIS_ListIteratorOfListOfInteractive ite( aList );
+  for ( ; ite.More(); ite.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+      Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
+
+    if ( !anObj.IsNull() && anObj->hasEntry() )
+    {
+      if ( anObj->isSame( theIObject ) )
+      {
+        anIC->Erase( ite.Value(), false );
+        aSel->RemoveIObject( anObj, false );
+        ToolsGUI::SetVisibility( aStudy->getStudyDocument(), anObj->getEntry(), false, this );
+        break;
       }
     }
-    ite.Next();
   }
-  Repaint();
-}
-void OCCViewer_ViewFrame::Erase(const Handle(SALOME_InteractiveObject)& IObject, bool update)
-{
-  QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  SALOME_Selection* Sel
-    = SALOME_Selection::Selection( myStudy->getSelection() );
 
-  Handle (AIS_InteractiveContext) ic = myViewer->getAISContext();
-  
-  AIS_ListOfInteractive List;
-  ic->DisplayedObjects(List);
-  AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) 
-    {
-      if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape)))
-       {
-         Handle(SALOME_AISShape) aSh
-           = Handle(SALOME_AISShape)::DownCast(ite.Value());
-         if ( aSh->hasIO() )
-           {
-             Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-             if ( IO->isSame( IObject ) )
-               {
-                 ic->Erase(aSh, false);
-                 Sel->RemoveIObject(IO, false);
-                 break;
-               }
-           }
-       }
-      ite.Next();
-    }
-  if (update)
+  if ( toUpdate )
     Repaint();
 }
 
+//=======================================================================
+// name    : DisplayAll
+// Purpose : Display all objects of active component
+//=======================================================================
 void OCCViewer_ViewFrame::DisplayAll()
 {
-  myViewer->getAISContext()->DisplayAll(Standard_False,Standard_True);
+  SALOMEDS::Study_var      aStudy     = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
+  QAD_Desktop*             aDesktop   = QAD_Application::getDesktop();
+  SALOMEGUI*               aGUI       = aDesktop->getActiveGUI();
+  const QString&           aCompName  = aDesktop->getComponentDataType();
+  SALOMEDS::SObject_var    aComponent =
+    SALOMEDS::SObject::_narrow( aStudy->FindComponent ( aCompName.latin1() ) );
+
+  if ( aComponent->_is_nil() )
+    return;
+
+  Handle(AIS_InteractiveContext) anIC = myViewer->getAISContext();
+
+  AIS_ListOfInteractive aDispList;
+  AIS_ListOfInteractive aCollList;
+  anIC->DisplayedObjects( aDispList );
+  anIC->ObjectsInCollector( aCollList );
+
+  QMap< QString, Handle(AIS_InteractiveObject) > aDispMap;
+  QMap< QString, Handle(AIS_InteractiveObject) > aCollMap;
+  getMapOfEntry( aDispList, aDispMap );
+  getMapOfEntry( aCollList, aCollMap );
+
+  std::list<SALOMEDS::SObject_var> aList;
+  SALOMEDS_Tool::GetAllChildren( aStudy, aComponent, aList );
+
+  std::list<SALOMEDS::SObject_var>::iterator anIter = aList.begin();
+  for ( ; anIter != aList.end(); ++anIter )
+  {
+    SALOMEDS::SObject_var anObj = (*anIter);
+    if ( anObj->_is_nil() )
+      continue;
+
+    const char* aEntry = anObj->GetID();
+    if ( aCollMap.contains( aEntry ) )
+    {
+      anIC->DisplayFromCollector( aCollMap[ aEntry ], false );
+      ToolsGUI::SetVisibility( aStudy, aEntry, true, this );
+    }
+    else if ( !aDispMap.contains( aEntry ) )
+    {
+      Handle(SALOME_InteractiveObject) anIObj = new SALOME_InteractiveObject();
+      anIObj->setEntry( anObj->GetID() );
+      aGUI->BuildPresentation( anIObj, this );
+    }
+  }
+
+  Repaint();
 }
+
+//=======================================================================
+// name    : EraseAll
+// Purpose : Erase all objects
+//=======================================================================
 void OCCViewer_ViewFrame::EraseAll()
 {
-  Standard_Boolean isTrihedronDisplayed = 
+  SALOMEDS::Study_var aStudy =
+    QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
+
+  Standard_Boolean isTrihedronDisplayed =
     myViewer->getAISContext()->IsDisplayed( myViewer->getTrihedron() );
-  myViewer->getAISContext()->EraseAll();
-  if (isTrihedronDisplayed)
+
+  Handle(AIS_InteractiveContext) anIC = myViewer->getAISContext();
+
+  AIS_ListOfInteractive aList;
+  anIC->DisplayedObjects( aList );
+  AIS_ListIteratorOfListOfInteractive anIter( aList );
+  for ( ; anIter.More(); anIter.Next() )
+  {
+    if ( anIC->IsDisplayed( myViewer->getTrihedron() ) &&
+         anIter.Value()->DynamicType() == STANDARD_TYPE( AIS_Trihedron ) )
+      continue;
+
+    Handle(AIS_InteractiveObject) anIO = anIter.Value();
+    anIC->Erase( anIO, false, true );
+
+    Handle(SALOME_InteractiveObject) anObj =
+      Handle(SALOME_InteractiveObject)::DownCast( anIO->GetOwner() );
+
+    if ( !anObj.IsNull() && anObj->hasEntry() )
+      ToolsGUI::SetVisibility( aStudy, anObj->getEntry(), false, this );
+  }
+
+  if ( isTrihedronDisplayed )
     myViewer->getAISContext()->Display( myViewer->getTrihedron() );
   else
     Repaint();
 }
 
-
-
+//=======================================================================
+// name    : Repaint
+// Purpose : Uodate view
+//=======================================================================
 void OCCViewer_ViewFrame::Repaint()
 {
   onAdjustTrihedron();
   myViewer->getViewer3d()->Update();
 }
 
+//=======================================================================
+// name    : getTrihedronSize
+// Purpose : Get new and current trihedron size corresponding to the
+//           current model size
+//=======================================================================
+bool OCCViewer_ViewFrame::getTrihedronSize( double& theNewSize, double& theSize )
+{
+  theNewSize = 100;
+  theSize = 100;
+
+  Handle( V3d_View) view3d = ((OCCViewer_ViewPort3d*)myViewPort)->getView();
+
+  if ( view3d.IsNull() )
+    return false;
+
+  double Xmin = 0, Ymin = 0, Zmin = 0, Xmax = 0, Ymax = 0, Zmax = 0;
+  double aMaxSide;
+
+  view3d->View()->MinMaxValues( Xmin, Ymin, Zmin, Xmax, Ymax, Zmax );
+
+  if ( Xmin == RealFirst() || Ymin == RealFirst() || Zmin == RealFirst() ||
+       Xmax == RealLast()  || Ymax == RealLast()  || Zmax == RealLast() )
+    return false;
+
+  aMaxSide = Xmax - Xmin;
+  if ( aMaxSide < Ymax -Ymin ) aMaxSide = Ymax -Ymin;
+  if ( aMaxSide < Zmax -Zmin ) aMaxSide = Zmax -Zmin;
+
+  static float aSizeInPercents = 105;
+  QString aSetting = QAD_CONFIG->getSetting("Viewer:TrihedronSize");
+  if (!aSetting.isEmpty())
+    aSizeInPercents = aSetting.toFloat();
+
+  static float EPS = 5.0E-3;
+  theSize = myViewer->getTrihedron()->Size();
+  theNewSize = aMaxSide*aSizeInPercents / 100.0;
+
+  return fabs( theNewSize - theSize ) > theSize * EPS ||
+         fabs( theNewSize - theSize) > theNewSize * EPS;
+}
+
+//=======================================================================
+// name    : AdjustTrihedrons
+// Purpose : Adjust trihedron size in accordance with size of model
+//=======================================================================
+void OCCViewer_ViewFrame::AdjustTrihedrons( const bool forced )
+{
+  Handle (AIS_InteractiveContext) ic = myViewer->getAISContext();
+
+  if ( !myViewer->isTrihedronDisplayed() )
+    return;
+  else
+  {
+    AIS_ListOfInteractive List;
+    ic->DisplayedObjects(List);
+    if ( List.First() == List.Last() && List.First() == myViewer->getTrihedron() )
+    {
+      myViewer->setTrihedronSize( 100 );
+      return;
+    }
+  }
+
+  double aNewSize = 100, aSize = 100;
+  if ( getTrihedronSize( aNewSize, aSize ) || forced )
+    myViewer->setTrihedronSize( aNewSize );
+}
+
+//=======================================================================
+// name    : onAdjustTrihedron
+// Purpose : Slot. Called when trihedrons must be resized
+//=======================================================================
 void OCCViewer_ViewFrame::onAdjustTrihedron()
 {
+  AdjustTrihedrons( false );
+}
+
+//=======================================================================
+// name    : Display
+// Purpose : Display presentation
+//=======================================================================
+void OCCViewer_ViewFrame::Display( const SALOME_OCCPrs* prs )
+{
+  // try do downcast object
+  const OCCViewer_Prs* anOCCPrs = dynamic_cast<const OCCViewer_Prs*>( prs );
+  if ( !anOCCPrs || anOCCPrs->IsNull() )
+    return;
+
+  // get context
   Handle (AIS_InteractiveContext) ic = myViewer->getAISContext();
-  
-  if (!ic->IsDisplayed(myViewer->getTrihedron())) 
+  // get all displayed objects
+  AIS_ListOfInteractive List;
+  ic->DisplayedObjects( List );
+  // get objects in the collector
+  AIS_ListOfInteractive ListCollector;
+  ic->ObjectsInCollector( ListCollector );
+
+  // get objects to be displayed
+  AIS_ListOfInteractive anAISObjects;
+  anOCCPrs->GetObjects( anAISObjects );
+
+  AIS_ListIteratorOfListOfInteractive aIter( anAISObjects );
+  for ( ; aIter.More(); aIter.Next() )
+  {
+    Handle(AIS_InteractiveObject) anAIS = aIter.Value();
+    if ( !anAIS.IsNull() )
+    {
+      // try to find presentation in the viewer
+      bool bDisplayed = false;
+      AIS_ListIteratorOfListOfInteractive ite( List );
+      for ( ; ite.More(); ite.Next() )
+      {
+        // compare presentations by handles
+        // if the object is already displayed - nothing to do more
+        if ( ite.Value() == anAIS )
+        {
+          // Deactivate object if necessary
+          if ( !anOCCPrs->ToActivate() )
+            ic->Deactivate( anAIS );
+          bDisplayed = true;
+          break;
+        }
+      }
+
+      if ( bDisplayed )
+        continue;
+
+      // then try to find presentation in the collector
+      bDisplayed = false;
+      ite.Initialize( ListCollector );
+      for ( ; ite.More(); ite.Next() )
+      {
+        // compare presentations by handles
+        // if the object is in collector - display it
+        if ( ite.Value() == anAIS )
+        {
+          ic->DisplayFromCollector( anAIS, false );
+
+          // Deactivate object if necessary
+          if ( !anOCCPrs->ToActivate() )
+            ic->Deactivate( anAIS );
+          bDisplayed = true;
+
+          // Set visibility flag
+          Handle(SALOME_InteractiveObject) anObj =
+            Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() );
+          if ( !anObj.IsNull() && anObj->hasEntry() )
+          {
+            SALOMEDS::Study_var aStudy =
+              QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
+            ToolsGUI::SetVisibility( aStudy, anObj->getEntry(), true, this );
+          }
+
+          break;
+        }
+      }
+      if ( bDisplayed )
+        continue;
+
+      // if object is not displayed and not found in the collector - display it
+      if ( anAIS->IsKind( STANDARD_TYPE(AIS_Trihedron) ) )
+      {
+        Handle(AIS_Trihedron) aTrh = Handle(AIS_Trihedron)::DownCast( anAIS );
+        double aNewSize = 100, aSize = 100;
+        getTrihedronSize( aNewSize, aSize );
+        aTrh->SetSize( aTrh == myViewer->getTrihedron() ? aNewSize : 0.5 * aNewSize );
+      }
+
+      ic->Display( anAIS, false );
+
+      // Set visibility flag
+      Handle(SALOME_InteractiveObject) anObj =
+        Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() );
+      if ( !anObj.IsNull() && anObj->hasEntry() )
+      {
+        SALOMEDS::Study_var aStudy =
+          QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
+        ToolsGUI::SetVisibility( aStudy, anObj->getEntry(), true, this );
+      }
+
+      // Deactivate object if necessary
+      if ( !anOCCPrs->ToActivate() )
+        ic->Deactivate( anAIS );
+    }
+  }
+}
+
+//=======================================================================
+// name    : Erase
+// Purpose : Erase presentation
+//=======================================================================
+void OCCViewer_ViewFrame::Erase( const SALOME_OCCPrs* prs, const bool forced )
+{
+  // try do downcast object
+  const OCCViewer_Prs* anOCCPrs = dynamic_cast<const OCCViewer_Prs*>( prs );
+  if ( !anOCCPrs || anOCCPrs->IsNull() )
     return;
-  else 
+
+  // get context
+  Handle(AIS_InteractiveContext) ic = myViewer->getAISContext();
+
+  // get objects to be erased
+  AIS_ListOfInteractive anAISObjects;
+  anOCCPrs->GetObjects( anAISObjects );
+
+  AIS_ListIteratorOfListOfInteractive aIter( anAISObjects );
+  for ( ; aIter.More(); aIter.Next() ) {
+    Handle(AIS_InteractiveObject) anAIS = aIter.Value();
+    if ( !anAIS.IsNull() ) {
+      // erase the object from context : move it to collector
+      ic->Erase( anAIS, false, forced ? false : true );
+
+      // Set visibility flag if necessary
+      if ( !forced )
+      {
+        Handle(SALOME_InteractiveObject) anObj =
+          Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() );
+        if ( !anObj.IsNull() && anObj->hasEntry() )
+        {
+          SALOMEDS::Study_var aStudy =
+            QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
+          ToolsGUI::SetVisibility( aStudy, anObj->getEntry(), true, this );
+        }
+      }
+    }
+  }
+}
+
+//=======================================================================
+// name    : CreatePrs
+// Purpose : Create presentation corresponding to the entry
+//=======================================================================
+SALOME_Prs* OCCViewer_ViewFrame::CreatePrs( const char* entry )
+{
+  OCCViewer_Prs* prs = new OCCViewer_Prs();
+  if ( entry )
+  {
+    // get context
+    Handle(AIS_InteractiveContext) ic = myViewer->getAISContext();
+
+    // get displayed objects
+    AIS_ListOfInteractive List;
+    ic->DisplayedObjects( List );
+    // get objects in the collector
+    AIS_ListOfInteractive ListCollector;
+    ic->ObjectsInCollector( ListCollector );
+    List.Append( ListCollector );
+
+    AIS_ListIteratorOfListOfInteractive ite( List );
+    for ( ; ite.More(); ite.Next() )
     {
-      AIS_ListOfInteractive List;
-      ic->Erase( myViewer->getTrihedron() );
-      ic->DisplayedObjects(List);
-      ic->Display( myViewer->getTrihedron() ); 
-      if (List.IsEmpty())
-       {
-         myViewer->setTrihedronSize(100);
-         return;
-       }
+      Handle(SALOME_InteractiveObject) anObj =
+        Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
+
+      if ( !anObj.IsNull() && anObj->hasEntry() && strcmp( anObj->getEntry(), entry ) == 0 )
+        prs->AddObject( ite.Value() );
     }
+  }
+  return prs;
+}
+
+//=======================================================================
+// name    : LocalSelection
+// Purpose : Activates selection of sub shapes
+//=======================================================================
+void OCCViewer_ViewFrame::LocalSelection( const SALOME_OCCPrs* thePrs, const int theMode )
+{
+  Handle(AIS_InteractiveContext) anIC = myViewer->getAISContext();
   
-  Handle( V3d_View) view3d = ((OCCViewer_ViewPort3d*)myViewPort)->getView();
+  const OCCViewer_Prs* anOCCPrs = dynamic_cast<const OCCViewer_Prs*>( thePrs );
+  if ( anIC.IsNull() )
+    return;
   
-  if (!view3d.IsNull())
+  // Open local context if there is no one
+  bool allObjects = thePrs == 0 || thePrs->IsNull();
+  if ( !anIC->HasOpenedContext() ) {
+    anIC->ClearCurrents( false );
+    anIC->OpenLocalContext( allObjects, true, true );
+  }
+
+  AIS_ListOfInteractive anObjs;
+  // Get objects to be activated
+  if ( allObjects ) 
+    anIC->DisplayedObjects( anObjs );
+  else
+    anOCCPrs->GetObjects( anObjs );
+
+  // Activate selection of objects from prs
+  AIS_ListIteratorOfListOfInteractive aIter( anObjs );
+  for ( ; aIter.More(); aIter.Next() ) {
+    Handle(AIS_InteractiveObject) anAIS = aIter.Value();
+    if ( !anAIS.IsNull() )
     {
-      double Xmin=0, Ymin=0, Zmin=0, Xmax=0, Ymax=0, Zmax=0;
-      double aMaxSide; 
-      double aPercents;
-     
-      view3d->View()->MinMaxValues(Xmin, Ymin, Zmin, Xmax, Ymax, Zmax);
-
-      if (Xmin==RealFirst() || Ymin==RealFirst() || Zmin==RealFirst() ||
-         Xmax==RealLast()  || Ymax==RealLast()  || Zmax==RealLast())
-       return;
-           
-      aMaxSide = Xmax - Xmin;
-      if (aMaxSide < Ymax -Ymin) aMaxSide = Ymax -Ymin;
-      if (aMaxSide < Zmax -Zmin) aMaxSide = Zmax -Zmin;
-      
-      static float aSizeInPercents = 105;
-      QString aSetting = QAD_CONFIG->getSetting("Viewer:TrihedronSize");
-      if (!aSetting.isEmpty()) aSizeInPercents = aSetting.toFloat();
-
-      static float EPS = 5.0E-3;
-      float aSize = myViewer->getTrihedron()->Size();
-      float aNewSize = aMaxSide*aSizeInPercents/100.0;
-      // if the new trihedron size have sufficient difference, then apply the value
-      if(fabs(aNewSize-aSize) > aSize*EPS || fabs(aNewSize-aSize) > aNewSize*EPS)
-       myViewer->setTrihedronSize(aNewSize);
+      if ( anAIS->IsKind( STANDARD_TYPE( AIS_Shape ) ) )
+      {
+        anIC->Load( anAIS, -1, false );
+        anIC->Activate( anAIS, AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)theMode ) );
+      }
+      else if ( anAIS->DynamicType() != STANDARD_TYPE(AIS_Trihedron) )
+      {
+        anIC->Load( anAIS, -1, false );
+        anIC->Activate( anAIS, theMode );
+      }
     }
+  }
+}
+
+//=======================================================================
+// name    : GlobalSelection
+// Purpose : Deactivates selection of sub shapes
+//=======================================================================
+void OCCViewer_ViewFrame::GlobalSelection( const bool update ) const
+{
+  Handle(AIS_InteractiveContext) anIC = myViewer->getAISContext();
+  if ( !anIC.IsNull() )
+    anIC->CloseAllContexts( false );
+  if ( update )
+    anIC->CurrentViewer()->Redraw();
+}
+
+//=======================================================================
+// name    : BeforeDisplay
+// Purpose : Axiluary method called before displaying of objects
+//=======================================================================
+void  OCCViewer_ViewFrame::BeforeDisplay( SALOME_Displayer* d )
+{
+  d->BeforeDisplay( this, SALOME_OCCViewType() );
+}
+
+//=======================================================================
+// name    : AfterDisplay
+// Purpose : Axiluary method called after displaying of objects
+//=======================================================================
+void OCCViewer_ViewFrame::AfterDisplay( SALOME_Displayer* d )
+{
+  d->AfterDisplay( this, SALOME_OCCViewType() );
+}
+
+#define INCREMENT_FOR_OP 10
+
+//=======================================================================
+// name    : onPanLeft
+// Purpose : Performs incremental panning to the left
+//=======================================================================
+void OCCViewer_ViewFrame::onPanLeft()
+{
+  myViewPort->incrementalPan( -INCREMENT_FOR_OP, 0 );
+}
+
+//=======================================================================
+// name    : onPanRight
+// Purpose : Performs incremental panning to the right
+//=======================================================================
+void OCCViewer_ViewFrame::onPanRight()
+{
+  myViewPort->incrementalPan( INCREMENT_FOR_OP, 0 );
+}
+
+//=======================================================================
+// name    : onPanUp
+// Purpose : Performs incremental panning to the top
+//=======================================================================
+void OCCViewer_ViewFrame::onPanUp()
+{
+  myViewPort->incrementalPan( 0, INCREMENT_FOR_OP );
+}
+
+//=======================================================================
+// name    : onPanDown
+// Purpose : Performs incremental panning to the bottom
+//=======================================================================
+void OCCViewer_ViewFrame::onPanDown()
+{
+  myViewPort->incrementalPan( 0, -INCREMENT_FOR_OP );
+}
+
+//=======================================================================
+// name    : onZoomIn
+// Purpose : Performs incremental zooming in
+//=======================================================================
+void OCCViewer_ViewFrame::onZoomIn()
+{
+  myViewPort->incrementalZoom( INCREMENT_FOR_OP );
+}
+
+//=======================================================================
+// name    : onZoomOut
+// Purpose : Performs incremental zooming out
+//=======================================================================
+void OCCViewer_ViewFrame::onZoomOut()
+{
+  myViewPort->incrementalZoom( -INCREMENT_FOR_OP );
+}
+
+//=======================================================================
+// name    : onRotateLeft
+// Purpose : Performs incremental rotating to the left
+//=======================================================================
+void OCCViewer_ViewFrame::onRotateLeft()
+{
+  myViewPort->incrementalRotate( -INCREMENT_FOR_OP, 0 );
+}
+
+//=======================================================================
+// name    : onRotateRight
+// Purpose : Performs incremental rotating to the right
+//=======================================================================
+void OCCViewer_ViewFrame::onRotateRight()
+{
+  myViewPort->incrementalRotate( INCREMENT_FOR_OP, 0 );
+}
+
+//=======================================================================
+// name    : onRotateUp
+// Purpose : Performs incremental rotating to the top
+//=======================================================================
+void OCCViewer_ViewFrame::onRotateUp()
+{
+  myViewPort->incrementalRotate( 0, -INCREMENT_FOR_OP );
+}
+
+//=======================================================================
+// name    : onRotateDown
+// Purpose : Performs incremental rotating to the bottom
+//=======================================================================
+void OCCViewer_ViewFrame::onRotateDown()
+{
+  myViewPort->incrementalRotate( 0, INCREMENT_FOR_OP );
 }