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