X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fqt-console%2Ffileset%2Ffileset.cpp;h=da3948ad14e57fc0ea24a130d79b8c47ce29aeee;hb=30e9cdfaae8256dc30ef46fe799a6393b2e7c74a;hp=bf4513ce561c4da6aff80bea5983a1b12331b4c5;hpb=f6fbd21a90ae454338ba7dafc774d8f8615ecd32;p=bacula%2Fbacula diff --git a/bacula/src/qt-console/fileset/fileset.cpp b/bacula/src/qt-console/fileset/fileset.cpp index bf4513ce56..da3948ad14 100644 --- a/bacula/src/qt-console/fileset/fileset.cpp +++ b/bacula/src/qt-console/fileset/fileset.cpp @@ -1,14 +1,14 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2007 Free Software Foundation Europe e.V. + 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 plus additions - that are listed in the file LICENSE. + 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 @@ -20,14 +20,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - Bacula® is a registered trademark of John Walker. + 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: fileset.cpp 4230 2007-02-21 20:07:37Z kerns $ + * Version $Id$ * * FileSet Class * @@ -35,98 +35,142 @@ * */ +#include "bat.h" #include #include -#include "bat.h" #include "fileset/fileset.h" +#include "util/fmtwidgetitem.h" FileSet::FileSet() { 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; + m_populated = true; + 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"); + + /* 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; cnterresizeColumnToContents(cnter); + foreach(QString filesetName, notFoundList) { + TableItemFormatter item(*tableWidget, row); + item.setTextFld(0, filesetName); + row++; } + + /* set default sorting */ + tableWidget->sortByColumn(headerlist.indexOf(tr("Create Time")), Qt::DescendingOrder); + 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))); + } + } + } } /* @@ -136,35 +180,35 @@ void FileSet::populateTree() void FileSet::PgSeltreeWidgetClicked() { if (!m_populated) { - populateTree(); + populateTable(); createContextMenu(); - m_populated = true; } + 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) { + 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); } } } @@ -176,26 +220,28 @@ void FileSet::treeItemChanged(QTreeWidgetItem *currentwidgetitem, */ 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); } @@ -205,13 +251,39 @@ void FileSet::consoleStatusFileSet() 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 */ + 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); +}