]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/qt-console/mainwin.cpp
fa81992be0426d1e06187559ab75c13664bd54a2
[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 "medialist/medialist.h"
40
41 MainWin::MainWin(QWidget *parent) : QMainWindow(parent)
42 {
43
44    mainWin = this;
45    setupUi(this);                     /* Setup UI defined by main.ui (designer) */
46    treeWidget->clear();
47    treeWidget->setColumnCount(1);
48    treeWidget->setHeaderLabel("Select Page");
49
50    m_pages = 0;
51    createPages();
52
53    resetFocus();
54
55    createConnections();
56
57    this->show();
58
59    readSettings();
60
61    m_console->connect();
62    m_medialist->populateTree();
63 }
64
65 void MainWin::createPages()
66 {
67    DIRRES *dir;
68    QTreeWidgetItem *item, *topItem;
69
70    /* Create console tree stacked widget item */
71    m_console = new Console(stackedWidget);
72    /* Console is special needs director*/
73    /* Just take the first Director */
74    LockRes();
75    dir = (DIRRES *)GetNextRes(R_DIRECTOR, NULL);
76    m_console->setDirRes(dir);
77    UnlockRes();
78    /* The top tree item representing the director */
79    topItem = createTopPage(dir->name(), false);
80    topItem->setIcon(0, QIcon(QString::fromUtf8("images/server.png")));
81    /* Create Tree Widget Item */
82    item = createPage("Console", topItem, true);
83    /* Append to bstacklist */
84    m_bstacklist.append(m_console);
85    /* FIXME Associate tree item with console, may not be needed. */
86    m_console->setTreeItem(item);
87    /* Set BatStack m_treeItem */
88    m_console->SetBSTreeWidgetItem(item);
89    QBrush redBrush(Qt::red);
90    item->setForeground(0, redBrush);
91
92    /* Now with the console created, on with the rest, these are easy */
93    /* All should be
94  * 1. create tree widget item
95  * 2. create object passing pointer to tree widget item (modified constructors to pass QTreeWidget pointers)
96  * 3. append to stacklist  */ 
97
98    /* brestore */
99    item = createPage("brestore", topItem, true);
100    m_brestore = new bRestore(stackedWidget,item);
101    m_bstacklist.append(m_brestore);
102
103    /* lastly for now, the medialist */
104    item = createPage("Storage Tree", topItem, true);
105    m_medialist = new MediaList(stackedWidget, m_console, item);
106    m_bstacklist.append(m_medialist);
107
108    /* Iterate through and add to the stack */
109    for ( QList<BatStack*>::iterator bstackItem = m_bstacklist.begin(); bstackItem != m_bstacklist.end(); ++bstackItem ) {
110       (*bstackItem)->AddTostack();
111    }
112
113    treeWidget->expandItem(topItem);
114    stackedWidget->setCurrentIndex(0);
115 }
116
117 /* FIXME These Two are not needed any more because UserRole is not used. */
118 /* Create a root Tree Widget */
119 QTreeWidgetItem *MainWin::createTopPage(char *name, bool canDisplay)
120 {
121    QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget);
122    item->setText(0, name);
123    if (canDisplay) {
124       item->setData(0, Qt::UserRole, QVariant(m_pages++));
125    } else {
126       item->setData(0, Qt::UserRole, QVariant(-1));
127    }
128    return item;
129 }
130
131 /* Create A Tree Widget Item which will be associated with a Page in the stacked widget */
132 QTreeWidgetItem *MainWin::createPage(char *name, QTreeWidgetItem *parent, bool canDisplay)
133 {
134    QTreeWidgetItem *item = new QTreeWidgetItem(parent);
135    item->setText(0, name);
136    if (canDisplay) {
137       item->setData(0, Qt::UserRole, QVariant(m_pages++));
138    } else {
139       item->setData(0, Qt::UserRole, QVariant(-1));
140    }
141    return item;
142 }
143
144 /*
145  * Handle up and down arrow keys for the command line
146  *  history.
147  */
148 void MainWin::keyPressEvent(QKeyEvent *event)
149 {
150    if (m_cmd_history.size() == 0) {
151       event->ignore();
152       return;
153    }
154    switch (event->key()) {
155    case Qt::Key_Down:
156       if (m_cmd_last < 0 || m_cmd_last >= (m_cmd_history.size()-1)) {
157          event->ignore();
158          return;
159       }
160       m_cmd_last++;
161       break;
162    case Qt::Key_Up:
163       if (m_cmd_last == 0) {
164          event->ignore();
165          return;
166       }
167       if (m_cmd_last < 0 || m_cmd_last > (m_cmd_history.size()-1)) {
168          m_cmd_last = m_cmd_history.size() - 1;
169       } else {
170          m_cmd_last--;
171       }
172       break;
173    default:
174       event->ignore();
175       return;
176    }
177    lineEdit->setText(m_cmd_history[m_cmd_last]);
178 }
179
180 void MainWin::createConnections()
181 {
182    /* Connect signals to slots */
183    connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
184    connect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
185
186    connect(treeWidget, SIGNAL(itemActivated(QTreeWidgetItem *, int)), this, 
187            SLOT(treeItemClicked(QTreeWidgetItem *, int)));
188    connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, 
189            SLOT(treeItemClicked(QTreeWidgetItem *, int)));
190    connect(treeWidget, SIGNAL(itemPressed(QTreeWidgetItem *, int)), this, 
191            SLOT(treeItemClicked(QTreeWidgetItem *, int)));
192    connect(treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, 
193            SLOT(treeItemDoubleClicked(QTreeWidgetItem *, int)));
194
195    connect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
196    connect(actionConnect, SIGNAL(triggered()), m_console, SLOT(connect()));
197    connect(actionStatusDir, SIGNAL(triggered()), m_console, SLOT(status_dir()));
198    connect(actionSelectFont, SIGNAL(triggered()), m_console, SLOT(set_font()));
199    connect(actionLabel, SIGNAL(triggered()), this,  SLOT(labelDialogClicked()));
200    connect(actionRun, SIGNAL(triggered()), this,  SLOT(runDialogClicked()));
201    connect(actionRestore, SIGNAL(triggered()), this,  SLOT(restoreDialogClicked()));
202 }
203
204 /* 
205  * Reimplementation of QWidget closeEvent virtual function   
206  */
207 void MainWin::closeEvent(QCloseEvent *event)
208 {
209    writeSettings();
210    m_console->writeSettings();
211    m_console->terminate();
212    event->accept();
213 }
214
215 void MainWin::writeSettings()
216 {
217    QSettings settings("bacula.org", "bat");
218
219    settings.beginGroup("MainWin");
220    settings.setValue("winSize", size());
221    settings.setValue("winPos", pos());
222    settings.endGroup();
223 }
224
225 void MainWin::readSettings()
226
227    QSettings settings("bacula.org", "bat");
228
229    settings.beginGroup("MainWin");
230    resize(settings.value("winSize", QSize(1041, 801)).toSize());
231    move(settings.value("winPos", QPoint(200, 150)).toPoint());
232    settings.endGroup();
233 }
234
235 void MainWin::treeItemClicked(QTreeWidgetItem *item, int column)
236 {
237    /* Iterate through and find the tree widget item clicked */
238    column+=0;
239    for ( QList<BatStack*>::iterator bstackItem = m_bstacklist.begin(); bstackItem != m_bstacklist.end(); ++bstackItem ) {
240       if ( item == (*bstackItem)->m_treeItem ) {
241          int stackindex=stackedWidget->indexOf( *bstackItem );
242          if( stackindex >= 0 ){
243             stackedWidget->setCurrentIndex(stackindex);
244          }
245       }
246    }
247 }
248
249 /*
250  */
251 void MainWin::treeItemDoubleClicked(QTreeWidgetItem *item, int column)
252 {
253    /* Iterate through and find the tree widget item double clicked */
254    column+=0;
255    for ( QList<BatStack*>::iterator bstackItem = m_bstacklist.begin(); bstackItem != m_bstacklist.end(); ++bstackItem ) {
256       if ( item == (*bstackItem)->m_treeItem ) {
257          (*bstackItem)->Togglestack();
258       }
259    }
260 }
261
262 void MainWin::labelDialogClicked() 
263 {
264    new labelDialog(m_console);
265 }
266
267 void MainWin::runDialogClicked() 
268 {
269    new runDialog(m_console);
270 }
271
272 void MainWin::restoreDialogClicked() 
273 {
274    new prerestoreDialog(m_console);
275 }
276
277
278
279 /*
280  * The user just finished typing a line in the command line edit box
281  */
282 void MainWin::input_line()
283 {
284    QString cmdStr = lineEdit->text();    /* Get the text */
285    lineEdit->clear();                    /* clear the lineEdit box */
286    if (m_console->is_connected()) {
287       m_console->display_text(cmdStr + "\n");
288       m_console->write_dir(cmdStr.toUtf8().data());         /* send to dir */
289    } else {
290       set_status("Director not connected. Click on connect button.");
291    }
292    m_cmd_history.append(cmdStr);
293    m_cmd_last = -1;
294 }
295
296
297 void MainWin::about()
298 {
299    QMessageBox::about(this, tr("About bat"),
300             tr("<br><h2>bat 0.2, by Kern Sibbald</h2>"
301             "<p>Copyright &copy; " BYEAR " Free Software Foundation Europe e.V."
302             "<p>The <b>bat</b> is an administrative console"
303                " interface to the Director."));
304 }
305
306 void MainWin::set_statusf(const char *fmt, ...)
307 {
308    va_list arg_ptr;
309    char buf[1000];
310    int len;
311    va_start(arg_ptr, fmt);
312    len = bvsnprintf(buf, sizeof(buf), fmt, arg_ptr);
313    va_end(arg_ptr);
314    set_status(buf);
315 }
316
317 void MainWin::set_status_ready()
318 {
319    set_status(" Ready");
320 }
321
322 void MainWin::set_status(const char *buf)
323 {
324    statusBar()->showMessage(buf);
325 }