Salome HOME
49d37af618b868bc474d8e414f707bec7953f387
[modules/jobmanager.git] / src / genericgui / BL_GenericGui.cxx
1 //  Copyright (C) 2009 CEA/DEN, EDF R&D
2 //
3 //  This library is free software; you can redistribute it and/or
4 //  modify it under the terms of the GNU Lesser General Public
5 //  License as published by the Free Software Foundation; either
6 //  version 2.1 of the License.
7 //
8 //  This library is distributed in the hope that it will be useful,
9 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 //  Lesser General Public License for more details.
12 //
13 //  You should have received a copy of the GNU Lesser General Public
14 //  License along with this library; if not, write to the Free Software
15 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "BL_GenericGui.hxx"
21
22 BL::GenericGui::GenericGui(BL::MainWindows_Wrap * wrapper) : QObject(wrapper->getDockParent())
23 {
24   DEBTRACE("Creating BL::GenericGui");
25   BL_ASSERT(wrapper);
26   _wrapper = wrapper;
27   _row_selected = -1;
28   _job_name_selected = "";
29
30   _dock_parent = _wrapper->getDockParent();
31   _tab_parent  = _wrapper->getTabParent();
32
33   _salome_services = new BL::SALOMEServices();
34   if (_salome_services->initNS() == false)
35     DEBMSG("WARNING !!!!! SALOME IS NOT REACHABLE !!!!");
36   _jobs_manager = new BL::JobsManager_QT(_dock_parent, _salome_services);
37   _model_manager = new BL::QModelManager(this, _jobs_manager);
38
39   _model = _model_manager->getModel();
40
41   // ---- Adding different GUI parts
42
43   /* Buttons */
44   _buttons = new BL::Buttons(_tab_parent);
45   _buttons->setCreateButtonSlot(this, SLOT(create_job()));
46   _buttons->setStartButtonSlot(this, SLOT(start_job()));
47   _buttons->setDeleteButtonSlot(this, SLOT(delete_job()));
48   _buttons->setRefreshButtonSlot(this, SLOT(refresh_job()));
49   _buttons->setGetResultsButtonSlot(this, SLOT(get_results_job()));
50
51   /* Jobs Table */
52   _jobs_table = new BL::JobsTable(_tab_parent);
53   _jobs_table->setModel(_model);
54
55   /* Job Tab */
56   _job_tab = new BL::JobTab(_tab_parent, _jobs_manager);
57   _job_tab->setModel(_model);
58
59   /* Tab Central Widget */
60   QWidget * central_widget = new QWidget(_tab_parent);
61
62   QSplitter * tab_central_widget = new QSplitter(Qt::Vertical, central_widget);
63   tab_central_widget->addWidget(_jobs_table);
64   tab_central_widget->addWidget(_job_tab);
65   tab_central_widget->setChildrenCollapsible(false);
66
67   QVBoxLayout * central_layout = new QVBoxLayout;
68   central_layout->addWidget(_buttons);
69   central_layout->addWidget(tab_central_widget);
70   central_widget->setLayout(central_layout);
71
72   _tab_parent->setCentralWidget(central_widget);
73   // Test tab
74   //QDockWidget * dw_main = new QDockWidget(_tab_parent);
75   //dw_main->setWidget(central_widget);
76   //_tab_parent->addDockWidget(Qt::LeftDockWidgetArea, dw_main);
77
78   /* Summary */
79   _dw_summary = new QDockWidget(_dock_parent);
80   _dw_summary->setWindowTitle("Summary");
81   _summary = new BL::Summary(_dock_parent, _jobs_manager);
82   _summary->setModel(_model);
83   _dw_summary->setWidget(_summary);
84
85   /* MachineCatalog */
86   _dw_machine_catalog = new QDockWidget(_dock_parent);
87   _dw_machine_catalog->setWindowTitle("Machine Catalog");
88   _machine_catalog = new BL::MachineCatalog(_dock_parent, _salome_services);
89   _dw_machine_catalog->setWidget(_machine_catalog);
90
91   /* Main Dock Window */
92   _dock_parent->addDockWidget(Qt::RightDockWidgetArea, _jobs_manager);
93   _dock_parent->addDockWidget(Qt::RightDockWidgetArea, _dw_summary);
94   _dock_parent->addDockWidget(Qt::RightDockWidgetArea, _dw_machine_catalog);
95   _dock_parent->splitDockWidget(_jobs_manager, _dw_summary, Qt::Vertical);
96   _dock_parent->tabifyDockWidget(_dw_summary, _dw_machine_catalog);
97
98   /* Signals and Slots */
99
100   // JobsManager -> Model
101   connect(_jobs_manager, SIGNAL(new_job_added(QString)), _model_manager, SLOT(new_job_added(QString)));
102   connect(_jobs_manager, SIGNAL(job_state_changed(QString)), _model_manager, SLOT(job_state_changed(QString)));
103   connect(_jobs_manager, SIGNAL(job_state_changed(QString)), this, SLOT(job_state_changed(QString)));
104
105   // Model -> X
106   connect(_model, SIGNAL(rowsInserted(QModelIndex, int, int)), _summary, SLOT(rowsInserted(QModelIndex, int, int)));
107   connect(_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), _summary, SLOT(rowsRemoved(QModelIndex, int, int)));
108   connect(_model, SIGNAL(itemChanged(QStandardItem*)), _summary, SLOT(itemChanged(QStandardItem*)));
109   connect(_model, SIGNAL(itemChanged(QStandardItem*)), _job_tab, SLOT(itemChanged(QStandardItem*)));
110
111   // TableView -> X
112   connect(_jobs_table, SIGNAL(clicked(QModelIndex)), _job_tab, SLOT(job_selected(QModelIndex)));
113   connect(_jobs_table, SIGNAL(clicked(QModelIndex)), this, SLOT(job_selected(QModelIndex)));
114   connect(_jobs_table, SIGNAL(clicked(QModelIndex)), _model_manager, SLOT(job_selected(QModelIndex)));
115
116   // Delete Job -> X
117   connect(this, SIGNAL(job_deleted(QString)), _job_tab, SLOT(reset(QString)));
118 }
119
120 BL::GenericGui::~GenericGui()
121 {
122   DEBTRACE("Destroying BL::GenericGui");
123
124   delete _salome_services;
125 }
126
127 void 
128 BL::GenericGui::showDockWidgets(bool isVisible)
129 {
130   DEBTRACE("BL::GenericGui::showDockWidgets " << isVisible);
131   if (_jobs_manager) _jobs_manager->setVisible(isVisible);
132   if (_dw_summary) _dw_summary->setVisible(isVisible);
133   if (_dw_machine_catalog) _dw_machine_catalog->setVisible(isVisible);
134 }
135
136 void
137 BL::GenericGui::createActions()
138 {
139   DEBTRACE("CreateActions BL::GenericGui");
140   _create_job_action = _wrapper->createAction("Create Job", QIcon(), "Create Job", "Create Job", 0, _dock_parent, false, this, SLOT(create_job()));
141   _start_job_action = _wrapper->createAction("Start Job", QIcon(), "Start Job", "Start Job", 0, _dock_parent, false, this, SLOT(start_job()));
142   _delete_job_action = _wrapper->createAction("Delete Job", QIcon(), "Delete Job", "Delete Job", 0, _dock_parent, false, this, SLOT(delete_job()));
143   _refresh_job_action = _wrapper->createAction("Refresh Job", QIcon(), "Refresh Job", "Refresh Job", 0, _dock_parent, false, this, SLOT(refresh_job()));
144   _get_results_job_action = _wrapper->createAction("Get Job Results", QIcon(), "Get Job Results", "Get Job Results", 0, _dock_parent, false, this, SLOT(refresh_job()));
145 }
146
147 void
148 BL::GenericGui::createMenus()
149 {
150   DEBTRACE("CreateMenus BL::GenericGui");
151   int menu_id = _wrapper->createTopMenu("JobManager");
152   _wrapper->addActionToMenu(_create_job_action, menu_id);
153   _wrapper->addActionToMenu(_start_job_action, menu_id);
154   _wrapper->addActionToMenu(_delete_job_action, menu_id);
155   _wrapper->addActionToMenu(_get_results_job_action, menu_id);
156   _wrapper->addActionToMenu(_refresh_job_action, menu_id);
157 }
158
159 void
160 BL::GenericGui::create_job()
161 {
162   DEBTRACE("Create Job Slot BL::GenericGui");
163   _jobs_manager->create_job_wizard();
164 }
165
166 void
167 BL::GenericGui::start_job()
168 {
169   DEBTRACE("Start Job Slot BL::GenericGui");
170   _jobs_manager->start_job(_job_name_selected.toStdString());
171   updateButtonsStates();
172 }
173
174 void
175 BL::GenericGui::refresh_job()
176 {
177   DEBTRACE("Refresh Job Slot BL::GenericGui");
178   _jobs_manager->refresh_jobs();
179 }
180
181 void
182 BL::GenericGui::get_results_job()
183 {
184   DEBTRACE("Get Results Job Slot BL::GenericGui");
185   _jobs_manager->get_results_job(_job_name_selected.toStdString());
186 }
187
188 void
189 BL::GenericGui::delete_job()
190 {
191   DEBTRACE("Delete Job Slot BL::GenericGui");
192   int ret = QMessageBox::warning(NULL, "Delete a job", "Do you really want to delete this job ?",
193                                  QMessageBox::Ok|QMessageBox::Cancel,
194                                  QMessageBox::Ok);
195   if (ret == QMessageBox::Ok)
196   {
197     _jobs_manager->delete_job(_job_name_selected);
198     _model_manager->deleteJob(_row_selected);
199     emit job_deleted(_job_name_selected);
200     _row_selected = -1;
201     _job_name_selected = "";
202     updateButtonsStates();
203   }
204 }
205
206 void
207 BL::GenericGui::job_selected(const QModelIndex & index)
208 {
209   DEBTRACE("BL::GenericGui::job_selected slot");
210   QStandardItem * item = _model->itemFromIndex(index);
211   QStandardItem * item_name = _model->item(item->row());
212   _row_selected = item->row();
213   _job_name_selected = item_name->text();
214   updateButtonsStates();
215 }
216
217 void 
218 BL::GenericGui::job_state_changed(const QString & name)
219 {
220   if (name == _job_name_selected)
221     updateButtonsStates();
222 }
223 void
224 BL::GenericGui::updateButtonsStates()
225 {
226   DEBTRACE("BL::GenericGui::updateButtonsStates slot");
227
228   // First case: no job selected
229   if (_job_name_selected == "" and _row_selected == -1)
230   {
231     _start_job_action->setEnabled(false);
232     _delete_job_action->setEnabled(false);
233     _get_results_job_action->setEnabled(false);
234     _buttons->disable_start_button();
235     _buttons->disable_delete_button();
236     _buttons->disable_get_results_button();
237   }
238   else if (_job_name_selected != "" and _row_selected != -1)
239   {
240     BL::Job * job = _jobs_manager->getJob(_job_name_selected.toStdString());
241     BL::Job::State job_state = job->getState();
242
243     switch (job_state)
244     {
245       case BL::Job::CREATED:
246         _start_job_action->setEnabled(true);
247         _delete_job_action->setEnabled(true);
248         _get_results_job_action->setEnabled(false);
249         _buttons->enable_start_button();
250         _buttons->enable_delete_button();
251         _buttons->disable_get_results_button();
252         break;
253
254       case BL::Job::IN_PROCESS:
255         _start_job_action->setEnabled(false);
256         _buttons->disable_start_button();
257         _delete_job_action->setEnabled(false);
258         _buttons->disable_delete_button();
259         _get_results_job_action->setEnabled(false);
260         _buttons->disable_get_results_button();
261         break;
262
263       case BL::Job::QUEUED:
264         _start_job_action->setEnabled(false);
265         _buttons->disable_start_button();
266         _delete_job_action->setEnabled(true);
267         _buttons->enable_delete_button();
268         _get_results_job_action->setEnabled(false);
269         _buttons->disable_get_results_button();
270         break;
271
272       case BL::Job::RUNNING:
273         _start_job_action->setEnabled(false);
274         _buttons->disable_start_button();
275         _delete_job_action->setEnabled(true);
276         _buttons->enable_delete_button();
277         _get_results_job_action->setEnabled(false);
278         _buttons->disable_get_results_button();
279         break;
280
281       case BL::Job::PAUSED:
282         _start_job_action->setEnabled(false);
283         _buttons->disable_start_button();
284         _delete_job_action->setEnabled(true);
285         _buttons->enable_delete_button();
286         _get_results_job_action->setEnabled(false);
287         _buttons->disable_get_results_button();
288         break;
289
290       case BL::Job::ERROR:
291         _start_job_action->setEnabled(false);
292         _buttons->disable_start_button();
293         _delete_job_action->setEnabled(true);
294         _buttons->enable_delete_button();
295         _get_results_job_action->setEnabled(false);
296         _buttons->disable_get_results_button();
297         break;
298
299       case BL::Job::FINISHED:
300         _start_job_action->setEnabled(false);
301         _buttons->disable_start_button();
302         _delete_job_action->setEnabled(true);
303         _buttons->enable_delete_button();
304         _get_results_job_action->setEnabled(true);
305         _buttons->enable_get_results_button();
306         break;
307     }
308   }
309   else
310   {
311     DEBTRACE("ERROR in updateButtonsStates !!!!!!");
312   }
313 }