Salome HOME
0020863: [CEA 403] SMESH hypotheses GUI destruction
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_SmoothingDlg.cxx
1 //  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 // SMESH SMESHGUI : GUI for SMESH component
24 // File   : SMESHGUI_SmoothingDlg.cxx
25 // Author : Michael ZORIN, Open CASCADE S.A.S.
26 // SMESH includes
27 //
28 #include "SMESHGUI_SmoothingDlg.h"
29
30 #include "SMESHGUI.h"
31 #include "SMESHGUI_Utils.h"
32 #include "SMESHGUI_VTKUtils.h"
33 #include "SMESHGUI_MeshUtils.h"
34 #include "SMESHGUI_SpinBox.h"
35 #include "SMESHGUI_IdValidator.h"
36 #include "SMESHGUI_FilterDlg.h"
37
38 #include <SMESH_Actor.h>
39 #include <SMESH_TypeFilter.hxx>
40 #include <SMESH_LogicalFilter.hxx>
41
42 #include <SMDS_Mesh.hxx>
43
44 // SALOME GUI includes
45 #include <SUIT_ResourceMgr.h>
46 #include <SUIT_OverrideCursor.h>
47 #include <SUIT_Desktop.h>
48 #include <SUIT_Session.h>
49 #include <SUIT_MessageBox.h>
50
51 #include <LightApp_Application.h>
52 #include <LightApp_SelectionMgr.h>
53
54 #include <SalomeApp_IntSpinBox.h>
55
56 #include <SVTK_ViewModel.h>
57 #include <SVTK_Selector.h>
58 #include <SVTK_ViewWindow.h>
59 #include <SVTK_Selection.h>
60 #include <SALOME_ListIO.hxx>
61
62 // OCCT includes
63 #include <TColStd_MapOfInteger.hxx>
64
65 // Qt includes
66 #include <QApplication>
67 #include <QGroupBox>
68 #include <QLabel>
69 #include <QLineEdit>
70 #include <QPushButton>
71 #include <QRadioButton>
72 #include <QComboBox>
73 #include <QCheckBox>
74 #include <QHBoxLayout>
75 #include <QVBoxLayout>
76 #include <QGridLayout>
77 #include <QKeyEvent>
78 #include <QButtonGroup>
79
80 // IDL includes
81 #include <SALOMEconfig.h>
82 #include CORBA_SERVER_HEADER(SMESH_Group)
83 #include CORBA_SERVER_HEADER(SMESH_MeshEditor)
84
85 #define SPACING 6
86 #define MARGIN  11
87
88 //=================================================================================
89 // function : SMESHGUI_SmoothingDlg()
90 // purpose  : constructor
91 //=================================================================================
92 SMESHGUI_SmoothingDlg::SMESHGUI_SmoothingDlg( SMESHGUI* theModule )
93   : QDialog( SMESH::GetDesktop( theModule ) ),
94     mySMESHGUI( theModule ),
95     mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
96     myFilterDlg(0),
97     mySelectedObject(SMESH::SMESH_IDSource::_nil())
98 {
99   QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_SMOOTHING")));
100   QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
101
102   setModal(false);
103   setAttribute(Qt::WA_DeleteOnClose, true);
104   setWindowTitle(tr("SMESH_SMOOTHING"));
105   setSizeGripEnabled(true);
106
107   /***************************************************************/
108   QVBoxLayout* SMESHGUI_SmoothingDlgLayout = new QVBoxLayout(this);
109   SMESHGUI_SmoothingDlgLayout->setSpacing(SPACING);
110   SMESHGUI_SmoothingDlgLayout->setMargin(MARGIN);
111
112   /***************************************************************/
113   GroupConstructors = new QGroupBox(tr("SMESH_SMOOTHING"), this);
114   QButtonGroup* ButtonGroup = new QButtonGroup(this);
115   QHBoxLayout* GroupConstructorsLayout = new QHBoxLayout(GroupConstructors);
116   GroupConstructorsLayout->setSpacing(SPACING);
117   GroupConstructorsLayout->setMargin(MARGIN);
118
119   Constructor1 = new QRadioButton(GroupConstructors);
120   Constructor1->setIcon(image0);
121   Constructor1->setChecked(true);
122   GroupConstructorsLayout->addWidget(Constructor1);
123   ButtonGroup->addButton(Constructor1, 0);
124
125   /***************************************************************/
126   GroupArguments = new QGroupBox(tr("SMESH_ARGUMENTS"), this);
127   QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments);
128   GroupArgumentsLayout->setSpacing(SPACING);
129   GroupArgumentsLayout->setMargin(MARGIN);
130
131   myIdValidator = new SMESHGUI_IdValidator(this);
132
133   // Controls for elements selection
134   TextLabelElements = new QLabel(tr("SMESH_ID_ELEMENTS"), GroupArguments);
135
136   SelectElementsButton = new QPushButton(GroupArguments);
137   SelectElementsButton->setIcon(image1);
138
139   LineEditElements = new QLineEdit(GroupArguments);
140   LineEditElements->setValidator(myIdValidator);
141   myElemFilterBtn = new QPushButton( tr( "SMESH_BUT_FILTER" ), GroupArguments );
142   connect(myElemFilterBtn,   SIGNAL(clicked()), this, SLOT(setElemFilters()));
143
144   // Control for the whole mesh selection
145   CheckBoxMesh = new QCheckBox(tr("SMESH_SELECT_WHOLE_MESH"), GroupArguments);
146
147   // Controls for nodes selection
148   TextLabelNodes = new QLabel(tr("FIXED_NODES_IDS"), GroupArguments);
149
150   SelectNodesButton  = new QPushButton(GroupArguments);
151   SelectNodesButton->setIcon(image1);
152
153   LineEditNodes  = new QLineEdit(GroupArguments);
154   LineEditNodes->setValidator(myIdValidator);
155   QPushButton* filterNodeBtn = new QPushButton( tr( "SMESH_BUT_FILTER" ), GroupArguments );
156   connect(filterNodeBtn,   SIGNAL(clicked()), this, SLOT(setNodeFilters()));
157
158   // Controls for method selection
159   TextLabelMethod = new QLabel(tr("METHOD"), GroupArguments);
160
161   ComboBoxMethod = new QComboBox(GroupArguments);
162
163   // Controls for iteration limit defining
164   TextLabelLimit = new QLabel(tr("ITERATION_LIMIT"), GroupArguments);
165
166   SpinBox_IterationLimit = new SalomeApp_IntSpinBox(GroupArguments);
167
168   // Controls for max. aspect ratio defining
169   TextLabelAspectRatio = new QLabel(tr("MAX_ASPECT_RATIO"), GroupArguments);
170
171   SpinBox_AspectRatio = new SMESHGUI_SpinBox(GroupArguments);
172
173   // Check box "Is Parametric"
174   CheckBoxParametric = new QCheckBox( tr("IS_PARAMETRIC"), GroupArguments );
175
176   GroupArgumentsLayout->addWidget(TextLabelElements,      0, 0);
177   GroupArgumentsLayout->addWidget(SelectElementsButton,   0, 1);
178   GroupArgumentsLayout->addWidget(LineEditElements,       0, 2);
179   GroupArgumentsLayout->addWidget(myElemFilterBtn,        0, 3);
180   GroupArgumentsLayout->addWidget(CheckBoxMesh,           1, 0, 1, 4);
181   GroupArgumentsLayout->addWidget(TextLabelNodes,         2, 0);
182   GroupArgumentsLayout->addWidget(SelectNodesButton,      2, 1);
183   GroupArgumentsLayout->addWidget(LineEditNodes,          2, 2);
184   GroupArgumentsLayout->addWidget(filterNodeBtn,          2, 3);
185   GroupArgumentsLayout->addWidget(TextLabelMethod,        3, 0);
186   GroupArgumentsLayout->addWidget(ComboBoxMethod,         3, 2, 1, 2);
187   GroupArgumentsLayout->addWidget(TextLabelLimit,         4, 0);
188   GroupArgumentsLayout->addWidget(SpinBox_IterationLimit, 4, 2, 1, 2);
189   GroupArgumentsLayout->addWidget(TextLabelAspectRatio,   5, 0);
190   GroupArgumentsLayout->addWidget(SpinBox_AspectRatio,    5, 2, 1, 2);
191   GroupArgumentsLayout->addWidget(CheckBoxParametric,     6, 0, 1, 4);
192
193   /***************************************************************/
194   GroupButtons = new QGroupBox(this);
195   QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons);
196   GroupButtonsLayout->setSpacing(SPACING);
197   GroupButtonsLayout->setMargin(MARGIN);
198
199   buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons);
200   buttonOk->setAutoDefault(true);
201   buttonOk->setDefault(true);
202   buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
203   buttonApply->setAutoDefault(true);
204   buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
205   buttonCancel->setAutoDefault(true);
206   buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons);
207   buttonHelp->setAutoDefault(true);
208
209   GroupButtonsLayout->addWidget(buttonOk);
210   GroupButtonsLayout->addSpacing(10);
211   GroupButtonsLayout->addWidget(buttonApply);
212   GroupButtonsLayout->addSpacing(10);
213   GroupButtonsLayout->addStretch();
214   GroupButtonsLayout->addWidget(buttonCancel);
215   GroupButtonsLayout->addWidget(buttonHelp);
216
217   /***************************************************************/
218   SMESHGUI_SmoothingDlgLayout->addWidget(GroupConstructors);
219   SMESHGUI_SmoothingDlgLayout->addWidget(GroupArguments);
220   SMESHGUI_SmoothingDlgLayout->addWidget(GroupButtons);
221
222   /***************************************************************/
223   /* Initialisations */
224   ComboBoxMethod->addItem(tr("LAPLACIAN"));
225   ComboBoxMethod->addItem(tr("CENTROIDAL"));
226
227   ComboBoxMethod->setCurrentIndex(0);
228
229   CheckBoxParametric->setChecked( true );
230   
231   SpinBox_IterationLimit->setRange(1, 999999);
232   SpinBox_IterationLimit->setValue(20);
233   SpinBox_AspectRatio->RangeStepAndValidator(0.0, +999999.999, 0.1, "parametric_precision");
234   SpinBox_AspectRatio->SetValue(1.1);
235
236   GroupArguments->show();
237   myConstructorId = 0;
238   Constructor1->setChecked(true);
239   
240   mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
241
242   mySMESHGUI->SetActiveDialogBox(this);
243
244   // Costruction of the logical filter for the elements: mesh/sub-mesh/group
245   SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
246   SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter (GROUP);
247
248   QList<SUIT_SelectionFilter*> aListOfFilters;
249   if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
250   if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
251
252   myMeshOrSubMeshOrGroupFilter =
253     new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
254
255   myHelpFileName = "smoothing_page.html";
256
257   Init();
258
259   /***************************************************************/
260   // signals and slots connections
261   connect(buttonOk, SIGNAL(clicked()),     this, SLOT(ClickOnOk()));
262   connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
263   connect(buttonApply, SIGNAL(clicked()),  this, SLOT(ClickOnApply()));
264   connect(buttonHelp, SIGNAL(clicked()), this, SLOT(ClickOnHelp()));
265
266   connect(SelectElementsButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
267   connect(SelectNodesButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
268   connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
269   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
270   /* to close dialog if study change */
271   connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
272   connect(LineEditElements, SIGNAL(textChanged(const QString&)),
273            SLOT(onTextChange(const QString&)));
274   connect(LineEditNodes, SIGNAL(textChanged(const QString&)),
275            SLOT(onTextChange(const QString&)));
276   connect(CheckBoxMesh, SIGNAL(toggled(bool)),
277            SLOT(onSelectMesh(bool)));
278 }
279
280 //=================================================================================
281 // function : ~SMESHGUI_SmoothingDlg()
282 // purpose  : destructor
283 //=================================================================================
284 SMESHGUI_SmoothingDlg::~SMESHGUI_SmoothingDlg()
285 {
286   // no need to delete child widgets, Qt does it all for us
287   if ( myFilterDlg != 0 ) {
288     myFilterDlg->setParent( 0 );
289     delete myFilterDlg;
290   }
291 }
292
293 //=================================================================================
294 // function : Init()
295 // purpose  : initialization
296 //=================================================================================
297 void SMESHGUI_SmoothingDlg::Init()
298 {
299   myBusy = false;
300
301 //   ComboBoxMethod->setCurrentItem(0);
302
303 //   SpinBox_IterationLimit->setValue(20);
304 //   SpinBox_AspectRatio->SetValue(1.1);
305
306   myEditCurrentArgument = LineEditElements;
307   LineEditElements->setFocus();
308   LineEditElements->clear();
309   LineEditNodes->clear();
310   myElementsId = "";
311   myNbOkElements = 0;
312   myNbOkNodes = 0;
313   myActor     = 0;
314   myMesh = SMESH::SMESH_Mesh::_nil();
315
316   CheckBoxMesh->setChecked(false);
317   onSelectMesh(false);
318 }
319
320 //=================================================================================
321 // function : ClickOnApply()
322 // purpose  : Called when user presses <Apply> button
323 //=================================================================================
324 bool SMESHGUI_SmoothingDlg::ClickOnApply()
325 {
326   if (mySMESHGUI->isActiveStudyLocked())
327     return false;
328
329   if (!isValid())
330     return false;
331
332   if (myNbOkElements && (myNbOkNodes || LineEditNodes->text().trimmed().isEmpty())) {
333     QStringList aListElementsId = myElementsId.split(" ", QString::SkipEmptyParts);
334     QStringList aListNodesId    = LineEditNodes->text().split(" ", QString::SkipEmptyParts);
335
336     SMESH::long_array_var anElementsId = new SMESH::long_array;
337     SMESH::long_array_var aNodesId = new SMESH::long_array;
338
339     anElementsId->length(aListElementsId.count());
340     for (int i = 0; i < aListElementsId.count(); i++)
341       anElementsId[i] = aListElementsId[i].toInt();
342
343     if ( myNbOkNodes && aListNodesId.count() > 0 ) {
344       aNodesId->length(aListNodesId.count());
345       for (int i = 0; i < aListNodesId.count(); i++)
346         aNodesId[i] = aListNodesId[i].toInt();
347     } else {
348       aNodesId->length(0);
349     }
350
351     long anIterationLimit = (long)SpinBox_IterationLimit->value();
352     double aMaxAspectRatio = SpinBox_AspectRatio->GetValue();
353
354     QStringList aParameters;
355     aParameters << SpinBox_IterationLimit->text();
356     aParameters << SpinBox_AspectRatio->text();
357
358     SMESH::SMESH_MeshEditor::Smooth_Method aMethod = SMESH::SMESH_MeshEditor::LAPLACIAN_SMOOTH;
359     if (ComboBoxMethod->currentIndex() > 0)
360       aMethod =  SMESH::SMESH_MeshEditor::CENTROIDAL_SMOOTH;
361
362     bool aResult = false;
363     try {
364       SUIT_OverrideCursor aWaitCursor;
365       SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
366
367       if ( CheckBoxParametric->isChecked() ) {
368         if(CheckBoxMesh->isChecked())
369           aResult = aMeshEditor->SmoothParametricObject(mySelectedObject, aNodesId.inout(),
370                                                         anIterationLimit, aMaxAspectRatio, aMethod);
371         else
372           aResult = aMeshEditor->SmoothParametric(anElementsId.inout(), aNodesId.inout(),
373                                                   anIterationLimit, aMaxAspectRatio, aMethod);
374       }
375       else {
376         if(CheckBoxMesh->isChecked())
377           aResult = aMeshEditor->SmoothObject(mySelectedObject, aNodesId.inout(),
378                                               anIterationLimit, aMaxAspectRatio, aMethod);
379         else
380           aResult = aMeshEditor->Smooth(anElementsId.inout(), aNodesId.inout(),
381                                         anIterationLimit, aMaxAspectRatio, aMethod);
382       }
383
384       myMesh->SetParameters( aParameters.join(":").toLatin1().constData() );
385
386     } catch (...) {
387     }
388
389     if (aResult) {
390       if ( myActor ) {
391         Handle(SALOME_InteractiveObject) anIO = myActor->getIO();
392         SALOME_ListIO aList;
393         aList.Append(anIO);
394         mySelectionMgr->setSelectedObjects(aList, false);
395       }
396
397       SMESH::UpdateView();
398       SMESHGUI::Modified();
399       Init();
400
401       mySelectedObject = SMESH::SMESH_IDSource::_nil();
402     }
403   }
404
405   return true;
406 }
407
408 //=================================================================================
409 // function : ClickOnOk()
410 // purpose  : Called when user presses <OK> button
411 //=================================================================================
412 void SMESHGUI_SmoothingDlg::ClickOnOk()
413 {
414   if( ClickOnApply() )
415     ClickOnCancel();
416 }
417
418 //=================================================================================
419 // function : ClickOnCancel()
420 // purpose  : Called when dialog box is closed
421 //=================================================================================
422 void SMESHGUI_SmoothingDlg::ClickOnCancel()
423 {
424   disconnect(mySelectionMgr, 0, this, 0);
425   mySelectionMgr->clearFilters();
426   //mySelectionMgr->clearSelected();
427   if (SMESH::GetCurrentVtkView()) {
428     SMESH::RemoveFilters(); // PAL6938 -- clean all mesh entity filters
429     SMESH::SetPointRepresentation(false);
430     SMESH::SetPickable();
431   }
432   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
433     aViewWindow->SetSelectionMode(ActorSelection);
434   mySMESHGUI->ResetState();
435   reject();
436 }
437
438 //=================================================================================
439 // function : ClickOnHelp()
440 // purpose  :
441 //=================================================================================
442 void SMESHGUI_SmoothingDlg::ClickOnHelp()
443 {
444   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
445   if (app) 
446     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
447   else {
448     QString platform;
449 #ifdef WIN32
450     platform = "winapplication";
451 #else
452     platform = "application";
453 #endif
454     SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
455                              tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
456                              arg(app->resourceMgr()->stringValue("ExternalBrowser",
457                                                                  platform)).
458                              arg(myHelpFileName));
459   }
460 }
461
462 //=======================================================================
463 // function : onTextChange()
464 // purpose  :
465 //=======================================================================
466 void SMESHGUI_SmoothingDlg::onTextChange (const QString& theNewText)
467 {
468   QLineEdit* send = (QLineEdit*)sender();
469
470   // return if busy
471   if (myBusy) return;
472
473   // set busy flag
474   myBusy = true;
475
476   if (send == LineEditElements)
477     myNbOkElements = 0;
478   else if (send == LineEditNodes)
479     myNbOkNodes = 0;
480
481   buttonOk->setEnabled(false);
482   buttonApply->setEnabled(false);
483
484   // hilight entered elements/nodes
485   SMDS_Mesh* aMesh = 0;
486   if (myActor)
487     aMesh = myActor->GetObject()->GetMesh();
488
489   if (aMesh) {
490     
491     QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts);
492
493     if (send == LineEditElements) {
494       const Handle(SALOME_InteractiveObject)& anIO = myActor->getIO();
495       TColStd_MapOfInteger newIndices;
496       for (int i = 0; i < aListId.count(); i++) {
497         const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt());
498         if (e)
499           newIndices.Add(e->GetID());
500         myNbOkElements++;
501       }
502       mySelector->AddOrRemoveIndex(anIO, newIndices, false);
503       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
504         aViewWindow->highlight( anIO, true, true );
505       myElementsId = theNewText;
506
507     } else if (send == LineEditNodes) {
508       TColStd_MapOfInteger newIndices;
509       
510       for (int i = 0; i < aListId.count(); i++) {
511         const SMDS_MeshNode * n = aMesh->FindNode(aListId[ i ].toInt());
512         if (n)
513           newIndices.Add(n->GetID());
514         myNbOkNodes++;
515       }
516       mySelector->AddOrRemoveIndex(myActor->getIO(), newIndices, false);
517       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
518         aViewWindow->highlight( myActor->getIO(), true, true );
519     }
520   }
521
522   if (myNbOkElements && (myNbOkNodes || LineEditNodes->text().trimmed().isEmpty())) {
523     buttonOk->setEnabled(true);
524     buttonApply->setEnabled(true);
525   }
526
527   myBusy = false;
528 }
529
530 //=================================================================================
531 // function : SelectionIntoArgument()
532 // purpose  : Called when selection as changed or other case
533 //=================================================================================
534 void SMESHGUI_SmoothingDlg::SelectionIntoArgument()
535 {
536   if (myBusy) return;
537
538   // clear
539   QString aString = "";
540
541   myBusy = true;
542   if (myEditCurrentArgument == LineEditElements ||
543       myEditCurrentArgument == LineEditNodes) {
544     myEditCurrentArgument->setText(aString);
545     if (myEditCurrentArgument == LineEditElements)
546       myNbOkElements = 0;
547     else
548       myNbOkNodes = 0;
549     buttonOk->setEnabled(false);
550     buttonApply->setEnabled(false);
551     myActor = 0;
552   }
553   myBusy = false;
554
555   if (!GroupButtons->isEnabled()) // inactive
556     return;
557
558   // get selected mesh
559   SALOME_ListIO aList;
560   mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type());
561   int nbSel = aList.Extent();
562   if (nbSel != 1)
563     return;
564
565   Handle(SALOME_InteractiveObject) IO = aList.First();
566   myMesh = SMESH::GetMeshByIO(IO);
567   if (myMesh->_is_nil())
568     return;
569
570   myActor = SMESH::FindActorByObject(myMesh);
571   if (!myActor && !CheckBoxMesh->isChecked())
572     return;
573
574   int aNbUnits = 0;
575
576   if (myEditCurrentArgument == LineEditElements) {
577     myElementsId = "";
578
579     if (CheckBoxMesh->isChecked()) {
580       SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
581
582       if (!SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO)->_is_nil())
583         mySelectedObject = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO);
584       else
585         return;
586     } else {
587       aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, IO, aString);
588       myElementsId = aString;
589       if (aNbUnits < 1)
590         return;
591     }
592   } else if (myEditCurrentArgument == LineEditNodes && !myMesh->_is_nil() && myActor) {
593     myNbOkNodes = 0;
594     aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, IO, aString);
595   } else {
596   }
597
598   myBusy = true;
599   myEditCurrentArgument->setText(aString);
600   myEditCurrentArgument->repaint();
601   myEditCurrentArgument->setEnabled(false); // to update lineedit IPAL 19809
602   myEditCurrentArgument->setEnabled(true); 
603   myBusy = false;
604
605   // OK
606   if (myEditCurrentArgument == LineEditElements)
607     myNbOkElements = true;
608   else if (myEditCurrentArgument == LineEditNodes)
609     myNbOkNodes = true;
610
611   if (myNbOkElements && (myNbOkNodes || LineEditNodes->text().trimmed().isEmpty())) {
612     buttonOk->setEnabled(true);
613     buttonApply->setEnabled(true);
614   }
615 }
616
617 //=================================================================================
618 // function : SetEditCurrentArgument()
619 // purpose  :
620 //=================================================================================
621 void SMESHGUI_SmoothingDlg::SetEditCurrentArgument()
622 {
623   QPushButton* send = (QPushButton*)sender();
624
625   switch (myConstructorId) {
626   case 0: /* default constructor */
627     {
628       disconnect(mySelectionMgr, 0, this, 0);
629       mySelectionMgr->clearSelected();
630       mySelectionMgr->clearFilters();
631
632       if (send == SelectElementsButton) {
633         myEditCurrentArgument = LineEditElements;
634         SMESH::SetPointRepresentation(false);
635         if (CheckBoxMesh->isChecked()) {
636           //          mySelectionMgr->setSelectionModes(ActorSelection);
637           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
638             aViewWindow->SetSelectionMode(ActorSelection);
639           mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
640         } else {
641           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
642             aViewWindow->SetSelectionMode(FaceSelection);
643         }
644       } else if (send == SelectNodesButton) {
645         LineEditNodes->clear();
646         myEditCurrentArgument = LineEditNodes;
647         SMESH::SetPointRepresentation(true);
648         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) {
649           aViewWindow->SetSelectionMode(NodeSelection);
650         }
651       }
652
653       myEditCurrentArgument->setFocus();
654       connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
655       SelectionIntoArgument();
656       break;
657     }
658   }
659 }
660
661 //=================================================================================
662 // function : DeactivateActiveDialog()
663 // purpose  : Deactivates this dialog
664 //=================================================================================
665 void SMESHGUI_SmoothingDlg::DeactivateActiveDialog()
666 {
667   if (GroupConstructors->isEnabled()) {
668     GroupConstructors->setEnabled(false);
669     GroupArguments->setEnabled(false);
670     GroupButtons->setEnabled(false);
671     mySMESHGUI->ResetState();
672     mySMESHGUI->SetActiveDialogBox(0);
673   }
674 }
675
676 //=================================================================================
677 // function : ActivateThisDialog()
678 // purpose  : Activates this dialog
679 //=================================================================================
680 void SMESHGUI_SmoothingDlg::ActivateThisDialog()
681 {
682   // Emit a signal to deactivate the active dialog
683   mySMESHGUI->EmitSignalDeactivateDialog();
684   GroupConstructors->setEnabled(true);
685   GroupArguments->setEnabled(true);
686   GroupButtons->setEnabled(true);
687
688   mySMESHGUI->SetActiveDialogBox(this);
689   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
690     aViewWindow->SetSelectionMode(FaceSelection);
691   SelectionIntoArgument();
692 }
693
694 //=================================================================================
695 // function : enterEvent()
696 // purpose  : Mouse enter event
697 //=================================================================================
698 void SMESHGUI_SmoothingDlg::enterEvent (QEvent*)
699 {
700   if (!GroupConstructors->isEnabled())
701     ActivateThisDialog();
702 }
703
704 //=================================================================================
705 // function : closeEvent()
706 // purpose  :
707 //=================================================================================
708 void SMESHGUI_SmoothingDlg::closeEvent (QCloseEvent*)
709 {
710   /* same than click on cancel button */
711   ClickOnCancel();
712 }
713
714 //=======================================================================
715 // function : hideEvent()
716 // purpose  : caused by ESC key
717 //=======================================================================
718 void SMESHGUI_SmoothingDlg::hideEvent (QHideEvent*)
719 {
720   if (!isMinimized())
721     ClickOnCancel();
722 }
723
724 //=======================================================================
725 // function : onSelectMesh()
726 // purpose  :
727 //=======================================================================
728 void SMESHGUI_SmoothingDlg::onSelectMesh (bool toSelectMesh)
729 {
730   if (toSelectMesh)
731     TextLabelElements->setText(tr("SMESH_NAME"));
732   else
733     TextLabelElements->setText(tr("SMESH_ID_ELEMENTS"));
734   myElemFilterBtn->setEnabled(!toSelectMesh);
735
736   if (myEditCurrentArgument != LineEditElements &&
737       myEditCurrentArgument != LineEditNodes) {
738     LineEditElements->clear();
739     LineEditNodes->clear();
740     return;
741   }
742
743   mySelectionMgr->clearFilters();
744   SMESH::SetPointRepresentation(false);
745
746   if (toSelectMesh) {
747     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
748       aViewWindow->SetSelectionMode(ActorSelection);
749     //    mySelectionMgr->setSelectionModes(ActorSelection);
750     mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
751     myEditCurrentArgument->setReadOnly(true);
752     myEditCurrentArgument->setValidator(0);
753   } else {
754     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
755       aViewWindow->SetSelectionMode(myEditCurrentArgument == LineEditElements ? FaceSelection 
756                                                                               : NodeSelection );
757     myEditCurrentArgument->setReadOnly(false);
758     LineEditElements->setValidator(myIdValidator);
759     onTextChange(myEditCurrentArgument->text());
760   }
761
762   SelectionIntoArgument();
763 }
764
765 //=================================================================================
766 // function : keyPressEvent()
767 // purpose  :
768 //=================================================================================
769 void SMESHGUI_SmoothingDlg::keyPressEvent( QKeyEvent* e )
770 {
771   QDialog::keyPressEvent( e );
772   if ( e->isAccepted() )
773     return;
774
775   if ( e->key() == Qt::Key_F1 ) {
776     e->accept();
777     ClickOnHelp();
778   }
779 }
780
781 //=================================================================================
782 // function : setFilters()
783 // purpose  : activate filter dialog
784 //=================================================================================
785 void SMESHGUI_SmoothingDlg::setFilters( const bool theIsElem )
786 {
787   if(myMesh->_is_nil()) {
788     SUIT_MessageBox::critical(this,
789                               tr("SMESH_ERROR"),
790                               tr("NO_MESH_SELECTED"));
791    return;
792   }
793   if ( !myFilterDlg )
794   {
795     QList<int> types;  
796     types.append( SMESH::NODE );
797     types.append( SMESH::ALL );
798     myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, types );
799   }
800   myFilterDlg->Init( theIsElem ? SMESH::ALL : SMESH::NODE );
801
802   myFilterDlg->SetSelection();
803   myFilterDlg->SetMesh( myMesh );
804   myFilterDlg->SetSourceWg( theIsElem ? LineEditElements : LineEditNodes );
805
806   myFilterDlg->show();
807 }
808
809 //=================================================================================
810 // function : setElemFilters()
811 // purpose  : SLOT. Called when element "Filter" button pressed.
812 //=================================================================================
813 void SMESHGUI_SmoothingDlg::setElemFilters()
814 {
815   setFilters( true );
816 }
817
818 //=================================================================================
819 // function : setNodeFilters()
820 // purpose  : SLOT. Called when node "Filter" button pressed.
821 //=================================================================================
822 void SMESHGUI_SmoothingDlg::setNodeFilters()
823 {
824   setFilters( false );
825 }
826
827 //=================================================================================
828 // function : isValid
829 // purpose  :
830 //=================================================================================
831 bool SMESHGUI_SmoothingDlg::isValid()
832 {
833   QString msg;
834   bool ok = true;
835   ok = SpinBox_IterationLimit->isValid( msg, true ) && ok;
836   ok = SpinBox_AspectRatio->isValid( msg, true ) && ok;
837
838   if( !ok ) {
839     QString str( tr( "SMESH_INCORRECT_INPUT" ) );
840     if ( !msg.isEmpty() )
841       str += "\n" + msg;
842     SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
843     return false;
844   }
845   return true;
846 }