Salome HOME
Merge remote branch 'origin/V8_5_asterstudy'
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_Operation.cxx
1 // Copyright (C) 2007-2016  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, or (at your option) any later version.
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 //  File   : SMESHGUI_Operation.cxx
23 //  Author : Sergey LITONIN, Open CASCADE S.A.S.
24
25 #include "SMESHGUI_Operation.h"
26
27 #include "SMESHGUI.h"
28 #include "SMESHGUI_Dialog.h"
29
30 // SALOME GUI includes
31 #include <SalomeApp_Study.h>
32 #include <LightApp_Application.h>
33
34 #include <SUIT_Session.h>
35 #include <SUIT_MessageBox.h>
36 #include <SUIT_Desktop.h>
37 #include <SUIT_ResourceMgr.h>
38
39 // Qt includes
40 #include <QStringList>
41
42 /*
43   Class       : SMESHGUI_Operation
44   Description : Base class for all SMESH operations
45 */
46
47 //=======================================================================
48 // name    : SMESHGUI_Operation
49 // Purpose : Constructor
50 //=======================================================================
51 SMESHGUI_Operation::SMESHGUI_Operation()
52 : LightApp_Operation(),
53   myIsApplyAndClose( false )
54 {
55   myHelpFileName = "";
56 }
57
58 //=======================================================================
59 // name    : ~SMESHGUI_Operation
60 // Purpose : Destructor
61 //=======================================================================
62 SMESHGUI_Operation::~SMESHGUI_Operation()
63 {
64 }
65
66 //=======================================================================
67 // name    : getSMESHGUI
68 // Purpose : Get SMESH module
69 //=======================================================================
70 SMESHGUI* SMESHGUI_Operation::getSMESHGUI() const
71 {
72   return dynamic_cast<SMESHGUI*>( module() );
73 }
74
75 //=======================================================================
76 // name    : startOperation
77 // Purpose : Start operation
78 //=======================================================================
79 void SMESHGUI_Operation::startOperation()
80 {
81   if( dlg() )
82   {
83     disconnect( dlg(), SIGNAL( dlgOk() ), this, SLOT( onOk() ) );
84     disconnect( dlg(), SIGNAL( dlgApply() ), this, SLOT( onApply() ) );
85     disconnect( dlg(), SIGNAL( dlgCancel() ), this, SLOT( onCancel() ) );
86     disconnect( dlg(), SIGNAL( dlgClose() ), this, SLOT( onCancel() ) );
87     disconnect( dlg(), SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) );
88
89     if( dlg()->testButtonFlags( QtxDialog::OK ) )
90       connect( dlg(), SIGNAL( dlgOk() ), this, SLOT( onOk() ) );
91
92     if( dlg()->testButtonFlags( QtxDialog::Apply ) )
93       connect( dlg(), SIGNAL( dlgApply() ), this, SLOT( onApply() ) );
94
95     if( dlg()->testButtonFlags( QtxDialog::Cancel ) )
96       connect( dlg(), SIGNAL( dlgCancel() ), this, SLOT( onCancel() ) );
97
98     if( dlg()->testButtonFlags( QtxDialog::Help ) )
99       connect( dlg(), SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) );
100
101     //if( dlg()->testButtonFlags( QtxDialog::Close ) )
102     //if dialog hasn't close, cancel, no and etc buttons, dlgClose will be emitted when dialog is closed not by OK
103     connect( dlg(), SIGNAL( dlgClose() ), this, SLOT( onCancel() ) );
104
105     initDialog();
106   }
107
108   LightApp_Operation::startOperation();
109 }
110
111 //=======================================================================
112 // name    : isReadyToStart
113 // Purpose : Verify whether operation is ready to start
114 //=======================================================================
115 bool SMESHGUI_Operation::isReadyToStart() const
116 {
117   if ( !LightApp_Operation::isReadyToStart() )
118     return false;
119   else if ( getSMESHGUI() == 0 )
120   {
121     SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
122                               tr( "NO_MODULE" ) );
123     return false;
124   }
125   else if ( SMESHGUI::isStudyLocked() )
126     return false;
127
128   return true;
129 }
130
131 //=======================================================================
132 // name    : setDialogActive
133 // Purpose :
134 //=======================================================================
135 void SMESHGUI_Operation::setDialogActive( const bool active )
136 {
137   LightApp_Operation::setDialogActive( active );
138
139   SMESHGUI_Dialog* d = dynamic_cast<SMESHGUI_Dialog*>( dlg() );
140   if( d )
141     d->setContentActive( active );
142
143 }
144
145 //=======================================================================
146 // name    : onOk
147 // Purpose :
148 //=======================================================================
149 void SMESHGUI_Operation::onOk()
150 {
151   setIsApplyAndClose( true );
152   if( onApply() )
153     commit();
154   setIsApplyAndClose( false );
155   //else
156   //  abort();
157 }
158
159 //=======================================================================
160 // name    : onApply
161 // Purpose :
162 //=======================================================================
163 bool SMESHGUI_Operation::onApply()
164 {
165   return false;
166 }
167
168 //=======================================================================
169 // name    : onClose
170 // Purpose :
171 //=======================================================================
172 void SMESHGUI_Operation::onCancel()
173 {
174   abort();
175 }
176
177 //=======================================================================
178 // name    : onHelp
179 // Purpose :
180 //=======================================================================
181 void SMESHGUI_Operation::onHelp()
182 {
183   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
184   if (app)
185     app->onHelpContextModule(getSMESHGUI() ? app->moduleName(getSMESHGUI()->moduleName()) : QString(""), myHelpFileName);
186   else {
187     QString platform;
188 #ifdef WIN32
189     platform = "winapplication";
190 #else
191     platform = "application";
192 #endif
193     SUIT_MessageBox::warning( desktop(), tr("WRN_WARNING"),
194                               tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
195                               arg(app->resourceMgr()->stringValue("ExternalBrowser",
196                                                                   platform)).
197                               arg(myHelpFileName) );
198   }
199 }
200
201 //=======================================================================
202 // name    : initDialog
203 // Purpose :
204 //=======================================================================
205 void SMESHGUI_Operation::initDialog()
206 {
207 }
208
209 //================================================================
210 // name    : setIsApplyAndClose
211 // Purpose : Set value of the flag indicating that the dialog is
212 //           accepted by Apply & Close button
213 //================================================================
214 void SMESHGUI_Operation::setIsApplyAndClose( const bool theFlag )
215 {
216   myIsApplyAndClose = theFlag;
217 }
218
219 //================================================================
220 // name    : isApplyAndClose
221 // Purpose : Get value of the flag indicating that the dialog is
222 //           accepted by Apply & Close button
223 //================================================================
224 bool SMESHGUI_Operation::isApplyAndClose() const
225 {
226   return myIsApplyAndClose;
227 }
228
229 /*!
230  * \brief Verifies whether given operator is valid for this one
231   * \param theOtherOp - other operation
232   * \return Returns TRUE if the given operator is valid for this one, FALSE otherwise
233 *
234 * Virtual method redefined from base class verifies whether given operator is valid for
235 * this one (i.e. can be started "above" this operator). In current implementation method
236 * returns false if theOtherOp operation is not intended for deleting objects or mesh
237 * elements.
238 */
239 bool SMESHGUI_Operation::isValid( SUIT_Operation* theOtherOp ) const
240 {
241   static QStringList anOps;
242   if ( anOps.count() == 0 )
243   {
244     anOps.append( "SMESHGUI_DeleteOp" );
245     // to do add other operations here
246   }
247
248   return ( theOtherOp &&
249          ( ( theOtherOp->inherits("SMESHGUI_Operation") && ( !anOps.contains(theOtherOp->metaObject()->className() ) || anOps.contains(metaObject()->className()) ) ) ||
250            ( theOtherOp->inherits("LightApp_ShowHideOp") ) ) );
251
252   return true;
253 }