Salome HOME
fix PAL15161 (Mesh to pass through a point - preview works wrong for the submesh...
[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 #include CORBA_SERVER_HEADER(SMESH_MeshEditor)
40
41 // QT Includes
42 #include <qapplication.h>
43 #include <qbuttongroup.h>
44 #include <qgroupbox.h>
45 #include <qlabel.h>
46 #include <qlineedit.h>
47 #include <qpushbutton.h>
48 #include <qradiobutton.h>
49 #include <qlayout.h>
50 #include <qpixmap.h>
51
52 //=================================================================================
53 // class    : SMESHGUI_EditMeshDlg()
54 // purpose  :
55 //=================================================================================
56 SMESHGUI_EditMeshDlg::SMESHGUI_EditMeshDlg (SMESHGUI* theModule,
57                                             const char* title, const char* icon,
58                                             int theAction)
59   : QDialog(SMESH::GetDesktop(theModule), "SMESHGUI_EditMeshDlg", false, WStyle_Customize |
60             WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose),
61     mySMESHGUI(theModule),
62     mySelectionMgr(SMESH::GetSelectionMgr(theModule)),
63     myAction(theAction)
64 {
65   resize(303, 185);
66   setCaption(tr(title));
67
68   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
69   QPixmap image0 (aResMgr->loadPixmap("SMESH", tr(icon)));
70   QPixmap image1 (aResMgr->loadPixmap("SMESH", tr("ICON_SELECT")));
71
72   setSizeGripEnabled(TRUE);
73   DlgLayout = new QGridLayout (this);
74   DlgLayout->setSpacing(6);
75   DlgLayout->setMargin(11);
76
77   /***************************************************************/
78   GroupConstructors = new QButtonGroup (this, "GroupConstructors");
79   GroupConstructors->setExclusive(TRUE);
80   GroupConstructors->setColumnLayout(0, Qt::Vertical);
81   GroupConstructors->layout()->setSpacing(0);
82   GroupConstructors->layout()->setMargin(0);
83   GroupConstructorsLayout = new QGridLayout (GroupConstructors->layout());
84   GroupConstructorsLayout->setAlignment(Qt::AlignTop);
85   GroupConstructorsLayout->setSpacing(6);
86   GroupConstructorsLayout->setMargin(11);
87   Constructor1 = new QRadioButton (GroupConstructors, "Constructor1");
88   Constructor1->setText(tr(""));
89   Constructor1->setPixmap(image0);
90   Constructor1->setChecked(TRUE);
91   Constructor1->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)1,
92                                           (QSizePolicy::SizeType)0,
93                                           Constructor1->sizePolicy().hasHeightForWidth()));
94   Constructor1->setMinimumSize(QSize(50, 0));
95   GroupConstructorsLayout->addWidget(Constructor1, 0, 0);
96   QSpacerItem* spacer = new QSpacerItem (20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
97   GroupConstructorsLayout->addItem(spacer, 0, 1);
98   DlgLayout->addWidget(GroupConstructors, 0, 0);
99
100   /***************************************************************/
101   GroupButtons = new QGroupBox (this, "GroupButtons");
102   GroupButtons->setGeometry(QRect(10, 10, 281, 48));
103   GroupButtons->setTitle(tr("" ));
104   GroupButtons->setColumnLayout(0, Qt::Vertical);
105   GroupButtons->layout()->setSpacing(0);
106   GroupButtons->layout()->setMargin(0);
107   GroupButtonsLayout = new QGridLayout (GroupButtons->layout());
108   GroupButtonsLayout->setAlignment(Qt::AlignTop);
109   GroupButtonsLayout->setSpacing(6);
110   GroupButtonsLayout->setMargin(11);
111   buttonHelp = new QPushButton(GroupButtons, "buttonHelp");
112   buttonHelp->setText(tr("SMESH_BUT_HELP" ));
113   buttonHelp->setAutoDefault(TRUE);
114   GroupButtonsLayout->addWidget(buttonHelp, 0, 4);
115   buttonCancel = new QPushButton (GroupButtons, "buttonCancel");
116   buttonCancel->setText(tr("SMESH_BUT_CLOSE" ));
117   buttonCancel->setAutoDefault(TRUE);
118   GroupButtonsLayout->addWidget(buttonCancel, 0, 3);
119   buttonApply = new QPushButton (GroupButtons, "buttonApply");
120   buttonApply->setText(tr("SMESH_BUT_APPLY" ));
121   buttonApply->setAutoDefault(TRUE);
122   GroupButtonsLayout->addWidget(buttonApply, 0, 1);
123   QSpacerItem* spacer_9 = new QSpacerItem (20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
124   GroupButtonsLayout->addItem(spacer_9, 0, 2);
125   buttonOk = new QPushButton (GroupButtons, "buttonOk");
126   buttonOk->setText(tr("SMESH_BUT_OK" ));
127   buttonOk->setAutoDefault(TRUE);
128   buttonOk->setDefault(TRUE);
129   GroupButtonsLayout->addWidget(buttonOk, 0, 0);
130   DlgLayout->addWidget(GroupButtons, 2, 0);
131
132   /***************************************************************/
133   GroupMesh = new QGroupBox (this, "GroupMesh");
134   GroupMesh->setTitle(tr("SMESH_MESH" ));
135   GroupMesh->setMinimumSize(QSize(0, 0));
136   GroupMesh->setFrameShape(QGroupBox::Box);
137   GroupMesh->setFrameShadow(QGroupBox::Sunken);
138   GroupMesh->setColumnLayout(0, Qt::Vertical);
139   GroupMesh->layout()->setSpacing(0);
140   GroupMesh->layout()->setMargin(0);
141   GroupMeshLayout = new QGridLayout (GroupMesh->layout());
142   GroupMeshLayout->setAlignment(Qt::AlignTop);
143   GroupMeshLayout->setSpacing(6);
144   GroupMeshLayout->setMargin(11);
145   TextLabelMesh = new QLabel (GroupMesh, "TextLabelMesh");
146   TextLabelMesh->setText(tr("SMESH_MESH"));
147   TextLabelMesh->setMinimumSize(QSize(50, 0));
148   TextLabelMesh->setFrameShape(QLabel::NoFrame);
149   TextLabelMesh->setFrameShadow(QLabel::Plain);
150   GroupMeshLayout->addWidget(TextLabelMesh, 0, 0);
151   SelectButton = new QPushButton (GroupMesh, "SelectButton");
152   SelectButton->setText(tr(""));
153   SelectButton->setPixmap(image1);
154   SelectButton->setToggleButton(FALSE);
155   GroupMeshLayout->addWidget(SelectButton, 0, 1);
156   LineEditMesh = new QLineEdit (GroupMesh, "LineEditMesh");
157   LineEditMesh->setReadOnly(true);
158   GroupMeshLayout->addWidget(LineEditMesh, 0, 2);
159   DlgLayout->addWidget(GroupMesh, 1, 0);
160
161   myHelpFileName = "merge_elements.htm";
162
163   Init(); // Initialisations
164 }
165
166 //=================================================================================
167 // function : ~SMESHGUI_EditMeshDlg()
168 // purpose  : Destroys the object and frees any allocated resources
169 //=================================================================================
170 SMESHGUI_EditMeshDlg::~SMESHGUI_EditMeshDlg()
171 {
172   // no need to delete child widgets, Qt does it all for us
173 }
174
175 //=================================================================================
176 // function : Init()
177 // purpose  :
178 //=================================================================================
179 void SMESHGUI_EditMeshDlg::Init()
180 {
181   GroupMesh->show();
182   mySMESHGUI->SetActiveDialogBox((QDialog*)this);
183
184   myMesh = SMESH::SMESH_Mesh::_nil();
185
186   myMeshFilter = new SMESH_TypeFilter (MESH);
187
188   // signals and slots connections
189   connect(buttonOk    , SIGNAL(clicked()), this, SLOT(ClickOnOk()));
190   connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
191   connect(buttonApply , SIGNAL(clicked()), this, SLOT(ClickOnApply()));
192   connect(buttonHelp,   SIGNAL(clicked()), this, SLOT(ClickOnHelp()));
193
194   connect(SelectButton, SIGNAL(clicked()), this, SLOT(SelectionIntoArgument()));
195
196   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
197
198   connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
199   connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs())       , this, SLOT(ClickOnCancel()));
200
201   this->show(); // displays Dialog
202
203   LineEditMesh->setFocus();
204   mySelectionMgr->clearFilters();
205   mySelectionMgr->installFilter(myMeshFilter);
206
207   SelectionIntoArgument();
208 }
209
210 //=================================================================================
211 // function : ClickOnApply()
212 // purpose  :
213 //=================================================================================
214 void SMESHGUI_EditMeshDlg::ClickOnApply()
215 {
216   if (!myMesh->_is_nil()) {
217     try {
218       QApplication::setOverrideCursor(Qt::waitCursor);
219
220       if (myAction == 1) {
221         SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
222         aMeshEditor->MergeEqualElements();
223       }
224
225       QApplication::restoreOverrideCursor();
226     } catch(...) {
227     }
228
229     //mySelectionMgr->clearSelected();
230     SMESH::UpdateView();
231   }
232 }
233
234 //=================================================================================
235 // function : ClickOnOk()
236 // purpose  :
237 //=================================================================================
238 void SMESHGUI_EditMeshDlg::ClickOnOk()
239 {
240   ClickOnApply();
241   ClickOnCancel();
242 }
243
244 //=================================================================================
245 // function : ClickOnCancel()
246 // purpose  :
247 //=================================================================================
248 void SMESHGUI_EditMeshDlg::ClickOnCancel()
249 {
250   //mySelectionMgr->clearSelected();
251   mySelectionMgr->clearFilters();
252   disconnect(mySelectionMgr, 0, this, 0);
253   mySMESHGUI->ResetState();
254   reject();
255 }
256
257 //=================================================================================
258 // function : ClickOnHelp()
259 // purpose  :
260 //=================================================================================
261 void SMESHGUI_EditMeshDlg::ClickOnHelp()
262 {
263   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
264   if (app) 
265     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
266   else {
267     SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
268                            QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
269                            arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(myHelpFileName),
270                            QObject::tr("BUT_OK"));
271   }
272 }
273
274 //=================================================================================
275 // function : SelectionIntoArgument()
276 // purpose  : Called when selection as changed or other case
277 //=================================================================================
278 void SMESHGUI_EditMeshDlg::SelectionIntoArgument()
279 {
280   if (!GroupButtons->isEnabled()) // inactive
281     return;
282
283   QString aString = "";
284
285   SALOME_ListIO aList;
286   mySelectionMgr->selectedObjects(aList);
287   int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
288
289   // mesh
290   if (nbSel != 1) {
291     myMesh = SMESH::SMESH_Mesh::_nil();
292     aString = "";
293   } else {
294     Handle(SALOME_InteractiveObject) IO = aList.First();
295     myMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO);
296     if (myMesh->_is_nil())
297       aString = "";
298   }
299
300   LineEditMesh->setText(aString);
301
302   bool isEnabled = (!myMesh->_is_nil());
303   buttonOk->setEnabled(isEnabled);
304   buttonApply->setEnabled(isEnabled);
305 }
306
307 //=================================================================================
308 // function : DeactivateActiveDialog()
309 // purpose  :
310 //=================================================================================
311 void SMESHGUI_EditMeshDlg::DeactivateActiveDialog()
312 {
313   if (GroupConstructors->isEnabled()) {
314     GroupConstructors->setEnabled(false);
315     GroupMesh->setEnabled(false);
316     GroupButtons->setEnabled(false);
317     mySMESHGUI->ResetState();
318     mySMESHGUI->SetActiveDialogBox(0);
319   }
320 }
321
322 //=================================================================================
323 // function : ActivateThisDialog()
324 // purpose  :
325 //=================================================================================
326 void SMESHGUI_EditMeshDlg::ActivateThisDialog()
327 {
328   /* Emit a signal to deactivate the active dialog */
329   mySMESHGUI->EmitSignalDeactivateDialog();
330   GroupConstructors->setEnabled(true);
331   GroupMesh->setEnabled(true);
332   GroupButtons->setEnabled(true);
333
334   mySMESHGUI->SetActiveDialogBox((QDialog*)this);
335   SelectionIntoArgument();
336 }
337
338 //=================================================================================
339 // function : enterEvent()
340 // purpose  :
341 //=================================================================================
342 void SMESHGUI_EditMeshDlg::enterEvent(QEvent* e)
343 {
344   if (GroupConstructors->isEnabled())
345     return;
346   ActivateThisDialog();
347 }
348
349 //=================================================================================
350 // function : closeEvent()
351 // purpose  :
352 //=================================================================================
353 void SMESHGUI_EditMeshDlg::closeEvent(QCloseEvent* e)
354 {
355   /* same than click on cancel button */
356   this->ClickOnCancel();
357 }
358
359 //=======================================================================
360 //function : hideEvent
361 //purpose  : caused by ESC key
362 //=======================================================================
363 void SMESHGUI_EditMeshDlg::hideEvent (QHideEvent * e)
364 {
365   if (!isMinimized())
366     ClickOnCancel();
367 }
368
369
370 //=================================================================================
371 // function : keyPressEvent()
372 // purpose  :
373 //=================================================================================
374 void SMESHGUI_EditMeshDlg::keyPressEvent( QKeyEvent* e )
375 {
376   QDialog::keyPressEvent( e );
377   if ( e->isAccepted() )
378     return;
379
380   if ( e->key() == Key_F1 )
381     {
382       e->accept();
383       ClickOnHelp();
384     }
385 }