]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/qt-console/pages.cpp
bat: display a Warning symbole when having Errors>0 and Status=T
[bacula/bacula] / bacula / src / qt-console / pages.cpp
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2007-2009 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 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.
27 */
28 /*
29  *   Version $Id$
30  *
31  *   Dirk Bartley, March 2007
32  */
33
34 #include "bat.h"
35 #include "pages.h"
36
37 /* A global function */
38 bool isWin32Path(QString &fullPath) 
39 {
40    if (fullPath.size()<2) {
41       return false;
42    }
43
44    bool toret = fullPath[1].toAscii() == ':' && fullPath[0].isLetter();
45    if (mainWin->m_miscDebug) {
46       if (toret)
47          Pmsg1(000, "returning from isWin32Path true %s\n", fullPath.toUtf8().data());
48       else
49          Pmsg1(000, "returning from isWin32Path false %s\n", fullPath.toUtf8().data());
50    }
51    return toret;
52 }
53
54 /*
55  * dockPage
56  * This function is intended to be called from within the Pages class to pull
57  * a window from floating to in the stack widget.
58  */
59
60 void Pages::dockPage()
61 {
62    if (isDocked()) {
63       return;
64    }
65
66    /* These two lines are for making sure if it is being changed from a window
67     * that it has the proper window flag and parent.
68     */
69    setWindowFlags(Qt::Widget);
70
71    /* calculate the index that the tab should be inserted into */
72    int tabPos = 0;
73    QTreeWidgetItemIterator it(mainWin->treeWidget);
74    while (*it) {
75       Pages *somepage = mainWin->getFromHash(*it);
76       if (this == somepage) {
77          tabPos += 1;
78          break;
79       }
80       int pageindex = mainWin->tabWidget->indexOf(somepage);
81       if (pageindex != -1) { tabPos = pageindex; }
82       ++it;
83    }
84
85    /* This was being done already */
86    m_parent->insertTab(tabPos, this, m_name);
87
88    /* Set docked flag */
89    m_docked = true;
90    mainWin->tabWidget->setCurrentWidget(this);
91    /* lets set the page selectors action for docking or undocking */
92    setContextMenuDockText();
93
94 }
95
96 /*
97  * undockPage
98  * This function is intended to be called from within the Pages class to put
99  * a window from the stack widget to a floating window.
100  */
101
102 void Pages::undockPage()
103 {
104    if (!isDocked()) {
105       return;
106    }
107
108    /* Change from a stacked widget to a normal window */
109    m_parent->removeTab(m_parent->indexOf(this));
110    setWindowFlags(Qt::Window);
111    show();
112    /* Clear docked flag */
113    m_docked = false;
114    /* The window has been undocked, lets change the context menu */
115    setContextMenuDockText();
116 }
117
118 /*
119  * This function is intended to be called with the subclasses.  When it is 
120  * called the specific sublclass does not have to be known to Pages.  When it 
121  * is called this function will change the page from it's current state of being
122  * docked or undocked and change it to the other.
123  */
124
125 void Pages::togglePageDocking()
126 {
127    if (m_docked) {
128       undockPage();
129    } else {
130       dockPage();
131    }
132 }
133
134 /*
135  * This function is because I wanted for some reason to keep it protected but still 
136  * give any subclasses the ability to find out if it is currently stacked or not.
137  */
138 bool Pages::isDocked()
139 {
140    return m_docked;
141 }
142
143 /*
144  * To keep m_closeable protected as well
145  */
146 bool Pages::isCloseable()
147 {
148    return m_closeable;
149 }
150
151 /*
152  * When a window is closed, this slot is called.  The idea is to put it back in the
153  * stack here, and it works.  I wanted to get it to the top of the stack so that the
154  * user immediately sees where his window went.  Also, if he undocks the window, then
155  * closes it with the tree item highlighted, it may be confusing that the highlighted
156  * treewidgetitem is not the stack item in the front.
157  */
158
159 void Pages::closeEvent(QCloseEvent* event)
160 {
161    /* A Widget was closed, lets toggle it back into the window, and set it in front. */
162    dockPage();
163
164    /* this fixes my woes of getting the widget to show up on top when closed */
165    event->ignore();
166
167    /* Set the current tree widget item in the Page Selector window to the item 
168     * which represents "this" 
169     * Which will also bring "this" to the top of the stacked widget */
170    setCurrent();
171 }
172
173 /*
174  * The next three are virtual functions.  The idea here is that each subclass will have the
175  * built in virtual function to override if the programmer wants to populate the window
176  * when it it is first clicked.
177  */
178 void Pages::PgSeltreeWidgetClicked()
179 {
180 }
181
182 /*
183  *  Virtual function which is called when this page is visible on the stack.
184  *  This will be overridden by classes that want to populate if they are on the
185  *  top.
186  */
187 void Pages::currentStackItem()
188 {
189 }
190
191 /*
192  * Function to close the stacked page and remove the widget from the
193  * Page selector window
194  */
195 void Pages::closeStackPage()
196 {
197    /* First get the tree widget item and destroy it */
198    QTreeWidgetItem *item=mainWin->getFromHash(this);
199    /* remove the QTreeWidgetItem <-> page from the hash */
200    mainWin->hashRemove(item, this);
201    /* remove the item from the page selector by destroying it */
202    delete item;
203    /* remove this */
204    delete this;
205 }
206
207 /*
208  * Function to set members from the external mainwin and it's overload being
209  * passed a specific QTreeWidgetItem to be it's parent on the tree
210  */
211 void Pages::pgInitialize()
212 {
213    pgInitialize(QString(), NULL);
214 }
215
216 void Pages::pgInitialize(const QString &name)
217 {
218    pgInitialize(name, NULL);
219 }
220
221 void Pages::pgInitialize(const QString &tname, QTreeWidgetItem *parentTreeWidgetItem)
222 {
223    m_docked = false;
224    if (tname.size()) {
225       m_name = tname;
226    }
227    m_parent = mainWin->tabWidget;
228    m_console = mainWin->currentConsole();
229
230    if (!parentTreeWidgetItem) {
231       parentTreeWidgetItem = m_console->directorTreeItem();
232    }
233
234    QTreeWidgetItem *item = new QTreeWidgetItem(parentTreeWidgetItem);
235    QString name; 
236    treeWidgetName(name);
237    item->setText(0, name);
238    mainWin->hashInsert(item, this);
239    setTitle();
240 }
241
242 /*
243  * Virtual Function to return a name
244  * All subclasses should override this function
245  */
246 void Pages::treeWidgetName(QString &name)
247 {
248    name = m_name;
249 }
250
251 /*
252  * Function to simplify executing a console command and bringing the
253  * console to the front of the stack
254  */
255 void Pages::consoleCommand(QString &command)
256 {
257    consoleCommand(command, true);
258 }
259 void Pages::consoleCommand(QString &command, bool setCurrent)
260 {
261    int conn;
262    bool donotify = false;
263    if (m_console->availableDirComm(conn))  {
264       if (m_console->is_notify_enabled(conn)) {
265          donotify = true;
266          m_console->notify(conn, false);
267       }
268       consoleCommand(command, conn, setCurrent);
269       if (donotify) { m_console->notify(conn, true); }
270    }
271 }
272 void Pages::consoleCommand(QString &command, int conn)
273 {
274    consoleCommand(command, conn, true);
275 }
276 void Pages::consoleCommand(QString &command, int conn, bool setCurrent)
277 {
278    /* Bring this director's console to the front of the stack */
279    if (setCurrent) { setConsoleCurrent(); }
280    QString displayhtml("<font color=\"blue\">");
281    displayhtml += command + "</font>\n";
282    m_console->display_html(displayhtml);
283    m_console->display_text("\n");
284    mainWin->waitEnter();
285    m_console->write_dir(conn, command.toUtf8().data(), false);
286    m_console->displayToPrompt(conn);
287    mainWin->waitExit();
288 }
289
290 /*
291  * Function for handling undocked windows becoming active.
292  * Change the currently selected item in the page selector window to the now
293  * active undocked window.  This will also make the console for the undocked
294  * window m_currentConsole.
295  */
296 void Pages::changeEvent(QEvent *event)
297 {
298    if ((event->type() ==  QEvent::ActivationChange) && (isActiveWindow())) {
299       setCurrent();
300    }
301 }
302
303 /*
304  * Function to simplify getting the name of the class and the director into
305  * the caption or title of the window
306  */
307 void Pages::setTitle()
308 {
309    QString wdgname, director;
310    treeWidgetName(wdgname);
311    m_console->getDirResName(director);
312    QString title = tr("%1 of Director %2").arg(wdgname).arg(director);
313    setWindowTitle(title);
314 }
315
316 /*
317  * Bring the current directors console window to the top of the stack.
318  */
319 void Pages::setConsoleCurrent()
320 {
321    mainWin->treeWidget->setCurrentItem(mainWin->getFromHash(m_console));
322 }
323
324 /*
325  * Bring this window to the top of the stack.
326  */
327 void Pages::setCurrent()
328 {
329    mainWin->treeWidget->setCurrentItem(mainWin->getFromHash(this));
330 }
331
332 /*
333  * Function to set the text of the toggle dock context menu when page and
334  * widget item are NOT known.  
335  */
336 void Pages::setContextMenuDockText()
337 {
338    QTreeWidgetItem *item = mainWin->getFromHash(this);
339    QString docktext;
340    if (isDocked()) {
341       docktext = tr("UnDock %1 Window").arg(item->text(0));
342    } else {
343       docktext = tr("ReDock %1 Window").arg(item->text(0));
344    }
345       
346    mainWin->actionToggleDock->setText(docktext);
347    setTreeWidgetItemDockColor();
348 }
349
350 /*
351  * Function to set the color of the tree widget item based on whether it is
352  * docked or not.
353  */
354 void Pages::setTreeWidgetItemDockColor()
355 {
356    QTreeWidgetItem* item = mainWin->getFromHash(this);
357    if (item) {
358       if (item->text(0) != tr("Console")) {
359          if (isDocked()) {
360          /* Set the brush to blue if undocked */
361             QBrush blackBrush(Qt::black);
362             item->setForeground(0, blackBrush);
363          } else {
364          /* Set the brush back to black if docked */
365             QBrush blueBrush(Qt::blue);
366             item->setForeground(0, blueBrush);
367          }
368       }
369    }
370 }
371
372 /* Function to get a list of volumes */
373 void Pages::getVolumeList(QStringList &volumeList)
374 {
375    QString query("SELECT VolumeName AS Media FROM Media ORDER BY Media");
376    if (mainWin->m_sqlDebug) {
377       Pmsg1(000, "Query cmd : %s\n",query.toUtf8().data());
378    }
379    QStringList results;
380    if (m_console->sql_cmd(query, results)) {
381       QString field;
382       QStringList fieldlist;
383       /* Iterate through the lines of results. */
384       foreach (QString resultline, results) {
385          fieldlist = resultline.split("\t");
386          volumeList.append(fieldlist[0]);
387       } /* foreach resultline */
388    } /* if results from query */
389 }
390
391 /* Function to get a list of volumes */
392 void Pages::getStatusList(QStringList &statusLongList)
393 {
394    QString statusQuery("SELECT JobStatusLong FROM Status");
395    if (mainWin->m_sqlDebug) {
396       Pmsg1(000, "Query cmd : %s\n",statusQuery.toUtf8().data());
397    }
398    QStringList statusResults;
399    if (m_console->sql_cmd(statusQuery, statusResults)) {
400       QString field;
401       QStringList fieldlist;
402       /* Iterate through the lines of results. */
403       foreach (QString resultline, statusResults) {
404          fieldlist = resultline.split("\t");
405          statusLongList.append(fieldlist[0]);
406       } /* foreach resultline */
407    } /* if results from statusquery */
408 }