]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/qt-console/mainwin.cpp
Real close here to being able to do restores. Using FileIndex now instead
[bacula/bacula] / bacula / src / qt-console / mainwin.cpp
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2007-2007 Free Software Foundation Europe e.V.
5
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
11    in the file LICENSE.
12
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.
17
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
21    02110-1301, USA.
22
23    Bacula® is a registered trademark of John Walker.
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.
27 */
28
29 /*
30  *   Version $Id$
31  *
32  *  Main Window control for bat (qt-console)
33  *
34  *   Kern Sibbald, January MMVII
35  *
36  */ 
37
38 #include "bat.h"
39 #include "joblist/joblist.h"
40 #include "storage/storage.h"
41 #include "fileset/fileset.h"
42 #include "label/label.h"
43 #include "run/run.h"
44 #include "pages.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 "jobgraphs/jobplot.h"
53
54 /* 
55  * Daemon message callback
56  */
57 void message_callback(int /* type */, char *msg)
58 {
59    QMessageBox::warning(mainWin, "Bat", msg, QMessageBox::Ok);
60 }
61
62 MainWin::MainWin(QWidget *parent) : QMainWindow(parent)
63 {
64    m_isClosing = false;
65    m_dtformat = "yyyy-MM-dd HH:mm:ss";
66    mainWin = this;
67    setupUi(this);                     /* Setup UI defined by main.ui (designer) */
68    register_message_callback(message_callback);
69    readPreferences();
70    treeWidget->clear();
71    treeWidget->setColumnCount(1);
72    treeWidget->setHeaderLabel("Select Page");
73    treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
74
75    createPages();
76
77    resetFocus();
78
79    createConnections();
80
81    this->show();
82
83    readSettings();
84
85    foreach(Console *console, m_consoleHash) {
86       console->connect_dir();
87    }
88    m_currentConsole = (Console*)getFromHash(m_firstItem);
89    m_currentConsole->setCurrent();
90    if (m_miscDebug) {
91       QString directoryResourceName;
92       m_currentConsole->getDirResName(directoryResourceName);
93       Pmsg1(000, "Setting initial window to %s\n", directoryResourceName.toUtf8().data());
94    }
95 }
96
97 void MainWin::createPages()
98 {
99    DIRRES *dir;
100    QTreeWidgetItem *item, *topItem;
101    m_firstItem = NULL;
102
103    LockRes();
104    foreach_res(dir, R_DIRECTOR) {
105
106       /* Create console tree stacked widget item */
107       m_currentConsole = new Console(stackedWidget);
108       m_currentConsole->setDirRes(dir);
109       m_currentConsole->readSettings();
110
111       /* The top tree item representing the director */
112       topItem = new QTreeWidgetItem(treeWidget);
113       topItem->setText(0, dir->name());
114       topItem->setIcon(0, QIcon(":images/server.png"));
115       /* Set background to grey for ease of identification of inactive Director */
116       QBrush greyBrush(Qt::lightGray);
117       topItem->setBackground(0, greyBrush);
118       m_currentConsole->setDirectorTreeItem(topItem);
119       m_consoleHash.insert(topItem, m_currentConsole);
120
121       /* Create Tree Widget Item */
122       item = new QTreeWidgetItem(topItem);
123       item->setText(0, "Console");
124       if (!m_firstItem){ m_firstItem = item; }
125       item->setIcon(0,QIcon(QString::fromUtf8(":images/utilities-terminal.svg")));
126
127       /* insert the cosole and tree widget item into the hashes */
128       hashInsert(item, m_currentConsole);
129
130       /* Set Color of treeWidgetItem for the console
131       * It will be set to green in the console class if the connection is made.
132       */
133       QBrush redBrush(Qt::red);
134       item->setForeground(0, redBrush);
135       m_currentConsole->dockPage();
136
137       /*
138        * Create instances in alphabetic order of the rest 
139        *  of the classes that will by default exist under each Director.  
140        */
141 //      new bRestore();
142       new Clients();
143       new FileSet();
144       new Jobs();
145       createPageJobList("", "", "", "", NULL);
146       new MediaList();
147       new Storage();
148       new restoreTree();
149       JobPlotPass pass;
150       pass.use = false;
151       new JobPlot(NULL, pass);
152
153       treeWidget->expandItem(topItem);
154       stackedWidget->setCurrentWidget(m_currentConsole);
155    }
156    UnlockRes();
157 }
158
159 /*
160  * create an instance of the the joblist class on the stack
161  */
162 void MainWin::createPageJobList(const QString &media, const QString &client,
163               const QString &job, const QString &fileset, QTreeWidgetItem *parentTreeWidgetItem)
164 {
165    QTreeWidgetItem *holdItem;
166
167    /* save current tree widget item in case query produces no results */
168    holdItem = treeWidget->currentItem();
169    JobList* joblist = new JobList(media, client, job, fileset, parentTreeWidgetItem);
170    /* If this is a query of jobs on a specific media */
171    if ((media != "") || (client != "") || (job != "") || (fileset != "")) {
172       joblist->setCurrent();
173       /* did query produce results, if not close window and set back to hold */
174       if (joblist->m_resultCount == 0) {
175          joblist->closeStackPage();
176          treeWidget->setCurrentItem(holdItem);
177       }
178    }
179 }
180
181 /*
182  * Handle up and down arrow keys for the command line
183  *  history.
184  */
185 void MainWin::keyPressEvent(QKeyEvent *event)
186 {
187    if (m_cmd_history.size() == 0) {
188       event->ignore();
189       return;
190    }
191    switch (event->key()) {
192    case Qt::Key_Down:
193       if (m_cmd_last < 0 || m_cmd_last >= (m_cmd_history.size()-1)) {
194          event->ignore();
195          return;
196       }
197       m_cmd_last++;
198       break;
199    case Qt::Key_Up:
200       if (m_cmd_last == 0) {
201          event->ignore();
202          return;
203       }
204       if (m_cmd_last < 0 || m_cmd_last > (m_cmd_history.size()-1)) {
205          m_cmd_last = m_cmd_history.size() - 1;
206       } else {
207          m_cmd_last--;
208       }
209       break;
210    default:
211       event->ignore();
212       return;
213    }
214    lineEdit->setText(m_cmd_history[m_cmd_last]);
215 }
216
217 void MainWin::createConnections()
218 {
219    /* Connect signals to slots */
220    connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
221    connect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
222    connect(actionBat_Help, SIGNAL(triggered()), this, SLOT(help()));
223    connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, 
224            SLOT(treeItemClicked(QTreeWidgetItem *, int)));
225    connect(treeWidget, SIGNAL(
226            currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
227            this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
228    connect(stackedWidget, SIGNAL(currentChanged(int)),
229            this, SLOT(stackItemChanged(int)));
230    connect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
231    connect(actionLabel, SIGNAL(triggered()), this,  SLOT(labelButtonClicked()));
232    connect(actionRun, SIGNAL(triggered()), this,  SLOT(runButtonClicked()));
233    connect(actionEstimate, SIGNAL(triggered()), this,  SLOT(estimateButtonClicked()));
234    connect(actionBrowse, SIGNAL(triggered()), this,  SLOT(browseButtonClicked()));
235    connect(actionJobPlot, SIGNAL(triggered()), this,  SLOT(jobPlotButtonClicked()));
236    connect(actionRestore, SIGNAL(triggered()), this,  SLOT(restoreButtonClicked()));
237    connect(actionUndock, SIGNAL(triggered()), this,  SLOT(undockWindowButton()));
238    connect(actionToggleDock, SIGNAL(triggered()), this,  SLOT(toggleDockContextWindow()));
239    connect(actionClosePage, SIGNAL(triggered()), this,  SLOT(closePage()));
240    connect(actionPreferences, SIGNAL(triggered()), this,  SLOT(setPreferences()));
241 }
242
243 /* 
244  * Reimplementation of QWidget closeEvent virtual function   
245  */
246 void MainWin::closeEvent(QCloseEvent *event)
247 {
248    m_isClosing = true;
249    writeSettings();
250    /* close all non console pages, this will call settings in destructors */
251    foreach(Pages *page, m_pagehash) {
252       if (page !=  page->console()) {
253          page->console()->setCurrent();
254          page->closeStackPage();
255       }
256    }
257    /* close the console pages and terminate connection */
258    foreach(Console *console, m_consoleHash){
259       console->writeSettings();
260       console->terminate();
261       console->closeStackPage();
262    }
263    event->accept();
264 }
265
266 void MainWin::writeSettings()
267 {
268    QSettings settings("bacula.org", "bat");
269
270    settings.beginGroup("MainWin");
271    settings.setValue("winSize", size());
272    settings.setValue("winPos", pos());
273    settings.setValue("state", saveState());
274    settings.endGroup();
275 }
276
277 void MainWin::readSettings()
278
279    QSettings settings("bacula.org", "bat");
280
281    settings.beginGroup("MainWin");
282    resize(settings.value("winSize", QSize(1041, 801)).toSize());
283    move(settings.value("winPos", QPoint(200, 150)).toPoint());
284    restoreState(settings.value("state").toByteArray());
285    settings.endGroup();
286 }
287
288 /*
289  * This subroutine is called with an item in the Page Selection window
290  *   is clicked 
291  */
292 void MainWin::treeItemClicked(QTreeWidgetItem *item, int /*column*/)
293 {
294    /* Is this a page that has been inserted into the hash  */
295    if (getFromHash(item)) {
296       Pages* page = getFromHash(item);
297       int stackindex=stackedWidget->indexOf(page);
298
299       if (stackindex >= 0) {
300          stackedWidget->setCurrentWidget(page);
301       }
302       /* run the virtual function in case this class overrides it */
303       page->PgSeltreeWidgetClicked();
304    }
305 }
306
307 /*
308  * Called with a change of the highlighed tree widget item in the page selector.
309  */
310 void MainWin::treeItemChanged(QTreeWidgetItem *currentitem, QTreeWidgetItem *previousitem)
311 {
312    if (m_isClosing) return; /* if closing the application, do nothing here */
313
314    Pages *previousPage, *nextPage;
315    Console *previousConsole = NULL;
316    Console *nextConsole;
317
318    /* remove all actions before adding actions appropriate for new page */
319    foreach(QAction* pageAction, treeWidget->actions()) {
320       treeWidget->removeAction(pageAction);
321    }
322
323    /* first determine the next item */
324
325    /* knowing the treeWidgetItem, get the page from the hash */
326    nextPage = getFromHash(currentitem);
327    nextConsole = m_consoleHash.value(currentitem);
328    /* Is this a page that has been inserted into the hash  */
329    if (nextPage) {
330       nextConsole = nextPage->console();
331       /* then is it a treeWidgetItem representing a director */
332    } else if (nextConsole) {
333       /* let the next page BE the console */
334       nextPage = nextConsole;
335    } else {
336       /* Should never get here */
337       nextPage = NULL;
338       nextConsole = NULL;
339    }
340           
341    /* The Previous item */
342
343    /* this condition prevents a segfault.  The first time there is no previousitem*/
344    if (previousitem) {
345       /* knowing the treeWidgetItem, get the page from the hash */
346       previousPage = getFromHash(previousitem);
347       previousConsole = m_consoleHash.value(previousitem);
348       if (previousPage) {
349          previousConsole = previousPage->console();
350       } else if (previousConsole) {
351          previousPage = previousConsole;
352       }
353       if ((previousPage) || (previousConsole)) {
354          if (nextConsole != previousConsole) {
355             /* remove connections to the current console */
356             disconnect(actionConnect, SIGNAL(triggered()), previousConsole, SLOT(connect_dir()));
357             disconnect(actionStatusDir, SIGNAL(triggered()), previousConsole, SLOT(status_dir()));
358             disconnect(actionMessages, SIGNAL(triggered()), previousConsole, SLOT(messages()));
359             disconnect(actionSelectFont, SIGNAL(triggered()), previousConsole, SLOT(set_font()));
360             QTreeWidgetItem *dirItem = previousConsole->directorTreeItem();
361             QBrush greyBrush(Qt::lightGray);
362             dirItem->setBackground(0, greyBrush);
363          }
364       }
365    }
366
367    /* process the current (next) item */
368    
369    if ((nextPage) || (nextConsole)) {
370       if (nextConsole != previousConsole) {
371          /* make connections to the current console */
372          m_currentConsole = nextConsole;
373          connect(actionConnect, SIGNAL(triggered()), m_currentConsole, SLOT(connect_dir()));
374          connect(actionSelectFont, SIGNAL(triggered()), m_currentConsole, SLOT(set_font()));
375          connect(actionStatusDir, SIGNAL(triggered()), m_currentConsole, SLOT(status_dir()));
376          connect(actionMessages, SIGNAL(triggered()), m_currentConsole, SLOT(messages()));
377          /* Set director's tree widget background to magenta for ease of identification */
378          QTreeWidgetItem *dirItem = m_currentConsole->directorTreeItem();
379          QBrush magentaBrush(Qt::magenta);
380          dirItem->setBackground(0, magentaBrush);
381       }
382       /* set the value for the currently active console */
383       int stackindex = stackedWidget->indexOf(nextPage);
384    
385       /* Is this page currently on the stack or is it undocked */
386       if (stackindex >= 0) {
387          /* put this page on the top of the stack */
388          stackedWidget->setCurrentIndex(stackindex);
389       } else {
390          /* it is undocked, raise it to the front */
391          nextPage->raise();
392       }
393       /* for the page selectors menu action to dock or undock, set the text */
394       nextPage->setContextMenuDockText();
395
396       treeWidget->addAction(actionToggleDock);
397       /* if this page is closeable, and it has no childern, then add that action */
398       if ((nextPage->isCloseable()) && (currentitem->child(0) == NULL))
399          treeWidget->addAction(actionClosePage);
400
401       /* Add the actions to the Page Selectors tree widget that are part of the
402        * current items list of desired actions regardless of whether on top of stack*/
403       treeWidget->addActions(nextPage->m_contextActions);
404    }
405 }
406
407 void MainWin::labelButtonClicked() 
408 {
409    new labelPage();
410 }
411
412 void MainWin::runButtonClicked() 
413 {
414    new runPage("");
415 }
416
417 void MainWin::estimateButtonClicked() 
418 {
419    new estimatePage();
420 }
421
422 void MainWin::browseButtonClicked() 
423 {
424    new restoreTree();
425 }
426
427 void MainWin::restoreButtonClicked() 
428 {
429    new prerestorePage();
430 }
431
432 void MainWin::jobPlotButtonClicked()
433 {
434    JobPlotPass pass;
435    pass.use = false;
436    new JobPlot(NULL, pass);
437 }
438
439 /*
440  * The user just finished typing a line in the command line edit box
441  */
442 void MainWin::input_line()
443 {
444    QString cmdStr = lineEdit->text();    /* Get the text */
445    lineEdit->clear();                    /* clear the lineEdit box */
446    if (m_currentConsole->is_connected()) {
447       /* Use consoleInput to allow typing anything */
448       m_currentConsole->consoleInput(cmdStr);
449    } else {
450       set_status("Director not connected. Click on connect button.");
451    }
452    m_cmd_history.append(cmdStr);
453    m_cmd_last = -1;
454    if (treeWidget->currentItem() != getFromHash(m_currentConsole))
455       m_currentConsole->setCurrent();
456 }
457
458
459 void MainWin::about()
460 {
461    QMessageBox::about(this, tr("About bat"),
462       tr("<br><h2>bat 1.0, by Dirk H Bartley and Kern Sibbald</h2>"
463          "<p>Copyright &copy; " BYEAR " Free Software Foundation Europe e.V."
464          "<p>The <b>bat</b> is an administrative console"
465          " interface to the Director."));
466 }
467
468 void MainWin::help()
469 {
470    Help::displayFile("index.html");
471 }
472
473 void MainWin::set_statusf(const char *fmt, ...)
474 {
475    va_list arg_ptr;
476    char buf[1000];
477    int len;
478    va_start(arg_ptr, fmt);
479    len = bvsnprintf(buf, sizeof(buf), fmt, arg_ptr);
480    va_end(arg_ptr);
481    set_status(buf);
482 }
483
484 void MainWin::set_status_ready()
485 {
486    set_status(" Ready");
487 }
488
489 void MainWin::set_status(const char *buf)
490 {
491    statusBar()->showMessage(buf);
492 }
493
494 /*
495  * Function to respond to the button bar button to undock
496  */
497 void MainWin::undockWindowButton()
498 {
499    Pages* page = (Pages*)stackedWidget->currentWidget();
500    page->togglePageDocking();
501 }
502
503 /*
504  * Function to respond to action on page selector context menu to toggle the 
505  * dock status of the window associated with the page selectors current
506  * tree widget item.
507  */
508 void MainWin::toggleDockContextWindow()
509 {
510    QTreeWidgetItem *currentitem = treeWidget->currentItem();
511    
512    /* Is this a page that has been inserted into the hash  */
513    if (getFromHash(currentitem)) {
514       Pages* page = getFromHash(currentitem);
515       page->togglePageDocking();
516    }
517 }
518
519 /*
520  * This function is called when the stack item is changed.  Call
521  * the virtual function here.  Avoids a window being undocked leaving
522  * a window at the top of the stack unpopulated.
523  */
524 void MainWin::stackItemChanged(int)
525 {
526    if (m_isClosing) return; /* if closing the application, do nothing here */
527    Pages* page = (Pages*)stackedWidget->currentWidget();
528    /* run the virtual function in case this class overrides it */
529    page->currentStackItem();
530 }
531
532 /*
533  * Function to simplify insertion of QTreeWidgetItem <-> Page association
534  * into a double direction hash.
535  */
536 void MainWin::hashInsert(QTreeWidgetItem *item, Pages *page)
537 {
538    m_pagehash.insert(item, page);
539    m_widgethash.insert(page, item);
540 }
541
542 /*
543  * Function to simplify removal of QTreeWidgetItem <-> Page association
544  * into a double direction hash.
545  */
546 void MainWin::hashRemove(QTreeWidgetItem *item, Pages *page)
547 {
548    /* I had all sorts of return status checking code here.  Do we have a log
549     * level capability in bat.  I would have left it in but it used printf's
550     * and it should really be some kind of log level facility ???
551     * ******FIXME********/
552    m_pagehash.remove(item);
553    m_widgethash.remove(page);
554 }
555
556 /*
557  * Function to retrieve a Page* when the item in the page selector's tree is
558  * known.
559  */
560 Pages* MainWin::getFromHash(QTreeWidgetItem *item)
561 {
562    return m_pagehash.value(item);
563 }
564
565 /*
566  * Function to retrieve the page selectors tree widget item when the page is
567  * known.
568  */
569 QTreeWidgetItem* MainWin::getFromHash(Pages *page)
570 {
571    return m_widgethash.value(page);
572 }
573
574 /*
575  * Function to respond to action on page selector context menu to close the
576  * current window.
577  */
578 void MainWin::closePage()
579 {
580    QTreeWidgetItem *currentitem = treeWidget->currentItem();
581    
582    /* Is this a page that has been inserted into the hash  */
583    if (getFromHash(currentitem)) {
584       Pages* page = getFromHash(currentitem);
585       if (page->isCloseable()) {
586          page->closeStackPage();
587       }
588    }
589 }
590
591 /* Quick function to return the current console */
592 Console *MainWin::currentConsole()
593 {
594    return m_currentConsole;
595 }
596 /* Quick function to return the tree item for the director */
597 QTreeWidgetItem *MainWin::currentTopItem()
598 {
599    return m_currentConsole->directorTreeItem();
600 }
601
602 /* Preferences menu item clicked */
603 void MainWin::setPreferences()
604 {
605    prefsDialog prefs;
606    prefs.commDebug->setCheckState(m_commDebug ? Qt::Checked : Qt::Unchecked);
607    prefs.displayAll->setCheckState(m_displayAll ? Qt::Checked : Qt::Unchecked);
608    prefs.sqlDebug->setCheckState(m_sqlDebug ? Qt::Checked : Qt::Unchecked);
609    prefs.commandDebug->setCheckState(m_commandDebug ? Qt::Checked : Qt::Unchecked);
610    prefs.miscDebug->setCheckState(m_miscDebug ? Qt::Checked : Qt::Unchecked);
611    prefs.recordLimit->setCheckState(m_recordLimitCheck ? Qt::Checked : Qt::Unchecked);
612    prefs.recordSpinBox->setValue(m_recordLimitVal);
613    prefs.daysLimit->setCheckState(m_daysLimitCheck ? Qt::Checked : Qt::Unchecked);
614    prefs.daysSpinBox->setValue(m_daysLimitVal);
615    prefs.checkMessages->setCheckState(m_checkMessages ? Qt::Checked : Qt::Unchecked);
616    prefs.checkMessagesSpin->setValue(m_checkMessagesInterval);
617    prefs.executeLongCheckBox->setCheckState(m_longList ? Qt::Checked : Qt::Unchecked);
618    prefs.rtPopDirCheckBox->setCheckState(m_rtPopDirDebug ? Qt::Checked : Qt::Unchecked);
619    prefs.rtDirCurICCheckBox->setCheckState(m_rtDirCurICDebug ? Qt::Checked : Qt::Unchecked);
620    prefs.rtDirICCheckBox->setCheckState(m_rtDirICDebug ? Qt::Checked : Qt::Unchecked);
621    prefs.rtFileTabICCheckBox->setCheckState(m_rtFileTabICDebug ? Qt::Checked : Qt::Unchecked);
622    prefs.rtVerTabICCheckBox->setCheckState(m_rtVerTabICDebug ? Qt::Checked : Qt::Unchecked);
623    prefs.rtUpdateFTCheckBox->setCheckState(m_rtUpdateFTDebug ? Qt::Checked : Qt::Unchecked);
624    prefs.rtUpdateVTCheckBox->setCheckState(m_rtUpdateVTDebug ? Qt::Checked : Qt::Unchecked);
625    prefs.rtChecksCheckBox->setCheckState(m_rtChecksDebug ? Qt::Checked : Qt::Unchecked);
626    prefs.rtIconStateCheckBox->setCheckState(m_rtIconStateDebug ? Qt::Checked : Qt::Unchecked);
627    prefs.rtRestore1CheckBox->setCheckState(m_rtRestore1Debug ? Qt::Checked : Qt::Unchecked);
628    prefs.rtRestore2CheckBox->setCheckState(m_rtRestore2Debug ? Qt::Checked : Qt::Unchecked);
629    prefs.rtRestore3CheckBox->setCheckState(m_rtRestore3Debug ? Qt::Checked : Qt::Unchecked);
630    prefs.exec();
631 }
632
633 /* Preferences dialog */
634 prefsDialog::prefsDialog()
635 {
636    setupUi(this);
637 }
638
639 void prefsDialog::accept()
640 {
641    this->hide();
642    mainWin->m_commDebug = this->commDebug->checkState() == Qt::Checked;
643    mainWin->m_displayAll = this->displayAll->checkState() == Qt::Checked;
644    mainWin->m_sqlDebug = this->sqlDebug->checkState() == Qt::Checked;
645    mainWin->m_commandDebug = this->commandDebug->checkState() == Qt::Checked;
646    mainWin->m_miscDebug = this->miscDebug->checkState() == Qt::Checked;
647    mainWin->m_recordLimitCheck = this->recordLimit->checkState() == Qt::Checked;
648    mainWin->m_recordLimitVal = this->recordSpinBox->value();
649    mainWin->m_daysLimitCheck = this->daysLimit->checkState() == Qt::Checked;
650    mainWin->m_daysLimitVal = this->daysSpinBox->value();
651    mainWin->m_checkMessages = this->checkMessages->checkState() == Qt::Checked;
652    mainWin->m_checkMessagesInterval = this->checkMessagesSpin->value();
653    mainWin->m_longList = this->executeLongCheckBox->checkState() == Qt::Checked;
654
655    mainWin->m_rtPopDirDebug = this->rtPopDirCheckBox->checkState() == Qt::Checked;
656    mainWin->m_rtDirCurICDebug = this->rtDirCurICCheckBox->checkState() == Qt::Checked;
657    mainWin->m_rtDirICDebug = this->rtDirICCheckBox->checkState() == Qt::Checked;
658    mainWin->m_rtFileTabICDebug = this->rtFileTabICCheckBox->checkState() == Qt::Checked;
659    mainWin->m_rtVerTabICDebug = this->rtVerTabICCheckBox->checkState() == Qt::Checked;
660    mainWin->m_rtUpdateFTDebug = this->rtUpdateFTCheckBox->checkState() == Qt::Checked;
661    mainWin->m_rtUpdateVTDebug = this->rtUpdateVTCheckBox->checkState() == Qt::Checked;
662    mainWin->m_rtChecksDebug = this->rtChecksCheckBox->checkState() == Qt::Checked;
663    mainWin->m_rtIconStateDebug = this->rtIconStateCheckBox->checkState() == Qt::Checked;
664    mainWin->m_rtRestore1Debug = this->rtRestore1CheckBox->checkState() == Qt::Checked;
665    mainWin->m_rtRestore2Debug = this->rtRestore2CheckBox->checkState() == Qt::Checked;
666    mainWin->m_rtRestore3Debug = this->rtRestore3CheckBox->checkState() == Qt::Checked;
667
668    QSettings settings("www.bacula.org", "bat");
669    settings.beginGroup("Debug");
670    settings.setValue("commDebug", mainWin->m_commDebug);
671    settings.setValue("displayAll", mainWin->m_displayAll);
672    settings.setValue("sqlDebug", mainWin->m_sqlDebug);
673    settings.setValue("commandDebug", mainWin->m_commandDebug);
674    settings.setValue("miscDebug", mainWin->m_miscDebug);
675    settings.endGroup();
676    settings.beginGroup("JobList");
677    settings.setValue("recordLimitCheck", mainWin->m_recordLimitCheck);
678    settings.setValue("recordLimitVal", mainWin->m_recordLimitVal);
679    settings.setValue("daysLimitCheck", mainWin->m_daysLimitCheck);
680    settings.setValue("daysLimitVal", mainWin->m_daysLimitVal);
681    settings.endGroup();
682    settings.beginGroup("Messages");
683    settings.setValue("checkMessages", mainWin->m_checkMessages);
684    settings.setValue("checkMessagesInterval", mainWin->m_checkMessagesInterval);
685    settings.endGroup();
686    settings.beginGroup("Misc");
687    settings.setValue("longList", mainWin->m_longList);
688    settings.endGroup();
689    settings.beginGroup("RestoreTree");
690    settings.setValue("rtPopDirDebug", mainWin->m_rtPopDirDebug);
691    settings.setValue("rtDirCurICDebug", mainWin->m_rtDirCurICDebug);
692    settings.setValue("rtDirCurICRetDebug", mainWin->m_rtDirICDebug);
693    settings.setValue("rtFileTabICDebug", mainWin->m_rtFileTabICDebug);
694    settings.setValue("rtVerTabICDebug", mainWin->m_rtVerTabICDebug);
695    settings.setValue("rtUpdateFTDebug", mainWin->m_rtUpdateFTDebug);
696    settings.setValue("rtUpdateVTDebug", mainWin->m_rtUpdateVTDebug);
697    settings.setValue("rtChecksDebug", mainWin->m_rtChecksDebug);
698    settings.setValue("rtIconStateDebug", mainWin->m_rtIconStateDebug);
699    settings.setValue("rtRestore1Debug", mainWin->m_rtRestore1Debug);
700    settings.setValue("rtRestore2Debug", mainWin->m_rtRestore2Debug);
701    settings.setValue("rtRestore3Debug", mainWin->m_rtRestore3Debug);
702    settings.endGroup();
703    foreach(Console *console, mainWin->m_consoleHash) {
704       console->startTimer();
705    }
706 }
707
708 void prefsDialog::reject()
709 {
710    this->hide();
711    mainWin->set_status("Canceled");
712 }
713
714 /* read preferences for the prefences dialog box */
715 void MainWin::readPreferences()
716 {
717    QSettings settings("www.bacula.org", "bat");
718    settings.beginGroup("Debug");
719    m_commDebug = settings.value("commDebug", false).toBool();
720    m_displayAll = settings.value("displayAll", false).toBool();
721    m_sqlDebug = settings.value("sqlDebug", false).toBool();
722    m_commandDebug = settings.value("commandDebug", false).toBool();
723    m_miscDebug = settings.value("miscDebug", false).toBool();
724    settings.endGroup();
725    settings.beginGroup("JobList");
726    m_recordLimitCheck = settings.value("recordLimitCheck", true).toBool();
727    m_recordLimitVal = settings.value("recordLimitVal", 150).toInt();
728    m_daysLimitCheck = settings.value("daysLimitCheck", false).toBool();
729    m_daysLimitVal = settings.value("daysLimitVal", 28).toInt();
730    settings.endGroup();
731    settings.beginGroup("Messages");
732    m_checkMessages = settings.value("checkMessages", false).toBool();
733    m_checkMessagesInterval = settings.value("checkMessagesInterval", 28).toInt();
734    settings.endGroup();
735    settings.beginGroup("Misc");
736    m_longList = settings.value("longList", false).toBool();
737    settings.endGroup();
738    settings.beginGroup("RestoreTree");
739    m_rtPopDirDebug = settings.value("rtPopDirDebug", false).toBool();
740    m_rtDirCurICDebug = settings.value("rtDirCurICDebug", false).toBool();
741    m_rtDirICDebug = settings.value("rtDirCurICRetDebug", false).toBool();
742    m_rtFileTabICDebug = settings.value("rtFileTabICDebug", false).toBool();
743    m_rtVerTabICDebug = settings.value("rtVerTabICDebug", false).toBool();
744    m_rtUpdateFTDebug = settings.value("rtUpdateFTDebug", false).toBool();
745    m_rtUpdateVTDebug = settings.value("rtUpdateVTDebug", false).toBool();
746    m_rtChecksDebug = settings.value("rtChecksDebug", false).toBool();
747    m_rtIconStateDebug = settings.value("rtIconStateDebug", false).toBool();
748    m_rtRestore1Debug = settings.value("rtRestore1Debug", false).toBool();
749    m_rtRestore2Debug = settings.value("rtRestore2Debug", false).toBool();
750    m_rtRestore3Debug = settings.value("rtRestore3Debug", false).toBool();
751    settings.endGroup();
752 }