2 Bacula® - The Network Backup Solution
4 Copyright (C) 2007-2009 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.
32 * Main Window control for bat (qt-console)
34 * Kern Sibbald, January MMVII
40 #include "joblist/joblist.h"
41 #include "storage/storage.h"
42 #include "fileset/fileset.h"
43 #include "label/label.h"
46 #include "restore/restore.h"
47 #include "medialist/medialist.h"
48 #include "joblist/joblist.h"
49 #include "clients/clients.h"
50 #include "restore/restoretree.h"
51 #include "help/help.h"
52 #include "jobs/jobs.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_dtformat = "yyyy-MM-dd HH:mm:ss";
75 setupUi(this); /* Setup UI defined by main.ui (designer) */
76 register_message_callback(message_callback);
79 treeWidget->setColumnCount(1);
80 treeWidget->setHeaderLabel( tr("Select Page") );
81 treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
85 resetFocus(); /* lineEdit->setFocus() */
88 actionJobPlot->setEnabled(false);
89 actionJobPlot->setVisible(false);
96 foreach(Console *console, m_consoleHash)
97 console->connect_dir();
98 m_currentConsole = (Console*)getFromHash(m_firstItem);
99 QTimer::singleShot(750, this, SLOT(popLists()));
101 QString directoryResourceName;
102 m_currentConsole->getDirResName(directoryResourceName);
103 Pmsg1(100, "Setting initial window to %s\n", directoryResourceName.toUtf8().data());
107 void MainWin::popLists()
109 foreach(Console *console, m_consoleHash)
110 console->populateLists(true);
111 app->restoreOverrideCursor();
112 m_currentConsole->setCurrent();
114 connectConsoleSignals();
118 void MainWin::createPages()
121 QTreeWidgetItem *item, *topItem;
125 foreach_res(dir, R_DIRECTOR) {
127 /* Create console tree stacked widget item */
128 m_currentConsole = new Console(stackedWidget);
129 m_currentConsole->setDirRes(dir);
130 m_currentConsole->readSettings();
132 /* The top tree item representing the director */
133 topItem = new QTreeWidgetItem(treeWidget);
134 topItem->setText(0, dir->name());
135 topItem->setIcon(0, QIcon(":images/server.png"));
136 /* Set background to grey for ease of identification of inactive Director */
137 QBrush greyBrush(Qt::lightGray);
138 topItem->setBackground(0, greyBrush);
139 m_currentConsole->setDirectorTreeItem(topItem);
140 m_consoleHash.insert(topItem, m_currentConsole);
142 /* Create Tree Widget Item */
143 item = new QTreeWidgetItem(topItem);
144 item->setText(0, tr("Console"));
145 if (!m_firstItem){ m_firstItem = item; }
146 item->setIcon(0,QIcon(QString::fromUtf8(":images/utilities-terminal.png")));
148 /* insert the cosole and tree widget item into the hashes */
149 hashInsert(item, m_currentConsole);
151 /* Set Color of treeWidgetItem for the console
152 * It will be set to green in the console class if the connection is made.
154 QBrush redBrush(Qt::red);
155 item->setForeground(0, redBrush);
156 m_currentConsole->dockPage();
159 * Create instances in alphabetic order of the rest
160 * of the classes that will by default exist under each Director.
166 createPageJobList("", "", "", "", NULL);
171 new JobPlot(NULL, pass);
180 treeWidget->expandItem(topItem);
181 stackedWidget->setCurrentWidget(m_currentConsole);
187 * create an instance of the the joblist class on the stack
189 void MainWin::createPageJobList(const QString &media, const QString &client,
190 const QString &job, const QString &fileset, QTreeWidgetItem *parentTreeWidgetItem)
192 QTreeWidgetItem *holdItem;
194 /* save current tree widget item in case query produces no results */
195 holdItem = treeWidget->currentItem();
196 JobList* joblist = new JobList(media, client, job, fileset, parentTreeWidgetItem);
197 /* If this is a query of jobs on a specific media */
198 if ((media != "") || (client != "") || (job != "") || (fileset != "")) {
199 joblist->setCurrent();
200 /* did query produce results, if not close window and set back to hold */
201 if (joblist->m_resultCount == 0) {
202 joblist->closeStackPage();
203 treeWidget->setCurrentItem(holdItem);
209 * Handle up and down arrow keys for the command line
212 void MainWin::keyPressEvent(QKeyEvent *event)
214 if (m_cmd_history.size() == 0) {
218 switch (event->key()) {
220 if (m_cmd_last < 0 || m_cmd_last >= (m_cmd_history.size()-1)) {
227 if (m_cmd_last == 0) {
231 if (m_cmd_last < 0 || m_cmd_last > (m_cmd_history.size()-1)) {
232 m_cmd_last = m_cmd_history.size() - 1;
241 lineEdit->setText(m_cmd_history[m_cmd_last]);
244 void MainWin::connectSignals()
246 /* Connect signals to slots */
247 connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
248 connect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
249 connect(actionBat_Help, SIGNAL(triggered()), this, SLOT(help()));
250 connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
251 connect(treeWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
252 connect(stackedWidget, SIGNAL(currentChanged(int)), this, SLOT(stackItemChanged(int)));
253 connect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
254 connect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked()));
255 connect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked()));
256 connect(actionEstimate, SIGNAL(triggered()), this, SLOT(estimateButtonClicked()));
257 connect(actionBrowse, SIGNAL(triggered()), this, SLOT(browseButtonClicked()));
258 connect(actionStatusDirPage, SIGNAL(triggered()), this, SLOT(statusPageButtonClicked()));
260 connect(actionJobPlot, SIGNAL(triggered()), this, SLOT(jobPlotButtonClicked()));
262 connect(actionRestore, SIGNAL(triggered()), this, SLOT(restoreButtonClicked()));
263 connect(actionUndock, SIGNAL(triggered()), this, SLOT(undockWindowButton()));
264 connect(actionToggleDock, SIGNAL(triggered()), this, SLOT(toggleDockContextWindow()));
265 connect(actionClosePage, SIGNAL(triggered()), this, SLOT(closePage()));
266 connect(actionPreferences, SIGNAL(triggered()), this, SLOT(setPreferences()));
267 connect(actionRepopLists, SIGNAL(triggered()), this, SLOT(repopLists()));
270 void MainWin::disconnectSignals()
272 /* Connect signals to slots */
273 disconnect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
274 disconnect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
275 disconnect(actionBat_Help, SIGNAL(triggered()), this, SLOT(help()));
276 disconnect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
277 disconnect(treeWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
278 disconnect(stackedWidget, SIGNAL(currentChanged(int)), this, SLOT(stackItemChanged(int)));
279 disconnect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
280 disconnect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked()));
281 disconnect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked()));
282 disconnect(actionEstimate, SIGNAL(triggered()), this, SLOT(estimateButtonClicked()));
283 disconnect(actionBrowse, SIGNAL(triggered()), this, SLOT(browseButtonClicked()));
284 disconnect(actionStatusDirPage, SIGNAL(triggered()), this, SLOT(statusPageButtonClicked()));
286 disconnect(actionJobPlot, SIGNAL(triggered()), this, SLOT(jobPlotButtonClicked()));
288 disconnect(actionRestore, SIGNAL(triggered()), this, SLOT(restoreButtonClicked()));
289 disconnect(actionUndock, SIGNAL(triggered()), this, SLOT(undockWindowButton()));
290 disconnect(actionToggleDock, SIGNAL(triggered()), this, SLOT(toggleDockContextWindow()));
291 disconnect(actionClosePage, SIGNAL(triggered()), this, SLOT(closePage()));
292 disconnect(actionPreferences, SIGNAL(triggered()), this, SLOT(setPreferences()));
293 disconnect(actionRepopLists, SIGNAL(triggered()), this, SLOT(repopLists()));
299 void MainWin::waitEnter()
302 if (mainWin->m_connDebug)
303 Pmsg0(000, "Entering Wait State\n");
304 app->setOverrideCursor(QCursor(Qt::WaitCursor));
306 disconnectConsoleSignals(m_currentConsole);
307 m_waitTreeItem = treeWidget->currentItem();
313 void MainWin::waitExit()
316 if (mainWin->m_connDebug)
317 Pmsg0(000, "Exiting Wait State\n");
318 app->restoreOverrideCursor();
319 if (m_waitTreeItem != treeWidget->currentItem())
320 treeWidget->setCurrentItem(m_waitTreeItem);
323 connectConsoleSignals();
327 void MainWin::connectConsoleSignals()
329 connect(actionConnect, SIGNAL(triggered()), m_currentConsole, SLOT(connect_dir()));
330 connect(actionSelectFont, SIGNAL(triggered()), m_currentConsole, SLOT(set_font()));
331 connect(actionStatusDir, SIGNAL(triggered()), m_currentConsole, SLOT(status_dir()));
332 connect(actionMessages, SIGNAL(triggered()), m_currentConsole, SLOT(messages()));
335 void MainWin::disconnectConsoleSignals(Console *console)
337 disconnect(actionConnect, SIGNAL(triggered()), console, SLOT(connect_dir()));
338 disconnect(actionStatusDir, SIGNAL(triggered()), console, SLOT(status_dir()));
339 disconnect(actionMessages, SIGNAL(triggered()), console, SLOT(messages()));
340 disconnect(actionSelectFont, SIGNAL(triggered()), console, SLOT(set_font()));
343 void MainWin::repopLists()
345 m_currentConsole->populateLists(false);
349 * Reimplementation of QWidget closeEvent virtual function
351 void MainWin::closeEvent(QCloseEvent *event)
355 /* close all non console pages, this will call settings in destructors */
356 while (m_consoleHash.count() < m_pagehash.count()) {
357 foreach(Pages *page, m_pagehash) {
358 if (page != page->console()) {
359 QTreeWidgetItem* pageSelectorTreeWidgetItem = mainWin->getFromHash(page);
360 if (pageSelectorTreeWidgetItem->childCount() == 0) {
361 page->console()->setCurrent();
362 page->closeStackPage();
367 foreach(Console *console, m_consoleHash){
368 console->writeSettings();
369 console->terminate();
370 console->closeStackPage();
375 void MainWin::writeSettings()
377 QSettings settings("bacula.org", "bat");
379 settings.beginGroup("MainWin");
380 settings.setValue("winSize", size());
381 settings.setValue("winPos", pos());
382 settings.setValue("state", saveState());
386 void MainWin::readSettings()
388 QSettings settings("bacula.org", "bat");
390 settings.beginGroup("MainWin");
391 resize(settings.value("winSize", QSize(1041, 801)).toSize());
392 move(settings.value("winPos", QPoint(200, 150)).toPoint());
393 restoreState(settings.value("state").toByteArray());
398 * This subroutine is called with an item in the Page Selection window
401 void MainWin::treeItemClicked(QTreeWidgetItem *item, int /*column*/)
403 /* Is this a page that has been inserted into the hash */
404 if (getFromHash(item)) {
405 Pages* page = getFromHash(item);
406 int stackindex=stackedWidget->indexOf(page);
408 if (stackindex >= 0) {
409 stackedWidget->setCurrentWidget(page);
411 /* run the virtual function in case this class overrides it */
412 page->PgSeltreeWidgetClicked();
417 * Called with a change of the highlighed tree widget item in the page selector.
419 void MainWin::treeItemChanged(QTreeWidgetItem *currentitem, QTreeWidgetItem *previousitem)
421 if (m_isClosing) return; /* if closing the application, do nothing here */
423 Pages *previousPage, *nextPage;
424 Console *previousConsole = NULL;
425 Console *nextConsole;
427 /* remove all actions before adding actions appropriate for new page */
428 foreach(QAction* pageAction, treeWidget->actions()) {
429 treeWidget->removeAction(pageAction);
432 /* first determine the next item */
434 /* knowing the treeWidgetItem, get the page from the hash */
435 nextPage = getFromHash(currentitem);
436 nextConsole = m_consoleHash.value(currentitem);
437 /* Is this a page that has been inserted into the hash */
439 nextConsole = nextPage->console();
440 /* then is it a treeWidgetItem representing a director */
441 } else if (nextConsole) {
442 /* let the next page BE the console */
443 nextPage = nextConsole;
445 /* Should never get here */
450 /* The Previous item */
452 /* this condition prevents a segfault. The first time there is no previousitem*/
454 /* knowing the treeWidgetItem, get the page from the hash */
455 previousPage = getFromHash(previousitem);
456 previousConsole = m_consoleHash.value(previousitem);
458 previousConsole = previousPage->console();
459 } else if (previousConsole) {
460 previousPage = previousConsole;
462 if ((previousPage) || (previousConsole)) {
463 if (nextConsole != previousConsole) {
464 /* remove connections to the current console */
465 disconnectConsoleSignals(previousConsole);
466 QTreeWidgetItem *dirItem = previousConsole->directorTreeItem();
467 QBrush greyBrush(Qt::lightGray);
468 dirItem->setBackground(0, greyBrush);
473 /* process the current (next) item */
475 if ((nextPage) || (nextConsole)) {
476 if (nextConsole != previousConsole) {
477 /* make connections to the current console */
478 m_currentConsole = nextConsole;
479 connectConsoleSignals();
481 /* Set director's tree widget background to magenta for ease of identification */
482 QTreeWidgetItem *dirItem = m_currentConsole->directorTreeItem();
483 QBrush magentaBrush(Qt::magenta);
484 dirItem->setBackground(0, magentaBrush);
486 /* set the value for the currently active console */
487 int stackindex = stackedWidget->indexOf(nextPage);
489 /* Is this page currently on the stack or is it undocked */
490 if (stackindex >= 0) {
491 /* put this page on the top of the stack */
492 stackedWidget->setCurrentIndex(stackindex);
494 /* it is undocked, raise it to the front */
497 /* for the page selectors menu action to dock or undock, set the text */
498 nextPage->setContextMenuDockText();
500 treeWidget->addAction(actionToggleDock);
501 /* if this page is closeable, and it has no childern, then add that action */
502 if ((nextPage->isCloseable()) && (currentitem->child(0) == NULL))
503 treeWidget->addAction(actionClosePage);
505 /* Add the actions to the Page Selectors tree widget that are part of the
506 * current items list of desired actions regardless of whether on top of stack*/
507 treeWidget->addActions(nextPage->m_contextActions);
511 void MainWin::labelButtonClicked()
516 void MainWin::runButtonClicked()
521 void MainWin::estimateButtonClicked()
526 void MainWin::browseButtonClicked()
531 void MainWin::statusPageButtonClicked()
533 /* if one exists, then just set it current */
535 foreach(Pages *page, m_pagehash) {
536 if (m_currentConsole == page->console()) {
537 if (page->name() == tr("Director Status")) {
547 void MainWin::restoreButtonClicked()
549 new prerestorePage();
552 void MainWin::jobPlotButtonClicked()
557 new JobPlot(NULL, pass);
562 * The user just finished typing a line in the command line edit box
564 void MainWin::input_line()
566 QString cmdStr = lineEdit->text(); /* Get the text */
567 lineEdit->clear(); /* clear the lineEdit box */
568 if (m_currentConsole->is_connected()) {
569 /* Use consoleInput to allow typing anything */
570 m_currentConsole->consoleInput(cmdStr);
572 set_status(tr("Director not connected. Click on connect button."));
574 m_cmd_history.append(cmdStr);
576 if (treeWidget->currentItem() != getFromHash(m_currentConsole))
577 m_currentConsole->setCurrent();
581 void MainWin::about()
583 QMessageBox::about(this, tr("About bat"),
584 tr("<br><h2>bat %1 (%2), by Dirk H Bartley and Kern Sibbald</h2>"
585 "<p>Copyright © 2007-%3 Free Software Foundation Europe e.V."
586 "<p>The <b>bat</b> is an administrative console"
587 " interface to the Director.").arg(VERSION).arg(BDATE).arg(BYEAR));
592 Help::displayFile("index.html");
595 void MainWin::set_statusf(const char *fmt, ...)
600 va_start(arg_ptr, fmt);
601 len = bvsnprintf(buf, sizeof(buf), fmt, arg_ptr);
606 void MainWin::set_status_ready()
608 set_status(tr(" Ready"));
611 void MainWin::set_status(const QString &str)
613 statusBar()->showMessage(str);
616 void MainWin::set_status(const char *buf)
618 statusBar()->showMessage(buf);
622 * Function to respond to the button bar button to undock
624 void MainWin::undockWindowButton()
626 Pages* page = (Pages*)stackedWidget->currentWidget();
627 page->togglePageDocking();
631 * Function to respond to action on page selector context menu to toggle the
632 * dock status of the window associated with the page selectors current
635 void MainWin::toggleDockContextWindow()
637 QTreeWidgetItem *currentitem = treeWidget->currentItem();
639 /* Is this a page that has been inserted into the hash */
640 if (getFromHash(currentitem)) {
641 Pages* page = getFromHash(currentitem);
642 page->togglePageDocking();
647 * This function is called when the stack item is changed. Call
648 * the virtual function here. Avoids a window being undocked leaving
649 * a window at the top of the stack unpopulated.
651 void MainWin::stackItemChanged(int)
653 if (m_isClosing) return; /* if closing the application, do nothing here */
654 Pages* page = (Pages*)stackedWidget->currentWidget();
655 /* run the virtual function in case this class overrides it */
656 page->currentStackItem();
660 * Function to simplify insertion of QTreeWidgetItem <-> Page association
661 * into a double direction hash.
663 void MainWin::hashInsert(QTreeWidgetItem *item, Pages *page)
665 m_pagehash.insert(item, page);
666 m_widgethash.insert(page, item);
670 * Function to simplify removal of QTreeWidgetItem <-> Page association
671 * into a double direction hash.
673 void MainWin::hashRemove(QTreeWidgetItem *item, Pages *page)
675 /* I had all sorts of return status checking code here. Do we have a log
676 * level capability in bat. I would have left it in but it used printf's
677 * and it should really be some kind of log level facility ???
678 * ******FIXME********/
679 m_pagehash.remove(item);
680 m_widgethash.remove(page);
684 * Function to retrieve a Page* when the item in the page selector's tree is
687 Pages* MainWin::getFromHash(QTreeWidgetItem *item)
689 return m_pagehash.value(item);
693 * Function to retrieve the page selectors tree widget item when the page is
696 QTreeWidgetItem* MainWin::getFromHash(Pages *page)
698 return m_widgethash.value(page);
702 * Function to respond to action on page selector context menu to close the
705 void MainWin::closePage()
707 QTreeWidgetItem *currentitem = treeWidget->currentItem();
709 /* Is this a page that has been inserted into the hash */
710 if (getFromHash(currentitem)) {
711 Pages* page = getFromHash(currentitem);
712 if (page->isCloseable()) {
713 page->closeStackPage();
718 /* Quick function to return the current console */
719 Console *MainWin::currentConsole()
721 return m_currentConsole;
724 /* Quick function to return the tree item for the director */
725 QTreeWidgetItem *MainWin::currentTopItem()
727 return m_currentConsole->directorTreeItem();
730 /* Preferences menu item clicked */
731 void MainWin::setPreferences()
734 prefs.commDebug->setCheckState(m_commDebug ? Qt::Checked : Qt::Unchecked);
735 prefs.connDebug->setCheckState(m_connDebug ? Qt::Checked : Qt::Unchecked);
736 prefs.displayAll->setCheckState(m_displayAll ? Qt::Checked : Qt::Unchecked);
737 prefs.sqlDebug->setCheckState(m_sqlDebug ? Qt::Checked : Qt::Unchecked);
738 prefs.commandDebug->setCheckState(m_commandDebug ? Qt::Checked : Qt::Unchecked);
739 prefs.miscDebug->setCheckState(m_miscDebug ? Qt::Checked : Qt::Unchecked);
740 prefs.recordLimit->setCheckState(m_recordLimitCheck ? Qt::Checked : Qt::Unchecked);
741 prefs.recordSpinBox->setValue(m_recordLimitVal);
742 prefs.daysLimit->setCheckState(m_daysLimitCheck ? Qt::Checked : Qt::Unchecked);
743 prefs.daysSpinBox->setValue(m_daysLimitVal);
744 prefs.checkMessages->setCheckState(m_checkMessages ? Qt::Checked : Qt::Unchecked);
745 prefs.checkMessagesSpin->setValue(m_checkMessagesInterval);
746 prefs.refreshStatusDir->setCheckState(m_refreshStatusDir ? Qt::Checked : Qt::Unchecked);
747 prefs.refreshStatusDirSpin->setValue(m_refreshStatusDirInterval);
748 prefs.executeLongCheckBox->setCheckState(m_longList ? Qt::Checked : Qt::Unchecked);
749 prefs.rtPopDirCheckBox->setCheckState(m_rtPopDirDebug ? Qt::Checked : Qt::Unchecked);
750 prefs.rtDirCurICCheckBox->setCheckState(m_rtDirCurICDebug ? Qt::Checked : Qt::Unchecked);
751 prefs.rtDirICCheckBox->setCheckState(m_rtDirICDebug ? Qt::Checked : Qt::Unchecked);
752 prefs.rtFileTabICCheckBox->setCheckState(m_rtFileTabICDebug ? Qt::Checked : Qt::Unchecked);
753 prefs.rtVerTabICCheckBox->setCheckState(m_rtVerTabICDebug ? Qt::Checked : Qt::Unchecked);
754 prefs.rtUpdateFTCheckBox->setCheckState(m_rtUpdateFTDebug ? Qt::Checked : Qt::Unchecked);
755 prefs.rtUpdateVTCheckBox->setCheckState(m_rtUpdateVTDebug ? Qt::Checked : Qt::Unchecked);
756 prefs.rtChecksCheckBox->setCheckState(m_rtChecksDebug ? Qt::Checked : Qt::Unchecked);
757 prefs.rtIconStateCheckBox->setCheckState(m_rtIconStateDebug ? Qt::Checked : Qt::Unchecked);
758 prefs.rtRestore1CheckBox->setCheckState(m_rtRestore1Debug ? Qt::Checked : Qt::Unchecked);
759 prefs.rtRestore2CheckBox->setCheckState(m_rtRestore2Debug ? Qt::Checked : Qt::Unchecked);
760 prefs.rtRestore3CheckBox->setCheckState(m_rtRestore3Debug ? Qt::Checked : Qt::Unchecked);
761 switch (ItemFormatterBase::getBytesConversion()) {
762 case ItemFormatterBase::BYTES_CONVERSION_NONE:
763 prefs.radioConvertOff->setChecked(Qt::Checked);
765 case ItemFormatterBase::BYTES_CONVERSION_IEC:
766 prefs.radioConvertIEC->setChecked(Qt::Checked);
769 prefs.radioConvertStandard->setChecked(Qt::Checked);
772 prefs.openPlotCheckBox->setCheckState(m_openPlot ? Qt::Checked : Qt::Unchecked);
774 prefs.openPlotCheckBox->setVisible(false);
776 prefs.openBrowserCheckBox->setCheckState(m_openBrowser ? Qt::Checked : Qt::Unchecked);
777 prefs.openDirStatCheckBox->setCheckState(m_openDirStat ? Qt::Checked : Qt::Unchecked);
781 /* Preferences dialog */
782 prefsDialog::prefsDialog()
787 void prefsDialog::accept()
790 mainWin->m_commDebug = this->commDebug->checkState() == Qt::Checked;
791 mainWin->m_connDebug = this->connDebug->checkState() == Qt::Checked;
792 mainWin->m_displayAll = this->displayAll->checkState() == Qt::Checked;
793 mainWin->m_sqlDebug = this->sqlDebug->checkState() == Qt::Checked;
794 mainWin->m_commandDebug = this->commandDebug->checkState() == Qt::Checked;
795 mainWin->m_miscDebug = this->miscDebug->checkState() == Qt::Checked;
796 mainWin->m_recordLimitCheck = this->recordLimit->checkState() == Qt::Checked;
797 mainWin->m_recordLimitVal = this->recordSpinBox->value();
798 mainWin->m_daysLimitCheck = this->daysLimit->checkState() == Qt::Checked;
799 mainWin->m_daysLimitVal = this->daysSpinBox->value();
800 mainWin->m_checkMessages = this->checkMessages->checkState() == Qt::Checked;
801 mainWin->m_checkMessagesInterval = this->checkMessagesSpin->value();
802 mainWin->m_refreshStatusDir = this->refreshStatusDir->checkState() == Qt::Checked;
803 mainWin->m_refreshStatusDirInterval = this->refreshStatusDirSpin->value();
804 mainWin->m_longList = this->executeLongCheckBox->checkState() == Qt::Checked;
806 mainWin->m_rtPopDirDebug = this->rtPopDirCheckBox->checkState() == Qt::Checked;
807 mainWin->m_rtDirCurICDebug = this->rtDirCurICCheckBox->checkState() == Qt::Checked;
808 mainWin->m_rtDirICDebug = this->rtDirICCheckBox->checkState() == Qt::Checked;
809 mainWin->m_rtFileTabICDebug = this->rtFileTabICCheckBox->checkState() == Qt::Checked;
810 mainWin->m_rtVerTabICDebug = this->rtVerTabICCheckBox->checkState() == Qt::Checked;
811 mainWin->m_rtUpdateFTDebug = this->rtUpdateFTCheckBox->checkState() == Qt::Checked;
812 mainWin->m_rtUpdateVTDebug = this->rtUpdateVTCheckBox->checkState() == Qt::Checked;
813 mainWin->m_rtChecksDebug = this->rtChecksCheckBox->checkState() == Qt::Checked;
814 mainWin->m_rtIconStateDebug = this->rtIconStateCheckBox->checkState() == Qt::Checked;
815 mainWin->m_rtRestore1Debug = this->rtRestore1CheckBox->checkState() == Qt::Checked;
816 mainWin->m_rtRestore2Debug = this->rtRestore2CheckBox->checkState() == Qt::Checked;
817 mainWin->m_rtRestore3Debug = this->rtRestore3CheckBox->checkState() == Qt::Checked;
818 if (this->radioConvertOff->isChecked()) {
819 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_NONE);
820 } else if (this->radioConvertIEC->isChecked()){
821 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_IEC);
823 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_SI);
825 mainWin->m_openPlot = this->openPlotCheckBox->checkState() == Qt::Checked;
826 mainWin->m_openBrowser = this->openBrowserCheckBox->checkState() == Qt::Checked;
827 mainWin->m_openDirStat = this->openDirStatCheckBox->checkState() == Qt::Checked;
829 QSettings settings("www.bacula.org", "bat");
830 settings.beginGroup("Debug");
831 settings.setValue("commDebug", mainWin->m_commDebug);
832 settings.setValue("connDebug", mainWin->m_connDebug);
833 settings.setValue("displayAll", mainWin->m_displayAll);
834 settings.setValue("sqlDebug", mainWin->m_sqlDebug);
835 settings.setValue("commandDebug", mainWin->m_commandDebug);
836 settings.setValue("miscDebug", mainWin->m_miscDebug);
838 settings.beginGroup("JobList");
839 settings.setValue("recordLimitCheck", mainWin->m_recordLimitCheck);
840 settings.setValue("recordLimitVal", mainWin->m_recordLimitVal);
841 settings.setValue("daysLimitCheck", mainWin->m_daysLimitCheck);
842 settings.setValue("daysLimitVal", mainWin->m_daysLimitVal);
844 settings.beginGroup("Timers");
845 settings.setValue("checkMessages", mainWin->m_checkMessages);
846 settings.setValue("checkMessagesInterval", mainWin->m_checkMessagesInterval);
847 settings.setValue("refreshStatusDir", mainWin->m_refreshStatusDir);
848 settings.setValue("refreshStatusDirInterval", mainWin->m_refreshStatusDirInterval);
850 settings.beginGroup("Misc");
851 settings.setValue("longList", mainWin->m_longList);
852 settings.setValue("byteConvert", ItemFormatterBase::getBytesConversion());
853 settings.setValue("openplot", mainWin->m_openPlot);
854 settings.setValue("openbrowser", mainWin->m_openBrowser);
855 settings.setValue("opendirstat", mainWin->m_openDirStat);
857 settings.beginGroup("RestoreTree");
858 settings.setValue("rtPopDirDebug", mainWin->m_rtPopDirDebug);
859 settings.setValue("rtDirCurICDebug", mainWin->m_rtDirCurICDebug);
860 settings.setValue("rtDirCurICRetDebug", mainWin->m_rtDirICDebug);
861 settings.setValue("rtFileTabICDebug", mainWin->m_rtFileTabICDebug);
862 settings.setValue("rtVerTabICDebug", mainWin->m_rtVerTabICDebug);
863 settings.setValue("rtUpdateFTDebug", mainWin->m_rtUpdateFTDebug);
864 settings.setValue("rtUpdateVTDebug", mainWin->m_rtUpdateVTDebug);
865 settings.setValue("rtChecksDebug", mainWin->m_rtChecksDebug);
866 settings.setValue("rtIconStateDebug", mainWin->m_rtIconStateDebug);
867 settings.setValue("rtRestore1Debug", mainWin->m_rtRestore1Debug);
868 settings.setValue("rtRestore2Debug", mainWin->m_rtRestore2Debug);
869 settings.setValue("rtRestore3Debug", mainWin->m_rtRestore3Debug);
873 void prefsDialog::reject()
876 mainWin->set_status(tr("Canceled"));
879 /* read preferences for the prefences dialog box */
880 void MainWin::readPreferences()
882 QSettings settings("www.bacula.org", "bat");
883 settings.beginGroup("Debug");
884 m_commDebug = settings.value("commDebug", false).toBool();
885 m_connDebug = settings.value("connDebug", false).toBool();
886 m_displayAll = settings.value("displayAll", false).toBool();
887 m_sqlDebug = settings.value("sqlDebug", false).toBool();
888 m_commandDebug = settings.value("commandDebug", false).toBool();
889 m_miscDebug = settings.value("miscDebug", false).toBool();
891 settings.beginGroup("JobList");
892 m_recordLimitCheck = settings.value("recordLimitCheck", true).toBool();
893 m_recordLimitVal = settings.value("recordLimitVal", 150).toInt();
894 m_daysLimitCheck = settings.value("daysLimitCheck", false).toBool();
895 m_daysLimitVal = settings.value("daysLimitVal", 28).toInt();
897 settings.beginGroup("Timers");
898 m_checkMessages = settings.value("checkMessages", false).toBool();
899 m_checkMessagesInterval = settings.value("checkMessagesInterval", 28).toInt();
900 m_refreshStatusDir = settings.value("refreshStatusDir", false).toBool();
901 m_refreshStatusDirInterval = settings.value("refreshStatusDirInterval", 28).toInt();
903 settings.beginGroup("Misc");
904 m_longList = settings.value("longList", false).toBool();
905 ItemFormatterBase::setBytesConversion(
906 (ItemFormatterBase::BYTES_CONVERSION) settings.value("byteConvert",
907 ItemFormatterBase::BYTES_CONVERSION_IEC).toInt());
908 m_openPlot = settings.value("openplot", false).toBool();
909 m_openBrowser = settings.value("openbrowser", false).toBool();
910 m_openDirStat = settings.value("opendirstat", false).toBool();
912 settings.beginGroup("RestoreTree");
913 m_rtPopDirDebug = settings.value("rtPopDirDebug", false).toBool();
914 m_rtDirCurICDebug = settings.value("rtDirCurICDebug", false).toBool();
915 m_rtDirICDebug = settings.value("rtDirCurICRetDebug", false).toBool();
916 m_rtFileTabICDebug = settings.value("rtFileTabICDebug", false).toBool();
917 m_rtVerTabICDebug = settings.value("rtVerTabICDebug", false).toBool();
918 m_rtUpdateFTDebug = settings.value("rtUpdateFTDebug", false).toBool();
919 m_rtUpdateVTDebug = settings.value("rtUpdateVTDebug", false).toBool();
920 m_rtChecksDebug = settings.value("rtChecksDebug", false).toBool();
921 m_rtIconStateDebug = settings.value("rtIconStateDebug", false).toBool();
922 m_rtRestore1Debug = settings.value("rtRestore1Debug", false).toBool();
923 m_rtRestore2Debug = settings.value("rtRestore2Debug", false).toBool();
924 m_rtRestore3Debug = settings.value("rtRestore3Debug", false).toBool();
928 void MainWin::setMessageIcon()
930 if (m_currentConsole->is_messagesPending())
931 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-pending.png")));
933 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-new.png")));