1 // Copyright (C) 2009-2016 CEA/DEN, EDF R&D
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>
34 BL::GenericGui::GenericGui(BL::MainWindows_Wrap * wrapper) : QObject(wrapper->getDockParent())
36 DEBTRACE("Creating BL::GenericGui");
39 _job_name_selected = "";
41 _dock_parent = _wrapper->getDockParent();
43 // _salome_services is a servant
44 // POA wil destroy it at the end of the application
45 _salome_services = new BL::SALOMEServices();
48 BL::GenericGui::~GenericGui()
50 DEBTRACE("Destroying BL::GenericGui");
51 _salome_services->end();
55 BL::GenericGui::createDockWidgets()
57 DEBTRACE("createDockWidgets BL::GenericGui");
58 _jobs_manager = new BL::JobsManager_QT(_dock_parent, this, _salome_services);
59 _model_manager = new BL::QModelManager(this, _jobs_manager);
60 _model = _model_manager->getModel();
63 _dw_summary = new QDockWidget(_dock_parent);
64 _dw_summary->setWindowTitle("Summary");
65 _dw_summary->setObjectName("jmSummaryDock");
66 _summary = new BL::Summary(_dw_summary, _jobs_manager);
67 _summary->setModel(_model);
68 QScrollArea * scroll_widget_summary = new QScrollArea(_dw_summary);
69 scroll_widget_summary->setWidget(_summary);
70 scroll_widget_summary->setWidgetResizable(true);
71 _dw_summary->setWidget(scroll_widget_summary);
74 _dw_resource_catalog = new QDockWidget(_dock_parent);
75 _dw_resource_catalog->setWindowTitle("Resource Catalog");
76 _dw_resource_catalog->setObjectName("jmResourceCatalogDock");
77 _resource_catalog = new JM::ResourceCatalog(_dw_resource_catalog, _salome_services, false);
78 QScrollArea * scroll_widget_resource = new QScrollArea(_dw_resource_catalog);
79 scroll_widget_resource->setWidget(_resource_catalog);
80 scroll_widget_resource->setWidgetResizable(true);
81 _dw_resource_catalog->setWidget(scroll_widget_resource);
83 /* Main Dock Window */
84 _dock_parent->addDockWidget(Qt::RightDockWidgetArea, _jobs_manager);
85 _dock_parent->addDockWidget(Qt::RightDockWidgetArea, _dw_summary);
86 _dock_parent->addDockWidget(Qt::RightDockWidgetArea, _dw_resource_catalog);
87 _dock_parent->splitDockWidget(_jobs_manager, _dw_summary, Qt::Vertical);
88 _dock_parent->tabifyDockWidget(_dw_summary, _dw_resource_catalog);
90 /* Signals and Slots */
91 // JobsManager -> Model
92 connect(_jobs_manager, SIGNAL(new_job_added(QString)), _model_manager, SLOT(new_job_added(QString)));
93 connect(_jobs_manager, SIGNAL(job_state_changed(QString)), _model_manager, SLOT(job_state_changed(QString)));
94 connect(_jobs_manager, SIGNAL(job_state_changed(QString)), this, SLOT(job_state_changed(QString)));
96 connect(_model, SIGNAL(rowsInserted(QModelIndex, int, int)), _summary, SLOT(rowsInserted(QModelIndex, int, int)));
97 connect(_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), _summary, SLOT(rowsRemoved(QModelIndex, int, int)));
98 connect(_model, SIGNAL(itemChanged(QStandardItem*)), _summary, SLOT(itemChanged(QStandardItem*)));
100 // Init at the end to be able to get jobs already in Launcher
101 if (_salome_services->initNS() == false)
102 DEBMSG("WARNING !!!!! SALOME IS NOT REACHABLE !!!!");
103 // refresh at the beacause we need that _salome_services be
105 _resource_catalog->refresh_resource_list();
109 BL::GenericGui::createCentralWidget()
111 DEBTRACE("createCentralWidget BL::GenericGui");
113 _tab_parent = _wrapper->getTabParent();
114 /* Tab Central Widget */
116 _buttons = new BL::Buttons(_tab_parent);
117 _buttons->setCreateButtonSlot(this, SLOT(create_job()));
118 _buttons->setEditCloneButtonSlot(this, SLOT(edit_clone_job()));
119 _buttons->setStartButtonSlot(this, SLOT(start_job()));
120 _buttons->setReStartButtonSlot(this, SLOT(restart_job()));
121 _buttons->setDeleteButtonSlot(this, SLOT(delete_job()));
122 _buttons->setStopButtonSlot(this, SLOT(stop_job()));
123 _buttons->setRefreshButtonSlot(this, SLOT(refresh_job()));
124 _buttons->setGetResultsButtonSlot(this, SLOT(get_results_job()));
127 _jobs_table = new BL::JobsTable(_tab_parent);
128 _jobs_table->setModel(_model);
129 _jobs_table->set_main_gui(this);
132 _job_tab = new BL::JobTab(_tab_parent, _jobs_manager);
133 _job_tab->setModel(_model);
136 QWidget * central_widget = new QWidget(_tab_parent);
137 QSplitter * tab_central_widget = new QSplitter(Qt::Vertical, _tab_parent);
138 tab_central_widget->addWidget(_jobs_table);
139 tab_central_widget->addWidget(_job_tab);
140 tab_central_widget->setChildrenCollapsible(false);
141 QVBoxLayout * central_layout = new QVBoxLayout;
142 central_layout->addWidget(_buttons);
143 central_layout->addWidget(tab_central_widget);
144 central_widget->setLayout(central_layout);
146 // Adding a scroll area for low resolution
147 QScrollArea * scroll_central_widget = new QScrollArea(_tab_parent);
148 scroll_central_widget->setWidget(central_widget);
149 scroll_central_widget->setWidgetResizable(true);
150 _tab_parent->setCentralWidget(scroll_central_widget);
152 /* Signals and Slots */
154 connect(_model, SIGNAL(itemChanged(QStandardItem*)), _job_tab, SLOT(itemChanged(QStandardItem*)));
157 connect(_jobs_table, SIGNAL(clicked(QModelIndex)), this, SLOT(job_selected(QModelIndex)));
158 connect(_jobs_table, SIGNAL(activated(QModelIndex)), this, SLOT(job_activated(QModelIndex)));
162 BL::GenericGui::deleteDockWidget()
164 // Specific for SALOME...
165 _dock_parent->removeDockWidget(_dw_summary);
167 _dock_parent->removeDockWidget(_dw_resource_catalog);
168 delete _dw_resource_catalog;
169 _dock_parent->removeDockWidget(_jobs_manager);
170 delete _jobs_manager;
174 BL::GenericGui::showDockWidgets(bool isVisible)
176 DEBTRACE("BL::GenericGui::showDockWidgets " << isVisible);
178 _jobs_manager->setVisible(isVisible);
179 _jobs_manager->toggleViewAction()->setVisible(isVisible);
182 _dw_summary->setVisible(isVisible);
183 _dw_summary->toggleViewAction()->setVisible(isVisible);
185 if (_dw_resource_catalog) {
186 _dw_resource_catalog->setVisible(isVisible);
187 _dw_resource_catalog->toggleViewAction()->setVisible(isVisible);
192 BL::GenericGui::createActions()
194 DEBTRACE("CreateActions BL::GenericGui");
195 _create_job_action = _wrapper->createAction("Create a Job", QIcon(), "Create a Job", "Create a Job", 0, _dock_parent, false, this, SLOT(create_job()));
196 _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()));
197 _start_job_action = _wrapper->createAction("Start a Job", QIcon(), "Start a Job", "Start a Job", 0, _dock_parent, false, this, SLOT(start_job()));
198 _restart_job_action = _wrapper->createAction("Restart a Job", QIcon(), "Restart a Job", "Restart a Job", 0, _dock_parent, false, this, SLOT(restart_job()));
199 _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()));
200 _refresh_job_action = _wrapper->createAction("Refresh Jobs", QIcon(), "Refresh Jobs", "Refresh Jobs", 0, _dock_parent, false, this, SLOT(refresh_job()));
201 _get_results_job_action = _wrapper->createAction("Get Job Results", QIcon(), "Get Job Results", "Get Job Results", 0, _dock_parent, false, this, SLOT(refresh_job()));
202 _stop_job_action = _wrapper->createAction("Stop a Job", QIcon(), "Stop a Job", "Stop a Job", 0, _dock_parent, false, this, SLOT(stop_job()));
206 BL::GenericGui::createMenus()
208 DEBTRACE("CreateMenus BL::GenericGui");
209 int menu_id = _wrapper->createTopMenu("JobManager");
210 _wrapper->addActionToMenu(_create_job_action, menu_id);
211 _wrapper->addActionToMenu(_edit_clone_job_action, menu_id);
212 _wrapper->addActionToMenu(_start_job_action, menu_id);
213 _wrapper->addActionToMenu(_restart_job_action, menu_id);
214 _wrapper->addActionToMenu(_stop_job_action, menu_id);
215 _wrapper->addActionToMenu(_delete_job_action, menu_id);
216 _wrapper->addActionToMenu(_get_results_job_action, menu_id);
217 _wrapper->addActionToMenu(_refresh_job_action, menu_id);
221 BL::GenericGui::create_job()
223 DEBTRACE("Create Job Slot BL::GenericGui");
224 _jobs_manager->create_job();
228 BL::GenericGui::edit_clone_job()
230 DEBTRACE("Edit/Clone Job Slot BL::GenericGui");
231 _jobs_manager->edit_clone_job(_job_name_selected.toUtf8().constData());
235 BL::GenericGui::start_job()
237 DEBTRACE("Start Job Slot BL::GenericGui");
238 _jobs_manager->start_job(_job_name_selected.toUtf8().constData());
239 updateButtonsStates();
243 BL::GenericGui::restart_job()
245 DEBTRACE("Restart Job Slot BL::GenericGui");
246 _jobs_manager->restart_job(_job_name_selected.toUtf8().constData());
247 updateButtonsStates();
251 BL::GenericGui::refresh_job()
253 DEBTRACE("Refresh Job Slot BL::GenericGui");
254 _jobs_manager->refresh_jobs();
258 BL::GenericGui::get_results_job()
260 DEBTRACE("Get Results Job Slot BL::GenericGui");
261 if (!_jobs_table->isMultipleSelected())
263 _jobs_manager->get_results_job(_job_name_selected.toUtf8().constData());
267 QModelIndexList selected_rows = _jobs_table->selectionModel()->selectedRows();
268 for (int i = 0; i < selected_rows.length(); ++i)
270 QString job_name = _model->itemFromIndex(selected_rows[i])->text();
271 _jobs_manager->get_results_job(job_name.toUtf8().constData());
277 BL::GenericGui::stop_job()
279 DEBTRACE("Stop Job Slot BL::GenericGui");
280 if (!_jobs_table->isMultipleSelected())
282 _jobs_manager->stop_job(_job_name_selected.toUtf8().constData());
286 QModelIndexList selected_rows = _jobs_table->selectionModel()->selectedRows();
287 for (int i = 0; i < selected_rows.length(); ++i)
289 QString job_name = _model->itemFromIndex(selected_rows[i])->text();
290 _jobs_manager->stop_job(job_name.toUtf8().constData());
297 BL::GenericGui::delete_job()
299 DEBTRACE("Delete Job Slot BL::GenericGui");
300 int ret = QMessageBox::Cancel;
302 if (!_jobs_table->isMultipleSelected())
304 ret = QMessageBox::warning(NULL, "Delete a job", "Do you really want to delete job " + _job_name_selected + " ? ",
305 QMessageBox::Ok|QMessageBox::Cancel,
310 ret = QMessageBox::warning(NULL, "Delete jobs", "Do you really want to delete these jobs ?",
311 QMessageBox::Ok|QMessageBox::Cancel,
314 if (ret == QMessageBox::Ok)
316 delete_job_internal();
321 BL::GenericGui::delete_job_external(const QString & name)
323 DEBTRACE("Delete Job External");
324 _jobs_manager->delete_job(name);
325 if (!_jobs_table->selectCurrent())
327 _job_name_selected = "";
328 updateButtonsStates();
333 BL::GenericGui::delete_job_internal()
335 if (!_jobs_table->isMultipleSelected())
337 QModelIndexList selected_list = _jobs_table->getSelectedIndexes();
338 QString job_name_to_delete = _model->itemFromIndex(selected_list[0])->text();
339 DEBTRACE("Single Deleting job: " << job_name_to_delete.toUtf8().constData());
340 _jobs_manager->delete_job(job_name_to_delete);
341 if (!_jobs_table->selectCurrent())
343 _job_name_selected = "";
344 updateButtonsStates();
349 QModelIndexList selected_list = _jobs_table->getSelectedIndexes();
350 QString job_name = _model->itemFromIndex(selected_list[0])->text();
351 DEBTRACE("Multiple Deleting job: " << job_name.toUtf8().constData());
352 _jobs_manager->delete_job(job_name);
353 delete_job_internal(); // Recursive delete
358 BL::GenericGui::reset_job_selection()
360 _job_name_selected = "";
362 updateButtonsStates();
366 BL::GenericGui::job_selected(const QModelIndex & index)
368 DEBTRACE("BL::GenericGui::job_selected");
370 //Find if a job is selected (ignore index)
371 //If Multiple job are selected, take first job
372 QItemSelectionModel * selection_model = _jobs_table->selectionModel();
373 QModelIndexList selected_rows = selection_model->selectedRows();
374 if (selected_rows.length() >= 1)
376 QModelIndex idx = selected_rows[0];
377 QStandardItem * item = _model->itemFromIndex(idx);
378 QStandardItem * item_name = _model->item(item->row());
379 _job_name_selected = item_name->text();
380 _job_tab->job_selected(idx);
381 DEBTRACE("BL::GenericGui::job_selected name is " << _job_name_selected.toUtf8().constData());
385 _job_name_selected = "";
387 DEBTRACE("BL::GenericGui::job_selected - no jobs are selected");
389 updateButtonsStates();
393 BL::GenericGui::job_activated(const QModelIndex & index)
395 DEBTRACE("BL::GenericGui::job_activated slot");
400 BL::GenericGui::job_state_changed(const QString & name)
402 if (name == _job_name_selected)
403 updateButtonsStates();
407 BL::GenericGui::updateButtonsStates()
409 if (!_jobs_table->isMultipleSelected())
411 updateButtonsStatesSingleSelection();
415 _start_job_action->setEnabled(false);
416 _edit_clone_job_action->setEnabled(false);
417 _restart_job_action->setEnabled(false);
418 _buttons->disable_start_button();
419 _buttons->disable_edit_clone_button();
420 _buttons->disable_restart_button();
422 // You can always delete jobs
423 _delete_job_action->setEnabled(true);
424 _buttons->enable_delete_button();
427 bool enable_stop = true;
428 QModelIndexList selected_rows = _jobs_table->selectionModel()->selectedRows();
429 for (int i = 0; i < selected_rows.length(); ++i)
431 QString job_name = _model->itemFromIndex(selected_rows[i])->text();
432 BL::Job * job = _jobs_manager->getJob(job_name.toUtf8().constData());
433 BL::Job::State job_state = job->getState();
434 if (job_state != BL::Job::QUEUED &&
435 job_state != BL::Job::RUNNING &&
436 job_state != BL::Job::PAUSED)
441 _stop_job_action->setEnabled(true);
442 _buttons->enable_stop_button();
446 _stop_job_action->setEnabled(false);
447 _buttons->disable_stop_button();
450 // Enable get_results ?
451 bool enable_results = true;
452 for (int i = 0; i < selected_rows.length(); ++i)
454 QString job_name = _model->itemFromIndex(selected_rows[i])->text();
455 BL::Job * job = _jobs_manager->getJob(job_name.toUtf8().constData());
456 BL::Job::State job_state = job->getState();
457 if (job_state != BL::Job::FINISHED &&
458 job_state != BL::Job::FAILED)
459 enable_results= false;
463 _get_results_job_action->setEnabled(true);
464 _buttons->enable_get_results_button();
468 _get_results_job_action->setEnabled(false);
469 _buttons->disable_get_results_button();
475 BL::GenericGui::updateButtonsStatesSingleSelection()
477 DEBTRACE("BL::GenericGui::updateButtonsStatesSingleSelection slot");
479 // First case: no job selected
480 if (_job_name_selected == "")
482 _start_job_action->setEnabled(false);
483 _delete_job_action->setEnabled(false);
484 _get_results_job_action->setEnabled(false);
485 _buttons->disable_start_button();
486 _buttons->disable_delete_button();
487 _buttons->disable_get_results_button();
488 _edit_clone_job_action->setEnabled(false);
489 _buttons->disable_edit_clone_button();
490 _restart_job_action->setEnabled(false);
491 _buttons->disable_restart_button();
492 _stop_job_action->setEnabled(false);
493 _buttons->disable_stop_button();
495 else if (_job_name_selected != "")
497 BL::Job * job = _jobs_manager->getJob(_job_name_selected.toUtf8().constData());
498 BL::Job::State job_state = job->getState();
500 _edit_clone_job_action->setEnabled(true);
501 _buttons->enable_edit_clone_button();
504 case BL::Job::CREATED:
505 _start_job_action->setEnabled(true);
506 _delete_job_action->setEnabled(true);
507 _get_results_job_action->setEnabled(false);
508 _buttons->enable_start_button();
509 _buttons->enable_delete_button();
510 _buttons->disable_get_results_button();
511 _restart_job_action->setEnabled(false);
512 _buttons->disable_restart_button();
513 _stop_job_action->setEnabled(false);
514 _buttons->disable_stop_button();
517 case BL::Job::IN_PROCESS:
518 _start_job_action->setEnabled(false);
519 _buttons->disable_start_button();
520 _delete_job_action->setEnabled(false);
521 _buttons->disable_delete_button();
522 _get_results_job_action->setEnabled(false);
523 _buttons->disable_get_results_button();
524 _restart_job_action->setEnabled(false);
525 _buttons->disable_restart_button();
526 _stop_job_action->setEnabled(false);
527 _buttons->disable_stop_button();
530 case BL::Job::QUEUED:
531 _start_job_action->setEnabled(false);
532 _buttons->disable_start_button();
533 _delete_job_action->setEnabled(true);
534 _buttons->enable_delete_button();
535 _get_results_job_action->setEnabled(false);
536 _buttons->disable_get_results_button();
537 _restart_job_action->setEnabled(false);
538 _buttons->disable_restart_button();
539 _stop_job_action->setEnabled(true);
540 _buttons->enable_stop_button();
543 case BL::Job::RUNNING:
544 _start_job_action->setEnabled(false);
545 _buttons->disable_start_button();
546 _delete_job_action->setEnabled(true);
547 _buttons->enable_delete_button();
548 _get_results_job_action->setEnabled(false);
549 _buttons->disable_get_results_button();
550 _restart_job_action->setEnabled(false);
551 _buttons->disable_restart_button();
552 _stop_job_action->setEnabled(true);
553 _buttons->enable_stop_button();
556 case BL::Job::PAUSED:
557 _start_job_action->setEnabled(false);
558 _buttons->disable_start_button();
559 _delete_job_action->setEnabled(true);
560 _buttons->enable_delete_button();
561 _get_results_job_action->setEnabled(false);
562 _buttons->disable_get_results_button();
563 _restart_job_action->setEnabled(false);
564 _buttons->disable_restart_button();
565 _stop_job_action->setEnabled(true);
566 _buttons->enable_stop_button();
570 _start_job_action->setEnabled(false);
571 _buttons->disable_start_button();
572 _delete_job_action->setEnabled(true);
573 _buttons->enable_delete_button();
574 _get_results_job_action->setEnabled(false);
575 _buttons->disable_get_results_button();
576 _restart_job_action->setEnabled(true);
577 _buttons->enable_restart_button();
578 _stop_job_action->setEnabled(false);
579 _buttons->disable_stop_button();
582 case BL::Job::FINISHED:
583 _start_job_action->setEnabled(false);
584 _buttons->disable_start_button();
585 _delete_job_action->setEnabled(true);
586 _buttons->enable_delete_button();
587 _get_results_job_action->setEnabled(true);
588 _buttons->enable_get_results_button();
589 _restart_job_action->setEnabled(true);
590 _buttons->enable_restart_button();
591 _stop_job_action->setEnabled(false);
592 _buttons->disable_stop_button();
595 case BL::Job::FAILED:
596 _start_job_action->setEnabled(false);
597 _buttons->disable_start_button();
598 _delete_job_action->setEnabled(true);
599 _buttons->enable_delete_button();
600 _get_results_job_action->setEnabled(true);
601 _buttons->enable_get_results_button();
602 _restart_job_action->setEnabled(true);
603 _buttons->enable_restart_button();
604 _stop_job_action->setEnabled(false);
605 _buttons->disable_stop_button();
608 case BL::Job::NOT_CREATED:
609 _start_job_action->setEnabled(false);
610 _buttons->disable_start_button();
611 _delete_job_action->setEnabled(true);
612 _buttons->enable_delete_button();
613 _get_results_job_action->setEnabled(false);
614 _buttons->disable_get_results_button();
615 _restart_job_action->setEnabled(true);
616 _buttons->enable_restart_button();
617 _stop_job_action->setEnabled(false);
618 _buttons->disable_stop_button();
624 DEBTRACE("ERROR in updateButtonsStates !!!!!!");