]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/qt-console/restore/restore.cpp
Working directory pane in restore. Will get this into the stack next.
[bacula/bacula] / bacula / src / qt-console / restore / restore.cpp
index 13145ed16433dfcfc7cb13b92affac85a953880d..928efdd6cdcb9e375c6a7c54c28ab189dbbf40a1 100644 (file)
 #include "bat.h"
 #include "restore.h"
 
-restoreDialog::restoreDialog(Console *console)
+restoreDialog::restoreDialog(Console *console )
 {
+   QStringList titles;
+
    m_console = console;
-  
-   m_console->setEnabled(false);
+   m_console->notify(false);          /* this should already be off */
+
    setupUi(this);
    connect(fileWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), 
            this, SLOT(fileDoubleClicked(QTreeWidgetItem *, int)));
+   connect(directoryWidget, SIGNAL(
+           currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
+           this, SLOT(directoryItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
+   connect(upButton, SIGNAL(pressed()), this, SLOT(upButtonPushed()));
+   connect(markButton, SIGNAL(pressed()), this, SLOT(markButtonPushed()));
+   connect(unmarkButton, SIGNAL(pressed()), this, SLOT(unmarkButtonPushed()));
    setFont(m_console->get_font());
    m_console->displayToPrompt();
+
+
+   titles << "Mark" << "File" << "Mode" << "User" << "Group" << "Size" << "Date";
+   fileWidget->setHeaderLabels(titles);
+
+   get_cwd();
    fillDirectory();
    this->show();
 }
@@ -57,25 +71,15 @@ restoreDialog::restoreDialog(Console *console)
  */
 void restoreDialog::fillDirectory()
 {
-   char cd_cmd[MAXSTRING];
    char modes[20], user[20], group[20], size[20], date[30];
    char marked[10];
    int pnl, fnl;
    POOLMEM *file = get_pool_memory(PM_FNAME);
    POOLMEM *path = get_pool_memory(PM_FNAME);
-   QStringList titles;
-
-   titles << "Mark" << "File" << "Mode" << "User" << "Group" << "Size" << "Date";
-   fileWidget->setHeaderLabels(titles);
-
-   char *dir = get_cwd();
-   bsnprintf(cd_cmd, sizeof(cd_cmd), "cd \"%s\"\n", dir);
-   Dmsg2(100, "dir=%s cmd=%s\n", dir, cd_cmd);
-   m_console->write_dir(cd_cmd);
-   m_console->discardToPrompt();
 
+   fileWidget->clear();
    m_console->write_dir("dir");
-   QList<QTreeWidgetItem *> items;
+   QList<QTreeWidgetItem *> treeItemList;
    QStringList item;
    while (m_console->read() > 0) {
       char *p = m_console->msg();
@@ -122,24 +126,80 @@ void restoreDialog::fillDirectory()
       }
       split_path_and_filename(p, &path, &pnl, &file, &fnl);
       item.clear();
-      item << "" << file << modes << user << group << size << date;
+      item << marked << file << modes << user << group << size << date;
+      if (item[1].endsWith("/")) {
+         addDirectory(item[1]);
+       }
       QTreeWidgetItem *ti = new QTreeWidgetItem((QTreeWidget *)0, item);
       ti->setTextAlignment(5, Qt::AlignRight); /* right align size */
-      items.append(ti);
+      treeItemList.append(ti);
    }
    fileWidget->clear();
-   fileWidget->insertTopLevelItems(0, items);
+   fileWidget->insertTopLevelItems(0, treeItemList);
+   for (int i=0; i<7; i++) {
+      fileWidget->resizeColumnToContents(i);
+   }
 
    free_pool_memory(file);
    free_pool_memory(path);
 }
 
+/*
+ * Function called from fill directory when a directory is found to see if this
+ * directory exists in the directory pane and then add it to the directory pane
+ */
+void restoreDialog::addDirectory(QString &newdir)
+{
+   QString fullpath ;
+
+   /* if this is the base dir, strip off the leading "/" */
+   if (m_cwd == "/"){
+      fullpath = newdir;
+   } else {
+      fullpath = m_cwd + newdir;
+   }
+   /* is it already existent ?? */
+   if (!m_dirPaths.contains(fullpath)) {
+      QTreeWidgetItem *item = NULL;
+      if (m_dirPaths.empty()) {
+         /* this is the base widget */
+         item = new QTreeWidgetItem(directoryWidget);
+         item->setText(0, newdir.toUtf8().data());
+      } else {
+         QTreeWidgetItem *parent = m_dirPaths.value(m_cwd);
+         if (parent) {
+            /* new directories to add */
+            item = new QTreeWidgetItem(parent);
+            item->setText(0, newdir.toUtf8().data());
+            directoryWidget->expandItem(parent);
+         }
+      }
+      /* insert into both forward and reverse hash */
+      m_dirPaths.insert(fullpath, item);
+      m_dirTreeItems.insert(item, fullpath);
+   }
+}
+
+/*
+ * Executed when the tree item in the directory pane is changed.  This will
+ * allow us to populate the file pane and make this the cwd.
+ */
+void restoreDialog::directoryItemChanged(QTreeWidgetItem *currentitem,
+                                         QTreeWidgetItem * /*previousitem*/)
+{
+   QString fullpath = m_dirTreeItems.value(currentitem);
+   if (fullpath != ""){
+      cwd(fullpath.toUtf8().data());
+      fillDirectory();
+   }
+}
+
 void restoreDialog::accept()
 {
    this->hide();
    m_console->write("done");
+   m_console->notify(true);
    delete this;
-   m_console->setEnabled(true);
    mainWin->resetFocus();
 }
 
@@ -150,30 +210,121 @@ void restoreDialog::reject()
    m_console->write("quit");
    mainWin->set_status("Canceled");
    delete this;
-   m_console->setEnabled(true);
+   m_console->notify(true);
    mainWin->resetFocus();
 }
 
 void restoreDialog::fileDoubleClicked(QTreeWidgetItem *item, int column)
 {
    char cmd[1000];
-//   printf("cwd=%s Text=%s column=%d\n", m_cwd.toUtf8().data(), 
-//          item->text(1).toUtf8().data(), column);
    if (column == 0) {                 /* mark/unmark */
       if (item->text(0) == "*") {
-         bsnprintf(cmd, sizeof(cmd), "unmark \"%s\"\n", item->text(1).toUtf8().data());
+         bsnprintf(cmd, sizeof(cmd), "unmark \"%s\"", item->text(1).toUtf8().data());
          item->setText(0, " ");
       } else {
-         bsnprintf(cmd, sizeof(cmd), "mark \"%s\"\n", item->text(1).toUtf8().data());
+         bsnprintf(cmd, sizeof(cmd), "mark \"%s\"", item->text(1).toUtf8().data());
          item->setText(0, "*");
       }
-      m_console->write(cmd);
-//    printf("cmd=%s", cmd);
+      m_console->write_dir(cmd);
+      if (m_console->read() > 0) {
+         strip_trailing_junk(m_console->msg());
+         statusLine->setText(m_console->msg());
+      }
       m_console->displayToPrompt();
       return;
+   }    
+   /* 
+    * Double clicking other than column 0 means to decend into
+    *  the directory -- or nothing if it is not a directory.
+    */
+   if (item->text(1).endsWith("/")) {
+      QString fullpath = m_cwd + item->text(1);
+      QTreeWidgetItem *item = m_dirPaths.value(fullpath);
+      if (item) {
+         directoryWidget->setCurrentItem(item);
+      }
+   }
+}
+
+/*
+ * If up button pushed, making the parent tree widget current will call fill
+ * directory.
+ */
+void restoreDialog::upButtonPushed()
+{
+   cwd("..");
+   QTreeWidgetItem *item = m_dirPaths.value(m_cwd);
+   if (item) {
+      directoryWidget->setCurrentItem(item);
+   }
+}
+
+/*
+ * Mark selected items
+ */
+void restoreDialog::markButtonPushed()
+{
+   QList<QTreeWidgetItem *> treeItemList = fileWidget->selectedItems();
+   QTreeWidgetItem *item;
+   char cmd[1000];
+   foreach (item, treeItemList) {
+      bsnprintf(cmd, sizeof(cmd), "mark \"%s\"", item->text(1).toUtf8().data());
+      item->setText(0, "*");
+      m_console->write_dir(cmd);
+      if (m_console->read() > 0) {
+         strip_trailing_junk(m_console->msg());
+         statusLine->setText(m_console->msg());
+      }
+      Dmsg1(100, "cmd=%s\n", cmd);
+      m_console->discardToPrompt();
    }
 }
 
+/*
+ * Unmark selected items
+ */
+void restoreDialog::unmarkButtonPushed()
+{
+   QList<QTreeWidgetItem *> treeItemList = fileWidget->selectedItems();
+   QTreeWidgetItem *item;
+   char cmd[1000];
+   foreach (item, treeItemList) {
+      bsnprintf(cmd, sizeof(cmd), "unmark \"%s\"", item->text(1).toUtf8().data());
+      item->setText(0, " ");
+      m_console->write_dir(cmd);
+      if (m_console->read() > 0) {
+         strip_trailing_junk(m_console->msg());
+         statusLine->setText(m_console->msg());
+      }
+      Dmsg1(100, "cmd=%s\n", cmd);
+      m_console->discardToPrompt();
+   }
+}
+
+/*
+ * Change current working directory 
+ */
+bool restoreDialog::cwd(const char *dir)
+{
+   int stat;
+   char cd_cmd[MAXSTRING];
+
+   bsnprintf(cd_cmd, sizeof(cd_cmd), "cd \"%s\"", dir);
+   Dmsg2(100, "dir=%s cmd=%s\n", dir, cd_cmd);
+   m_console->write_dir(cd_cmd);
+   lineEdit->clear();
+   if ((stat = m_console->read()) > 0) {
+      m_cwd = m_console->msg();
+      lineEdit->insert(m_cwd);
+      Dmsg2(100, "cwd=%s msg=%s\n", m_cwd.toUtf8().data(), m_console->msg());
+   } else {
+      Dmsg1(000, "stat=%d\n", stat);
+      QMessageBox::critical(this, "Error", "cd command failed", QMessageBox::Ok);
+   }
+   m_console->discardToPrompt();
+   return true;  /* ***FIXME*** return real status */
+}
+
 /*
  * Return cwd when in tree restore mode 
  */
@@ -187,7 +338,9 @@ char *restoreDialog::get_cwd()
       Dmsg2(100, "cwd=%s msg=%s\n", m_cwd.toUtf8().data(), m_console->msg());
    } else {
       Dmsg1(000, "stat=%d\n", stat);
+      QMessageBox::critical(this, "Error", ".pwd command failed", QMessageBox::Ok);
+      Dmsg1(000, "stat=%d\n", stat);
    }
-   m_console->displayToPrompt(); 
+   m_console->discardToPrompt(); 
    return m_cwd.toUtf8().data();
 }