1 // Copyright (C) 2009-2013 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.
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_JobsManager_QT.hxx"
21 #include "BL_GenericGui.hxx"
23 BL::JobManagerEvent::JobManagerEvent(const std::string & action_i,
24 const std::string & event_name_i,
25 const std::string & job_name_i,
26 const std::string & data_i) : QEvent(QEvent::User)
29 event_name = event_name_i;
30 job_name = job_name_i;
34 BL::JobManagerEvent::~JobManagerEvent() {}
36 BL::JobsManager_QT::JobsManager_QT(QWidget * parent, BL::GenericGui * main_gui, BL::SALOMEServices * salome_services) :
37 QDockWidget(parent), BL::JobsManager(salome_services)
39 DEBTRACE("Creating BL::JobsManager_QT");
42 _model_manager = NULL;
46 QWidget * main_widget = new QWidget(this);
48 _load_jobs = new QPushButton("Load Jobs");
49 _save_jobs = new QPushButton("Save Jobs");
50 connect(_load_jobs, SIGNAL(clicked()), this, SLOT(load_jobs_button()));
51 connect(_save_jobs, SIGNAL(clicked()), this, SLOT(save_jobs_button()));
53 _auto_refresh_jobs = new QPushButton("Auto Refresh: no");
54 _timer = new QTimer(this);
56 connect(_timer, SIGNAL(timeout()), this, SLOT(RefreshJobs()));
58 // Menu for auto refresh
59 QMenu * refresh_menu = new QMenu(this);
60 refresh_menu->addAction("No", this, SLOT(no_auto_refresh()));
61 refresh_menu->addAction("10 seconds", this, SLOT(ten_seconds_refresh()));
62 refresh_menu->addAction("30 seconds", this, SLOT(thirty_seconds_refresh()));
63 refresh_menu->addAction("1 minute", this, SLOT(one_minute_refresh()));
64 refresh_menu->addAction("5 minutes", this, SLOT(five_minutes_refresh()));
65 refresh_menu->addAction("30 minutes", this, SLOT(thirty_minutes_refresh()));
66 refresh_menu->addAction("1 hour", this, SLOT(one_hour_refresh()));
67 _auto_refresh_jobs->setMenu(refresh_menu);
69 QHBoxLayout * button_layout = new QHBoxLayout();
70 button_layout->addWidget(_load_jobs);
71 button_layout->addWidget(_save_jobs);
72 button_layout->addWidget(_auto_refresh_jobs);
74 QGroupBox * message_box = new QGroupBox("Messages");
75 _log = new QTextEdit(this);
76 _log->setReadOnly(true);
77 QVBoxLayout * message_box_layout = new QVBoxLayout(message_box);
78 message_box_layout->addWidget(_log);
79 message_box->setLayout(message_box_layout);
81 QVBoxLayout * mainLayout = new QVBoxLayout();
82 mainLayout->addLayout(button_layout);
83 mainLayout->addWidget(message_box);
84 main_widget->setLayout(mainLayout);
86 QScrollArea * scroll_widget = new QScrollArea(this);
87 scroll_widget->setWidget(main_widget);
88 scroll_widget->setWidgetResizable(true);
89 setWidget(scroll_widget);
90 setWindowTitle("Job Manager");
93 BL::JobsManager_QT::~JobsManager_QT()
95 DEBTRACE("Destroying BL::JobsManager_QT");
99 BL::JobsManager_QT::set_model_manager(BL::QModelManager * model_manager)
101 _model_manager = model_manager;
105 BL::JobsManager_QT::load_jobs_button()
107 DEBTRACE("load_jobs");
108 QString jobs_file = QFileDialog::getOpenFileName(this,
109 tr("Choose an xml jobs file"), "",
110 tr("xml (*.xml);;All Files (*)"));
113 write_normal_text("Load jobs action cancelled\n");
116 load_jobs(jobs_file.toStdString());
120 BL::JobsManager_QT::save_jobs_button()
122 DEBTRACE("save_jobs");
123 QFileDialog dialog(this, "Save jobs file");
125 filters << "XML files (*.xml)"
127 dialog.setFileMode(QFileDialog::AnyFile);
128 dialog.setFilters(filters);
129 dialog.selectFilter("(*.xml)");
130 dialog.setDefaultSuffix("xml");
131 dialog.setConfirmOverwrite(true);
132 dialog.setAcceptMode(QFileDialog::AcceptSave);
133 QString jobs_file("");
134 QStringList fileNames;
136 if (bool ret = dialog.exec())
138 DEBTRACE(ret << " " << dialog.confirmOverwrite());
139 fileNames = dialog.selectedFiles();
140 if (!fileNames.isEmpty())
141 jobs_file= fileNames.first();
145 write_normal_text("Save jobs action cancelled\n");
148 save_jobs(jobs_file.toStdString());
152 BL::JobsManager_QT::RefreshJobs()
158 BL::JobsManager_QT::no_auto_refresh()
160 _auto_refresh_jobs->setText("Auto Refresh: no");
165 BL::JobsManager_QT::ten_seconds_refresh()
167 _auto_refresh_jobs->setText("Auto Refresh: 10s");
169 _timer->start(10 * 1000);
173 BL::JobsManager_QT::thirty_seconds_refresh()
175 _auto_refresh_jobs->setText("Auto Refresh: 30s");
177 _timer->start(30 * 1000);
181 BL::JobsManager_QT::one_minute_refresh()
183 _auto_refresh_jobs->setText("Auto Refresh: 1min");
185 _timer->start(1 * 60 * 1000);
189 BL::JobsManager_QT::five_minutes_refresh()
191 _auto_refresh_jobs->setText("Auto Refresh: 5min");
193 _timer->start(5 * 60 * 1000);
197 BL::JobsManager_QT::thirty_minutes_refresh()
199 _auto_refresh_jobs->setText("Auto Refresh: 30min");
201 _timer->start(30 * 60 * 1000);
205 BL::JobsManager_QT::one_hour_refresh()
207 _auto_refresh_jobs->setText("Auto Refresh: 1hour");
209 _timer->start(1 * 60 * 60 * 1000);
213 BL::JobsManager_QT::restart_job(const std::string & name)
215 DEBTRACE("Restart job with name: " << name);
216 BL::CreateJobWizard wizard(this, _salome_services);
219 wizard.job_name = name;
220 wizard.start_job = true;
221 _main_gui->delete_job_internal();
222 create_job_with_wizard(wizard);
226 BL::JobsManager_QT::edit_clone_job(const std::string & name)
228 BL::CreateJobWizard wizard(this, _salome_services);
232 // Check if the job has the same name
233 if (name == wizard.job_name)
235 DEBTRACE("Job " << name << " has been edited");
236 _main_gui->delete_job_internal();
239 if (wizard.job_name != "")
241 create_job_with_wizard(wizard);
245 DEBTRACE("User cancel Create Job Wizard");
250 BL::JobsManager_QT::create_job()
252 BL::CreateJobWizard wizard(this, _salome_services);
254 if (wizard.job_name != "")
256 create_job_with_wizard(wizard);
260 DEBTRACE("User cancel Create Job Wizard");
265 BL::JobsManager_QT::create_job_with_wizard(BL::CreateJobWizard & wizard)
267 BL::Job * new_job = createJob(wizard.job_name);
268 if (wizard.yacs_file != "")
271 new_job->setType(BL::Job::YACS_SCHEMA);
272 new_job->setJobFile(wizard.yacs_file);
273 new_job->setDumpYACSState(wizard.dump_yacs_state);
275 else if (wizard.command != "")
278 new_job->setType(BL::Job::COMMAND);
279 new_job->setJobFile(wizard.command);
281 else if (wizard.python_salome_file != "")
284 new_job->setType(BL::Job::PYTHON_SALOME);
285 new_job->setJobFile(wizard.python_salome_file);
289 new_job->setEnvFile(wizard.env_file);
290 BL::Job::BatchParam param;
291 param.batch_directory = wizard.batch_directory;
292 param.maximum_duration = wizard.maximum_duration;
293 param.expected_memory = wizard.expected_memory;
294 param.nb_proc = wizard.nb_proc;
295 new_job->setBatchParameters(param);
296 BL::Job::FilesParam files_params;
297 files_params.result_directory = wizard.result_directory;
298 files_params.input_files_list = wizard.input_files_list;
299 files_params.output_files_list = wizard.output_files_list;
300 new_job->setFilesParameters(files_params);
301 new_job->setResource(wizard.resource_choosed);
302 new_job->setBatchQueue(wizard.batch_queue);
303 new_job->setLoadLevelerJobType(wizard.ll_jobtype);
306 addJobToLauncher(wizard.job_name);
307 emit new_job_added(QString::fromStdString(wizard.job_name));
308 QStandardItemModel * model = _model_manager->getModel();
309 QList<QStandardItem *> item_list = model->findItems(QString::fromStdString(wizard.job_name));
310 QStandardItem * job_state_item = model->item(item_list.at(0)->row(), 2);
311 _main_gui->_jobs_table->selectRow(item_list.at(0)->row());
312 if (wizard.start_job)
313 start_job(wizard.job_name);
317 BL::JobsManager_QT::delete_job(QString job_name)
319 BL::JobsManager::removeJob(job_name.toStdString());
320 _model_manager->delete_job(job_name);
321 _main_gui->_job_tab->reset(job_name);
325 BL::JobsManager_QT::sendEvent(const std::string & action,
326 const std::string & event_name,
327 const std::string & job_name,
328 const std::string & data)
330 DEBTRACE("sendEvent BL::JobsManager_QT");
332 // Sending a QEvent to go back to main thread
333 BL::JobManagerEvent * event = new JobManagerEvent(action, event_name, job_name, data);
334 QApplication::postEvent(this, event);
338 BL::JobsManager_QT::event(QEvent * e)
340 QDockWidget::event(e);
341 JobManagerEvent * event = dynamic_cast<JobManagerEvent*>(e);
342 if (!event) return false;
344 DEBTRACE("BL::JobsManager_QT Receiving event : "
345 << event->action << " "
346 << event->event_name << " "
347 << event->job_name << " "
350 if (event->action == "create_job")
352 if (event->event_name == "Ok")
354 QString str((event->job_name).c_str());
355 write_normal_text("Job " + str + " created\n");
359 QString str((event->job_name).c_str());
360 write_error_text("Error in creating job: " + str + "\n");
361 write_error_text("*** ");
362 write_error_text((event->data).c_str());
363 write_error_text(" ***\n");
366 else if (event->action == "start_job")
368 if (event->event_name == "Ok")
370 QString str((event->job_name).c_str());
371 write_normal_text("Job " + str + " queued\n");
375 QString str((event->job_name).c_str());
376 write_error_text("Error in starting job: " + str + "\n");
377 write_error_text("*** ");
378 write_error_text((event->data).c_str());
379 write_error_text(" ***\n");
381 emit job_state_changed(QString((event->job_name).c_str()));
383 else if (event->action == "refresh_job")
385 if (event->event_name == "Ok")
387 QString name((event->job_name).c_str());
388 QString state((event->data).c_str());
389 state = state.toLower();
390 write_normal_text("Job " + name + " new state is " + state + "\n");
391 emit job_state_changed(QString((event->job_name).c_str()));
395 QString str((event->job_name).c_str());
396 write_error_text("Error in refreshing job: " + str + "\n");
397 write_error_text("*** ");
398 write_error_text((event->data).c_str());
399 write_error_text(" ***\n");
402 else if (event->action == "delete_job")
404 if (event->event_name == "Ok")
406 QString str((event->job_name).c_str());
407 write_normal_text("Job " + str + " deleted\n");
411 QString str((event->job_name).c_str());
412 write_error_text("Warning delete job: " + str + " maybe not complete, exception catch in SALOME Launcher service\n");
413 write_error_text("*** ");
414 write_error_text((event->data).c_str());
415 write_error_text(" ***\n");
418 else if (event->action == "get_results_job")
420 if (event->event_name == "Ok")
422 QString str((event->job_name).c_str());
423 write_normal_text("Results of Job " + str + " are get\n");
427 QString str((event->job_name).c_str());
428 write_error_text("Warning for results of job: " + str + " maybe not complete, exception catch in SALOME Launcher service\n");
429 write_error_text("*** ");
430 write_error_text((event->data).c_str());
431 write_error_text(" ***\n");
434 else if (event->action == "stop_job")
436 if (event->event_name == "Ok")
438 QString str((event->job_name).c_str());
439 write_normal_text("Job " + str + " is stopped\n");
443 QString str((event->job_name).c_str());
444 write_error_text("Error when trying to stop job: " + str + "\n");
445 write_error_text("*** ");
446 write_error_text((event->data).c_str());
447 write_error_text(" ***\n");
450 else if (event->action == "save_jobs")
452 if (event->event_name == "Error")
454 write_error_text("Error in saving jobs: \n");
455 write_error_text("*** ");
456 write_error_text((event->data).c_str());
457 write_error_text(" ***\n");
461 QString str((event->data).c_str());
462 write_normal_text("Jobs saved in file " + str + "\n");
465 else if (event->action == "load_jobs")
467 if (event->event_name == "Error")
469 write_error_text("Error in loading jobs: \n");
470 write_error_text("*** ");
471 write_error_text((event->data).c_str());
472 write_error_text(" ***\n");
476 QString str((event->data).c_str());
477 write_normal_text("Jobs loaded from file " + str + "\n");
480 else if (event->action == "add_job")
482 if (event->event_name == "Ok")
484 QString str((event->job_name).c_str());
485 write_normal_text("New job added " + str + "\n");
486 emit new_job_added(str);
489 else if (event->action == "to_remove_job")
491 if (event->event_name == "Ok")
492 _main_gui->delete_job_external((event->job_name).c_str());
496 QString str((event->action).c_str());
497 write_error_text("Unknown type of event received:" + str + "\n");
503 BL::JobsManager_QT::write_normal_text(const QString & text)
505 _log->setReadOnly(false);
506 QTextCursor cursor = _log->textCursor();
507 QTextCharFormat text_format;
508 text_format.setForeground(Qt::darkBlue);
509 cursor.insertText(text, text_format);
510 _log->setTextCursor(cursor);
511 _log->setReadOnly(true);
515 BL::JobsManager_QT::write_error_text(const QString & text)
517 _log->setReadOnly(false);
518 QTextCursor cursor = _log->textCursor();
519 QTextCharFormat text_format;
520 text_format.setForeground(Qt::red);
521 cursor.insertText(text, text_format);
522 _log->setTextCursor(cursor);
523 _log->setReadOnly(true);