Salome HOME
Copyright update 2022
[modules/jobmanager.git] / src / genericgui / BL_GenericGui.cxx
1 // Copyright (C) 2009-2022  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, or (at your option) any later version.
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 #include <QAction>
23 #include <QMainWindow>
24 #include <QMessageBox>
25 #include <QScrollArea>
26 #include <QSplitter>
27 #include <QStandardItemModel>
28 #include <QVBoxLayout>
29 #include <QMessageBox>
30
31 #ifdef WNT
32 #undef ERROR
33 #endif
34
35 BL::GenericGui::GenericGui(BL::MainWindows_Wrap * wrapper) : QObject(wrapper->getDockParent())
36 {
37   DEBTRACE("Creating BL::GenericGui");
38   BL_ASSERT(wrapper);
39   _wrapper = wrapper;
40   _job_name_selected = "";
41
42   _dock_parent = _wrapper->getDockParent();
43
44   // _salome_services is a servant
45   // POA wil destroy it at the end of the application
46   _salome_services = new BL::SALOMEServices();
47 }
48
49 BL::GenericGui::~GenericGui()
50 {
51   DEBTRACE("Destroying BL::GenericGui");
52   _salome_services->end();
53 }
54
55 void 
56 BL::GenericGui::createDockWidgets()
57 {
58   DEBTRACE("createDockWidgets BL::GenericGui");
59   _jobs_manager = new BL::JobsManager_QT(_dock_parent, this, _salome_services);
60   _model_manager = new BL::QModelManager(this, _jobs_manager);
61   _model = _model_manager->getModel();
62
63   /* Summary */
64   _dw_summary = new QDockWidget(_dock_parent);
65   _dw_summary->setWindowTitle("Summary");
66   _dw_summary->setObjectName("jmSummaryDock");
67   _summary = new BL::Summary(_dw_summary, _jobs_manager);
68   _summary->setModel(_model);
69   QScrollArea * scroll_widget_summary = new QScrollArea(_dw_summary);
70   scroll_widget_summary->setWidget(_summary);
71   scroll_widget_summary->setWidgetResizable(true);
72   _dw_summary->setWidget(scroll_widget_summary);
73
74   /* ResourceCatalog */
75   _dw_resource_catalog = new QDockWidget(_dock_parent);
76   _dw_resource_catalog->setWindowTitle("Resource Catalog");
77   _dw_resource_catalog->setObjectName("jmResourceCatalogDock");
78   _resource_catalog = new JM::ResourceCatalog(_dw_resource_catalog, _salome_services, false);
79   QScrollArea * scroll_widget_resource = new QScrollArea(_dw_resource_catalog);
80   scroll_widget_resource->setWidget(_resource_catalog);
81   scroll_widget_resource->setWidgetResizable(true);
82   _dw_resource_catalog->setWidget(scroll_widget_resource);
83
84   /* Main Dock Window */
85   _dock_parent->addDockWidget(Qt::RightDockWidgetArea, _jobs_manager);
86   _dock_parent->addDockWidget(Qt::RightDockWidgetArea, _dw_summary);
87   _dock_parent->addDockWidget(Qt::RightDockWidgetArea, _dw_resource_catalog);
88   _dock_parent->splitDockWidget(_jobs_manager, _dw_summary, Qt::Vertical);
89   _dock_parent->tabifyDockWidget(_dw_summary, _dw_resource_catalog);
90
91   /* Signals and Slots */
92   // JobsManager -> Model
93   connect(_jobs_manager, SIGNAL(new_job_added(QString)), _model_manager, SLOT(new_job_added(QString)));
94   connect(_jobs_manager, SIGNAL(job_state_changed(QString)), _model_manager, SLOT(job_state_changed(QString)));
95   connect(_jobs_manager, SIGNAL(job_state_changed(QString)), this, SLOT(job_state_changed(QString)));
96   // Model -> summary
97   connect(_model, SIGNAL(rowsInserted(QModelIndex, int, int)), _summary, SLOT(rowsInserted(QModelIndex, int, int)));
98   connect(_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), _summary, SLOT(rowsRemoved(QModelIndex, int, int)));
99   connect(_model, SIGNAL(itemChanged(QStandardItem*)), _summary, SLOT(itemChanged(QStandardItem*)));
100
101   // Init at the end to be able to get jobs already in Launcher
102   if (_salome_services->initNS() == false)
103     DEBMSG("WARNING !!!!! SALOME IS NOT REACHABLE !!!!");
104   // refresh at the beacause we need that _salome_services be
105   // initialized
106   _resource_catalog->refresh_resource_list();
107 }
108
109 void 
110 BL::GenericGui::createCentralWidget()
111 {
112   DEBTRACE("createCentralWidget BL::GenericGui");
113
114   _tab_parent  = _wrapper->getTabParent();
115   /* Tab Central Widget */
116   /* Buttons */
117   _buttons = new BL::Buttons(_tab_parent);
118   _buttons->setCreateButtonSlot(this, SLOT(create_job()));
119   _buttons->setEditCloneButtonSlot(this, SLOT(edit_clone_job()));
120   _buttons->setStartButtonSlot(this, SLOT(start_job()));
121   _buttons->setReStartButtonSlot(this, SLOT(restart_job()));
122   _buttons->setDeleteButtonSlot(this, SLOT(delete_job()));
123   _buttons->setStopButtonSlot(this, SLOT(stop_job()));
124   _buttons->setRefreshButtonSlot(this, SLOT(refresh_job()));
125   _buttons->setGetResultsButtonSlot(this, SLOT(get_results_job()));
126
127   /* Jobs Table */
128   _jobs_table = new BL::JobsTable(_tab_parent);
129   _jobs_table->setModel(_model);
130   _jobs_table->set_main_gui(this);
131
132   /* Job Tab */
133   _job_tab = new BL::JobTab(_tab_parent, _jobs_manager);
134   _job_tab->setModel(_model);
135
136   // Central Widget
137   QWidget * central_widget = new QWidget(_tab_parent);
138   QSplitter * tab_central_widget = new QSplitter(Qt::Vertical, _tab_parent);
139   tab_central_widget->addWidget(_jobs_table);
140   tab_central_widget->addWidget(_job_tab);
141   tab_central_widget->setChildrenCollapsible(false);
142   QVBoxLayout * central_layout = new QVBoxLayout;
143   central_layout->addWidget(_buttons);
144   central_layout->addWidget(tab_central_widget);
145   central_widget->setLayout(central_layout);
146
147   // Adding a scroll area for low resolution
148   QScrollArea * scroll_central_widget = new QScrollArea(_tab_parent);
149   scroll_central_widget->setWidget(central_widget);
150   scroll_central_widget->setWidgetResizable(true);
151   _tab_parent->setCentralWidget(scroll_central_widget);
152
153   /* Signals and Slots */
154   // Model -> JobTab
155   connect(_model, SIGNAL(itemChanged(QStandardItem*)), _job_tab, SLOT(itemChanged(QStandardItem*)));
156
157   // TableView -> X
158   connect(_jobs_table, SIGNAL(clicked(QModelIndex)), this, SLOT(job_selected(QModelIndex)));
159   connect(_jobs_table, SIGNAL(activated(QModelIndex)), this, SLOT(job_activated(QModelIndex)));
160 }
161
162 void
163 BL::GenericGui::deleteDockWidget()
164 {
165   // Specific for SALOME...
166   _dock_parent->removeDockWidget(_dw_summary);
167   delete _dw_summary;
168   _dock_parent->removeDockWidget(_dw_resource_catalog);
169   delete _dw_resource_catalog;
170   _dock_parent->removeDockWidget(_jobs_manager);
171   delete _jobs_manager;
172 }
173
174 void 
175 BL::GenericGui::showDockWidgets(bool isVisible)
176 {
177   DEBTRACE("BL::GenericGui::showDockWidgets " << isVisible);
178   if (_jobs_manager) {
179     _jobs_manager->setVisible(isVisible);
180     _jobs_manager->toggleViewAction()->setVisible(isVisible);
181   }
182   if (_dw_summary) {
183     _dw_summary->setVisible(isVisible);
184     _dw_summary->toggleViewAction()->setVisible(isVisible);
185   }
186   if (_dw_resource_catalog) {
187     _dw_resource_catalog->setVisible(isVisible);
188     _dw_resource_catalog->toggleViewAction()->setVisible(isVisible);
189   }
190 }
191
192 void
193 BL::GenericGui::createActions()
194 {
195   DEBTRACE("CreateActions BL::GenericGui");
196   _create_job_action = _wrapper->createAction("Create a Job", QIcon(), "Create a Job", "Create a Job", 0, _dock_parent, false, this, SLOT(create_job()));
197   _edit_clone_job_action = _wrapper->createAction("Edit/Clone a Job", QIcon(), "Edit/Clone a Job", "Edit/Clone a Job", 0, _dock_parent, false, this, SLOT(edit_clone_job()));
198   _start_job_action = _wrapper->createAction("Start a Job", QIcon(), "Start a Job", "Start a Job", 0, _dock_parent, false, this, SLOT(start_job()));
199   _restart_job_action = _wrapper->createAction("Restart a Job", QIcon(), "Restart a Job", "Restart a Job", 0, _dock_parent, false, this, SLOT(restart_job()));
200   _delete_job_action = _wrapper->createAction("Delete a Job", QIcon(), "Delete a Job", "Delete a Job", Qt::Key_Delete, _dock_parent, false, this, SLOT(delete_job()));
201   _refresh_job_action = _wrapper->createAction("Refresh Jobs", QIcon(), "Refresh Jobs", "Refresh Jobs", 0, _dock_parent, false, this, SLOT(refresh_job()));
202   _get_results_job_action = _wrapper->createAction("Get Job Results", QIcon(), "Get Job Results", "Get Job Results", 0, _dock_parent, false, this, SLOT(refresh_job()));
203   _stop_job_action = _wrapper->createAction("Stop a Job", QIcon(), "Stop a Job", "Stop a Job", 0, _dock_parent, false, this, SLOT(stop_job()));
204 }
205
206 void
207 BL::GenericGui::createMenus()
208 {
209   DEBTRACE("CreateMenus BL::GenericGui");
210   int menu_id = _wrapper->createTopMenu("JobManager");
211   _wrapper->addActionToMenu(_create_job_action, menu_id);
212   _wrapper->addActionToMenu(_edit_clone_job_action, menu_id);
213   _wrapper->addActionToMenu(_start_job_action, menu_id);
214   _wrapper->addActionToMenu(_restart_job_action, menu_id);
215   _wrapper->addActionToMenu(_stop_job_action, menu_id);
216   _wrapper->addActionToMenu(_delete_job_action, menu_id);
217   _wrapper->addActionToMenu(_get_results_job_action, menu_id);
218   _wrapper->addActionToMenu(_refresh_job_action, menu_id);
219 }
220
221 void
222 BL::GenericGui::create_job()
223 {
224   DEBTRACE("Create Job Slot BL::GenericGui");
225   _jobs_manager->create_job();
226 }
227
228 void
229 BL::GenericGui::edit_clone_job()
230 {
231   DEBTRACE("Edit/Clone Job Slot BL::GenericGui");
232   _jobs_manager->edit_clone_job(_job_name_selected.toUtf8().constData());
233 }
234
235 void
236 BL::GenericGui::start_job()
237 {
238   DEBTRACE("Start Job Slot BL::GenericGui");
239   _jobs_manager->start_job(_job_name_selected.toUtf8().constData());
240   updateButtonsStates();
241 }
242
243 void
244 BL::GenericGui::restart_job()
245 {
246   DEBTRACE("Restart Job Slot BL::GenericGui");
247   _jobs_manager->restart_job(_job_name_selected.toUtf8().constData());
248   updateButtonsStates();
249 }
250
251 void
252 BL::GenericGui::refresh_job()
253 {
254   DEBTRACE("Refresh Job Slot BL::GenericGui");
255   _jobs_manager->refresh_jobs();
256 }
257
258 void
259 BL::GenericGui::get_results_job()
260 {
261   DEBTRACE("Get Results Job Slot BL::GenericGui");
262   if (!_jobs_table->isMultipleSelected())
263   {
264     _jobs_manager->get_results_job(_job_name_selected.toUtf8().constData());
265   }
266   else
267   {
268     QModelIndexList selected_rows = _jobs_table->selectionModel()->selectedRows();
269     for (int i = 0; i < selected_rows.length(); ++i)
270     {
271       QString job_name = _model->itemFromIndex(selected_rows[i])->text();
272     _jobs_manager->get_results_job(job_name.toUtf8().constData());
273     }
274   }
275 }
276
277 void
278 BL::GenericGui::stop_job()
279 {
280   DEBTRACE("Stop Job Slot BL::GenericGui");
281   if (!_jobs_table->isMultipleSelected())
282   {
283     _jobs_manager->stop_job(_job_name_selected.toUtf8().constData());
284   }
285   else
286   {
287     QModelIndexList selected_rows = _jobs_table->selectionModel()->selectedRows();
288     for (int i = 0; i < selected_rows.length(); ++i)
289     {
290       QString job_name = _model->itemFromIndex(selected_rows[i])->text();
291       _jobs_manager->stop_job(job_name.toUtf8().constData());
292     }
293   }
294 }
295
296
297 void
298 BL::GenericGui::delete_job()
299 {
300   DEBTRACE("Delete Job Slot BL::GenericGui");
301   int ret = QMessageBox::Cancel;
302
303   if (!_jobs_table->isMultipleSelected())
304   {
305     ret = QMessageBox::warning(NULL, "Delete a job", "Do you really want to delete job " + _job_name_selected + " ? ",
306                                QMessageBox::Ok|QMessageBox::Cancel,
307                                QMessageBox::Ok);
308   }
309   else
310   {
311    ret = QMessageBox::warning(NULL, "Delete jobs", "Do you really want to delete these jobs ?",
312                               QMessageBox::Ok|QMessageBox::Cancel,
313                               QMessageBox::Ok);
314   }
315   if (ret == QMessageBox::Ok)
316   {
317     delete_job_internal();
318   }
319 }
320
321 void
322 BL::GenericGui::delete_job_external(const QString & name)
323 {
324   DEBTRACE("Delete Job External");
325   _jobs_manager->delete_job(name);
326   if (!_jobs_table->selectCurrent())
327   {
328     _job_name_selected = "";
329     updateButtonsStates();
330   }
331 }
332
333 void
334 BL::GenericGui::delete_job_internal()
335 {
336   if (!_jobs_table->isMultipleSelected())
337   {
338     QModelIndexList selected_list = _jobs_table->getSelectedIndexes();
339     QString job_name_to_delete    = _model->itemFromIndex(selected_list[0])->text();
340     DEBTRACE("Single Deleting job: " << job_name_to_delete.toUtf8().constData());
341     _jobs_manager->delete_job(job_name_to_delete);
342     if (!_jobs_table->selectCurrent())
343     {
344       _job_name_selected = "";
345       updateButtonsStates();
346     }
347   }
348   else
349   {
350     QModelIndexList selected_list = _jobs_table->getSelectedIndexes();
351     QString job_name = _model->itemFromIndex(selected_list[0])->text();
352     DEBTRACE("Multiple Deleting job: " << job_name.toUtf8().constData());
353     _jobs_manager->delete_job(job_name);
354     delete_job_internal(); // Recursive delete
355   }
356 }
357
358 void
359 BL::GenericGui::reset_job_selection()
360 {
361   _job_name_selected = "";
362   _job_tab->reset("");
363   updateButtonsStates();
364 }
365
366 void
367 BL::GenericGui::job_selected(const QModelIndex & index)
368 {
369   DEBTRACE("BL::GenericGui::job_selected");
370
371   //Find if a job is selected (ignore index)
372   //If Multiple job are selected, take first job
373   QItemSelectionModel * selection_model = _jobs_table->selectionModel();
374   QModelIndexList selected_rows = selection_model->selectedRows();
375   if (selected_rows.length() >= 1)
376   {
377     QModelIndex idx = selected_rows[0];
378     QStandardItem * item = _model->itemFromIndex(idx);
379     QStandardItem * item_name = _model->item(item->row());
380     _job_name_selected = item_name->text();
381     _job_tab->job_selected(idx);
382     DEBTRACE("BL::GenericGui::job_selected name is " << _job_name_selected.toUtf8().constData());
383   }
384   else
385   {
386     _job_name_selected = "";
387     _job_tab->reset("");
388     DEBTRACE("BL::GenericGui::job_selected - no jobs are selected");
389   }
390   updateButtonsStates();
391 }
392
393 void
394 BL::GenericGui::job_activated(const QModelIndex & index)
395 {
396   DEBTRACE("BL::GenericGui::job_activated slot");
397   job_selected(index);
398 }
399
400 void
401 BL::GenericGui::job_state_changed(const QString & name)
402 {
403   if (name == _job_name_selected)
404     updateButtonsStates();
405 }
406
407 void
408 BL::GenericGui::updateButtonsStates()
409 {
410   if (!_jobs_table->isMultipleSelected())
411   {
412     updateButtonsStatesSingleSelection();
413   }
414   else
415   {
416     _start_job_action->setEnabled(false);
417     _edit_clone_job_action->setEnabled(false);
418     _restart_job_action->setEnabled(false);
419     _buttons->disable_start_button();
420     _buttons->disable_edit_clone_button();
421     _buttons->disable_restart_button();
422
423     // You can always delete jobs
424     _delete_job_action->setEnabled(true);
425     _buttons->enable_delete_button();
426
427     // Enable stop ?
428     bool enable_stop = true;
429     QModelIndexList selected_rows = _jobs_table->selectionModel()->selectedRows();
430     for (int i = 0; i < selected_rows.length(); ++i)
431     {
432       QString job_name = _model->itemFromIndex(selected_rows[i])->text();
433       BL::Job * job = _jobs_manager->getJob(job_name.toUtf8().constData());
434       BL::Job::State job_state = job->getState();
435       if (job_state != BL::Job::QUEUED  &&
436           job_state != BL::Job::RUNNING &&
437           job_state != BL::Job::PAUSED)
438         enable_stop = false;
439     }
440     if (enable_stop)
441     {
442       _stop_job_action->setEnabled(true);
443       _buttons->enable_stop_button();
444     }
445     else
446     {
447       _stop_job_action->setEnabled(false);
448       _buttons->disable_stop_button();
449     }
450
451     // Enable get_results ?
452     bool enable_results = true;
453     for (int i = 0; i < selected_rows.length(); ++i)
454     {
455       QString job_name = _model->itemFromIndex(selected_rows[i])->text();
456       BL::Job * job = _jobs_manager->getJob(job_name.toUtf8().constData());
457       BL::Job::State job_state = job->getState();
458       if (job_state != BL::Job::FINISHED &&
459           job_state != BL::Job::FAILED)
460         enable_results= false;
461     }
462     if (enable_results)
463     {
464       _get_results_job_action->setEnabled(true);
465       _buttons->enable_get_results_button();
466     }
467     else
468     {
469       _get_results_job_action->setEnabled(false);
470       _buttons->disable_get_results_button();
471     }
472   }
473 }
474
475 void
476 BL::GenericGui::updateButtonsStatesSingleSelection()
477 {
478   DEBTRACE("BL::GenericGui::updateButtonsStatesSingleSelection slot");
479
480   // First case: no job selected
481   if (_job_name_selected == "")
482   {
483     _start_job_action->setEnabled(false);
484     _delete_job_action->setEnabled(false);
485     _get_results_job_action->setEnabled(false);
486     _buttons->disable_start_button();
487     _buttons->disable_delete_button();
488     _buttons->disable_get_results_button();
489     _edit_clone_job_action->setEnabled(false);
490     _buttons->disable_edit_clone_button();
491     _restart_job_action->setEnabled(false);
492     _buttons->disable_restart_button();
493     _stop_job_action->setEnabled(false);
494     _buttons->disable_stop_button();
495   }
496   else if (_job_name_selected != "")
497   {
498     BL::Job * job = _jobs_manager->getJob(_job_name_selected.toUtf8().constData());
499     BL::Job::State job_state = job->getState();
500
501     _edit_clone_job_action->setEnabled(true);
502     _buttons->enable_edit_clone_button();
503     switch (job_state)
504     {
505       case BL::Job::CREATED:
506         _start_job_action->setEnabled(true);
507         _delete_job_action->setEnabled(true);
508         _get_results_job_action->setEnabled(false);
509         _buttons->enable_start_button();
510         _buttons->enable_delete_button();
511         _buttons->disable_get_results_button();
512         _restart_job_action->setEnabled(false);
513         _buttons->disable_restart_button();
514         _stop_job_action->setEnabled(false);
515         _buttons->disable_stop_button();
516         break;
517
518       case BL::Job::IN_PROCESS:
519         _start_job_action->setEnabled(false);
520         _buttons->disable_start_button();
521         _delete_job_action->setEnabled(false);
522         _buttons->disable_delete_button();
523         _get_results_job_action->setEnabled(false);
524         _buttons->disable_get_results_button();
525         _restart_job_action->setEnabled(false);
526         _buttons->disable_restart_button();
527         _stop_job_action->setEnabled(false);
528         _buttons->disable_stop_button();
529         break;
530
531       case BL::Job::QUEUED:
532         _start_job_action->setEnabled(false);
533         _buttons->disable_start_button();
534         _delete_job_action->setEnabled(true);
535         _buttons->enable_delete_button();
536         _get_results_job_action->setEnabled(false);
537         _buttons->disable_get_results_button();
538         _restart_job_action->setEnabled(false);
539         _buttons->disable_restart_button();
540         _stop_job_action->setEnabled(true);
541         _buttons->enable_stop_button();
542         break;
543
544       case BL::Job::RUNNING:
545         _start_job_action->setEnabled(false);
546         _buttons->disable_start_button();
547         _delete_job_action->setEnabled(true);
548         _buttons->enable_delete_button();
549         _get_results_job_action->setEnabled(false);
550         _buttons->disable_get_results_button();
551         _restart_job_action->setEnabled(false);
552         _buttons->disable_restart_button();
553         _stop_job_action->setEnabled(true);
554         _buttons->enable_stop_button();
555         break;
556
557       case BL::Job::PAUSED:
558         _start_job_action->setEnabled(false);
559         _buttons->disable_start_button();
560         _delete_job_action->setEnabled(true);
561         _buttons->enable_delete_button();
562         _get_results_job_action->setEnabled(false);
563         _buttons->disable_get_results_button();
564         _restart_job_action->setEnabled(false);
565         _buttons->disable_restart_button();
566         _stop_job_action->setEnabled(true);
567         _buttons->enable_stop_button();
568         break;
569
570       case BL::Job::ERROR:
571         _start_job_action->setEnabled(false);
572         _buttons->disable_start_button();
573         _delete_job_action->setEnabled(true);
574         _buttons->enable_delete_button();
575         _get_results_job_action->setEnabled(false);
576         _buttons->disable_get_results_button();
577         _restart_job_action->setEnabled(true);
578         _buttons->enable_restart_button();
579         _stop_job_action->setEnabled(false);
580         _buttons->disable_stop_button();
581         break;
582
583       case BL::Job::FINISHED:
584         _start_job_action->setEnabled(false);
585         _buttons->disable_start_button();
586         _delete_job_action->setEnabled(true);
587         _buttons->enable_delete_button();
588         _get_results_job_action->setEnabled(true);
589         _buttons->enable_get_results_button();
590         _restart_job_action->setEnabled(true);
591         _buttons->enable_restart_button();
592         _stop_job_action->setEnabled(false);
593         _buttons->disable_stop_button();
594         break;
595
596       case BL::Job::FAILED:
597         _start_job_action->setEnabled(false);
598         _buttons->disable_start_button();
599         _delete_job_action->setEnabled(true);
600         _buttons->enable_delete_button();
601         _get_results_job_action->setEnabled(true);
602         _buttons->enable_get_results_button();
603         _restart_job_action->setEnabled(true);
604         _buttons->enable_restart_button();
605         _stop_job_action->setEnabled(false);
606         _buttons->disable_stop_button();
607         break;
608
609       case BL::Job::NOT_CREATED:
610         _start_job_action->setEnabled(false);
611         _buttons->disable_start_button();
612         _delete_job_action->setEnabled(true);
613         _buttons->enable_delete_button();
614         _get_results_job_action->setEnabled(false);
615         _buttons->disable_get_results_button();
616         _restart_job_action->setEnabled(true);
617         _buttons->enable_restart_button();
618         _stop_job_action->setEnabled(false);
619         _buttons->disable_stop_button();
620         break;
621     }
622   }
623   else
624   {
625     DEBTRACE("ERROR in updateButtonsStates !!!!!!");
626   }
627 }
628
629 void
630 BL::GenericGui::saveIfNeeded()
631 {
632   if(!_jobs_manager->emptyJobsList())
633   {
634     if(QMessageBox::question (0,
635                               tr("List of jobs in JOBMANAGER."),
636                               tr("Do you want to save the list of jobs?"),
637                               QMessageBox::Yes | QMessageBox::No,
638                               QMessageBox::No) == QMessageBox::Yes)
639       _jobs_manager->save_jobs_button();
640   }
641 }