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 three of the GNU Affero 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 Affero 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(2000, 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);
154 m_currentConsole->dockPage();
156 /* Set Color of treeWidgetItem for the console
157 * It will be set to green in the console class if the connection is made.
159 QBrush redBrush(Qt::red);
160 item->setForeground(0, redBrush);
163 * Create instances in alphabetic order of the rest
164 * of the classes that will by default exist under each Director.
170 createPageJobList("", "", "", "", NULL);
175 new JobPlot(NULL, pass);
186 treeWidget->expandItem(topItem);
187 tabWidget->setCurrentWidget(m_currentConsole);
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) Pmsg0(000, "Entering Wait State\n");
316 app->setOverrideCursor(QCursor(Qt::WaitCursor));
318 disconnectConsoleSignals(m_currentConsole);
319 m_waitTreeItem = treeWidget->currentItem();
325 void MainWin::waitExit()
327 if (!m_waitState || m_isClosing) {
331 if (mainWin->m_connDebug) Pmsg0(000, "Exiting Wait State\n");
332 if (m_waitTreeItem && (m_waitTreeItem != treeWidget->currentItem())) {
333 treeWidget->setCurrentItem(m_waitTreeItem);
337 connectConsoleSignals();
339 app->restoreOverrideCursor();
342 void MainWin::connectConsoleSignals()
344 connect(actionConnect, SIGNAL(triggered()), m_currentConsole, SLOT(connect_dir()));
345 connect(actionSelectFont, SIGNAL(triggered()), m_currentConsole, SLOT(set_font()));
346 connect(actionMessages, SIGNAL(triggered()), m_currentConsole, SLOT(messages()));
349 void MainWin::disconnectConsoleSignals(Console *console)
351 disconnect(actionConnect, SIGNAL(triggered()), console, SLOT(connect_dir()));
352 disconnect(actionMessages, SIGNAL(triggered()), console, SLOT(messages()));
353 disconnect(actionSelectFont, SIGNAL(triggered()), console, SLOT(set_font()));
358 * Two functions to respond to menu items to repop lists and execute reload and repopulate
359 * the lists for jobs, clients, filesets .. ..
361 void MainWin::repopLists()
363 m_currentConsole->populateLists(false);
365 void MainWin::reloadRepopLists()
367 QString cmd = "reload";
368 m_currentConsole->consoleCommand(cmd);
369 m_currentConsole->populateLists(false);
373 * Reimplementation of QWidget closeEvent virtual function
375 void MainWin::closeEvent(QCloseEvent *event)
379 /* Remove all groups from settings for OpenOnExit so that we can start some of the status windows */
380 foreach(Console *console, m_consoleHash){
381 QSettings settings(console->m_dir->name(), "bat");
382 settings.beginGroup("OpenOnExit");
386 /* close all non console pages, this will call settings in destructors */
387 while (m_consoleHash.count() < m_pagehash.count()) {
388 foreach(Pages *page, m_pagehash) {
389 if (page != page->console()) {
390 QTreeWidgetItem* pageSelectorTreeWidgetItem = mainWin->getFromHash(page);
391 if (pageSelectorTreeWidgetItem->childCount() == 0) {
392 page->console()->setCurrent();
393 page->closeStackPage();
398 foreach(Console *console, m_consoleHash){
399 console->writeSettings();
400 console->terminate();
401 console->closeStackPage();
406 void MainWin::writeSettings()
408 QSettings settings("bacula.org", "bat");
410 settings.beginGroup("MainWin");
411 settings.setValue("winSize", size());
412 settings.setValue("winPos", pos());
413 settings.setValue("state", saveState());
418 void MainWin::readSettings()
420 QSettings settings("bacula.org", "bat");
422 settings.beginGroup("MainWin");
423 resize(settings.value("winSize", QSize(1041, 801)).toSize());
424 move(settings.value("winPos", QPoint(200, 150)).toPoint());
425 restoreState(settings.value("state").toByteArray());
430 * This subroutine is called with an item in the Page Selection window
433 void MainWin::treeItemClicked(QTreeWidgetItem *item, int /*column*/)
435 /* Is this a page that has been inserted into the hash */
436 if (getFromHash(item)) {
437 Pages* page = getFromHash(item);
438 int stackindex=tabWidget->indexOf(page);
440 if (stackindex >= 0) {
441 tabWidget->setCurrentWidget(page);
443 /* run the virtual function in case this class overrides it */
444 page->PgSeltreeWidgetClicked();
449 * Called with a change of the highlighed tree widget item in the page selector.
451 void MainWin::treeItemChanged(QTreeWidgetItem *currentitem, QTreeWidgetItem *previousitem)
453 if (m_isClosing) return; /* if closing the application, do nothing here */
455 Pages *previousPage, *nextPage;
456 Console *previousConsole = NULL;
457 Console *nextConsole;
459 /* remove all actions before adding actions appropriate for new page */
460 foreach(QAction* pageAction, treeWidget->actions()) {
461 treeWidget->removeAction(pageAction);
464 /* first determine the next item */
466 /* knowing the treeWidgetItem, get the page from the hash */
467 nextPage = getFromHash(currentitem);
468 nextConsole = m_consoleHash.value(currentitem);
469 /* Is this a page that has been inserted into the hash */
471 nextConsole = nextPage->console();
472 /* then is it a treeWidgetItem representing a director */
473 } else if (nextConsole) {
474 /* let the next page BE the console */
475 nextPage = nextConsole;
477 /* Should never get here */
482 /* The Previous item */
484 /* this condition prevents a segfault. The first time there is no previousitem*/
486 if (m_treeStackTrap == false) { /* keep track of previous items for going Back */
487 m_treeWidgetStack.append(previousitem);
489 /* knowing the treeWidgetItem, get the page from the hash */
490 previousPage = getFromHash(previousitem);
491 previousConsole = m_consoleHash.value(previousitem);
493 previousConsole = previousPage->console();
494 } else if (previousConsole) {
495 previousPage = previousConsole;
497 if ((previousPage) || (previousConsole)) {
498 if (nextConsole != previousConsole) {
499 /* remove connections to the current console */
500 disconnectConsoleSignals(previousConsole);
501 QTreeWidgetItem *dirItem = previousConsole->directorTreeItem();
502 QBrush greyBrush(Qt::lightGray);
503 dirItem->setBackground(0, greyBrush);
508 /* process the current (next) item */
510 if ((nextPage) || (nextConsole)) {
511 if (nextConsole != previousConsole) {
512 /* make connections to the current console */
513 m_currentConsole = nextConsole;
514 connectConsoleSignals();
516 /* Set director's tree widget background to magenta for ease of identification */
517 QTreeWidgetItem *dirItem = m_currentConsole->directorTreeItem();
518 QBrush magentaBrush(Qt::magenta);
519 dirItem->setBackground(0, magentaBrush);
521 /* set the value for the currently active console */
522 int stackindex = tabWidget->indexOf(nextPage);
523 nextPage->firstUseDock();
525 /* Is this page currently on the stack or is it undocked */
526 if (stackindex >= 0) {
527 /* put this page on the top of the stack */
528 tabWidget->setCurrentIndex(stackindex);
530 /* it is undocked, raise it to the front */
533 /* for the page selectors menu action to dock or undock, set the text */
534 nextPage->setContextMenuDockText();
536 treeWidget->addAction(actionToggleDock);
537 /* if this page is closeable, and it has no childern, then add that action */
538 if ((nextPage->isCloseable()) && (currentitem->child(0) == NULL))
539 treeWidget->addAction(actionClosePage);
541 /* Add the actions to the Page Selectors tree widget that are part of the
542 * current items list of desired actions regardless of whether on top of stack*/
543 treeWidget->addActions(nextPage->m_contextActions);
547 void MainWin::labelButtonClicked()
552 void MainWin::runButtonClicked()
557 void MainWin::estimateButtonClicked()
562 void MainWin::browseButtonClicked()
567 void MainWin::statusPageButtonClicked()
569 /* if one exists, then just set it current */
571 foreach(Pages *page, m_pagehash) {
572 if (m_currentConsole == page->console()) {
573 if (page->name() == tr("Director Status")) {
584 void MainWin::restoreButtonClicked()
586 new prerestorePage();
587 if (mainWin->m_miscDebug) Pmsg0(000, "in restoreButtonClicked after prerestorePage\n");
590 void MainWin::jobPlotButtonClicked()
595 new JobPlot(NULL, pass);
600 * The user just finished typing a line in the command line edit box
602 void MainWin::input_line()
605 QString cmdStr = lineEdit->text(); /* Get the text */
606 lineEdit->clear(); /* clear the lineEdit box */
607 if (m_currentConsole->is_connected()) {
608 if (m_currentConsole->findDirComm(conn)) {
609 m_currentConsole->consoleCommand(cmdStr, conn);
611 /* Use consoleCommand to allow typing anything */
612 m_currentConsole->consoleCommand(cmdStr);
615 set_status(tr("Director not connected. Click on connect button."));
617 m_cmd_history.append(cmdStr);
619 if (treeWidget->currentItem() != getFromHash(m_currentConsole))
620 m_currentConsole->setCurrent();
624 void MainWin::about()
626 QMessageBox::about(this, tr("About bat"),
627 tr("<br><h2>bat %1 (%2), by Dirk H Bartley and Kern Sibbald</h2>"
628 "<p>Copyright © 2007-%3 Free Software Foundation Europe e.V."
629 "<p>The <b>bat</b> is an administrative console"
630 " interface to the Director.").arg(VERSION).arg(BDATE).arg(BYEAR));
635 Help::displayFile("index.html");
638 void MainWin::set_statusf(const char *fmt, ...)
643 va_start(arg_ptr, fmt);
644 len = bvsnprintf(buf, sizeof(buf), fmt, arg_ptr);
649 void MainWin::set_status_ready()
651 set_status(tr(" Ready"));
654 void MainWin::set_status(const QString &str)
656 statusBar()->showMessage(str);
659 void MainWin::set_status(const char *buf)
661 statusBar()->showMessage(buf);
665 * Function to respond to the button bar button to undock
667 void MainWin::undockWindowButton()
669 Pages* page = (Pages*)tabWidget->currentWidget();
670 page->togglePageDocking();
674 * Function to respond to action on page selector context menu to toggle the
675 * dock status of the window associated with the page selectors current
678 void MainWin::toggleDockContextWindow()
680 QTreeWidgetItem *currentitem = treeWidget->currentItem();
682 /* Is this a page that has been inserted into the hash */
683 if (getFromHash(currentitem)) {
684 Pages* page = getFromHash(currentitem);
685 page->togglePageDocking();
690 * This function is called when the stack item is changed. Call
691 * the virtual function here. Avoids a window being undocked leaving
692 * a window at the top of the stack unpopulated.
694 void MainWin::stackItemChanged(int)
696 if (m_isClosing) return; /* if closing the application, do nothing here */
697 Pages* page = (Pages*)tabWidget->currentWidget();
698 /* run the virtual function in case this class overrides it */
699 page->currentStackItem();
701 disconnect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
702 disconnect(treeWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
703 treeWidget->setCurrentItem(getFromHash(page));
704 connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
705 connect(treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
710 * Function to simplify insertion of QTreeWidgetItem <-> Page association
711 * into a double direction hash.
713 void MainWin::hashInsert(QTreeWidgetItem *item, Pages *page)
715 m_pagehash.insert(item, page);
716 m_widgethash.insert(page, item);
720 * Function to simplify removal of QTreeWidgetItem <-> Page association
721 * into a double direction hash.
723 void MainWin::hashRemove(QTreeWidgetItem *item, Pages *page)
725 /* I had all sorts of return status checking code here. Do we have a log
726 * level capability in bat. I would have left it in but it used printf's
727 * and it should really be some kind of log level facility ???
728 * ******FIXME********/
729 m_pagehash.remove(item);
730 m_widgethash.remove(page);
734 * Function to retrieve a Page* when the item in the page selector's tree is
737 Pages* MainWin::getFromHash(QTreeWidgetItem *item)
739 return m_pagehash.value(item);
743 * Function to retrieve the page selectors tree widget item when the page is
746 QTreeWidgetItem* MainWin::getFromHash(Pages *page)
748 return m_widgethash.value(page);
752 * Function to respond to action on page selector context menu to close the
755 void MainWin::closePage()
757 QTreeWidgetItem *currentitem = treeWidget->currentItem();
759 /* Is this a page that has been inserted into the hash */
760 if (getFromHash(currentitem)) {
761 Pages* page = getFromHash(currentitem);
762 if (page->isCloseable()) {
763 page->closeStackPage();
768 /* Quick function to return the current console */
769 Console *MainWin::currentConsole()
771 return m_currentConsole;
774 /* Quick function to return the tree item for the director */
775 QTreeWidgetItem *MainWin::currentTopItem()
777 return m_currentConsole->directorTreeItem();
780 /* Preferences menu item clicked */
781 void MainWin::setPreferences()
784 prefs.commDebug->setCheckState(m_commDebug ? Qt::Checked : Qt::Unchecked);
785 prefs.connDebug->setCheckState(m_connDebug ? Qt::Checked : Qt::Unchecked);
786 prefs.displayAll->setCheckState(m_displayAll ? Qt::Checked : Qt::Unchecked);
787 prefs.sqlDebug->setCheckState(m_sqlDebug ? Qt::Checked : Qt::Unchecked);
788 prefs.commandDebug->setCheckState(m_commandDebug ? Qt::Checked : Qt::Unchecked);
789 prefs.miscDebug->setCheckState(m_miscDebug ? Qt::Checked : Qt::Unchecked);
790 prefs.recordLimit->setCheckState(m_recordLimitCheck ? Qt::Checked : Qt::Unchecked);
791 prefs.recordSpinBox->setValue(m_recordLimitVal);
792 prefs.daysLimit->setCheckState(m_daysLimitCheck ? Qt::Checked : Qt::Unchecked);
793 prefs.daysSpinBox->setValue(m_daysLimitVal);
794 prefs.checkMessages->setCheckState(m_checkMessages ? Qt::Checked : Qt::Unchecked);
795 prefs.checkMessagesSpin->setValue(m_checkMessagesInterval);
796 prefs.executeLongCheckBox->setCheckState(m_longList ? Qt::Checked : Qt::Unchecked);
797 prefs.rtPopDirCheckBox->setCheckState(m_rtPopDirDebug ? Qt::Checked : Qt::Unchecked);
798 prefs.rtDirCurICCheckBox->setCheckState(m_rtDirCurICDebug ? Qt::Checked : Qt::Unchecked);
799 prefs.rtDirICCheckBox->setCheckState(m_rtDirICDebug ? Qt::Checked : Qt::Unchecked);
800 prefs.rtFileTabICCheckBox->setCheckState(m_rtFileTabICDebug ? Qt::Checked : Qt::Unchecked);
801 prefs.rtVerTabICCheckBox->setCheckState(m_rtVerTabICDebug ? Qt::Checked : Qt::Unchecked);
802 prefs.rtUpdateFTCheckBox->setCheckState(m_rtUpdateFTDebug ? Qt::Checked : Qt::Unchecked);
803 prefs.rtUpdateVTCheckBox->setCheckState(m_rtUpdateVTDebug ? Qt::Checked : Qt::Unchecked);
804 prefs.rtChecksCheckBox->setCheckState(m_rtChecksDebug ? Qt::Checked : Qt::Unchecked);
805 prefs.rtIconStateCheckBox->setCheckState(m_rtIconStateDebug ? Qt::Checked : Qt::Unchecked);
806 prefs.rtRestore1CheckBox->setCheckState(m_rtRestore1Debug ? Qt::Checked : Qt::Unchecked);
807 prefs.rtRestore2CheckBox->setCheckState(m_rtRestore2Debug ? Qt::Checked : Qt::Unchecked);
808 prefs.rtRestore3CheckBox->setCheckState(m_rtRestore3Debug ? Qt::Checked : Qt::Unchecked);
809 switch (ItemFormatterBase::getBytesConversion()) {
810 case ItemFormatterBase::BYTES_CONVERSION_NONE:
811 prefs.radioConvertOff->setChecked(Qt::Checked);
813 case ItemFormatterBase::BYTES_CONVERSION_IEC:
814 prefs.radioConvertIEC->setChecked(Qt::Checked);
817 prefs.radioConvertStandard->setChecked(Qt::Checked);
820 prefs.openPlotCheckBox->setCheckState(m_openPlot ? Qt::Checked : Qt::Unchecked);
822 prefs.openPlotCheckBox->setVisible(false);
824 prefs.openBrowserCheckBox->setCheckState(m_openBrowser ? Qt::Checked : Qt::Unchecked);
825 prefs.openDirStatCheckBox->setCheckState(m_openDirStat ? Qt::Checked : Qt::Unchecked);
829 /* Preferences dialog */
830 prefsDialog::prefsDialog()
835 void prefsDialog::accept()
838 mainWin->m_commDebug = this->commDebug->checkState() == Qt::Checked;
839 mainWin->m_connDebug = this->connDebug->checkState() == Qt::Checked;
840 mainWin->m_displayAll = this->displayAll->checkState() == Qt::Checked;
841 mainWin->m_sqlDebug = this->sqlDebug->checkState() == Qt::Checked;
842 mainWin->m_commandDebug = this->commandDebug->checkState() == Qt::Checked;
843 mainWin->m_miscDebug = this->miscDebug->checkState() == Qt::Checked;
844 mainWin->m_recordLimitCheck = this->recordLimit->checkState() == Qt::Checked;
845 mainWin->m_recordLimitVal = this->recordSpinBox->value();
846 mainWin->m_daysLimitCheck = this->daysLimit->checkState() == Qt::Checked;
847 mainWin->m_daysLimitVal = this->daysSpinBox->value();
848 mainWin->m_checkMessages = this->checkMessages->checkState() == Qt::Checked;
849 mainWin->m_checkMessagesInterval = this->checkMessagesSpin->value();
850 mainWin->m_longList = this->executeLongCheckBox->checkState() == Qt::Checked;
852 mainWin->m_rtPopDirDebug = this->rtPopDirCheckBox->checkState() == Qt::Checked;
853 mainWin->m_rtDirCurICDebug = this->rtDirCurICCheckBox->checkState() == Qt::Checked;
854 mainWin->m_rtDirICDebug = this->rtDirICCheckBox->checkState() == Qt::Checked;
855 mainWin->m_rtFileTabICDebug = this->rtFileTabICCheckBox->checkState() == Qt::Checked;
856 mainWin->m_rtVerTabICDebug = this->rtVerTabICCheckBox->checkState() == Qt::Checked;
857 mainWin->m_rtUpdateFTDebug = this->rtUpdateFTCheckBox->checkState() == Qt::Checked;
858 mainWin->m_rtUpdateVTDebug = this->rtUpdateVTCheckBox->checkState() == Qt::Checked;
859 mainWin->m_rtChecksDebug = this->rtChecksCheckBox->checkState() == Qt::Checked;
860 mainWin->m_rtIconStateDebug = this->rtIconStateCheckBox->checkState() == Qt::Checked;
861 mainWin->m_rtRestore1Debug = this->rtRestore1CheckBox->checkState() == Qt::Checked;
862 mainWin->m_rtRestore2Debug = this->rtRestore2CheckBox->checkState() == Qt::Checked;
863 mainWin->m_rtRestore3Debug = this->rtRestore3CheckBox->checkState() == Qt::Checked;
864 if (this->radioConvertOff->isChecked()) {
865 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_NONE);
866 } else if (this->radioConvertIEC->isChecked()){
867 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_IEC);
869 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_SI);
871 mainWin->m_openPlot = this->openPlotCheckBox->checkState() == Qt::Checked;
872 mainWin->m_openBrowser = this->openBrowserCheckBox->checkState() == Qt::Checked;
873 mainWin->m_openDirStat = this->openDirStatCheckBox->checkState() == Qt::Checked;
875 QSettings settings("www.bacula.org", "bat");
876 settings.beginGroup("Debug");
877 settings.setValue("commDebug", mainWin->m_commDebug);
878 settings.setValue("connDebug", mainWin->m_connDebug);
879 settings.setValue("displayAll", mainWin->m_displayAll);
880 settings.setValue("sqlDebug", mainWin->m_sqlDebug);
881 settings.setValue("commandDebug", mainWin->m_commandDebug);
882 settings.setValue("miscDebug", mainWin->m_miscDebug);
884 settings.beginGroup("JobList");
885 settings.setValue("recordLimitCheck", mainWin->m_recordLimitCheck);
886 settings.setValue("recordLimitVal", mainWin->m_recordLimitVal);
887 settings.setValue("daysLimitCheck", mainWin->m_daysLimitCheck);
888 settings.setValue("daysLimitVal", mainWin->m_daysLimitVal);
890 settings.beginGroup("Timers");
891 settings.setValue("checkMessages", mainWin->m_checkMessages);
892 settings.setValue("checkMessagesInterval", mainWin->m_checkMessagesInterval);
894 settings.beginGroup("Misc");
895 settings.setValue("longList", mainWin->m_longList);
896 settings.setValue("byteConvert", ItemFormatterBase::getBytesConversion());
897 settings.setValue("openplot", mainWin->m_openPlot);
898 settings.setValue("openbrowser", mainWin->m_openBrowser);
899 settings.setValue("opendirstat", mainWin->m_openDirStat);
901 settings.beginGroup("RestoreTree");
902 settings.setValue("rtPopDirDebug", mainWin->m_rtPopDirDebug);
903 settings.setValue("rtDirCurICDebug", mainWin->m_rtDirCurICDebug);
904 settings.setValue("rtDirCurICRetDebug", mainWin->m_rtDirICDebug);
905 settings.setValue("rtFileTabICDebug", mainWin->m_rtFileTabICDebug);
906 settings.setValue("rtVerTabICDebug", mainWin->m_rtVerTabICDebug);
907 settings.setValue("rtUpdateFTDebug", mainWin->m_rtUpdateFTDebug);
908 settings.setValue("rtUpdateVTDebug", mainWin->m_rtUpdateVTDebug);
909 settings.setValue("rtChecksDebug", mainWin->m_rtChecksDebug);
910 settings.setValue("rtIconStateDebug", mainWin->m_rtIconStateDebug);
911 settings.setValue("rtRestore1Debug", mainWin->m_rtRestore1Debug);
912 settings.setValue("rtRestore2Debug", mainWin->m_rtRestore2Debug);
913 settings.setValue("rtRestore3Debug", mainWin->m_rtRestore3Debug);
917 void prefsDialog::reject()
920 mainWin->set_status(tr("Canceled"));
923 /* read preferences for the prefences dialog box */
924 void MainWin::readPreferences()
926 QSettings settings("www.bacula.org", "bat");
927 settings.beginGroup("Debug");
928 m_commDebug = settings.value("commDebug", false).toBool();
929 m_connDebug = settings.value("connDebug", false).toBool();
930 m_displayAll = settings.value("displayAll", false).toBool();
931 m_sqlDebug = settings.value("sqlDebug", false).toBool();
932 m_commandDebug = settings.value("commandDebug", false).toBool();
933 m_miscDebug = settings.value("miscDebug", false).toBool();
935 settings.beginGroup("JobList");
936 m_recordLimitCheck = settings.value("recordLimitCheck", true).toBool();
937 m_recordLimitVal = settings.value("recordLimitVal", 150).toInt();
938 m_daysLimitCheck = settings.value("daysLimitCheck", false).toBool();
939 m_daysLimitVal = settings.value("daysLimitVal", 28).toInt();
941 settings.beginGroup("Timers");
942 m_checkMessages = settings.value("checkMessages", false).toBool();
943 m_checkMessagesInterval = settings.value("checkMessagesInterval", 28).toInt();
945 settings.beginGroup("Misc");
946 m_longList = settings.value("longList", false).toBool();
947 ItemFormatterBase::setBytesConversion(
948 (ItemFormatterBase::BYTES_CONVERSION) settings.value("byteConvert",
949 ItemFormatterBase::BYTES_CONVERSION_IEC).toInt());
950 m_openPlot = settings.value("openplot", false).toBool();
951 m_openBrowser = settings.value("openbrowser", false).toBool();
952 m_openDirStat = settings.value("opendirstat", false).toBool();
954 settings.beginGroup("RestoreTree");
955 m_rtPopDirDebug = settings.value("rtPopDirDebug", false).toBool();
956 m_rtDirCurICDebug = settings.value("rtDirCurICDebug", false).toBool();
957 m_rtDirICDebug = settings.value("rtDirCurICRetDebug", false).toBool();
958 m_rtFileTabICDebug = settings.value("rtFileTabICDebug", false).toBool();
959 m_rtVerTabICDebug = settings.value("rtVerTabICDebug", false).toBool();
960 m_rtUpdateFTDebug = settings.value("rtUpdateFTDebug", false).toBool();
961 m_rtUpdateVTDebug = settings.value("rtUpdateVTDebug", false).toBool();
962 m_rtChecksDebug = settings.value("rtChecksDebug", false).toBool();
963 m_rtIconStateDebug = settings.value("rtIconStateDebug", false).toBool();
964 m_rtRestore1Debug = settings.value("rtRestore1Debug", false).toBool();
965 m_rtRestore2Debug = settings.value("rtRestore2Debug", false).toBool();
966 m_rtRestore3Debug = settings.value("rtRestore3Debug", false).toBool();
970 void MainWin::setMessageIcon()
972 if (m_currentConsole->is_messagesPending())
973 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-pending.png")));
975 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-new.png")));
978 void MainWin::goToPreviousPage()
980 m_treeStackTrap = true;
983 /* If stack list is emtpty, then done */
984 if (m_treeWidgetStack.isEmpty()) {
987 QTreeWidgetItem* testItem = m_treeWidgetStack.takeLast();
988 QTreeWidgetItemIterator it(treeWidget);
989 /* lets avoid a segfault by setting an item current that no longer exists */
991 if (*it == testItem) {
992 if (testItem != treeWidget->currentItem()) {
993 treeWidget->setCurrentItem(testItem);
1002 m_treeStackTrap = false;