]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/qt-console/fileset/fileset.cpp
Make undocking work
[bacula/bacula] / bacula / src / qt-console / fileset / fileset.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  *  FileSet Class
33  *
34  *   Dirk Bartley, March 2007
35  *
36  */ 
37
38 #include "bat.h"
39 #include <QAbstractEventDispatcher>
40 #include <QMenu>
41 #include "fileset/fileset.h"
42 #include "util/fmtwidgetitem.h"
43
44 FileSet::FileSet()
45 {
46    setupUi(this);
47    m_name = tr("FileSets");
48    pgInitialize();
49    QTreeWidgetItem* thisitem = mainWin->getFromHash(this);
50    thisitem->setIcon(0,QIcon(QString::fromUtf8(":images/system-file-manager.png")));
51
52    /* tableWidget, FileSet Tree Tree Widget inherited from ui_fileset.h */
53    m_populated = false;
54    m_checkcurwidget = true;
55    m_closeable = false;
56    readSettings();
57    /* add context sensitive menu items specific to this classto the page
58     * selector tree. m_contextActions is QList of QActions */
59    m_contextActions.append(actionRefreshFileSet);
60 }
61
62 FileSet::~FileSet()
63 {
64    writeSettings();
65 }
66
67 /*
68  * The main meat of the class!!  The function that querries the director and 
69  * creates the widgets with appropriate values.
70  */
71 void FileSet::populateTable()
72 {
73    m_populated = true;
74
75    Freeze frz(*tableWidget); /* disable updating*/
76
77    m_checkcurwidget = false;
78    tableWidget->clear();
79    m_checkcurwidget = true;
80
81    QStringList headerlist = (QStringList() << tr("FileSet Name") << tr("FileSet Id")
82        << tr("Create Time"));
83
84    tableWidget->setColumnCount(headerlist.count());
85    tableWidget->setHorizontalHeaderLabels(headerlist);
86    tableWidget->horizontalHeader()->setHighlightSections(false);
87    tableWidget->verticalHeader()->hide();
88    tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
89    tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
90    tableWidget->setSortingEnabled(false); /* rows move on insert if sorting enabled */
91
92    QString fileset_comsep("");
93    bool first = true;
94    QStringList notFoundList = m_console->fileset_list;
95    foreach(QString filesetName, m_console->fileset_list) {
96       if (first) {
97          fileset_comsep += "'" + filesetName + "'";
98          first = false;
99       }
100       else
101          fileset_comsep += ",'" + filesetName + "'";
102    }
103
104    int row = 0;
105    tableWidget->setRowCount(m_console->fileset_list.count());
106    if (fileset_comsep != "") {
107       /* Set up query QString and header QStringList */
108       QString query("");
109       query += "SELECT FileSet AS Name, FileSetId AS Id, CreateTime"
110            " FROM FileSet"
111            " WHERE FileSetId IN (SELECT MAX(FileSetId) FROM FileSet WHERE";
112       query += " FileSet IN (" + fileset_comsep + ")";
113       query += " GROUP BY FileSet) ORDER BY FileSet";
114
115       QStringList results;
116       if (mainWin->m_sqlDebug) {
117          Pmsg1(000, "FileSet query cmd : %s\n",query.toUtf8().data());
118       }
119       if (m_console->sql_cmd(query, results)) {
120          QStringList fieldlist;
121
122          /* Iterate through the record returned from the query */
123          foreach (QString resultline, results) {
124             fieldlist = resultline.split("\t");
125
126             /* remove this fileSet from notFoundList */
127             int indexOf = notFoundList.indexOf(fieldlist[0]);
128             if (indexOf != -1) { notFoundList.removeAt(indexOf); }
129
130             TableItemFormatter item(*tableWidget, row);
131   
132             /* Iterate through fields in the record */
133             QStringListIterator fld(fieldlist);
134             int col = 0;
135
136             /* name */
137             item.setTextFld(col++, fld.next());
138
139             /* id */
140             item.setNumericFld(col++, fld.next());
141
142             /* creation time */
143             item.setTextFld(col++, fld.next());
144
145             row++;
146          }
147       }
148    }
149    foreach(QString filesetName, notFoundList) {
150       TableItemFormatter item(*tableWidget, row);
151       item.setTextFld(0, filesetName);
152       row++;
153    }
154    
155    /* set default sorting */
156    tableWidget->sortByColumn(headerlist.indexOf(tr("FileSet Name")), Qt::AscendingOrder);
157    tableWidget->setSortingEnabled(true);
158    
159    /* Resize rows and columns */
160    tableWidget->resizeColumnsToContents();
161    tableWidget->resizeRowsToContents();
162
163    /* make read only */
164    int rcnt = tableWidget->rowCount();
165    int ccnt = tableWidget->columnCount();
166    for(int r=0; r < rcnt; r++) {
167       for(int c=0; c < ccnt; c++) {
168          QTableWidgetItem* item = tableWidget->item(r, c);
169          if (item) {
170             item->setFlags(Qt::ItemFlags(item->flags() & (~Qt::ItemIsEditable)));
171          }
172       }
173    }
174 }
175
176 /*
177  * When the treeWidgetItem in the page selector tree is singleclicked, Make sure
178  * The tree has been populated.
179  */
180 void FileSet::PgSeltreeWidgetClicked()
181 {
182    if (!m_populated) {
183       populateTable();
184       createContextMenu();
185    }
186    if (!isOnceDocked()) {
187       dockPage();
188    }
189 }
190
191 /*
192  * Added to set the context menu policy based on currently active treeWidgetItem
193  * signaled by currentItemChanged
194  */
195 void FileSet::tableItemChanged(QTableWidgetItem *currentwidgetitem, QTableWidgetItem *previouswidgetitem)
196 {
197    /* m_checkcurwidget checks to see if this is during a refresh, which will segfault */
198    if (m_checkcurwidget) {
199       int currentRow = currentwidgetitem->row();
200       QTableWidgetItem *currentrowzeroitem = tableWidget->item(currentRow, 0);
201       m_currentlyselected = currentrowzeroitem->text();
202
203       /* The Previous item */
204       if (previouswidgetitem) { /* avoid a segfault if first time */
205          tableWidget->removeAction(actionStatusFileSetInConsole);
206          tableWidget->removeAction(actionShowJobs);
207       }
208
209       if (m_currentlyselected.length() != 0) {
210          /* set a hold variable to the fileset name in case the context sensitive
211           * menu is used */
212          tableWidget->addAction(actionStatusFileSetInConsole);
213          tableWidget->addAction(actionShowJobs);
214       }
215    }
216 }
217
218 /* 
219  * Setup a context menu 
220  * Made separate from populate so that it would not create context menu over and
221  * over as the tree is repopulated.
222  */
223 void FileSet::createContextMenu()
224 {
225    tableWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
226    tableWidget->addAction(actionRefreshFileSet);
227    connect(tableWidget, SIGNAL(
228            currentItemChanged(QTableWidgetItem *, QTableWidgetItem *)),
229            this, SLOT(tableItemChanged(QTableWidgetItem *, QTableWidgetItem *)));
230    /* connect to the action specific to this pages class */
231    connect(actionRefreshFileSet, SIGNAL(triggered()), this,
232                 SLOT(populateTable()));
233    connect(actionStatusFileSetInConsole, SIGNAL(triggered()), this,
234                 SLOT(consoleShowFileSet()));
235    connect(actionShowJobs, SIGNAL(triggered()), this,
236                 SLOT(showJobs()));
237 }
238
239 /*
240  * Function responding to actionListJobsofFileSet which calls mainwin function
241  * to create a window of a list of jobs of this fileset.
242  */
243 void FileSet::consoleShowFileSet()
244 {
245    QString cmd("show fileset=\"");
246    cmd += m_currentlyselected + "\"";
247    consoleCommand(cmd);
248 }
249
250 /*
251  * Virtual function which is called when this page is visible on the stack
252  */
253 void FileSet::currentStackItem()
254 {
255    if(!m_populated) {
256       populateTable();
257       /* Create the context menu for the fileset table */
258       createContextMenu();
259    }
260 }
261
262 /*
263  * Save user settings associated with this page
264  */
265 void FileSet::writeSettings()
266 {
267    QSettings settings(m_console->m_dir->name(), "bat");
268    settings.beginGroup("FileSet");
269    settings.setValue("geometry", saveGeometry());
270    settings.endGroup();
271 }
272
273 /*
274  * Read and restore user settings associated with this page
275  */
276 void FileSet::readSettings()
277
278    QSettings settings(m_console->m_dir->name(), "bat");
279    settings.beginGroup("FileSet");
280    restoreGeometry(settings.value("geometry").toByteArray());
281    settings.endGroup();
282 }
283
284 /*
285  * Create a JobList object pre-populating a fileset
286  */
287 void FileSet::showJobs()
288 {
289    QTreeWidgetItem *parentItem = mainWin->getFromHash(this);
290    mainWin->createPageJobList("", "", "", m_currentlyselected, parentItem);
291 }