]> SALOME platform Git repositories - modules/smesh.git/commitdiff
Salome HOME
rename SMESHGUI_EditMeshDlg to SMESHGUI_MergeDlg
authoreap <eap@opencascade.com>
Wed, 15 Sep 2010 11:42:59 +0000 (11:42 +0000)
committereap <eap@opencascade.com>
Wed, 15 Sep 2010 11:42:59 +0000 (11:42 +0000)
src/SMESHGUI/Makefile.am
src/SMESHGUI/SMESHGUI.cxx
src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx [deleted file]
src/SMESHGUI/SMESHGUI_EditMeshDlg.h [deleted file]
src/SMESHGUI/SMESHGUI_MergeDlg.cxx [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_MergeDlg.h [new file with mode: 0644]
src/SMESHGUI/SMESH_msg_en.ts

index 76bf1cb16d88272f4beb2e0d57c1efa4487ec8ff..aef8dcfb4d77bc62de5971c35fe96db94e2f34ff 100644 (file)
@@ -72,7 +72,7 @@ salomeinclude_HEADERS = \
        SMESHGUI_SymmetryDlg.h \
        SMESHGUI_SewingDlg.h \
        SMESHGUI_DuplicateNodesDlg.h \
-       SMESHGUI_EditMeshDlg.h \
+       SMESHGUI_MergeDlg.h \
        SMESHGUI_MeshUtils.h \
        SMESHGUI_CreatePolyhedralVolumeDlg.h \
        SMESHGUI_Operation.h \
@@ -136,7 +136,7 @@ dist_libSMESH_la_SOURCES = \
        SMESHGUI_SymmetryDlg.cxx \
        SMESHGUI_SewingDlg.cxx \
        SMESHGUI_DuplicateNodesDlg.cxx \
-       SMESHGUI_EditMeshDlg.cxx \
+       SMESHGUI_MergeDlg.cxx \
        SMESHGUI_Utils.cxx \
        SMESHGUI_GEOMGenUtils.cxx \
        SMESHGUI_MeshUtils.cxx \
@@ -206,7 +206,7 @@ MOC_FILES = \
        SMESHGUI_SymmetryDlg_moc.cxx \
        SMESHGUI_SewingDlg_moc.cxx \
        SMESHGUI_DuplicateNodesDlg_moc.cxx \
-       SMESHGUI_EditMeshDlg_moc.cxx \
+       SMESHGUI_MergeDlg_moc.cxx \
        SMESHGUI_CreatePolyhedralVolumeDlg_moc.cxx \
        SMESHGUI_Operation_moc.cxx \
        SMESHGUI_SelectionOp_moc.cxx \
index d610ab3cd88d9da84ba1c8ef9838fa51d3579d96..3926ebb6a9d6015d00702c4f74413c923fbddcb4 100644 (file)
@@ -34,7 +34,7 @@
 #include "SMESHGUI_CreatePolyhedralVolumeDlg.h"
 #include "SMESHGUI_DeleteGroupDlg.h"
 #include "SMESHGUI_Displayer.h"
-#include "SMESHGUI_EditMeshDlg.h"
+#include "SMESHGUI_MergeDlg.h"
 #include "SMESHGUI_ExtrusionAlongPathDlg.h"
 #include "SMESHGUI_ExtrusionDlg.h"
 #include "SMESHGUI_FileInfoDlg.h"
@@ -2690,7 +2690,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       if(checkLock(aStudy)) break;
       if(vtkwnd) {
         EmitSignalDeactivateDialog();
-        ( new SMESHGUI_EditMeshDlg( this, 0 ) )->show();
+        ( new SMESHGUI_MergeDlg( this, 0 ) )->show();
       }
       else {
         SUIT_MessageBox::warning(SMESHGUI::desktop(),
@@ -2703,7 +2703,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       if (checkLock(aStudy)) break;
       if (vtkwnd) {
         EmitSignalDeactivateDialog();
-        ( new SMESHGUI_EditMeshDlg( this, 1 ) )->show();
+        ( new SMESHGUI_MergeDlg( this, 1 ) )->show();
       } else {
         SUIT_MessageBox::warning(SMESHGUI::desktop(),
                                  tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
diff --git a/src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx b/src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx
deleted file mode 100644 (file)
index 64559a5..0000000
+++ /dev/null
@@ -1,1280 +0,0 @@
-//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-//  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
-//
-
-// SMESH SMESHGUI : GUI for SMESH component
-// File   : SMESHGUI_EditMeshDlg.cxx
-// Author : Open CASCADE S.A.S.
-// SMESH includes
-//
-#include "SMESHGUI_EditMeshDlg.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_VTKUtils.h"
-#include "SMESHGUI_MeshUtils.h"
-#include "SMESHGUI_SpinBox.h"
-
-#include <SMESH_Actor.h>
-#include <SMESH_TypeFilter.hxx>
-#include <SMESH_LogicalFilter.hxx>
-#include <SMDS_Mesh.hxx>
-
-// SALOME GUI includes
-#include <SUIT_Desktop.h>
-#include <SUIT_ResourceMgr.h>
-#include <SUIT_Session.h>
-#include <SUIT_MessageBox.h>
-#include <SUIT_OverrideCursor.h>
-
-#include <LightApp_Application.h>
-#include <LightApp_SelectionMgr.h>
-
-#include <SVTK_ViewModel.h>
-#include <SVTK_ViewWindow.h>
-#include <SALOME_ListIO.hxx>
-
-// OCCT includes
-#include <TColStd_MapOfInteger.hxx>
-#include <TColStd_MapIteratorOfMapOfInteger.hxx>
-
-// IDL includes
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Group)
-#include CORBA_SERVER_HEADER(SMESH_MeshEditor)
-
-// VTK includes
-#include <vtkUnstructuredGrid.h>
-#include <vtkRenderer.h>
-#include <vtkActor2D.h>
-#include <vtkPoints.h>
-#include <vtkDataSetMapper.h>
-#include <vtkMaskPoints.h>
-#include <vtkSelectVisiblePoints.h>
-#include <vtkLabeledDataMapper.h>
-#include <vtkTextProperty.h>
-#include <vtkIntArray.h>
-#include <vtkProperty2D.h>
-#include <vtkPointData.h>
-#include <vtkConfigure.h>
-#if !defined(VTK_XVERSION)
-#define VTK_XVERSION (VTK_MAJOR_VERSION<<16)+(VTK_MINOR_VERSION<<8)+(VTK_BUILD_VERSION)
-#endif
-
-// Qt includes
-#include <QApplication>
-#include <QGroupBox>
-#include <QLabel>
-#include <QLineEdit>
-#include <QListWidget>
-#include <QPushButton>
-#include <QRadioButton>
-#include <QCheckBox>
-#include <QHBoxLayout>
-#include <QVBoxLayout>
-#include <QGridLayout>
-#include <QKeyEvent>
-#include <QButtonGroup>
-
-#define SPACING 6
-#define MARGIN  11
-
-namespace SMESH
-{
-  class TIdPreview
-  { // to display in the viewer IDs of the selected elements
-    SVTK_ViewWindow* myViewWindow;
-
-    vtkUnstructuredGrid* myIdGrid;
-    SALOME_Actor* myIdActor;
-
-    vtkUnstructuredGrid* myPointsNumDataSet;
-    vtkMaskPoints* myPtsMaskPoints;
-    vtkSelectVisiblePoints* myPtsSelectVisiblePoints;
-    vtkLabeledDataMapper* myPtsLabeledDataMapper;
-    vtkTextProperty* aPtsTextProp;
-    bool myIsPointsLabeled;
-    vtkActor2D* myPointLabels;
-
-    std::vector<int> myIDs;
-
-  public:
-    TIdPreview(SVTK_ViewWindow* theViewWindow):
-      myViewWindow(theViewWindow)
-    {
-      myIdGrid = vtkUnstructuredGrid::New();
-
-      // Create and display actor
-      vtkDataSetMapper* aMapper = vtkDataSetMapper::New();
-      aMapper->SetInput( myIdGrid );
-
-      myIdActor = SALOME_Actor::New();
-      myIdActor->SetInfinitive(true);
-      myIdActor->VisibilityOff();
-      myIdActor->PickableOff();
-
-      myIdActor->SetMapper( aMapper );
-      aMapper->Delete();
-
-      myViewWindow->AddActor(myIdActor);
-
-      //Definition of points numbering pipeline
-      myPointsNumDataSet = vtkUnstructuredGrid::New();
-
-      myPtsMaskPoints = vtkMaskPoints::New();
-      myPtsMaskPoints->SetInput(myPointsNumDataSet);
-      myPtsMaskPoints->SetOnRatio(1);
-
-      myPtsSelectVisiblePoints = vtkSelectVisiblePoints::New();
-      myPtsSelectVisiblePoints->SetInput(myPtsMaskPoints->GetOutput());
-      myPtsSelectVisiblePoints->SelectInvisibleOff();
-      myPtsSelectVisiblePoints->SetTolerance(0.1);
-    
-      myPtsLabeledDataMapper = vtkLabeledDataMapper::New();
-      myPtsLabeledDataMapper->SetInput(myPtsSelectVisiblePoints->GetOutput());
-#if (VTK_XVERSION < 0x050200)
-      myPtsLabeledDataMapper->SetLabelFormat("%g");
-#endif
-      myPtsLabeledDataMapper->SetLabelModeToLabelScalars();
-    
-      vtkTextProperty* aPtsTextProp = vtkTextProperty::New();
-      aPtsTextProp->SetFontFamilyToTimes();
-      static int aPointsFontSize = 12;
-      aPtsTextProp->SetFontSize(aPointsFontSize);
-      aPtsTextProp->SetBold(1);
-      aPtsTextProp->SetItalic(0);
-      aPtsTextProp->SetShadow(0);
-      myPtsLabeledDataMapper->SetLabelTextProperty(aPtsTextProp);
-      aPtsTextProp->Delete();
-  
-      myIsPointsLabeled = false;
-
-      myPointLabels = vtkActor2D::New();
-      myPointLabels->SetMapper(myPtsLabeledDataMapper);
-      myPointLabels->GetProperty()->SetColor(1,1,1);
-      myPointLabels->SetVisibility(myIsPointsLabeled);
-
-      AddToRender(myViewWindow->getRenderer());
-    }
-
-    void SetPointsData ( SMDS_Mesh* theMesh, 
-                         TColStd_MapOfInteger & theNodesIdMap )
-    {
-      vtkPoints* aPoints = vtkPoints::New();
-      aPoints->SetNumberOfPoints(theNodesIdMap.Extent());
-      myIDs.clear();
-      
-      TColStd_MapIteratorOfMapOfInteger idIter( theNodesIdMap );
-      for( int i = 0; idIter.More(); idIter.Next(), i++ ) {
-        const SMDS_MeshNode* aNode = theMesh->FindNode(idIter.Key());
-        aPoints->SetPoint( i, aNode->X(), aNode->Y(), aNode->Z() );
-        myIDs.push_back(idIter.Key());
-      }
-
-      myIdGrid->SetPoints(aPoints);
-
-      aPoints->Delete();
-
-      myIdActor->GetMapper()->Update();
-    }
-
-    void SetElemsData( TColStd_MapOfInteger & theElemsIdMap, 
-                       std::list<gp_XYZ> & aGrCentersXYZ )
-    {
-      vtkPoints* aPoints = vtkPoints::New();
-      aPoints->SetNumberOfPoints(theElemsIdMap.Extent());
-      myIDs.clear();
-      
-      TColStd_MapIteratorOfMapOfInteger idIter( theElemsIdMap );
-      for( ; idIter.More(); idIter.Next() ) {
-        myIDs.push_back(idIter.Key());
-      }
-
-      gp_XYZ aXYZ;
-      std::list<gp_XYZ>::iterator coordIt = aGrCentersXYZ.begin();
-      for( int i = 0; coordIt != aGrCentersXYZ.end(); coordIt++, i++ ) {
-        aXYZ = *coordIt;
-        aPoints->SetPoint( i, aXYZ.X(), aXYZ.Y(), aXYZ.Z() );
-      }
-      myIdGrid->SetPoints(aPoints);
-      aPoints->Delete();
-      
-      myIdActor->GetMapper()->Update();
-    }
-
-    void AddToRender(vtkRenderer* theRenderer)
-    {
-      myIdActor->AddToRender(theRenderer);
-
-      myPtsSelectVisiblePoints->SetRenderer(theRenderer);
-      theRenderer->AddActor2D(myPointLabels);
-    }
-
-    void RemoveFromRender(vtkRenderer* theRenderer)
-    {
-      myIdActor->RemoveFromRender(theRenderer);
-
-      myPtsSelectVisiblePoints->SetRenderer(theRenderer);
-      theRenderer->RemoveActor(myPointLabels);
-    }
-
-    void SetPointsLabeled( bool theIsPointsLabeled, bool theIsActorVisible = true )
-    {
-      myIsPointsLabeled = theIsPointsLabeled && myIdGrid->GetNumberOfPoints();
-      
-      if ( myIsPointsLabeled ) {
-        myPointsNumDataSet->ShallowCopy(myIdGrid);
-        vtkDataSet *aDataSet = myPointsNumDataSet;
-        int aNbElem = myIDs.size();
-        vtkIntArray *anArray = vtkIntArray::New();
-        anArray->SetNumberOfValues( aNbElem );
-        for ( int i = 0; i < aNbElem; i++ )
-          anArray->SetValue( i, myIDs[i] );
-        aDataSet->GetPointData()->SetScalars( anArray );
-        anArray->Delete();
-        myPtsMaskPoints->SetInput( aDataSet );
-        myPointLabels->SetVisibility( theIsActorVisible );
-      }
-      else {
-        myPointLabels->SetVisibility( false );
-      }
-    }
-    
-    ~TIdPreview()
-    {
-      RemoveFromRender(myViewWindow->getRenderer());
-
-      myIdGrid->Delete();
-
-      myViewWindow->RemoveActor(myIdActor);
-      myIdActor->Delete();
-
-      //Deleting of points numbering pipeline
-      //---------------------------------------
-      myPointsNumDataSet->Delete();
-      
-      //myPtsLabeledDataMapper->RemoveAllInputs();        //vtk 5.0 porting
-      myPtsLabeledDataMapper->Delete();
-
-      //myPtsSelectVisiblePoints->UnRegisterAllOutputs(); //vtk 5.0 porting
-      myPtsSelectVisiblePoints->Delete();
-
-      //myPtsMaskPoints->UnRegisterAllOutputs();          //vtk 5.0 porting
-      myPtsMaskPoints->Delete();
-
-      myPointLabels->Delete();
-
-//       myTimeStamp->Delete();
-    }
-  };
-}
-
-static const char * IconFirst[] = {
-"18 10 2 1",
-"       g None",
-".      g #000000",
-"         .     .  ",
-"  ..    ..    ..  ",
-"  ..   ...   ...  ",
-"  ..  ....  ....  ",
-"  .. ..... .....  ",
-"  .. ..... .....  ",
-"  ..  ....  ....  ",
-"  ..   ...   ...  ",
-"  ..    ..    ..  ",
-"         .     .  "};
-
-//=================================================================================
-// class    : SMESHGUI_EditMeshDlg()
-// purpose  :
-//=================================================================================
-SMESHGUI_EditMeshDlg::SMESHGUI_EditMeshDlg (SMESHGUI* theModule, 
-                                            int theAction)
-  : QDialog(SMESH::GetDesktop(theModule)),
-    mySMESHGUI(theModule),
-    mySelectionMgr(SMESH::GetSelectionMgr(theModule)),
-    myAction(theAction)
-{
-  setModal(false);
-  setAttribute(Qt::WA_DeleteOnClose, true);
-  setWindowTitle(myAction == 1 ? tr("SMESH_MERGE_ELEMENTS") : tr("SMESH_MERGE_NODES"));
-
-  myIdPreview = new SMESH::TIdPreview(SMESH::GetViewWindow( mySMESHGUI ));
-
-  SUIT_ResourceMgr* aResMgr = SMESH::GetResourceMgr( mySMESHGUI );
-  QPixmap IconMergeNodes (aResMgr->loadPixmap("SMESH", tr("ICON_SMESH_MERGE_NODES")));
-  QPixmap IconMergeElems (aResMgr->loadPixmap("SMESH", tr("ICON_DLG_MERGE_ELEMENTS")));
-  QPixmap IconSelect     (aResMgr->loadPixmap("SMESH", tr("ICON_SELECT")));
-  QPixmap IconAdd        (aResMgr->loadPixmap("SMESH", tr("ICON_APPEND")));
-  QPixmap IconRemove     (aResMgr->loadPixmap("SMESH", tr("ICON_REMOVE")));
-
-  setSizeGripEnabled(true);
-
-  QVBoxLayout* DlgLayout = new QVBoxLayout(this);
-  DlgLayout->setSpacing(SPACING);
-  DlgLayout->setMargin(MARGIN);
-
-  /***************************************************************/
-  GroupConstructors = new QGroupBox(myAction == 1 ? 
-                                    tr("SMESH_MERGE_ELEMENTS") : 
-                                    tr("SMESH_MERGE_NODES"), 
-                                    this);
-
-  QButtonGroup* ButtonGroup = new QButtonGroup(this);
-  QHBoxLayout* GroupConstructorsLayout = new QHBoxLayout(GroupConstructors);
-  GroupConstructorsLayout->setSpacing(SPACING);
-  GroupConstructorsLayout->setMargin(MARGIN);
-
-  RadioButton = new QRadioButton(GroupConstructors);
-  RadioButton->setIcon(myAction == 1 ? IconMergeElems : IconMergeNodes);
-  RadioButton->setChecked(true);
-  GroupConstructorsLayout->addWidget(RadioButton);
-  ButtonGroup->addButton(RadioButton, 0);
-
-  /***************************************************************/
-  // Controls for mesh defining
-  GroupMesh = new QGroupBox(tr("SMESH_SELECT_WHOLE_MESH"), this);
-  QHBoxLayout* GroupMeshLayout = new QHBoxLayout(GroupMesh);
-  GroupMeshLayout->setSpacing(SPACING);
-  GroupMeshLayout->setMargin(MARGIN);
-
-  TextLabelName = new QLabel(tr("SMESH_NAME"), GroupMesh);
-  SelectMeshButton = new QPushButton(GroupMesh);
-  SelectMeshButton->setIcon(IconSelect);
-  LineEditMesh = new QLineEdit(GroupMesh);
-  LineEditMesh->setReadOnly(true);
-
-  GroupMeshLayout->addWidget(TextLabelName);
-  GroupMeshLayout->addWidget(SelectMeshButton);
-  GroupMeshLayout->addWidget(LineEditMesh);
-
-  /***************************************************************/
-  // Controls for switch dialog behaviour
-
-  TypeBox = new QGroupBox( tr( "SMESH_MODE" ), this );
-  GroupType = new QButtonGroup( this );
-  QHBoxLayout* aTypeBoxLayout = new QHBoxLayout( TypeBox );
-  aTypeBoxLayout->setMargin( MARGIN );
-  aTypeBoxLayout->setSpacing( SPACING );
-
-  QRadioButton* rb1 = new QRadioButton( tr( "SMESH_AUTOMATIC" ), TypeBox );
-  QRadioButton* rb2 = new QRadioButton( tr( "SMESH_MANUAL" ),   TypeBox );
-  GroupType->addButton( rb1, 0 );
-  GroupType->addButton( rb2, 1 );
-  aTypeBoxLayout->addWidget( rb1 );
-  aTypeBoxLayout->addWidget( rb2 );
-
-  myTypeId = 0;
-
-  /***************************************************************/
-  // Controls for coincident elements detecting
-  GroupCoincident = new QGroupBox(myAction == 1 ? 
-                                  tr("COINCIDENT_ELEMENTS") : 
-                                  tr("COINCIDENT_NODES"), 
-                                  this);
-
-  QVBoxLayout* aCoincidentLayout = new QVBoxLayout(GroupCoincident);
-
-  GroupCoincident->setLayout(aCoincidentLayout);
-
-  QHBoxLayout* aSpinBoxLayout = new QHBoxLayout( GroupCoincident );
-  
-  if (myAction == 0) { // case merge nodes
-    TextLabelTolerance = new QLabel(tr("SMESH_TOLERANCE"), GroupCoincident);
-    SpinBoxTolerance = new SMESHGUI_SpinBox(GroupCoincident);
-    SpinBoxTolerance->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
-
-    aSpinBoxLayout->addWidget(TextLabelTolerance);
-    aSpinBoxLayout->addWidget(SpinBoxTolerance);
-    aCoincidentLayout->addLayout(aSpinBoxLayout);
-  }
-  else {
-    TextLabelTolerance = 0;
-    SpinBoxTolerance = 0;
-  }
-
-  GroupCoincidentWidget = new QWidget(GroupCoincident);
-  QGridLayout* GroupCoincidentLayout = new QGridLayout(GroupCoincidentWidget);
-  GroupCoincidentLayout->setSpacing(SPACING);
-  GroupCoincidentLayout->setMargin(MARGIN);
-
-  ListCoincident = new QListWidget(GroupCoincidentWidget);
-  ListCoincident->setSelectionMode(QListWidget::ExtendedSelection);
-
-  DetectButton      = new QPushButton(tr("DETECT"),           GroupCoincidentWidget);
-  AddGroupButton    = new QPushButton(tr("SMESH_BUT_ADD"),    GroupCoincidentWidget);
-  RemoveGroupButton = new QPushButton(tr("SMESH_BUT_REMOVE"), GroupCoincidentWidget);
-
-  SelectAllCB = new QCheckBox(tr("SELECT_ALL"), GroupCoincidentWidget);
-
-  if (myAction == 0)
-    GroupCoincidentWidget->hide();
-  else
-    GroupCoincident->hide();
-
-  GroupCoincidentLayout->addWidget(ListCoincident,    0,   0, 4, 2);
-  GroupCoincidentLayout->addWidget(DetectButton,      0,   2);
-  GroupCoincidentLayout->addWidget(AddGroupButton,    2, 2);
-  GroupCoincidentLayout->addWidget(RemoveGroupButton, 3, 2);
-  GroupCoincidentLayout->addWidget(SelectAllCB,       4, 0, 1, 3);
-  GroupCoincidentLayout->setRowMinimumHeight(1, 10);
-  GroupCoincidentLayout->setRowStretch(1, 5);
-
-  aCoincidentLayout->addWidget(GroupCoincidentWidget);
-
-  /***************************************************************/
-  // Controls for editing the selected group
-  GroupEdit = new QGroupBox(tr("EDIT_SELECTED_GROUP"), this);
-  QGridLayout* GroupEditLayout = new QGridLayout(GroupEdit);
-  GroupEditLayout->setSpacing(SPACING);
-  GroupEditLayout->setMargin(MARGIN);
-
-  ListEdit = new QListWidget(GroupEdit);
-  //ListEdit->setRowMode(QListBox::FixedNumber);
-  //ListEdit->setHScrollBarMode(QScrollView::AlwaysOn);
-  //ListEdit->setVScrollBarMode(QScrollView::AlwaysOff);
-  ListEdit->setFlow( QListView::LeftToRight );
-  ListEdit->setSelectionMode(QListWidget::ExtendedSelection);
-
-  AddElemButton = new QPushButton(GroupEdit);
-  AddElemButton->setIcon(IconAdd);
-  RemoveElemButton = new QPushButton(GroupEdit);
-  RemoveElemButton->setIcon(IconRemove);
-  SetFirstButton = new QPushButton(GroupEdit);
-  SetFirstButton->setIcon(QPixmap(IconFirst));
-
-  GroupEditLayout->addWidget(ListEdit,         0, 0, 2, 1);
-  GroupEditLayout->addWidget(AddElemButton,    0, 1);
-  GroupEditLayout->addWidget(RemoveElemButton, 0, 2);
-  GroupEditLayout->addWidget(SetFirstButton,   1, 1, 1, 2);
-
-  GroupEdit->hide();
-
-  /***************************************************************/
-  GroupButtons = new QGroupBox(this);
-  QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons);
-  GroupButtonsLayout->setSpacing(SPACING);
-  GroupButtonsLayout->setMargin(MARGIN);
-
-  buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons);
-  buttonOk->setAutoDefault(true);
-  buttonOk->setDefault(true);
-  buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
-  buttonApply->setAutoDefault(true);
-  buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
-  buttonCancel->setAutoDefault(true);
-  buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons);
-  buttonHelp->setAutoDefault(true);
-
-  GroupButtonsLayout->addWidget(buttonOk);
-  GroupButtonsLayout->addSpacing(10);
-  GroupButtonsLayout->addWidget(buttonApply);
-  GroupButtonsLayout->addSpacing(10);
-  GroupButtonsLayout->addStretch();
-  GroupButtonsLayout->addWidget(buttonCancel);
-  GroupButtonsLayout->addWidget(buttonHelp);
-
-  /***************************************************************/
-  DlgLayout->addWidget(GroupConstructors);
-  DlgLayout->addWidget(GroupMesh);
-  DlgLayout->addWidget(TypeBox);
-  DlgLayout->addWidget(GroupCoincident);
-  DlgLayout->addWidget(GroupEdit);
-  DlgLayout->addWidget(GroupButtons);
-
-  this->resize(10,10);
-
-  Init(); // Initialisations
-}
-
-//=================================================================================
-// function : ~SMESHGUI_EditMeshDlg()
-// purpose  : Destroys the object and frees any allocated resources
-//=================================================================================
-SMESHGUI_EditMeshDlg::~SMESHGUI_EditMeshDlg()
-{
-  delete myIdPreview;
-}
-
-//=================================================================================
-// function : Init()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::Init()
-{
-  if (myAction == 0) {
-    SpinBoxTolerance->RangeStepAndValidator(0.0, COORD_MAX, 0.00001, "len_tol_precision");
-    SpinBoxTolerance->SetValue(1e-05);
-  }
-
-  RadioButton->setChecked(true);
-
-  GroupType->button(0)->setChecked(true);
-
-  myEditCurrentArgument = (QWidget*)LineEditMesh; 
-
-  myActor = 0;
-  mySubMeshOrGroup = SMESH::SMESH_subMesh::_nil();
-
-  mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
-
-  mySMESHGUI->SetActiveDialogBox((QDialog*)this);
-  myIsBusy = false;
-  
-  /* signals and slots connections */
-  connect(buttonOk,     SIGNAL(clicked()), this, SLOT(ClickOnOk()));
-  connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
-  connect(buttonApply,  SIGNAL(clicked()), this, SLOT(ClickOnApply()));
-  connect(buttonHelp,   SIGNAL(clicked()), this, SLOT(ClickOnHelp()));
-
-  connect(SelectMeshButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
-  connect(DetectButton, SIGNAL (clicked()), this, SLOT(onDetect()));
-  connect(ListCoincident, SIGNAL (itemSelectionChanged()), this, SLOT(onSelectGroup()));
-  connect(AddGroupButton, SIGNAL (clicked()), this, SLOT(onAddGroup()));
-  connect(RemoveGroupButton, SIGNAL (clicked()), this, SLOT(onRemoveGroup()));
-  connect(SelectAllCB, SIGNAL(toggled(bool)), this, SLOT(onSelectAll(bool)));
-  connect(ListEdit, SIGNAL (itemSelectionChanged()), this, SLOT(onSelectElementFromGroup()));
-  connect(AddElemButton, SIGNAL (clicked()), this, SLOT(onAddElement()));
-  connect(RemoveElemButton, SIGNAL (clicked()), this, SLOT(onRemoveElement()));
-  connect(SetFirstButton, SIGNAL( clicked() ), this, SLOT( onSetFirst() ) );
-  connect(GroupType, SIGNAL(buttonClicked(int)), this, SLOT(onTypeChanged(int)));
-
-  connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
-  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
-  /* to close dialog if study change */
-  connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
-
-  // Init Mesh field from selection
-  SelectionIntoArgument();
-
-  // Update Buttons
-  updateControls();
-  
-  if (myAction == 0)
-    myHelpFileName = "merging_nodes_page.html";
-  else
-    myHelpFileName = "merging_elements_page.html";
-}
-
-//=================================================================================
-// function : FindGravityCenter()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::FindGravityCenter(TColStd_MapOfInteger & theElemsIdMap, 
-                                             std::list< gp_XYZ > & theGrCentersXYZ)
-{
-  if (!myActor)
-    return;
-
-  SMDS_Mesh* aMesh = 0;
-  aMesh = myActor->GetObject()->GetMesh();
-  if (!aMesh)
-    return;
-
-  int nbNodes;
-
-  TColStd_MapIteratorOfMapOfInteger idIter( theElemsIdMap );
-  for( ; idIter.More(); idIter.Next() ) {
-    const SMDS_MeshElement* anElem = aMesh->FindElement(idIter.Key());
-    if ( !anElem )
-      continue;
-
-    gp_XYZ anXYZ(0., 0., 0.);
-    SMDS_ElemIteratorPtr nodeIt = anElem->nodesIterator();
-    for ( nbNodes = 0; nodeIt->more(); nbNodes++ ) {
-      const SMDS_MeshNode* node = static_cast<const SMDS_MeshNode*>( nodeIt->next() );
-      anXYZ.Add( gp_XYZ( node->X(), node->Y(), node->Z() ) );
-    }
-    anXYZ.Divide( nbNodes );
-    
-    theGrCentersXYZ.push_back( anXYZ );
-  }
-}
-
-//=================================================================================
-// function : ClickOnApply()
-// purpose  :
-//=================================================================================
-bool SMESHGUI_EditMeshDlg::ClickOnApply()
-{
-  if (mySMESHGUI->isActiveStudyLocked() || myMesh->_is_nil())
-    return false;
-
-  try {
-    if (myTypeId == 0)
-      onDetect();
-
-    SUIT_OverrideCursor aWaitCursor;
-    SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
-
-    SMESH::long_array_var anIds = new SMESH::long_array;
-    SMESH::array_of_long_array_var aGroupsOfElements = new SMESH::array_of_long_array;
-
-    if ( ListCoincident->count() == 0) {
-      if (myAction == 0)
-        SUIT_MessageBox::warning(this,
-                                 tr("SMESH_WARNING"),
-                                 tr("SMESH_NO_NODES_DETECTED"));
-      else
-        SUIT_MessageBox::warning(this,
-                                 tr("SMESH_WARNING"),
-                                 tr("SMESH_NO_ELEMENTS_DETECTED"));
-      return false;
-    }
-
-    aGroupsOfElements->length(ListCoincident->count());
-
-    int anArrayNum = 0;
-    for (int i = 0; i < ListCoincident->count(); i++) {
-      QStringList aListIds = ListCoincident->item(i)->text().split(" ", QString::SkipEmptyParts);
-
-      anIds->length(aListIds.count());
-      for (int i = 0; i < aListIds.count(); i++)
-        anIds[i] = aListIds[i].toInt();
-
-      aGroupsOfElements[anArrayNum++] = anIds.inout();
-    }
-
-    if( myAction == 0 )
-      aMeshEditor->MergeNodes (aGroupsOfElements.inout());
-    else
-      aMeshEditor->MergeElements (aGroupsOfElements.inout());
-
-    if ( myTypeId == 0 ) {
-      if (myAction ==0)
-        SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INFORMATION"),
-                                     tr("SMESH_MERGED_NODES").arg(QString::number(ListCoincident->count()).toLatin1().data()));
-      else
-        SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INFORMATION"),
-                                     tr("SMESH_MERGED_ELEMENTS").arg(QString::number(ListCoincident->count()).toLatin1().data()));
-    }
-      
-
-  } catch(...) {
-  }
-  
-  SMESH::UpdateView();
-  SMESHGUI::Modified();
-  
-  return true;
-}
-
-//=================================================================================
-// function : ClickOnOk()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::ClickOnOk()
-{
-  if (ClickOnApply())
-    ClickOnCancel();
-}
-
-//=================================================================================
-// function : ClickOnCancel()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::ClickOnCancel()
-{
-  myIdPreview->SetPointsLabeled(false);
-  SMESH::SetPointRepresentation(false);
-  disconnect(mySelectionMgr, 0, this, 0);
-  disconnect(mySMESHGUI, 0, this, 0);
-  mySMESHGUI->ResetState();
-
-  mySelectionMgr->clearFilters();
-  //mySelectionMgr->clearSelected();
-
-  if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-    aViewWindow->SetSelectionMode(ActorSelection);
-
-  reject();
-}
-
-//=================================================================================
-// function : ClickOnHelp()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::ClickOnHelp()
-{
-  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 : onEditGroup()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::onEditGroup()
-{
-  QList<QListWidgetItem*> selItems = ListCoincident->selectedItems();
-  if ( selItems.count() != 1 ) {
-    ListEdit->clear();
-    return;
-  }
-
-  QStringList aNewIds;
-
-  for (int i = 0; i < ListEdit->count(); i++ )
-    aNewIds.append(ListEdit->item(i)->text());
-
-  ListCoincident->clearSelection();
-  selItems.first()->setText(aNewIds.join(" "));
-  selItems.first()->setSelected(true);
-}
-
-//=================================================================================
-// function : updateControls()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::updateControls()
-{
-  if (ListEdit->count() == 0)
-    SetFirstButton->setEnabled(false);
-  bool enable = !(myMesh->_is_nil()) && (ListCoincident->count() || (myTypeId == 0));
-  buttonOk->setEnabled(enable);
-  buttonApply->setEnabled(enable);
-}
-
-//=================================================================================
-// function : onDetect()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::onDetect()
-{
-  if ( myMesh->_is_nil() || LineEditMesh->text().isEmpty() )
-    return;
-
-  try {
-    SUIT_OverrideCursor aWaitCursor;
-    SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
-
-    ListCoincident->clear();
-    ListEdit->clear();
-
-    SMESH::array_of_long_array_var aGroupsArray;
-
-    switch (myAction) {
-    case 0 :
-      if(!mySubMeshOrGroup->_is_nil())
-        aMeshEditor->FindCoincidentNodesOnPart(mySubMeshOrGroup, SpinBoxTolerance->GetValue(), aGroupsArray);
-      else
-        aMeshEditor->FindCoincidentNodes(SpinBoxTolerance->GetValue(), aGroupsArray);
-      break;
-    case 1 :
-      if(!mySubMeshOrGroup->_is_nil())
-        aMeshEditor->FindEqualElements(mySubMeshOrGroup, aGroupsArray);
-      else
-        aMeshEditor->FindEqualElements(myMesh, aGroupsArray);
-      break;
-    }
-    
-    for (int i = 0; i < aGroupsArray->length(); i++) {
-      SMESH::long_array& aGroup = aGroupsArray[i];
-
-      QStringList anIDs;
-      for (int j = 0; j < aGroup.length(); j++)
-        anIDs.append(QString::number(aGroup[j]));
-
-      ListCoincident->addItem(anIDs.join(" "));
-    }
-   } catch(...) {
-  }
-
-  ListCoincident->selectAll();
-  updateControls();
-}
-
-//=================================================================================
-// function : onSelectGroup()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::onSelectGroup()
-{
-  if (myIsBusy || !myActor)
-    return;
-  myEditCurrentArgument = (QWidget*)ListCoincident;
-
-  ListEdit->clear();
-  
-  TColStd_MapOfInteger anIndices;
-  QList<QListWidgetItem*> selItems = ListCoincident->selectedItems();
-  QListWidgetItem* anItem;
-  QStringList aListIds;
-
-  ListEdit->clear();
-
-  foreach(anItem, selItems) {
-    aListIds = anItem->text().split(" ", QString::SkipEmptyParts);
-    for (int i = 0; i < aListIds.count(); i++)
-      anIndices.Add(aListIds[i].toInt());
-  }
-  
-  if (selItems.count() == 1) {
-    ListEdit->addItems(aListIds);
-    ListEdit->selectAll();
-  }
-
-  mySelector->AddOrRemoveIndex(myActor->getIO(), anIndices, false);
-  SALOME_ListIO aList;
-  aList.Append(myActor->getIO());
-  mySelectionMgr->setSelectedObjects(aList,false);
-  
-  if (myAction == 0) {
-    myIdPreview->SetPointsData(myActor->GetObject()->GetMesh(), anIndices);
-    myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility());
-  }
-  else {
-    std::list< gp_XYZ > aGrCentersXYZ;
-    FindGravityCenter(anIndices, aGrCentersXYZ);
-    myIdPreview->SetElemsData( anIndices, aGrCentersXYZ);
-    myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility());
-  }
-
-  updateControls();
-}
-
-//=================================================================================
-// function : onSelectAll()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::onSelectAll (bool isToggled)
-{
-  if ( isToggled )
-    ListCoincident->selectAll();
-  else
-    ListCoincident->clearSelection();
-}
-
-//=================================================================================
-// function : onSelectElementFromGroup()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::onSelectElementFromGroup()
-{
-  if (myIsBusy || !myActor)
-    return;
-
-  TColStd_MapOfInteger anIndices;
-  QList<QListWidgetItem*> selItems = ListEdit->selectedItems();
-  QListWidgetItem* anItem;
-
-  foreach(anItem, selItems)
-    anIndices.Add(anItem->text().toInt());
-
-  SetFirstButton->setEnabled(selItems.count() == 1);
-
-  mySelector->AddOrRemoveIndex(myActor->getIO(), anIndices, false);
-  SALOME_ListIO aList;
-  aList.Append(myActor->getIO());
-  mySelectionMgr->setSelectedObjects(aList);
-
-  if (myAction == 0) {
-    myIdPreview->SetPointsData(myActor->GetObject()->GetMesh(), anIndices);
-    myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility());
-  }
-  else {
-    std::list< gp_XYZ > aGrCentersXYZ;
-    FindGravityCenter(anIndices, aGrCentersXYZ);
-    myIdPreview->SetElemsData(anIndices, aGrCentersXYZ);
-    myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility());
-  }
-}
-
-//=================================================================================
-// function : onAddGroup()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::onAddGroup()
-{
-  if ( myMesh->_is_nil() || LineEditMesh->text().isEmpty() )
-    return;
-
-  QString anIDs = "";
-  int aNbElements = 0;
-  aNbElements = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), anIDs);
-
-  if (aNbElements < 1)
-    return;
-  
-  ListCoincident->clearSelection();
-  ListCoincident->addItem(anIDs);
-  int nbGroups = ListCoincident->count();
-  if (nbGroups) {
-    ListCoincident->setCurrentRow(nbGroups-1);
-    ListCoincident->item(nbGroups-1)->setSelected(true);
-  }
-  else {
-    // VSR ? this code seems to be never executed!!!
-    ListCoincident->setCurrentRow(0);
-    //ListCoincident->setSelected(0, true); // VSR: no items - no selection
-  }
-
-  updateControls();
-}
-
-//=================================================================================
-// function : onRemoveGroup()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::onRemoveGroup()
-{
-  if (myEditCurrentArgument != (QWidget*)ListCoincident)
-    return;
-  myIsBusy = true;
-
-  QList<QListWidgetItem*> selItems = ListCoincident->selectedItems();
-  QListWidgetItem* anItem;
-
-  foreach(anItem, selItems)
-    delete anItem;
-
-  ListEdit->clear();
-  updateControls();
-
-  myIsBusy = false;
-}
-
-//=================================================================================
-// function : onAddElement()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::onAddElement()
-{
-  if (!myActor)
-    return;
-  myIsBusy = true;
-
-  QString aListStr = "";
-  int aNbNnodes = 0;
-
-  aNbNnodes = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr);
-  if (aNbNnodes < 1)
-    return;
-
-  QStringList aNodes = aListStr.split(" ", QString::SkipEmptyParts);
-
-  for (QStringList::iterator it = aNodes.begin(); it != aNodes.end(); ++it) {
-    QList<QListWidgetItem*> found = ListEdit->findItems(*it, Qt::MatchExactly);
-    if ( found.count() == 0 ) {
-      QListWidgetItem* anItem = new QListWidgetItem(*it);
-      ListEdit->addItem(anItem);
-      anItem->setSelected(true);
-    }
-    else {
-      QListWidgetItem* anItem;
-      foreach(anItem, found) anItem->setSelected(true);
-    }
-  }
-
-  myIsBusy = false;
-  onEditGroup();
-}
-
-//=================================================================================
-// function : onRemoveElement()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::onRemoveElement()
-{
-  if (myEditCurrentArgument != (QWidget*)ListCoincident)
-    return;
-  myIsBusy = true;
-
-  QList<QListWidgetItem*> selItems = ListEdit->selectedItems();
-  QListWidgetItem* anItem;
-
-  foreach(anItem, selItems)
-    delete anItem;
-  
-  myIsBusy = false;
-  onEditGroup();
-}
-
-//=================================================================================
-// function : onSetFirst()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::onSetFirst()
-{
-  if (myEditCurrentArgument != (QWidget*)ListCoincident)
-    return;
-  myIsBusy = true;
-  
-  QList<QListWidgetItem*> selItems = ListEdit->selectedItems();
-  QListWidgetItem* anItem;
-  
-  foreach(anItem, selItems) {
-    ListEdit->takeItem(ListEdit->row(anItem));
-    ListEdit->insertItem(0, anItem);
-  }
-
-  myIsBusy = false;
-  onEditGroup();
-}
-
-//=================================================================================
-// function : SetEditCurrentArgument()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::SetEditCurrentArgument()
-{
-  QPushButton* send = (QPushButton*)sender();
-
-  disconnect(mySelectionMgr, 0, this, 0);
-  mySelectionMgr->clearSelected();
-  mySelectionMgr->clearFilters();
-
-  if (send == SelectMeshButton) {
-    myEditCurrentArgument = (QWidget*)LineEditMesh;
-    SMESH::SetPointRepresentation(false);
-    if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-      aViewWindow->SetSelectionMode(ActorSelection);
-    if (myTypeId == 1)
-      mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
-  }
-
-  myEditCurrentArgument->setFocus();
-  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
-  SelectionIntoArgument();
-}
-
-//=================================================================================
-// function : SelectionIntoArgument()
-// purpose  : Called when selection as changed or other case
-//=================================================================================
-void SMESHGUI_EditMeshDlg::SelectionIntoArgument()
-{
-  if (myEditCurrentArgument == (QWidget*)LineEditMesh) {
-    QString aString = "";
-    LineEditMesh->setText(aString);
-    
-    ListCoincident->clear();
-    ListEdit->clear();
-    myActor = 0;
-    
-    int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
-    if (nbSel != 1) {
-      myIdPreview->SetPointsLabeled(false);
-      SMESH::SetPointRepresentation(false);
-      mySelectionMgr->clearFilters();
-      if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-        aViewWindow->SetSelectionMode(ActorSelection);
-      return;
-    }
-
-    SALOME_ListIO aList;
-    mySelectionMgr->selectedObjects(aList);
-    
-    Handle(SALOME_InteractiveObject) IO = aList.First();
-    myMesh = SMESH::GetMeshByIO(IO);
-    
-    if (myMesh->_is_nil())
-      return;
-
-    LineEditMesh->setText(aString);
-    
-    myActor = SMESH::FindActorByEntry(IO->getEntry());
-    if (!myActor)
-      myActor = SMESH::FindActorByObject(myMesh);
-    
-    if ( myActor && myTypeId ==1 ) {
-      mySubMeshOrGroup = SMESH::SMESH_IDSource::_nil();
-      mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
-      
-      if ((!SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(IO)->_is_nil() || //SUBMESH OR GROUP
-           !SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IO)->_is_nil()) &&
-          !SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO)->_is_nil())
-        mySubMeshOrGroup = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO);
-      
-      if (myAction == 0) {
-        SMESH::SetPointRepresentation(true);
-        if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-          aViewWindow->SetSelectionMode(NodeSelection);
-      }
-      else
-        if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-          aViewWindow->SetSelectionMode(CellSelection);
-    }
-
-    updateControls();
-  }
-}
-
-//=================================================================================
-// function : DeactivateActiveDialog()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::DeactivateActiveDialog()
-{
-  if (GroupConstructors->isEnabled()) {
-    GroupConstructors->setEnabled(false);
-    TypeBox->setEnabled(false);
-    GroupMesh->setEnabled(false);
-    GroupCoincident->setEnabled(false);
-    GroupEdit->setEnabled(false);
-    GroupButtons->setEnabled(false);
-    mySMESHGUI->ResetState();
-    mySMESHGUI->SetActiveDialogBox(0);
-  }
-
-  mySelectionMgr->clearSelected();
-  disconnect(mySelectionMgr, 0, this, 0);
-}
-
-//=================================================================================
-// function : ActivateThisDialog()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::ActivateThisDialog()
-{
-  /* Emit a signal to deactivate the active dialog */
-  mySMESHGUI->EmitSignalDeactivateDialog();
-  GroupConstructors->setEnabled(true);
-  TypeBox->setEnabled(true);
-  GroupMesh->setEnabled(true);
-  GroupCoincident->setEnabled(true);
-  GroupEdit->setEnabled(true);
-  GroupButtons->setEnabled(true);
-
-  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
-  mySMESHGUI->SetActiveDialogBox((QDialog*)this);
-  SelectionIntoArgument();
-}
-
-//=================================================================================
-// function : enterEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::enterEvent(QEvent*)
-{
-  if (!GroupConstructors->isEnabled())
-    ActivateThisDialog();
-}
-
-//=================================================================================
-// function : closeEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::closeEvent(QCloseEvent*)
-{
-  /* same than click on cancel button */
-  ClickOnCancel();
-}
-
-//=======================================================================
-//function : hideEvent
-//purpose  : caused by ESC key
-//=======================================================================
-void SMESHGUI_EditMeshDlg::hideEvent (QHideEvent *)
-{
-  if (!isMinimized())
-    ClickOnCancel();
-}
-
-//=================================================================================
-// function : keyPressEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_EditMeshDlg::keyPressEvent( QKeyEvent* e)
-{
-  QDialog::keyPressEvent( e );
-  if ( e->isAccepted() )
-    return;
-
-  if ( e->key() == Qt::Key_F1 ) {
-    e->accept();
-    ClickOnHelp();
-  }
-}
-
-//=================================================================================
-// function : onTypeChanged()
-// purpose  : the type radio button management
-//=================================================================================
-void SMESHGUI_EditMeshDlg::onTypeChanged (int id)
-{
-  if (myTypeId == id)
-    return;
-
-  myTypeId = id;
-  switch (id) {
-  case 0:
-    myIdPreview->SetPointsLabeled(false);
-    SMESH::SetPointRepresentation(false);
-    if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-      aViewWindow->SetSelectionMode(ActorSelection);
-    mySelectionMgr->clearFilters();
-    if (myAction == 0)
-      GroupCoincidentWidget->hide();
-    else
-      GroupCoincident->hide();
-    GroupEdit->hide();
-    break;
-  case 1:
-    SMESH::UpdateView();
-
-    // Costruction of the logical filter
-    SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
-    SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter (GROUP);
-    
-    QList<SUIT_SelectionFilter*> aListOfFilters;
-    if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
-    if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
-    
-    myMeshOrSubMeshOrGroupFilter =
-      new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
-
-    if (myAction == 0) {
-      GroupCoincidentWidget->show();
-      SMESH::SetPointRepresentation(true);
-      if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-        aViewWindow->SetSelectionMode(NodeSelection);
-    }
-    else {
-      GroupCoincident->show();
-      if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-        aViewWindow->SetSelectionMode(CellSelection);
-    }
-    GroupEdit->show();
-    break;
-  }
-  updateControls();
-
-  qApp->processEvents();
-  updateGeometry();
-  resize(10,10);
-
-  SelectionIntoArgument();
-}
diff --git a/src/SMESHGUI/SMESHGUI_EditMeshDlg.h b/src/SMESHGUI/SMESHGUI_EditMeshDlg.h
deleted file mode 100644 (file)
index 4ff7014..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-//  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
-//
-
-// SMESH SMESHGUI : GUI for SMESH component
-// File   : SMESHGUI_EditMeshDlg.h
-// Author : Open CASCADE S.A.S.
-//
-#ifndef SMESHGUI_EDITMESHDLG_H
-#define SMESHGUI_EDITMESHDLG_H
-
-// SMESH includes
-#include "SMESH_SMESHGUI.hxx"
-
-// Qt includes
-#include <QDialog>
-
-// OCCT includes
-#include <gp_XYZ.hxx>
-
-// STL includes
-#include <list>
-
-// IDL includes
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-
-class QGroupBox;
-class QLabel;
-class QLineEdit;
-class QPushButton;
-class QRadioButton;
-class QCheckBox;
-class QListWidget;
-class QButtonGroup;
-class SMESHGUI;
-class SMESHGUI_SpinBox;
-class SMESH_Actor;
-class SVTK_Selector;
-class LightApp_SelectionMgr;
-class SUIT_SelectionFilter;
-class TColStd_MapOfInteger;
-
-namespace SMESH
-{
-  struct TIdPreview;
-}
-
-//=================================================================================
-// class    : SMESHGUI_EditMeshDlg
-// purpose  : 
-//=================================================================================
-class SMESHGUI_EXPORT SMESHGUI_EditMeshDlg : public QDialog
-{
-  Q_OBJECT;
-
-public:
-  SMESHGUI_EditMeshDlg( SMESHGUI*, int );
-  ~SMESHGUI_EditMeshDlg();
-
-private:
-  void                      Init();
-  void                      closeEvent( QCloseEvent* );
-  void                      enterEvent( QEvent* );              /* mouse enter the QWidget */
-  void                      hideEvent( QHideEvent* );           /* ESC key */
-  void                      keyPressEvent( QKeyEvent* );
-  void                      onEditGroup();
-
-  void                      FindGravityCenter( TColStd_MapOfInteger&, 
-                                               std::list<gp_XYZ>& );
-  // add the centers of gravity of ElemsIdMap elements to the GrCentersXYZ list
-
-private:
-  SMESHGUI*                 mySMESHGUI;     /* Current SMESHGUI object */
-  LightApp_SelectionMgr*    mySelectionMgr; /* User shape selection */
-  SVTK_Selector*            mySelector;
-  
-  QWidget*                  myEditCurrentArgument;
-
-  SMESH::SMESH_Mesh_var     myMesh;
-  SMESH::SMESH_IDSource_var mySubMeshOrGroup;
-  SMESH_Actor*              myActor;
-  SUIT_SelectionFilter*     myMeshOrSubMeshOrGroupFilter;
-
-  SMESH::TIdPreview*        myIdPreview;
-
-  int                       myAction;
-  bool                      myIsBusy;
-  int                       myTypeId;
-
-  // Widgets
-  QGroupBox*                GroupConstructors;
-  QRadioButton*             RadioButton;
-
-  QGroupBox*                GroupButtons;
-  QPushButton*              buttonOk;
-  QPushButton*              buttonCancel;
-  QPushButton*              buttonApply;
-  QPushButton*              buttonHelp;
-
-  QGroupBox*                GroupMesh;
-  QLabel*                   TextLabelName;
-  QPushButton*              SelectMeshButton;
-  QLineEdit*                LineEditMesh;
-
-  QGroupBox*                GroupCoincident;
-  QWidget*                  GroupCoincidentWidget;
-  QLabel*                   TextLabelTolerance;
-  SMESHGUI_SpinBox*         SpinBoxTolerance;
-  QPushButton*              DetectButton;
-  QListWidget*              ListCoincident;
-  QPushButton*              AddGroupButton;
-  QPushButton*              RemoveGroupButton;
-  QCheckBox*                SelectAllCB;
-
-  QGroupBox*                GroupEdit;
-  QListWidget*              ListEdit;
-  QPushButton*              AddElemButton;
-  QPushButton*              RemoveElemButton;
-  QPushButton*              SetFirstButton;
-
-  QGroupBox*                TypeBox;
-  QButtonGroup*             GroupType;
-    
-  QString                   myHelpFileName;
-
- private slots:
-  void                      ClickOnOk();
-  void                      ClickOnCancel();
-  bool                      ClickOnApply();
-  void                      ClickOnHelp();
-  void                      updateControls();
-  void                      onDetect();
-  void                      onAddGroup();
-  void                      onRemoveGroup();
-  void                      onSelectGroup();
-  void                      onSelectAll( bool );
-  void                      onSelectElementFromGroup();
-  void                      onAddElement();
-  void                      onRemoveElement();
-  void                      onSetFirst();
-  void                      SetEditCurrentArgument();
-  void                      SelectionIntoArgument();
-  void                      DeactivateActiveDialog();
-  void                      ActivateThisDialog();
-  void                      onTypeChanged(int);
-};
-
-#endif // SMESHGUI_EDITMESHDLG_H
diff --git a/src/SMESHGUI/SMESHGUI_MergeDlg.cxx b/src/SMESHGUI/SMESHGUI_MergeDlg.cxx
new file mode 100644 (file)
index 0000000..ff37f9f
--- /dev/null
@@ -0,0 +1,1281 @@
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  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
+//
+
+// SMESH SMESHGUI : GUI for SMESH component
+// File   : SMESHGUI_MergeDlg.cxx
+// Author : Open CASCADE S.A.S.
+// SMESH includes
+//
+#include "SMESHGUI_MergeDlg.h"
+
+#include "SMESHGUI.h"
+#include "SMESHGUI_Utils.h"
+#include "SMESHGUI_VTKUtils.h"
+#include "SMESHGUI_MeshUtils.h"
+#include "SMESHGUI_SpinBox.h"
+
+#include <SMESH_Actor.h>
+#include <SMESH_TypeFilter.hxx>
+#include <SMESH_LogicalFilter.hxx>
+#include <SMDS_Mesh.hxx>
+
+// SALOME GUI includes
+#include <SUIT_Desktop.h>
+#include <SUIT_ResourceMgr.h>
+#include <SUIT_Session.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_OverrideCursor.h>
+
+#include <LightApp_Application.h>
+#include <LightApp_SelectionMgr.h>
+
+#include <SVTK_ViewModel.h>
+#include <SVTK_ViewWindow.h>
+#include <SALOME_ListIO.hxx>
+
+// OCCT includes
+#include <TColStd_MapOfInteger.hxx>
+#include <TColStd_MapIteratorOfMapOfInteger.hxx>
+
+// IDL includes
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SMESH_Group)
+#include CORBA_SERVER_HEADER(SMESH_MeshEditor)
+
+// VTK includes
+#include <vtkUnstructuredGrid.h>
+#include <vtkRenderer.h>
+#include <vtkActor2D.h>
+#include <vtkPoints.h>
+#include <vtkDataSetMapper.h>
+#include <vtkMaskPoints.h>
+#include <vtkSelectVisiblePoints.h>
+#include <vtkLabeledDataMapper.h>
+#include <vtkTextProperty.h>
+#include <vtkIntArray.h>
+#include <vtkProperty2D.h>
+#include <vtkPointData.h>
+#include <vtkConfigure.h>
+#if !defined(VTK_XVERSION)
+#define VTK_XVERSION (VTK_MAJOR_VERSION<<16)+(VTK_MINOR_VERSION<<8)+(VTK_BUILD_VERSION)
+#endif
+
+// Qt includes
+#include <QApplication>
+#include <QGroupBox>
+#include <QLabel>
+#include <QLineEdit>
+#include <QListWidget>
+#include <QPushButton>
+#include <QRadioButton>
+#include <QCheckBox>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QGridLayout>
+#include <QKeyEvent>
+#include <QButtonGroup>
+
+#define SPACING 6
+#define MARGIN  11
+
+namespace SMESH
+{
+  class TIdPreview
+  { // to display in the viewer IDs of the selected elements
+    SVTK_ViewWindow* myViewWindow;
+
+    vtkUnstructuredGrid* myIdGrid;
+    SALOME_Actor* myIdActor;
+
+    vtkUnstructuredGrid* myPointsNumDataSet;
+    vtkMaskPoints* myPtsMaskPoints;
+    vtkSelectVisiblePoints* myPtsSelectVisiblePoints;
+    vtkLabeledDataMapper* myPtsLabeledDataMapper;
+    vtkTextProperty* aPtsTextProp;
+    bool myIsPointsLabeled;
+    vtkActor2D* myPointLabels;
+
+    std::vector<int> myIDs;
+
+  public:
+    TIdPreview(SVTK_ViewWindow* theViewWindow):
+      myViewWindow(theViewWindow)
+    {
+      myIdGrid = vtkUnstructuredGrid::New();
+
+      // Create and display actor
+      vtkDataSetMapper* aMapper = vtkDataSetMapper::New();
+      aMapper->SetInput( myIdGrid );
+
+      myIdActor = SALOME_Actor::New();
+      myIdActor->SetInfinitive(true);
+      myIdActor->VisibilityOff();
+      myIdActor->PickableOff();
+
+      myIdActor->SetMapper( aMapper );
+      aMapper->Delete();
+
+      myViewWindow->AddActor(myIdActor);
+
+      //Definition of points numbering pipeline
+      myPointsNumDataSet = vtkUnstructuredGrid::New();
+
+      myPtsMaskPoints = vtkMaskPoints::New();
+      myPtsMaskPoints->SetInput(myPointsNumDataSet);
+      myPtsMaskPoints->SetOnRatio(1);
+
+      myPtsSelectVisiblePoints = vtkSelectVisiblePoints::New();
+      myPtsSelectVisiblePoints->SetInput(myPtsMaskPoints->GetOutput());
+      myPtsSelectVisiblePoints->SelectInvisibleOff();
+      myPtsSelectVisiblePoints->SetTolerance(0.1);
+    
+      myPtsLabeledDataMapper = vtkLabeledDataMapper::New();
+      myPtsLabeledDataMapper->SetInput(myPtsSelectVisiblePoints->GetOutput());
+#if (VTK_XVERSION < 0x050200)
+      myPtsLabeledDataMapper->SetLabelFormat("%g");
+#endif
+      myPtsLabeledDataMapper->SetLabelModeToLabelScalars();
+    
+      vtkTextProperty* aPtsTextProp = vtkTextProperty::New();
+      aPtsTextProp->SetFontFamilyToTimes();
+      static int aPointsFontSize = 12;
+      aPtsTextProp->SetFontSize(aPointsFontSize);
+      aPtsTextProp->SetBold(1);
+      aPtsTextProp->SetItalic(0);
+      aPtsTextProp->SetShadow(0);
+      myPtsLabeledDataMapper->SetLabelTextProperty(aPtsTextProp);
+      aPtsTextProp->Delete();
+  
+      myIsPointsLabeled = false;
+
+      myPointLabels = vtkActor2D::New();
+      myPointLabels->SetMapper(myPtsLabeledDataMapper);
+      myPointLabels->GetProperty()->SetColor(1,1,1);
+      myPointLabels->SetVisibility(myIsPointsLabeled);
+
+      AddToRender(myViewWindow->getRenderer());
+    }
+
+    void SetPointsData ( SMDS_Mesh* theMesh, 
+                         TColStd_MapOfInteger & theNodesIdMap )
+    {
+      vtkPoints* aPoints = vtkPoints::New();
+      aPoints->SetNumberOfPoints(theNodesIdMap.Extent());
+      myIDs.clear();
+      
+      TColStd_MapIteratorOfMapOfInteger idIter( theNodesIdMap );
+      for( int i = 0; idIter.More(); idIter.Next(), i++ ) {
+        const SMDS_MeshNode* aNode = theMesh->FindNode(idIter.Key());
+        aPoints->SetPoint( i, aNode->X(), aNode->Y(), aNode->Z() );
+        myIDs.push_back(idIter.Key());
+      }
+
+      myIdGrid->SetPoints(aPoints);
+
+      aPoints->Delete();
+
+      myIdActor->GetMapper()->Update();
+    }
+
+    void SetElemsData( TColStd_MapOfInteger & theElemsIdMap, 
+                       std::list<gp_XYZ> & aGrCentersXYZ )
+    {
+      vtkPoints* aPoints = vtkPoints::New();
+      aPoints->SetNumberOfPoints(theElemsIdMap.Extent());
+      myIDs.clear();
+      
+      TColStd_MapIteratorOfMapOfInteger idIter( theElemsIdMap );
+      for( ; idIter.More(); idIter.Next() ) {
+        myIDs.push_back(idIter.Key());
+      }
+
+      gp_XYZ aXYZ;
+      std::list<gp_XYZ>::iterator coordIt = aGrCentersXYZ.begin();
+      for( int i = 0; coordIt != aGrCentersXYZ.end(); coordIt++, i++ ) {
+        aXYZ = *coordIt;
+        aPoints->SetPoint( i, aXYZ.X(), aXYZ.Y(), aXYZ.Z() );
+      }
+      myIdGrid->SetPoints(aPoints);
+      aPoints->Delete();
+      
+      myIdActor->GetMapper()->Update();
+    }
+
+    void AddToRender(vtkRenderer* theRenderer)
+    {
+      myIdActor->AddToRender(theRenderer);
+
+      myPtsSelectVisiblePoints->SetRenderer(theRenderer);
+      theRenderer->AddActor2D(myPointLabels);
+    }
+
+    void RemoveFromRender(vtkRenderer* theRenderer)
+    {
+      myIdActor->RemoveFromRender(theRenderer);
+
+      myPtsSelectVisiblePoints->SetRenderer(theRenderer);
+      theRenderer->RemoveActor(myPointLabels);
+    }
+
+    void SetPointsLabeled( bool theIsPointsLabeled, bool theIsActorVisible = true )
+    {
+      myIsPointsLabeled = theIsPointsLabeled && myIdGrid->GetNumberOfPoints();
+      
+      if ( myIsPointsLabeled ) {
+        myPointsNumDataSet->ShallowCopy(myIdGrid);
+        vtkDataSet *aDataSet = myPointsNumDataSet;
+        int aNbElem = myIDs.size();
+        vtkIntArray *anArray = vtkIntArray::New();
+        anArray->SetNumberOfValues( aNbElem );
+        for ( int i = 0; i < aNbElem; i++ )
+          anArray->SetValue( i, myIDs[i] );
+        aDataSet->GetPointData()->SetScalars( anArray );
+        anArray->Delete();
+        myPtsMaskPoints->SetInput( aDataSet );
+        myPointLabels->SetVisibility( theIsActorVisible );
+      }
+      else {
+        myPointLabels->SetVisibility( false );
+      }
+    }
+    
+    ~TIdPreview()
+    {
+      RemoveFromRender(myViewWindow->getRenderer());
+
+      myIdGrid->Delete();
+
+      myViewWindow->RemoveActor(myIdActor);
+      myIdActor->Delete();
+
+      //Deleting of points numbering pipeline
+      //---------------------------------------
+      myPointsNumDataSet->Delete();
+      
+      //myPtsLabeledDataMapper->RemoveAllInputs();        //vtk 5.0 porting
+      myPtsLabeledDataMapper->Delete();
+
+      //myPtsSelectVisiblePoints->UnRegisterAllOutputs(); //vtk 5.0 porting
+      myPtsSelectVisiblePoints->Delete();
+
+      //myPtsMaskPoints->UnRegisterAllOutputs();          //vtk 5.0 porting
+      myPtsMaskPoints->Delete();
+
+      myPointLabels->Delete();
+
+//       myTimeStamp->Delete();
+    }
+  };
+}
+
+static const char * IconFirst[] = {
+"18 10 2 1",
+"       g None",
+".      g #000000",
+"         .     .  ",
+"  ..    ..    ..  ",
+"  ..   ...   ...  ",
+"  ..  ....  ....  ",
+"  .. ..... .....  ",
+"  .. ..... .....  ",
+"  ..  ....  ....  ",
+"  ..   ...   ...  ",
+"  ..    ..    ..  ",
+"         .     .  "};
+
+//=================================================================================
+// class    : SMESHGUI_MergeDlg()
+// purpose  :
+//=================================================================================
+SMESHGUI_MergeDlg::SMESHGUI_MergeDlg (SMESHGUI* theModule, int theAction)
+  : QDialog(SMESH::GetDesktop(theModule)),
+    mySMESHGUI(theModule),
+    mySelectionMgr(SMESH::GetSelectionMgr(theModule)),
+    myAction(theAction)
+{
+  setModal(false);
+  setAttribute(Qt::WA_DeleteOnClose, true);
+  setWindowTitle(myAction == 1 ? tr("SMESH_MERGE_ELEMENTS") : tr("SMESH_MERGE_NODES"));
+
+  myIdPreview = new SMESH::TIdPreview(SMESH::GetViewWindow( mySMESHGUI ));
+
+  SUIT_ResourceMgr* aResMgr = SMESH::GetResourceMgr( mySMESHGUI );
+  QPixmap IconMergeNodes (aResMgr->loadPixmap("SMESH", tr("ICON_SMESH_MERGE_NODES")));
+  QPixmap IconMergeElems (aResMgr->loadPixmap("SMESH", tr("ICON_DLG_MERGE_ELEMENTS")));
+  QPixmap IconSelect     (aResMgr->loadPixmap("SMESH", tr("ICON_SELECT")));
+  QPixmap IconAdd        (aResMgr->loadPixmap("SMESH", tr("ICON_APPEND")));
+  QPixmap IconRemove     (aResMgr->loadPixmap("SMESH", tr("ICON_REMOVE")));
+
+  setSizeGripEnabled(true);
+
+  QVBoxLayout* DlgLayout = new QVBoxLayout(this);
+  DlgLayout->setSpacing(SPACING);
+  DlgLayout->setMargin(MARGIN);
+
+  /***************************************************************/
+  GroupConstructors = new QGroupBox(myAction == 1 ? 
+                                    tr("SMESH_MERGE_ELEMENTS") : 
+                                    tr("SMESH_MERGE_NODES"), 
+                                    this);
+
+  QButtonGroup* ButtonGroup = new QButtonGroup(this);
+  QHBoxLayout* GroupConstructorsLayout = new QHBoxLayout(GroupConstructors);
+  GroupConstructorsLayout->setSpacing(SPACING);
+  GroupConstructorsLayout->setMargin(MARGIN);
+
+  RadioButton = new QRadioButton(GroupConstructors);
+  RadioButton->setIcon(myAction == 1 ? IconMergeElems : IconMergeNodes);
+  RadioButton->setChecked(true);
+  GroupConstructorsLayout->addWidget(RadioButton);
+  ButtonGroup->addButton(RadioButton, 0);
+
+  /***************************************************************/
+  // Controls for mesh defining
+  GroupMesh = new QGroupBox(tr("SMESH_SELECT_WHOLE_MESH"), this);
+  QHBoxLayout* GroupMeshLayout = new QHBoxLayout(GroupMesh);
+  GroupMeshLayout->setSpacing(SPACING);
+  GroupMeshLayout->setMargin(MARGIN);
+
+  TextLabelName = new QLabel(tr("SMESH_NAME"), GroupMesh);
+  SelectMeshButton = new QPushButton(GroupMesh);
+  SelectMeshButton->setIcon(IconSelect);
+  LineEditMesh = new QLineEdit(GroupMesh);
+  LineEditMesh->setReadOnly(true);
+
+  GroupMeshLayout->addWidget(TextLabelName);
+  GroupMeshLayout->addWidget(SelectMeshButton);
+  GroupMeshLayout->addWidget(LineEditMesh);
+
+  /***************************************************************/
+  // Controls for switch dialog behaviour
+
+  TypeBox = new QGroupBox( tr( "SMESH_MODE" ), this );
+  GroupType = new QButtonGroup( this );
+  QHBoxLayout* aTypeBoxLayout = new QHBoxLayout( TypeBox );
+  aTypeBoxLayout->setMargin( MARGIN );
+  aTypeBoxLayout->setSpacing( SPACING );
+
+  QRadioButton* rb1 = new QRadioButton( tr( "SMESH_AUTOMATIC" ), TypeBox );
+  QRadioButton* rb2 = new QRadioButton( tr( "SMESH_MANUAL" ),   TypeBox );
+  GroupType->addButton( rb1, 0 );
+  GroupType->addButton( rb2, 1 );
+  aTypeBoxLayout->addWidget( rb1 );
+  aTypeBoxLayout->addWidget( rb2 );
+
+  myTypeId = 0;
+
+  /***************************************************************/
+  // Controls for coincident elements detecting
+  GroupCoincident = new QGroupBox(myAction == 1 ? 
+                                  tr("COINCIDENT_ELEMENTS") : 
+                                  tr("COINCIDENT_NODES"), 
+                                  this);
+
+  QVBoxLayout* aCoincidentLayout = new QVBoxLayout(GroupCoincident);
+
+  GroupCoincident->setLayout(aCoincidentLayout);
+
+  QHBoxLayout* aSpinBoxLayout = new QHBoxLayout( GroupCoincident );
+  
+  if (myAction == 0) { // case merge nodes
+    TextLabelTolerance = new QLabel(tr("SMESH_TOLERANCE"), GroupCoincident);
+    SpinBoxTolerance = new SMESHGUI_SpinBox(GroupCoincident);
+    SpinBoxTolerance->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
+
+    aSpinBoxLayout->addWidget(TextLabelTolerance);
+    aSpinBoxLayout->addWidget(SpinBoxTolerance);
+    aCoincidentLayout->addLayout(aSpinBoxLayout);
+  }
+  else {
+    TextLabelTolerance = 0;
+    SpinBoxTolerance = 0;
+  }
+
+  GroupCoincidentWidget = new QWidget(GroupCoincident);
+  QGridLayout* GroupCoincidentLayout = new QGridLayout(GroupCoincidentWidget);
+  GroupCoincidentLayout->setSpacing(SPACING);
+  GroupCoincidentLayout->setMargin(MARGIN);
+
+  ListCoincident = new QListWidget(GroupCoincidentWidget);
+  ListCoincident->setSelectionMode(QListWidget::ExtendedSelection);
+
+  DetectButton      = new QPushButton(tr("DETECT"),           GroupCoincidentWidget);
+  AddGroupButton    = new QPushButton(tr("SMESH_BUT_ADD"),    GroupCoincidentWidget);
+  RemoveGroupButton = new QPushButton(tr("SMESH_BUT_REMOVE"), GroupCoincidentWidget);
+
+  SelectAllCB = new QCheckBox(tr("SELECT_ALL"), GroupCoincidentWidget);
+
+  if (myAction == 0)
+    GroupCoincidentWidget->hide();
+  else
+    GroupCoincident->hide();
+
+  GroupCoincidentLayout->addWidget(ListCoincident,    0,   0, 4, 2);
+  GroupCoincidentLayout->addWidget(DetectButton,      0,   2);
+  GroupCoincidentLayout->addWidget(AddGroupButton,    2, 2);
+  GroupCoincidentLayout->addWidget(RemoveGroupButton, 3, 2);
+  GroupCoincidentLayout->addWidget(SelectAllCB,       4, 0, 1, 3);
+  GroupCoincidentLayout->setRowMinimumHeight(1, 10);
+  GroupCoincidentLayout->setRowStretch(1, 5);
+
+  aCoincidentLayout->addWidget(GroupCoincidentWidget);
+
+  /***************************************************************/
+  // Controls for editing the selected group
+  GroupEdit = new QGroupBox(tr("EDIT_SELECTED_GROUP"), this);
+  QGridLayout* GroupEditLayout = new QGridLayout(GroupEdit);
+  GroupEditLayout->setSpacing(SPACING);
+  GroupEditLayout->setMargin(MARGIN);
+
+  ListEdit = new QListWidget(GroupEdit);
+  //ListEdit->setRowMode(QListBox::FixedNumber);
+  //ListEdit->setHScrollBarMode(QScrollView::AlwaysOn);
+  //ListEdit->setVScrollBarMode(QScrollView::AlwaysOff);
+  ListEdit->setFlow( QListView::LeftToRight );
+  ListEdit->setSelectionMode(QListWidget::ExtendedSelection);
+
+  AddElemButton = new QPushButton(GroupEdit);
+  AddElemButton->setIcon(IconAdd);
+  RemoveElemButton = new QPushButton(GroupEdit);
+  RemoveElemButton->setIcon(IconRemove);
+  SetFirstButton = new QPushButton(GroupEdit);
+  SetFirstButton->setIcon(QPixmap(IconFirst));
+
+  GroupEditLayout->addWidget(ListEdit,         0, 0, 2, 1);
+  GroupEditLayout->addWidget(AddElemButton,    0, 1);
+  GroupEditLayout->addWidget(RemoveElemButton, 0, 2);
+  GroupEditLayout->addWidget(SetFirstButton,   1, 1, 1, 2);
+
+  GroupEdit->hide();
+
+  /***************************************************************/
+  GroupButtons = new QGroupBox(this);
+  QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons);
+  GroupButtonsLayout->setSpacing(SPACING);
+  GroupButtonsLayout->setMargin(MARGIN);
+
+  buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons);
+  buttonOk->setAutoDefault(true);
+  buttonOk->setDefault(true);
+  buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
+  buttonApply->setAutoDefault(true);
+  buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
+  buttonCancel->setAutoDefault(true);
+  buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons);
+  buttonHelp->setAutoDefault(true);
+
+  GroupButtonsLayout->addWidget(buttonOk);
+  GroupButtonsLayout->addSpacing(10);
+  GroupButtonsLayout->addWidget(buttonApply);
+  GroupButtonsLayout->addSpacing(10);
+  GroupButtonsLayout->addStretch();
+  GroupButtonsLayout->addWidget(buttonCancel);
+  GroupButtonsLayout->addWidget(buttonHelp);
+
+  /***************************************************************/
+  DlgLayout->addWidget(GroupConstructors);
+  DlgLayout->addWidget(GroupMesh);
+  DlgLayout->addWidget(TypeBox);
+  DlgLayout->addWidget(GroupCoincident);
+  DlgLayout->addWidget(GroupEdit);
+  DlgLayout->addWidget(GroupButtons);
+
+  this->resize(10,10);
+
+  Init(); // Initialisations
+}
+
+//=================================================================================
+// function : ~SMESHGUI_MergeDlg()
+// purpose  : Destroys the object and frees any allocated resources
+//=================================================================================
+SMESHGUI_MergeDlg::~SMESHGUI_MergeDlg()
+{
+  delete myIdPreview;
+}
+
+//=================================================================================
+// function : Init()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::Init()
+{
+  if (myAction == 0) {
+    SpinBoxTolerance->RangeStepAndValidator(0.0, COORD_MAX, 0.00001, "len_tol_precision");
+    SpinBoxTolerance->SetValue(1e-05);
+  }
+
+  RadioButton->setChecked(true);
+
+  GroupType->button(0)->setChecked(true);
+
+  myEditCurrentArgument = (QWidget*)LineEditMesh; 
+
+  myActor = 0;
+  mySubMeshOrGroup = SMESH::SMESH_subMesh::_nil();
+
+  mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
+
+  mySMESHGUI->SetActiveDialogBox((QDialog*)this);
+  myIsBusy = false;
+  
+  /* signals and slots connections */
+  connect(buttonOk,     SIGNAL(clicked()), this, SLOT(ClickOnOk()));
+  connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
+  connect(buttonApply,  SIGNAL(clicked()), this, SLOT(ClickOnApply()));
+  connect(buttonHelp,   SIGNAL(clicked()), this, SLOT(ClickOnHelp()));
+
+  connect(SelectMeshButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
+  connect(DetectButton, SIGNAL (clicked()), this, SLOT(onDetect()));
+  connect(ListCoincident, SIGNAL (itemSelectionChanged()), this, SLOT(onSelectGroup()));
+  connect(AddGroupButton, SIGNAL (clicked()), this, SLOT(onAddGroup()));
+  connect(RemoveGroupButton, SIGNAL (clicked()), this, SLOT(onRemoveGroup()));
+  connect(SelectAllCB, SIGNAL(toggled(bool)), this, SLOT(onSelectAll(bool)));
+  connect(ListEdit, SIGNAL (itemSelectionChanged()), this, SLOT(onSelectElementFromGroup()));
+  connect(AddElemButton, SIGNAL (clicked()), this, SLOT(onAddElement()));
+  connect(RemoveElemButton, SIGNAL (clicked()), this, SLOT(onRemoveElement()));
+  connect(SetFirstButton, SIGNAL( clicked() ), this, SLOT( onSetFirst() ) );
+  connect(GroupType, SIGNAL(buttonClicked(int)), this, SLOT(onTypeChanged(int)));
+
+  connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
+  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
+  /* to close dialog if study change */
+  connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
+
+  // Init Mesh field from selection
+  SelectionIntoArgument();
+
+  // Update Buttons
+  updateControls();
+  
+  if (myAction == 0)
+    myHelpFileName = "merging_nodes_page.html";
+  else
+    myHelpFileName = "merging_elements_page.html";
+}
+
+//=================================================================================
+// function : FindGravityCenter()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::FindGravityCenter(TColStd_MapOfInteger & theElemsIdMap, 
+                                          std::list< gp_XYZ > & theGrCentersXYZ)
+{
+  if (!myActor)
+    return;
+
+  SMDS_Mesh* aMesh = 0;
+  aMesh = myActor->GetObject()->GetMesh();
+  if (!aMesh)
+    return;
+
+  int nbNodes;
+
+  TColStd_MapIteratorOfMapOfInteger idIter( theElemsIdMap );
+  for( ; idIter.More(); idIter.Next() ) {
+    const SMDS_MeshElement* anElem = aMesh->FindElement(idIter.Key());
+    if ( !anElem )
+      continue;
+
+    gp_XYZ anXYZ(0., 0., 0.);
+    SMDS_ElemIteratorPtr nodeIt = anElem->nodesIterator();
+    for ( nbNodes = 0; nodeIt->more(); nbNodes++ ) {
+      const SMDS_MeshNode* node = static_cast<const SMDS_MeshNode*>( nodeIt->next() );
+      anXYZ.Add( gp_XYZ( node->X(), node->Y(), node->Z() ) );
+    }
+    anXYZ.Divide( nbNodes );
+    
+    theGrCentersXYZ.push_back( anXYZ );
+  }
+}
+
+//=================================================================================
+// function : ClickOnApply()
+// purpose  :
+//=================================================================================
+bool SMESHGUI_MergeDlg::ClickOnApply()
+{
+  if (mySMESHGUI->isActiveStudyLocked() || myMesh->_is_nil())
+    return false;
+
+  try {
+    if (myTypeId == 0)
+      onDetect();
+
+    SUIT_OverrideCursor aWaitCursor;
+    SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
+
+    SMESH::long_array_var anIds = new SMESH::long_array;
+    SMESH::array_of_long_array_var aGroupsOfElements = new SMESH::array_of_long_array;
+
+    if ( ListCoincident->count() == 0) {
+      if (myAction == 0)
+        SUIT_MessageBox::warning(this,
+                                 tr("SMESH_WARNING"),
+                                 tr("SMESH_NO_NODES_DETECTED"));
+      else
+        SUIT_MessageBox::warning(this,
+                                 tr("SMESH_WARNING"),
+                                 tr("SMESH_NO_ELEMENTS_DETECTED"));
+      return false;
+    }
+
+    aGroupsOfElements->length(ListCoincident->count());
+
+    int anArrayNum = 0;
+    for (int i = 0; i < ListCoincident->count(); i++) {
+      QStringList aListIds = ListCoincident->item(i)->text().split(" ", QString::SkipEmptyParts);
+
+      anIds->length(aListIds.count());
+      for (int i = 0; i < aListIds.count(); i++)
+        anIds[i] = aListIds[i].toInt();
+
+      aGroupsOfElements[anArrayNum++] = anIds.inout();
+    }
+
+    if( myAction == 0 )
+      aMeshEditor->MergeNodes (aGroupsOfElements.inout());
+    else
+      aMeshEditor->MergeElements (aGroupsOfElements.inout());
+
+    if ( myTypeId == 0 ) {
+      if (myAction ==0)
+        SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INFORMATION"),
+                                     tr("SMESH_MERGED_NODES").arg(QString::number(ListCoincident->count()).toLatin1().data()));
+      else
+        SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INFORMATION"),
+                                     tr("SMESH_MERGED_ELEMENTS").arg(QString::number(ListCoincident->count()).toLatin1().data()));
+    }
+      
+
+  } catch(...) {
+  }
+  
+  SMESH::UpdateView();
+  SMESHGUI::Modified();
+  
+  return true;
+}
+
+//=================================================================================
+// function : ClickOnOk()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::ClickOnOk()
+{
+  if (ClickOnApply())
+    ClickOnCancel();
+}
+
+//=================================================================================
+// function : ClickOnCancel()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::ClickOnCancel()
+{
+  myIdPreview->SetPointsLabeled(false);
+  SMESH::SetPointRepresentation(false);
+  disconnect(mySelectionMgr, 0, this, 0);
+  disconnect(mySMESHGUI, 0, this, 0);
+  mySMESHGUI->ResetState();
+
+  mySelectionMgr->clearFilters();
+  //mySelectionMgr->clearSelected();
+
+  if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+    aViewWindow->SetSelectionMode(ActorSelection);
+
+  reject();
+}
+
+//=================================================================================
+// function : ClickOnHelp()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::ClickOnHelp()
+{
+  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 : onEditGroup()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::onEditGroup()
+{
+  QList<QListWidgetItem*> selItems = ListCoincident->selectedItems();
+  if ( selItems.count() != 1 ) {
+    ListEdit->clear();
+    return;
+  }
+
+  QStringList aNewIds;
+
+  for (int i = 0; i < ListEdit->count(); i++ )
+    aNewIds.append(ListEdit->item(i)->text());
+
+  ListCoincident->clearSelection();
+  selItems.first()->setText(aNewIds.join(" "));
+  selItems.first()->setSelected(true);
+}
+
+//=================================================================================
+// function : updateControls()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::updateControls()
+{
+  if (ListEdit->count() == 0)
+    SetFirstButton->setEnabled(false);
+  bool enable = !(myMesh->_is_nil()) && (ListCoincident->count() || (myTypeId == 0));
+  buttonOk->setEnabled(enable);
+  buttonApply->setEnabled(enable);
+}
+
+//=================================================================================
+// function : onDetect()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::onDetect()
+{
+  if ( myMesh->_is_nil() || LineEditMesh->text().isEmpty() )
+    return;
+
+  try {
+    SUIT_OverrideCursor aWaitCursor;
+    SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
+
+    ListCoincident->clear();
+    ListEdit->clear();
+
+    SMESH::array_of_long_array_var aGroupsArray;
+
+    switch (myAction) {
+    case 0 :
+      if(!mySubMeshOrGroup->_is_nil())
+        aMeshEditor->FindCoincidentNodesOnPart(mySubMeshOrGroup, SpinBoxTolerance->GetValue(), aGroupsArray);
+      else
+        aMeshEditor->FindCoincidentNodes(SpinBoxTolerance->GetValue(), aGroupsArray);
+      break;
+    case 1 :
+      if(!mySubMeshOrGroup->_is_nil())
+        aMeshEditor->FindEqualElements(mySubMeshOrGroup, aGroupsArray);
+      else
+        aMeshEditor->FindEqualElements(myMesh, aGroupsArray);
+      break;
+    }
+    
+    for (int i = 0; i < aGroupsArray->length(); i++) {
+      SMESH::long_array& aGroup = aGroupsArray[i];
+
+      QStringList anIDs;
+      for (int j = 0; j < aGroup.length(); j++)
+        anIDs.append(QString::number(aGroup[j]));
+
+      ListCoincident->addItem(anIDs.join(" "));
+    }
+   } catch(...) {
+  }
+
+  ListCoincident->selectAll();
+  updateControls();
+}
+
+//=================================================================================
+// function : onSelectGroup()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::onSelectGroup()
+{
+  if (myIsBusy || !myActor)
+    return;
+  myEditCurrentArgument = (QWidget*)ListCoincident;
+
+  ListEdit->clear();
+  
+  TColStd_MapOfInteger anIndices;
+  QList<QListWidgetItem*> selItems = ListCoincident->selectedItems();
+  QListWidgetItem* anItem;
+  QStringList aListIds;
+
+  ListEdit->clear();
+
+  foreach(anItem, selItems) {
+    aListIds = anItem->text().split(" ", QString::SkipEmptyParts);
+    for (int i = 0; i < aListIds.count(); i++)
+      anIndices.Add(aListIds[i].toInt());
+  }
+  
+  if (selItems.count() == 1) {
+    ListEdit->addItems(aListIds);
+    ListEdit->selectAll();
+  }
+
+  mySelector->AddOrRemoveIndex(myActor->getIO(), anIndices, false);
+  SALOME_ListIO aList;
+  aList.Append(myActor->getIO());
+  mySelectionMgr->setSelectedObjects(aList,false);
+  
+  if (myAction == 0) {
+    myIdPreview->SetPointsData(myActor->GetObject()->GetMesh(), anIndices);
+    myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility());
+  }
+  else {
+    std::list< gp_XYZ > aGrCentersXYZ;
+    FindGravityCenter(anIndices, aGrCentersXYZ);
+    myIdPreview->SetElemsData( anIndices, aGrCentersXYZ);
+    myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility());
+  }
+
+  updateControls();
+}
+
+//=================================================================================
+// function : onSelectAll()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::onSelectAll (bool isToggled)
+{
+  if ( isToggled )
+    ListCoincident->selectAll();
+  else
+    ListCoincident->clearSelection();
+}
+
+//=================================================================================
+// function : onSelectElementFromGroup()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::onSelectElementFromGroup()
+{
+  if (myIsBusy || !myActor)
+    return;
+
+  TColStd_MapOfInteger anIndices;
+  QList<QListWidgetItem*> selItems = ListEdit->selectedItems();
+  QListWidgetItem* anItem;
+
+  foreach(anItem, selItems)
+    anIndices.Add(anItem->text().toInt());
+
+  SetFirstButton->setEnabled(selItems.count() == 1);
+
+  mySelector->AddOrRemoveIndex(myActor->getIO(), anIndices, false);
+  SALOME_ListIO aList;
+  aList.Append(myActor->getIO());
+  mySelectionMgr->setSelectedObjects(aList);
+
+  if (myAction == 0) {
+    myIdPreview->SetPointsData(myActor->GetObject()->GetMesh(), anIndices);
+    myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility());
+  }
+  else {
+    std::list< gp_XYZ > aGrCentersXYZ;
+    FindGravityCenter(anIndices, aGrCentersXYZ);
+    myIdPreview->SetElemsData(anIndices, aGrCentersXYZ);
+    myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility());
+  }
+}
+
+//=================================================================================
+// function : onAddGroup()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::onAddGroup()
+{
+  if ( myMesh->_is_nil() || LineEditMesh->text().isEmpty() )
+    return;
+
+  QString anIDs = "";
+  int aNbElements = 0;
+  aNbElements = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), anIDs);
+
+  if (aNbElements < 1)
+    return;
+  
+  ListCoincident->clearSelection();
+  ListCoincident->addItem(anIDs);
+  int nbGroups = ListCoincident->count();
+  if (nbGroups) {
+    ListCoincident->setCurrentRow(nbGroups-1);
+    ListCoincident->item(nbGroups-1)->setSelected(true);
+  }
+  else {
+    // VSR ? this code seems to be never executed!!!
+    ListCoincident->setCurrentRow(0);
+    //ListCoincident->setSelected(0, true); // VSR: no items - no selection
+  }
+
+  updateControls();
+}
+
+//=================================================================================
+// function : onRemoveGroup()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::onRemoveGroup()
+{
+  if (myEditCurrentArgument != (QWidget*)ListCoincident)
+    return;
+  myIsBusy = true;
+
+  QList<QListWidgetItem*> selItems = ListCoincident->selectedItems();
+  QListWidgetItem* anItem;
+
+  foreach(anItem, selItems)
+    delete anItem;
+
+  ListEdit->clear();
+  updateControls();
+
+  myIsBusy = false;
+}
+
+//=================================================================================
+// function : onAddElement()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::onAddElement()
+{
+  if (!myActor)
+    return;
+  myIsBusy = true;
+
+  QString aListStr = "";
+  int aNbNnodes = 0;
+
+  aNbNnodes = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr);
+  if (aNbNnodes < 1)
+    return;
+
+  QStringList aNodes = aListStr.split(" ", QString::SkipEmptyParts);
+
+  for (QStringList::iterator it = aNodes.begin(); it != aNodes.end(); ++it) {
+    QList<QListWidgetItem*> found = ListEdit->findItems(*it, Qt::MatchExactly);
+    if ( found.count() == 0 ) {
+      QListWidgetItem* anItem = new QListWidgetItem(*it);
+      ListEdit->addItem(anItem);
+      anItem->setSelected(true);
+    }
+    else {
+      QListWidgetItem* anItem;
+      foreach(anItem, found) anItem->setSelected(true);
+    }
+  }
+
+  myIsBusy = false;
+  onEditGroup();
+}
+
+//=================================================================================
+// function : onRemoveElement()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::onRemoveElement()
+{
+  if (myEditCurrentArgument != (QWidget*)ListCoincident)
+    return;
+  myIsBusy = true;
+
+  QList<QListWidgetItem*> selItems = ListEdit->selectedItems();
+  QListWidgetItem* anItem;
+
+  foreach(anItem, selItems)
+    delete anItem;
+  
+  myIsBusy = false;
+  onEditGroup();
+}
+
+//=================================================================================
+// function : onSetFirst()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::onSetFirst()
+{
+  if (myEditCurrentArgument != (QWidget*)ListCoincident)
+    return;
+  myIsBusy = true;
+  
+  QList<QListWidgetItem*> selItems = ListEdit->selectedItems();
+  QListWidgetItem* anItem;
+  
+  foreach(anItem, selItems) {
+    ListEdit->takeItem(ListEdit->row(anItem));
+    ListEdit->insertItem(0, anItem);
+  }
+
+  myIsBusy = false;
+  onEditGroup();
+}
+
+//=================================================================================
+// function : SetEditCurrentArgument()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::SetEditCurrentArgument()
+{
+  QPushButton* send = (QPushButton*)sender();
+
+  disconnect(mySelectionMgr, 0, this, 0);
+  mySelectionMgr->clearSelected();
+  mySelectionMgr->clearFilters();
+
+  if (send == SelectMeshButton) {
+    myEditCurrentArgument = (QWidget*)LineEditMesh;
+    SMESH::SetPointRepresentation(false);
+    if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+      aViewWindow->SetSelectionMode(ActorSelection);
+    if (myTypeId == 1)
+      mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
+  }
+
+  myEditCurrentArgument->setFocus();
+  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
+  SelectionIntoArgument();
+}
+
+//=================================================================================
+// function : SelectionIntoArgument()
+// purpose  : Called when selection as changed or other case
+//=================================================================================
+void SMESHGUI_MergeDlg::SelectionIntoArgument()
+{
+  if (myEditCurrentArgument == (QWidget*)LineEditMesh) {
+    QString aString = "";
+    LineEditMesh->setText(aString);
+    
+    ListCoincident->clear();
+    ListEdit->clear();
+    myActor = 0;
+    
+    int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
+    if (nbSel != 1) {
+      myIdPreview->SetPointsLabeled(false);
+      SMESH::SetPointRepresentation(false);
+      mySelectionMgr->clearFilters();
+      if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+        aViewWindow->SetSelectionMode(ActorSelection);
+      return;
+    }
+
+    SALOME_ListIO aList;
+    mySelectionMgr->selectedObjects(aList);
+    
+    Handle(SALOME_InteractiveObject) IO = aList.First();
+    myMesh = SMESH::GetMeshByIO(IO);
+    
+    if (myMesh->_is_nil())
+      return;
+
+    LineEditMesh->setText(aString);
+    
+    myActor = SMESH::FindActorByEntry(IO->getEntry());
+    if (!myActor)
+      myActor = SMESH::FindActorByObject(myMesh);
+    
+    if ( myActor && myTypeId ==1 ) {
+      mySubMeshOrGroup = SMESH::SMESH_IDSource::_nil();
+      mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
+      
+      if ((!SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(IO)->_is_nil() || //SUBMESH OR GROUP
+           !SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IO)->_is_nil()) &&
+          !SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO)->_is_nil())
+        mySubMeshOrGroup = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO);
+      
+      if (myAction == 0) {
+        SMESH::SetPointRepresentation(true);
+        if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+          aViewWindow->SetSelectionMode(NodeSelection);
+      }
+      else
+        if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+          aViewWindow->SetSelectionMode(CellSelection);
+    }
+
+    updateControls();
+  }
+}
+
+//=================================================================================
+// function : DeactivateActiveDialog()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::DeactivateActiveDialog()
+{
+  if (GroupConstructors->isEnabled()) {
+    GroupConstructors->setEnabled(false);
+    TypeBox->setEnabled(false);
+    GroupMesh->setEnabled(false);
+    GroupCoincident->setEnabled(false);
+    GroupEdit->setEnabled(false);
+    GroupButtons->setEnabled(false);
+    mySMESHGUI->ResetState();
+    mySMESHGUI->SetActiveDialogBox(0);
+  }
+
+  mySelectionMgr->clearSelected();
+  disconnect(mySelectionMgr, 0, this, 0);
+}
+
+//=================================================================================
+// function : ActivateThisDialog()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::ActivateThisDialog()
+{
+  /* Emit a signal to deactivate the active dialog */
+  mySMESHGUI->EmitSignalDeactivateDialog();
+  GroupConstructors->setEnabled(true);
+  TypeBox->setEnabled(true);
+  GroupMesh->setEnabled(true);
+  GroupCoincident->setEnabled(true);
+  GroupEdit->setEnabled(true);
+  GroupButtons->setEnabled(true);
+
+  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
+  mySMESHGUI->SetActiveDialogBox((QDialog*)this);
+  SelectionIntoArgument();
+}
+
+//=================================================================================
+// function : enterEvent()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::enterEvent(QEvent*)
+{
+  if (!GroupConstructors->isEnabled())
+    ActivateThisDialog();
+}
+
+//=================================================================================
+// function : closeEvent()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::closeEvent(QCloseEvent*)
+{
+  /* same than click on cancel button */
+  ClickOnCancel();
+}
+
+//=======================================================================
+//function : hideEvent
+//purpose  : caused by ESC key
+//=======================================================================
+void SMESHGUI_MergeDlg::hideEvent (QHideEvent *)
+{
+  if (!isMinimized())
+    ClickOnCancel();
+}
+
+//=================================================================================
+// function : keyPressEvent()
+// purpose  :
+//=================================================================================
+void SMESHGUI_MergeDlg::keyPressEvent( QKeyEvent* e)
+{
+  QDialog::keyPressEvent( e );
+  if ( e->isAccepted() )
+    return;
+
+  if ( e->key() == Qt::Key_F1 ) {
+    e->accept();
+    ClickOnHelp();
+  }
+}
+
+//=================================================================================
+// function : onTypeChanged()
+// purpose  : the type radio button management
+//=================================================================================
+void SMESHGUI_MergeDlg::onTypeChanged (int id)
+{
+  if (myTypeId == id)
+    return;
+
+  myTypeId = id;
+  switch (id)
+  {
+  case 0: // automatic
+    myIdPreview->SetPointsLabeled(false);
+    SMESH::SetPointRepresentation(false);
+    if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+      aViewWindow->SetSelectionMode(ActorSelection);
+    mySelectionMgr->clearFilters();
+    if (myAction == 0)
+      GroupCoincidentWidget->hide();
+    else
+      GroupCoincident->hide();
+    GroupEdit->hide();
+    break;
+
+  case 1: // manual
+    SMESH::UpdateView();
+
+    // Costruction of the logical filter
+    SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
+    SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter (GROUP);
+    
+    QList<SUIT_SelectionFilter*> aListOfFilters;
+    if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
+    if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
+    
+    myMeshOrSubMeshOrGroupFilter =
+      new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
+
+    if (myAction == 0) {
+      GroupCoincidentWidget->show();
+      SMESH::SetPointRepresentation(true);
+      if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+        aViewWindow->SetSelectionMode(NodeSelection);
+    }
+    else {
+      GroupCoincident->show();
+      if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+        aViewWindow->SetSelectionMode(CellSelection);
+    }
+    GroupEdit->show();
+    break;
+  }
+  updateControls();
+
+  qApp->processEvents();
+  updateGeometry();
+  resize(10,10);
+
+  SelectionIntoArgument();
+}
diff --git a/src/SMESHGUI/SMESHGUI_MergeDlg.h b/src/SMESHGUI/SMESHGUI_MergeDlg.h
new file mode 100644 (file)
index 0000000..30f3237
--- /dev/null
@@ -0,0 +1,167 @@
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  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
+//
+
+// SMESH SMESHGUI : GUI for SMESH component
+// File   : SMESHGUI_MergeDlg.h
+// Author : Open CASCADE S.A.S.
+//
+#ifndef SMESHGUI_MergeDlg_H
+#define SMESHGUI_MergeDlg_H
+
+// SMESH includes
+#include "SMESH_SMESHGUI.hxx"
+
+// Qt includes
+#include <QDialog>
+
+// OCCT includes
+#include <gp_XYZ.hxx>
+
+// STL includes
+#include <list>
+
+// IDL includes
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SMESH_Mesh)
+
+class QGroupBox;
+class QLabel;
+class QLineEdit;
+class QPushButton;
+class QRadioButton;
+class QCheckBox;
+class QListWidget;
+class QButtonGroup;
+class SMESHGUI;
+class SMESHGUI_SpinBox;
+class SMESH_Actor;
+class SVTK_Selector;
+class LightApp_SelectionMgr;
+class SUIT_SelectionFilter;
+class TColStd_MapOfInteger;
+
+namespace SMESH
+{
+  struct TIdPreview;
+}
+
+//=================================================================================
+// class    : SMESHGUI_MergeDlg
+// purpose  : 
+//=================================================================================
+class SMESHGUI_EXPORT SMESHGUI_MergeDlg : public QDialog
+{
+  Q_OBJECT;
+
+public:
+  SMESHGUI_MergeDlg( SMESHGUI*, int );
+  ~SMESHGUI_MergeDlg();
+
+private:
+  void                      Init();
+  void                      closeEvent( QCloseEvent* );
+  void                      enterEvent( QEvent* );              /* mouse enter the QWidget */
+  void                      hideEvent( QHideEvent* );           /* ESC key */
+  void                      keyPressEvent( QKeyEvent* );
+  void                      onEditGroup();
+
+  void                      FindGravityCenter( TColStd_MapOfInteger&, 
+                                               std::list<gp_XYZ>& );
+  // add the centers of gravity of ElemsIdMap elements to the GrCentersXYZ list
+
+private:
+  SMESHGUI*                 mySMESHGUI;     /* Current SMESHGUI object */
+  LightApp_SelectionMgr*    mySelectionMgr; /* User shape selection */
+  SVTK_Selector*            mySelector;
+  
+  QWidget*                  myEditCurrentArgument;
+
+  SMESH::SMESH_Mesh_var     myMesh;
+  SMESH::SMESH_IDSource_var mySubMeshOrGroup;
+  SMESH_Actor*              myActor;
+  SUIT_SelectionFilter*     myMeshOrSubMeshOrGroupFilter;
+
+  SMESH::TIdPreview*        myIdPreview;
+
+  int                       myAction;
+  bool                      myIsBusy;
+  int                       myTypeId;
+
+  // Widgets
+  QGroupBox*                GroupConstructors;
+  QRadioButton*             RadioButton;
+
+  QGroupBox*                GroupButtons;
+  QPushButton*              buttonOk;
+  QPushButton*              buttonCancel;
+  QPushButton*              buttonApply;
+  QPushButton*              buttonHelp;
+
+  QGroupBox*                GroupMesh;
+  QLabel*                   TextLabelName;
+  QPushButton*              SelectMeshButton;
+  QLineEdit*                LineEditMesh;
+
+  QGroupBox*                GroupCoincident;
+  QWidget*                  GroupCoincidentWidget;
+  QLabel*                   TextLabelTolerance;
+  SMESHGUI_SpinBox*         SpinBoxTolerance;
+  QPushButton*              DetectButton;
+  QListWidget*              ListCoincident;
+  QPushButton*              AddGroupButton;
+  QPushButton*              RemoveGroupButton;
+  QCheckBox*                SelectAllCB;
+
+  QGroupBox*                GroupEdit;
+  QListWidget*              ListEdit;
+  QPushButton*              AddElemButton;
+  QPushButton*              RemoveElemButton;
+  QPushButton*              SetFirstButton;
+
+  QGroupBox*                TypeBox;
+  QButtonGroup*             GroupType;
+    
+  QString                   myHelpFileName;
+
+ private slots:
+  void                      ClickOnOk();
+  void                      ClickOnCancel();
+  bool                      ClickOnApply();
+  void                      ClickOnHelp();
+  void                      updateControls();
+  void                      onDetect();
+  void                      onAddGroup();
+  void                      onRemoveGroup();
+  void                      onSelectGroup();
+  void                      onSelectAll( bool );
+  void                      onSelectElementFromGroup();
+  void                      onAddElement();
+  void                      onRemoveElement();
+  void                      onSetFirst();
+  void                      SetEditCurrentArgument();
+  void                      SelectionIntoArgument();
+  void                      DeactivateActiveDialog();
+  void                      ActivateThisDialog();
+  void                      onTypeChanged(int);
+};
+
+#endif // SMESHGUI_MergeDlg_H
index a830f870a085a068ac518046832efe61efc90d76..56554a39694b5fe27cfbec6c8bd0138f19e9cff5 100644 (file)
@@ -3758,7 +3758,7 @@ Please select a groups and try again</translation>
     </message>
 </context>
 <context>
-    <name>SMESHGUI_EditMeshDlg</name>
+    <name>SMESHGUI_MergeDlg</name>
     <message>
         <source>COINCIDENT_ELEMENTS</source>
         <translation>Coincident elements</translation>