]> git.sur5r.net Git - bacula/bacula/commitdiff
Add a consoleCommand to Pages class
authorDirk H Bartley <dbartley@schupan.com>
Sun, 22 Apr 2007 01:50:10 +0000 (01:50 +0000)
committerDirk H Bartley <dbartley@schupan.com>
Sun, 22 Apr 2007 01:50:10 +0000 (01:50 +0000)
Added Storage class and a FileSet class
Added a context sensitive menu option for status client from client page
Added a context sensitive menu option for status storage from storage page
Added a context sensitive menu option for status fileset from fileset page

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@4588 91ce42f0-d328-0410-95d8-f526ca767f89

15 files changed:
bacula/src/qt-console/TODO
bacula/src/qt-console/bat.pro
bacula/src/qt-console/clients/clients.cpp
bacula/src/qt-console/clients/clients.h
bacula/src/qt-console/clients/clients.ui
bacula/src/qt-console/fileset/fileset.cpp [new file with mode: 0644]
bacula/src/qt-console/fileset/fileset.h [new file with mode: 0644]
bacula/src/qt-console/fileset/fileset.ui [new file with mode: 0644]
bacula/src/qt-console/mainwin.cpp
bacula/src/qt-console/mainwin.h
bacula/src/qt-console/pages.cpp
bacula/src/qt-console/pages.h
bacula/src/qt-console/storage/storage.cpp [new file with mode: 0644]
bacula/src/qt-console/storage/storage.h [new file with mode: 0644]
bacula/src/qt-console/storage/storage.ui [new file with mode: 0644]

index 9f937d4186b466d59ad7348a7cb82b95ede783df..06d6eec025a5aef24d6038ee6c817d40a190dd26 100644 (file)
@@ -3,18 +3,11 @@ dhb
 Must:: get page selector to follow undocked windows.  Otherwise
 current console won't be current.
 
-Low priority item:
-move behavior of:
-  MainWin::setContextMenuDockText
-  MainWin::setTreeWidgetItemDockColor
-to the pages class
+Figure out how to get tables like Joblist to do the equivalent of double clicking
+on the separating lines between each of the headings.
 
 Add context sensitive options for most commands
-
-Re-add class for storage, I accidentally reverted because I left
-it on my laptop.  This is why I like committing often.
-
-Add class for FileSets
+status dir on page select director item
 
 Create list of what does not work.
 
@@ -27,15 +20,20 @@ Create documentation for any other developers interested in creating
 new classes to add more pages.  Explain how to use the pages class
 and about not populating until the tree widget is clicked etc...
 
-A Tree widget context sensitive from anywhere a job is listed for 
-the ability to surf what's on the job.
+A Tree widget context sensitive menu option and class to jump from known job
+to surf the filestructure on the job.
 
-Think about good ways to clean up the Console creation part of the
-loop creating pages.
+LOW priority items:
 
-Font is being set on a per console basis, should it be.
-Tried to get the settings to write for a second, but not coming up next time
+Get rid of "Warning: name layoutWidget is already used" when make uic's resture.ui
 
+move behavior of:
+  MainWin::setContextMenuDockText
+  MainWin::setTreeWidgetItemDockColor
+to the pages class
+
+Think about good ways to clean up the Console creation part of the
+loop creating pages.
 ========================================================
 Things to do:
 
@@ -56,6 +54,13 @@ global one defined in the mainWin class (if I remember right).
 ============================================================
 DONE:
 ============================================================
+
+Re-add class for storage, I accidentally reverted because I left
+it on my laptop.  This is why I like committing often.
+
+Add class for FileSets
+
+
 Another idea for what you have implemented:
 - I think that the dynamic pages that you create on the fly
 should be nested under the item that creates them more like a
index e91810d71be89ba3b50b11d03853d91c8d76df94..d5de17896cace4378626f4c60cf000b767e0ec13 100644 (file)
@@ -24,7 +24,7 @@ FORMS += restore/restore.ui restore/prerestore.ui restore/brestore.ui
 FORMS += run/run.ui run/runcmd.ui
 FORMS += select/select.ui
 FORMS += medialist/medialist.ui mediaedit/mediaedit.ui joblist/joblist.ui
-FORMS += clients/clients.ui
+FORMS += clients/clients.ui storage/storage.ui fileset/fileset.ui
 
 HEADERS += mainwin.h bat.h bat_conf.h qstd.h
 SOURCES += main.cpp bat_conf.cpp mainwin.cpp qstd.cpp
@@ -68,3 +68,11 @@ SOURCES += joblist/joblist.cpp
 ## Clients
 HEADERS += clients/clients.h
 SOURCES += clients/clients.cpp
+
+## Storage
+HEADERS += storage/storage.h
+SOURCES += storage/storage.cpp
+
+## Fileset
+HEADERS += fileset/fileset.h
+SOURCES += fileset/fileset.cpp
index c10e7d9a91a2ec5c46b587b9705a4b2fdc943f9e..290d8d2319ebfc127e2a86c938f25e02e21ee3f7 100644 (file)
@@ -148,6 +148,7 @@ void Clients::treeItemChanged(QTreeWidgetItem *currentwidgetitem, QTreeWidgetIte
          int treedepth = previouswidgetitem->data(0, Qt::UserRole).toInt();
          if (treedepth == 1){
             mp_treeWidget->removeAction(actionListJobsofClient);
+            mp_treeWidget->removeAction(actionStatusClientInConsole);
          }
       }
 
@@ -157,6 +158,7 @@ void Clients::treeItemChanged(QTreeWidgetItem *currentwidgetitem, QTreeWidgetIte
           * menu is used */
          m_currentlyselected=currentwidgetitem->text(0);
          mp_treeWidget->addAction(actionListJobsofClient);
+         mp_treeWidget->addAction(actionStatusClientInConsole);
       }
    }
 }
@@ -178,6 +180,8 @@ void Clients::createContextMenu()
                 SLOT(populateTree()));
    connect(actionListJobsofClient, SIGNAL(triggered()), this,
                 SLOT(showJobs()));
+   connect(actionStatusClientInConsole, SIGNAL(triggered()), this,
+                SLOT(consoleStatusClient()));
 }
 
 /*
@@ -191,6 +195,17 @@ void Clients::showJobs()
    mainWin->createPageJobList(emptymedia, m_currentlyselected, parentItem);
 }
 
+/*
+ * Function responding to actionListJobsofClient which calls mainwin function
+ * to create a window of a list of jobs of this client.
+ */
+void Clients::consoleStatusClient()
+{
+   QString cmd("status client=");
+   cmd += m_currentlyselected += "\n";
+   consoleCommand(cmd);
+}
+
 /*
  * Virtual function which is called when this page is visible on the stack
  */
index 12fa98b6758c2db670abbb3442fc9b45f3c536f3..4d39ef31a4a1c594845844ee514f823cab3edd66 100644 (file)
@@ -56,6 +56,7 @@ public slots:
 private slots:
    void populateTree();
    void showJobs();
+   void consoleStatusClient();
 
 private:
    void createContextMenu();
index 7df98614bdaf4274c171acd1b52697a1c0d9907d..bb08890e65b3c389a5e52a2a464f41c39e77c3b8 100644 (file)
     <string>List Jobs of Client</string>
    </property>
   </action>
+  <action name="actionStatusClientInConsole" >
+   <property name="icon" >
+    <iconset>../images/status.png</iconset>
+   </property>
+   <property name="text" >
+    <string>Status Client In Console</string>
+   </property>
+  </action>
  </widget>
  <resources/>
  <connections/>
diff --git a/bacula/src/qt-console/fileset/fileset.cpp b/bacula/src/qt-console/fileset/fileset.cpp
new file mode 100644 (file)
index 0000000..da232bf
--- /dev/null
@@ -0,0 +1,222 @@
+/*
+   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.
+*/
+/*
+ *   Version $Id: fileset.cpp 4230 2007-02-21 20:07:37Z kerns $
+ *
+ *  FileSet Class
+ *
+ *   Dirk Bartley, March 2007
+ *
+ */ 
+
+#include <QAbstractEventDispatcher>
+#include <QMenu>
+#include "bat.h"
+#include "fileset/fileset.h"
+
+FileSet::FileSet()
+{
+   setupUi(this);
+   pgInitialize();
+
+   /* mp_treeWidget, FileSet Tree Tree Widget inherited from ui_fileset.h */
+   m_populated = false;
+   m_checkcurwidget = true;
+   m_closeable = false;
+}
+
+FileSet::~FileSet()
+{
+}
+
+/*
+ * The main meat of the class!!  The function that querries the director and 
+ * creates the widgets with appropriate values.
+ */
+void FileSet::populateTree()
+{
+   QTreeWidgetItem *filesetItem, *topItem;
+
+   m_checkcurwidget = false;
+   mp_treeWidget->clear();
+   m_checkcurwidget = true;
+
+   QStringList headerlist = (QStringList() << "FileSet Name" << "FileSet Id"
+       << "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");
+
+   foreach(QString filesetName, m_console->fileset_list){
+      filesetItem = new QTreeWidgetItem(topItem);
+      filesetItem->setText(0, filesetName);
+      filesetItem->setData(0, Qt::UserRole, 1);
+      filesetItem->setExpanded(true);
+
+      /* 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";
+
+      QStringList results;
+      /* This could be a log item */
+      //printf("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++;
+               }
+            }
+         }
+      }
+   }
+}
+
+/*
+ * When the treeWidgetItem in the page selector tree is singleclicked, Make sure
+ * The tree has been populated.
+ */
+void FileSet::PgSeltreeWidgetClicked()
+{
+   if(!m_populated) {
+      populateTree();
+      createContextMenu();
+      m_populated=true;
+   }
+}
+
+/*
+ * Added to set the context menu policy based on currently active treeWidgetItem
+ * signaled by currentItemChanged
+ */
+void FileSet::treeItemChanged(QTreeWidgetItem *currentwidgetitem, QTreeWidgetItem *previouswidgetitem )
+{
+   /* m_checkcurwidget checks to see if this is during a refresh, which will segfault */
+   if (m_checkcurwidget) {
+      /* 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);
+         }
+      }
+
+      int treedepth = currentwidgetitem->data(0, Qt::UserRole).toInt();
+      if (treedepth == 1){
+         /* 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);
+      }
+   }
+}
+
+/* 
+ * Setup a context menu 
+ * Made separate from populate so that it would not create context menu over and
+ * over as the tree is repopulated.
+ */
+void FileSet::createContextMenu()
+{
+   mp_treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
+   mp_treeWidget->addAction(actionRefreshFileSet);
+   connect(mp_treeWidget, SIGNAL(
+           currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
+           this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
+   /* connect to the action specific to this pages class */
+   connect(actionRefreshFileSet, SIGNAL(triggered()), this,
+                SLOT(populateTree()));
+   connect(actionStatusFileSetInConsole, SIGNAL(triggered()), this,
+                SLOT(consoleStatusFileSet()));
+}
+
+/*
+ * Function responding to actionListJobsofFileSet which calls mainwin function
+ * to create a window of a list of jobs of this fileset.
+ */
+void FileSet::consoleStatusFileSet()
+{
+   QString cmd("status fileset=");
+   cmd += m_currentlyselected += "\n";
+   consoleCommand(cmd);
+//   m_console->write_dir(cmd.toUtf8().data());
+//   m_console->displayToPrompt();
+   /* Bring this directors console to the front of the stack */
+//   mainWin->treeWidget->setCurrentItem(mainWin->getFromHash(m_console));
+}
+
+/*
+ * Virtual function which is called when this page is visible on the stack
+ */
+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 */
+      createContextMenu();
+      m_populated=true;
+   }
+}
+
+/*
+ * Virtual Function to return the name for the medialist tree widget
+ */
+void FileSet::treeWidgetName(QString &name)
+{
+   name = "FileSet";
+}
+
diff --git a/bacula/src/qt-console/fileset/fileset.h b/bacula/src/qt-console/fileset/fileset.h
new file mode 100644 (file)
index 0000000..285b645
--- /dev/null
@@ -0,0 +1,66 @@
+#ifndef _FILESET_H_
+#define _FILESET_H_
+/*
+   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.
+*/
+/*
+ *   Version $Id: clients.h 4230 2007-02-21 20:07:37Z kerns $
+ *
+ *   Dirk Bartley, March 2007
+ */
+
+#include <QtGui>
+#include "ui_fileset.h"
+#include "console.h"
+#include "pages.h"
+
+class FileSet : public Pages, public Ui::FileSetForm
+{
+   Q_OBJECT 
+
+public:
+   FileSet();
+   ~FileSet();
+   virtual void PgSeltreeWidgetClicked();
+   virtual void currentStackItem();
+   void treeWidgetName(QString &);
+
+public slots:
+   void treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *);
+
+private slots:
+   void populateTree();
+   void consoleStatusFileSet();
+
+private:
+   void createContextMenu();
+   QString m_currentlyselected;
+   bool m_populated;
+   bool m_checkcurwidget;
+};
+
+#endif /* _FILESET_H_ */
diff --git a/bacula/src/qt-console/fileset/fileset.ui b/bacula/src/qt-console/fileset/fileset.ui
new file mode 100644 (file)
index 0000000..863a370
--- /dev/null
@@ -0,0 +1,48 @@
+<ui version="4.0" >
+ <class>FileSetForm</class>
+ <widget class="QWidget" name="FileSetForm" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>763</width>
+    <height>650</height>
+   </rect>
+  </property>
+  <property name="windowTitle" >
+   <string>FileSet Tree</string>
+  </property>
+  <layout class="QGridLayout" >
+   <property name="margin" >
+    <number>9</number>
+   </property>
+   <property name="spacing" >
+    <number>6</number>
+   </property>
+   <item row="0" column="0" >
+    <widget class="QTreeWidget" name="mp_treeWidget" />
+   </item>
+  </layout>
+  <action name="actionRefreshFileSet" >
+   <property name="icon" >
+    <iconset>../images/run.png</iconset>
+   </property>
+   <property name="text" >
+    <string>Refresh FileSet List</string>
+   </property>
+   <property name="statusTip" >
+    <string>Requery the director for the list of storage objects.</string>
+   </property>
+  </action>
+  <action name="actionStatusFileSetInConsole" >
+   <property name="icon" >
+    <iconset>../images/status.png</iconset>
+   </property>
+   <property name="text" >
+    <string>Status FileSet In Console</string>
+   </property>
+  </action>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
index 1939461777de17324195401aa7b9d09e6536505e..ba8b8fe7abc60dc36da88d90b4fe610d97c43af4 100644 (file)
@@ -37,6 +37,8 @@
 
 #include "bat.h"
 #include "joblist/joblist.h"
+#include "storage/storage.h"
+#include "fileset/fileset.h"
 
 MainWin::MainWin(QWidget *parent) : QMainWindow(parent)
 {
@@ -114,6 +116,8 @@ void MainWin::createPages()
       QString emptymedia(""), emptyclient("");
       createPageJobList(emptymedia, emptyclient, NULL);
       createPageClients();
+      createPageStorage();
+      createPageFileSet();
 
       treeWidget->expandItem(topItem);
       stackedWidget->setCurrentWidget(m_currentConsole);
@@ -172,6 +176,23 @@ void MainWin::createPageClients()
    clients->dockPage();
 }
 
+/*
+ * create an instance of the the storage class on the stack
+ */
+void MainWin::createPageStorage()
+{
+   Storage* storage = new Storage();
+   storage->dockPage();
+}
+
+/*
+ * create an instance of the the fileset class on the stack
+ */
+void MainWin::createPageFileSet()
+{
+   FileSet* fileset = new FileSet();
+   fileset->dockPage();
+}
 
 /* Create a root Tree Widget */
 QTreeWidgetItem *MainWin::createTopPage(char *name)
index 109ae598465ad14c4b5c0cbb7e016739abc0c25a..b568711c4d0833502b513e26ffe1a87f665f9663 100644 (file)
@@ -105,6 +105,8 @@ private:
    void createPagebRestore();
    void createPageMediaList();
    void createPageClients();
+   void createPageStorage();
+   void createPageFileSet();
 
 private:
    Console *m_currentConsole;
index 74cebde6cbe30df2f186fcb7f15a0cbcba82bef0..e1cfec9d5de8b4d268cfe7129b300d58b1cc9d28 100644 (file)
@@ -206,3 +206,15 @@ void Pages::treeWidgetName(QString &name)
 {
    name = "Default Page Name";
 }
+
+/*
+ * Function to simplify executing a console command and bringing the
+ * console to the front of the stack
+ */
+void Pages::consoleCommand(QString &command)
+{
+   m_console->write_dir(command.toUtf8().data());
+   m_console->displayToPrompt();
+   /* Bring this directors console to the front of the stack */
+   mainWin->treeWidget->setCurrentItem(mainWin->getFromHash(m_console));
+}
index aec0d6a0b33bebc97be5225f17bb59038ff8e6fc..85b99b5f7fcbfe8aa646f2435c8c4c3cd2f8f01e 100644 (file)
@@ -74,6 +74,7 @@ public slots:
 protected:
    void pgInitialize();
    void pgInitialize(QTreeWidgetItem *);
+   void consoleCommand(QString &);
    bool m_closeable;
    bool m_docked;
    virtual void treeWidgetName(QString &);
diff --git a/bacula/src/qt-console/storage/storage.cpp b/bacula/src/qt-console/storage/storage.cpp
new file mode 100644 (file)
index 0000000..8efd845
--- /dev/null
@@ -0,0 +1,222 @@
+/*
+   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.
+*/
+/*
+ *   Version $Id: storage.cpp 4230 2007-02-21 20:07:37Z kerns $
+ *
+ *  Storage Class
+ *
+ *   Dirk Bartley, March 2007
+ *
+ */ 
+
+#include <QAbstractEventDispatcher>
+#include <QMenu>
+#include "bat.h"
+#include "storage/storage.h"
+
+Storage::Storage()
+{
+   setupUi(this);
+   pgInitialize();
+
+   /* mp_treeWidget, Storage Tree Tree Widget inherited from ui_storage.h */
+   m_populated = false;
+   m_checkcurwidget = true;
+   m_closeable = false;
+}
+
+Storage::~Storage()
+{
+}
+
+/*
+ * The main meat of the class!!  The function that querries the director and 
+ * creates the widgets with appropriate values.
+ */
+void Storage::populateTree()
+{
+   QTreeWidgetItem *storageItem, *topItem;
+
+   m_checkcurwidget = false;
+   mp_treeWidget->clear();
+   m_checkcurwidget = true;
+
+   QStringList headerlist = (QStringList() << "Storage Name" << "Storage Id"
+       << "Auto Changer");
+
+   topItem = new QTreeWidgetItem(mp_treeWidget);
+   topItem->setText(0, "Storage");
+   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 Storage::populateTree()\n");
+
+   foreach(QString storageName, m_console->storage_list){
+      storageItem = new QTreeWidgetItem(topItem);
+      storageItem->setText(0, storageName);
+      storageItem->setData(0, Qt::UserRole, 1);
+      storageItem->setExpanded(true);
+
+      /* Set up query QString and header QStringList */
+      QString query("");
+      query += "SELECT Name AS StorageName, StorageId AS ID, AutoChanger"
+           " FROM Storage"
+           " WHERE ";
+      query += " Name='" + storageName + "'";
+      query += " ORDER BY Name";
+
+      QStringList results;
+      /* This could be a log item */
+      //printf("Storage 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 */
+                  storageItem->setData(index+1, Qt::UserRole, 1);
+                  /* Put media fields under the pool tree item */
+                  storageItem->setData(index+1, Qt::UserRole, 1);
+                  storageItem->setText(index+1, field);
+                  index++;
+               }
+            }
+         }
+      }
+   }
+}
+
+/*
+ * When the treeWidgetItem in the page selector tree is singleclicked, Make sure
+ * The tree has been populated.
+ */
+void Storage::PgSeltreeWidgetClicked()
+{
+   if(!m_populated) {
+      populateTree();
+      createContextMenu();
+      m_populated=true;
+   }
+}
+
+/*
+ * Added to set the context menu policy based on currently active treeWidgetItem
+ * signaled by currentItemChanged
+ */
+void Storage::treeItemChanged(QTreeWidgetItem *currentwidgetitem, QTreeWidgetItem *previouswidgetitem )
+{
+   /* m_checkcurwidget checks to see if this is during a refresh, which will segfault */
+   if (m_checkcurwidget) {
+      /* 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(actionStatusStorageInConsole);
+         }
+      }
+
+      int treedepth = currentwidgetitem->data(0, Qt::UserRole).toInt();
+      if (treedepth == 1){
+         /* set a hold variable to the storage name in case the context sensitive
+          * menu is used */
+         m_currentlyselected=currentwidgetitem->text(0);
+         mp_treeWidget->addAction(actionStatusStorageInConsole);
+      }
+   }
+}
+
+/* 
+ * Setup a context menu 
+ * Made separate from populate so that it would not create context menu over and
+ * over as the tree is repopulated.
+ */
+void Storage::createContextMenu()
+{
+   mp_treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
+   mp_treeWidget->addAction(actionRefreshStorage);
+   connect(mp_treeWidget, SIGNAL(
+           currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
+           this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
+   /* connect to the action specific to this pages class */
+   connect(actionRefreshStorage, SIGNAL(triggered()), this,
+                SLOT(populateTree()));
+   connect(actionStatusStorageInConsole, SIGNAL(triggered()), this,
+                SLOT(consoleStatusStorage()));
+}
+
+/*
+ * Function responding to actionListJobsofStorage which calls mainwin function
+ * to create a window of a list of jobs of this storage.
+ */
+void Storage::consoleStatusStorage()
+{
+   QString cmd("status storage=");
+   cmd += m_currentlyselected += "\n";
+   consoleCommand(cmd);
+//   m_console->write_dir(cmd.toUtf8().data());
+//   m_console->displayToPrompt();
+   /* Bring this directors console to the front of the stack */
+//   mainWin->treeWidget->setCurrentItem(mainWin->getFromHash(m_console));
+}
+
+/*
+ * Virtual function which is called when this page is visible on the stack
+ */
+void Storage::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(actionRefreshStorage);
+      /* Create the context menu for the storage tree */
+      createContextMenu();
+      m_populated=true;
+   }
+}
+
+/*
+ * Virtual Function to return the name for the medialist tree widget
+ */
+void Storage::treeWidgetName(QString &name)
+{
+   name = "Storage";
+}
+
diff --git a/bacula/src/qt-console/storage/storage.h b/bacula/src/qt-console/storage/storage.h
new file mode 100644 (file)
index 0000000..8b78895
--- /dev/null
@@ -0,0 +1,67 @@
+#ifndef _STORAGE_H_
+#define _STORAGE_H_
+/*
+   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.
+*/
+/*
+ *   Version $Id: clients.h 4230 2007-02-21 20:07:37Z kerns $
+ *
+ *   Dirk Bartley, March 2007
+ */
+
+#include <QtGui>
+#include "ui_storage.h"
+#include "console.h"
+#include "pages.h"
+
+class Storage : public Pages, public Ui::StorageForm
+{
+   Q_OBJECT 
+
+public:
+   Storage();
+   ~Storage();
+   virtual void PgSeltreeWidgetClicked();
+   virtual void currentStackItem();
+   void treeWidgetName(QString &);
+
+public slots:
+   void treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *);
+
+private slots:
+   void populateTree();
+//   void showJobs();
+   void consoleStatusStorage();
+
+private:
+   void createContextMenu();
+   QString m_currentlyselected;
+   bool m_populated;
+   bool m_checkcurwidget;
+};
+
+#endif /* _STORAGE_H_ */
diff --git a/bacula/src/qt-console/storage/storage.ui b/bacula/src/qt-console/storage/storage.ui
new file mode 100644 (file)
index 0000000..1c1d1eb
--- /dev/null
@@ -0,0 +1,48 @@
+<ui version="4.0" >
+ <class>StorageForm</class>
+ <widget class="QWidget" name="StorageForm" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>763</width>
+    <height>650</height>
+   </rect>
+  </property>
+  <property name="windowTitle" >
+   <string>Storage Tree</string>
+  </property>
+  <layout class="QGridLayout" >
+   <property name="margin" >
+    <number>9</number>
+   </property>
+   <property name="spacing" >
+    <number>6</number>
+   </property>
+   <item row="0" column="0" >
+    <widget class="QTreeWidget" name="mp_treeWidget" />
+   </item>
+  </layout>
+  <action name="actionRefreshStorage" >
+   <property name="icon" >
+    <iconset>../images/run.png</iconset>
+   </property>
+   <property name="text" >
+    <string>Refresh Storage List</string>
+   </property>
+   <property name="statusTip" >
+    <string>Requery the director for the list of storage objects.</string>
+   </property>
+  </action>
+  <action name="actionStatusStorageInConsole" >
+   <property name="icon" >
+    <iconset>../images/status.png</iconset>
+   </property>
+   <property name="text" >
+    <string>Status Storage In Console</string>
+   </property>
+  </action>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>