]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/qt-console/fileset/fileset.cpp
Backport from Bacula Enterprise
[bacula/bacula] / bacula / src / qt-console / fileset / fileset.cpp
index bf4513ce561c4da6aff80bea5983a1b12331b4c5..1a8a3f97fd99fd78172a6c4407704e0af26d9f59 100644 (file)
 /*
-   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-2015 Kern Sibbald
+   Copyright (C) 2007-2009 Free Software Foundation Europe e.V.
+
+   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;
 
+   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;
 }
 
 /*
@@ -136,9 +174,11 @@ void FileSet::populateTree()
 void FileSet::PgSeltreeWidgetClicked()
 {
    if (!m_populated) {
-      populateTree();
+      populateTable();
       createContextMenu();
-      m_populated = true;
+   }
+   if (!isOnceDocked()) {
+      dockPage();
    }
 }
 
@@ -146,25 +186,25 @@ void FileSet::PgSeltreeWidgetClicked()
  * 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);
       }
    }
 }
@@ -176,26 +216,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);
 }
 
@@ -204,14 +246,40 @@ 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 */
+   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);
+}