Salome HOME
Merge branch V7_3_1_BR
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_SingleEditDlg.cxx
index b25953d4cd3e6ff3326c9cea17b7b855c5cda2d0..df03f4559971db547b29401de65a83c1bfe7dd64 100755 (executable)
-//  SMESH SMESHGUI : GUI for SMESH component
+// Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
 //
-//  Copyright (C) 2003  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+// Copyright (C) 2003-2007  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, or (at your option) any later version.
 //
+// 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
 //
-//  File   : SMESHGUI_SingleEditDlg.cxx
-//  Author : Sergey LITONIN
-//  Module : SMESH
 
+// File   : SMESHGUI_SingleEditDlg.cxx
+// Author : Sergey LITONIN, Open CASCADE S.A.S.
+// SMESH includes
+//
 #include "SMESHGUI_SingleEditDlg.h"
 
-#include "QAD_Desktop.h"
-
 #include "SMESHGUI.h"
 #include "SMESHGUI_Utils.h"
 #include "SMESHGUI_VTKUtils.h"
 #include "SMESHGUI_MeshUtils.h"
 
-#include "SMESHGUI_SpinBox.h"
-
-#include "utilities.h"
-#include "SALOME_Selection.h"
-#include "SMESH_Actor.h"
-#include "SMDS_Mesh.hxx"
-
-#include <qframe.h>
-#include <qlayout.h>
-#include <qlineedit.h>
-#include <qpushbutton.h>
-#include <qgroupbox.h>
-#include <qlabel.h>
-#include <qmessagebox.h>
-#include <qvalidator.h>
-
-
-#define SPACING 5
-#define MARGIN  10
-
-
-/*
-  Class       : SMESHGUI_DiagValidator
-  Description : validate munual input of edge like "id1-id2"
+#include <SMESH_Actor.h>
+#include <SMDS_Mesh.hxx>
+
+// SALOME GUI includes
+#include <LightApp_SelectionMgr.h>
+#include <LightApp_Application.h>
+#include <SUIT_ResourceMgr.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_Desktop.h>
+#include <SUIT_Session.h>
+
+#include <SVTK_Selector.h>
+#include <SVTK_ViewWindow.h>
+#include <SALOME_ListIO.hxx>
+
+// OCCT includes
+#include <TColStd_MapOfInteger.hxx>
+#include <TColStd_IndexedMapOfInteger.hxx>
+
+// Qt includes
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QLineEdit>
+#include <QPushButton>
+#include <QGroupBox>
+#include <QLabel>
+#include <QValidator>
+#include <QKeyEvent>
+
+#define SPACING 6
+#define MARGIN  11
+
+/*!
+  \class BusyLocker
+  \brief Simple 'busy state' flag locker.
+  \internal
 */
-class SMESHGUI_DiagValidator: public QValidator
+
+class BusyLocker
 {
- public:
-
-  SMESHGUI_DiagValidator(QWidget * parent, const char * name = 0):
-    QValidator(parent,name) {}
-
-  State validate ( QString & text, int & pos) const
-  {
-    text.stripWhiteSpace();
-    text.replace( QRegExp("[^0-9]+"), "-" );
-    if ( text == "-" )
-      text = "";
-    int ind = text.find( QRegExp("-[0-9]+-"));
-    if ( ind > 0 ) { // leave only two ids
-      ind = text.find( '-', ind + 1 );
-      if ( ind > 0 )
-        text.truncate( ind );
-    }
-    if ( pos > text.length() )
-      pos = text.length();
-    return Acceptable;
-  }
+public:
+  //! Constructor. Sets passed boolean flag to \c true.
+  BusyLocker( bool& busy ) : myBusy( busy ) { myBusy = true; }
+  //! Destructor. Clear external boolean flag passed as parameter to the constructor to \c false.
+  ~BusyLocker() { myBusy = false; }
+private:
+  bool& myBusy; //! External 'busy state' boolean flag
 };
 
-/*
-  Class       : SMESHGUI_SingleEditDlg
-  Description : Inversion of the diagonal of a pseudo-quadrangle formed by 
-                2 neighboring triangles with 1 common edge
-*/
+/*!
 Class       : SMESHGUI_SingleEditDlg
+ *  Description : Inversion of the diagonal of a pseudo-quadrangle formed by
               2 neighboring triangles with 1 common edge
+ */
 
 //=======================================================================
-// name    : SMESHGUI_SingleEditDlg::SMESHGUI_SingleEditDlg
+// name    : SMESHGUI_SingleEditDlg()
 // Purpose : Constructor
 //=======================================================================
-SMESHGUI_SingleEditDlg::SMESHGUI_SingleEditDlg( QWidget*          theParent, 
-                                                      SALOME_Selection* theSelection,
-                                                      const char*       theName )
-: QDialog( theParent, theName, false, 
-           WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu )
+SMESHGUI_SingleEditDlg
+::SMESHGUI_SingleEditDlg(SMESHGUI* theModule)
+  : QDialog(SMESH::GetDesktop(theModule)),
+    mySelector(SMESH::GetViewWindow(theModule)->GetSelector()),
+    mySelectionMgr(SMESH::GetSelectionMgr(theModule)),
+    mySMESHGUI(theModule)
 {
-  //setCaption( tr( "CAPTION" ) );
+  setModal(false);
 
-  QVBoxLayout* aDlgLay = new QVBoxLayout( this, MARGIN, SPACING );
+  QVBoxLayout* aDlgLay = new QVBoxLayout(this);
+  aDlgLay->setMargin(MARGIN);
+  aDlgLay->setSpacing(SPACING);
 
-  QFrame* aMainFrame = createMainFrame  ( this );
-  QFrame* aBtnFrame  = createButtonFrame( this );
+  QWidget* aMainFrame = createMainFrame  (this);
+  QWidget* aBtnFrame  = createButtonFrame(this);
 
-  aDlgLay->addWidget( aMainFrame );
-  aDlgLay->addWidget( aBtnFrame );
+  aDlgLay->addWidget(aMainFrame);
+  aDlgLay->addWidget(aBtnFrame);
 
-  aDlgLay->setStretchFactor( aMainFrame, 1 );
-
-  Init( theSelection ) ; 
+  Init();
 }
 
 //=======================================================================
-// name    : SMESHGUI_SingleEditDlg::createMainFrame
+// name    : createMainFrame()
 // Purpose : Create frame containing dialog's input fields
 //=======================================================================
-QFrame* SMESHGUI_SingleEditDlg::createMainFrame( QWidget* theParent )
+QWidget* SMESHGUI_SingleEditDlg::createMainFrame (QWidget* theParent)
 {
-  QGroupBox* aMainGrp = new QGroupBox( 1, Qt::Vertical, tr( "EDGE_BETWEEN" ), theParent );
+  QGroupBox* aMainGrp = new QGroupBox(tr("EDGE_BETWEEN"), theParent);
+  QHBoxLayout* aLay = new QHBoxLayout(aMainGrp);
+  aLay->setMargin(MARGIN);
+  aLay->setSpacing(SPACING);
+
+  QPixmap aPix (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
 
-  QPixmap aPix( QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr( "ICON_SELECT" ) ) );
-  
-  new QLabel( tr( "SMESH_EDGE" ), aMainGrp );
-  ( new QPushButton( aMainGrp ) )->setPixmap( aPix );
-  myEdge = new QLineEdit( aMainGrp );
-  myEdge->setValidator( new SMESHGUI_DiagValidator( this, "validator" ));
+  QLabel* aLab = new QLabel(tr("SMESH_EDGE"), aMainGrp);
+  QPushButton* aBtn = new QPushButton(aMainGrp);
+  aBtn->setIcon(aPix);
+  myEdge = new QLineEdit(aMainGrp);
+  myEdge->setValidator(new QRegExpValidator(QRegExp("[\\d]*-[\\d]*"), this));
+
+  aLay->addWidget(aLab);
+  aLay->addWidget(aBtn);
+  aLay->addWidget(myEdge);
 
   return aMainGrp;
 }
 
 //=======================================================================
-// name    : SMESHGUI_SingleEditDlg::createButtonFrame
+// name    : createButtonFrame()
 // Purpose : Create frame containing buttons
 //=======================================================================
-QFrame* SMESHGUI_SingleEditDlg::createButtonFrame( QWidget* theParent )
+QWidget* SMESHGUI_SingleEditDlg::createButtonFrame (QWidget* theParent)
 {
-  QFrame* aFrame = new QFrame( theParent );
-  aFrame->setFrameStyle( QFrame::Box | QFrame::Sunken );
-
-  myOkBtn     = new QPushButton( tr( "SMESH_BUT_OK"    ), aFrame );
-  myApplyBtn  = new QPushButton( tr( "SMESH_BUT_APPLY" ), aFrame );
-  myCloseBtn  = new QPushButton( tr( "SMESH_BUT_CLOSE" ), aFrame );
+  QGroupBox* aFrame = new QGroupBox(theParent);
 
-  QSpacerItem* aSpacer = new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum );
+  myOkBtn     = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), aFrame);
+  myApplyBtn  = new QPushButton(tr("SMESH_BUT_APPLY"), aFrame);
+  myCloseBtn  = new QPushButton(tr("SMESH_BUT_CLOSE"), aFrame);
+  myHelpBtn   = new QPushButton(tr("SMESH_BUT_HELP"),  aFrame);
 
-  QHBoxLayout* aLay = new QHBoxLayout( aFrame, MARGIN, SPACING );
+  QHBoxLayout* aLay = new QHBoxLayout(aFrame);
+  aLay->setMargin(MARGIN);
+  aLay->setSpacing(SPACING);
 
-  aLay->addWidget( myOkBtn );
-  aLay->addWidget( myApplyBtn );
-  aLay->addItem( aSpacer);
-  aLay->addWidget( myCloseBtn );
+  aLay->addWidget(myOkBtn);
+  aLay->addSpacing(10);
+  aLay->addWidget(myApplyBtn);
+  aLay->addSpacing(10);
+  aLay->addStretch();
+  aLay->addWidget(myCloseBtn);
+  aLay->addWidget(myHelpBtn);
 
   return aFrame;
 }
 
 //=======================================================================
-// name    : SMESHGUI_SingleEditDlg::isValid
+// name    : isValid()
 // Purpose : Verify validity of input data
 //=======================================================================
-bool SMESHGUI_SingleEditDlg::isValid( const bool theMess ) const
+bool SMESHGUI_SingleEditDlg::isValid (const bool theMess) const
 {
   int id1, id2;
-  return getNodeIds( myEdge->text(), id1, id2 );
+  return getNodeIds(myEdge->text(), id1, id2);
 }
 
 //=======================================================================
-// name    : SMESHGUI_SingleEditDlg::getNodeIds
+// name    : getNodeIds()
 // Purpose : Retrieve node ids from string
 //=======================================================================
-bool SMESHGUI_SingleEditDlg::getNodeIds( const QString& theStr, int& theId1, int&  theId2 ) const
+bool SMESHGUI_SingleEditDlg::getNodeIds (const QString& theStr,
+                                         int& theId1, int&  theId2) const
 {
-  if ( !theStr.contains( '-' ) )
+  if (!theStr.contains('-'))
     return false;
 
   bool ok1, ok2;
-  QString str1 = theStr.section( '-', 0, 0, QString::SectionSkipEmpty );
-  QString str2 = theStr.section( '-', 1, 1, QString::SectionSkipEmpty );
-  theId1 = str1.toInt( &ok1 );
-  theId2 = str2.toInt( &ok2 );
-  
+  QString str1 = theStr.section('-', 0, 0, QString::SectionSkipEmpty);
+  QString str2 = theStr.section('-', 1, 1, QString::SectionSkipEmpty);
+  theId1 = str1.toInt(&ok1);
+  theId2 = str2.toInt(&ok2);
+
   return ok1 & ok2;
 }
 
 //=======================================================================
-// name    : SMESHGUI_SingleEditDlg::~SMESHGUI_SingleEditDlg
+// name    : ~SMESHGUI_SingleEditDlg()
 // Purpose : Destructor
 //=======================================================================
 SMESHGUI_SingleEditDlg::~SMESHGUI_SingleEditDlg()
@@ -195,350 +204,365 @@ SMESHGUI_SingleEditDlg::~SMESHGUI_SingleEditDlg()
 }
 
 //=======================================================================
-// name    : SMESHGUI_SingleEditDlg::Init
+// name    : Init()
 // Purpose : Init dialog fields, connect signals and slots, show dialog
 //=======================================================================
-void SMESHGUI_SingleEditDlg::Init( SALOME_Selection* theSelection )
+void SMESHGUI_SingleEditDlg::Init()
 {
-  mySelection = theSelection;  
-  SMESHGUI* aSMESHGUI = SMESHGUI::GetSMESHGUI();
-  aSMESHGUI->SetActiveDialogBox( ( QDialog* )this ) ;
+  mySMESHGUI->SetActiveDialogBox((QDialog*)this);
   myBusy = false;
   myActor = 0;
+
   // main buttons
-  connect( myOkBtn,    SIGNAL( clicked() ), SLOT( onOk() ) );
-  connect( myCloseBtn, SIGNAL( clicked() ), SLOT( onClose() ) ) ;
-  connect( myApplyBtn, SIGNAL( clicked() ), SLOT( onApply() ) );
+  connect(myOkBtn,    SIGNAL(clicked()), SLOT(onOk()));
+  connect(myCloseBtn, SIGNAL(clicked()), SLOT(reject()));
+  connect(myApplyBtn, SIGNAL(clicked()), SLOT(onApply()));
+  connect(myHelpBtn,  SIGNAL(clicked()), SLOT(onHelp()));
 
   // selection and SMESHGUI
-  connect( mySelection, SIGNAL( currentSelectionChanged() ), SLOT( onSelectionDone() ) );
-  connect( aSMESHGUI, SIGNAL( SignalDeactivateActiveDialog() ), SLOT( onDeactivate() ) );
-  connect( aSMESHGUI, SIGNAL( SignalCloseAllDialogs() ), SLOT( onClose() ) );
-  connect( myEdge, SIGNAL( textChanged(const QString&)), SLOT( onTextChange(const QString&)));
-
-  myOkBtn->setEnabled( false );
-  myApplyBtn->setEnabled( false );
-  setEnabled( true );
+  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(onSelectionDone()));
+  connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate()));
+  connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(reject()));
+  connect(myEdge, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
 
-  int x, y ;
-  aSMESHGUI->DefineDlgPosition( this, x, y );
-  this->move( x, y );
-  this->show(); 
+  myOkBtn->setEnabled(false);
+  myApplyBtn->setEnabled(false);
+  setEnabled(true);
 
   // set selection mode
-  QAD_Application::getDesktop()->SetSelectionMode( EdgeOfCellSelection, true );
+  if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+    aViewWindow->SetSelectionMode(EdgeOfCellSelection);
 
   onSelectionDone();
-
-  return;
 }
 
 //=======================================================================
-// name    : SMESHGUI_SingleEditDlg::onOk
-// Purpose : SLOT called when "Ok" button pressed. 
+// name    : onOk()
+// Purpose : SLOT called when "Ok" button pressed.
 //           Assign filters VTK viewer and close dialog
 //=======================================================================
 void SMESHGUI_SingleEditDlg::onOk()
 {
-  if ( onApply() )
-    onClose();
+  if (onApply())
+    reject();
 }
 
 //=======================================================================
-// name    : SMESHGUI_SingleEditDlg::onClose
+// name    : reject()
 // Purpose : SLOT called when "Close" button pressed. Close dialog
 //=======================================================================
-void SMESHGUI_SingleEditDlg::onClose()
+void SMESHGUI_SingleEditDlg::reject()
+{
+  if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+    aViewWindow->SetSelectionMode(ActorSelection);
+  //mySelectionMgr->clearSelected();
+  disconnect(mySelectionMgr, 0, this, 0);
+  disconnect(mySMESHGUI, 0, this, 0);
+  mySMESHGUI->ResetState();
+  QDialog::reject();
+}
+
+//=================================================================================
+// function : onHelp()
+// purpose  :
+//=================================================================================
+void SMESHGUI_SingleEditDlg::onHelp()
 {
-  QAD_Application::getDesktop()->SetSelectionMode( ActorSelection );
-  mySelection->ClearIObjects();
-  disconnect( mySelection, 0, this, 0 );
-  disconnect( SMESHGUI::GetSMESHGUI(), 0, this, 0 );
-  SMESHGUI::GetSMESHGUI()->ResetState() ;
-  reject();
+  LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
+  if (app) 
+    app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
+  else {
+    QString platform;
+#ifdef WIN32
+    platform = "winapplication";
+#else
+    platform = "application";
+#endif
+    SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
+                             tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
+                             arg(app->resourceMgr()->stringValue("ExternalBrowser", 
+                                                                 platform)).
+                             arg(myHelpFileName));
+  }
 }
 
 //=======================================================================
-//function : findTriangles
+//function : findTriangles()
 //purpose  : find triangles sharing theNode1-theNode2 link
-//    THIS IS A PIECE OF SMESH_MeshEditor.cxx
-//    TO DO: make it available in SMDS for ex.
+//           THIS IS A PIECE OF SMESH_MeshEditor.cxx
+//           TO DO: make it available in SMDS for ex.
 //=======================================================================
-
-static bool findTriangles(const SMDS_MeshNode *    theNode1,
-                          const SMDS_MeshNode *    theNode2,
-                          const SMDS_MeshElement*& theTria1,
-                          const SMDS_MeshElement*& theTria2)
+static bool findTriangles (const SMDS_MeshNode *    theNode1,
+                           const SMDS_MeshNode *    theNode2,
+                           const SMDS_MeshElement*& theTria1,
+                           const SMDS_MeshElement*& theTria2)
 {
-  if ( !theNode1 || !theNode2 ) return false;
+  if (!theNode1 || !theNode2) return false;
 
   theTria1 = theTria2 = 0;
 
-  set< const SMDS_MeshElement* > emap;
+  std::set< const SMDS_MeshElement* > emap;
   SMDS_ElemIteratorPtr it = theNode1->GetInverseElementIterator();
   while (it->more()) {
     const SMDS_MeshElement* elem = it->next();
-    if ( elem->GetType() == SMDSAbs_Face && elem->NbNodes() == 3 )
-      emap.insert( elem );
+    if (elem->GetType() == SMDSAbs_Face && elem->NbCornerNodes() == 3)
+      emap.insert(elem);
   }
   it = theNode2->GetInverseElementIterator();
   while (it->more()) {
     const SMDS_MeshElement* elem = it->next();
-    if ( elem->GetType() == SMDSAbs_Face &&
-         emap.find( elem ) != emap.end() )
-      if ( theTria1 ) {
+    if (elem->GetType() == SMDSAbs_Face &&
+         emap.find(elem) != emap.end())
+    {
+      if (theTria1) {
         theTria2 = elem;
         break;
       } else {
         theTria1 = elem;
       }
+    }
   }
-  return ( theTria1 && theTria2 );
+  return (theTria1 && theTria2);
 }
 
 //=======================================================================
-//function : onTextChange
-//purpose  : 
+//function : onTextChange()
+//purpose  :
 //=======================================================================
-
-void SMESHGUI_SingleEditDlg::onTextChange( const QString& theNewText )
+void SMESHGUI_SingleEditDlg::onTextChange (const QString& theNewText)
 {
-  if ( myBusy ) return;
+  if (myBusy) return;
+  BusyLocker lock(myBusy);
 
-  myOkBtn->setEnabled( false );
-  myApplyBtn->setEnabled( false );
+  myOkBtn->setEnabled(false);
+  myApplyBtn->setEnabled(false);
 
   // hilight entered edge
-  SMDS_Mesh* aMesh = 0;
-  if ( myActor )
-    aMesh = myActor->GetObject()->GetMesh();
-  if ( aMesh ) {
-
-    myBusy = true; // block onSelectionDone()
-    mySelection->ClearIObjects();
-    mySelection->AddIObject( myActor->getIO() );
-    myBusy = false;
-
-    QStringList aListId = QStringList::split( "-", theNewText, false);
-    if ( aListId.count() != 2 )
-      return;
-    const SMDS_MeshNode* a2Nodes[2];
-    bool allOk = true;
-    int i;
-    for ( i = 0; i < aListId.count(); i++ ) {
-      const SMDS_MeshNode * n = aMesh->FindNode( aListId[ i ].toInt() );
-      if ( n )
-        a2Nodes[ i ] = n;
-      else
-        allOk = false;
-    }
-
-    // find a triangle and an edge nb
-    const SMDS_MeshElement* tria[2];
-    if (allOk &&
-        a2Nodes[0] != a2Nodes[1] &&
-        findTriangles( a2Nodes[0],
-                      a2Nodes[1],
-                      tria[0],
-                      tria[1])) {
-      myBusy = true; // block onSelectionDone()
-      mySelection->AddOrRemoveIndex (myActor->getIO(), tria[0]->GetID(), true, false);
-
-      const SMDS_MeshNode* a3Nodes [3];
-      SMDS_ElemIteratorPtr it;
-      int edgeInd = 2;
-      for (i = 0, it = tria[0]->nodesIterator(); it->more(); i++ ) {
-        a3Nodes[ i ] = static_cast<const SMDS_MeshNode*>( it->next() );
-        if ( i > 0 )
-          if (( a3Nodes[ i ] == a2Nodes[ 0 ] && a3Nodes[ i - 1] == a2Nodes[ 1 ] ) ||
-              ( a3Nodes[ i ] == a2Nodes[ 1 ] && a3Nodes[ i - 1] == a2Nodes[ 0 ] ) ) {
+  if(myActor){
+    if(SMDS_Mesh* aMesh = myActor->GetObject()->GetMesh()){
+      Handle(SALOME_InteractiveObject) anIO = myActor->getIO();
+      SALOME_ListIO aList;
+      aList.Append(anIO);
+      mySelectionMgr->setSelectedObjects(aList,false);
+      
+      TColStd_IndexedMapOfInteger selectedIndices;
+      TColStd_MapOfInteger newIndices;
+      mySelector->GetIndex(anIO,selectedIndices);
+
+      int id1, id2;
+      if ( !getNodeIds(myEdge->text(), id1, id2) )
+        return;
+
+      const SMDS_MeshNode* aNode1 = aMesh->FindNode( id1 );
+      const SMDS_MeshNode* aNode2 = aMesh->FindNode( id2 );
+
+      if ( !aNode1 || !aNode2 || aNode1 == aNode2 )
+        return;
+
+      // find a triangle and an edge index
+      const SMDS_MeshElement* tria1;
+      const SMDS_MeshElement* tria2;
+
+      if ( findTriangles(aNode1,aNode2,tria1,tria2) )
+      {
+        newIndices.Add(tria1->GetID());
+
+        const SMDS_MeshNode* a3Nodes[3];
+        SMDS_ElemIteratorPtr it;
+        int edgeInd = 2, i;
+        for (i = 0, it = tria1->nodesIterator(); it->more(); i++) {
+          a3Nodes[ i ] = static_cast<const SMDS_MeshNode*>(it->next());
+          if (i > 0 && ( (a3Nodes[ i ] == aNode1 && a3Nodes[ i - 1] == aNode2) ||
+                         (a3Nodes[ i ] == aNode2 && a3Nodes[ i - 1] == aNode1) ) ) {
             edgeInd = i - 1;
             break;
           }
+        }
+        newIndices.Add(-edgeInd-1);
+        
+        myOkBtn->setEnabled(true);
+        myApplyBtn->setEnabled(true);
       }
-
-      mySelection->AddOrRemoveIndex( myActor->getIO(), -edgeInd-1, true, true );
-      myBusy = false;
-
-      myOkBtn->setEnabled( true );
-      myApplyBtn->setEnabled( true );
+      mySelector->AddOrRemoveIndex(anIO,newIndices, false);
+      SMESH::GetViewWindow(mySMESHGUI)->highlight( anIO, true, true );
     }
   }
 }
+
 //=======================================================================
-// name    : SMESHGUI_SingleEditDlg::onSelectionDone
+// name    : onSelectionDone()
 // Purpose : SLOT called when selection changed
 //=======================================================================
 void SMESHGUI_SingleEditDlg::onSelectionDone()
 {
-  if ( myBusy ) return;
+  if (myBusy) return;
+  BusyLocker lock(myBusy);
 
   int anId1 = 0, anId2 = 0;
 
-  myOkBtn->setEnabled( false );
-  myApplyBtn->setEnabled( false );
+  myOkBtn->setEnabled(false);
+  myApplyBtn->setEnabled(false);
 
-  if ( mySelection->IObjectCount() != 1 )
-  {
+  SALOME_ListIO aList;
+  mySelectionMgr->selectedObjects(aList);
+
+  if (aList.Extent() != 1) {
     myEdge->clear();
     return;
   }
 
-  myActor = SMESH::FindActorByEntry( mySelection->firstIObject()->getEntry() );
-  SMDS_Mesh* aMesh = 0;
-  if ( myActor )
-    aMesh = myActor->GetObject()->GetMesh();
-  if ( !aMesh )
-    return;
-
-  if (SMESH::GetEdgeNodes( mySelection, anId1, anId2 ) >= 1 ) {
-    QString aText = QString( "%1-%2" ).arg( anId1 ).arg( anId2 );
-    myBusy = true;
-    myEdge->setText( aText );    
-    myBusy = false;
-
-    const SMDS_MeshElement* tria[2];
-    if ( findTriangles( aMesh->FindNode( anId1 ), aMesh->FindNode( anId2 ), tria[0],tria[1]))
+  Handle(SALOME_InteractiveObject) anIO = aList.First();
+  myActor = SMESH::FindActorByEntry(anIO->getEntry());
+  if(myActor){
+    TVisualObjPtr aVisualObj = myActor->GetObject();
+    if(SMDS_Mesh* aMesh = aVisualObj->GetMesh())
     {
-      myOkBtn->setEnabled( true );
-      myApplyBtn->setEnabled( true );
+      const SMDS_MeshElement* tria[2];
+      if( SMESH::GetEdgeNodes( mySelector, aVisualObj, anId1, anId2 ) >= 1 &&
+          findTriangles( aMesh->FindNode( anId1 ), aMesh->FindNode( anId2 ), tria[0],tria[1] ) )
+      {
+        QString aText = QString("%1-%2").arg(anId1).arg(anId2);
+        myEdge->setText(aText);
+        
+        myOkBtn->setEnabled(true);
+        myApplyBtn->setEnabled(true);
+      }
+      else
+      {
+        myEdge->clear();
+      }
     }
   }
-  else
-    myEdge->clear();
 }
 
 //=======================================================================
-// name    : SMESHGUI_SingleEditDlg::onDeactivate
+// name    : onDeactivate()
 // Purpose : SLOT called when dialog must be deativated
 //=======================================================================
 void SMESHGUI_SingleEditDlg::onDeactivate()
 {
-  setEnabled( false );
+  setEnabled(false);
 }
 
 //=======================================================================
-// name    : SMESHGUI_SingleEditDlg::enterEvent
+// name    : enterEvent()
 // Purpose : Event filter
 //=======================================================================
-void SMESHGUI_SingleEditDlg::enterEvent( QEvent* )
+void SMESHGUI_SingleEditDlg::enterEvent (QEvent*)
 {
-  if ( !isEnabled() ) {
-    SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
-    // set selection mode
-    QAD_Application::getDesktop()->SetSelectionMode( EdgeOfCellSelection, true ); 
-    setEnabled( true );
+  if (!isEnabled()) {
+    mySMESHGUI->EmitSignalDeactivateDialog();
+    if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+      aViewWindow->SetSelectionMode(EdgeOfCellSelection);
+    setEnabled(true);
   }
 }
 
-
-//=================================================================================
-// function : closeEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_SingleEditDlg::closeEvent( QCloseEvent* e )
-{
-  onClose() ;
-}
-//=======================================================================
-//function : hideEvent
-//purpose  : caused by ESC key
-//=======================================================================
-
-void SMESHGUI_SingleEditDlg::hideEvent ( QHideEvent * e )
-{
-  if ( !isMinimized() )
-    onClose();
-}
-
 //=================================================================================
-// function : onApply
+// function : onApply()
 // purpose  : SLOT. Called when apply button is pressed
 //=================================================================================
 bool SMESHGUI_SingleEditDlg::onApply()
 {
-  if (SMESHGUI::GetSMESHGUI()->ActiveStudyLocked())
+  if (mySMESHGUI->isActiveStudyLocked())
     return false;
   // verify validity of input data
-  if ( !isValid( true ) )
+  if (!isValid(true))
     return false;
 
-  // get mesh, actor and nodes    
-  SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO( mySelection->firstIObject() );
+  // get mesh, actor and nodes
+  SALOME_ListIO aList;
+  mySelectionMgr->selectedObjects(aList);
 
-  if ( aMesh->_is_nil() )
-  {
-    QMessageBox::information( SMESHGUI::GetSMESHGUI()->GetDesktop(),
-    tr( "SMESH_ERROR" ), tr( "SMESHG_NO_MESH" ), QMessageBox::Ok );
+  SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(aList.First());
+
+  if (aMesh->_is_nil()) {
+    SUIT_MessageBox::information(SMESH::GetDesktop(mySMESHGUI), 
+                                 tr("SMESH_ERROR"),
+                                 tr("SMESHG_NO_MESH"));
     return false;
   }
 
   SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
   int anId1= 0, anId2 = 0;
-  if ( aMeshEditor->_is_nil() || !getNodeIds( myEdge->text(), anId1, anId2 ) )
+  if (aMeshEditor->_is_nil() || !getNodeIds(myEdge->text(), anId1, anId2))
     return false;
 
   // perform operation
-  bool aResult = process( aMeshEditor.in(), anId1, anId2 );
+  bool aResult = process(aMeshEditor.in(), anId1, anId2);
 
   // update actor
-  if ( aResult )
-  {
-    Handle(SALOME_InteractiveObject) anIO = mySelection->firstIObject();
-    mySelection->ClearIObjects();
+  if (aResult) {
+    mySelector->ClearIndex();
+    mySelectionMgr->setSelectedObjects(aList, false);
+    onSelectionDone();
     SMESH::UpdateView();
-    mySelection->AddIObject( anIO, false );
+    SMESHGUI::Modified();
   }
 
   return aResult;
 }
 
-/*
-  Class       : SMESHGUI_TrianglesInversionDlg
-  Description : Inversion of the diagonal of a pseudo-quadrangle formed by
-                2 neighboring triangles with 1 common edge
-*/
+//=================================================================================
+// function : keyPressEvent()
+// purpose  :
+//=================================================================================
+void SMESHGUI_SingleEditDlg::keyPressEvent( QKeyEvent* e )
+{
+  QDialog::keyPressEvent( e );
+  if ( e->isAccepted() )
+    return;
 
-SMESHGUI_TrianglesInversionDlg::SMESHGUI_TrianglesInversionDlg( QWidget*          theParent,
-                                                                SALOME_Selection* theSelection,
-                                                                const char*       theName )
-: SMESHGUI_SingleEditDlg( theParent, theSelection, theName )
+  if ( e->key() == Qt::Key_F1 ) {
+    e->accept();
+    onHelp();
+  }
+}
+
+/*!
+ *  Class       : SMESHGUI_TrianglesInversionDlg
+ *  Description : Inversion of the diagonal of a pseudo-quadrangle formed by
+ *                2 neighboring triangles with 1 common edge
+ */
+
+SMESHGUI_TrianglesInversionDlg
+::SMESHGUI_TrianglesInversionDlg(SMESHGUI* theModule)
+: SMESHGUI_SingleEditDlg(theModule)
 {
-  setCaption( tr( "CAPTION" ) );
+  setWindowTitle(tr("CAPTION"));
+  myHelpFileName = "diagonal_inversion_of_elements_page.html";
 }
 
 SMESHGUI_TrianglesInversionDlg::~SMESHGUI_TrianglesInversionDlg()
 {
 }
 
-bool SMESHGUI_TrianglesInversionDlg::process(
-  SMESH::SMESH_MeshEditor_ptr theMeshEditor, const int theId1, const int theId2 )
+bool SMESHGUI_TrianglesInversionDlg::process (SMESH::SMESH_MeshEditor_ptr theMeshEditor,
+                                              const int theId1, const int theId2)
 {
-  return theMeshEditor->InverseDiag( theId1, theId2 );
+  return theMeshEditor->InverseDiag(theId1, theId2);
 }
 
-/*
-  Class       : SMESHGUI_UnionOfTwoTrianglesDlg
-  Description : Construction of a quadrangle by deletion of the 
-                common border of 2 neighboring triangles
-*/
+/*!
 Class       : SMESHGUI_UnionOfTwoTrianglesDlg
+ *  Description : Construction of a quadrangle by deletion of the
               common border of 2 neighboring triangles
+ */
 
-SMESHGUI_UnionOfTwoTrianglesDlg::SMESHGUI_UnionOfTwoTrianglesDlg( QWidget*          theParent, 
-                                                                  SALOME_Selection* theSelection,
-                                                                  const char*       theName )
-: SMESHGUI_SingleEditDlg( theParent, theSelection, theName )
+SMESHGUI_UnionOfTwoTrianglesDlg
+::SMESHGUI_UnionOfTwoTrianglesDlg(SMESHGUI* theModule)
+: SMESHGUI_SingleEditDlg(theModule)
 {
-  setCaption( tr( "CAPTION" ) );
+  setWindowTitle(tr("CAPTION"));
+  myHelpFileName = "uniting_two_triangles_page.html";
 }
 
 SMESHGUI_UnionOfTwoTrianglesDlg::~SMESHGUI_UnionOfTwoTrianglesDlg()
 {
 }
 
-bool SMESHGUI_UnionOfTwoTrianglesDlg::process(
-  SMESH::SMESH_MeshEditor_ptr theMeshEditor, const int theId1, const int theId2 )
+bool SMESHGUI_UnionOfTwoTrianglesDlg::process (SMESH::SMESH_MeshEditor_ptr theMeshEditor,
+                                               const int theId1, const int theId2)
 {
-  return theMeshEditor->DeleteDiag( theId1, theId2 );
+  return theMeshEditor->DeleteDiag(theId1, theId2);
 }
-