From: Eric Bollengier Date: Sat, 1 Aug 2009 12:02:36 +0000 (+0000) Subject: Add new form to see job details X-Git-Tag: Release-7.0.0~2730 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=52084d878b330d9bb5a463d38912bc6e5e851450;p=bacula%2Fbacula Add new form to see job details git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@9149 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/src/qt-console/bat.pro.in b/bacula/src/qt-console/bat.pro.in index 6fc22b7ff0..ba9d773fed 100644 --- a/bacula/src/qt-console/bat.pro.in +++ b/bacula/src/qt-console/bat.pro.in @@ -50,7 +50,7 @@ FORMS += run/run.ui run/runcmd.ui run/estimate.ui run/prune.ui FORMS += select/select.ui select/textinput.ui FORMS += medialist/medialist.ui mediaedit/mediaedit.ui joblist/joblist.ui FORMS += clients/clients.ui storage/storage.ui fileset/fileset.ui -FORMS += joblog/joblog.ui jobs/jobs.ui +FORMS += joblog/joblog.ui jobs/jobs.ui job/job.ui FORMS += help/help.ui FORMS += status/dirstat.ui FORMS += status/clientstat.ui @@ -123,6 +123,10 @@ SOURCES += fileset/fileset.cpp HEADERS += joblog/joblog.h SOURCES += joblog/joblog.cpp +## Job +HEADERS += job/job.h +SOURCES += job/job.cpp + ## Jobs HEADERS += jobs/jobs.h SOURCES += jobs/jobs.cpp diff --git a/bacula/src/qt-console/images/A.png b/bacula/src/qt-console/images/A.png new file mode 100644 index 0000000000..89c212493e Binary files /dev/null and b/bacula/src/qt-console/images/A.png differ diff --git a/bacula/src/qt-console/images/R.png b/bacula/src/qt-console/images/R.png new file mode 100644 index 0000000000..166c2201cf Binary files /dev/null and b/bacula/src/qt-console/images/R.png differ diff --git a/bacula/src/qt-console/images/T.png b/bacula/src/qt-console/images/T.png new file mode 100644 index 0000000000..d92d88d8a4 Binary files /dev/null and b/bacula/src/qt-console/images/T.png differ diff --git a/bacula/src/qt-console/images/f.png b/bacula/src/qt-console/images/f.png new file mode 100644 index 0000000000..89c212493e Binary files /dev/null and b/bacula/src/qt-console/images/f.png differ diff --git a/bacula/src/qt-console/images/inflag0.png b/bacula/src/qt-console/images/inflag0.png new file mode 100644 index 0000000000..6478554f62 Binary files /dev/null and b/bacula/src/qt-console/images/inflag0.png differ diff --git a/bacula/src/qt-console/images/inflag1.png b/bacula/src/qt-console/images/inflag1.png new file mode 100644 index 0000000000..e061e7f17c Binary files /dev/null and b/bacula/src/qt-console/images/inflag1.png differ diff --git a/bacula/src/qt-console/images/inflag2.png b/bacula/src/qt-console/images/inflag2.png new file mode 100644 index 0000000000..dbff8454b2 Binary files /dev/null and b/bacula/src/qt-console/images/inflag2.png differ diff --git a/bacula/src/qt-console/images/purge.png b/bacula/src/qt-console/images/purge.png new file mode 100644 index 0000000000..9ba7c5325d Binary files /dev/null and b/bacula/src/qt-console/images/purge.png differ diff --git a/bacula/src/qt-console/images/zoom.png b/bacula/src/qt-console/images/zoom.png new file mode 100644 index 0000000000..1ac4864d4a Binary files /dev/null and b/bacula/src/qt-console/images/zoom.png differ diff --git a/bacula/src/qt-console/job/job.cpp b/bacula/src/qt-console/job/job.cpp new file mode 100644 index 0000000000..aa4ff3be8c --- /dev/null +++ b/bacula/src/qt-console/job/job.cpp @@ -0,0 +1,287 @@ +/* + Bacula® - The Network Backup Solution + + Copyright (C) 2007-2009 Free Software Foundation Europe e.V. + + The main author of Bacula is Kern Sibbald, with contributions from + many others, a complete list can be found in the file AUTHORS. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version two of the GNU General Public + License as published by the Free Software Foundation and included + in the file LICENSE. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + + Bacula® is a registered trademark of Kern Sibbald. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ + +/* + * Version $Id$ + * + * Job Class + * + * Dirk Bartley, March 2007 + * + */ + +#include "bat.h" +#include "job.h" +#include "util/fmtwidgetitem.h" + +Job::Job(QString &jobId, QTreeWidgetItem *parentTreeWidgetItem) +{ + setupUi(this); + m_closeable = true; + pgInitialize(tr("Job"), parentTreeWidgetItem); + QTreeWidgetItem* thisitem = mainWin->getFromHash(this); + thisitem->setIcon(0,QIcon(QString::fromUtf8(":images/joblog.png"))); + m_cursor = new QTextCursor(textJobLog->document()); + + m_jobId = jobId; + getFont(); + populateText(); + populateForm(); + populateVolumes(); + dockPage(); + setCurrent(); +} + +void Job::getFont() +{ + QFont font = textJobLog->font(); + + QString dirname; + m_console->getDirResName(dirname); + QSettings settings(dirname, "bat"); + settings.beginGroup("Console"); + font.setFamily(settings.value("consoleFont", "Courier").value()); + font.setPointSize(settings.value("consolePointSize", 10).toInt()); + font.setFixedPitch(settings.value("consoleFixedPitch", true).toBool()); + settings.endGroup(); + textJobLog->setFont(font); +} + +/* + * Populate the text in the window + */ +void Job::populateText() +{ + QString query; + query = "SELECT Time, LogText FROM Log WHERE JobId='" + m_jobId + "' order by Time"; + + /* This could be a log item */ + if (mainWin->m_sqlDebug) { + Pmsg1(000, "Log query cmd : %s\n", query.toUtf8().data()); + } + + QStringList results; + if (m_console->sql_cmd(query, results)) { + + if (!results.size()) { + QMessageBox::warning(this, tr("Bat"), + tr("There were no results!\n" + "It is possible you may need to add \"catalog = all\" " + "to the Messages resource for this job.\n"), QMessageBox::Ok); + return; + } + + QString jobstr("JobId "); /* FIXME: should this be translated ? */ + jobstr += m_jobId; + + QString htmlbuf("
");
+  
+      /* Iterate through the lines of results. */
+      QString field;
+      QStringList fieldlist;
+      QString lastTime;
+      QString lastSvc;
+      foreach (QString resultline, results) {
+         fieldlist = resultline.split("\t");
+	 
+	 if (fieldlist.size() < 2)
+	    continue;
+
+	 QString curTime = fieldlist[0].trimmed();
+
+	 field = fieldlist[1].trimmed();
+	 int colon = field.indexOf(":");
+	 if (colon > 0) {
+ 	    /* string is like  : ..." 
+	     * we split at ':' then remove the jobId xxxx string (always the same) */ 
+	    QString curSvc(field.left(colon).replace(jobstr,"").trimmed());
+	    if (curSvc == lastSvc  && curTime == lastTime) {
+	       curTime.clear();
+	       curSvc.clear(); 
+	    } else {
+	       lastTime = curTime;
+	       lastSvc = curSvc;
+	    }
+//	    htmlbuf += "" + curTime + "";
+	    htmlbuf += "\n" + curSvc + " ";
+
+	    /* rest of string is marked as pre-formatted (here trimming should
+	     * be avoided, to preserve original formatting) */
+	    QString msg(field.mid(colon+2));
+	    if (msg.startsWith( tr("Error:")) ) { /* FIXME: should really be translated ? */
+ 	       /* error msg, use a specific class */
+	       htmlbuf += "
" + msg + "
";
+	    } else {
+	       htmlbuf += msg ;
+	    }
+	 } else {
+ 	    /* non standard string, place as-is */
+	    if (curTime == lastTime) {
+	       curTime.clear();
+	    } else {
+	       lastTime = curTime;
+	    }
+//	    htmlbuf += "" + curTime + "";
+	    htmlbuf += "\n" + field ;
+	 }
+  
+      } /* foreach resultline */
+
+      htmlbuf += "
"; + + /* full text ready. Here a custom sheet is used to align columns */ + QString logSheet(".err {color:#FF0000;}"); + textJobLog->document()->setDefaultStyleSheet(logSheet); + textJobLog->document()->setHtml(htmlbuf); + textJobLog->moveCursor(QTextCursor::Start); + + } /* if results from query */ + +} + +// Need to use the fmtwidgetitem helper instead +QString convertBytesSI(qint64 qfld) +{ + static const qint64 KB = Q_INT64_C(1000); + static const qint64 MB = (KB * KB); + static const qint64 GB = (MB * KB); + static const qint64 TB = (GB * KB); + static const qint64 PB = (TB * KB); + static const qint64 EB = (PB * KB); + + /* note: division is integer, so to have some decimals we divide for a + smaller unit (e.g. GB for a TB number and so on) */ + char suffix; + if (qfld >= EB) { + qfld /= PB; + suffix = 'E'; + } + else if (qfld >= PB) { + qfld /= TB; + suffix = 'P'; + } + else if (qfld >= TB) { + qfld /= GB; + suffix = 'T'; + } + else if (qfld >= GB) { + qfld /= MB; + suffix = 'G'; + } + else if (qfld >= MB) { + qfld /= KB; + suffix = 'M'; + } + else if (qfld >= KB) { + suffix = 'k'; /* SI uses lowercase k */ + } + else { + /* plain bytes, no need to reformat */ + return QString("%1 B").arg(qfld); + } + + /* having divided for a smaller unit, now we can safely convert to double and + use the extra room for decimals */ + return QString("%1 %2B").arg(qfld / 1000.0, 0, 'f', 2).arg(suffix); +} + +/* + * Populate the text in the window + */ +void Job::populateForm() +{ + QString stat; + char buf[256]; + QString query = + "SELECT JobId, Job.Name, Level, Client.Name, Pool.Name, FileSet, SchedTime, StartTime, EndTime, " + "EndTime - StartTime AS Duration, JobBytes, JobFiles, JobErrors, JobStatus, PurgedFiles " + "FROM Job JOIN Client USING (ClientId) LEFT JOIN Pool USING (PoolId) " + "LEFT JOIN FileSet USING (FileSetId)" + "WHERE JobId=" + m_jobId; + QStringList results; + if (m_console->sql_cmd(query, results)) { + QString resultline; + QStringList fieldlist; + + foreach (resultline, results) { // should have only one result + fieldlist = resultline.split("\t"); + QStringListIterator fld(fieldlist); + label_JobId->setText(fld.next()); + label_Name->setText(fld.next()); + + label_Level->setText(job_level_to_str(fld.next()[0].toAscii())); + + label_Client->setText(fld.next()); + label_Pool->setText(fld.next()); + label_FileSet->setText(fld.next()); + label_SchedTime->setText(fld.next()); + label_StartTime->setText(fld.next()); + label_EndTime->setText(fld.next()); + label_Duration->setText(fld.next()); + + label_JobBytes->setText(convertBytesSI(fld.next().toULongLong())); + label_JobFiles->setText(fld.next()); + label_JobErrors->setText(fld.next()); + + stat=fld.next(); + label_JobStatus->setPixmap(QPixmap(":/images/" + stat + ".png")); + jobstatus_to_ascii_gui(stat[0].toAscii(), buf, sizeof(buf)); + stat = buf; + label_JobStatus->setToolTip(stat); + + chkbox_PurgedFiles->setCheckState(fld.next().toInt()?Qt::Checked:Qt::Unchecked); + } + } +} + +void Job::populateVolumes() +{ + + QString query = + "SELECT DISTINCT VolumeName, InChanger, Slot " + "FROM Job JOIN JobMedia USING (JobId) JOIN Media USING (MediaId) " + "WHERE JobId=" + m_jobId + " ORDER BY VolumeName "; + Pmsg1(000, "Query cmd : %s\n",query.toUtf8().data()); + + + QStringList results; + if (m_console->sql_cmd(query, results)) { + QString resultline; + QStringList fieldlist; + list_Volume->clear(); + foreach (resultline, results) { // should have only one result + fieldlist = resultline.split("\t"); + QStringListIterator fld(fieldlist); +// QListWidgetItem(QIcon(":/images/inchanger" + fld.next() + ".png"), +// fld.next(), list_Volume); + list_Volume->addItem(fld.next()); + } + } +} + +//QListWidgetItem ( const QIcon & icon, const QString & text, QListWidget * parent = 0, int type = Type ) diff --git a/bacula/src/qt-console/job/job.h b/bacula/src/qt-console/job/job.h new file mode 100644 index 0000000000..2597ab36f8 --- /dev/null +++ b/bacula/src/qt-console/job/job.h @@ -0,0 +1,56 @@ +#ifndef _JOB_H_ +#define _JOB_H_ +/* + Bacula® - The Network Backup Solution + + Copyright (C) 2000-2007 Free Software Foundation Europe e.V. + + The main author of Bacula is Kern Sibbald, with contributions from + many others, a complete list can be found in the file AUTHORS. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version two of the GNU General Public + License as published by the Free Software Foundation and included + in the file LICENSE. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + + Bacula® is a registered trademark of Kern Sibbald. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ + +#include +#include "ui_job.h" +#include "console.h" + +class Job : public Pages, public Ui::JobForm +{ + Q_OBJECT + +public: + Job(QString &jobId, QTreeWidgetItem *parentTreeWidgetItem); + +public slots: + +private slots: + +private: + void populateText(); + void populateForm(); + void populateVolumes(); + + void getFont(); + QTextCursor *m_cursor; + QString m_jobId; +}; + +#endif /* _JOB_H_ */ diff --git a/bacula/src/qt-console/job/job.ui b/bacula/src/qt-console/job/job.ui new file mode 100644 index 0000000000..b20fc09dba --- /dev/null +++ b/bacula/src/qt-console/job/job.ui @@ -0,0 +1,600 @@ + + JobForm + + + + 0 + 0 + 855 + 757 + + + + Form + + + + + 10 + 40 + 231 + 181 + + + + + 0 + 0 + + + + Basic Information + + + + + 10 + 20 + 211 + 152 + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + JobId: + + + + + + + 2 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Job Name: + + + + + + + Test + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Level: + + + + + + + VirtualFull + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Client: + + + + + + + client-fd + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + FileSet: + + + + + + + TheFileSet + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Pool: + + + + + + + ThePool + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + 680 + 40 + 171 + 181 + + + + + 0 + 0 + + + + Volume Used + + + + + + + Vol0001 + + + + :/images/inflag1.png:/images/inflag1.png + + + + + + + + + + 420 + 40 + 251 + 181 + + + + + 0 + 0 + + + + Times + + + + + 10 + 20 + 231 + 151 + + + + + QFormLayout::AllNonFixedFieldsGrow + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + Sched Time: + + + + + + + 2009-07-31 00:10:00 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Start Time: + + + + + + + 2009-07-31 00:10:00 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + End Time: + + + + + + + 2009-07-31 00:20:00 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Duration: + + + + + + + 00:10:00 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + 250 + 40 + 161 + 181 + + + + + 0 + 0 + + + + + 160 + 0 + + + + Status + + + + + 10 + 20 + 141 + 151 + + + + + QFormLayout::AllNonFixedFieldsGrow + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + Files: + + + + + + + 1,924 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Bytes: + + + + + + + Errors: + + + + + + + 0 + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Status: + + + + + + + + + + :/images/T.png + + + false + + + + + + + Purged: + + + + + + + false + + + + + + true + + + + + + + 109 MB + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + 10 + 220 + 841 + 531 + + + + + 0 + 0 + + + + Logs + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + textJobLog + + + + + 10 + 10 + 661 + 31 + + + + + + + Delete + + + + :/images/purge.png:/images/purge.png + + + true + + + + + + + View errors for this Job + + + Errors + + + + :/images/zoom.png:/images/zoom.png + + + true + + + + + + + Media + + + + :/images/zoom.png:/images/zoom.png + + + true + + + + + + + History + + + + :/images/zoom.png:/images/zoom.png + + + true + + + + + + + + 0 + 0 + + + + Run again + + + + :/images/R.png:/images/R.png + + + true + + + + + + + Read doc + + + true + + + + + + + FileSet + + + + :/images/zoom.png:/images/zoom.png + + + true + + + + + + + Stats + + + + :/images/zoom.png:/images/zoom.png + + + true + + + + + + + + + + + diff --git a/bacula/src/qt-console/joblist/joblist.cpp b/bacula/src/qt-console/joblist/joblist.cpp index a1f9b9a4cf..a52119d3f5 100644 --- a/bacula/src/qt-console/joblist/joblist.cpp +++ b/bacula/src/qt-console/joblist/joblist.cpp @@ -36,6 +36,7 @@ #include #include "joblist.h" #include "restore.h" +#include "job/job.h" #include "joblog/joblog.h" #ifdef HAVE_QWT #include "jobgraphs/jobplot.h" @@ -408,6 +409,7 @@ void JobList::createConnections() #endif /* for the selectionChanged to maintain m_currentJob and a delete selection */ connect(mp_tableWidget, SIGNAL(itemSelectionChanged()), this, SLOT(selectionChanged())); + connect(mp_tableWidget, SIGNAL(itemDoubleClicked()), this, SLOT(showInfoForJob())); /* Do what is required for the local context sensitive menu */ @@ -423,6 +425,7 @@ void JobList::createConnections() connect(actionRestoreFromJob, SIGNAL(triggered()), this, SLOT(preRestoreFromJob())); connect(actionRestoreFromTime, SIGNAL(triggered()), this, SLOT(preRestoreFromTime())); connect(actionShowLogForJob, SIGNAL(triggered()), this, SLOT(showLogForJob())); + connect(actionShowInfoForJob, SIGNAL(triggered()), this, SLOT(showInfoForJob())); connect(actionCancelJob, SIGNAL(triggered()), this, SLOT(consoleCancelJob())); connect(actionListJobTotals, SIGNAL(triggered()), this, SLOT(consoleListJobTotals())); connect(m_splitter, SIGNAL(splitterMoved(int, int)), this, SLOT(splitterMoved(int, int))); @@ -530,6 +533,15 @@ void JobList::showLogForJob() new JobLog(m_currentJob, pageSelectorTreeWidgetItem); } +/* + * Subroutine to call class to show the log in the database from that job + */ +void JobList::showInfoForJob() +{ + QTreeWidgetItem* pageSelectorTreeWidgetItem = mainWin->getFromHash(this); + new Job(m_currentJob, pageSelectorTreeWidgetItem); +} + /* * Cancel a running job */ @@ -643,6 +655,7 @@ void JobList::selectionChanged() mp_tableWidget->addAction(actionRestoreFromJob); mp_tableWidget->addAction(actionRestoreFromTime); mp_tableWidget->addAction(actionShowLogForJob); + mp_tableWidget->addAction(actionShowInfoForJob); } if (m_selectedJobsCount >= 1) { mp_tableWidget->addAction(actionDeleteJob); diff --git a/bacula/src/qt-console/joblist/joblist.h b/bacula/src/qt-console/joblist/joblist.h index db9d0b437c..44ee63e45d 100644 --- a/bacula/src/qt-console/joblist/joblist.h +++ b/bacula/src/qt-console/joblist/joblist.h @@ -65,6 +65,7 @@ private slots: void preRestoreFromJob(); void preRestoreFromTime(); void showLogForJob(); + void showInfoForJob(); void consoleCancelJob(); void graphTable(); void splitterMoved(int pos, int index); diff --git a/bacula/src/qt-console/joblist/joblist.ui b/bacula/src/qt-console/joblist/joblist.ui index 99adbadab0..dd40d2c52f 100644 --- a/bacula/src/qt-console/joblist/joblist.ui +++ b/bacula/src/qt-console/joblist/joblist.ui @@ -442,6 +442,15 @@ Show Log for Job + + + + :/images/joblog.png:/images/joblog.png + + + Show Info for Job + + diff --git a/bacula/src/qt-console/main.qrc b/bacula/src/qt-console/main.qrc index 18e2c7b534..dddeb1a4c2 100644 --- a/bacula/src/qt-console/main.qrc +++ b/bacula/src/qt-console/main.qrc @@ -1,52 +1,61 @@ - - images/applications-graphics.png - images/bat.png - images/bat_icon.png - images/browse.png - images/cartridge-edit.png - images/cartridge.png - images/check.png - images/connected.png - images/copy.png - images/cut.png - images/disconnected.png - images/edit-cut.png - images/edit-delete.png - images/emblem-system.png - images/estimate-job.png - images/folder.png - images/folderbothchecked.png - images/folderchecked.png - images/folderunchecked.png - images/go-down.png - images/go-up.png - images/graph1.png - images/help-browser.png - images/joblog.png - images/label.png - images/mail-message-new.png - images/mail-message-pending.png - images/mark.png - images/network-server.png - images/new.png - images/open.png - images/package-x-generic.png - images/paste.png - images/print.png - images/restore.png - images/run.png - images/save.png - images/status-console.png - images/status.png - images/system-file-manager.png - images/unchecked.png - images/undo.png - images/unmark.png - images/up.png - images/utilities-terminal.png - images/view-refresh.png - images/weather-severe-alert.png - images/go-jump.png - + + images/R.png + images/T.png + images/f.png + images/A.png + images/inflag2.png + images/inflag0.png + images/inflag1.png + images/purge.png + images/zoom.png + images/applications-graphics.png + images/bat.png + images/bat_icon.png + images/browse.png + images/cartridge-edit.png + images/cartridge.png + images/check.png + images/connected.png + images/copy.png + images/cut.png + images/disconnected.png + images/edit-cut.png + images/edit-delete.png + images/emblem-system.png + images/estimate-job.png + images/folder.png + images/folderbothchecked.png + images/folderchecked.png + images/folderunchecked.png + images/go-down.png + images/go-up.png + images/graph1.png + images/help-browser.png + images/joblog.png + images/label.png + images/mail-message-new.png + images/mail-message-pending.png + images/mark.png + images/network-server.png + images/new.png + images/open.png + images/package-x-generic.png + images/paste.png + images/print.png + images/restore.png + images/run.png + images/save.png + images/status-console.png + images/status.png + images/system-file-manager.png + images/unchecked.png + images/undo.png + images/unmark.png + images/up.png + images/utilities-terminal.png + images/view-refresh.png + images/weather-severe-alert.png + images/go-jump.png +