/*
- 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 plus additions
- that are listed 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 John Walker.
- The licensor of Bacula is the Free Software Foundation Europe
- (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
- Switzerland, email:ftf@fsfeurope.org.
+ Bacula(R) - The Network Backup Solution
+
+ Copyright (C) 2000-2016 Kern Sibbald
+
+ The original author of Bacula is Kern Sibbald, with contributions
+ from many others, a complete list can be found in the file AUTHORS.
+
+ You may use this file and others of this release according to the
+ license defined in the LICENSE file, which includes the Affero General
+ Public License, v3.0 ("AGPLv3") and some additional permissions and
+ terms pursuant to its AGPLv3 Section 7.
+
+ This notice must be preserved when any source code is
+ conveyed and/or propagated.
+
+ Bacula(R) is a registered trademark of Kern Sibbald.
*/
/*
- * Version $Id: fileset.cpp 4230 2007-02-21 20:07:37Z kerns $
- *
* FileSet Class
*
* Dirk Bartley, March 2007
*
*/
+#include "bat.h"
#include <QAbstractEventDispatcher>
#include <QMenu>
-#include "bat.h"
#include "fileset/fileset.h"
+#include "util/fmtwidgetitem.h"
-FileSet::FileSet()
+FileSet::FileSet() : Pages()
{
setupUi(this);
- m_name = "FileSets";
+ m_name = tr("FileSets");
pgInitialize();
+ QTreeWidgetItem* thisitem = mainWin->getFromHash(this);
+ thisitem->setIcon(0,QIcon(QString::fromUtf8(":images/system-file-manager.png")));
- /* mp_treeWidget, FileSet Tree Tree Widget inherited from ui_fileset.h */
+ /* tableWidget, FileSet Tree Tree Widget inherited from ui_fileset.h */
m_populated = false;
m_checkcurwidget = true;
m_closeable = false;
+ readSettings();
+ /* add context sensitive menu items specific to this classto the page
+ * selector tree. m_contextActions is QList of QActions */
+ m_contextActions.append(actionRefreshFileSet);
}
FileSet::~FileSet()
{
+ writeSettings();
}
/*
* The main meat of the class!! The function that querries the director and
* creates the widgets with appropriate values.
*/
-void FileSet::populateTree()
+void FileSet::populateTable()
{
- QTreeWidgetItem *filesetItem, *topItem;
- if (!m_console->preventInUseConnect())
- return;
+ Freeze frz(*tableWidget); /* disable updating*/
m_checkcurwidget = false;
- mp_treeWidget->clear();
+ tableWidget->clear();
m_checkcurwidget = true;
- QStringList headerlist = (QStringList() << "FileSet Name" << "FileSet Id"
- << "Create Time");
+ QStringList headerlist = (QStringList() << tr("FileSet Name") << tr("FileSet Id")
+ << tr("Create Time"));
- topItem = new QTreeWidgetItem(mp_treeWidget);
- topItem->setText(0, "FileSet");
- topItem->setData(0, Qt::UserRole, 0);
- topItem->setExpanded(true);
-
- mp_treeWidget->setColumnCount(headerlist.count());
- mp_treeWidget->setHeaderLabels(headerlist);
- /* This could be a log item */
- //printf("In FileSet::populateTree()\n");
+ tableWidget->setColumnCount(headerlist.count());
+ tableWidget->setHorizontalHeaderLabels(headerlist);
+ tableWidget->horizontalHeader()->setHighlightSections(false);
+ tableWidget->verticalHeader()->hide();
+ tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
+ tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
+ tableWidget->setSortingEnabled(false); /* rows move on insert if sorting enabled */
+ QString fileset_comsep("");
+ bool first = true;
+ QStringList notFoundList = m_console->fileset_list;
foreach(QString filesetName, m_console->fileset_list) {
- filesetItem = new QTreeWidgetItem(topItem);
- filesetItem->setText(0, filesetName);
- filesetItem->setData(0, Qt::UserRole, 1);
- filesetItem->setExpanded(true);
+ if (first) {
+ fileset_comsep += "'" + filesetName + "'";
+ first = false;
+ }
+ else
+ fileset_comsep += ",'" + filesetName + "'";
+ }
+ int row = 0;
+ tableWidget->setRowCount(m_console->fileset_list.count());
+ if (fileset_comsep != "") {
/* Set up query QString and header QStringList */
QString query("");
query += "SELECT FileSet AS Name, FileSetId AS Id, CreateTime"
" FROM FileSet"
- " WHERE ";
- query += " FileSet='" + filesetName + "'";
- query += " ORDER BY FileSet";
+ " WHERE FileSetId IN (SELECT MAX(FileSetId) FROM FileSet WHERE";
+ query += " FileSet IN (" + fileset_comsep + ")";
+ query += " GROUP BY FileSet) ORDER BY FileSet";
QStringList results;
- /* This could be a log item */
- //printf("FileSet query cmd : %s\n",query.toUtf8().data());
+ if (mainWin->m_sqlDebug) {
+ Pmsg1(000, "FileSet query cmd : %s\n",query.toUtf8().data());
+ }
if (m_console->sql_cmd(query, results)) {
- int resultCount = results.count();
- if (resultCount == 1){
- QString resultline;
- QString field;
- QStringList fieldlist;
- /* there will only be one of these */
- foreach (resultline, results) {
- fieldlist = resultline.split("\t");
- int index = 0;
- /* Iterate through fields in the record */
- foreach (field, fieldlist) {
- field = field.trimmed(); /* strip leading & trailing spaces */
- filesetItem->setData(index+1, Qt::UserRole, 1);
- /* Put media fields under the pool tree item */
- filesetItem->setData(index+1, Qt::UserRole, 1);
- filesetItem->setText(index+1, field);
- index++;
- }
+ QStringList fieldlist;
+
+ /* Iterate through the record returned from the query */
+ foreach (QString resultline, results) {
+ fieldlist = resultline.split("\t");
+ if (fieldlist.size() != 3) {
+ Pmsg1(000, "Unexpected line %s", resultline.toUtf8().data());
+ continue;
}
+
+ /* remove this fileSet from notFoundList */
+ int indexOf = notFoundList.indexOf(fieldlist[0]);
+ if (indexOf != -1) { notFoundList.removeAt(indexOf); }
+
+ TableItemFormatter item(*tableWidget, row);
+
+ /* Iterate through fields in the record */
+ QStringListIterator fld(fieldlist);
+ int col = 0;
+
+ /* name */
+ item.setTextFld(col++, fld.next());
+
+ /* id */
+ item.setNumericFld(col++, fld.next());
+
+ /* creation time */
+ item.setTextFld(col++, fld.next());
+
+ row++;
}
}
}
- /* Resize the columns */
- for(int cnter=1; cnter<headerlist.size(); cnter++) {
- mp_treeWidget->resizeColumnToContents(cnter);
+ foreach(QString filesetName, notFoundList) {
+ TableItemFormatter item(*tableWidget, row);
+ item.setTextFld(0, filesetName);
+ row++;
}
+
+ /* set default sorting */
+ tableWidget->sortByColumn(headerlist.indexOf(tr("FileSet Name")), Qt::AscendingOrder);
+ tableWidget->setSortingEnabled(true);
+
+ /* Resize rows and columns */
+ tableWidget->resizeColumnsToContents();
+ tableWidget->resizeRowsToContents();
+ /* make read only */
+ int rcnt = tableWidget->rowCount();
+ int ccnt = tableWidget->columnCount();
+ for(int r=0; r < rcnt; r++) {
+ for(int c=0; c < ccnt; c++) {
+ QTableWidgetItem* item = tableWidget->item(r, c);
+ if (item) {
+ item->setFlags(Qt::ItemFlags(item->flags() & (~Qt::ItemIsEditable)));
+ }
+ }
+ }
+ m_populated = true;
}
/*
void FileSet::PgSeltreeWidgetClicked()
{
if (!m_populated) {
- populateTree();
+ populateTable();
createContextMenu();
- m_populated = true;
+ }
+ if (!isOnceDocked()) {
+ dockPage();
}
}
* Added to set the context menu policy based on currently active treeWidgetItem
* signaled by currentItemChanged
*/
-void FileSet::treeItemChanged(QTreeWidgetItem *currentwidgetitem,
- QTreeWidgetItem *previouswidgetitem )
+void FileSet::tableItemChanged(QTableWidgetItem *currentwidgetitem, QTableWidgetItem *previouswidgetitem)
{
/* m_checkcurwidget checks to see if this is during a refresh, which will segfault */
- if (m_checkcurwidget) {
+ if (m_checkcurwidget && currentwidgetitem) {
+ int currentRow = currentwidgetitem->row();
+ QTableWidgetItem *currentrowzeroitem = tableWidget->item(currentRow, 0);
+ m_currentlyselected = currentrowzeroitem->text();
+
/* The Previous item */
if (previouswidgetitem) { /* avoid a segfault if first time */
- int treedepth = previouswidgetitem->data(0, Qt::UserRole).toInt();
- if (treedepth == 1) {
- mp_treeWidget->removeAction(actionStatusFileSetInConsole);
- }
+ tableWidget->removeAction(actionStatusFileSetInConsole);
+ tableWidget->removeAction(actionShowJobs);
}
- int treedepth = currentwidgetitem->data(0, Qt::UserRole).toInt();
- if (treedepth == 1){
+ if (m_currentlyselected.length() != 0) {
/* set a hold variable to the fileset name in case the context sensitive
* menu is used */
- m_currentlyselected=currentwidgetitem->text(0);
- mp_treeWidget->addAction(actionStatusFileSetInConsole);
+ tableWidget->addAction(actionStatusFileSetInConsole);
+ tableWidget->addAction(actionShowJobs);
}
}
}
*/
void FileSet::createContextMenu()
{
- mp_treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
- mp_treeWidget->addAction(actionRefreshFileSet);
- connect(mp_treeWidget, SIGNAL(
- currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
- this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
+ tableWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
+ tableWidget->addAction(actionRefreshFileSet);
+ connect(tableWidget, SIGNAL(
+ currentItemChanged(QTableWidgetItem *, QTableWidgetItem *)),
+ this, SLOT(tableItemChanged(QTableWidgetItem *, QTableWidgetItem *)));
/* connect to the action specific to this pages class */
connect(actionRefreshFileSet, SIGNAL(triggered()), this,
- SLOT(populateTree()));
+ SLOT(populateTable()));
connect(actionStatusFileSetInConsole, SIGNAL(triggered()), this,
- SLOT(consoleStatusFileSet()));
+ SLOT(consoleShowFileSet()));
+ connect(actionShowJobs, SIGNAL(triggered()), this,
+ SLOT(showJobs()));
}
/*
* Function responding to actionListJobsofFileSet which calls mainwin function
* to create a window of a list of jobs of this fileset.
*/
-void FileSet::consoleStatusFileSet()
+void FileSet::consoleShowFileSet()
{
- QString cmd("status fileset=");
- cmd += m_currentlyselected;
+ QString cmd("show fileset=\"");
+ cmd += m_currentlyselected + "\"";
consoleCommand(cmd);
}
*/
void FileSet::currentStackItem()
{
- if(!m_populated) {
- populateTree();
- /* add context sensitive menu items specific to this classto the page
- * selector tree. m_m_contextActions is QList of QActions, so this is
- * only done once with the first population. */
- m_contextActions.append(actionRefreshFileSet);
- /* Create the context menu for the fileset tree */
+ if (!m_populated) {
+ populateTable();
+ /* Create the context menu for the fileset table */
createContextMenu();
- m_populated=true;
}
}
+
+/*
+ * Save user settings associated with this page
+ */
+void FileSet::writeSettings()
+{
+ QSettings settings(m_console->m_dir->name(), "bat");
+ settings.beginGroup("FileSet");
+ settings.setValue("geometry", saveGeometry());
+ settings.endGroup();
+}
+
+/*
+ * Read and restore user settings associated with this page
+ */
+void FileSet::readSettings()
+{
+ QSettings settings(m_console->m_dir->name(), "bat");
+ settings.beginGroup("FileSet");
+ restoreGeometry(settings.value("geometry").toByteArray());
+ settings.endGroup();
+}
+
+/*
+ * Create a JobList object pre-populating a fileset
+ */
+void FileSet::showJobs()
+{
+ QTreeWidgetItem *parentItem = mainWin->getFromHash(this);
+ mainWin->createPageJobList("", "", "", m_currentlyselected, parentItem);
+}