source: ntrip/trunk/BNC/src/bnctabledlg.cpp@ 4280

Last change on this file since 4280 was 4278, checked in by mervart, 12 years ago
File size: 24.4 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: bncTableDlg
30 *
31 * Purpose: Displays the source table, allows mountpoints selection
32 *
33 * Author: L. Mervart
34 *
35 * Created: 24-Dec-2005
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42
43#include "bnctabledlg.h"
44#include "bncgetthread.h"
45#include "bncnetqueryv1.h"
46#include "bncnetqueryv2.h"
47#include "bncsettings.h"
48#include "bncmap.h"
49
50using namespace std;
51
52// Constructor
53////////////////////////////////////////////////////////////////////////////
54bncTableDlg::bncTableDlg(QWidget* parent) : QDialog(parent) {
55
56 setMinimumSize(600,400);
57 setWindowTitle(tr("Add Streams from Caster"));
58
59 QVBoxLayout* mainLayout = new QVBoxLayout(this);
60
61 int ww = QFontMetrics(font()).width('w');
62
63 _casterPortLineEdit = new QLineEdit();
64 _casterPortLineEdit->setMaximumWidth(9*ww);
65
66 _casterUserLineEdit = new QLineEdit();
67 _casterUserLineEdit->setMaximumWidth(9*ww);
68
69 _casterPasswordLineEdit = new QLineEdit();
70 _casterPasswordLineEdit->setMaximumWidth(9*ww);
71 _casterPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
72
73 _casterHostComboBox = new QComboBox();
74 _casterHostComboBox->setMaxCount(10);
75 _casterHostComboBox->setDuplicatesEnabled(false);
76 _casterHostComboBox->setEditable(true);
77 _casterHostComboBox->setMinimumWidth(20*ww);
78 _casterHostComboBox->setMaximumWidth(20*ww);
79 connect(_casterHostComboBox, SIGNAL(currentIndexChanged(const QString&)),
80 this, SLOT(slotCasterHostChanged(const QString&)));
81 bncSettings settings;
82 settings.remove("casterHostList");
83 settings.remove("casterHost");
84 settings.remove("casterPort");
85 settings.remove("casterUser");
86 settings.remove("casterPassword");
87 QStringList casterUrlList = settings.value("casterUrlList").toStringList();
88 for (int ii = 0; ii < casterUrlList.count(); ii++) {
89 QUrl url(casterUrlList[ii]);
90 _casterHostComboBox->addItem(url.host());
91 }
92
93 _ntripVersionComboBox = new QComboBox();
94 _ntripVersionComboBox->addItems(QString("1,2,2s,R,U").split(","));
95 int kk = _ntripVersionComboBox->findText(settings.value("ntripVersion").toString());
96 if (kk != -1) {
97 _ntripVersionComboBox->setCurrentIndex(kk);
98 }
99 _ntripVersionComboBox->setMaximumWidth(5*ww);
100
101 _buttonCasterTable = new QPushButton(tr("Show"), this);
102 connect(_buttonCasterTable, SIGNAL(clicked()), this, SLOT(slotCasterTable()));
103 _buttonCasterTable->setMaximumWidth(5*ww);
104
105 // WhatsThis
106 // ---------
107 _casterUserLineEdit->setWhatsThis(tr("<p>Access to some streams on NTRIP broadcasters may be restricted. You'll need to enter a valid 'User ID' and 'Password' for access to these protected streams.</p><p>Accounts are usually provided per NTRIP broadcaster through a registration process. Register through <u>http://igs.bkg.bund.de/index_ntrip_reg.htm</u> for access to protected streams on <u>www.euref-ip.net</u> and <u>www.igs-ip.net</u>.</p>"));
108 _casterHostComboBox->setWhatsThis(tr("<p>Enter the NTRIP broadcaster hostname or IP number.</p><p>Note that EUREF and IGS operate NTRIP broadcasters at <u>http://www.euref-ip.net/home</u> and <u>http://www.igs-ip.net/home</u>.</p>"));
109 _casterPortLineEdit->setWhatsThis(tr("Enter the NTRIP broadcaster port number."));
110 _casterPasswordLineEdit->setWhatsThis(tr("Access to some streams on NTRIP broadcasters may be restricted. You'll need to enter a valid 'Password' for access to these protected streams."));
111
112 QGridLayout* editLayout = new QGridLayout;
113 editLayout->addWidget(new QLabel(tr("Caster host")), 0, 0);
114 editLayout->addWidget(_casterHostComboBox, 0, 1);
115 editLayout->addWidget(new QLabel(tr(" Caster port")), 0, 2, Qt::AlignRight);
116 editLayout->addWidget(_casterPortLineEdit, 0, 3);
117 editLayout->addWidget(new QLabel(tr("Casters table")), 0, 4, Qt::AlignRight);
118 editLayout->addWidget(_buttonCasterTable, 0, 5);
119 editLayout->addWidget(new QLabel(tr("User")), 1, 0, Qt::AlignRight);
120 editLayout->addWidget(_casterUserLineEdit, 1, 1);
121 editLayout->addWidget(new QLabel(tr("Password")), 1, 2, Qt::AlignRight);
122 editLayout->addWidget(_casterPasswordLineEdit, 1, 3);
123 editLayout->addWidget(new QLabel(tr(" NTRIP Version")),1, 4, Qt::AlignRight);
124 editLayout->addWidget(_ntripVersionComboBox, 1, 5);
125
126 mainLayout->addLayout(editLayout);
127
128 _buttonCasterTable->setWhatsThis(tr("<p>Hit 'Show' for a table of known NTRIP broadcaster installations as maintained at <u>www.rtcm-ntrip.org/home.</u></p><p>A window opens which allows to select a broadcaster for stream retrieval.</p>"));
129 _ntripVersionComboBox->setWhatsThis(tr("<p>Select the NTRIP transport protocol version you want to use. Implemented options are:<br>&nbsp; 1:&nbsp; NTRIP version 1, TCP/IP<br>&nbsp; 2:&nbsp; NTRIP version 2, TCP/IP mode<br>&nbsp; 2s:&nbsp; NTRIP version 2 TCP/IP mode via SSL<br>&nbsp; R:&nbsp; NTRIP Version 2, RTSP/RTP mode<br>&nbsp; U:&nbsp; NTRIP Version 2, UDP mode<br>Select option '1' if you are not sure whether the NTRIP broadcaster supports NTRIP version 2.</p><p>Note that RTSP/RTP (option 'R') and UDP (option 'U') are not accepted by proxies and sometimes not supported by mobile Internet Service Providers.</p>"));
130
131 _table = new QTableWidget(this);
132 _table->setWhatsThis(tr("<p>Use the 'Get Table' button to download the sourcetable from the selected NTRIP broadcaster. Select the desired streams line by line, using +Shift and +Ctrl when necessary. Hit 'OK' to return to the main window.</p><p>Pay attention to data field 'format'. Keep in mind that BNC can only decode and convert streams that come in RTCM Version 2.x, or RTCM Version 3.x format. See data field 'format-details' for available message types and their repetition rates in brackets.</p><p>The content of data field 'nmea' tells you whether a stream comes from a virtual reference station (VRS).</p>"));
133 connect(_table, SIGNAL(itemSelectionChanged()),
134 this, SLOT(slotSelectionChanged()));
135 mainLayout->addWidget(_table);
136
137 _buttonWhatsThis = new QPushButton(tr("Help=Shift+F1"), this);
138 connect(_buttonWhatsThis, SIGNAL(clicked()), this, SLOT(slotWhatsThis()));
139
140 _buttonGet = new QPushButton(tr("Get table"), this);
141 _buttonGet->setDefault(true);
142 connect(_buttonGet, SIGNAL(clicked()), this, SLOT(slotGetTable()));
143
144 _buttonMap = new QPushButton(tr("Map"), this);
145 _buttonMap->setEnabled(false);
146 connect(_buttonMap, SIGNAL(clicked()), this, SLOT(slotShowMap()));
147
148 _buttonClose = new QPushButton(tr("Close"), this);
149 connect(_buttonClose, SIGNAL(clicked()), this, SLOT(close()));
150
151 _buttonSelect = new QPushButton(tr("Select"), this);
152 connect(_buttonSelect, SIGNAL(clicked()), this, SLOT(select()));
153
154 QHBoxLayout* buttonLayout = new QHBoxLayout;
155 buttonLayout->addWidget(_buttonWhatsThis);
156 buttonLayout->addStretch(1);
157 buttonLayout->addWidget(_buttonMap);
158 buttonLayout->addWidget(_buttonGet);
159 buttonLayout->addWidget(_buttonSelect);
160 buttonLayout->addWidget(_buttonClose);
161
162 mainLayout->addLayout(buttonLayout);
163}
164
165// Destructor
166////////////////////////////////////////////////////////////////////////////
167bncTableDlg::~bncTableDlg() {
168 delete _casterHostComboBox;
169 delete _casterPortLineEdit;
170 delete _casterUserLineEdit;
171 delete _casterPasswordLineEdit;
172 bncSettings settings;
173 settings.setValue("ntripVersion", _ntripVersionComboBox->currentText());
174 delete _ntripVersionComboBox;
175 delete _buttonGet;
176 delete _buttonClose;
177 delete _buttonSelect;
178 delete _buttonWhatsThis;
179 delete _buttonCasterTable;
180 delete _table;
181}
182
183// Read full caster table (static)
184////////////////////////////////////////////////////////////////////////////
185t_irc bncTableDlg::getFullTable(const QString& ntripVersion,
186 const QString& casterHost,
187 int casterPort, QStringList& allLines,
188 bool alwaysRead) {
189
190 static QMutex mutex;
191 static QMap<QString, QStringList> allTables;
192
193 QMutexLocker locker(&mutex);
194
195 if (!alwaysRead && allTables.find(casterHost) != allTables.end()) {
196 allLines = allTables.find(casterHost).value();
197 return success;
198 }
199
200 allLines.clear();
201
202 bncNetQuery* query = 0;
203 if (ntripVersion == "2") {
204 query = new bncNetQueryV2(false);
205 }
206 else if (ntripVersion == "2s") {
207 query = new bncNetQueryV2(true);
208 }
209 else {
210 query = new bncNetQueryV1();
211 }
212
213 QUrl url;
214 url.setHost(casterHost);
215 url.setPort(casterPort);
216 url.setPath("/");
217 if (ntripVersion == "2s") {
218 url.setScheme("https");
219 }
220 else {
221 url.setScheme("http");
222 }
223
224 QByteArray outData;
225 query->waitForRequestResult(url, outData);
226 if (query->status() == bncNetQuery::finished) {
227 QTextStream in(outData);
228 QString line = in.readLine();
229 while ( !line.isNull() ) {
230 allLines.append(line);
231 line = in.readLine();
232 }
233 allTables.insert(casterHost, allLines);
234 delete query;
235 return success;
236 }
237 else {
238 delete query;
239 return failure;
240 }
241}
242
243// Read Table from Caster
244////////////////////////////////////////////////////////////////////////////
245void bncTableDlg::slotGetTable() {
246
247 _buttonGet->setEnabled(false);
248 _buttonMap->setEnabled(true);
249 _buttonCasterTable->setEnabled(false);
250
251 if ( getFullTable(_ntripVersionComboBox->currentText(),
252 _casterHostComboBox->currentText(),
253 _casterPortLineEdit->text().toInt(),
254 _allLines, true) != success ) {
255 QMessageBox::warning(0, "BNC", "Cannot retrieve table of data");
256 _buttonGet->setEnabled(true);
257 return;
258 }
259
260 static const QStringList labels = QString("mountpoint,identifier,format,"
261 "format-details,carrier,system,network,country,lat,long,"
262 "nmea,solution,generator,compress.,auth.,fee,bitrate,"
263 "misc").split(",");
264
265 QStringList lines;
266 QStringListIterator it(_allLines);
267 while (it.hasNext()) {
268 QString line = it.next();
269 if (line.indexOf("STR") == 0) {
270 QStringList hlp = line.split(";");
271 if (hlp.size() > labels.size()) {
272 lines.push_back(line);
273 }
274 }
275 }
276
277 if (lines.size() > 0) {
278 _table->setSelectionMode(QAbstractItemView::ExtendedSelection);
279 _table->setSelectionBehavior(QAbstractItemView::SelectRows);
280 _table->setColumnCount(labels.size());
281 _table->setRowCount(lines.size());
282 for (int nRow = 0; nRow < lines.size(); nRow++) {
283 QStringList columns = lines[nRow].split(";");
284 for (int ic = 1; ic < columns.size(); ic++) {
285 if (ic == 11) {
286 if (columns[ic] == "0") {
287 columns[ic] = "no";
288 } else {
289 columns[ic] = "yes";
290 }
291 }
292 QTableWidgetItem* item = new QTableWidgetItem(columns[ic]);
293 item->setFlags(item->flags() & ~Qt::ItemIsEditable);
294 _table->setItem(nRow, ic-1, item);
295 }
296 }
297 _table->setHorizontalHeaderLabels(labels);
298 _table->setSortingEnabled(true);
299 int ww = QFontMetrics(this->font()).width('w');
300 _table->horizontalHeader()->resizeSection( 0,10*ww);
301 _table->horizontalHeader()->resizeSection( 1,10*ww);
302 _table->horizontalHeader()->resizeSection( 2, 8*ww);
303 _table->horizontalHeader()->resizeSection( 3,22*ww);
304 _table->horizontalHeader()->resizeSection( 4, 5*ww);
305 _table->horizontalHeader()->resizeSection( 5, 8*ww);
306 _table->horizontalHeader()->resizeSection( 6, 8*ww);
307 _table->horizontalHeader()->resizeSection( 7, 7*ww);
308 _table->horizontalHeader()->resizeSection( 8, 6*ww);
309 _table->horizontalHeader()->resizeSection( 9, 6*ww);
310 _table->horizontalHeader()->resizeSection(10, 6*ww);
311 _table->horizontalHeader()->resizeSection(11, 6*ww);
312 _table->horizontalHeader()->resizeSection(12,15*ww);
313 _table->horizontalHeader()->resizeSection(13, 8*ww);
314 _table->horizontalHeader()->resizeSection(14, 5*ww);
315 _table->horizontalHeader()->resizeSection(15, 5*ww);
316 _table->horizontalHeader()->resizeSection(16, 7*ww);
317 _table->horizontalHeader()->resizeSection(17,15*ww);
318 _table->sortItems(0);
319 }
320}
321
322// Show world map
323////////////////////////////////////////////////////////////////////////////
324void bncTableDlg::slotShowMap() {
325
326 bncMap* winMap = new bncMap(this);
327 winMap->setGeometry( x(), int(y()+height()*1.3), 880, 440 );
328
329 connect(this, SIGNAL(newPoint(QPointF, QString, QPen, double)),
330 winMap, SLOT(slotNewPoint(QPointF, QString, QPen, double)));
331
332 connect(this, SIGNAL(fitMap()),
333 winMap, SLOT(slotFitMap() ));
334
335 connect(this, SIGNAL(fitFont()),
336 winMap, SLOT(slotFitFont() ));
337
338 _buttonMap->setEnabled(false);
339 showSourceTable();
340 winMap->exec();
341 _buttonMap->setEnabled(true);
342
343 disconnect(this, SIGNAL(newPoint(QPointF, QString, QPen, double)),
344 winMap, SLOT(slotNewPoint(QPointF, QString, QPen, double)));
345
346 disconnect(this, SIGNAL(fitMap()),
347 winMap, SLOT(slotFitMap() ));
348
349 disconnect(this, SIGNAL(fitFont()),
350 winMap, SLOT(slotFitFont() ));
351
352 delete winMap;
353}
354
355// Show world map
356////////////////////////////////////////////////////////////////////////////
357void bncTableDlg::showSourceTable() {
358
359 for( int i = 0; i < _allLines.size(); i++ ){
360
361 if( _allLines.at(i).startsWith("STR") == true ){
362
363 QStringList tmp = _allLines.at(i).split(';');
364 if( tmp.size() > 0 ){
365
366 QPointF point;
367 point.setY( tmp.at(9).toDouble() );
368 point.setX( tmp.at(10).toDouble() );
369
370 QString site = tmp.at(1);
371 site.resize(4);
372
373 emit newPoint(point, site, QPen(QBrush(QColor(0,0,255,200)), 1.5), 1.5 );
374 }
375 }
376 }
377 emit fitMap();
378}
379
380
381// Select slot
382////////////////////////////////////////////////////////////////////////////
383void bncTableDlg::select() {
384
385 QString ntripVersion = _ntripVersionComboBox->currentText();
386
387 QUrl url;
388 if (ntripVersion == "2s") {
389 url.setScheme("https");
390 }
391 else {
392 url.setScheme("http");
393 }
394 url.setHost(_casterHostComboBox->currentText());
395 url.setPort(_casterPortLineEdit->text().toInt());
396 url.setUserName(QUrl::toPercentEncoding(_casterUserLineEdit->text()));
397 url.setPassword(QUrl::toPercentEncoding(_casterPasswordLineEdit->text()));
398 addUrl(url);
399
400 QStringList* mountPoints = new QStringList;
401 if (_table) {
402 for (int ir = 0; ir < _table->rowCount(); ir++) {
403 QTableWidgetItem* item = _table->item(ir,0);
404 QString site = _table->item(ir,0)->text();
405 QString format = _table->item(ir,2)->text();
406 QString latitude = _table->item(ir,8)->text();
407 QString longitude = _table->item(ir,9)->text();
408 QString nmea = _table->item(ir,10)->text();
409 format.replace(" ", "_");
410 if (_table->isItemSelected(item)) {
411 url.setPath(item->text());
412 mountPoints->push_back(url.toString() + " " + format + " " + latitude
413 + " " + longitude + " " + nmea + " " + ntripVersion);
414
415 site.resize(4);
416 emit newPoint(QPointF(longitude.toDouble(),latitude.toDouble()), site,
417 QPen(QBrush(QColor(255,0,0,200)), 3.0), 3.0 );
418 }
419 }
420 }
421 emit newMountPoints(mountPoints);
422 emit fitFont();
423}
424
425// User changed the selection of mountPoints
426////////////////////////////////////////////////////////////////////////////
427void bncTableDlg::slotSelectionChanged() {
428 if (_table->selectedItems().isEmpty()) {
429 }
430}
431
432// Whats This Help
433void bncTableDlg::slotWhatsThis() {
434QWhatsThis::enterWhatsThisMode();
435}
436
437// Slot caster table
438////////////////////////////////////////////////////////////////////////////
439void bncTableDlg::slotCasterTable() {
440
441 _buttonCasterTable->setEnabled(false);
442 _casterHostComboBox->setEnabled(false);
443 _casterPortLineEdit->setEnabled(false);
444 _casterUserLineEdit->setEnabled(false);
445 _casterPasswordLineEdit->setEnabled(false);
446 _ntripVersionComboBox->setEnabled(false);
447 _buttonWhatsThis->setEnabled(false);
448 _buttonGet->setEnabled(false);
449 _buttonClose->setEnabled(false);
450 _buttonSelect->setEnabled(false);
451
452 bncCasterTableDlg* dlg =
453 new bncCasterTableDlg(_ntripVersionComboBox->currentText(), this);
454 dlg->move(this->pos().x()+50, this->pos().y()+50);
455 connect(dlg, SIGNAL(newCaster(QString, QString)),
456 this, SLOT(slotNewCaster(QString, QString)));
457 dlg->exec();
458 delete dlg;
459
460 _buttonCasterTable->setEnabled(true);
461 _casterHostComboBox->setEnabled(true);
462 _casterPortLineEdit->setEnabled(true);
463 _casterUserLineEdit->setEnabled(true);
464 _casterPasswordLineEdit->setEnabled(true);
465 _ntripVersionComboBox->setEnabled(true);
466 _buttonWhatsThis->setEnabled(true);
467 _buttonGet->setEnabled(true);
468 _buttonClose->setEnabled(true);
469 _buttonSelect->setEnabled(true);
470
471}
472
473// New caster selected
474////////////////////////////////////////////////////////////////////////////
475void bncTableDlg::slotNewCaster(QString newCasterHost, QString newCasterPort) {
476
477 _casterHostComboBox->insertItem(0, newCasterHost);
478 _casterHostComboBox->setCurrentIndex(0);
479 _casterUserLineEdit->setText("");
480 _casterPasswordLineEdit->setText("");
481 _casterPortLineEdit->setText(newCasterPort);
482
483 QString ntripVersion = _ntripVersionComboBox->currentText();
484
485 QUrl url;
486 if (ntripVersion == "2s") {
487 url.setScheme("https");
488 }
489 else {
490 url.setScheme("http");
491 }
492 url.setHost(newCasterHost);
493 url.setPort(newCasterPort.toInt());
494 addUrl(url);
495
496 _casterHostComboBox->setCurrentIndex(0);
497}
498
499// New caster selected
500////////////////////////////////////////////////////////////////////////////
501void bncTableDlg::addUrl(const QUrl& url) {
502 bncSettings settings;
503 QStringList oldUrlList = settings.value("casterUrlList").toStringList();
504 QStringList newUrlList;
505 newUrlList << url.toString();
506 for (int ii = 0; ii < oldUrlList.count(); ii++) {
507 QUrl oldUrl(oldUrlList[ii]);
508 if (url.host() != oldUrl.host()) {
509 newUrlList << oldUrl.toString();
510 }
511 }
512 settings.setValue("casterUrlList", newUrlList);
513}
514
515// New caster selected in combobox
516////////////////////////////////////////////////////////////////////////////
517void bncTableDlg::slotCasterHostChanged(const QString& newHost) {
518 bncSettings settings;
519 QStringList casterUrlList = settings.value("casterUrlList").toStringList();
520 for (int ii = 0; ii < casterUrlList.count(); ii++) {
521 QUrl url(casterUrlList[ii]);
522 if (url.host() == newHost) {
523 _casterUserLineEdit->setText(
524 QUrl::fromPercentEncoding(url.userName().toAscii()));
525 _casterPasswordLineEdit->setText(
526 QUrl::fromPercentEncoding(url.password().toAscii()));
527 if (url.port() > 0) {
528 _casterPortLineEdit->setText(QString("%1").arg(url.port()));
529 }
530 else {
531 _casterPortLineEdit->setText("");
532 }
533 }
534 }
535}
536
537// Caster table
538////////////////////////////////////////////////////////////////////////////
539bncCasterTableDlg::bncCasterTableDlg(const QString& ntripVersion,
540 QWidget* parent) :
541 QDialog(parent) {
542
543 static const QStringList labels = QString("host,port,identifier,operator,nmea,country,lat,long,link").split(",");
544
545 _casterTable = new QTableWidget(this);
546
547 QUrl url;
548 url.setHost("www.rtcm-ntrip.org");
549 url.setPath("/");
550 if (ntripVersion == "2s") {
551 url.setPort(443);
552 url.setScheme("https");
553 }
554 else {
555 url.setPort(2101);
556 url.setScheme("http");
557 }
558
559 bncNetQuery* query = 0;
560 if (ntripVersion == "2") {
561 query = new bncNetQueryV2(false);
562 }
563 else if (ntripVersion == "2s") {
564 query = new bncNetQueryV2(true);
565 }
566 else {
567 query = new bncNetQueryV1();
568 }
569
570 QByteArray outData;
571 query->waitForRequestResult(url, outData);
572
573 QStringList lines;
574 if (query->status() == bncNetQuery::finished) {
575 QTextStream in(outData);
576 QString line = in.readLine();
577 while ( !line.isNull() ) {
578 line = in.readLine();
579 if (line.indexOf("CAS") == 0) {
580 QStringList hlp = line.split(";");
581 if (hlp.size() > labels.size()) {
582 lines.push_back(line);
583 }
584 }
585 }
586 }
587
588 delete query;
589
590 if (lines.size() > 0) {
591 _casterTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
592 _casterTable->setSelectionBehavior(QAbstractItemView::SelectRows);
593
594 QStringList hlp = lines[0].split(";");
595 _casterTable->setColumnCount(labels.size());
596 _casterTable->setRowCount(lines.size());
597
598 for (int nRow = 0; nRow < lines.size(); nRow++) {
599 QStringList columns = lines[nRow].split(";");
600 for (int ic = 1; ic < columns.size(); ic++) {
601 if (ic == 5) {
602 if (columns[ic] == "0") {
603 columns[ic] = "no";
604 } else {
605 columns[ic] = "yes";
606 }
607 }
608 QTableWidgetItem* item = new QTableWidgetItem(columns[ic]);
609 item->setFlags(item->flags() & ~Qt::ItemIsEditable);
610 _casterTable->setItem(nRow, ic-1, item);
611 }
612 }
613 }
614 _casterTable->setHorizontalHeaderLabels(labels);
615 _casterTable->setSortingEnabled(true);
616 _casterTable->sortItems(0);
617 int ww = QFontMetrics(this->font()).width('w');
618 _casterTable->horizontalHeader()->resizeSection(0,15*ww);
619 _casterTable->horizontalHeader()->resizeSection(1, 5*ww);
620 _casterTable->horizontalHeader()->resizeSection(2,15*ww);
621 _casterTable->horizontalHeader()->resizeSection(3,15*ww);
622 _casterTable->horizontalHeader()->resizeSection(4, 5*ww);
623 _casterTable->horizontalHeader()->resizeSection(5, 7*ww);
624 _casterTable->horizontalHeader()->resizeSection(6, 7*ww);
625 _casterTable->horizontalHeader()->resizeSection(7, 7*ww);
626 _casterTable->horizontalHeader()->resizeSection(8,15*ww);
627
628 _closeButton = new QPushButton("Cancel");
629 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
630 _closeButton->setMinimumWidth(8*ww);
631 _closeButton->setMaximumWidth(8*ww);
632
633 _okButton = new QPushButton(tr("OK"), this);
634 connect(_okButton, SIGNAL(clicked()), this, SLOT(slotAcceptCasterTable()));
635 _okButton->setMinimumWidth(8*ww);
636 _okButton->setMaximumWidth(8*ww);
637
638 _whatsThisButton = new QPushButton(tr("Help=Shift+F1"), this);
639 connect(_whatsThisButton, SIGNAL(clicked()), this, SLOT(slotWhatsThis()));
640 _whatsThisButton->setMinimumWidth(12*ww);
641 _whatsThisButton->setMaximumWidth(12*ww);
642
643 _casterTable->setWhatsThis(tr("<p>Select an NTRIP broadcaster and hit 'OK'.</p><p>See <u>http://www.rtcm-ntrip.org/home</u> for further details on known NTRIP broadcaster installations.</u>."));
644
645 QGridLayout* dlgLayout = new QGridLayout();
646 dlgLayout->addWidget(new QLabel(" List of NTRIP Broadcasters from www.rtcm-ntrip.org"), 0,0,1,3,Qt::AlignLeft);
647 dlgLayout->addWidget(_casterTable, 1, 0, 1, 3);
648 dlgLayout->addWidget(_whatsThisButton, 2, 0);
649 dlgLayout->addWidget(_closeButton, 2, 1, Qt::AlignRight);
650 dlgLayout->addWidget(_okButton, 2, 2);
651
652 setMinimumSize(600,400);
653 setWindowTitle(tr("Select Broadcaster"));
654 setLayout(dlgLayout);
655 resize(68*ww, 50*ww);
656 show();
657}
658
659// Caster table destructor
660////////////////////////////////////////////////////////////////////////////
661bncCasterTableDlg::~bncCasterTableDlg() {
662 delete _casterTable;
663 delete _okButton;
664 delete _closeButton;
665 delete _whatsThisButton;
666}
667
668// Caster table what's this
669////////////////////////////////////////////////////////////////////////////
670void bncCasterTableDlg:: slotWhatsThis() {
671 QWhatsThis::enterWhatsThisMode();
672}
673
674// Accept caster table
675////////////////////////////////////////////////////////////////////////////
676void bncCasterTableDlg::slotAcceptCasterTable() {
677 if (_casterTable) {
678 for (int ir = _casterTable->rowCount() - 1; ir >= 0 ; ir--) {
679 if (_casterTable->isItemSelected(_casterTable->item(ir,0))) {
680 emit newCaster(_casterTable->item(ir,0)->text(),
681 _casterTable->item(ir,1)->text());
682 }
683 }
684 }
685 QDialog::accept();
686}
Note: See TracBrowser for help on using the repository browser.