source: ntrip/trunk/BNC/bncwindow.cpp@ 109

Last change on this file since 109 was 108, checked in by mervart, 18 years ago

* empty log message *

File size: 13.8 KB
Line 
1
2/* -------------------------------------------------------------------------
3 * BKG NTRIP Client
4 * -------------------------------------------------------------------------
5 *
6 * Class: bncWindow
7 *
8 * Purpose: This class implements the main application window.
9 *
10 * Author: L. Mervart
11 *
12 * Created: 24-Dec-2005
13 *
14 * Changes:
15 *
16 * -----------------------------------------------------------------------*/
17
18#include "bncwindow.h"
19#include "bncgetthread.h"
20#include "bnctabledlg.h"
21
22using namespace std;
23
24// Constructor
25////////////////////////////////////////////////////////////////////////////
26bncWindow::bncWindow() {
27
28 int ww = QFontMetrics(this->font()).width('w');
29
30 setMinimumSize(90*ww, 80*ww);
31
32 // Create Actions
33 // --------------
34 _actHelp = new QAction(tr("&Help Contents"),this);
35 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
36
37 _actAbout = new QAction(tr("&About BNC"),this);
38 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
39
40 _actSaveOpt = new QAction(tr("&Save Options"),this);
41 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
42
43 _actQuit = new QAction(tr("&Quit"),this);
44 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
45
46 _actAddMountPoints = new QAction(tr("&Add Mountpoints"),this);
47 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
48
49 _actDeleteMountPoints = new QAction(tr("&Delete Mountpoints"),this);
50 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
51 _actDeleteMountPoints->setEnabled(false);
52
53 _actGetData = new QAction(tr("&Get Data"),this);
54 connect(_actGetData, SIGNAL(triggered()), SLOT(slotGetData()));
55
56 // Create Menus
57 // ------------
58 _menuFile = menuBar()->addMenu(tr("&File"));
59 _menuFile->addAction(_actSaveOpt);
60 _menuFile->addSeparator();
61 _menuFile->addAction(_actQuit);
62
63 _menuHlp = menuBar()->addMenu(tr("&Help"));
64 _menuHlp->addAction(_actHelp);
65 _menuHlp->addAction(_actAbout);
66
67 // Tool (Command) Bar
68 // ------------------
69 QToolBar* toolBar = new QToolBar;
70 addToolBar(Qt::BottomToolBarArea, toolBar);
71 toolBar->setMovable(false);
72 toolBar->addAction(_actAddMountPoints);
73 toolBar->addAction(_actDeleteMountPoints);
74 toolBar->addAction(_actGetData);
75
76 // Canvas with Editable Fields
77 // ---------------------------
78 _canvas = new QWidget;
79 setCentralWidget(_canvas);
80
81 QGridLayout* layout = new QGridLayout;
82 _canvas->setLayout(layout);
83
84 QSettings settings;
85
86 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
87 _proxyHostLineEdit->setMaximumWidth(12*ww);
88 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
89 _proxyPortLineEdit->setMaximumWidth(9*ww);
90 _timeOutLineEdit = new QLineEdit(settings.value("timeOut").toString());
91 _timeOutLineEdit->setMaximumWidth(9*ww);
92 _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
93 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
94 _outPortLineEdit->setMaximumWidth(9*ww);
95 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
96 _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
97 _rnxSkelLineEdit = new QLineEdit(settings.value("rnxSkel").toString());
98 _rnxSkelLineEdit->setMaximumWidth(5*ww);
99 _rnxIntrComboBox = new QComboBox();
100 _rnxIntrComboBox->setMaximumWidth(9*ww);
101 _rnxIntrComboBox->setEditable(false);
102 _rnxIntrComboBox->addItems(QString("15 min,1 hour,1 day").split(","));
103 int ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
104 if (ii != -1) {
105 _rnxIntrComboBox->setCurrentIndex(ii);
106 }
107 _rnxSamplSpinBox = new QSpinBox();
108 _rnxSamplSpinBox->setMinimum(0);
109 _rnxSamplSpinBox->setMaximum(60);
110 _rnxSamplSpinBox->setSingleStep(5);
111 _rnxSamplSpinBox->setMaximumWidth(9*ww);
112 _rnxSamplSpinBox->setValue(settings.value("rnxSampl").toInt());
113 _mountPointsTable = new QTableWidget(0,2);
114 _mountPointsTable->setMinimumWidth(60*ww);
115 _mountPointsTable->setMaximumHeight(20*ww);
116 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
117 _mountPointsTable->horizontalHeader()->hide();
118 _mountPointsTable->verticalHeader()->hide();
119 _mountPointsTable->setGridStyle(Qt::NoPen);
120 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
121 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
122 QListIterator<QString> it(settings.value("mountPoints").toStringList());
123 if (!it.hasNext()) {
124 _actGetData->setEnabled(false);
125 }
126 int iRow = 0;
127 while (it.hasNext()) {
128 QStringList hlp = it.next().split(" ");
129 if (hlp.size() <= 1) continue;
130 QString mPoint = hlp[0];
131 QString format = hlp[1];
132 _mountPointsTable->insertRow(iRow);
133 _mountPointsTable->setItem(iRow, 0, new QTableWidgetItem(mPoint));
134 _mountPointsTable->setItem(iRow, 1, new QTableWidgetItem(format));
135 iRow++;
136 }
137 _mountPointsTable->sortItems(0);
138
139 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
140 SLOT(slotSelectionChanged()));
141
142 _log = new QTextEdit();
143 _log->setMaximumHeight(120);
144 _log->setReadOnly(true);
145
146 layout->addWidget(new QLabel("Proxy host"), 0, 0);
147 layout->addWidget(_proxyHostLineEdit, 0, 1);
148 layout->addWidget(new QLabel("Proxy port"), 0, 2);
149 layout->addWidget(_proxyPortLineEdit, 0, 3);
150 layout->addWidget(new QLabel("timeout (sec)"), 1, 1);
151 layout->addWidget(_timeOutLineEdit, 1, 2);
152 layout->addWidget(new QLabel("ASCII output file (full path)"), 2, 1);
153 layout->addWidget(_outFileLineEdit, 2, 2, 1, 3);
154 layout->addWidget(new QLabel("port for binary output"), 3, 1);
155 layout->addWidget(_outPortLineEdit, 3, 2);
156 layout->addWidget(new QLabel("RINEX path"), 4, 1);
157 layout->addWidget(_rnxPathLineEdit, 4, 2, 1, 3);
158 layout->addWidget(new QLabel("RINEX script (full path)"), 5, 1);
159 layout->addWidget(_rnxScrpLineEdit, 5, 2, 1, 3);
160 layout->addWidget(new QLabel("RINEX file interval"), 6, 1);
161 layout->addWidget(_rnxIntrComboBox, 6, 2);
162
163 layout->addWidget(new QLabel("sampling (sec)"), 6, 3);
164 layout->addWidget(_rnxSamplSpinBox, 6, 4);
165
166
167 layout->addWidget(new QLabel("RINEX skeleton extension"), 7, 1);
168 layout->addWidget(_rnxSkelLineEdit, 7, 2);
169 layout->addWidget(new QLabel("Mountpoints"), 8, 0);
170 layout->addWidget(_mountPointsTable, 8, 1, 1, 4);
171 layout->addWidget(new QLabel("Log"), 9, 0);
172 layout->addWidget(_log, 9, 1, 1, 4);
173
174 _bncCaster = 0;
175}
176
177// Destructor
178////////////////////////////////////////////////////////////////////////////
179bncWindow::~bncWindow() {
180}
181
182// Retrieve Table
183////////////////////////////////////////////////////////////////////////////
184void bncWindow::slotAddMountPoints() {
185
186 QSettings settings;
187 QString proxyHost = settings.value("proxyHost").toString();
188 int proxyPort = settings.value("proxyPort").toInt();
189 if (proxyHost != _proxyHostLineEdit->text() ||
190 proxyPort != _proxyPortLineEdit->text().toInt()) {
191 int iRet = QMessageBox::question(this, "Question", "Proxy options "
192 "changed. Use the new ones?",
193 QMessageBox::Yes, QMessageBox::No,
194 QMessageBox::NoButton);
195 if (iRet == QMessageBox::Yes) {
196 settings.setValue("proxyHost", _proxyHostLineEdit->text());
197 settings.setValue("proxyPort", _proxyPortLineEdit->text());
198 }
199 }
200
201 bncTableDlg* dlg = new bncTableDlg(this);
202 dlg->move(this->pos().x()+50, this->pos().y()+50);
203 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
204 this, SLOT(slotNewMountPoints(QStringList*)));
205 dlg->exec();
206 delete dlg;
207
208}
209
210// Delete Selected Mount Points
211////////////////////////////////////////////////////////////////////////////
212void bncWindow::slotDeleteMountPoints() {
213 while(1) {
214 bool itemRemoved = false;
215 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
216 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,0))) {
217 _mountPointsTable->removeRow(iRow);
218 itemRemoved = true;
219 break;
220 }
221 }
222 if (!itemRemoved) {
223 break;
224 }
225 }
226 _actDeleteMountPoints->setEnabled(false);
227}
228
229// New Mount Points Selected
230////////////////////////////////////////////////////////////////////////////
231void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
232 int iRow = 0;
233 QListIterator<QString> it(*mountPoints);
234 while (it.hasNext()) {
235 QStringList hlp = it.next().split(" ");
236 QString mPoint = hlp[0];
237 QString format = hlp[1];
238 _mountPointsTable->insertRow(iRow);
239 _mountPointsTable->setItem(iRow, 0, new QTableWidgetItem(mPoint));
240 _mountPointsTable->setItem(iRow, 1, new QTableWidgetItem(format));
241 iRow++;
242 }
243 _mountPointsTable->sortItems(0);
244 if (mountPoints->count() > 0) {
245 _actGetData->setEnabled(true);
246 }
247 delete mountPoints;
248}
249
250// Save Options
251////////////////////////////////////////////////////////////////////////////
252void bncWindow::slotSaveOptions() {
253 QSettings settings;
254 settings.setValue("proxyHost", _proxyHostLineEdit->text());
255 settings.setValue("proxyPort", _proxyPortLineEdit->text());
256 settings.setValue("timeOut", _timeOutLineEdit->text());
257 settings.setValue("outFile", _outFileLineEdit->text());
258 settings.setValue("outPort", _outPortLineEdit->text());
259 settings.setValue("rnxPath", _rnxPathLineEdit->text());
260 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
261 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
262 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
263 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
264 QStringList mountPoints;
265 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
266 mountPoints.append(_mountPointsTable->item(iRow, 0)->text() +
267 " " + _mountPointsTable->item(iRow, 1)->text());
268 }
269 settings.setValue("mountPoints", mountPoints);
270}
271
272// All get slots terminated
273////////////////////////////////////////////////////////////////////////////
274void bncWindow::slotGetThreadErrors() {
275 slotMessage("All Get Threads Terminated");
276 _actAddMountPoints->setEnabled(true);
277 _actGetData->setEnabled(true);
278}
279
280// Retrieve Data
281////////////////////////////////////////////////////////////////////////////
282void bncWindow::slotGetData() {
283 _actAddMountPoints->setEnabled(false);
284 _actDeleteMountPoints->setEnabled(false);
285 _actGetData->setEnabled(false);
286
287 _bncCaster = new bncCaster(_outFileLineEdit->text(),
288 _outPortLineEdit->text().toInt());
289
290 connect(_bncCaster, SIGNAL(getThreadErrors()),
291 this, SLOT(slotGetThreadErrors()));
292
293 connect(_bncCaster, SIGNAL(newMessage(const QByteArray&)),
294 this, SLOT(slotMessage(const QByteArray&)));
295
296 _bncCaster->start();
297
298 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
299 QUrl url(_mountPointsTable->item(iRow, 0)->text());
300 QByteArray format = _mountPointsTable->item(iRow, 1)->text().toAscii();
301
302 bncGetThread* getThread = new bncGetThread(url, format);
303
304 connect(getThread, SIGNAL(newMessage(const QByteArray&)),
305 this, SLOT(slotMessage(const QByteArray&)));
306
307 _bncCaster->addGetThread(getThread);
308
309 getThread->start();
310 }
311}
312
313// Close Application gracefully
314////////////////////////////////////////////////////////////////////////////
315void bncWindow::closeEvent(QCloseEvent* event) {
316
317 int iRet = QMessageBox::question(this, "Close", "Save Options?",
318 QMessageBox::Yes, QMessageBox::No,
319 QMessageBox::Cancel);
320
321 if (iRet == QMessageBox::Cancel) {
322 event->ignore();
323 return;
324 }
325 else if (iRet == QMessageBox::Yes) {
326 slotSaveOptions();
327 }
328
329 return QMainWindow::closeEvent(event);
330}
331
332// User changed the selection of mountPoints
333////////////////////////////////////////////////////////////////////////////
334void bncWindow::slotSelectionChanged() {
335 if (_mountPointsTable->selectedItems().isEmpty()) {
336 _actDeleteMountPoints->setEnabled(false);
337 }
338 else {
339 _actDeleteMountPoints->setEnabled(true);
340 }
341}
342
343// Display Program Messages
344////////////////////////////////////////////////////////////////////////////
345void bncWindow::slotMessage(const QByteArray& msg) {
346
347 const int maxBufferSize = 10000;
348
349 QString txt = _log->toPlainText() + "\n" + msg;
350 _log->clear();
351 _log->append(txt.right(maxBufferSize));
352}
353
354// About Message
355////////////////////////////////////////////////////////////////////////////
356void bncWindow::slotAbout() {
357
358 QString str("BKG NTRIP Client\n"
359 "Author: L. Mervart\n"
360 "Version 1.0");
361
362 QMessageBox::information(this, "About", str, QMessageBox::Ok);
363}
364
365// Help Window
366////////////////////////////////////////////////////////////////////////////
367void bncWindow::slotHelp() {
368
369 QString str("<h3>BNC Help</h3>"
370 "<p>"
371 "Program bnc can be used in interactive mode or "
372 "in a non-interactive mode."
373 "</p>"
374 "<p>"
375 "Non-interactive mode is invoked by -nw switch."
376 "On Unix (Linux) the standard X-window switches "
377 "like -fn 10x20 work. Program appearance can "
378 "be changed by e.g. -style motif switch."
379 "</p>");
380
381 QTextBrowser* tb = new QTextBrowser;
382 tb->setHtml(str);
383 tb->setReadOnly(true);
384 tb->show();
385
386 QDialog* dlg = new QDialog(this);
387
388 QVBoxLayout* dlgLayout = new QVBoxLayout();
389 dlgLayout->addWidget(tb);
390
391 dlg->setLayout(dlgLayout);
392 dlg->show();
393}
Note: See TracBrowser for help on using the repository browser.