]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/qt-console/jobs/jobs.cpp
Merge branch 'master' of ssh://ricozz@bacula.git.sourceforge.net/gitroot/bacula/bacula
[bacula/bacula] / bacula / src / qt-console / jobs / jobs.cpp
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2007-2009 Free Software Foundation Europe e.V.
5
6    The main author of Bacula is Kern Sibbald, with contributions from
7    many others, a complete list can be found in the file AUTHORS.
8    This program is Free Software; you can redistribute it and/or
9    modify it under the terms of version two of the GNU General Public
10    License as published by the Free Software Foundation and included
11    in the file LICENSE.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23    Bacula® is a registered trademark of Kern Sibbald.
24    The licensor of Bacula is the Free Software Foundation Europe
25    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26    Switzerland, email:ftf@fsfeurope.org.
27 */
28  
29 /*
30  *   Version $Id$
31  *
32  *  Jobs Class
33  *
34  *   Dirk Bartley, March 2007
35  *
36  */ 
37
38 #include "bat.h"
39 #include "jobs/jobs.h"
40 #include "run/run.h"
41 #include "util/fmtwidgetitem.h"
42
43 Jobs::Jobs()
44 {
45    setupUi(this);
46    m_name = tr("Jobs");
47    pgInitialize();
48    QTreeWidgetItem* thisitem = mainWin->getFromHash(this);
49    thisitem->setIcon(0,QIcon(QString::fromUtf8(":images/run.png")));
50
51    /* tableWidget, Storage Tree Tree Widget inherited from ui_client.h */
52    m_populated = false;
53    m_checkcurwidget = true;
54    m_closeable = false;
55    /* add context sensitive menu items specific to this classto the page
56     * selector tree. m_contextActions is QList of QActions */
57    m_contextActions.append(actionRefreshJobs);
58    createContextMenu();
59 }
60
61 Jobs::~Jobs()
62 {
63 }
64
65 /*
66  * The main meat of the class!!  The function that querries the director and 
67  * creates the widgets with appropriate values.
68  */
69 void Jobs::populateTable()
70 {
71    m_populated = true;
72    mainWin->waitEnter();
73
74    Freeze frz(*tableWidget); /* disable updating*/
75
76    QBrush blackBrush(Qt::black);
77    m_checkcurwidget = false;
78    tableWidget->clear();
79    m_checkcurwidget = true;
80    QStringList headerlist = (QStringList() << tr("Job Name") 
81       << tr("Pool") << tr("Messages") << tr("Client") 
82       << tr("Storage") << tr("Level") << tr("Type") 
83       << tr("FileSet") << tr("Catalog") << tr("Enabled")
84       << tr("Where"));
85
86    m_typeIndex = headerlist.indexOf(tr("Type"));
87
88    tableWidget->setColumnCount(headerlist.count());
89    tableWidget->setHorizontalHeaderLabels(headerlist);
90    tableWidget->horizontalHeader()->setHighlightSections(false);
91    tableWidget->setRowCount(m_console->job_list.count());
92    tableWidget->verticalHeader()->hide();
93    tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
94    tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
95    tableWidget->setSortingEnabled(false); /* rows move on insert if sorting enabled */
96
97    int row = 0;
98    foreach (QString jobName, m_console->job_list){
99       job_defaults job_defs;
100       job_defs.job_name = jobName;
101       if (m_console->get_job_defaults(job_defs)) {
102          int col = 0;
103          TableItemFormatter jobsItem(*tableWidget, row);
104          jobsItem.setTextFld(col++, jobName); 
105          jobsItem.setTextFld(col++, job_defs.pool_name);
106          jobsItem.setTextFld(col++, job_defs.messages_name);
107          jobsItem.setTextFld(col++, job_defs.client_name);
108          jobsItem.setTextFld(col++, job_defs.store_name);
109          jobsItem.setTextFld(col++, job_defs.level);
110          jobsItem.setTextFld(col++, job_defs.type);
111          jobsItem.setTextFld(col++, job_defs.fileset_name);
112          jobsItem.setTextFld(col++, job_defs.catalog_name);
113          jobsItem.setBoolFld(col++, job_defs.enabled);
114          jobsItem.setTextFld(col++, job_defs.where);
115       }
116       row++;
117    }
118    /* set default sorting */
119    tableWidget->sortByColumn(headerlist.indexOf(tr("Job Name")), Qt::AscendingOrder);
120    tableWidget->setSortingEnabled(true);
121    
122    /* Resize rows and columns */
123    tableWidget->resizeColumnsToContents();
124    tableWidget->resizeRowsToContents();
125
126    /* make read only */
127    int rcnt = tableWidget->rowCount();
128    int ccnt = tableWidget->columnCount();
129    for(int r=0; r < rcnt; r++) {
130       for(int c=0; c < ccnt; c++) {
131          QTableWidgetItem* item = tableWidget->item(r, c);
132          if (item) {
133             item->setFlags(Qt::ItemFlags(item->flags() & (~Qt::ItemIsEditable)));
134          }
135       }
136    }
137    mainWin->waitExit();
138    dockPage();
139 }
140
141 /*
142  * When the treeWidgetItem in the page selector tree is singleclicked, Make sure
143  * The tree has been populated.
144  */
145 void Jobs::PgSeltreeWidgetClicked()
146 {
147    if(!m_populated) {
148       populateTable();
149    }
150 }
151
152 /*
153  * Added to set the context menu policy based on currently active tableWidgetItem
154  * signaled by currentItemChanged
155  */
156 void Jobs::tableItemChanged(QTableWidgetItem *currentwidgetitem, QTableWidgetItem *previouswidgetitem )
157 {
158    /* m_checkcurwidget checks to see if this is during a refresh, which will segfault */
159    if (m_checkcurwidget && currentwidgetitem) {
160       /* The Previous item */
161       if (previouswidgetitem) { /* avoid a segfault if first time */
162          foreach(QAction* jobAction, tableWidget->actions()) {
163             tableWidget->removeAction(jobAction);
164          }
165       }
166       int currentRow = currentwidgetitem->row();
167       QTableWidgetItem *currentrowzeroitem = tableWidget->item(currentRow, 0);
168       m_currentlyselected = currentrowzeroitem->text();
169       QTableWidgetItem *currenttypeitem = tableWidget->item(currentRow, m_typeIndex);
170       QString type = currenttypeitem->text();
171
172       if (m_currentlyselected.length() != 0) {
173          /* set a hold variable to the client name in case the context sensitive
174           * menu is used */
175          tableWidget->addAction(actionRefreshJobs);
176          tableWidget->addAction(actionConsoleListFiles);
177          tableWidget->addAction(actionConsoleListVolumes);
178          tableWidget->addAction(actionConsoleListNextVolume);
179          tableWidget->addAction(actionConsoleEnableJob);
180          tableWidget->addAction(actionConsoleDisableJob);
181          tableWidget->addAction(actionConsoleCancel);
182          tableWidget->addAction(actionJobListQuery);
183          tableWidget->addAction(actionRunJob);
184       }
185    }
186 }
187
188 /* 
189  * Setup a context menu 
190  * Made separate from populate so that it would not create context menu over and
191  * over as the table is repopulated.
192  */
193 void Jobs::createContextMenu()
194 {
195    tableWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
196    tableWidget->addAction(actionRefreshJobs);
197    connect(tableWidget, SIGNAL(
198            currentItemChanged(QTableWidgetItem *, QTableWidgetItem *)),
199            this, SLOT(tableItemChanged(QTableWidgetItem *, QTableWidgetItem *)));
200    /* connect to the action specific to this pages class */
201    connect(actionRefreshJobs, SIGNAL(triggered()), this,
202                 SLOT(populateTable()));
203    connect(actionConsoleListFiles, SIGNAL(triggered()), this, SLOT(consoleListFiles()));
204    connect(actionConsoleListVolumes, SIGNAL(triggered()), this, SLOT(consoleListVolume()));
205    connect(actionConsoleListNextVolume, SIGNAL(triggered()), this, SLOT(consoleListNextVolume()));
206    connect(actionConsoleEnableJob, SIGNAL(triggered()), this, SLOT(consoleEnable()));
207    connect(actionConsoleDisableJob, SIGNAL(triggered()), this, SLOT(consoleDisable()));
208    connect(actionConsoleCancel, SIGNAL(triggered()), this, SLOT(consoleCancel()));
209    connect(actionJobListQuery, SIGNAL(triggered()), this, SLOT(listJobs()));
210    connect(actionRunJob, SIGNAL(triggered()), this, SLOT(runJob()));
211 }
212
213 /*
214  * Virtual function which is called when this page is visible on the stack
215  */
216 void Jobs::currentStackItem()
217 {
218    if(!m_populated) {
219       /* Create the context menu for the client table */
220       populateTable();
221    }
222 }
223
224 /*
225  * The following functions are slots responding to users clicking on the context
226  * sensitive menu
227  */
228
229 void Jobs::consoleListFiles()
230 {
231    QString cmd = "list files job=\"" + m_currentlyselected + "\"";
232    if (mainWin->m_longList) { cmd.prepend("l"); }
233    consoleCommand(cmd);
234 }
235
236 void Jobs::consoleListVolume()
237 {
238    QString cmd = "list volumes job=\"" + m_currentlyselected + "\"";
239    if (mainWin->m_longList) { cmd.prepend("l"); }
240    consoleCommand(cmd);
241 }
242
243 void Jobs::consoleListNextVolume()
244 {
245    QString cmd = "list nextvolume job=\"" + m_currentlyselected + "\"";
246    if (mainWin->m_longList) { cmd.prepend("l"); }
247    consoleCommand(cmd);
248 }
249
250 void Jobs::consoleEnable()
251 {
252    QString cmd = "enable job=\"" + m_currentlyselected + "\"";
253    consoleCommand(cmd);
254 }
255
256 void Jobs::consoleDisable()
257 {
258    QString cmd = "disable job=\"" + m_currentlyselected + "\"";
259    consoleCommand(cmd);
260 }
261
262 void Jobs::consoleCancel()
263 {
264    QString cmd = "cancel job=\"" + m_currentlyselected + "\"";
265    consoleCommand(cmd);
266 }
267
268 void Jobs::listJobs()
269 {
270    QTreeWidgetItem *parentItem = mainWin->getFromHash(this);
271    mainWin->createPageJobList("", "", m_currentlyselected, "", parentItem);
272 }
273
274 /*
275  * Open a new job run page with the currently selected job 
276  * defaulted In
277  */
278 void Jobs::runJob()
279 {
280    new runPage(m_currentlyselected);
281 }