Salome HOME
0019050: EDF 521 (For GEOM/BasicGUI): Improve selection process in the dialogs
[modules/geom.git] / src / OperationGUI / OperationGUI_ChamferDlg.cxx
index fc2b12e96538cd6c60b3faea8ae7654c55bb7857..002280d408d9997cc165a0e3ca6d5f26bfa538c2 100644 (file)
@@ -1,47 +1,46 @@
-//  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.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$
 
 #include "OperationGUI_ChamferDlg.h"
-#include "DlgRef_SpinBox.h"
 
-#include "SUIT_Desktop.h"
-#include "SUIT_Session.h"
-#include "SalomeApp_Application.h"
-#include "LightApp_SelectionMgr.h"
-#include "OCCViewer_ViewModel.h"
+#include <DlgRef.h>
+#include <GeometryGUI.h>
+#include <GEOMBase.h>
 
-#include <TColStd_MapOfInteger.hxx>
+#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 <qlabel.h>
-#include "qpixmap.h"
-#include <list>
+#include <TColStd_MapOfInteger.hxx>
 
-#include "GEOMImpl_Types.hxx"
+#include <GEOMImpl_Types.hxx>
 
 //=================================================================================
 // class    : OperationGUI_ChamferDlg()
 //            The dialog will by default be modeless, unless you set 'modal' to
 //            TRUE to construct a modal dialog.
 //=================================================================================
-OperationGUI_ChamferDlg::OperationGUI_ChamferDlg(GeometryGUI* theGeometryGUI, QWidget* parent)
-  : GEOMBase_Skeleton(theGeometryGUI, parent, "ChamferDlg", false,
-                      WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu)
+OperationGUI_ChamferDlg::OperationGUI_ChamferDlg( GeometryGUI* theGeometryGUI, QWidget* parent )
+  : GEOMBase_Skeleton( theGeometryGUI, parent, false )
 {
-  myConstructorId = -1;
-
-  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")));
-  QPixmap image3(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_CHAMFER_FACE")));
-  QPixmap iconSelect(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT")));
+  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" ) ) );
 
-  setCaption( tr( "GEOM_CHAMFER_TITLE" ) );
+  setWindowTitle( tr( "GEOM_CHAMFER_TITLE" ) );
 
-  GroupConstructors->setTitle( tr( "GEOM_CHAMFER" ) );
+  mainFrame()->GroupConstructors->setTitle( tr( "GEOM_CHAMFER" ) );
 
-  RadioButton1->setPixmap( image1 );
-  RadioButton2->setPixmap( image2 );
-  RadioButton3->setPixmap( image3 );
+  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( 1, Qt::Horizontal, tr( "GEOM_CHAMFER_ALL" ), this );
+  myGrp1 = new QGroupBox( tr( "GEOM_CHAMFER_ALL" ), centralWidget() );
 
-  QGroupBox* aSelGrp1 = new QGroupBox( 3, Qt::Horizontal, myGrp1 );
-  aSelGrp1->setFrameStyle( QFrame::NoFrame );
-  aSelGrp1->setInsideMargin( 0 );
+  QGridLayout* aLayout = new QGridLayout( myGrp1 );
+  aLayout->setMargin( 9 ); aLayout->setSpacing( 6 );
 
-  createSelWg( tr( "GEOM_MAIN_OBJECT" ), iconSelect, aSelGrp1, MainObj1 );
+  createSelWg( tr( "GEOM_MAIN_OBJECT" ), iconSelect, myGrp1, aLayout, MainObj1 );
 
-  QGroupBox* aSpinGrp = new QGroupBox( 1, Qt::Vertical, myGrp1 );
-  aSpinGrp->setFrameStyle( QFrame::NoFrame );
-  aSpinGrp->setInsideMargin( 0 );
+  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 );
 
-  new QLabel( tr( "D" ), aSpinGrp );
-  mySpinBox[ SpinBox1 ] = new DlgRef_SpinBox( aSpinGrp );
+  // Create second group
 
-  ( new QFrame( myGrp1 ) )->setSizePolicy(
-    QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
+  myGrp2 = new QGroupBox( tr( "GEOM_CHAMFER_EDGES" ), centralWidget() );
 
-  // Create second group
+  aLayout = new QGridLayout( myGrp2 );
+  aLayout->setMargin( 9 ); aLayout->setSpacing( 6 );
 
-  myGrp2 = new QGroupBox( 1, Qt::Horizontal, tr( "GEOM_CHAMFER_EDGES" ), this );
+  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 );
 
-  QGroupBox* aSelGrp2 = new QGroupBox( 3, Qt::Horizontal, myGrp2 );
-  aSelGrp2->setFrameStyle( QFrame::NoFrame );
-  aSelGrp2->setInsideMargin( 0 );
+  createRadioWg( tr( "GEOM_D1" ), tr( "GEOM_D2" ),    myGrp2, aLayout, RadioButton21, SpinBox21, SpinBox22 );
+  createRadioWg( tr( "GEOM_D" ),  tr( "GEOM_ANGLE" ), myGrp2, aLayout, RadioButton22, SpinBox23, SpinBox24 );
 
-  createSelWg( tr( "GEOM_MAIN_OBJECT" ), iconSelect, aSelGrp2, MainObj2 );
-  createSelWg( tr( "FACE_1" ), iconSelect, aSelGrp2, Face1 );
-  createSelWg( tr( "FACE_2" ), iconSelect, aSelGrp2, Face2 );
+  aLayout->setRowStretch( aLayout->rowCount(), 10 );
 
-  aSpinGrp = new QGroupBox( 1, Qt::Vertical, myGrp2 );
-  aSpinGrp->setFrameStyle( QFrame::NoFrame );
-  aSpinGrp->setInsideMargin( 0 );
+  // Create third group
 
-  new QLabel( tr( "GEOM_D1" ), aSpinGrp );
-  mySpinBox[ SpinBox21 ] = new DlgRef_SpinBox( aSpinGrp );
+  myGrp3 = new QGroupBox( tr( "GEOM_CHAMFER_FACES" ), centralWidget() );
 
-  new QLabel( tr( "GEOM_D2" ), aSpinGrp );
-  mySpinBox[ SpinBox22 ] = new DlgRef_SpinBox( aSpinGrp );
+  aLayout = new QGridLayout( myGrp3 );
+  aLayout->setMargin( 9 ); aLayout->setSpacing( 6 );
 
-  // Create third group
+  createSelWg( tr( "GEOM_MAIN_OBJECT" ), iconSelect, myGrp3, aLayout, MainObj3 );
+  createSelWg( tr( "SELECTED_FACES" ),   iconSelect, myGrp3, aLayout, Faces );
 
-  myGrp3 = new QGroupBox( 1, Qt::Horizontal, tr( "GEOM_CHAMFER_FACES" ), this );
+  createRadioWg( tr( "GEOM_D1" ), tr( "GEOM_D2" ),    myGrp3, aLayout, RadioButton31, SpinBox31, SpinBox32 );
+  createRadioWg( tr( "GEOM_D" ),  tr( "GEOM_ANGLE" ), myGrp3, aLayout, RadioButton32, SpinBox33, SpinBox34 );
 
-  QGroupBox* aSelGrp3 = new QGroupBox( 3, Qt::Horizontal, myGrp3 );
-  aSelGrp3->setFrameStyle( QFrame::NoFrame );
-  aSelGrp3->setInsideMargin( 0 );
+  aLayout->setRowStretch( aLayout->rowCount(), 10 );
 
-  createSelWg( tr( "GEOM_MAIN_OBJECT" ), iconSelect, aSelGrp3, MainObj3 );
-  createSelWg( tr( "SELECTED_FACES" ), iconSelect, aSelGrp3, Faces );
+  // Create fourth group
 
-  aSpinGrp = new QGroupBox( 1, Qt::Vertical, myGrp3 );
-  aSpinGrp->setFrameStyle( QFrame::NoFrame );
-  aSpinGrp->setInsideMargin( 0 );
+  myGrp4 = new QGroupBox( tr( "GEOM_CHAMFER_EDGE" ), centralWidget() );
 
-  new QLabel( tr( "GEOM_D1" ), aSpinGrp );
-  mySpinBox[ SpinBox31 ] = new DlgRef_SpinBox( aSpinGrp );
+  aLayout = new QGridLayout( myGrp4 );
+  aLayout->setMargin( 9 ); aLayout->setSpacing( 6 );
 
-  new QLabel( tr( "GEOM_D2" ), aSpinGrp );
-  mySpinBox[ SpinBox32 ] = new DlgRef_SpinBox( aSpinGrp );
+  createSelWg( tr( "GEOM_MAIN_OBJECT" ), iconSelect, myGrp4, aLayout, MainObj4 );
+  createSelWg( tr( "SELECTED_EDGE" ),    iconSelect, myGrp4, aLayout, Edges );
 
-  ( new QLabel( myGrp3 ) )->setSizePolicy(
-    QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
+  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
 
-  Layout1->addWidget( myGrp1, 2, 0 );
-  Layout1->addWidget( myGrp2, 2, 0 );
-  Layout1->addWidget( myGrp3, 2, 0 );
+  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, DlgRef_SpinBox* >::iterator anIter;
-  for ( anIter = mySpinBox.begin(); anIter != mySpinBox.end(); ++anIter )
-    anIter.data()->RangeStepAndValidator( 0.001, 999.999, SpecificStep, 3 );
+  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.htm");
+  setHelpFileName( "chamfer_operation_page.html" );
 
   /* Initialisations */
   Init();
+  myRadioButton[ RadioButton21 ]->click();
 }
 
 
@@ -172,46 +173,47 @@ void OperationGUI_ChamferDlg::Init()
 {
   myConstructorId = -1;
   reset();
-  RadioButton1->setChecked( true );
-  myEditCurrentArgument = mySelName[ MainObj1 ];
 
   /* signals and slots connections */
 
   // main buttons
-  connect( buttonOk   , SIGNAL( clicked() ), this, SLOT( ClickOnOk()    ) );
-  connect( buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
+  connect( buttonOk(),    SIGNAL( clicked() ), this, SLOT( ClickOnOk()    ) );
+  connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
 
   // group box
-  connect( GroupConstructors, SIGNAL( clicked( int ) ),
-           this, SLOT( ConstructorsClicked( int ) ) );
+  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.data(), SIGNAL( clicked() ),
+    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.data(), SIGNAL( returnPressed() ),
+    connect( anIterLE2.value(), SIGNAL( returnPressed() ),
              this, SLOT( LineEditReturnPressed() ) );
 
   // spin boxes
-  QMap< int, DlgRef_SpinBox* >::iterator anIterSpin;
+  QMap< int, QDoubleSpinBox* >::iterator anIterSpin;
   for ( anIterSpin = mySpinBox.begin(); anIterSpin != mySpinBox.end(); ++anIterSpin )
-    connect( anIterSpin.data(), SIGNAL( valueChanged( double ) ),
+    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()));
+  connect( myGeomGUI->getApp()->selectionMgr(), 
+          SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
 
   initName( tr( "GEOM_CHAMFER" ) );
 
-  myGrp2->hide();
-  myGrp3->hide();
-  myGrp1->show();
+  ConstructorsClicked( 0 );
 }
 
 
@@ -222,62 +224,87 @@ void OperationGUI_ChamferDlg::Init()
 void OperationGUI_ChamferDlg::ConstructorsClicked( int constructorId )
 {
    // Activate next widget
-  if (myGeomGUI->getApp()->desktop()->activeWindow()->getViewManager()->getType() 
-      != OCCViewer_Viewer::Type())
-  {
-    RadioButton1->setChecked( true );
+  if ( myGeomGUI->getApp()->desktop()->activeWindow()->getViewManager()->getType() 
+       != OCCViewer_Viewer::Type() ) {
+    mainFrame()->RadioButton1->setChecked( true );
     return;
   }
 
-  if (myConstructorId == constructorId)
+  if ( myConstructorId == constructorId )
     return;
 
   // Get values from previous widget
-  double D1 = 5, D2 = 5;
+  double D1 = 5, D2 = 5, D = 5, Angle = 5;
   if ( myConstructorId == 0 )
-    D1 = D2 = mySpinBox[ SpinBox1 ]->GetValue();
-  else if ( myConstructorId == 1 )
-  {
-    D1 = mySpinBox[ SpinBox21 ]->GetValue();
-    D2 = mySpinBox[ SpinBox22 ]->GetValue();
+    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 ]->GetValue();
-    D2 = mySpinBox[ SpinBox32 ]->GetValue();
+  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;
 
-   switch ( constructorId )
-  {
-    case 0:
-        myGrp1->show();
-        myGrp2->hide();
-        myGrp3->hide();
-        mySpinBox[ SpinBox1 ]->SetValue( D1 );
+  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 1:
-        myGrp1->hide();
-        myGrp2->show();
-        myGrp3->hide();
-        mySpinBox[ SpinBox21 ]->SetValue( D1 );
-        mySpinBox[ SpinBox22 ]->SetValue( D2 );
+  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 2:
-        myGrp1->hide();
-        myGrp2->hide();
-        myGrp3->show();
-        mySpinBox[ SpinBox31 ]->SetValue( D1 );
-        mySpinBox[ SpinBox32 ]->SetValue( D2 );        
+  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:
+  default:
     break;
   }
-
+  
   if      ( constructorId == 0 ) myEditCurrentArgument = mySelName[ MainObj1 ];
   else if ( constructorId == 1 ) myEditCurrentArgument = mySelName[ MainObj2 ];
-  else                           myEditCurrentArgument = mySelName[ MainObj3 ];
+  else if ( constructorId == 2 ) myEditCurrentArgument = mySelName[ MainObj3 ];
+  else                           myEditCurrentArgument = mySelName[ MainObj4 ];
 
   activateSelection(); 
   enableWidgets();
@@ -290,6 +317,10 @@ void OperationGUI_ChamferDlg::ConstructorsClicked( int constructorId )
   else
     myEditCurrentArgument->setText( "" );
 
+  qApp->processEvents();
+  updateGeometry();
+  resize( minimumSize() );
+
   displayPreview();
 }
 
@@ -330,24 +361,21 @@ void OperationGUI_ChamferDlg::SelectionIntoArgument()
   // 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.data() )
-    {
+  for ( anIter = mySelName.begin(); anIter != mySelName.end(); ++anIter ) {
+    if ( myEditCurrentArgument == anIter.value() ) {
       aCurrFocus = anIter.key();
       break;
     }
+  }
 
   // If selection of main object is activated
-  if ( aCurrFocus == MainObj1 || aCurrFocus == MainObj2 || aCurrFocus == MainObj3 )
-  {
-    if ( IObjectCount() == 1 )
-    {
+  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() )
-      {
+      if ( aResult && !anObj->_is_nil() ) {
         myShape = anObj;
         mySelName[ aCurrFocus ]->setText( GEOMBase::GetName( anObj ) );
         displayPreview();
@@ -360,21 +388,17 @@ void OperationGUI_ChamferDlg::SelectionIntoArgument()
     enableWidgets();
   }
   // If face selection of second tab is activated
-  else if ( aCurrFocus == Face1 || aCurrFocus == Face2 )
-  {
-    if ( IObjectCount() == 1 )
-    {
+  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() )
-      {
+      if ( aResult && !anObj->_is_nil() ) {
          TColStd_IndexedMapOfInteger anIndexes;
-        ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( firstIObject(), anIndexes );
+        ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr()->GetIndexes( firstIObject(), anIndexes );
 
-         if ( anIndexes.Extent() == 1 )
-         {
+         if ( anIndexes.Extent() == 1 ) {
             int anIndex = anIndexes( 1 );
             QString aFaceName = QString( GEOMBase::GetName( anObj ) ) + ":%1";
             myEditCurrentArgument->setText( aFaceName.arg( anIndex ) );
@@ -387,40 +411,42 @@ void OperationGUI_ChamferDlg::SelectionIntoArgument()
 
     myFace[ aCurrFocus ] = -1;
   }
-  // If face selection of third tab is activated
-  else if ( aCurrFocus == Faces )
-  {
-    if ( IObjectCount() == 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 ( anIndexes.Extent() > 0 )
-         {
-           QString aFaceName;
-           if ( anIndexes.Extent() == 1 )
-           {
-             int anIndex = anIndexes( 1 );
-
-             aFaceName = QString( GEOMBase::GetName( anObj ) ) + QString( ":%1" ).arg( anIndex );
-           }
-           else
-             aFaceName = tr( "GEOM_MEN_POPUP_NAME" ).arg( anIndexes.Extent() );
-
-           myEditCurrentArgument->setText( aFaceName );
-           myFaces = anIndexes;
-           displayPreview();
-           return;
-         }
+      
+      if ( aResult && !anObj->_is_nil() ) {
+       TColStd_IndexedMapOfInteger anIndexes;
+       ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr()->GetIndexes( firstIObject(), anIndexes );
+       
+       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;
+       }
       }
     }
     myFaces.Clear();
+    myEdges.Clear();
   }
 }
 
@@ -435,13 +461,61 @@ void OperationGUI_ChamferDlg::LineEditReturnPressed()
 
   QMap< int, QLineEdit* >::iterator anIterLE;
   for ( anIterLE = mySelName.begin(); anIterLE != mySelName.end(); ++anIterLE )
-    if ( anIterLE.data() == aSender )
-      myEditCurrentArgument = anIterLE.data();
+    if ( anIterLE.value() == aSender )
+      myEditCurrentArgument = anIterLE.value();
 
   GEOMBase_Skeleton::LineEditReturnPressed();
 }
 
 
+//=================================================================================
+// function : RadioButtonPressed()
+// purpose  :
+//=================================================================================
+void OperationGUI_ChamferDlg::RadioButtonPressed()
+{
+  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 : SetEditCurrentArgument()
 // purpose  :
@@ -451,12 +525,12 @@ void OperationGUI_ChamferDlg::SetEditCurrentArgument()
   QPushButton* aSender = ( QPushButton* )sender();
 
   QMap< int, QPushButton* >::iterator anIter;
-  for ( anIter = mySelBtn.begin(); anIter != mySelBtn.end(); ++anIter )
-    if ( anIter.data() == aSender )
-    {
+  for ( anIter = mySelBtn.begin(); anIter != mySelBtn.end(); ++anIter ) {
+    if ( anIter.value() == aSender ) {
       mySelName[ anIter.key() ]->setFocus();
       myEditCurrentArgument = mySelName[ anIter.key() ];
     }
+  }
 
   activateSelection();
 }
@@ -470,8 +544,8 @@ void OperationGUI_ChamferDlg::ActivateThisDialog()
 {
   GEOMBase_Skeleton::ActivateThisDialog();
 
-  connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 
-          SIGNAL(currentSelectionChanged()), this, SLOT( SelectionIntoArgument() ) );
+  connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), 
+          SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
 
   activateSelection();
   displayPreview();
@@ -482,9 +556,9 @@ void OperationGUI_ChamferDlg::ActivateThisDialog()
 // function : enterEvent()
 // purpose  :
 //=================================================================================
-void OperationGUI_ChamferDlg::enterEvent(QEvent* e)
+void OperationGUI_ChamferDlg::enterEvent( QEvent* )
 {
-  if ( !GroupConstructors->isEnabled() )
+  if ( !mainFrame()->GroupConstructors->isEnabled() )
     this->ActivateThisDialog();
 }
 
@@ -493,7 +567,7 @@ void OperationGUI_ChamferDlg::enterEvent(QEvent* e)
 // function : ValueChangedInSpinBox()
 // purpose  :
 //=================================================================================
-void OperationGUI_ChamferDlg::ValueChangedInSpinBox( double newValue )
+void OperationGUI_ChamferDlg::ValueChangedInSpinBox( double )
 {
   displayPreview();
 }
@@ -506,13 +580,43 @@ void OperationGUI_ChamferDlg::ValueChangedInSpinBox( double newValue )
 void OperationGUI_ChamferDlg::createSelWg( const QString& theLbl,
                                            QPixmap&       thePix,
                                            QWidget*       theParent,
+                                          QGridLayout*   theLayout,
                                            const int      theId )
 {
-  new QLabel( theLbl, theParent );
+  QLabel* lab = new QLabel( theLbl, theParent );
   mySelBtn[ theId ] = new QPushButton( theParent );
-  mySelBtn[ theId ]->setPixmap( thePix );
+  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 : createRadioWg()
+// purpose  :
+//=================================================================================
+void OperationGUI_ChamferDlg::createRadioWg( const QString& theLbl1, 
+                                            const QString& theLbl2, 
+                                            QWidget*       theParent, 
+                                            QGridLayout*   theLayout, 
+                                            const int      theRbId,
+                                            const int      theSpin1Id,
+                                            const int      theSpin2Id )
+{
+  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 );
 }
 
 //=================================================================================
@@ -522,25 +626,27 @@ void OperationGUI_ChamferDlg::createSelWg( const QString& theLbl,
 void OperationGUI_ChamferDlg::reset()
 {
   // Set Initial values of spinboxes
-  QMap< int, DlgRef_SpinBox* >::iterator anIter;
+  QMap< int, QDoubleSpinBox* >::iterator anIter;
   for ( anIter = mySpinBox.begin(); anIter != mySpinBox.end(); ++anIter )
-    anIter.data()->SetValue( 5 );
+    anIter.value()->setValue( 5 );
 
   // clear line edits
   QMap< int, QLineEdit* >::iterator anIterLE;
   for ( anIterLE = mySelName.begin(); anIterLE != mySelName.end(); ++anIterLE )
-    anIterLE.data()->setText( "" );
+    anIterLE.value()->setText( "" );
 
   // constructor id
   int aConstructorId = getConstructorId();
 
   if      ( aConstructorId == 0 ) myEditCurrentArgument = mySelName[ MainObj1 ];
   else if ( aConstructorId == 1 ) myEditCurrentArgument = mySelName[ MainObj2 ];
-  else                            myEditCurrentArgument = mySelName[ MainObj3 ];
+  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;
 
@@ -551,15 +657,6 @@ void OperationGUI_ChamferDlg::reset()
   enableWidgets();
 }
 
-//=================================================================================
-// function : getConstructorId()
-// purpose  :
-//=================================================================================
-int OperationGUI_ChamferDlg::getConstructorId() const
-{
-  return GroupConstructors->id( GroupConstructors->selected() );
-}
-
 //=================================================================================
 // function : activateSelection
 // purpose  : Activate selection in accordance with myEditCurrentArgument
@@ -569,10 +666,13 @@ void OperationGUI_ChamferDlg::activateSelection()
   if (  !myShape->_is_nil() &&
        ( myEditCurrentArgument == mySelName[ Face1 ] ||
          myEditCurrentArgument == mySelName[ Face2 ] ||
-         myEditCurrentArgument == mySelName[ Faces ] ) )
+         myEditCurrentArgument == mySelName[ Faces ] ) ) {
     localSelection( myShape, TopAbs_FACE );
-  else
-  {
+  }
+  else if ( !myShape->_is_nil() && myEditCurrentArgument == mySelName[ Edges ] ) {
+    localSelection( myShape, TopAbs_EDGE );
+  }
+  else {
     TColStd_MapOfInteger aMap;
     aMap.Add( GEOM_SHELL );
     aMap.Add( GEOM_SOLID );
@@ -611,9 +711,18 @@ void OperationGUI_ChamferDlg::enableWidgets()
   else if ( anId == 2 )
   {
     mySelName[ Faces ]->setEnabled( toEnable );
-
-    if ( !toEnable )
-      myFaces.Clear();
+    if ( !toEnable ) {
+      mySelName[ Faces ]->setText( "" );
+      myFaces = -1;
+    }
+  }
+  else if ( anId == 3 ) {
+    mySelName[ Edges ]->setEnabled( toEnable );
+    
+    if ( !toEnable ) {
+      mySelName[ Edges ]->setText( "" );
+      myEdges = -1;
+    }
   }
 }
 
@@ -637,6 +746,7 @@ bool OperationGUI_ChamferDlg::isValid( QString& )
     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;
   }
 }
@@ -648,49 +758,74 @@ bool OperationGUI_ChamferDlg::isValid( QString& )
 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 )
+  if ( anId == 0 ) {
     anObj = GEOM::GEOM_ILocalOperations::_narrow(
       getOperation() )->MakeChamferAll( myShape,
-                                        mySpinBox[ SpinBox1 ]->GetValue() );
-  else if ( anId == 1 )
-    anObj = GEOM::GEOM_ILocalOperations::_narrow(
-      getOperation() )->MakeChamferEdge( myShape,
-                                         mySpinBox[ SpinBox21 ]->GetValue(),
-                                         mySpinBox[ SpinBox22 ]->GetValue(),
-                                         myFace[ Face1 ],
-                                         myFace[ Face2 ] );
+                                        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 ]);
+    }
+  }
   else if ( anId == 2 )
   {
-
-    int i = 0;
     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 ]->GetValue(),
-                                          mySpinBox[ SpinBox32 ]->GetValue(),
+                                          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;
 }
-
-
-
-
-
-
-
-
-