Salome HOME
Fix bug 12796: Warning missed for the bad file 'test18.med'
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_EditMeshDlg.cxx
1 // Copyright (C) 2005  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
3 // 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either 
7 // version 2.1 of the License.
8 // 
9 // This library is distributed in the hope that it will be useful 
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
12 // Lesser General Public License for more details.
13 //
14 // You should have received a copy of the GNU Lesser General Public  
15 // License along with this library; if not, write to the Free Software 
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 //
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 //
20
21 #include "SMESHGUI_EditMeshDlg.h"
22
23 #include "SMESHGUI.h"
24 #include "SMESHGUI_Utils.h"
25 #include "SMESHGUI_VTKUtils.h"
26
27 #include "SMESH_TypeFilter.hxx"
28
29 #include "SUIT_Desktop.h"
30 #include "SUIT_Session.h"
31 #include "SUIT_MessageBox.h"
32
33 #include "LightApp_Application.h"
34
35 #include "SALOME_ListIO.hxx"
36
37 #include "utilities.h"
38
39 // QT Includes
40 #include <qapplication.h>
41 #include <qbuttongroup.h>
42 #include <qgroupbox.h>
43 #include <qlabel.h>
44 #include <qlineedit.h>
45 #include <qpushbutton.h>
46 #include <qradiobutton.h>
47 #include <qlayout.h>
48 #include <qpixmap.h>
49
50 //=================================================================================
51 // class    : SMESHGUI_EditMeshDlg()
52 // purpose  :
53 //=================================================================================
54 SMESHGUI_EditMeshDlg::SMESHGUI_EditMeshDlg (SMESHGUI* theModule,
55                                             const char* title, const char* icon,
56                                             int theAction)
57   : QDialog(SMESH::GetDesktop(theModule), "SMESHGUI_EditMeshDlg", false, WStyle_Customize |
58             WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose),
59     mySMESHGUI(theModule),
60     mySelectionMgr(SMESH::GetSelectionMgr(theModule)),
61     myAction(theAction)
62 {
63   resize(303, 185);
64   setCaption(tr(title));
65
66   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
67   QPixmap image0 (aResMgr->loadPixmap("SMESH", tr(icon)));
68   QPixmap image1 (aResMgr->loadPixmap("SMESH", tr("ICON_SELECT")));
69
70   setSizeGripEnabled(TRUE);
71   DlgLayout = new QGridLayout (this);
72   DlgLayout->setSpacing(6);
73   DlgLayout->setMargin(11);
74
75   /***************************************************************/
76   GroupConstructors = new QButtonGroup (this, "GroupConstructors");
77   GroupConstructors->setExclusive(TRUE);
78   GroupConstructors->setColumnLayout(0, Qt::Vertical);
79   GroupConstructors->layout()->setSpacing(0);
80   GroupConstructors->layout()->setMargin(0);
81   GroupConstructorsLayout = new QGridLayout (GroupConstructors->layout());
82   GroupConstructorsLayout->setAlignment(Qt::AlignTop);
83   GroupConstructorsLayout->setSpacing(6);
84   GroupConstructorsLayout->setMargin(11);
85   Constructor1 = new QRadioButton (GroupConstructors, "Constructor1");
86   Constructor1->setText(tr(""));
87   Constructor1->setPixmap(image0);
88   Constructor1->setChecked(TRUE);
89   Constructor1->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)1,
90                                           (QSizePolicy::SizeType)0,
91                                           Constructor1->sizePolicy().hasHeightForWidth()));
92   Constructor1->setMinimumSize(QSize(50, 0));
93   GroupConstructorsLayout->addWidget(Constructor1, 0, 0);
94   QSpacerItem* spacer = new QSpacerItem (20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
95   GroupConstructorsLayout->addItem(spacer, 0, 1);
96   DlgLayout->addWidget(GroupConstructors, 0, 0);
97
98   /***************************************************************/
99   GroupButtons = new QGroupBox (this, "GroupButtons");
100   GroupButtons->setGeometry(QRect(10, 10, 281, 48));
101   GroupButtons->setTitle(tr("" ));
102   GroupButtons->setColumnLayout(0, Qt::Vertical);
103   GroupButtons->layout()->setSpacing(0);
104   GroupButtons->layout()->setMargin(0);
105   GroupButtonsLayout = new QGridLayout (GroupButtons->layout());
106   GroupButtonsLayout->setAlignment(Qt::AlignTop);
107   GroupButtonsLayout->setSpacing(6);
108   GroupButtonsLayout->setMargin(11);
109   buttonHelp = new QPushButton(GroupButtons, "buttonHelp");
110   buttonHelp->setText(tr("SMESH_BUT_HELP" ));
111   buttonHelp->setAutoDefault(TRUE);
112   GroupButtonsLayout->addWidget(buttonHelp, 0, 4);
113   buttonCancel = new QPushButton (GroupButtons, "buttonCancel");
114   buttonCancel->setText(tr("SMESH_BUT_CLOSE" ));
115   buttonCancel->setAutoDefault(TRUE);
116   GroupButtonsLayout->addWidget(buttonCancel, 0, 3);
117   buttonApply = new QPushButton (GroupButtons, "buttonApply");
118   buttonApply->setText(tr("SMESH_BUT_APPLY" ));
119   buttonApply->setAutoDefault(TRUE);
120   GroupButtonsLayout->addWidget(buttonApply, 0, 1);
121   QSpacerItem* spacer_9 = new QSpacerItem (20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
122   GroupButtonsLayout->addItem(spacer_9, 0, 2);
123   buttonOk = new QPushButton (GroupButtons, "buttonOk");
124   buttonOk->setText(tr("SMESH_BUT_OK" ));
125   buttonOk->setAutoDefault(TRUE);
126   buttonOk->setDefault(TRUE);
127   GroupButtonsLayout->addWidget(buttonOk, 0, 0);
128   DlgLayout->addWidget(GroupButtons, 2, 0);
129
130   /***************************************************************/
131   GroupMesh = new QGroupBox (this, "GroupMesh");
132   GroupMesh->setTitle(tr("SMESH_MESH" ));
133   GroupMesh->setMinimumSize(QSize(0, 0));
134   GroupMesh->setFrameShape(QGroupBox::Box);
135   GroupMesh->setFrameShadow(QGroupBox::Sunken);
136   GroupMesh->setColumnLayout(0, Qt::Vertical);
137   GroupMesh->layout()->setSpacing(0);
138   GroupMesh->layout()->setMargin(0);
139   GroupMeshLayout = new QGridLayout (GroupMesh->layout());
140   GroupMeshLayout->setAlignment(Qt::AlignTop);
141   GroupMeshLayout->setSpacing(6);
142   GroupMeshLayout->setMargin(11);
143   TextLabelMesh = new QLabel (GroupMesh, "TextLabelMesh");
144   TextLabelMesh->setText(tr("SMESH_MESH"));
145   TextLabelMesh->setMinimumSize(QSize(50, 0));
146   TextLabelMesh->setFrameShape(QLabel::NoFrame);
147   TextLabelMesh->setFrameShadow(QLabel::Plain);
148   GroupMeshLayout->addWidget(TextLabelMesh, 0, 0);
149   SelectButton = new QPushButton (GroupMesh, "SelectButton");
150   SelectButton->setText(tr(""));
151   SelectButton->setPixmap(image1);
152   SelectButton->setToggleButton(FALSE);
153   GroupMeshLayout->addWidget(SelectButton, 0, 1);
154   LineEditMesh = new QLineEdit (GroupMesh, "LineEditMesh");
155   LineEditMesh->setReadOnly(true);
156   GroupMeshLayout->addWidget(LineEditMesh, 0, 2);
157   DlgLayout->addWidget(GroupMesh, 1, 0);
158
159   myHelpFileName = "merge_elements.htm";
160
161   Init(); // Initialisations
162 }
163
164 //=================================================================================
165 // function : ~SMESHGUI_EditMeshDlg()
166 // purpose  : Destroys the object and frees any allocated resources
167 //=================================================================================
168 SMESHGUI_EditMeshDlg::~SMESHGUI_EditMeshDlg()
169 {
170   // no need to delete child widgets, Qt does it all for us
171 }
172
173 //=================================================================================
174 // function : Init()
175 // purpose  :
176 //=================================================================================
177 void SMESHGUI_EditMeshDlg::Init()
178 {
179   GroupMesh->show();
180   mySMESHGUI->SetActiveDialogBox((QDialog*)this);
181
182   myMesh = SMESH::SMESH_Mesh::_nil();
183
184   myMeshFilter = new SMESH_TypeFilter (MESH);
185
186   // signals and slots connections
187   connect(buttonOk    , SIGNAL(clicked()), this, SLOT(ClickOnOk()));
188   connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
189   connect(buttonApply , SIGNAL(clicked()), this, SLOT(ClickOnApply()));
190   connect(buttonHelp,   SIGNAL(clicked()), this, SLOT(ClickOnHelp()));
191
192   connect(SelectButton, SIGNAL(clicked()), this, SLOT(SelectionIntoArgument()));
193
194   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
195
196   connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
197   connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs())       , this, SLOT(ClickOnCancel()));
198
199   this->show(); // displays Dialog
200
201   LineEditMesh->setFocus();
202   mySelectionMgr->clearFilters();
203   mySelectionMgr->installFilter(myMeshFilter);
204
205   SelectionIntoArgument();
206 }
207
208 //=================================================================================
209 // function : ClickOnApply()
210 // purpose  :
211 //=================================================================================
212 void SMESHGUI_EditMeshDlg::ClickOnApply()
213 {
214   if (!myMesh->_is_nil()) {
215     try {
216       QApplication::setOverrideCursor(Qt::waitCursor);
217
218       if (myAction == 1) {
219         SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
220         aMeshEditor->MergeEqualElements();
221       }
222
223       QApplication::restoreOverrideCursor();
224     } catch(...) {
225     }
226
227     //mySelectionMgr->clearSelected();
228     SMESH::UpdateView();
229   }
230 }
231
232 //=================================================================================
233 // function : ClickOnOk()
234 // purpose  :
235 //=================================================================================
236 void SMESHGUI_EditMeshDlg::ClickOnOk()
237 {
238   ClickOnApply();
239   ClickOnCancel();
240 }
241
242 //=================================================================================
243 // function : ClickOnCancel()
244 // purpose  :
245 //=================================================================================
246 void SMESHGUI_EditMeshDlg::ClickOnCancel()
247 {
248   //mySelectionMgr->clearSelected();
249   mySelectionMgr->clearFilters();
250   disconnect(mySelectionMgr, 0, this, 0);
251   mySMESHGUI->ResetState();
252   reject();
253 }
254
255 //=================================================================================
256 // function : ClickOnHelp()
257 // purpose  :
258 //=================================================================================
259 void SMESHGUI_EditMeshDlg::ClickOnHelp()
260 {
261   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
262   if (app) 
263     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
264   else {
265     SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
266                            QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
267                            arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(myHelpFileName),
268                            QObject::tr("BUT_OK"));
269   }
270 }
271
272 //=================================================================================
273 // function : SelectionIntoArgument()
274 // purpose  : Called when selection as changed or other case
275 //=================================================================================
276 void SMESHGUI_EditMeshDlg::SelectionIntoArgument()
277 {
278   if (!GroupButtons->isEnabled()) // inactive
279     return;
280
281   QString aString = "";
282
283   SALOME_ListIO aList;
284   mySelectionMgr->selectedObjects(aList);
285   int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
286
287   // mesh
288   if (nbSel != 1) {
289     myMesh = SMESH::SMESH_Mesh::_nil();
290     aString = "";
291   } else {
292     Handle(SALOME_InteractiveObject) IO = aList.First();
293     myMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO);
294     if (myMesh->_is_nil())
295       aString = "";
296   }
297
298   LineEditMesh->setText(aString);
299
300   bool isEnabled = (!myMesh->_is_nil());
301   buttonOk->setEnabled(isEnabled);
302   buttonApply->setEnabled(isEnabled);
303 }
304
305 //=================================================================================
306 // function : DeactivateActiveDialog()
307 // purpose  :
308 //=================================================================================
309 void SMESHGUI_EditMeshDlg::DeactivateActiveDialog()
310 {
311   if (GroupConstructors->isEnabled()) {
312     GroupConstructors->setEnabled(false);
313     GroupMesh->setEnabled(false);
314     GroupButtons->setEnabled(false);
315     mySMESHGUI->ResetState();
316     mySMESHGUI->SetActiveDialogBox(0);
317   }
318 }
319
320 //=================================================================================
321 // function : ActivateThisDialog()
322 // purpose  :
323 //=================================================================================
324 void SMESHGUI_EditMeshDlg::ActivateThisDialog()
325 {
326   /* Emit a signal to deactivate the active dialog */
327   mySMESHGUI->EmitSignalDeactivateDialog();
328   GroupConstructors->setEnabled(true);
329   GroupMesh->setEnabled(true);
330   GroupButtons->setEnabled(true);
331
332   mySMESHGUI->SetActiveDialogBox((QDialog*)this);
333   SelectionIntoArgument();
334 }
335
336 //=================================================================================
337 // function : enterEvent()
338 // purpose  :
339 //=================================================================================
340 void SMESHGUI_EditMeshDlg::enterEvent(QEvent* e)
341 {
342   if (GroupConstructors->isEnabled())
343     return;
344   ActivateThisDialog();
345 }
346
347 //=================================================================================
348 // function : closeEvent()
349 // purpose  :
350 //=================================================================================
351 void SMESHGUI_EditMeshDlg::closeEvent(QCloseEvent* e)
352 {
353   /* same than click on cancel button */
354   this->ClickOnCancel();
355 }
356
357 //=======================================================================
358 //function : hideEvent
359 //purpose  : caused by ESC key
360 //=======================================================================
361 void SMESHGUI_EditMeshDlg::hideEvent (QHideEvent * e)
362 {
363   if (!isMinimized())
364     ClickOnCancel();
365 }
366
367
368 //=================================================================================
369 // function : keyPressEvent()
370 // purpose  :
371 //=================================================================================
372 void SMESHGUI_EditMeshDlg::keyPressEvent( QKeyEvent* e )
373 {
374   QDialog::keyPressEvent( e );
375   if ( e->isAccepted() )
376     return;
377
378   if ( e->key() == Key_F1 )
379     {
380       e->accept();
381       ClickOnHelp();
382     }
383 }