2 Bacula® - The Network Backup Solution
4 Copyright (C) 2007-2010 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from
7 many others, a complete list can be found in the file AUTHORS.
8 This program is Free Software; you can redistribute it and/or
9 modify it under the terms of version two of the GNU General Public
10 License as published by the Free Software Foundation and included
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 Bacula® is a registered trademark of Kern Sibbald.
24 The licensor of Bacula is the Free Software Foundation Europe
25 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26 Switzerland, email:ftf@fsfeurope.org.
31 * Main Window control for bat (qt-console)
33 * Kern Sibbald, January MMVII
39 #include "joblist/joblist.h"
40 #include "storage/storage.h"
41 #include "fileset/fileset.h"
42 #include "label/label.h"
45 #include "restore/restore.h"
46 #include "medialist/medialist.h"
47 #include "joblist/joblist.h"
48 #include "clients/clients.h"
49 #include "restore/restoretree.h"
50 #include "help/help.h"
51 #include "jobs/jobs.h"
52 #include "medialist/mediaview.h"
54 #include "jobgraphs/jobplot.h"
56 #include "status/dirstat.h"
57 #include "util/fmtwidgetitem.h"
60 * Daemon message callback
62 void message_callback(int /* type */, char *msg)
64 QMessageBox::warning(mainWin, "Bat", msg, QMessageBox::Ok);
67 MainWin::MainWin(QWidget *parent) : QMainWindow(parent)
69 app->setOverrideCursor(QCursor(Qt::WaitCursor));
73 m_treeStackTrap = false;
74 m_dtformat = "yyyy-MM-dd HH:mm:ss";
76 setupUi(this); /* Setup UI defined by main.ui (designer) */
77 register_message_callback(message_callback);
80 treeWidget->setColumnCount(1);
81 treeWidget->setHeaderLabel( tr("Select Page") );
82 treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
83 // tabWidget->setTabsClosable(true); /* wait for QT 4.5 */
86 resetFocus(); /* lineEdit->setFocus() */
89 actionJobPlot->setEnabled(false);
90 actionJobPlot->setVisible(false);
97 foreach(Console *console, m_consoleHash) {
98 console->connect_dir();
100 m_currentConsole = (Console*)getFromHash(m_firstItem);
101 QTimer::singleShot(5000, this, SLOT(popLists()));
103 QString directoryResourceName;
104 m_currentConsole->getDirResName(directoryResourceName);
105 Pmsg1(100, "Setting initial window to %s\n", directoryResourceName.toUtf8().data());
107 app->restoreOverrideCursor();
110 void MainWin::popLists()
112 foreach(Console *console, m_consoleHash) {
113 console->populateLists(true);
116 connectConsoleSignals();
118 app->restoreOverrideCursor();
119 m_currentConsole->setCurrent();
122 void MainWin::createPages()
125 QTreeWidgetItem *item, *topItem;
129 foreach_res(dir, R_DIRECTOR) {
131 /* Create console tree stacked widget item */
132 m_currentConsole = new Console(tabWidget);
133 m_currentConsole->setDirRes(dir);
134 m_currentConsole->readSettings();
136 /* The top tree item representing the director */
137 topItem = new QTreeWidgetItem(treeWidget);
138 topItem->setText(0, dir->name());
139 topItem->setIcon(0, QIcon(":images/server.png"));
140 /* Set background to grey for ease of identification of inactive Director */
141 QBrush greyBrush(Qt::lightGray);
142 topItem->setBackground(0, greyBrush);
143 m_currentConsole->setDirectorTreeItem(topItem);
144 m_consoleHash.insert(topItem, m_currentConsole);
146 /* Create Tree Widget Item */
147 item = new QTreeWidgetItem(topItem);
148 item->setText(0, tr("Console"));
149 if (!m_firstItem){ m_firstItem = item; }
150 item->setIcon(0,QIcon(QString::fromUtf8(":images/utilities-terminal.png")));
152 /* insert the cosole and tree widget item into the hashes */
153 hashInsert(item, m_currentConsole);
155 /* Set Color of treeWidgetItem for the console
156 * It will be set to green in the console class if the connection is made.
158 QBrush redBrush(Qt::red);
159 item->setForeground(0, redBrush);
162 * Create instances in alphabetic order of the rest
163 * of the classes that will by default exist under each Director.
169 createPageJobList("", "", "", "", NULL);
174 new JobPlot(NULL, pass);
184 treeWidget->expandItem(topItem);
185 tabWidget->setCurrentWidget(m_currentConsole);
186 m_currentConsole->undockPage();
187 m_currentConsole->dockPage();
193 * create an instance of the the joblist class on the stack
195 void MainWin::createPageJobList(const QString &media, const QString &client,
196 const QString &job, const QString &fileset, QTreeWidgetItem *parentTreeWidgetItem)
198 QTreeWidgetItem *holdItem;
200 /* save current tree widget item in case query produces no results */
201 holdItem = treeWidget->currentItem();
202 JobList* joblist = new JobList(media, client, job, fileset, parentTreeWidgetItem);
203 /* If this is a query of jobs on a specific media */
204 if ((media != "") || (client != "") || (job != "") || (fileset != "")) {
205 joblist->setCurrent();
206 /* did query produce results, if not close window and set back to hold */
207 if (joblist->m_resultCount == 0) {
208 joblist->closeStackPage();
209 treeWidget->setCurrentItem(holdItem);
215 * Handle up and down arrow keys for the command line
218 void MainWin::keyPressEvent(QKeyEvent *event)
220 if (m_cmd_history.size() == 0) {
224 switch (event->key()) {
226 if (m_cmd_last < 0 || m_cmd_last >= (m_cmd_history.size()-1)) {
233 if (m_cmd_last == 0) {
237 if (m_cmd_last < 0 || m_cmd_last > (m_cmd_history.size()-1)) {
238 m_cmd_last = m_cmd_history.size() - 1;
247 lineEdit->setText(m_cmd_history[m_cmd_last]);
250 void MainWin::connectSignals()
252 /* Connect signals to slots */
253 connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
254 connect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
255 connect(actionBat_Help, SIGNAL(triggered()), this, SLOT(help()));
256 connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
257 connect(treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
258 connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(stackItemChanged(int)));
259 connect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
260 connect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked()));
261 connect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked()));
262 connect(actionEstimate, SIGNAL(triggered()), this, SLOT(estimateButtonClicked()));
263 connect(actionBrowse, SIGNAL(triggered()), this, SLOT(browseButtonClicked()));
264 connect(actionStatusDirPage, SIGNAL(triggered()), this, SLOT(statusPageButtonClicked()));
266 connect(actionJobPlot, SIGNAL(triggered()), this, SLOT(jobPlotButtonClicked()));
268 connect(actionRestore, SIGNAL(triggered()), this, SLOT(restoreButtonClicked()));
269 connect(actionUndock, SIGNAL(triggered()), this, SLOT(undockWindowButton()));
270 connect(actionToggleDock, SIGNAL(triggered()), this, SLOT(toggleDockContextWindow()));
271 connect(actionClosePage, SIGNAL(triggered()), this, SLOT(closePage()));
272 connect(actionPreferences, SIGNAL(triggered()), this, SLOT(setPreferences()));
273 connect(actionRepopLists, SIGNAL(triggered()), this, SLOT(repopLists()));
274 connect(actionReloadRepop, SIGNAL(triggered()), this, SLOT(reloadRepopLists()));
277 void MainWin::disconnectSignals()
279 /* Connect signals to slots */
280 disconnect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
281 disconnect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
282 disconnect(actionBat_Help, SIGNAL(triggered()), this, SLOT(help()));
283 disconnect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
284 disconnect(treeWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
285 disconnect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(stackItemChanged(int)));
286 disconnect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
287 disconnect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked()));
288 disconnect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked()));
289 disconnect(actionEstimate, SIGNAL(triggered()), this, SLOT(estimateButtonClicked()));
290 disconnect(actionBrowse, SIGNAL(triggered()), this, SLOT(browseButtonClicked()));
291 disconnect(actionStatusDirPage, SIGNAL(triggered()), this, SLOT(statusPageButtonClicked()));
293 disconnect(actionJobPlot, SIGNAL(triggered()), this, SLOT(jobPlotButtonClicked()));
295 disconnect(actionRestore, SIGNAL(triggered()), this, SLOT(restoreButtonClicked()));
296 disconnect(actionUndock, SIGNAL(triggered()), this, SLOT(undockWindowButton()));
297 disconnect(actionToggleDock, SIGNAL(triggered()), this, SLOT(toggleDockContextWindow()));
298 disconnect(actionClosePage, SIGNAL(triggered()), this, SLOT(closePage()));
299 disconnect(actionPreferences, SIGNAL(triggered()), this, SLOT(setPreferences()));
300 disconnect(actionRepopLists, SIGNAL(triggered()), this, SLOT(repopLists()));
301 disconnect(actionReloadRepop, SIGNAL(triggered()), this, SLOT(reloadRepopLists()));
307 void MainWin::waitEnter()
310 if (mainWin->m_connDebug)
311 Pmsg0(000, "Should Never Get Here DANGER DANGER, for now I'll return\n");
315 if (mainWin->m_connDebug)
316 Pmsg0(000, "Entering Wait State\n");
317 app->setOverrideCursor(QCursor(Qt::WaitCursor));
319 disconnectConsoleSignals(m_currentConsole);
320 m_waitTreeItem = treeWidget->currentItem();
326 void MainWin::waitExit()
329 if (mainWin->m_connDebug) Pmsg0(000, "Exiting Wait State\n");
330 if (m_waitTreeItem != treeWidget->currentItem())
331 treeWidget->setCurrentItem(m_waitTreeItem);
334 connectConsoleSignals();
336 app->restoreOverrideCursor();
339 void MainWin::connectConsoleSignals()
341 connect(actionConnect, SIGNAL(triggered()), m_currentConsole, SLOT(connect_dir()));
342 connect(actionSelectFont, SIGNAL(triggered()), m_currentConsole, SLOT(set_font()));
343 connect(actionMessages, SIGNAL(triggered()), m_currentConsole, SLOT(messages()));
346 void MainWin::disconnectConsoleSignals(Console *console)
348 disconnect(actionConnect, SIGNAL(triggered()), console, SLOT(connect_dir()));
349 disconnect(actionMessages, SIGNAL(triggered()), console, SLOT(messages()));
350 disconnect(actionSelectFont, SIGNAL(triggered()), console, SLOT(set_font()));
355 * Two functions to respond to menu items to repop lists and execute reload and repopulate
356 * the lists for jobs, clients, filesets .. ..
358 void MainWin::repopLists()
360 m_currentConsole->populateLists(false);
362 void MainWin::reloadRepopLists()
364 QString cmd = "reload";
365 m_currentConsole->consoleCommand(cmd);
366 m_currentConsole->populateLists(false);
370 * Reimplementation of QWidget closeEvent virtual function
372 void MainWin::closeEvent(QCloseEvent *event)
376 /* Remove all groups from settings for OpenOnExit so that we can start some of the status windows */
377 foreach(Console *console, m_consoleHash){
378 QSettings settings(console->m_dir->name(), "bat");
379 settings.beginGroup("OpenOnExit");
383 /* close all non console pages, this will call settings in destructors */
384 while (m_consoleHash.count() < m_pagehash.count()) {
385 foreach(Pages *page, m_pagehash) {
386 if (page != page->console()) {
387 QTreeWidgetItem* pageSelectorTreeWidgetItem = mainWin->getFromHash(page);
388 if (pageSelectorTreeWidgetItem->childCount() == 0) {
389 page->console()->setCurrent();
390 page->closeStackPage();
395 foreach(Console *console, m_consoleHash){
396 console->writeSettings();
397 console->terminate();
398 console->closeStackPage();
403 void MainWin::writeSettings()
405 QSettings settings("bacula.org", "bat");
407 settings.beginGroup("MainWin");
408 settings.setValue("winSize", size());
409 settings.setValue("winPos", pos());
410 settings.setValue("state", saveState());
415 void MainWin::readSettings()
417 QSettings settings("bacula.org", "bat");
419 settings.beginGroup("MainWin");
420 resize(settings.value("winSize", QSize(1041, 801)).toSize());
421 move(settings.value("winPos", QPoint(200, 150)).toPoint());
422 restoreState(settings.value("state").toByteArray());
427 * This subroutine is called with an item in the Page Selection window
430 void MainWin::treeItemClicked(QTreeWidgetItem *item, int /*column*/)
432 /* Is this a page that has been inserted into the hash */
433 if (getFromHash(item)) {
434 Pages* page = getFromHash(item);
435 int stackindex=tabWidget->indexOf(page);
437 if (stackindex >= 0) {
438 tabWidget->setCurrentWidget(page);
440 /* run the virtual function in case this class overrides it */
441 page->PgSeltreeWidgetClicked();
446 * Called with a change of the highlighed tree widget item in the page selector.
448 void MainWin::treeItemChanged(QTreeWidgetItem *currentitem, QTreeWidgetItem *previousitem)
450 if (m_isClosing) return; /* if closing the application, do nothing here */
452 Pages *previousPage, *nextPage;
453 Console *previousConsole = NULL;
454 Console *nextConsole;
456 /* remove all actions before adding actions appropriate for new page */
457 foreach(QAction* pageAction, treeWidget->actions()) {
458 treeWidget->removeAction(pageAction);
461 /* first determine the next item */
463 /* knowing the treeWidgetItem, get the page from the hash */
464 nextPage = getFromHash(currentitem);
465 nextConsole = m_consoleHash.value(currentitem);
466 /* Is this a page that has been inserted into the hash */
468 nextConsole = nextPage->console();
469 /* then is it a treeWidgetItem representing a director */
470 } else if (nextConsole) {
471 /* let the next page BE the console */
472 nextPage = nextConsole;
474 /* Should never get here */
479 /* The Previous item */
481 /* this condition prevents a segfault. The first time there is no previousitem*/
483 if (m_treeStackTrap == false) { /* keep track of previous items for going Back */
484 m_treeWidgetStack.append(previousitem);
486 /* knowing the treeWidgetItem, get the page from the hash */
487 previousPage = getFromHash(previousitem);
488 previousConsole = m_consoleHash.value(previousitem);
490 previousConsole = previousPage->console();
491 } else if (previousConsole) {
492 previousPage = previousConsole;
494 if ((previousPage) || (previousConsole)) {
495 if (nextConsole != previousConsole) {
496 /* remove connections to the current console */
497 disconnectConsoleSignals(previousConsole);
498 QTreeWidgetItem *dirItem = previousConsole->directorTreeItem();
499 QBrush greyBrush(Qt::lightGray);
500 dirItem->setBackground(0, greyBrush);
505 /* process the current (next) item */
507 if ((nextPage) || (nextConsole)) {
508 if (nextConsole != previousConsole) {
509 /* make connections to the current console */
510 m_currentConsole = nextConsole;
511 connectConsoleSignals();
513 /* Set director's tree widget background to magenta for ease of identification */
514 QTreeWidgetItem *dirItem = m_currentConsole->directorTreeItem();
515 QBrush magentaBrush(Qt::magenta);
516 dirItem->setBackground(0, magentaBrush);
518 /* set the value for the currently active console */
519 int stackindex = tabWidget->indexOf(nextPage);
520 if (!nextPage->isDocked()) {
521 nextPage->dockPage();
524 /* Is this page currently on the stack or is it undocked */
525 if (stackindex >= 0) {
526 /* put this page on the top of the stack */
527 tabWidget->setCurrentIndex(stackindex);
529 /* it is undocked, raise it to the front */
532 /* for the page selectors menu action to dock or undock, set the text */
533 nextPage->setContextMenuDockText();
535 treeWidget->addAction(actionToggleDock);
536 /* if this page is closeable, and it has no childern, then add that action */
537 if ((nextPage->isCloseable()) && (currentitem->child(0) == NULL))
538 treeWidget->addAction(actionClosePage);
540 /* Add the actions to the Page Selectors tree widget that are part of the
541 * current items list of desired actions regardless of whether on top of stack*/
542 treeWidget->addActions(nextPage->m_contextActions);
546 void MainWin::labelButtonClicked()
551 void MainWin::runButtonClicked()
556 void MainWin::estimateButtonClicked()
561 void MainWin::browseButtonClicked()
566 void MainWin::statusPageButtonClicked()
568 /* if one exists, then just set it current */
570 foreach(Pages *page, m_pagehash) {
571 if (m_currentConsole == page->console()) {
572 if (page->name() == tr("Director Status")) {
583 void MainWin::restoreButtonClicked()
585 new prerestorePage();
588 void MainWin::jobPlotButtonClicked()
593 new JobPlot(NULL, pass);
598 * The user just finished typing a line in the command line edit box
600 void MainWin::input_line()
603 QString cmdStr = lineEdit->text(); /* Get the text */
604 lineEdit->clear(); /* clear the lineEdit box */
605 if (m_currentConsole->is_connected()) {
606 if (m_currentConsole->findDirComm(conn)) {
607 m_currentConsole->consoleCommand(cmdStr, conn);
609 /* Use consoleCommand to allow typing anything */
610 m_currentConsole->consoleCommand(cmdStr);
613 set_status(tr("Director not connected. Click on connect button."));
615 m_cmd_history.append(cmdStr);
617 if (treeWidget->currentItem() != getFromHash(m_currentConsole))
618 m_currentConsole->setCurrent();
622 void MainWin::about()
624 QMessageBox::about(this, tr("About bat"),
625 tr("<br><h2>bat %1 (%2), by Dirk H Bartley and Kern Sibbald</h2>"
626 "<p>Copyright © 2007-%3 Free Software Foundation Europe e.V."
627 "<p>The <b>bat</b> is an administrative console"
628 " interface to the Director.").arg(VERSION).arg(BDATE).arg(BYEAR));
633 Help::displayFile("index.html");
636 void MainWin::set_statusf(const char *fmt, ...)
641 va_start(arg_ptr, fmt);
642 len = bvsnprintf(buf, sizeof(buf), fmt, arg_ptr);
647 void MainWin::set_status_ready()
649 set_status(tr(" Ready"));
652 void MainWin::set_status(const QString &str)
654 statusBar()->showMessage(str);
657 void MainWin::set_status(const char *buf)
659 statusBar()->showMessage(buf);
663 * Function to respond to the button bar button to undock
665 void MainWin::undockWindowButton()
667 Pages* page = (Pages*)tabWidget->currentWidget();
668 page->togglePageDocking();
672 * Function to respond to action on page selector context menu to toggle the
673 * dock status of the window associated with the page selectors current
676 void MainWin::toggleDockContextWindow()
678 QTreeWidgetItem *currentitem = treeWidget->currentItem();
680 /* Is this a page that has been inserted into the hash */
681 if (getFromHash(currentitem)) {
682 Pages* page = getFromHash(currentitem);
683 page->togglePageDocking();
688 * This function is called when the stack item is changed. Call
689 * the virtual function here. Avoids a window being undocked leaving
690 * a window at the top of the stack unpopulated.
692 void MainWin::stackItemChanged(int)
694 if (m_isClosing) return; /* if closing the application, do nothing here */
695 Pages* page = (Pages*)tabWidget->currentWidget();
696 /* run the virtual function in case this class overrides it */
697 page->currentStackItem();
699 disconnect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
700 disconnect(treeWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
701 treeWidget->setCurrentItem(getFromHash(page));
702 connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
703 connect(treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
708 * Function to simplify insertion of QTreeWidgetItem <-> Page association
709 * into a double direction hash.
711 void MainWin::hashInsert(QTreeWidgetItem *item, Pages *page)
713 m_pagehash.insert(item, page);
714 m_widgethash.insert(page, item);
718 * Function to simplify removal of QTreeWidgetItem <-> Page association
719 * into a double direction hash.
721 void MainWin::hashRemove(QTreeWidgetItem *item, Pages *page)
723 /* I had all sorts of return status checking code here. Do we have a log
724 * level capability in bat. I would have left it in but it used printf's
725 * and it should really be some kind of log level facility ???
726 * ******FIXME********/
727 m_pagehash.remove(item);
728 m_widgethash.remove(page);
732 * Function to retrieve a Page* when the item in the page selector's tree is
735 Pages* MainWin::getFromHash(QTreeWidgetItem *item)
737 return m_pagehash.value(item);
741 * Function to retrieve the page selectors tree widget item when the page is
744 QTreeWidgetItem* MainWin::getFromHash(Pages *page)
746 return m_widgethash.value(page);
750 * Function to respond to action on page selector context menu to close the
753 void MainWin::closePage()
755 QTreeWidgetItem *currentitem = treeWidget->currentItem();
757 /* Is this a page that has been inserted into the hash */
758 if (getFromHash(currentitem)) {
759 Pages* page = getFromHash(currentitem);
760 if (page->isCloseable()) {
761 page->closeStackPage();
766 /* Quick function to return the current console */
767 Console *MainWin::currentConsole()
769 return m_currentConsole;
772 /* Quick function to return the tree item for the director */
773 QTreeWidgetItem *MainWin::currentTopItem()
775 return m_currentConsole->directorTreeItem();
778 /* Preferences menu item clicked */
779 void MainWin::setPreferences()
782 prefs.commDebug->setCheckState(m_commDebug ? Qt::Checked : Qt::Unchecked);
783 prefs.connDebug->setCheckState(m_connDebug ? Qt::Checked : Qt::Unchecked);
784 prefs.displayAll->setCheckState(m_displayAll ? Qt::Checked : Qt::Unchecked);
785 prefs.sqlDebug->setCheckState(m_sqlDebug ? Qt::Checked : Qt::Unchecked);
786 prefs.commandDebug->setCheckState(m_commandDebug ? Qt::Checked : Qt::Unchecked);
787 prefs.miscDebug->setCheckState(m_miscDebug ? Qt::Checked : Qt::Unchecked);
788 prefs.recordLimit->setCheckState(m_recordLimitCheck ? Qt::Checked : Qt::Unchecked);
789 prefs.recordSpinBox->setValue(m_recordLimitVal);
790 prefs.daysLimit->setCheckState(m_daysLimitCheck ? Qt::Checked : Qt::Unchecked);
791 prefs.daysSpinBox->setValue(m_daysLimitVal);
792 prefs.checkMessages->setCheckState(m_checkMessages ? Qt::Checked : Qt::Unchecked);
793 prefs.checkMessagesSpin->setValue(m_checkMessagesInterval);
794 prefs.executeLongCheckBox->setCheckState(m_longList ? Qt::Checked : Qt::Unchecked);
795 prefs.rtPopDirCheckBox->setCheckState(m_rtPopDirDebug ? Qt::Checked : Qt::Unchecked);
796 prefs.rtDirCurICCheckBox->setCheckState(m_rtDirCurICDebug ? Qt::Checked : Qt::Unchecked);
797 prefs.rtDirICCheckBox->setCheckState(m_rtDirICDebug ? Qt::Checked : Qt::Unchecked);
798 prefs.rtFileTabICCheckBox->setCheckState(m_rtFileTabICDebug ? Qt::Checked : Qt::Unchecked);
799 prefs.rtVerTabICCheckBox->setCheckState(m_rtVerTabICDebug ? Qt::Checked : Qt::Unchecked);
800 prefs.rtUpdateFTCheckBox->setCheckState(m_rtUpdateFTDebug ? Qt::Checked : Qt::Unchecked);
801 prefs.rtUpdateVTCheckBox->setCheckState(m_rtUpdateVTDebug ? Qt::Checked : Qt::Unchecked);
802 prefs.rtChecksCheckBox->setCheckState(m_rtChecksDebug ? Qt::Checked : Qt::Unchecked);
803 prefs.rtIconStateCheckBox->setCheckState(m_rtIconStateDebug ? Qt::Checked : Qt::Unchecked);
804 prefs.rtRestore1CheckBox->setCheckState(m_rtRestore1Debug ? Qt::Checked : Qt::Unchecked);
805 prefs.rtRestore2CheckBox->setCheckState(m_rtRestore2Debug ? Qt::Checked : Qt::Unchecked);
806 prefs.rtRestore3CheckBox->setCheckState(m_rtRestore3Debug ? Qt::Checked : Qt::Unchecked);
807 switch (ItemFormatterBase::getBytesConversion()) {
808 case ItemFormatterBase::BYTES_CONVERSION_NONE:
809 prefs.radioConvertOff->setChecked(Qt::Checked);
811 case ItemFormatterBase::BYTES_CONVERSION_IEC:
812 prefs.radioConvertIEC->setChecked(Qt::Checked);
815 prefs.radioConvertStandard->setChecked(Qt::Checked);
818 prefs.openPlotCheckBox->setCheckState(m_openPlot ? Qt::Checked : Qt::Unchecked);
820 prefs.openPlotCheckBox->setVisible(false);
822 prefs.openBrowserCheckBox->setCheckState(m_openBrowser ? Qt::Checked : Qt::Unchecked);
823 prefs.openDirStatCheckBox->setCheckState(m_openDirStat ? Qt::Checked : Qt::Unchecked);
827 /* Preferences dialog */
828 prefsDialog::prefsDialog()
833 void prefsDialog::accept()
836 mainWin->m_commDebug = this->commDebug->checkState() == Qt::Checked;
837 mainWin->m_connDebug = this->connDebug->checkState() == Qt::Checked;
838 mainWin->m_displayAll = this->displayAll->checkState() == Qt::Checked;
839 mainWin->m_sqlDebug = this->sqlDebug->checkState() == Qt::Checked;
840 mainWin->m_commandDebug = this->commandDebug->checkState() == Qt::Checked;
841 mainWin->m_miscDebug = this->miscDebug->checkState() == Qt::Checked;
842 mainWin->m_recordLimitCheck = this->recordLimit->checkState() == Qt::Checked;
843 mainWin->m_recordLimitVal = this->recordSpinBox->value();
844 mainWin->m_daysLimitCheck = this->daysLimit->checkState() == Qt::Checked;
845 mainWin->m_daysLimitVal = this->daysSpinBox->value();
846 mainWin->m_checkMessages = this->checkMessages->checkState() == Qt::Checked;
847 mainWin->m_checkMessagesInterval = this->checkMessagesSpin->value();
848 mainWin->m_longList = this->executeLongCheckBox->checkState() == Qt::Checked;
850 mainWin->m_rtPopDirDebug = this->rtPopDirCheckBox->checkState() == Qt::Checked;
851 mainWin->m_rtDirCurICDebug = this->rtDirCurICCheckBox->checkState() == Qt::Checked;
852 mainWin->m_rtDirICDebug = this->rtDirICCheckBox->checkState() == Qt::Checked;
853 mainWin->m_rtFileTabICDebug = this->rtFileTabICCheckBox->checkState() == Qt::Checked;
854 mainWin->m_rtVerTabICDebug = this->rtVerTabICCheckBox->checkState() == Qt::Checked;
855 mainWin->m_rtUpdateFTDebug = this->rtUpdateFTCheckBox->checkState() == Qt::Checked;
856 mainWin->m_rtUpdateVTDebug = this->rtUpdateVTCheckBox->checkState() == Qt::Checked;
857 mainWin->m_rtChecksDebug = this->rtChecksCheckBox->checkState() == Qt::Checked;
858 mainWin->m_rtIconStateDebug = this->rtIconStateCheckBox->checkState() == Qt::Checked;
859 mainWin->m_rtRestore1Debug = this->rtRestore1CheckBox->checkState() == Qt::Checked;
860 mainWin->m_rtRestore2Debug = this->rtRestore2CheckBox->checkState() == Qt::Checked;
861 mainWin->m_rtRestore3Debug = this->rtRestore3CheckBox->checkState() == Qt::Checked;
862 if (this->radioConvertOff->isChecked()) {
863 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_NONE);
864 } else if (this->radioConvertIEC->isChecked()){
865 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_IEC);
867 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_SI);
869 mainWin->m_openPlot = this->openPlotCheckBox->checkState() == Qt::Checked;
870 mainWin->m_openBrowser = this->openBrowserCheckBox->checkState() == Qt::Checked;
871 mainWin->m_openDirStat = this->openDirStatCheckBox->checkState() == Qt::Checked;
873 QSettings settings("www.bacula.org", "bat");
874 settings.beginGroup("Debug");
875 settings.setValue("commDebug", mainWin->m_commDebug);
876 settings.setValue("connDebug", mainWin->m_connDebug);
877 settings.setValue("displayAll", mainWin->m_displayAll);
878 settings.setValue("sqlDebug", mainWin->m_sqlDebug);
879 settings.setValue("commandDebug", mainWin->m_commandDebug);
880 settings.setValue("miscDebug", mainWin->m_miscDebug);
882 settings.beginGroup("JobList");
883 settings.setValue("recordLimitCheck", mainWin->m_recordLimitCheck);
884 settings.setValue("recordLimitVal", mainWin->m_recordLimitVal);
885 settings.setValue("daysLimitCheck", mainWin->m_daysLimitCheck);
886 settings.setValue("daysLimitVal", mainWin->m_daysLimitVal);
888 settings.beginGroup("Timers");
889 settings.setValue("checkMessages", mainWin->m_checkMessages);
890 settings.setValue("checkMessagesInterval", mainWin->m_checkMessagesInterval);
892 settings.beginGroup("Misc");
893 settings.setValue("longList", mainWin->m_longList);
894 settings.setValue("byteConvert", ItemFormatterBase::getBytesConversion());
895 settings.setValue("openplot", mainWin->m_openPlot);
896 settings.setValue("openbrowser", mainWin->m_openBrowser);
897 settings.setValue("opendirstat", mainWin->m_openDirStat);
899 settings.beginGroup("RestoreTree");
900 settings.setValue("rtPopDirDebug", mainWin->m_rtPopDirDebug);
901 settings.setValue("rtDirCurICDebug", mainWin->m_rtDirCurICDebug);
902 settings.setValue("rtDirCurICRetDebug", mainWin->m_rtDirICDebug);
903 settings.setValue("rtFileTabICDebug", mainWin->m_rtFileTabICDebug);
904 settings.setValue("rtVerTabICDebug", mainWin->m_rtVerTabICDebug);
905 settings.setValue("rtUpdateFTDebug", mainWin->m_rtUpdateFTDebug);
906 settings.setValue("rtUpdateVTDebug", mainWin->m_rtUpdateVTDebug);
907 settings.setValue("rtChecksDebug", mainWin->m_rtChecksDebug);
908 settings.setValue("rtIconStateDebug", mainWin->m_rtIconStateDebug);
909 settings.setValue("rtRestore1Debug", mainWin->m_rtRestore1Debug);
910 settings.setValue("rtRestore2Debug", mainWin->m_rtRestore2Debug);
911 settings.setValue("rtRestore3Debug", mainWin->m_rtRestore3Debug);
915 void prefsDialog::reject()
918 mainWin->set_status(tr("Canceled"));
921 /* read preferences for the prefences dialog box */
922 void MainWin::readPreferences()
924 QSettings settings("www.bacula.org", "bat");
925 settings.beginGroup("Debug");
926 m_commDebug = settings.value("commDebug", false).toBool();
927 m_connDebug = settings.value("connDebug", false).toBool();
928 m_displayAll = settings.value("displayAll", false).toBool();
929 m_sqlDebug = settings.value("sqlDebug", false).toBool();
930 m_commandDebug = settings.value("commandDebug", false).toBool();
931 m_miscDebug = settings.value("miscDebug", false).toBool();
933 settings.beginGroup("JobList");
934 m_recordLimitCheck = settings.value("recordLimitCheck", true).toBool();
935 m_recordLimitVal = settings.value("recordLimitVal", 150).toInt();
936 m_daysLimitCheck = settings.value("daysLimitCheck", false).toBool();
937 m_daysLimitVal = settings.value("daysLimitVal", 28).toInt();
939 settings.beginGroup("Timers");
940 m_checkMessages = settings.value("checkMessages", false).toBool();
941 m_checkMessagesInterval = settings.value("checkMessagesInterval", 28).toInt();
943 settings.beginGroup("Misc");
944 m_longList = settings.value("longList", false).toBool();
945 ItemFormatterBase::setBytesConversion(
946 (ItemFormatterBase::BYTES_CONVERSION) settings.value("byteConvert",
947 ItemFormatterBase::BYTES_CONVERSION_IEC).toInt());
948 m_openPlot = settings.value("openplot", false).toBool();
949 m_openBrowser = settings.value("openbrowser", false).toBool();
950 m_openDirStat = settings.value("opendirstat", false).toBool();
952 settings.beginGroup("RestoreTree");
953 m_rtPopDirDebug = settings.value("rtPopDirDebug", false).toBool();
954 m_rtDirCurICDebug = settings.value("rtDirCurICDebug", false).toBool();
955 m_rtDirICDebug = settings.value("rtDirCurICRetDebug", false).toBool();
956 m_rtFileTabICDebug = settings.value("rtFileTabICDebug", false).toBool();
957 m_rtVerTabICDebug = settings.value("rtVerTabICDebug", false).toBool();
958 m_rtUpdateFTDebug = settings.value("rtUpdateFTDebug", false).toBool();
959 m_rtUpdateVTDebug = settings.value("rtUpdateVTDebug", false).toBool();
960 m_rtChecksDebug = settings.value("rtChecksDebug", false).toBool();
961 m_rtIconStateDebug = settings.value("rtIconStateDebug", false).toBool();
962 m_rtRestore1Debug = settings.value("rtRestore1Debug", false).toBool();
963 m_rtRestore2Debug = settings.value("rtRestore2Debug", false).toBool();
964 m_rtRestore3Debug = settings.value("rtRestore3Debug", false).toBool();
968 void MainWin::setMessageIcon()
970 if (m_currentConsole->is_messagesPending())
971 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-pending.png")));
973 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-new.png")));
976 void MainWin::goToPreviousPage()
978 m_treeStackTrap = true;
981 /* If stack list is emtpty, then done */
982 if (m_treeWidgetStack.isEmpty()) {
985 QTreeWidgetItem* testItem = m_treeWidgetStack.takeLast();
986 QTreeWidgetItemIterator it(treeWidget);
987 /* lets avoid a segfault by setting an item current that no longer exists */
989 if (*it == testItem) {
990 if (testItem != treeWidget->currentItem()) {
991 treeWidget->setCurrentItem(testItem);
1000 m_treeStackTrap = false;