Salome HOME
0019050: EDF 521 (For GEOM/BasicGUI): Improve selection process in the dialogs
[modules/geom.git] / src / OperationGUI / OperationGUI_ChamferDlg.cxx
index 92085d2290554577aa719305a9c841c691fc3589..002280d408d9997cc165a0e3ca6d5f26bfa538c2 100644 (file)
-//  GEOM GEOMGUI : GUI for Geometry component
+// GEOM GEOMGUI : GUI for Geometry component
 //
-//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
 // 
-//  This library is free software; you can redistribute it and/or 
-//  modify it under the terms of the GNU Lesser General Public 
-//  License as published by the Free Software Foundation; either 
-//  version 2.1 of the License. 
+// This library is 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. 
+// 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 
+// You should have received a copy of the GNU Lesser General Public 
+// License along with this library; if not, write to the Free Software 
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
 // 
-//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+// File   : OperationGUI_ChamferDlg.cxx
+// Author : Damien COQUERET, Open CASCADE S.A.S.
 //
-//
-//  File   : OperationGUI_ChamferDlg.cxx
-//  Author : Damien COQUERET
-//  Module : GEOM
-//  $Header$
 
-using namespace std;
 #include "OperationGUI_ChamferDlg.h"
 
-#include "DisplayGUI.h"
+#include <DlgRef.h>
+#include <GeometryGUI.h>
+#include <GEOMBase.h>
+
+#include <SUIT_Desktop.h>
+#include <SUIT_Session.h>
+#include <SUIT_ResourceMgr.h>
+#include <SUIT_ViewWindow.h>
+#include <SUIT_ViewManager.h>
+#include <SalomeApp_Application.h>
+#include <LightApp_SelectionMgr.h>
+#include <OCCViewer_ViewModel.h>
+
+#include <TColStd_MapOfInteger.hxx>
 
-#include <AIS_InteractiveContext.hxx>
-#include <BRepFilletAPI_MakeChamfer.hxx>
-#include <BRepTools.hxx>
-#include <BRep_Tool.hxx>
-#include <TopExp.hxx>
-#include <Precision.hxx>
+#include <GEOMImpl_Types.hxx>
 
 //=================================================================================
 // class    : OperationGUI_ChamferDlg()
-// purpose  : Constructs a OperationGUI_ChamferDlg which is a child of 'parent', with the 
+// purpose  : Constructs a OperationGUI_ChamferDlg which is a child of 'parent', with the
 //            name 'name' and widget flags set to 'f'.
 //            The dialog will by default be modeless, unless you set 'modal' to
 //            TRUE to construct a modal dialog.
 //=================================================================================
-OperationGUI_ChamferDlg::OperationGUI_ChamferDlg(QWidget* parent, const char* name, OperationGUI* theOperationGUI, SALOME_Selection* Sel, Handle(AIS_InteractiveContext) ic, bool modal, WFlags fl)
-  :GEOMBase_Skeleton(parent, name, Sel, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu)
+OperationGUI_ChamferDlg::OperationGUI_ChamferDlg( GeometryGUI* theGeometryGUI, QWidget* parent )
+  : GEOMBase_Skeleton( theGeometryGUI, parent, false )
 {
-  QPixmap image0(QAD_Desktop::getResourceManager()->loadPixmap("GEOM",tr("ICON_DLG_CHAMFER_ALL")));
-  QPixmap image1(QAD_Desktop::getResourceManager()->loadPixmap("GEOM",tr("ICON_DLG_CHAMFER_EDGE")));
-  QPixmap image2(QAD_Desktop::getResourceManager()->loadPixmap("GEOM",tr("ICON_DLG_CHAMFER_FACE")));
-  QPixmap image3(QAD_Desktop::getResourceManager()->loadPixmap("GEOM",tr("ICON_SELECT")));
-
-    setCaption(tr("GEOM_CHAMFER_TITLE"));
-
-  /***************************************************************/
-  GroupConstructors->setTitle(tr("GEOM_CHAMFER"));
-  RadioButton1->setPixmap(image0);
-  RadioButton2->setPixmap(image1);
-  RadioButton3->setPixmap(image2);
-
-  Group1 = new DlgRef_1Sel2Spin(this, "Group1");
-  Group1->GroupBox1->setTitle(tr("GEOM_CHAMFER_ALL"));
-  Group1->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
-  Group1->TextLabel2->setText(tr("GEOM_D1"));
-  Group1->TextLabel3->setText(tr("GEOM_D2"));
-  Group1->PushButton1->setPixmap(image3);
-
-  Group2 = new DlgRef_1Sel2Spin(this, "Group2");
-  Group2->GroupBox1->setTitle(tr("GEOM_CHAMFER_EDGES"));
-  Group2->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
-  Group2->TextLabel2->setText(tr("GEOM_D1"));
-  Group2->TextLabel3->setText(tr("GEOM_D2"));
-  Group2->PushButton1->setPixmap(image3);
-
-  Group3 = new DlgRef_1Sel2Spin(this, "Group3");
-  Group3->GroupBox1->setTitle(tr("GEOM_CHAMFER_FACES"));
-  Group3->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
-  Group3->TextLabel2->setText(tr("GEOM_D1"));
-  Group3->TextLabel3->setText(tr("GEOM_D2"));
-  Group3->PushButton1->setPixmap(image3);
-
-  Layout1->addWidget(Group1, 1, 0);
-  Layout1->addWidget(Group2, 1, 0);
-  Layout1->addWidget(Group3, 1, 0);
-  /***************************************************************/
+  QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_CHAMFER_ALL" ) ) );
+  QPixmap image2( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_CHAMFER_EDGE_FROM_FACE" ) ) );
+  QPixmap image3( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_CHAMFER_FACE" ) ) );
+  QPixmap image4( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_CHAMFER_EDGE" ) ) );
+  QPixmap iconSelect( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) );
+
+  setWindowTitle( tr( "GEOM_CHAMFER_TITLE" ) );
+
+  mainFrame()->GroupConstructors->setTitle( tr( "GEOM_CHAMFER" ) );
+
+  mainFrame()->RadioButton1->setIcon( image1 );
+  mainFrame()->RadioButton2->setIcon( image2 );
+  mainFrame()->RadioButton3->setIcon( image3 );
+  mainFrame()->RadioButton4->show();
+  mainFrame()->RadioButton4->setIcon( image4 );
+
+  // Create first group
+
+  myGrp1 = new QGroupBox( tr( "GEOM_CHAMFER_ALL" ), centralWidget() );
+
+  QGridLayout* aLayout = new QGridLayout( myGrp1 );
+  aLayout->setMargin( 9 ); aLayout->setSpacing( 6 );
+
+  createSelWg( tr( "GEOM_MAIN_OBJECT" ), iconSelect, myGrp1, aLayout, MainObj1 );
+
+  int row = aLayout->rowCount();
+  aLayout->addWidget( new QLabel( tr( "D" ), myGrp1 ), row, 0 );
+  aLayout->addWidget( ( mySpinBox[ SpinBox1 ] = new QDoubleSpinBox( myGrp1 ) ), row++, 2 );
+  aLayout->setRowStretch( row, 10 );
+
+  // Create second group
+
+  myGrp2 = new QGroupBox( tr( "GEOM_CHAMFER_EDGES" ), centralWidget() );
+
+  aLayout = new QGridLayout( myGrp2 );
+  aLayout->setMargin( 9 ); aLayout->setSpacing( 6 );
+
+  createSelWg( tr( "GEOM_MAIN_OBJECT" ), iconSelect, myGrp2, aLayout, MainObj2 );
+  createSelWg( tr( "FACE_1" ),           iconSelect, myGrp2, aLayout, Face1 );
+  createSelWg( tr( "FACE_2" ),           iconSelect, myGrp2, aLayout, Face2 );
+
+  createRadioWg( tr( "GEOM_D1" ), tr( "GEOM_D2" ),    myGrp2, aLayout, RadioButton21, SpinBox21, SpinBox22 );
+  createRadioWg( tr( "GEOM_D" ),  tr( "GEOM_ANGLE" ), myGrp2, aLayout, RadioButton22, SpinBox23, SpinBox24 );
+
+  aLayout->setRowStretch( aLayout->rowCount(), 10 );
+
+  // Create third group
+
+  myGrp3 = new QGroupBox( tr( "GEOM_CHAMFER_FACES" ), centralWidget() );
+
+  aLayout = new QGridLayout( myGrp3 );
+  aLayout->setMargin( 9 ); aLayout->setSpacing( 6 );
+
+  createSelWg( tr( "GEOM_MAIN_OBJECT" ), iconSelect, myGrp3, aLayout, MainObj3 );
+  createSelWg( tr( "SELECTED_FACES" ),   iconSelect, myGrp3, aLayout, Faces );
+
+  createRadioWg( tr( "GEOM_D1" ), tr( "GEOM_D2" ),    myGrp3, aLayout, RadioButton31, SpinBox31, SpinBox32 );
+  createRadioWg( tr( "GEOM_D" ),  tr( "GEOM_ANGLE" ), myGrp3, aLayout, RadioButton32, SpinBox33, SpinBox34 );
+
+  aLayout->setRowStretch( aLayout->rowCount(), 10 );
+
+  // Create fourth group
+
+  myGrp4 = new QGroupBox( tr( "GEOM_CHAMFER_EDGE" ), centralWidget() );
+
+  aLayout = new QGridLayout( myGrp4 );
+  aLayout->setMargin( 9 ); aLayout->setSpacing( 6 );
+
+  createSelWg( tr( "GEOM_MAIN_OBJECT" ), iconSelect, myGrp4, aLayout, MainObj4 );
+  createSelWg( tr( "SELECTED_EDGE" ),    iconSelect, myGrp4, aLayout, Edges );
+
+  createRadioWg( tr( "GEOM_D1" ), tr( "GEOM_D2" ),    myGrp4, aLayout, RadioButton41, SpinBox41, SpinBox42 );
+  createRadioWg( tr( "GEOM_D" ),  tr( "GEOM_ANGLE" ), myGrp4, aLayout, RadioButton42, SpinBox43, SpinBox44 );
+
+  aLayout->setRowStretch( aLayout->rowCount(), 10 );
+
+  // Add groups to layout
+
+  QVBoxLayout* layout = new QVBoxLayout( centralWidget() );
+  layout->setMargin( 0 ); layout->setSpacing( 6 );
+  layout->addWidget( myGrp1 );
+  layout->addWidget( myGrp2 );
+  layout->addWidget( myGrp3 );
+  layout->addWidget( myGrp4 );
+
+  // Set range of spinboxes
+
+  double SpecificStep = 10.0;
+  QMap< int, QDoubleSpinBox* >::iterator anIter;
+  for ( anIter = mySpinBox.begin(); anIter != mySpinBox.end(); ++anIter ) {
+    if ( anIter.key() == SpinBox44 || anIter.key() == SpinBox34 || anIter.key() == SpinBox24 )
+      initSpinBox( anIter.value(), 0.001, 89.999, 5, 0 );
+    else
+      initSpinBox( anIter.value(), 0.001, COORD_MAX, SpecificStep, 3 );
+  }
+
+  setHelpFileName( "chamfer_operation_page.html" );
 
   /* Initialisations */
-  myOperationGUI = theOperationGUI;
-  Init(ic);
+  Init();
+  myRadioButton[ RadioButton21 ]->click();
 }
 
 
@@ -98,8 +161,7 @@ OperationGUI_ChamferDlg::OperationGUI_ChamferDlg(QWidget* parent, const char* na
 // purpose  : Destroys the object and frees any allocated resources
 //=================================================================================
 OperationGUI_ChamferDlg::~OperationGUI_ChamferDlg()
-{  
-  /* no need to delete child widgets, Qt does it all for us */
+{
 }
 
 
@@ -107,75 +169,51 @@ OperationGUI_ChamferDlg::~OperationGUI_ChamferDlg()
 // function : Init()
 // purpose  :
 //=================================================================================
-void OperationGUI_ChamferDlg::Init(Handle (AIS_InteractiveContext) ic)
+void OperationGUI_ChamferDlg::Init()
 {
-  /* init variables */
-  myConstructorId = 0;
-  myEditCurrentArgument = Group1->LineEdit1;
+  myConstructorId = -1;
+  reset();
 
-  myD1 = 5.0;
-  myD2 = 5.0;
-  myOkShape = false;
-  myIC = ic;
-  myLocalContextId = -1;
-  myUseLocalContext = false;
+  /* signals and slots connections */
 
-  double SpecificStep = 10.0;
-  /* min, max, step and decimals for spin boxes */
-  Group1->SpinBox_DX->RangeStepAndValidator(0.001, 999.999, SpecificStep, 3);
-  Group2->SpinBox_DX->RangeStepAndValidator(0.001, 999.999, SpecificStep, 3);
-  Group3->SpinBox_DX->RangeStepAndValidator(0.001, 999.999, SpecificStep, 3);
-  Group1->SpinBox_DY->RangeStepAndValidator(0.001, 999.999, SpecificStep, 3);
-  Group2->SpinBox_DY->RangeStepAndValidator(0.001, 999.999, SpecificStep, 3);
-  Group3->SpinBox_DY->RangeStepAndValidator(0.001, 999.999, SpecificStep, 3);
-
-  Group1->SpinBox_DX->SetValue(myD1);
-  Group2->SpinBox_DX->SetValue(myD1);
-  Group3->SpinBox_DX->SetValue(myD1);
-  Group1->SpinBox_DY->SetValue(myD2);
-  Group2->SpinBox_DY->SetValue(myD2);
-  Group3->SpinBox_DY->SetValue(myD2);
+  // main buttons
+  connect( buttonOk(),    SIGNAL( clicked() ), this, SLOT( ClickOnOk()    ) );
+  connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
 
-  /* signals and slots connections */
-  connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
-  connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
-  connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
-
-  connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()));
-  connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
-  connect(GroupConstructors, SIGNAL(clicked(int)), this, SLOT(ConstructorsClicked(int)));
-
-  connect(Group1->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
-  connect(Group2->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
-  connect(Group3->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
-
-  connect(Group1->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
-  connect(Group2->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
-  connect(Group3->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
-
-  connect(Group1->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
-  connect(Group2->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
-  connect(Group3->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
-  connect(Group1->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
-  connect(Group2->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
-  connect(Group3->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
-  
-  connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group1->SpinBox_DX, SLOT(SetStep(double)));
-  connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group2->SpinBox_DX, SLOT(SetStep(double)));
-  connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group3->SpinBox_DX, SLOT(SetStep(double)));
-  connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group1->SpinBox_DY, SLOT(SetStep(double)));
-  connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group2->SpinBox_DY, SLOT(SetStep(double)));
-  connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group3->SpinBox_DY, SLOT(SetStep(double)));
-
-  connect(mySelection, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
-
-  /* displays Dialog */
-  Group2->hide();
-  Group3->hide();
-  Group1->show();
-  this->show();
-
-  return;
+  // group box
+  connect( this,          SIGNAL( constructorsClicked( int ) ), this, SLOT( ConstructorsClicked( int ) ) );
+
+  // push buttons
+  QMap< int, QPushButton* >::iterator anIterBtn;
+  for ( anIterBtn = mySelBtn.begin(); anIterBtn != mySelBtn.end(); ++anIterBtn )
+    connect( anIterBtn.value(), SIGNAL( clicked() ),
+             this, SLOT( SetEditCurrentArgument() ) );
+
+  // line edits
+  QMap< int, QLineEdit* >::iterator anIterLE2;
+  for ( anIterLE2 = mySelName.begin(); anIterLE2 != mySelName.end(); ++anIterLE2 )
+    connect( anIterLE2.value(), SIGNAL( returnPressed() ),
+             this, SLOT( LineEditReturnPressed() ) );
+
+  // spin boxes
+  QMap< int, QDoubleSpinBox* >::iterator anIterSpin;
+  for ( anIterSpin = mySpinBox.begin(); anIterSpin != mySpinBox.end(); ++anIterSpin )
+    connect( anIterSpin.value(), SIGNAL( valueChanged( double ) ),
+             this, SLOT( ValueChangedInSpinBox( double ) ) );
+
+  // radio buttons
+  QMap< int, QRadioButton* >::iterator anIterRadio;
+  for ( anIterRadio = myRadioButton.begin(); anIterRadio != myRadioButton.end(); ++anIterRadio )
+    connect( anIterRadio.value(), SIGNAL( clicked() ),
+            this, SLOT( RadioButtonPressed() ) );
+
+  // selection
+  connect( myGeomGUI->getApp()->selectionMgr(), 
+          SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
+
+  initName( tr( "GEOM_CHAMFER" ) );
+
+  ConstructorsClicked( 0 );
 }
 
 
@@ -183,73 +221,107 @@ void OperationGUI_ChamferDlg::Init(Handle (AIS_InteractiveContext) ic)
 // function : ConstructorsClicked()
 // purpose  : Radio button management
 //=================================================================================
-void OperationGUI_ChamferDlg::ConstructorsClicked(int constructorId)
+void OperationGUI_ChamferDlg::ConstructorsClicked( int constructorId )
 {
+   // Activate next widget
+  if ( myGeomGUI->getApp()->desktop()->activeWindow()->getViewManager()->getType() 
+       != OCCViewer_Viewer::Type() ) {
+    mainFrame()->RadioButton1->setChecked( true );
+    return;
+  }
+
+  if ( myConstructorId == constructorId )
+    return;
+
+  // Get values from previous widget
+  double D1 = 5, D2 = 5, D = 5, Angle = 5;
+  if ( myConstructorId == 0 )
+    D1 = D2 = mySpinBox[ SpinBox1 ]->value();
+  else if ( myConstructorId == 1 ) {
+    D1 = mySpinBox[ SpinBox21 ]->value();
+    D2 = mySpinBox[ SpinBox22 ]->value();
+    D =  mySpinBox[ SpinBox23 ]->value();
+    Angle = mySpinBox[ SpinBox24 ]->value();
+  }
+  else if ( myConstructorId == 2 ) {
+    D1 = mySpinBox[ SpinBox31 ]->value();
+    D2 = mySpinBox[ SpinBox32 ]->value();
+    D =  mySpinBox[ SpinBox33 ]->value();
+    Angle = mySpinBox[ SpinBox34 ]->value();
+  }
+  else if ( myConstructorId == 3 ) {
+    D1 = mySpinBox[ SpinBox41 ]->value();
+    D2 = mySpinBox[ SpinBox42 ]->value();
+    D =  mySpinBox[ SpinBox43 ]->value();
+    Angle = mySpinBox[ SpinBox44 ]->value();
+  }
+
   myConstructorId = constructorId;
-  myGeomBase->EraseSimulationShape();
-  mySimulationTopoDs.Nullify();
-  disconnect(mySelection, 0, this, 0);
-  myOkShape = false;
-  myD1 = 5.0;
-  myD2 = 5.0;
-
-  if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_OCC && myUseLocalContext) {
-    myIC->CloseLocalContext(myLocalContextId);
-    DisplayGUI* myDisplayGUI = new DisplayGUI();
-    myDisplayGUI->OnDisplayAll(true);
-    myUseLocalContext = false;
+
+  switch ( constructorId ) {
+  case 0:
+    myGrp2->hide();
+    myGrp3->hide();
+    myGrp4->hide();
+    myGrp1->show();
+    mySpinBox[ SpinBox1 ]->setValue( D1 );
+    break;
+  case 1:
+    myGrp1->hide();
+    myGrp3->hide();
+    myGrp4->hide();
+    myGrp2->show();
+    mySpinBox[ SpinBox21 ]->setValue( D1 );
+    mySpinBox[ SpinBox22 ]->setValue( D2 );
+    mySpinBox[ SpinBox23 ]->setValue( D );
+    mySpinBox[ SpinBox24 ]->setValue( Angle );
+    break;
+  case 2:
+    myGrp1->hide();
+    myGrp2->hide();
+    myGrp4->hide();
+    myGrp3->show();
+    mySpinBox[ SpinBox31 ]->setValue( D1 );
+    mySpinBox[ SpinBox32 ]->setValue( D2 );        
+    mySpinBox[ SpinBox32 ]->setValue( D2 );
+    mySpinBox[ SpinBox33 ]->setValue( D );
+    mySpinBox[ SpinBox34 ]->setValue( Angle );
+    break;
+  case 3:
+    myGrp1->hide();
+    myGrp2->hide();
+    myGrp3->hide();
+    myGrp4->show();
+    mySpinBox[ SpinBox41 ]->setValue( D1 );
+    mySpinBox[ SpinBox42 ]->setValue( D2 );        
+    mySpinBox[ SpinBox43 ]->setValue( D );
+    mySpinBox[ SpinBox44 ]->setValue( Angle );
+    break;
+  default:
+    break;
   }
+  
+  if      ( constructorId == 0 ) myEditCurrentArgument = mySelName[ MainObj1 ];
+  else if ( constructorId == 1 ) myEditCurrentArgument = mySelName[ MainObj2 ];
+  else if ( constructorId == 2 ) myEditCurrentArgument = mySelName[ MainObj3 ];
+  else                           myEditCurrentArgument = mySelName[ MainObj4 ];
 
-  connect(mySelection, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
-  switch (constructorId)
-    {
-    case 0: /* Chamfer All */
-      {
-       Group2->hide();
-       Group3->hide();
-       resize(0, 0);
-       Group1->show();
-
-       myEditCurrentArgument = Group1->LineEdit1;
-       Group1->LineEdit1->setText("");
-       myShapeType = -1;
-
-       Group1->SpinBox_DX->SetValue(myD1);
-       Group1->SpinBox_DY->SetValue(myD2);
-       break;
-      }
-    case 1: /* Chamfer edges */
-      {
-       Group1->hide();
-       Group3->hide();
-       resize(0, 0);
-       Group2->show();
-
-       myEditCurrentArgument = Group2->LineEdit1;
-       Group2->LineEdit1->setText("");
-       myShapeType = 6;
-
-       Group2->SpinBox_DX->SetValue(myD1);
-       Group2->SpinBox_DY->SetValue(myD2);
-       break;
-      }
-    case 2: /* Chamfer Faces */
-      {
-       Group1->hide();
-       Group2->hide();
-       resize(0, 0);
-       Group3->show();
-
-       myEditCurrentArgument = Group3->LineEdit1;
-       Group3->LineEdit1->setText("");
-       myShapeType = 4;
-
-       Group3->SpinBox_DX->SetValue(myD1);
-       Group3->SpinBox_DY->SetValue(myD2);
-       break;
-      }
-    }
- return;
+  activateSelection(); 
+  enableWidgets();
+  
+  if ( !myShape->_is_nil() )
+  {
+    myEditCurrentArgument->setText( GEOMBase::GetName( myShape ) );
+    GEOMBase_Skeleton::LineEditReturnPressed();
+  }
+  else
+    myEditCurrentArgument->setText( "" );
+
+  qApp->processEvents();
+  updateGeometry();
+  resize( minimumSize() );
+
+  displayPreview();
 }
 
 
@@ -259,68 +331,21 @@ void OperationGUI_ChamferDlg::ConstructorsClicked(int constructorId)
 //=================================================================================
 void OperationGUI_ChamferDlg::ClickOnOk()
 {
-  this->ClickOnApply();
-  this->ClickOnCancel();
-  return;
+  if ( ClickOnApply() )
+    ClickOnCancel();
 }
 
-
 //=================================================================================
 // function : ClickOnApply()
 // purpose  :
 //=================================================================================
-void OperationGUI_ChamferDlg::ClickOnApply()
+bool OperationGUI_ChamferDlg::ClickOnApply()
 {
-  QApplication::setOverrideCursor(Qt::waitCursor);
-  QAD_Application::getDesktop()->putInfo(tr(""));
-  myGeomBase->EraseSimulationShape();
-  mySimulationTopoDs.Nullify();
-
-  bool testResult = false;
-  switch(myConstructorId)
-    { 
-    case 0 : /* Chamfer All */
-      {        
-       if(myOkShape)
-         testResult = myOperationGUI->OnChamferGetAll(myShape, myD1, myD2, myShapeType, myShapeIOR);
-       break;
-      }
-    case 1 : /* Chamfer Edge */
-      {        
-       if(myOkShape)
-         testResult = myOperationGUI->OnChamferGetSelected(myShape, myShapeIOR, myD1, myD2, myShapeType, 
-                                                           myLocalContextId, myUseLocalContext);
-       break;
-      }
-    case 2 :  /* Chamfer Face */
-      {
-       if(myOkShape)
-         testResult = myOperationGUI->OnChamferGetSelected(myShape, myShapeIOR, myD1, myD2, myShapeType, 
-                                                           myLocalContextId, myUseLocalContext);
-       break;
-      }
-    }
+  if ( !onAccept() )
+    return false;
 
-  if(!testResult) 
-    QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_ABORT"));
-  else
-    QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_DONE"));
-  /* Reset all arguments and local context to allow user a new selection ...*/
-  this->ResetStateOfDialog();
-  QApplication::restoreOverrideCursor();
-  return;
-}
-
-
-//=================================================================================
-// function : ClickOnCancel()
-// purpose  :
-//=================================================================================
-void OperationGUI_ChamferDlg::ClickOnCancel()
-{
-  this->ResetStateOfDialog();
-  GEOMBase_Skeleton::ClickOnCancel();
-  return;
+  initName();
+  return true;
 }
 
 
@@ -330,60 +355,98 @@ void OperationGUI_ChamferDlg::ClickOnCancel()
 //=================================================================================
 void OperationGUI_ChamferDlg::SelectionIntoArgument()
 {
-  myGeomBase->EraseSimulationShape();
-  mySimulationTopoDs.Nullify();
-  myEditCurrentArgument->setText("");
-  this->ResetStateOfDialog();
-  QString aString = ""; /* name of selection */
-
-  int nbSel = myGeomBase->GetNameOfSelectedIObjects(mySelection, aString);
-  if (nbSel == 1) {
-    TopoDS_Shape S;
-    Handle(SALOME_InteractiveObject) IO = mySelection->firstIObject();
-    if(!myGeomBase->GetTopoFromSelection(mySelection, S))
-      return;
-    if(!IO->hasEntry()) {
-      QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_SHAPE_IN_STUDY"));
-      return;
+  erasePreview();
+  myEditCurrentArgument->setText( "" );
+
+  // Get index of current selection focus
+  int aCurrFocus = -1;
+  QMap< int, QLineEdit* >::iterator anIter;
+  for ( anIter = mySelName.begin(); anIter != mySelName.end(); ++anIter ) {
+    if ( myEditCurrentArgument == anIter.value() ) {
+      aCurrFocus = anIter.key();
+      break;
     }
+  }
 
-    if(!S.IsNull() &&  S.ShapeType() <= 2) {
-      if(IO->IsInstance(STANDARD_TYPE(GEOM_InteractiveObject))) {
-       Handle(GEOM_InteractiveObject) GIObject = Handle(GEOM_InteractiveObject)::DownCast(IO);
-       myShapeIOR = GIObject->getIOR(); /* the Geom IOR string of selection */
-       myEditCurrentArgument->setText(aString);
-       myShape = S;
-       myOkShape = true;
+  // If selection of main object is activated
+  if ( aCurrFocus == MainObj1 || aCurrFocus == MainObj2 || aCurrFocus == MainObj3 || aCurrFocus == MainObj4) {
+    if ( IObjectCount() == 1 ) {
+      Standard_Boolean aResult = Standard_False;
+      GEOM::GEOM_Object_var anObj =
+        GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult );
+
+      if ( aResult && !anObj->_is_nil() ) {
+        myShape = anObj;
+        mySelName[ aCurrFocus ]->setText( GEOMBase::GetName( anObj ) );
+        displayPreview();
+        enableWidgets();
+        return;
+      }
+    }
+
+    myShape = GEOM::GEOM_Object::_nil();
+    enableWidgets();
+  }
+  // If face selection of second tab is activated
+  else if ( aCurrFocus == Face1 || aCurrFocus == Face2 ) {
+    if ( IObjectCount() == 1 ) {
+      Standard_Boolean aResult = Standard_False;
+      GEOM::GEOM_Object_var anObj =
+        GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult );
+
+      if ( aResult && !anObj->_is_nil() ) {
+         TColStd_IndexedMapOfInteger anIndexes;
+        ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr()->GetIndexes( firstIObject(), anIndexes );
+
+         if ( anIndexes.Extent() == 1 ) {
+            int anIndex = anIndexes( 1 );
+            QString aFaceName = QString( GEOMBase::GetName( anObj ) ) + ":%1";
+            myEditCurrentArgument->setText( aFaceName.arg( anIndex ) );
+            myFace[ aCurrFocus ] = anIndex;
+            displayPreview();
+            return;
+         }
       }
+    }
+
+    myFace[ aCurrFocus ] = -1;
+  }
+  // If face selection of third or fourth tab is activated
+  else if ( aCurrFocus == Faces  || aCurrFocus == Edges ) {
+    if ( IObjectCount() == 1 ) {
+      Standard_Boolean aResult = Standard_False;
+      GEOM::GEOM_Object_var anObj =
+        GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult );
+      
+      if ( aResult && !anObj->_is_nil() ) {
+       TColStd_IndexedMapOfInteger anIndexes;
+       ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr()->GetIndexes( firstIObject(), anIndexes );
        
-      if(IO->hasEntry()) {
-       SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
-       SALOMEDS::SObject_var obj = aStudy->FindObjectID(IO->getEntry());
-        SALOMEDS::GenericAttribute_var anAttr;
-        SALOMEDS::AttributeIOR_var anIOR;
-       if(!obj->_is_nil()) {
-         if(obj->FindAttribute(anAttr, "AttributeIOR")) {
-            anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
-           myShapeIOR = anIOR->Value();
-           myOkShape = true;
-           myShape = S;
-           myEditCurrentArgument->setText(aString);
+       if ( anIndexes.Extent() > 0 ) {
+         QString aName;
+         if ( anIndexes.Extent() == 1 ) {
+           int anIndex = anIndexes( 1 );
+           
+           aName = QString( GEOMBase::GetName( anObj ) ) + QString( ":%1" ).arg( anIndex );
          }
+         else {
+           aName = tr( "GEOM_MEN_POPUP_NAME" ).arg( anIndexes.Extent() );
+         }
+         
+         myEditCurrentArgument->setText( aName );
+         int aConstructorId = getConstructorId();
+         if ( aConstructorId == 2)
+           myFaces = anIndexes;
+         else if ( aConstructorId == 3 )
+           myEdges = anIndexes;
+            
+         displayPreview();
+         return;
        }
       }
     }
-    if(myConstructorId == 0)
-      this->MakePreview();
-
-  }
-  else 
-    return;
-  
-  if(myOkShape && myShapeType!=-1 && myConstructorId != 0) {
-    /* local context is defined into the method */
-    DisplayGUI* myDisplayGUI = new DisplayGUI();
-    myDisplayGUI->PrepareSubShapeSelection(myShapeType, myLocalContextId);  
-    myUseLocalContext = true;
+    myFaces.Clear();
+    myEdges.Clear();
   }
 }
 
@@ -394,55 +457,82 @@ void OperationGUI_ChamferDlg::SelectionIntoArgument()
 //=================================================================================
 void OperationGUI_ChamferDlg::LineEditReturnPressed()
 {
-  QLineEdit* send = (QLineEdit*)sender();
-  if(send == Group1->LineEdit1)
-    myEditCurrentArgument = Group1->LineEdit1;
-  else if (send == Group2->LineEdit1)
-    myEditCurrentArgument = Group2->LineEdit1;
-  else if (send == Group3->LineEdit1)
-    myEditCurrentArgument = Group3->LineEdit1;
-  else
-    return;
+  QLineEdit* aSender = ( QLineEdit* )sender();
+
+  QMap< int, QLineEdit* >::iterator anIterLE;
+  for ( anIterLE = mySelName.begin(); anIterLE != mySelName.end(); ++anIterLE )
+    if ( anIterLE.value() == aSender )
+      myEditCurrentArgument = anIterLE.value();
 
   GEOMBase_Skeleton::LineEditReturnPressed();
-  return;
 }
 
 
 //=================================================================================
-// function : SetEditCurrentArgument()
+// function : RadioButtonPressed()
 // purpose  :
 //=================================================================================
-void OperationGUI_ChamferDlg::SetEditCurrentArgument()
+void OperationGUI_ChamferDlg::RadioButtonPressed()
 {
-  QPushButton* send = (QPushButton*)sender();  
-
-  if(send == Group1->PushButton1) {
-    Group1->LineEdit1->setFocus();
-    myEditCurrentArgument = Group1->LineEdit1;
-  }
-  else if(send == Group2->PushButton1) {
-    Group2->LineEdit1->setFocus();
-    myEditCurrentArgument = Group2->LineEdit1;
-  }
-  else if(send == Group3->PushButton1) {
-    Group3->LineEdit1->setFocus();
-    myEditCurrentArgument = Group3->LineEdit1;
-  }
-  this->SelectionIntoArgument();
-  return;
+  const QObject* s = sender();
+  bool flag = s == myRadioButton[ RadioButton21 ] || 
+              s == myRadioButton[ RadioButton31 ] ||
+              s == myRadioButton[ RadioButton41 ];
+
+  myRadioButton[ RadioButton21 ]->blockSignals( true );
+  myRadioButton[ RadioButton22 ]->blockSignals( true );
+  myRadioButton[ RadioButton31 ]->blockSignals( true );
+  myRadioButton[ RadioButton32 ]->blockSignals( true );
+  myRadioButton[ RadioButton41 ]->blockSignals( true );
+  myRadioButton[ RadioButton42 ]->blockSignals( true );
+
+  myRadioButton[ RadioButton21 ]->setChecked( flag );
+  myRadioButton[ RadioButton31 ]->setChecked( flag );
+  myRadioButton[ RadioButton41 ]->setChecked( flag );
+  myRadioButton[ RadioButton22 ]->setChecked( !flag );
+  myRadioButton[ RadioButton32 ]->setChecked( !flag );
+  myRadioButton[ RadioButton42 ]->setChecked( !flag );
+  mySpinBox[ SpinBox21 ]->setEnabled( flag );
+  mySpinBox[ SpinBox22 ]->setEnabled( flag ); 
+  mySpinBox[ SpinBox31 ]->setEnabled( flag ); 
+  mySpinBox[ SpinBox32 ]->setEnabled( flag ); 
+  mySpinBox[ SpinBox41 ]->setEnabled( flag ); 
+  mySpinBox[ SpinBox42 ]->setEnabled( flag );
+  mySpinBox[ SpinBox23 ]->setEnabled( !flag );
+  mySpinBox[ SpinBox24 ]->setEnabled( !flag ); 
+  mySpinBox[ SpinBox33 ]->setEnabled( !flag ); 
+  mySpinBox[ SpinBox34 ]->setEnabled( !flag ); 
+  mySpinBox[ SpinBox43 ]->setEnabled( !flag ); 
+  mySpinBox[ SpinBox44 ]->setEnabled( !flag );
+
+  myRadioButton[ RadioButton21 ]->blockSignals( false );
+  myRadioButton[ RadioButton22 ]->blockSignals( false );
+  myRadioButton[ RadioButton31 ]->blockSignals( false );
+  myRadioButton[ RadioButton32 ]->blockSignals( false );
+  myRadioButton[ RadioButton41 ]->blockSignals( false );
+  myRadioButton[ RadioButton42 ]->blockSignals( false );
+
+  displayPreview();
 }
 
 
 //=================================================================================
-// function : DeactivateActiveDialog()
+// function : SetEditCurrentArgument()
 // purpose  :
 //=================================================================================
-void OperationGUI_ChamferDlg::DeactivateActiveDialog()
+void OperationGUI_ChamferDlg::SetEditCurrentArgument()
 {
-  this->ResetStateOfDialog();
-  GEOMBase_Skeleton::DeactivateActiveDialog();
-  return;
+  QPushButton* aSender = ( QPushButton* )sender();
+
+  QMap< int, QPushButton* >::iterator anIter;
+  for ( anIter = mySelBtn.begin(); anIter != mySelBtn.end(); ++anIter ) {
+    if ( anIter.value() == aSender ) {
+      mySelName[ anIter.key() ]->setFocus();
+      myEditCurrentArgument = mySelName[ anIter.key() ];
+    }
+  }
+
+  activateSelection();
 }
 
 
@@ -453,10 +543,12 @@ void OperationGUI_ChamferDlg::DeactivateActiveDialog()
 void OperationGUI_ChamferDlg::ActivateThisDialog()
 {
   GEOMBase_Skeleton::ActivateThisDialog();
-  connect(mySelection, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
-  if(!mySimulationTopoDs.IsNull())
-    myGeomBase->DisplaySimulationShape(mySimulationTopoDs);
-  return;
+
+  connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), 
+          SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
+
+  activateSelection();
+  displayPreview();
 }
 
 
@@ -464,123 +556,276 @@ void OperationGUI_ChamferDlg::ActivateThisDialog()
 // function : enterEvent()
 // purpose  :
 //=================================================================================
-void OperationGUI_ChamferDlg::enterEvent(QEvent* e)
+void OperationGUI_ChamferDlg::enterEvent( QEvent* )
 {
-  if(GroupConstructors->isEnabled())
-    return;
-  this->ActivateThisDialog();
-  return;
+  if ( !mainFrame()->GroupConstructors->isEnabled() )
+    this->ActivateThisDialog();
 }
 
 
 //=================================================================================
-// function : closeEvent()
+// function : ValueChangedInSpinBox()
 // purpose  :
 //=================================================================================
-void OperationGUI_ChamferDlg::closeEvent(QCloseEvent* e)
-{ 
-  /* same than click on cancel button */
-  this->ClickOnCancel();
-  return;
+void OperationGUI_ChamferDlg::ValueChangedInSpinBox( double )
+{
+  displayPreview();
 }
 
 
 //=================================================================================
-// function : ValueChangedInSpinBox()
+// function : createSelWg()
 // purpose  :
 //=================================================================================
-void OperationGUI_ChamferDlg::ValueChangedInSpinBox( double newValue )
+void OperationGUI_ChamferDlg::createSelWg( const QString& theLbl,
+                                           QPixmap&       thePix,
+                                           QWidget*       theParent,
+                                          QGridLayout*   theLayout,
+                                           const int      theId )
 {
-  myGeomBase->EraseSimulationShape(); 
-  mySimulationTopoDs.Nullify();
-
-  QObject* send = (QObject*)sender();
-  if(send == Group1->SpinBox_DX || send == Group2->SpinBox_DX || send == Group3->SpinBox_DX) { /* D1 */
-    myD1 = newValue;
-    if(myConstructorId == 0)
-      this->MakePreview();
-    return ;
-  } 
-  else if(send == Group1->SpinBox_DY || send == Group2->SpinBox_DY || send == Group3->SpinBox_DY) { /* D2 */
-    myD2 = newValue;
-    if(myConstructorId == 0)
-      this->MakePreview();
-    return;
-  }
-  return;
+  QLabel* lab = new QLabel( theLbl, theParent );
+  mySelBtn[ theId ] = new QPushButton( theParent );
+  mySelBtn[ theId ]->setIcon( thePix );
+  mySelName[ theId ] = new QLineEdit( theParent );
+  mySelName[ theId ]->setReadOnly( true );
+  int row = theLayout->rowCount();
+  theLayout->addWidget( lab,                row, 0 );
+  theLayout->addWidget( mySelBtn[ theId ],  row, 1 );
+  theLayout->addWidget( mySelName[ theId ], row, 2, 1, 4 ); // take into account createRadioWg()
 }
 
-
 //=================================================================================
-// function : ResetStateOfDialog()
+// function : createRadioWg()
 // purpose  :
 //=================================================================================
-void OperationGUI_ChamferDlg::ResetStateOfDialog()
+void OperationGUI_ChamferDlg::createRadioWg( const QString& theLbl1, 
+                                            const QString& theLbl2, 
+                                            QWidget*       theParent, 
+                                            QGridLayout*   theLayout, 
+                                            const int      theRbId,
+                                            const int      theSpin1Id,
+                                            const int      theSpin2Id )
 {
-  myOkShape = false;
-  myEditCurrentArgument->setText("");
-  QApplication::restoreOverrideCursor();
-
-  /* Close its local contact if opened */
-  if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_OCC && myUseLocalContext) {
-    myIC->CloseLocalContext(myLocalContextId);
-    myUseLocalContext = false;
-    DisplayGUI* myDisplayGUI = new DisplayGUI();
-    myDisplayGUI->OnDisplayAll(true);
-  }
-  return;
+  myRadioButton[ theRbId ] = new QRadioButton( theParent );
+  QLabel* lab1 = new QLabel( theLbl1, theParent ); 
+  QLabel* lab2 = new QLabel( theLbl2, theParent ); 
+  mySpinBox[ theSpin1Id ]  = new QDoubleSpinBox( theParent );
+  mySpinBox[ theSpin2Id ]  = new QDoubleSpinBox( theParent );
+  int row = theLayout->rowCount();
+  theLayout->addWidget( myRadioButton[ theRbId ], row, 0 );
+  theLayout->addWidget( lab1,                     row, 2 );
+  theLayout->addWidget( mySpinBox[ theSpin1Id ],  row, 3 );
+  theLayout->addWidget( lab2,                     row, 4 );
+  theLayout->addWidget( mySpinBox[ theSpin2Id ],  row, 5 );
 }
 
-
 //=================================================================================
-// function : MakePreview()
+// function : reset()
 // purpose  :
 //=================================================================================
-void OperationGUI_ChamferDlg::MakePreview()
+void OperationGUI_ChamferDlg::reset()
 {
-  QApplication::setOverrideCursor(Qt::waitCursor);
+  // Set Initial values of spinboxes
+  QMap< int, QDoubleSpinBox* >::iterator anIter;
+  for ( anIter = mySpinBox.begin(); anIter != mySpinBox.end(); ++anIter )
+    anIter.value()->setValue( 5 );
 
-  if(!myOkShape) {
-    QApplication::restoreOverrideCursor();
-    return;
-  }
+  // clear line edits
+  QMap< int, QLineEdit* >::iterator anIterLE;
+  for ( anIterLE = mySelName.begin(); anIterLE != mySelName.end(); ++anIterLE )
+    anIterLE.value()->setText( "" );
 
-  GEOM::GEOM_Shape::ListOfSubShapeID_var ListOfID = new GEOM::GEOM_Shape::ListOfSubShapeID;
-  ListOfID->length(0);
+  // constructor id
+  int aConstructorId = getConstructorId();
 
-  SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
-  SALOMEDS::SObject_var theObj = aStudy->FindObjectIOR(myShapeIOR);
-  if(theObj->_is_nil()) {
-    QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_SHAPE_IN_STUDY"));
-    QApplication::restoreOverrideCursor();
-    return;
+  if      ( aConstructorId == 0 ) myEditCurrentArgument = mySelName[ MainObj1 ];
+  else if ( aConstructorId == 1 ) myEditCurrentArgument = mySelName[ MainObj2 ];
+  else if ( aConstructorId == 2 ) myEditCurrentArgument = mySelName[ MainObj3 ];
+  else                            myEditCurrentArgument = mySelName[ MainObj4 ];
+
+  myShape = GEOM::GEOM_Object::_nil();
+
+  myFaces.Clear();
+  myEdges.Clear();
+  myFace[ Face1 ] = -1;
+  myFace[ Face2 ] = -1;
+
+  erasePreview( true );
+
+  activateSelection();
+
+  enableWidgets();
+}
+
+//=================================================================================
+// function : activateSelection
+// purpose  : Activate selection in accordance with myEditCurrentArgument
+//=================================================================================
+void OperationGUI_ChamferDlg::activateSelection()
+{
+  if (  !myShape->_is_nil() &&
+       ( myEditCurrentArgument == mySelName[ Face1 ] ||
+         myEditCurrentArgument == mySelName[ Face2 ] ||
+         myEditCurrentArgument == mySelName[ Faces ] ) ) {
+    localSelection( myShape, TopAbs_FACE );
+  }
+  else if ( !myShape->_is_nil() && myEditCurrentArgument == mySelName[ Edges ] ) {
+    localSelection( myShape, TopAbs_EDGE );
+  }
+  else {
+    TColStd_MapOfInteger aMap;
+    aMap.Add( GEOM_SHELL );
+    aMap.Add( GEOM_SOLID );
+    aMap.Add( GEOM_COMPOUND );
+    globalSelection( aMap );
   }
 
-  try {
-    if(myD1 <= Precision::Confusion() || myD2 <= Precision::Confusion()) {
-      QApplication::restoreOverrideCursor();
-      return;
-    }
+  SelectionIntoArgument();
+}
+
+//=================================================================================
+// function : enableWidgets
+// purpose  : Enable widgets of faces in accordance with value of main object
+//=================================================================================
+void OperationGUI_ChamferDlg::enableWidgets()
+{
+  int anId = getConstructorId();
 
-    GEOM::GEOM_Shape_var aShape = myGeom->GetIORFromString(myShapeIOR);
-    GEOM::GEOM_Shape_var result = myGeom->MakeChamfer(aShape, myD1, myD2, myShapeType, ListOfID);
-    if(result->_is_nil()) {
-      QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_ABORT"));
-      QApplication::restoreOverrideCursor();
-      return;
+  bool toEnable = !myShape->_is_nil();
+  
+  if ( anId == 1 )
+  {
+    mySelName[ Face1 ]->setEnabled( toEnable );
+    mySelName[ Face2 ]->setEnabled( toEnable );
+    mySelBtn[ Face1 ]->setEnabled( toEnable );
+    mySelBtn[ Face2 ]->setEnabled( toEnable );
+
+    if ( !toEnable )
+    {
+      mySelName[ Face1 ]->setText( "" );
+      mySelName[ Face2 ]->setText( "" );
+      myFace[ Face1 ] = -1;
+      myFace[ Face2 ] = -1;
+    }
+  }
+  else if ( anId == 2 )
+  {
+    mySelName[ Faces ]->setEnabled( toEnable );
+    if ( !toEnable ) {
+      mySelName[ Faces ]->setText( "" );
+      myFaces = -1;
+    }
+  }
+  else if ( anId == 3 ) {
+    mySelName[ Edges ]->setEnabled( toEnable );
+    
+    if ( !toEnable ) {
+      mySelName[ Edges ]->setText( "" );
+      myEdges = -1;
     }
+  }
+}
 
-    TopoDS_Shape S = myGeomGUI->GetShapeReader().GetShape(myGeom, result);
+//=================================================================================
+// function : createOperation
+// purpose  :
+//=================================================================================
+GEOM::GEOM_IOperations_ptr OperationGUI_ChamferDlg::createOperation()
+{
+  return getGeomEngine()->GetILocalOperations( getStudyId() );
+}
 
-    mySimulationTopoDs = S;
-    myGeomBase->DisplaySimulationShape(mySimulationTopoDs);
+//=================================================================================
+// function : ClickOnApply()
+// purpose  : Verify validity of input data
+//=================================================================================
+bool OperationGUI_ChamferDlg::isValid( QString& )
+{
+  switch ( getConstructorId() )
+  {
+    case 0: return !myShape->_is_nil();
+    case 1: return !myShape->_is_nil() && myFace[ Face1 ] > 0 && myFace[ Face2 ] > 0;
+    case 2: return !myShape->_is_nil() && myFaces.Extent() > 0;
+    case 3: return !myShape->_is_nil() && myEdges.Extent() > 0;
+    default: return false;
   }
-  catch(Standard_Failure) {
-    MESSAGE("Exception catched in MakePreview");
-    QApplication::restoreOverrideCursor();
-    return;
+}
+
+//=================================================================================
+// function : execute
+// purpose  :
+//=================================================================================
+bool OperationGUI_ChamferDlg::execute( ObjectList& objects )
+{
+  GEOM::GEOM_Object_var anObj;
+  bool flag = ( myRadioButton[ RadioButton21 ]->isChecked() &&
+                myRadioButton[ RadioButton31 ]->isChecked() &&
+                myRadioButton[ RadioButton41 ]->isChecked() );
+
+  int anId = getConstructorId();
+  if ( anId == 0 ) {
+    anObj = GEOM::GEOM_ILocalOperations::_narrow(
+      getOperation() )->MakeChamferAll( myShape,
+                                        mySpinBox[ SpinBox1 ]->value() );
+  }
+  else if ( anId == 1 ) {
+    if ( flag ) {
+      anObj = GEOM::GEOM_ILocalOperations::_narrow( getOperation() )->
+       MakeChamferEdge( myShape,
+                        mySpinBox[ SpinBox21 ]->value(),
+                        mySpinBox[ SpinBox22 ]->value(),
+                        myFace[ Face1 ],
+                        myFace[ Face2 ] );
+    }
+    else {
+      anObj = GEOM::GEOM_ILocalOperations::_narrow( getOperation() )->
+       MakeChamferEdgeAD( myShape,
+                          mySpinBox[ SpinBox23 ]->value(),
+                          mySpinBox[ SpinBox24 ]->value() * PI180,
+                          myFace[ Face1 ],
+                          myFace[ Face2 ]);
+    }
   }
-  QApplication::restoreOverrideCursor();
-  return;
+  else if ( anId == 2 )
+  {
+    GEOM::ListOfLong_var anArray = new GEOM::ListOfLong;
+    anArray->length( myFaces.Extent() );
+
+    for ( int i = 1, n = myFaces.Extent(); i <= n; i++ )
+      anArray[ i - 1 ] = myFaces( i );             
+    
+    if ( flag )
+    anObj = GEOM::GEOM_ILocalOperations::_narrow(
+      getOperation() )->MakeChamferFaces( myShape,
+                                          mySpinBox[ SpinBox31 ]->value(),
+                                          mySpinBox[ SpinBox32 ]->value(),
+                                          anArray );
+    else
+    anObj = GEOM::GEOM_ILocalOperations::_narrow(
+      getOperation() )->MakeChamferFacesAD( myShape,
+                                            mySpinBox[ SpinBox33 ]->value(),
+                                            mySpinBox[ SpinBox34 ]->value() * PI180,
+                                            anArray );
+  }
+  else if ( anId == 3 ) {
+    GEOM::ListOfLong_var anArray = new GEOM::ListOfLong;
+    anArray->length( myEdges.Extent() );
+    for ( int i = 1, n = myEdges.Extent(); i <= n; i++ )
+      anArray[ i - 1 ] = myEdges( i );             
+    if ( flag ) {
+      anObj = GEOM::GEOM_ILocalOperations::_narrow( getOperation() )->
+       MakeChamferEdges( myShape, mySpinBox[ SpinBox41 ]->value(),
+                         mySpinBox[ SpinBox42 ]->value(), anArray );
+    }
+    else {
+      anObj = GEOM::GEOM_ILocalOperations::_narrow( getOperation() )->
+       MakeChamferEdgesAD( myShape, mySpinBox[ SpinBox43 ]->value(),
+                           mySpinBox[ SpinBox44 ]->value() * PI180, anArray );
+    }
+  }
+
+  if ( !anObj->_is_nil() )
+    objects.push_back( anObj._retn() );
 
+  return true;
 }