1 // Copyright (C) 2009 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"
22 BL::JobManagerEvent::JobManagerEvent(const std::string & action_i,
23 const std::string & event_name_i,
24 const std::string & job_name_i,
25 const std::string & data_i) : QEvent(QEvent::User)
28 event_name = event_name_i;
29 job_name = job_name_i;
33 BL::JobManagerEvent::~JobManagerEvent() {}
35 BL::JobsManager_QT::JobsManager_QT(QWidget * parent, BL::SALOMEServices * salome_services) :
36 QDockWidget(parent), BL::JobsManager(salome_services)
38 DEBTRACE("Creating BL::JobsManager_QT");
43 QWidget * main_widget = new QWidget(this);
45 _load_jobs = new QPushButton("Load Jobs");
46 _save_jobs = new QPushButton("Save Jobs");
47 _auto_refresh_jobs = new QPushButton("Auto Refresh: no");
48 _timer = new QTimer(this);
50 connect(_timer, SIGNAL(timeout()), this, SLOT(RefreshJobs()));
52 // Menu for auto refresh
53 QMenu * refresh_menu = new QMenu(this);
54 refresh_menu->addAction("No", this, SLOT(no_auto_refresh()));
55 refresh_menu->addAction("10 seconds", this, SLOT(ten_seconds_refresh()));
56 refresh_menu->addAction("30 seconds", this, SLOT(thirty_seconds_refresh()));
57 refresh_menu->addAction("1 minute", this, SLOT(one_minute_refresh()));
58 refresh_menu->addAction("5 minutes", this, SLOT(five_minutes_refresh()));
59 refresh_menu->addAction("30 minutes", this, SLOT(thirty_minutes_refresh()));
60 refresh_menu->addAction("1 hour", this, SLOT(one_hour_refresh()));
61 _auto_refresh_jobs->setMenu(refresh_menu);
63 QHBoxLayout * button_layout = new QHBoxLayout();
64 button_layout->addWidget(_load_jobs);
65 button_layout->addWidget(_save_jobs);
66 button_layout->addWidget(_auto_refresh_jobs);
68 QGroupBox * message_box = new QGroupBox("Messages");
69 _log = new QTextEdit(this);
70 _log->setReadOnly(true);
71 QVBoxLayout * message_box_layout = new QVBoxLayout(message_box);
72 message_box_layout->addWidget(_log);
73 message_box->setLayout(message_box_layout);
75 QVBoxLayout * mainLayout = new QVBoxLayout();
76 mainLayout->addLayout(button_layout);
77 mainLayout->addWidget(message_box);
78 main_widget->setLayout(mainLayout);
80 setWidget(main_widget);
81 setWindowTitle("Job Manager");
84 BL::JobsManager_QT::~JobsManager_QT()
86 DEBTRACE("Destroying BL::JobsManager_QT");
90 BL::JobsManager_QT::RefreshJobs()
96 BL::JobsManager_QT::no_auto_refresh()
98 _auto_refresh_jobs->setText("Auto Refresh: no");
103 BL::JobsManager_QT::ten_seconds_refresh()
105 _auto_refresh_jobs->setText("Auto Refresh: 10s");
107 _timer->start(10 * 1000);
111 BL::JobsManager_QT::thirty_seconds_refresh()
113 _auto_refresh_jobs->setText("Auto Refresh: 30s");
115 _timer->start(30 * 1000);
119 BL::JobsManager_QT::one_minute_refresh()
121 _auto_refresh_jobs->setText("Auto Refresh: 1min");
123 _timer->start(1 * 60 * 1000);
127 BL::JobsManager_QT::five_minutes_refresh()
129 _auto_refresh_jobs->setText("Auto Refresh: 5min");
131 _timer->start(5 * 60 * 1000);
135 BL::JobsManager_QT::thirty_minutes_refresh()
137 _auto_refresh_jobs->setText("Auto Refresh: 30min");
139 _timer->start(30 * 60 * 1000);
143 BL::JobsManager_QT::one_hour_refresh()
145 _auto_refresh_jobs->setText("Auto Refresh: 1hour");
147 _timer->start(1 * 60 * 60 * 1000);
151 BL::JobsManager_QT::create_job_wizard()
153 BL::CreateJobWizard wizard(this, _salome_services);
156 if (wizard.job_name != "")
158 BL::Job * new_job = addNewJob(wizard.job_name);
159 if (wizard.yacs_file != "")
162 new_job->setType(BL::Job::YACS_SCHEMA);
163 new_job->setYACSFile(wizard.yacs_file);
164 BL::Job::BatchParam param;
165 param.batch_directory = wizard.batch_directory;
166 param.expected_during_time = wizard.expected_during_time;
167 param.expected_memory = wizard.expected_memory;
168 param.nb_proc = wizard.nb_proc;
169 new_job->setBatchParameters(param);
170 BL::Job::FilesParam files_params;
171 files_params.result_directory = wizard.result_directory;
172 files_params.input_files_list = wizard.input_files_list;
173 files_params.output_files_list = wizard.output_files_list;
174 new_job->setFilesParameters(files_params);
175 new_job->setMachine(wizard.machine_choosed);
180 new_job->setType(BL::Job::COMMAND);
181 new_job->setCommand(wizard.command);
182 BL::Job::BatchParam param;
183 param.batch_directory = wizard.batch_directory;
184 param.expected_during_time = wizard.expected_during_time;
185 param.expected_memory = wizard.expected_memory;
186 param.nb_proc = wizard.nb_proc;
187 new_job->setBatchParameters(param);
188 BL::Job::FilesParam files_params;
189 files_params.result_directory = wizard.result_directory;
190 files_params.input_files_list = wizard.input_files_list;
191 files_params.output_files_list = wizard.output_files_list;
192 new_job->setFilesParameters(files_params);
193 new_job->setMachine(wizard.machine_choosed);
195 emit new_job_added(QString::fromStdString(wizard.job_name));
196 if (wizard.start_job)
197 start_job(wizard.job_name);
201 DEBTRACE("User cancel Create Job Wizard");
206 BL::JobsManager_QT::delete_job(QString job_name)
208 BL::JobsManager::removeJob(job_name.toStdString());
212 BL::JobsManager_QT::sendEvent(const std::string & action,
213 const std::string & event_name,
214 const std::string & job_name,
215 const std::string & data)
217 DEBTRACE("sendEvent BL::JobsManager_QT");
219 // Sending a QEvent to go back to main thread
220 BL::JobManagerEvent * event = new JobManagerEvent(action, event_name, job_name, data);
221 QApplication::postEvent(this, event);
225 BL::JobsManager_QT::event(QEvent * e)
227 QDockWidget::event(e);
228 JobManagerEvent * event = dynamic_cast<JobManagerEvent*>(e);
229 if (!event) return false;
231 DEBTRACE("BL::JobsManager_QT Receiving event : "
232 << event->action << " "
233 << event->event_name << " "
234 << event->job_name << " "
236 if (event->action == "start_job")
238 if (event->event_name == "Ok")
240 QString str((event->job_name).c_str());
241 write_normal_text("Job " + str + " queued\n");
245 QString str((event->job_name).c_str());
246 write_error_text("Error in starting job: " + str + "\n");
247 write_error_text("*** ");
248 write_error_text((event->data).c_str());
249 write_error_text(" ***\n");
251 emit job_state_changed(QString((event->job_name).c_str()));
253 else if (event->action == "refresh_job")
255 if (event->event_name == "Ok")
257 QString str((event->job_name).c_str());
258 write_normal_text("Job " + str + " state changed\n");
259 emit job_state_changed(QString((event->job_name).c_str()));
263 QString str((event->job_name).c_str());
264 write_error_text("Error in refreshing job: " + str + "\n");
265 write_error_text("*** ");
266 write_error_text((event->data).c_str());
267 write_error_text(" ***\n");
270 else if (event->action == "delete_job")
272 if (event->event_name == "Ok")
274 QString str((event->job_name).c_str());
275 write_normal_text("Job " + str + " deleted\n");
279 QString str((event->job_name).c_str());
280 write_error_text("Warning delete job: " + str + " maybe not complete, exception catch in SALOME Launcher service\n");
281 write_error_text("*** ");
282 write_error_text((event->data).c_str());
283 write_error_text(" ***\n");
286 else if (event->action == "get_results_job")
288 if (event->event_name == "Ok")
290 QString str((event->job_name).c_str());
291 write_normal_text("Results of Job " + str + " are get\n");
295 QString str((event->job_name).c_str());
296 write_error_text("Warning for results of job: " + str + " maybe not complete, exception catch in SALOME Launcher service\n");
297 write_error_text("*** ");
298 write_error_text((event->data).c_str());
299 write_error_text(" ***\n");
304 QString str((event->action).c_str());
305 write_error_text("Unknown type of event received:" + str + "\n");
311 BL::JobsManager_QT::write_normal_text(const QString & text)
313 _log->setReadOnly(false);
314 QTextCursor cursor = _log->textCursor();
315 QTextCharFormat text_format;
316 text_format.setForeground(Qt::darkBlue);
317 cursor.insertText(text, text_format);
318 _log->setTextCursor(cursor);
319 _log->setReadOnly(true);
323 BL::JobsManager_QT::write_error_text(const QString & text)
325 QTextCursor cursor = _log->textCursor();
326 QTextCharFormat text_format;
327 text_format.setForeground(Qt::red);
328 cursor.insertText(text, text_format);
329 _log->setTextCursor(cursor);