1 // Copyright (C) 2009-2014 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"
26 BL::GenericGui::GenericGui(BL::MainWindows_Wrap * wrapper) : QObject(wrapper->getDockParent())
28 DEBTRACE("Creating BL::GenericGui");
31 _job_name_selected = "";
33 _dock_parent = _wrapper->getDockParent();
35 // _salome_services is a servant
36 // POA wil destroy it at the end of the application
37 _salome_services = new BL::SALOMEServices();
40 BL::GenericGui::~GenericGui()
42 DEBTRACE("Destroying BL::GenericGui");
43 _salome_services->end();
47 BL::GenericGui::createDockWidgets()
49 DEBTRACE("createDockWidgets BL::GenericGui");
50 _jobs_manager = new BL::JobsManager_QT(_dock_parent, this, _salome_services);
51 _model_manager = new BL::QModelManager(this, _jobs_manager);
52 _model = _model_manager->getModel();
55 _dw_summary = new QDockWidget(_dock_parent);
56 _dw_summary->setWindowTitle("Summary");
57 _dw_summary->setObjectName("SummaryDockWidget");
58 _summary = new BL::Summary(_dw_summary, _jobs_manager);
59 _summary->setModel(_model);
60 QScrollArea * scroll_widget_summary = new QScrollArea(_dw_summary);
61 scroll_widget_summary->setWidget(_summary);
62 scroll_widget_summary->setWidgetResizable(true);
63 _dw_summary->setWidget(scroll_widget_summary);
66 _dw_resource_catalog = new QDockWidget(_dock_parent);
67 _dw_resource_catalog->setWindowTitle("Resource Catalog");
68 _dw_resource_catalog->setObjectName("ResourceCatalogDockWidget");
69 _resource_catalog = new JM::ResourceCatalog(_dw_resource_catalog, _salome_services, false);
70 QScrollArea * scroll_widget_resource = new QScrollArea(_dw_resource_catalog);
71 scroll_widget_resource->setWidget(_resource_catalog);
72 scroll_widget_resource->setWidgetResizable(true);
73 _dw_resource_catalog->setWidget(scroll_widget_resource);
75 /* Main Dock Window */
76 _dock_parent->addDockWidget(Qt::RightDockWidgetArea, _jobs_manager);
77 _dock_parent->addDockWidget(Qt::RightDockWidgetArea, _dw_summary);
78 _dock_parent->addDockWidget(Qt::RightDockWidgetArea, _dw_resource_catalog);
79 _dock_parent->splitDockWidget(_jobs_manager, _dw_summary, Qt::Vertical);
80 _dock_parent->tabifyDockWidget(_dw_summary, _dw_resource_catalog);
82 /* Signals and Slots */
83 // JobsManager -> Model
84 connect(_jobs_manager, SIGNAL(new_job_added(QString)), _model_manager, SLOT(new_job_added(QString)));
85 connect(_jobs_manager, SIGNAL(job_state_changed(QString)), _model_manager, SLOT(job_state_changed(QString)));
86 connect(_jobs_manager, SIGNAL(job_state_changed(QString)), this, SLOT(job_state_changed(QString)));
88 connect(_model, SIGNAL(rowsInserted(QModelIndex, int, int)), _summary, SLOT(rowsInserted(QModelIndex, int, int)));
89 connect(_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), _summary, SLOT(rowsRemoved(QModelIndex, int, int)));
90 connect(_model, SIGNAL(itemChanged(QStandardItem*)), _summary, SLOT(itemChanged(QStandardItem*)));
92 // Init at the end to be able to get jobs already in Launcher
93 if (_salome_services->initNS() == false)
94 DEBMSG("WARNING !!!!! SALOME IS NOT REACHABLE !!!!");
95 // refresh at the beacause we need that _salome_services be
97 _resource_catalog->refresh_resource_list();
101 BL::GenericGui::createCentralWidget()
103 DEBTRACE("createCentralWidget BL::GenericGui");
105 _tab_parent = _wrapper->getTabParent();
106 /* Tab Central Widget */
108 _buttons = new BL::Buttons(_tab_parent);
109 _buttons->setCreateButtonSlot(this, SLOT(create_job()));
110 _buttons->setEditCloneButtonSlot(this, SLOT(edit_clone_job()));
111 _buttons->setStartButtonSlot(this, SLOT(start_job()));
112 _buttons->setReStartButtonSlot(this, SLOT(restart_job()));
113 _buttons->setDeleteButtonSlot(this, SLOT(delete_job()));
114 _buttons->setStopButtonSlot(this, SLOT(stop_job()));
115 _buttons->setRefreshButtonSlot(this, SLOT(refresh_job()));
116 _buttons->setGetResultsButtonSlot(this, SLOT(get_results_job()));
119 _jobs_table = new BL::JobsTable(_tab_parent);
120 _jobs_table->setModel(_model);
121 _jobs_table->set_main_gui(this);
124 _job_tab = new BL::JobTab(_tab_parent, _jobs_manager);
125 _job_tab->setModel(_model);
128 QWidget * central_widget = new QWidget(_tab_parent);
129 QSplitter * tab_central_widget = new QSplitter(Qt::Vertical, _tab_parent);
130 tab_central_widget->addWidget(_jobs_table);
131 tab_central_widget->addWidget(_job_tab);
132 tab_central_widget->setChildrenCollapsible(false);
133 QVBoxLayout * central_layout = new QVBoxLayout;
134 central_layout->addWidget(_buttons);
135 central_layout->addWidget(tab_central_widget);
136 central_widget->setLayout(central_layout);
138 // Adding a scroll area for low resolution
139 QScrollArea * scroll_central_widget = new QScrollArea(_tab_parent);
140 scroll_central_widget->setWidget(central_widget);
141 scroll_central_widget->setWidgetResizable(true);
142 _tab_parent->setCentralWidget(scroll_central_widget);
144 /* Signals and Slots */
146 connect(_model, SIGNAL(itemChanged(QStandardItem*)), _job_tab, SLOT(itemChanged(QStandardItem*)));
149 connect(_jobs_table, SIGNAL(clicked(QModelIndex)), this, SLOT(job_selected(QModelIndex)));
150 connect(_jobs_table, SIGNAL(activated(QModelIndex)), this, SLOT(job_activated(QModelIndex)));
154 BL::GenericGui::deleteDockWidget()
156 // Specific for SALOME...
157 _dock_parent->removeDockWidget(_dw_summary);
159 _dock_parent->removeDockWidget(_dw_resource_catalog);
160 delete _dw_resource_catalog;
161 _dock_parent->removeDockWidget(_jobs_manager);
162 delete _jobs_manager;
166 BL::GenericGui::showDockWidgets(bool isVisible)
168 DEBTRACE("BL::GenericGui::showDockWidgets " << isVisible);
170 _jobs_manager->setVisible(isVisible);
171 _jobs_manager->toggleViewAction()->setVisible(isVisible);
174 _dw_summary->setVisible(isVisible);
175 _dw_summary->toggleViewAction()->setVisible(isVisible);
177 if (_dw_resource_catalog) {
178 _dw_resource_catalog->setVisible(isVisible);
179 _dw_resource_catalog->toggleViewAction()->setVisible(isVisible);
184 BL::GenericGui::createActions()
186 DEBTRACE("CreateActions BL::GenericGui");
187 _create_job_action = _wrapper->createAction("Create a Job", QIcon(), "Create a Job", "Create a Job", 0, _dock_parent, false, this, SLOT(create_job()));
188 _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()));
189 _start_job_action = _wrapper->createAction("Start a Job", QIcon(), "Start a Job", "Start a Job", 0, _dock_parent, false, this, SLOT(start_job()));
190 _restart_job_action = _wrapper->createAction("Restart a Job", QIcon(), "Restart a Job", "Restart a Job", 0, _dock_parent, false, this, SLOT(restart_job()));
191 _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()));
192 _refresh_job_action = _wrapper->createAction("Refresh Jobs", QIcon(), "Refresh Jobs", "Refresh Jobs", 0, _dock_parent, false, this, SLOT(refresh_job()));
193 _get_results_job_action = _wrapper->createAction("Get Job Results", QIcon(), "Get Job Results", "Get Job Results", 0, _dock_parent, false, this, SLOT(refresh_job()));
194 _stop_job_action = _wrapper->createAction("Stop a Job", QIcon(), "Stop a Job", "Stop a Job", 0, _dock_parent, false, this, SLOT(stop_job()));
198 BL::GenericGui::createMenus()
200 DEBTRACE("CreateMenus BL::GenericGui");
201 int menu_id = _wrapper->createTopMenu("JobManager");
202 _wrapper->addActionToMenu(_create_job_action, menu_id);
203 _wrapper->addActionToMenu(_edit_clone_job_action, menu_id);
204 _wrapper->addActionToMenu(_start_job_action, menu_id);
205 _wrapper->addActionToMenu(_restart_job_action, menu_id);
206 _wrapper->addActionToMenu(_stop_job_action, menu_id);
207 _wrapper->addActionToMenu(_delete_job_action, menu_id);
208 _wrapper->addActionToMenu(_get_results_job_action, menu_id);
209 _wrapper->addActionToMenu(_refresh_job_action, menu_id);
213 BL::GenericGui::create_job()
215 DEBTRACE("Create Job Slot BL::GenericGui");
216 _jobs_manager->create_job();
220 BL::GenericGui::edit_clone_job()
222 DEBTRACE("Edit/Clone Job Slot BL::GenericGui");
223 _jobs_manager->edit_clone_job(_job_name_selected.toStdString());
227 BL::GenericGui::start_job()
229 DEBTRACE("Start Job Slot BL::GenericGui");
230 _jobs_manager->start_job(_job_name_selected.toStdString());
231 updateButtonsStates();
235 BL::GenericGui::restart_job()
237 DEBTRACE("Restart Job Slot BL::GenericGui");
238 _jobs_manager->restart_job(_job_name_selected.toStdString());
239 updateButtonsStates();
243 BL::GenericGui::refresh_job()
245 DEBTRACE("Refresh Job Slot BL::GenericGui");
246 _jobs_manager->refresh_jobs();
250 BL::GenericGui::get_results_job()
252 DEBTRACE("Get Results Job Slot BL::GenericGui");
253 if (!_jobs_table->isMultipleSelected())
255 _jobs_manager->get_results_job(_job_name_selected.toStdString());
259 QModelIndexList selected_rows = _jobs_table->selectionModel()->selectedRows();
260 for (int i = 0; i < selected_rows.length(); ++i)
262 QString job_name = _model->itemFromIndex(selected_rows[i])->text();
263 _jobs_manager->get_results_job(job_name.toStdString());
269 BL::GenericGui::stop_job()
271 DEBTRACE("Stop Job Slot BL::GenericGui");
272 if (!_jobs_table->isMultipleSelected())
274 _jobs_manager->stop_job(_job_name_selected.toStdString());
278 QModelIndexList selected_rows = _jobs_table->selectionModel()->selectedRows();
279 for (int i = 0; i < selected_rows.length(); ++i)
281 QString job_name = _model->itemFromIndex(selected_rows[i])->text();
282 _jobs_manager->stop_job(job_name.toStdString());
289 BL::GenericGui::delete_job()
291 DEBTRACE("Delete Job Slot BL::GenericGui");
292 int ret = QMessageBox::Cancel;
294 if (!_jobs_table->isMultipleSelected())
296 ret = QMessageBox::warning(NULL, "Delete a job", "Do you really want to delete job " + _job_name_selected + " ? ",
297 QMessageBox::Ok|QMessageBox::Cancel,
302 ret = QMessageBox::warning(NULL, "Delete jobs", "Do you really want to delete these jobs ?",
303 QMessageBox::Ok|QMessageBox::Cancel,
306 if (ret == QMessageBox::Ok)
308 delete_job_internal();
313 BL::GenericGui::delete_job_external(const QString & name)
315 DEBTRACE("Delete Job External");
316 _jobs_manager->delete_job(name);
317 if (!_jobs_table->selectCurrent())
319 _job_name_selected = "";
320 updateButtonsStates();
325 BL::GenericGui::delete_job_internal()
327 if (!_jobs_table->isMultipleSelected())
329 QModelIndexList selected_list = _jobs_table->getSelectedIndexes();
330 QString job_name_to_delete = _model->itemFromIndex(selected_list[0])->text();
331 DEBTRACE("Single Deleting job: " << job_name_to_delete.toStdString());
332 _jobs_manager->delete_job(job_name_to_delete);
333 if (!_jobs_table->selectCurrent())
335 _job_name_selected = "";
336 updateButtonsStates();
341 QModelIndexList selected_list = _jobs_table->getSelectedIndexes();
342 QString job_name = _model->itemFromIndex(selected_list[0])->text();
343 DEBTRACE("Multiple Deleting job: " << job_name.toStdString());
344 _jobs_manager->delete_job(job_name);
345 delete_job_internal(); // Recursive delete
350 BL::GenericGui::reset_job_selection()
352 _job_name_selected = "";
354 updateButtonsStates();
358 BL::GenericGui::job_selected(const QModelIndex & index)
360 DEBTRACE("BL::GenericGui::job_selected");
362 //Find if a job is selected (ignore index)
363 //If Multiple job are selected, take first job
364 QItemSelectionModel * selection_model = _jobs_table->selectionModel();
365 QModelIndexList selected_rows = selection_model->selectedRows();
366 if (selected_rows.length() >= 1)
368 QModelIndex idx = selected_rows[0];
369 QStandardItem * item = _model->itemFromIndex(idx);
370 QStandardItem * item_name = _model->item(item->row());
371 _job_name_selected = item_name->text();
372 _job_tab->job_selected(idx);
373 DEBTRACE("BL::GenericGui::job_selected name is " << _job_name_selected.toStdString());
377 _job_name_selected = "";
379 DEBTRACE("BL::GenericGui::job_selected - no jobs are selected");
381 updateButtonsStates();
385 BL::GenericGui::job_activated(const QModelIndex & index)
387 DEBTRACE("BL::GenericGui::job_activated slot");
392 BL::GenericGui::job_state_changed(const QString & name)
394 if (name == _job_name_selected)
395 updateButtonsStates();
399 BL::GenericGui::updateButtonsStates()
401 if (!_jobs_table->isMultipleSelected())
403 updateButtonsStatesSingleSelection();
407 _start_job_action->setEnabled(false);
408 _edit_clone_job_action->setEnabled(false);
409 _restart_job_action->setEnabled(false);
410 _buttons->disable_start_button();
411 _buttons->disable_edit_clone_button();
412 _buttons->disable_restart_button();
414 // You can always delete jobs
415 _delete_job_action->setEnabled(true);
416 _buttons->enable_delete_button();
419 bool enable_stop = true;
420 QModelIndexList selected_rows = _jobs_table->selectionModel()->selectedRows();
421 for (int i = 0; i < selected_rows.length(); ++i)
423 QString job_name = _model->itemFromIndex(selected_rows[i])->text();
424 BL::Job * job = _jobs_manager->getJob(job_name.toStdString());
425 BL::Job::State job_state = job->getState();
426 if (job_state != BL::Job::QUEUED &&
427 job_state != BL::Job::RUNNING &&
428 job_state != BL::Job::PAUSED)
433 _stop_job_action->setEnabled(true);
434 _buttons->enable_stop_button();
438 _stop_job_action->setEnabled(false);
439 _buttons->disable_stop_button();
442 // Enable get_results ?
443 bool enable_results = true;
444 for (int i = 0; i < selected_rows.length(); ++i)
446 QString job_name = _model->itemFromIndex(selected_rows[i])->text();
447 BL::Job * job = _jobs_manager->getJob(job_name.toStdString());
448 BL::Job::State job_state = job->getState();
449 if (job_state != BL::Job::FINISHED &&
450 job_state != BL::Job::FAILED)
451 enable_results= false;
455 _get_results_job_action->setEnabled(true);
456 _buttons->enable_get_results_button();
460 _get_results_job_action->setEnabled(false);
461 _buttons->disable_get_results_button();
467 BL::GenericGui::updateButtonsStatesSingleSelection()
469 DEBTRACE("BL::GenericGui::updateButtonsStatesSingleSelection slot");
471 // First case: no job selected
472 if (_job_name_selected == "")
474 _start_job_action->setEnabled(false);
475 _delete_job_action->setEnabled(false);
476 _get_results_job_action->setEnabled(false);
477 _buttons->disable_start_button();
478 _buttons->disable_delete_button();
479 _buttons->disable_get_results_button();
480 _edit_clone_job_action->setEnabled(false);
481 _buttons->disable_edit_clone_button();
482 _restart_job_action->setEnabled(false);
483 _buttons->disable_restart_button();
484 _stop_job_action->setEnabled(false);
485 _buttons->disable_stop_button();
487 else if (_job_name_selected != "")
489 BL::Job * job = _jobs_manager->getJob(_job_name_selected.toStdString());
490 BL::Job::State job_state = job->getState();
492 _edit_clone_job_action->setEnabled(true);
493 _buttons->enable_edit_clone_button();
496 case BL::Job::CREATED:
497 _start_job_action->setEnabled(true);
498 _delete_job_action->setEnabled(true);
499 _get_results_job_action->setEnabled(false);
500 _buttons->enable_start_button();
501 _buttons->enable_delete_button();
502 _buttons->disable_get_results_button();
503 _restart_job_action->setEnabled(false);
504 _buttons->disable_restart_button();
505 _stop_job_action->setEnabled(false);
506 _buttons->disable_stop_button();
509 case BL::Job::IN_PROCESS:
510 _start_job_action->setEnabled(false);
511 _buttons->disable_start_button();
512 _delete_job_action->setEnabled(false);
513 _buttons->disable_delete_button();
514 _get_results_job_action->setEnabled(false);
515 _buttons->disable_get_results_button();
516 _restart_job_action->setEnabled(false);
517 _buttons->disable_restart_button();
518 _stop_job_action->setEnabled(false);
519 _buttons->disable_stop_button();
522 case BL::Job::QUEUED:
523 _start_job_action->setEnabled(false);
524 _buttons->disable_start_button();
525 _delete_job_action->setEnabled(true);
526 _buttons->enable_delete_button();
527 _get_results_job_action->setEnabled(false);
528 _buttons->disable_get_results_button();
529 _restart_job_action->setEnabled(false);
530 _buttons->disable_restart_button();
531 _stop_job_action->setEnabled(true);
532 _buttons->enable_stop_button();
535 case BL::Job::RUNNING:
536 _start_job_action->setEnabled(false);
537 _buttons->disable_start_button();
538 _delete_job_action->setEnabled(true);
539 _buttons->enable_delete_button();
540 _get_results_job_action->setEnabled(false);
541 _buttons->disable_get_results_button();
542 _restart_job_action->setEnabled(false);
543 _buttons->disable_restart_button();
544 _stop_job_action->setEnabled(true);
545 _buttons->enable_stop_button();
548 case BL::Job::PAUSED:
549 _start_job_action->setEnabled(false);
550 _buttons->disable_start_button();
551 _delete_job_action->setEnabled(true);
552 _buttons->enable_delete_button();
553 _get_results_job_action->setEnabled(false);
554 _buttons->disable_get_results_button();
555 _restart_job_action->setEnabled(false);
556 _buttons->disable_restart_button();
557 _stop_job_action->setEnabled(true);
558 _buttons->enable_stop_button();
562 _start_job_action->setEnabled(false);
563 _buttons->disable_start_button();
564 _delete_job_action->setEnabled(true);
565 _buttons->enable_delete_button();
566 _get_results_job_action->setEnabled(false);
567 _buttons->disable_get_results_button();
568 _restart_job_action->setEnabled(true);
569 _buttons->enable_restart_button();
570 _stop_job_action->setEnabled(false);
571 _buttons->disable_stop_button();
574 case BL::Job::FINISHED:
575 _start_job_action->setEnabled(false);
576 _buttons->disable_start_button();
577 _delete_job_action->setEnabled(true);
578 _buttons->enable_delete_button();
579 _get_results_job_action->setEnabled(true);
580 _buttons->enable_get_results_button();
581 _restart_job_action->setEnabled(true);
582 _buttons->enable_restart_button();
583 _stop_job_action->setEnabled(false);
584 _buttons->disable_stop_button();
587 case BL::Job::FAILED:
588 _start_job_action->setEnabled(false);
589 _buttons->disable_start_button();
590 _delete_job_action->setEnabled(true);
591 _buttons->enable_delete_button();
592 _get_results_job_action->setEnabled(true);
593 _buttons->enable_get_results_button();
594 _restart_job_action->setEnabled(true);
595 _buttons->enable_restart_button();
596 _stop_job_action->setEnabled(false);
597 _buttons->disable_stop_button();
600 case BL::Job::NOT_CREATED:
601 _start_job_action->setEnabled(false);
602 _buttons->disable_start_button();
603 _delete_job_action->setEnabled(true);
604 _buttons->enable_delete_button();
605 _get_results_job_action->setEnabled(false);
606 _buttons->disable_get_results_button();
607 _restart_job_action->setEnabled(true);
608 _buttons->enable_restart_button();
609 _stop_job_action->setEnabled(false);
610 _buttons->disable_stop_button();
616 DEBTRACE("ERROR in updateButtonsStates !!!!!!");