Salome HOME
Merging with WPdev
[modules/geom.git] / src / GEOMBase / GEOMBase_Helper.cxx
index 5bb5d91e811bdd473f0322e8af9203919f48919f..fe51c488fd99f95035a985c9d5f75f2aa5e6d24f 100755 (executable)
@@ -1,23 +1,23 @@
 //  GEOM GEOMGUI : GUI for Geometry component
 //
 //  Copyright (C) 2004  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
-// 
-//  This library is free software; you can redistribute it and/or 
-//  modify it under the terms of the GNU Lesser General Public 
-//  License as published by the Free Software Foundation; either 
-//  version 2.1 of the License. 
-// 
-//  This library is distributed in the hope that it will be useful, 
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
-//  Lesser General Public License for more details. 
-// 
-//  You should have received a copy of the GNU Lesser General Public 
-//  License along with this library; if not, write to the Free Software 
-//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
-// 
-//  See http://www.salome-platform.org or email : webmaster.salome@opencascade.org 
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 //
 //
 //  Module : GEOM
 //  $Header$
 
+#include <SUIT_ViewModel.h>
+
 #include "GEOMBase_Helper.h"
 #include "GEOMBase.h"
 #include "GEOM_Operation.h"
 #include "GeometryGUI.h"
 #include "GEOM_Displayer.h"
 #include "GEOMImpl_Types.hxx"
-#include "QAD_Study.h"
-#include "QAD_Application.h"
-#include "QAD_Desktop.h"
-#include "QAD_MessageBox.h"
-#include "QAD_ViewFrame.h"
-#include "QAD_RightFrame.h"
-#include "QAD_WaitCursor.h"
-#include "SALOMEGUI_QtCatchCorbaException.hxx"
+
+#include <SUIT_Session.h>
+#include <SUIT_ViewWindow.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_OverrideCursor.h>
+
+#include <SalomeApp_Module.h>
+#include <SalomeApp_Application.h>
+#include <SalomeApp_Study.h>
+#include <LightApp_SelectionMgr.h>
+#include <SalomeApp_Tools.h>
+#include <SalomeApp_DataModel.h>
+#include <SalomeApp_Module.h>
+
+#include <OCCViewer_ViewModel.h>
+#include <SVTK_ViewModel.h>
+
+#include <OB_Browser.h>
 
 #include <TColStd_MapOfInteger.hxx>
 #include <TCollection_AsciiString.hxx>
 
 using namespace std;
 
+#include <SALOMEDSClient.hxx>
+
+
 //================================================================
 // Function : getActiveView
-// Purpose  : Get active study frame, returns 0 if no open study frame
+// Purpose  : Get active view window, returns 0 if no open study frame
 //================================================================
-static QAD_ViewFrame* getActiveView()
+static SUIT_ViewWindow* getActiveView()
 {
-  QAD_Study* activeStudy = QAD_Application::getDesktop()->getActiveStudy();
-  if ( activeStudy ) {
-    QAD_StudyFrame* sf = activeStudy->getActiveStudyFrame();
-    if ( sf ) {
-      return sf->getRightFrame()->getViewFrame();
-    }
-  }
+  SUIT_Study* activeStudy = SUIT_Session::session()->activeApplication()->activeStudy();
+  if ( activeStudy )
+    return SUIT_Session::session()->activeApplication()->desktop()->activeWindow();
+
   return 0;
 }
 
@@ -69,25 +81,27 @@ static QAD_ViewFrame* getActiveView()
 //================================================================
 GEOM::GEOM_Gen_ptr GEOMBase_Helper::getGeomEngine()
 {
-  Engines::Component_var comp = QAD_Application::getDesktop()->getEngine("FactoryServer", "GEOM");
-  return GEOM::GEOM_Gen::_narrow(comp);
+  return GeometryGUI::GetGeomGen();
 }
 
 //================================================================
 // Function : GEOMBase_Helper
 // Purpose  :
 //================================================================
-GEOMBase_Helper::GEOMBase_Helper(
-  : myViewFrame( 0 ), myDisplayer( 0 ), myCommand( 0 ), isPreview( false )
+GEOMBase_Helper::GEOMBase_Helper( SUIT_Desktop* desktop )
+  : myDesktop( desktop ), myViewWindow( 0 ), myDisplayer( 0 ), myCommand( 0 ), isPreview( false )
 {
 }
 
 //================================================================
 // Function : ~GEOMBase_Helper
-// Purpose  : 
+// Purpose  :
 //================================================================
 GEOMBase_Helper::~GEOMBase_Helper()
 {
+  if ( !SUIT_Session::session()->activeApplication()->desktop() )
+    return;
+
   if ( myPreview.size() )
     erasePreview();
   if ( hasCommand() )
@@ -95,12 +109,13 @@ GEOMBase_Helper::~GEOMBase_Helper()
 
   globalSelection( GEOM_ALLOBJECTS, true );
 
-  delete myDisplayer;
+  if (myDisplayer)
+    delete myDisplayer;
 }
 
 //================================================================
 // Function : display
-// Purpose  : 
+// Purpose  :
 //================================================================
 void GEOMBase_Helper::display( const ObjectList& objList, const bool updateView )
 {
@@ -133,7 +148,7 @@ void GEOMBase_Helper::display( GEOM::GEOM_Object_ptr object, const bool updateVi
 
 //================================================================
 // Function : erase
-// Purpose  : 
+// Purpose  :
 //================================================================
 void GEOMBase_Helper::erase( const ObjectList& objList, const bool updateView )
 {
@@ -147,7 +162,7 @@ void GEOMBase_Helper::erase( const ObjectList& objList, const bool updateView )
 
 //================================================================
 // Function : erase
-// Purpose  : 
+// Purpose  :
 //================================================================
 void GEOMBase_Helper::erase( GEOM::GEOM_Object_ptr object, const bool updateView )
 {
@@ -160,9 +175,9 @@ void GEOMBase_Helper::erase( GEOM::GEOM_Object_ptr object, const bool updateView
 
 //================================================================
 // Function : redisplay
-// Purpose  : 
+// Purpose  :
 //================================================================
-void GEOMBase_Helper::redisplay( const ObjectList& objList, 
+void GEOMBase_Helper::redisplay( const ObjectList& objList,
                                 const bool withChildren,
                                 const bool updateView )
 {
@@ -176,9 +191,9 @@ void GEOMBase_Helper::redisplay( const ObjectList& objList,
 
 //================================================================
 // Function : redisplay
-// Purpose  : 
+// Purpose  :
 //================================================================
-void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, 
+void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object,
                                 const bool withChildren,
                                 const bool updateView )
 {
@@ -187,23 +202,26 @@ void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object,
     // Default color will be used
     getDisplayer()->UnsetColor();
     getDisplayer()->UnsetWidth();
-    
+
     // Enable activisation of selection
     getDisplayer()->SetToActivate( true );
-    
+
     string entry = getEntry( object );
-    getDisplayer()->Redisplay( new SALOME_InteractiveObject( entry.c_str(), "GEOM", strdup( GEOMBase::GetName( object ) ) ), false );
+    getDisplayer()->Redisplay(new SALOME_InteractiveObject
+                              (entry.c_str(), "GEOM", strdup(GEOMBase::GetName(object))), false);
   }
-  
+
   if ( withChildren ) {
-    QAD_Study* aDoc = getStudy();
-    if ( aDoc && !CORBA::is_nil( aDoc->getStudyDocument() ) ) {
-      SALOMEDS::Study_var aStudy = aDoc->getStudyDocument();
-      SALOMEDS::SObject_var aSObj = aStudy->FindObjectIOR( GeometryGUI::GetORB()->object_to_string( object ) );
-      if ( !CORBA::is_nil( aSObj ) ) {
-       SALOMEDS::ChildIterator_var anIt = aStudy->NewChildIterator( aSObj );
+    SalomeApp_Study* aDoc = getStudy();
+    if ( aDoc && aDoc->studyDS() ) {
+      _PTR(Study) aStudy = aDoc->studyDS();
+      CORBA::String_var objStr = SalomeApp_Application::orb()->object_to_string(object);
+      _PTR(SObject) aSObj (aStudy->FindObjectIOR(string(objStr.in())));
+      if ( aSObj  ) {
+       _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) );
        for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) {
-         GEOM::GEOM_Object_var aChild = GEOM::GEOM_Object::_narrow( anIt->Value()->GetObject() );
+         GEOM::GEOM_Object_var aChild = GEOM::GEOM_Object::_narrow
+            (GeometryGUI::ClientSObjectToObject(anIt->Value()));
          if ( !CORBA::is_nil( aChild ) ) {
            if ( !aChild->_is_nil() ) {
              string entry = getEntry( aChild );
@@ -212,10 +230,10 @@ void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object,
            }
          }
        }
-      }    
+      }
     }
   }
-  
+
   if ( updateView )
     getDisplayer()->UpdateViewer();
 }
@@ -229,22 +247,22 @@ void GEOMBase_Helper::displayPreview( const bool   activate,
                                       const bool   toRemoveFromEngine,
                                       const double lineWidth )
 {
-  isPreview = true; 
+  isPreview = true;
   QString msg;
   if ( !isValid( msg ) )
   {
     erasePreview( update );
-    isPreview = false; 
+    isPreview = false;
     return;
   }
 
   erasePreview( false );
 
   try {
-    QAD_WaitCursor wc;
+    SUIT_OverrideCursor wc;
     ObjectList objects;
     if ( !execute( objects ) || !getOperation()->IsDone() ) {
-      wc.stop();
+      wc.suspend();
     }
     else {
       for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it )
@@ -256,7 +274,7 @@ void GEOMBase_Helper::displayPreview( const bool   activate,
     }
   }
   catch( const SALOME::SALOME_Exception& e ) {
-    QtCatchCorbaException( e );
+    SalomeApp_Tools::QtCatchCorbaException( e );
   }
 
   isPreview = false;
@@ -271,7 +289,7 @@ void GEOMBase_Helper::displayPreview( const bool   activate,
 //================================================================
 void GEOMBase_Helper::displayPreview( GEOM::GEOM_Object_ptr object,
                                       const bool            append,
-                                      const bool            activate, 
+                                      const bool            activate,
                                       const bool            update,
                                       const double          lineWidth )
 {
@@ -285,8 +303,9 @@ void GEOMBase_Helper::displayPreview( GEOM::GEOM_Object_ptr object,
   getDisplayer()->SetToActivate( activate );
 
   // Make a reference to GEOM_Object
-  getDisplayer()->SetName( GeometryGUI::GetORB()->object_to_string( object ) );
-  
+  CORBA::String_var objStr = SalomeApp_Application::orb()->object_to_string( object );
+  getDisplayer()->SetName( objStr.in() );
+
   // Build prs
   SALOME_Prs* aPrs = getDisplayer()->BuildPrs( object );
   if ( aPrs == 0 || aPrs->IsNull() )
@@ -313,34 +332,52 @@ void GEOMBase_Helper::displayPreview( const SALOME_Prs* prs,
     erasePreview( false );
 
   // remember current view frame to make correct erase preview later
-  myViewFrame = getActiveView();
+  myViewWindow = getActiveView();
 
-  if ( myViewFrame == 0 )
+  if ( myViewWindow == 0 )
     return;
 
   // Display prs
-  ( (SALOME_View*)myViewFrame )->Display( prs );
+  SUIT_ViewManager* aViewManager = myViewWindow->getViewManager();
+  if ( aViewManager->getType() == OCCViewer_Viewer::Type() ||
+       aViewManager->getType() == SVTK_Viewer::Type() )
+    {
+      SUIT_ViewModel* aViewModel = aViewManager->getViewModel();
+      SALOME_View* aView = dynamic_cast<SALOME_View*>(aViewModel);
+      if (aView)
+       aView->Display( prs );
+    }
 
   // Add prs to the preview list
   myPreview.push_back( (SALOME_Prs*)prs );
 
   // Update viewer
   if ( update )
-    myViewFrame->Repaint();
+    getDisplayer()->UpdateViewer();
 }
 
 //================================================================
 // Function : erasePreview
-// Purpose  : 
+// Purpose  :
 //================================================================
 void GEOMBase_Helper::erasePreview( const bool update )
 {
   // check view frame where the preview was displayed
-  bool vfOK = checkViewFrame() && myViewFrame;
+  bool vfOK = checkViewWindow() && myViewWindow;
   // Iterate through presentations and delete them
   for ( PrsList::iterator anIter = myPreview.begin(); anIter != myPreview.end(); ++anIter ) {
     if ( vfOK )
-      ( (SALOME_View*)myViewFrame )->Erase( *anIter, true );
+      {
+        SUIT_ViewManager* aViewManager = myViewWindow->getViewManager();
+        if ( aViewManager->getType() == OCCViewer_Viewer::Type() ||
+             aViewManager->getType() == SVTK_Viewer::Type() )
+          {
+            SUIT_ViewModel* aViewModel = aViewManager->getViewModel();
+            SALOME_View* aView = dynamic_cast<SALOME_View*>(aViewModel);
+            if (aView)
+              aView->Erase( *anIter, true );
+          }
+      }
     delete *anIter;
   }
   myPreview.clear();
@@ -357,29 +394,31 @@ void GEOMBase_Helper::erasePreview( const bool update )
 //================================================================
 void GEOMBase_Helper::activate( const int theType )
 {
-  SALOMEDS::Study_var aStudy = getStudy()->getStudyDocument();
-  SALOMEDS::SComponent_var aGeom = aStudy->FindComponent( "GEOM" );
-  if ( aGeom->_is_nil() )
+  if (!getStudy()) return;
+  _PTR(Study) aStudy = getStudy()->studyDS();
+  _PTR(SComponent) aGeom ( aStudy->FindComponent( "GEOM" ) );
+  if ( !aGeom )
     return;
 
   SALOME_ListIO aList;
-  SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator( aGeom );
+  _PTR(ChildIterator) anIter ( aStudy->NewChildIterator( aGeom ) );
   for ( ; anIter->More(); anIter->Next() )
   {
-    SALOMEDS::SObject_var aSO = anIter->Value();
-    if ( !aSO->_is_nil() )
+    _PTR(SObject) aSO ( anIter->Value() );
+    if ( aSO )
     {
-      SALOMEDS::SObject_var aRefSO;
+      _PTR(SObject) aRefSO;
       if ( !aSO->ReferencedObject( aRefSO ) )
       {
-        GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow( aSO->GetObject() );
+        GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow
+          (GeometryGUI::ClientSObjectToObject(aSO));
         if ( !anObj->_is_nil() && anObj->GetType() == theType )
-          aList.Append( new SALOME_InteractiveObject( aSO->GetID(), "GEOM", aSO->GetName()) );
+          aList.Append( new SALOME_InteractiveObject( aSO->GetID().c_str(), "GEOM", aSO->GetName().c_str()) );
       }
     }
   }
 
-  myDisplayer->LocalSelection( aList, 0 );
+  getDisplayer()->LocalSelection( aList, 0 );
 }
 
 //================================================================
@@ -390,7 +429,7 @@ void GEOMBase_Helper::activate( const int theType )
 void GEOMBase_Helper::localSelection( const ObjectList& theObjs, const int theMode )
 {
   SALOME_ListIO aListOfIO;
-  
+
   ObjectList::const_iterator anIter = theObjs.begin();
   for ( ; anIter != theObjs.end(); ++anIter )
   {
@@ -403,7 +442,7 @@ void GEOMBase_Helper::localSelection( const ObjectList& theObjs, const int theMo
         aEntry.c_str(), "GEOM", strdup( GEOMBase::GetName( anObj ) ) ) );
   }
 
-  myDisplayer->LocalSelection( aListOfIO, theMode );
+  getDisplayer()->LocalSelection( aListOfIO, theMode );
 }
 
 //================================================================
@@ -415,7 +454,7 @@ void GEOMBase_Helper::localSelection( GEOM::GEOM_Object_ptr obj, const int mode
 {
   // If object is null local selection for all objects is activated
   if ( obj->_is_nil() ) {
-    myDisplayer->LocalSelection( Handle(SALOME_InteractiveObject)(), mode );
+    getDisplayer()->LocalSelection( Handle(SALOME_InteractiveObject)(), mode );
     return;
   }
 
@@ -432,7 +471,7 @@ void GEOMBase_Helper::localSelection( GEOM::GEOM_Object_ptr obj, const int mode
 //================================================================
 void GEOMBase_Helper::globalSelection( const int theMode, const bool update )
 {
-  myDisplayer->GlobalSelection( theMode, update );
+  getDisplayer()->GlobalSelection( theMode, update );
 }
 
 //================================================================
@@ -443,7 +482,7 @@ void GEOMBase_Helper::globalSelection( const int theMode, const bool update )
 void GEOMBase_Helper::globalSelection( const TColStd_MapOfInteger& theModes,
                                       const bool update )
 {
-  myDisplayer->GlobalSelection( theModes, update );
+  getDisplayer()->GlobalSelection( theModes, update );
 }
 
 //================================================================
@@ -455,13 +494,14 @@ void GEOMBase_Helper::addInStudy( GEOM::GEOM_Object_ptr theObj, const char* theN
   if ( !hasCommand() )
     return;
 
-  SALOMEDS::Study_var aStudy = getStudy()->getStudyDocument();
-  if ( aStudy->_is_nil() || theObj->_is_nil() )
+  _PTR(Study) aStudy = getStudy()->studyDS();
+  if ( !aStudy || theObj->_is_nil() )
     return;
 
   GEOM::GEOM_Object_ptr aFatherObj = getFather( theObj );
 
-  GeometryGUI::GetGeomGUI()->GetGeomGen()->AddInStudy( aStudy, theObj, theName, aFatherObj );
+  getGeomEngine()->AddInStudy(GeometryGUI::ClientStudyToStudy(aStudy),
+                              theObj, theName, aFatherObj);
 }
 
 //================================================================
@@ -470,7 +510,14 @@ void GEOMBase_Helper::addInStudy( GEOM::GEOM_Object_ptr theObj, const char* theN
 //================================================================
 void GEOMBase_Helper::updateObjBrowser() const
 {
-  getStudy()->updateObjBrowser();
+  SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
+  if (app) {
+    CAM_Module* module = app->module( "Geometry" );
+    SalomeApp_Module* appMod = dynamic_cast<SalomeApp_Module*>( module );
+    if ( appMod ) {
+      appMod->updateObjBrowser( true );
+    }
+  }
 }
 
 //================================================================
@@ -490,34 +537,49 @@ int GEOMBase_Helper::getStudyId() const
 {
   int anId = -1;
   if ( getStudy() )
-    anId = getStudy()->getStudyId();
+    anId = getStudy()->id();
   return anId;
 }
 
 //================================================================
 // Function : getStudy
-// Purpose  : Returns the active study. It is recommended to use 
+// Purpose  : Returns the active study. It is recommended to use
 //            this method instead of direct desktop->getActiveStudy() calls
 //================================================================
-QAD_Study* GEOMBase_Helper::getStudy() const
+SalomeApp_Study* GEOMBase_Helper::getStudy() const
 {
-  // Probably, it would be better to rememeber the active study in helper...
-  return QAD_Application::getDesktop()->getActiveStudy();
+  SUIT_Desktop* aDesktop = getDesktop();
+  if (!aDesktop)
+    return 0;
+
+  QPtrList<SUIT_Application> anAppList = SUIT_Session::session()->applications();
+
+  SUIT_Application* anApp = 0;
+  for ( QPtrListIterator<SUIT_Application> it( anAppList ); it.current() ; ++it )
+    {
+      anApp = it.current();
+      if ( anApp->desktop() == aDesktop )
+       break;
+    }
+
+  return dynamic_cast<SalomeApp_Study*>(anApp->activeStudy());
 }
 
 //================================================================
 // Function : getEntry
-// Purpose  : 
+// Purpose  :
 //================================================================
 char* GEOMBase_Helper::getEntry( GEOM::GEOM_Object_ptr object ) const
 {
-  QAD_Study* study = getStudy();
+  SalomeApp_Study* study = getStudy();
   if ( study )  {
-    string IOR = GEOMBase::GetIORFromObject( object);
+    char * objIOR = GEOMBase::GetIORFromObject( object );
+    string IOR( objIOR );
+    free( objIOR );
     if ( IOR != "" ) {
-      SALOMEDS::SObject_var SO = study->getStudyDocument()->FindObjectIOR( IOR.c_str() );
-      if ( !SO->_is_nil() ) {
-       return SO->GetID();
+      _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( IOR ) );
+      if ( SO ) {
+             return TCollection_AsciiString((char*)SO->GetID().c_str()).ToCString();
       }
     }
   }
@@ -526,70 +588,70 @@ char* GEOMBase_Helper::getEntry( GEOM::GEOM_Object_ptr object ) const
 
 //================================================================
 // Function : getDisplayer
-// Purpose  : 
+// Purpose  :
 //================================================================
 GEOM_Displayer* GEOMBase_Helper::getDisplayer()
 {
   if ( !myDisplayer )
-    myDisplayer = new GEOM_Displayer();
+    myDisplayer = new GEOM_Displayer( getStudy() );
   return myDisplayer;
 }
 
 //================================================================
 // Function : clearShapeBuffer
-// Purpose  : 
+// Purpose  :
 //================================================================
 void GEOMBase_Helper::clearShapeBuffer( GEOM::GEOM_Object_ptr theObj )
 {
   if ( CORBA::is_nil( theObj ) )
     return;
 
-  string IOR = GeometryGUI::GetORB()->object_to_string( theObj );
-  TCollection_AsciiString asciiIOR( strdup( IOR.c_str() ) );
-  GeometryGUI::GetGeomGUI()->GetShapeReader().RemoveShapeFromBuffer( asciiIOR );
+  CORBA::String_var IOR = SalomeApp_Application::orb()->object_to_string( theObj );
+  TCollection_AsciiString asciiIOR( (char *)IOR.in() );
+  GEOM_Client().RemoveShapeFromBuffer( asciiIOR );
 
-  if ( !getStudy() || CORBA::is_nil( getStudy()->getStudyDocument() ) )
+  if ( !getStudy() || !getStudy()->studyDS() )
     return;
 
-  SALOMEDS::Study_var aStudy = getStudy()->getStudyDocument();
-  SALOMEDS::SObject_var aSObj = aStudy->FindObjectIOR( IOR.c_str() );
-  if ( CORBA::is_nil( aSObj ) )
+  _PTR(Study) aStudy = getStudy()->studyDS();
+  _PTR(SObject) aSObj ( aStudy->FindObjectIOR( string( IOR ) ) );
+  if ( !aSObj )
     return;
 
-  SALOMEDS::ChildIterator_var anIt = aStudy->NewChildIterator( aSObj );
+  _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) );
   for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) {
-    SALOMEDS::GenericAttribute_var anAttr;
+    _PTR(GenericAttribute) anAttr;
     if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) {
-      SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
-      TCollection_AsciiString asciiIOR( anIOR->Value() );
-      GeometryGUI::GetGeomGUI()->GetShapeReader().RemoveShapeFromBuffer( asciiIOR );      
+      _PTR(AttributeIOR) anIOR ( anAttr );
+      TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() );
+      GEOM_Client().RemoveShapeFromBuffer( asciiIOR );
     }
   }
 }
 
 //================================================================
 // Function : openCommand
-// Purpose  : 
+// Purpose  :
 //================================================================
-bool GEOMBase_Helper::openCommand() 
+bool GEOMBase_Helper::openCommand()
 {
   bool res = false;
   if ( !getStudy() || hasCommand() )
     return res;
-  
+
   GEOM::GEOM_IOperations_var anOp = GEOM::GEOM_IOperations::_narrow( getOperation() );
   if ( !anOp->_is_nil() ) {
-    myCommand = new GEOM_Operation( getStudy(), anOp.in() );
+    myCommand = new GEOM_Operation( SUIT_Session::session()->activeApplication(), anOp.in() );
     myCommand->start();
     res = true;
   }
+
   return res;
 }
 
 //================================================================
 // Function : abortCommand
-// Purpose  : 
+// Purpose  :
 //================================================================
 bool GEOMBase_Helper::abortCommand()
 {
@@ -598,28 +660,28 @@ bool GEOMBase_Helper::abortCommand()
 
   myCommand->abort();
   myCommand = 0;
-  return true;  
+
+  return true;
 }
 
 //================================================================
 // Function : commitCommand
-// Purpose  : 
+// Purpose  :
 //================================================================
 bool GEOMBase_Helper::commitCommand( const char* )
 {
   if ( !hasCommand() )
     return false;
 
-  myCommand->finish();
+  myCommand->commit();
   myCommand = 0;
 
-  return true;  
+  return true;
 }
 
 //================================================================
 // Function : hasCommand
-// Purpose  : 
+// Purpose  :
 //================================================================
 bool GEOMBase_Helper::hasCommand() const
 {
@@ -628,7 +690,7 @@ bool GEOMBase_Helper::hasCommand() const
 
 //================================================================
 // Function : getOperation
-// Purpose  : 
+// Purpose  :
 //================================================================
 GEOM::GEOM_IOperations_ptr GEOMBase_Helper::getOperation()
 {
@@ -641,41 +703,40 @@ GEOM::GEOM_IOperations_ptr GEOMBase_Helper::getOperation()
 
 
 //================================================================
-// Function : checkViewFrame
-// Purpose  : 
+// Function : checkViewWindow
+// Purpose  :
 //================================================================
-bool GEOMBase_Helper::checkViewFrame()
+bool GEOMBase_Helper::checkViewWindow()
 {
-  if ( myViewFrame ){
-    QListIterator<QAD_Study> it( QAD_Application::getDesktop()->getActiveApp()->getStudies() );
-    for ( ; it.current(); ++it ) {
-      QListIterator<QAD_StudyFrame> it1( it.current()->getStudyFrames() );
-      for ( ; it1.current(); ++it1 ) {
-       if ( myViewFrame == it1.current()->getRightFrame()->getViewFrame() )
+  if ( myViewWindow ){
+    QPtrList<SUIT_ViewWindow> aViewWindowsList = SUIT_Session::session()->activeApplication()->desktop()->windows();
+    for ( QPtrListIterator<SUIT_ViewWindow> it( aViewWindowsList ); it.current(); ++it )
+      {
+       if ( myViewWindow == it.current() )
          return true;
       }
-    }
   }
-  myViewFrame = 0;
+  myViewWindow = 0;
   return false;
 }
 
 //================================================================
 // Function : onAccept
 // Purpose  : This method should be called from dialog's slots onOk() and onApply()
-//            It perfroms user input validation, then it 
+//            It perfroms user input validation, then it
 //            performs a proper operation and manages transactions, etc.
 //================================================================
 bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction )
 {
-  QAD_Study* aDoc = QAD_Application::getDesktop()->getActiveStudy();
-  SALOMEDS::Study_var aStudy = aDoc->getStudyDocument();
+  SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( SUIT_Session::session()->activeApplication()->activeStudy() );
+  if ( !appStudy ) return false;
+  _PTR(Study) aStudy = appStudy->studyDS();
 
-  bool aLocked = aStudy->GetProperties()->IsLocked();
+  bool aLocked = (_PTR(AttributeStudyProperties) (aStudy->GetProperties()))->IsLocked();
   if ( aLocked ) {
     MESSAGE("GEOMBase_Helper::onAccept - ActiveStudy is locked");
-    QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(),
-                          QObject::tr("WRN_WARNING"), 
+    SUIT_MessageBox::warn1 ( (QWidget*)SUIT_Session::session()->activeApplication()->desktop(),
+                          QObject::tr("WRN_WARNING"),
                           QObject::tr("WRN_STUDY_LOCKED"),
                           QObject::tr("BUT_OK") );
     return false;
@@ -691,24 +752,32 @@ bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction )
 
   try {
     if ( ( !publish && !useTransaction ) || openCommand() ) {
-      QAD_WaitCursor wc;
-      QAD_Application::getDesktop()->putInfo( "" );
+      SUIT_OverrideCursor wc;
+      SUIT_Session::session()->activeApplication()->putInfo( "" );
       ObjectList objects;
       if ( !execute( objects ) || !getOperation()->IsDone() ) {
-       wc.stop();
+       wc.suspend();
        abortCommand();
        showError();
       }
       else {
        const int nbObjs = objects.size();
        bool withChildren = false;
+        int aNumber = 1;
        for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it ) {
          if ( publish ) {
-           QString aName("");
-           if ( nbObjs > 1 )
-             aName = strlen( getNewObjectName() ) ? GEOMBase::GetDefaultName( getNewObjectName() ) : GEOMBase::GetDefaultName( getPrefix( *it ) );
-           else {
-             aName = getNewObjectName();
+           QString aName = getNewObjectName();
+           if ( nbObjs > 1 ) {
+              if (aName.isEmpty())
+                aName = getPrefix(*it);
+              if (nbObjs <= 30) {
+                // Try to find a unique name
+                aName = GEOMBase::GetDefaultName(aName);
+              } else {
+                // Don't check name uniqueness in case of numerous objects
+                aName = aName + "_" + QString::number(aNumber++);
+              }
+           } else {
              // PAL6521: use a prefix, if some dialog box doesn't reimplement getNewObjectName()
              if ( aName.isEmpty() )
                aName = GEOMBase::GetDefaultName( getPrefix( *it ) );
@@ -717,7 +786,7 @@ bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction )
            withChildren = false;
            display( *it, false );
          }
-         else { // asv : fix of PAL6454. If publish==false, then the original shape was modified, and need to be re-cached in GEOM_Client 
+         else { // asv : fix of PAL6454. If publish==false, then the original shape was modified, and need to be re-cached in GEOM_Client
                 // before redisplay
            clearShapeBuffer( *it );
            withChildren = true;
@@ -728,7 +797,7 @@ bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction )
        if ( nbObjs ) {
          commitCommand();
          updateObjBrowser();
-         QAD_Application::getDesktop()->putInfo( QObject::tr("GEOM_PRP_DONE") );
+         SUIT_Session::session()->activeApplication()->putInfo( QObject::tr("GEOM_PRP_DONE") );
        }
        else
          abortCommand();
@@ -736,7 +805,7 @@ bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction )
     }
   }
   catch( const SALOME::SALOME_Exception& e ) {
-    QtCatchCorbaException( e );
+    SalomeApp_Tools::QtCatchCorbaException( e );
     abortCommand();
   }
 
@@ -759,10 +828,10 @@ void GEOMBase_Helper::showError()
   if ( msg.isEmpty() )
     msg = QObject::tr( "GEOM_PRP_ABORT" );
 
-  QAD_MessageBox::error1( QAD_Application::getDesktop(), 
-                         QObject::tr( "GEOM_ERROR_STATUS" ), 
-                         msg, 
-                         QObject::tr( "BUT_OK" ) );
+  SUIT_MessageBox::error1( SUIT_Session::session()->activeApplication()->desktop(),
+                          QObject::tr( "GEOM_ERROR_STATUS" ),
+                          msg,
+                          QObject::tr( "BUT_OK" ) );
 }
 
 //================================================================
@@ -774,7 +843,7 @@ void GEOMBase_Helper::showError( const QString& msg )
   QString str( QObject::tr( "GEOM_INCORRECT_INPUT" ) );
   if ( !msg.isEmpty() )
     str += "\n" + msg;
-  QAD_MessageBox::error1( QAD_Application::getDesktop(), QObject::tr( "GEOM_ERROR" ), str, QObject::tr( "BUT_OK" ) );
+  SUIT_MessageBox::error1(SUIT_Session::session()->activeApplication()->desktop(), QObject::tr( "GEOM_ERROR" ), str, QObject::tr( "BUT_OK" ) );
 }
 
 //////////////////////////////////////////////////////////////////
@@ -802,8 +871,8 @@ bool GEOMBase_Helper::isValid( QString& )
 
 //================================================================
 // Function : execute
-// Purpose  : This method is called by onAccept(). 
-//            It should perform the required operation and put all new or modified objects into 
+// Purpose  : This method is called by onAccept().
+//            It should perform the required operation and put all new or modified objects into
 //            <objects> argument.Should return <false> if some error occurs during its execution.
 //================================================================
 bool GEOMBase_Helper::execute( ObjectList& objects )
@@ -843,9 +912,9 @@ QString GEOMBase_Helper::getPrefix( GEOM::GEOM_Object_ptr theObj ) const
   TopoDS_Shape aShape;
   if ( !GEOMBase::GetShape( theObj, aShape ) )
     return "";
-  
+
   long aType = aShape.ShapeType();
-  
+
   switch ( aType )
   {
     case TopAbs_VERTEX   : return QObject::tr( "GEOM_VERTEX" );
@@ -860,4 +929,59 @@ QString GEOMBase_Helper::getPrefix( GEOM::GEOM_Object_ptr theObj ) const
   }
 }
 
+//================================================================
+// Function : selectedIO
+// Purpose  : Return the list of selected SALOME_InteractiveObject's
+//================================================================
+const SALOME_ListIO& GEOMBase_Helper::selectedIO()
+{
+  mySelected.Clear();
+
+  SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
+  if ( app ) {
+    LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
+    if ( aSelMgr )
+      aSelMgr->selectedObjects( mySelected );
+  }
+
+  return mySelected;
+}
+
+//================================================================
+// Function : IObjectCount
+// Purpose  : Return the number of selected objects
+//================================================================
+int GEOMBase_Helper::IObjectCount()
+{
+  return selectedIO().Extent();
+}
+
+//================================================================
+// Function : firstIObject
+// Purpose  :  Return the first selected object in the selected object list
+//================================================================
+Handle(SALOME_InteractiveObject) GEOMBase_Helper::firstIObject()
+{
+  const SALOME_ListIO& aList = selectedIO();
+  return aList.Extent() > 0 ? aList.First() : Handle(SALOME_InteractiveObject)();
+}
+
+//================================================================
+// Function : lastIObject
+// Purpose  : Return the last selected object in the selected object list
+//================================================================
+Handle(SALOME_InteractiveObject) GEOMBase_Helper::lastIObject()
+{
+  const SALOME_ListIO& aList = selectedIO();
+  return aList.Extent() > 0 ? aList.Last() : Handle(SALOME_InteractiveObject)();
+}
+
+//================================================================
+// Function : getDesktop
+// Purpose  : Returns myDesktop field.  Initialized in constructor, usually as dynamic_cast<SUIT_Desktop*>(parentWidget())
+//================================================================
+SUIT_Desktop* GEOMBase_Helper::getDesktop() const
+{
+  return myDesktop;
+}