1 // Copyright (C) 2009-2024 CEA, EDF
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.
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.
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
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "BL_GenericGui.hxx"
23 #include <QMainWindow>
24 #include <QMessageBox>
25 #include <QScrollArea>
27 #include <QStandardItemModel>
28 #include <QVBoxLayout>
29 #include <QMessageBox>
35 BL::GenericGui::GenericGui(BL::MainWindows_Wrap * wrapper) : QObject(wrapper->getDockParent())
37 DEBTRACE("Creating BL::GenericGui");
40 _job_name_selected = "";
42 _dock_parent = _wrapper->getDockParent();
44 // _salome_services is a servant
45 // POA wil destroy it at the end of the application
46 _salome_services = new BL::SALOMEServices();
49 BL::GenericGui::~GenericGui()
51 DEBTRACE("Destroying BL::GenericGui");
52 _salome_services->end();
56 BL::GenericGui::createDockWidgets()
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();
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);
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);
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);
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)));
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*)));
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
106 _resource_catalog->refresh_resource_list();
110 BL::GenericGui::createCentralWidget()
112 DEBTRACE("createCentralWidget BL::GenericGui");
114 _tab_parent = _wrapper->getTabParent();
115 /* Tab Central Widget */
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()));
128 _jobs_table = new BL::JobsTable(_tab_parent);
129 _jobs_table->setModel(_model);
130 _jobs_table->set_main_gui(this);
133 _job_tab = new BL::JobTab(_tab_parent, _jobs_manager);
134 _job_tab->setModel(_model);
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);
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);
153 /* Signals and Slots */
155 connect(_model, SIGNAL(itemChanged(QStandardItem*)), _job_tab, SLOT(itemChanged(QStandardItem*)));
158 connect(_jobs_table, SIGNAL(clicked(QModelIndex)), this, SLOT(job_selected(QModelIndex)));
159 connect(_jobs_table, SIGNAL(activated(QModelIndex)), this, SLOT(job_activated(QModelIndex)));
163 BL::GenericGui::deleteDockWidget()
165 // Specific for SALOME...
166 _dock_parent->removeDockWidget(_dw_summary);
168 _dock_parent->removeDockWidget(_dw_resource_catalog);
169 delete _dw_resource_catalog;
170 _dock_parent->removeDockWidget(_jobs_manager);
171 delete _jobs_manager;
175 BL::GenericGui::showDockWidgets(bool isVisible)
177 DEBTRACE("BL::GenericGui::showDockWidgets " << isVisible);
179 _jobs_manager->setVisible(isVisible);
180 _jobs_manager->toggleViewAction()->setVisible(isVisible);
183 _dw_summary->setVisible(isVisible);
184 _dw_summary->toggleViewAction()->setVisible(isVisible);
186 if (_dw_resource_catalog) {
187 _dw_resource_catalog->setVisible(isVisible);
188 _dw_resource_catalog->toggleViewAction()->setVisible(isVisible);
193 BL::GenericGui::createActions()
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()));
207 BL::GenericGui::createMenus()
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);
222 BL::GenericGui::create_job()
224 DEBTRACE("Create Job Slot BL::GenericGui");
225 _jobs_manager->create_job();
229 BL::GenericGui::edit_clone_job()
231 DEBTRACE("Edit/Clone Job Slot BL::GenericGui");
232 _jobs_manager->edit_clone_job(_job_name_selected.toUtf8().constData());
236 BL::GenericGui::start_job()
238 DEBTRACE("Start Job Slot BL::GenericGui");
239 _jobs_manager->start_job(_job_name_selected.toUtf8().constData());
240 updateButtonsStates();
244 BL::GenericGui::restart_job()
246 DEBTRACE("Restart Job Slot BL::GenericGui");
247 _jobs_manager->restart_job(_job_name_selected.toUtf8().constData());
248 updateButtonsStates();
252 BL::GenericGui::refresh_job()
254 DEBTRACE("Refresh Job Slot BL::GenericGui");
255 _jobs_manager->refresh_jobs();
259 BL::GenericGui::get_results_job()
261 DEBTRACE("Get Results Job Slot BL::GenericGui");
262 if (!_jobs_table->isMultipleSelected())
264 _jobs_manager->get_results_job(_job_name_selected.toUtf8().constData());
268 QModelIndexList selected_rows = _jobs_table->selectionModel()->selectedRows();
269 for (int i = 0; i < selected_rows.length(); ++i)
271 QString job_name = _model->itemFromIndex(selected_rows[i])->text();
272 _jobs_manager->get_results_job(job_name.toUtf8().constData());
278 BL::GenericGui::stop_job()
280 DEBTRACE("Stop Job Slot BL::GenericGui");
281 if (!_jobs_table->isMultipleSelected())
283 _jobs_manager->stop_job(_job_name_selected.toUtf8().constData());
287 QModelIndexList selected_rows = _jobs_table->selectionModel()->selectedRows();
288 for (int i = 0; i < selected_rows.length(); ++i)
290 QString job_name = _model->itemFromIndex(selected_rows[i])->text();
291 _jobs_manager->stop_job(job_name.toUtf8().constData());
298 BL::GenericGui::delete_job()
300 DEBTRACE("Delete Job Slot BL::GenericGui");
301 int ret = QMessageBox::Cancel;
303 if (!_jobs_table->isMultipleSelected())
305 ret = QMessageBox::warning(NULL, "Delete a job", "Do you really want to delete job " + _job_name_selected + " ? ",
306 QMessageBox::Ok|QMessageBox::Cancel,
311 ret = QMessageBox::warning(NULL, "Delete jobs", "Do you really want to delete these jobs ?",
312 QMessageBox::Ok|QMessageBox::Cancel,
315 if (ret == QMessageBox::Ok)
317 delete_job_internal();
322 BL::GenericGui::delete_job_external(const QString & name)
324 DEBTRACE("Delete Job External");
325 _jobs_manager->delete_job(name);
326 if (!_jobs_table->selectCurrent())
328 _job_name_selected = "";
329 updateButtonsStates();
334 BL::GenericGui::delete_job_internal()
336 if (!_jobs_table->isMultipleSelected())
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())
344 _job_name_selected = "";
345 updateButtonsStates();
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
359 BL::GenericGui::reset_job_selection()
361 _job_name_selected = "";
363 updateButtonsStates();
367 BL::GenericGui::job_selected(const QModelIndex & index)
369 DEBTRACE("BL::GenericGui::job_selected");
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)
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());
386 _job_name_selected = "";
388 DEBTRACE("BL::GenericGui::job_selected - no jobs are selected");
390 updateButtonsStates();
394 BL::GenericGui::job_activated(const QModelIndex & index)
396 DEBTRACE("BL::GenericGui::job_activated slot");
401 BL::GenericGui::job_state_changed(const QString & name)
403 if (name == _job_name_selected)
404 updateButtonsStates();
408 BL::GenericGui::updateButtonsStates()
410 if (!_jobs_table->isMultipleSelected())
412 updateButtonsStatesSingleSelection();
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();
423 // You can always delete jobs
424 _delete_job_action->setEnabled(true);
425 _buttons->enable_delete_button();
428 bool enable_stop = true;
429 QModelIndexList selected_rows = _jobs_table->selectionModel()->selectedRows();
430 for (int i = 0; i < selected_rows.length(); ++i)
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)
442 _stop_job_action->setEnabled(true);
443 _buttons->enable_stop_button();
447 _stop_job_action->setEnabled(false);
448 _buttons->disable_stop_button();
451 // Enable get_results ?
452 bool enable_results = true;
453 for (int i = 0; i < selected_rows.length(); ++i)
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;
464 _get_results_job_action->setEnabled(true);
465 _buttons->enable_get_results_button();
469 _get_results_job_action->setEnabled(false);
470 _buttons->disable_get_results_button();
476 BL::GenericGui::updateButtonsStatesSingleSelection()
478 DEBTRACE("BL::GenericGui::updateButtonsStatesSingleSelection slot");
480 // First case: no job selected
481 if (_job_name_selected == "")
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();
496 else if (_job_name_selected != "")
498 BL::Job * job = _jobs_manager->getJob(_job_name_selected.toUtf8().constData());
499 BL::Job::State job_state = job->getState();
501 _edit_clone_job_action->setEnabled(true);
502 _buttons->enable_edit_clone_button();
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();
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();
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();
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();
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();
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();
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();
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();
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();
625 DEBTRACE("ERROR in updateButtonsStates !!!!!!");
630 BL::GenericGui::saveIfNeeded()
632 if(!_jobs_manager->emptyJobsList())
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();