source: ntrip/trunk/BNC/bnctabledlg.cpp@ 3337

Last change on this file since 3337 was 3337, checked in by mervart, 13 years ago
File size: 24.3 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; 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, RTCM Version 3.x, or RTIGS 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 delete _ntripVersionComboBox;
173 delete _buttonGet;
174 delete _buttonClose;
175 delete _buttonSelect;
176 delete _buttonWhatsThis;
177 delete _buttonCasterTable;
178 delete _table;
179}
180
181// Read full caster table (static)
182////////////////////////////////////////////////////////////////////////////
183t_irc bncTableDlg::getFullTable(const QString& ntripVersion,
184 const QString& casterHost,
185 int casterPort, QStringList& allLines,
186 bool alwaysRead) {
187
188 static QMutex mutex;
189 static QMap<QString, QStringList> allTables;
190
191 QMutexLocker locker(&mutex);
192
193 if (!alwaysRead && allTables.find(casterHost) != allTables.end()) {
194 allLines = allTables.find(casterHost).value();
195 return success;
196 }
197
198 allLines.clear();
199
200 bncNetQuery* query = 0;
201 if (ntripVersion == "2") {
202 query = new bncNetQueryV2(false);
203 }
204 else if (ntripVersion == "2s") {
205 query = new bncNetQueryV2(true);
206 }
207 else {
208 query = new bncNetQueryV1();
209 }
210
211 QUrl url;
212 url.setHost(casterHost);
213 url.setPort(casterPort);
214 url.setPath("/");
215 if (ntripVersion == "2s") {
216 url.setScheme("https");
217 }
218 else {
219 url.setScheme("http");
220 }
221
222 QByteArray outData;
223 query->waitForRequestResult(url, outData);
224 if (query->status() == bncNetQuery::finished) {
225 QTextStream in(outData);
226 QString line = in.readLine();
227 while ( !line.isNull() ) {
228 allLines.append(line);
229 line = in.readLine();
230 }
231 allTables.insert(casterHost, allLines);
232 delete query;
233 return success;
234 }
235 else {
236 delete query;
237 return failure;
238 }
239}
240
241// Read Table from Caster
242////////////////////////////////////////////////////////////////////////////
243void bncTableDlg::slotGetTable() {
244
245 _buttonGet->setEnabled(false);
246 _buttonMap->setEnabled(true);
247 _buttonCasterTable->setEnabled(false);
248
249 if ( getFullTable(_ntripVersionComboBox->currentText(),
250 _casterHostComboBox->currentText(),
251 _casterPortLineEdit->text().toInt(),
252 _allLines, true) != success ) {
253 QMessageBox::warning(0, "BNC", "Cannot retrieve table of data");
254 _buttonGet->setEnabled(true);
255 return;
256 }
257
258 static const QStringList labels = QString("mountpoint,identifier,format,"
259 "format-details,carrier,system,network,country,lat,long,"
260 "nmea,solution,generator,compress.,auth.,fee,bitrate,"
261 "misc").split(",");
262
263 QStringList lines;
264 QStringListIterator it(_allLines);
265 while (it.hasNext()) {
266 QString line = it.next();
267 if (line.indexOf("STR") == 0) {
268 QStringList hlp = line.split(";");
269 if (hlp.size() > labels.size()) {
270 lines.push_back(line);
271 }
272 }
273 }
274
275 if (lines.size() > 0) {
276 _table->setSelectionMode(QAbstractItemView::ExtendedSelection);
277 _table->setSelectionBehavior(QAbstractItemView::SelectRows);
278 _table->setColumnCount(labels.size());
279 _table->setRowCount(lines.size());
280 for (int nRow = 0; nRow < lines.size(); nRow++) {
281 QStringList columns = lines[nRow].split(";");
282 for (int ic = 1; ic < columns.size(); ic++) {
283 if (ic == 11) {
284 if (columns[ic] == "0") {
285 columns[ic] = "no";
286 } else {
287 columns[ic] = "yes";
288 }
289 }
290 QTableWidgetItem* item = new QTableWidgetItem(columns[ic]);
291 item->setFlags(item->flags() & ~Qt::ItemIsEditable);
292 _table->setItem(nRow, ic-1, item);
293 }
294 }
295 _table->setHorizontalHeaderLabels(labels);
296 _table->setSortingEnabled(true);
297 int ww = QFontMetrics(this->font()).width('w');
298 _table->horizontalHeader()->resizeSection( 0,10*ww);
299 _table->horizontalHeader()->resizeSection( 1,10*ww);
300 _table->horizontalHeader()->resizeSection( 2, 8*ww);
301 _table->horizontalHeader()->resizeSection( 3,22*ww);
302 _table->horizontalHeader()->resizeSection( 4, 5*ww);
303 _table->horizontalHeader()->resizeSection( 5, 8*ww);
304 _table->horizontalHeader()->resizeSection( 6, 8*ww);
305 _table->horizontalHeader()->resizeSection( 7, 7*ww);
306 _table->horizontalHeader()->resizeSection( 8, 6*ww);
307 _table->horizontalHeader()->resizeSection( 9, 6*ww);
308 _table->horizontalHeader()->resizeSection(10, 6*ww);
309 _table->horizontalHeader()->resizeSection(11, 6*ww);
310 _table->horizontalHeader()->resizeSection(12,15*ww);
311 _table->horizontalHeader()->resizeSection(13, 8*ww);
312 _table->horizontalHeader()->resizeSection(14, 5*ww);
313 _table->horizontalHeader()->resizeSection(15, 5*ww);
314 _table->horizontalHeader()->resizeSection(16, 7*ww);
315 _table->horizontalHeader()->resizeSection(17,15*ww);
316 _table->sortItems(0);
317 }
318}
319
320// Show world map
321////////////////////////////////////////////////////////////////////////////
322void bncTableDlg::slotShowMap() {
323
324 bncMap* winMap = new bncMap(this);
325 winMap->setGeometry( x(), int(y()+height()*1.3), 880, 440 );
326
327 connect(this, SIGNAL(newPoint(QPointF, QString, QPen, double)),
328 winMap, SLOT(slotNewPoint(QPointF, QString, QPen, double)));
329
330 connect(this, SIGNAL(fitMap()),
331 winMap, SLOT(slotFitMap() ));
332
333 connect(this, SIGNAL(fitFont()),
334 winMap, SLOT(slotFitFont() ));
335
336 _buttonMap->setEnabled(false);
337 showSourceTable();
338 winMap->exec();
339 _buttonMap->setEnabled(true);
340
341 disconnect(this, SIGNAL(newPoint(QPointF, QString, QPen, double)),
342 winMap, SLOT(slotNewPoint(QPointF, QString, QPen, double)));
343
344 disconnect(this, SIGNAL(fitMap()),
345 winMap, SLOT(slotFitMap() ));
346
347 disconnect(this, SIGNAL(fitFont()),
348 winMap, SLOT(slotFitFont() ));
349
350 delete winMap;
351}
352
353// Show world map
354////////////////////////////////////////////////////////////////////////////
355void bncTableDlg::showSourceTable() {
356
357 for( int i = 0; i < _allLines.size(); i++ ){
358
359 if( _allLines.at(i).startsWith("STR") == true ){
360
361 QStringList tmp = _allLines.at(i).split(';');
362 if( tmp.size() > 0 ){
363
364 QPointF point;
365 point.setY( tmp.at(9).toDouble() );
366 point.setX( tmp.at(10).toDouble() );
367
368 QString site = tmp.at(1);
369 site.resize(4);
370
371 emit newPoint(point, site, QPen(QBrush(QColor(0,0,255,200)), 1.5), 1.5 );
372 }
373 }
374 }
375 emit fitMap();
376}
377
378
379// Select slot
380////////////////////////////////////////////////////////////////////////////
381void bncTableDlg::select() {
382
383 QString ntripVersion = _ntripVersionComboBox->currentText();
384
385 QUrl url;
386 if (ntripVersion == "2s") {
387 url.setScheme("https");
388 }
389 else {
390 url.setScheme("http");
391 }
392 url.setHost(_casterHostComboBox->currentText());
393 url.setPort(_casterPortLineEdit->text().toInt());
394 url.setUserName(QUrl::toPercentEncoding(_casterUserLineEdit->text()));
395 url.setPassword(QUrl::toPercentEncoding(_casterPasswordLineEdit->text()));
396 addUrl(url);
397
398 QStringList* mountPoints = new QStringList;
399 if (_table) {
400 for (int ir = 0; ir < _table->rowCount(); ir++) {
401 QTableWidgetItem* item = _table->item(ir,0);
402 QString site = _table->item(ir,0)->text();
403 QString format = _table->item(ir,2)->text();
404 QString latitude = _table->item(ir,8)->text();
405 QString longitude = _table->item(ir,9)->text();
406 QString nmea = _table->item(ir,10)->text();
407 format.replace(" ", "_");
408 if (_table->isItemSelected(item)) {
409 url.setPath(item->text());
410 mountPoints->push_back(url.toString() + " " + format + " " + latitude
411 + " " + longitude + " " + nmea + " " + ntripVersion);
412
413 site.resize(4);
414 emit newPoint(QPointF(longitude.toDouble(),latitude.toDouble()), site,
415 QPen(QBrush(QColor(255,0,0,200)), 3.0), 3.0 );
416 }
417 }
418 }
419 emit newMountPoints(mountPoints);
420 emit fitFont();
421}
422
423// User changed the selection of mountPoints
424////////////////////////////////////////////////////////////////////////////
425void bncTableDlg::slotSelectionChanged() {
426 if (_table->selectedItems().isEmpty()) {
427 }
428}
429
430// Whats This Help
431void bncTableDlg::slotWhatsThis() {
432QWhatsThis::enterWhatsThisMode();
433}
434
435// Slot caster table
436////////////////////////////////////////////////////////////////////////////
437void bncTableDlg::slotCasterTable() {
438
439 _buttonCasterTable->setEnabled(false);
440 _casterHostComboBox->setEnabled(false);
441 _casterPortLineEdit->setEnabled(false);
442 _casterUserLineEdit->setEnabled(false);
443 _casterPasswordLineEdit->setEnabled(false);
444 _ntripVersionComboBox->setEnabled(false);
445 _buttonWhatsThis->setEnabled(false);
446 _buttonGet->setEnabled(false);
447 _buttonClose->setEnabled(false);
448 _buttonSelect->setEnabled(false);
449
450 bncCasterTableDlg* dlg =
451 new bncCasterTableDlg(_ntripVersionComboBox->currentText(), this);
452 dlg->move(this->pos().x()+50, this->pos().y()+50);
453 connect(dlg, SIGNAL(newCaster(QString, QString)),
454 this, SLOT(slotNewCaster(QString, QString)));
455 dlg->exec();
456 delete dlg;
457
458 _buttonCasterTable->setEnabled(true);
459 _casterHostComboBox->setEnabled(true);
460 _casterPortLineEdit->setEnabled(true);
461 _casterUserLineEdit->setEnabled(true);
462 _casterPasswordLineEdit->setEnabled(true);
463 _ntripVersionComboBox->setEnabled(true);
464 _buttonWhatsThis->setEnabled(true);
465 _buttonGet->setEnabled(true);
466 _buttonClose->setEnabled(true);
467 _buttonSelect->setEnabled(true);
468
469}
470
471// New caster selected
472////////////////////////////////////////////////////////////////////////////
473void bncTableDlg::slotNewCaster(QString newCasterHost, QString newCasterPort) {
474
475 _casterHostComboBox->insertItem(0, newCasterHost);
476 _casterHostComboBox->setCurrentIndex(0);
477 _casterUserLineEdit->setText("");
478 _casterPasswordLineEdit->setText("");
479 _casterPortLineEdit->setText(newCasterPort);
480
481 QString ntripVersion = _ntripVersionComboBox->currentText();
482
483 QUrl url;
484 if (ntripVersion == "2s") {
485 url.setScheme("https");
486 }
487 else {
488 url.setScheme("http");
489 }
490 url.setHost(newCasterHost);
491 url.setPort(newCasterPort.toInt());
492 addUrl(url);
493
494 _casterHostComboBox->setCurrentIndex(0);
495}
496
497// New caster selected
498////////////////////////////////////////////////////////////////////////////
499void bncTableDlg::addUrl(const QUrl& url) {
500 bncSettings settings;
501 QStringList oldUrlList = settings.value("casterUrlList").toStringList();
502 QStringList newUrlList;
503 newUrlList << url.toString();
504 for (int ii = 0; ii < oldUrlList.count(); ii++) {
505 QUrl oldUrl(oldUrlList[ii]);
506 if (url.host() != oldUrl.host()) {
507 newUrlList << oldUrl.toString();
508 }
509 }
510 settings.setValue("casterUrlList", newUrlList);
511 settings.sync();
512}
513
514// New caster selected in combobox
515////////////////////////////////////////////////////////////////////////////
516void bncTableDlg::slotCasterHostChanged(const QString& newHost) {
517 bncSettings settings;
518 QStringList casterUrlList = settings.value("casterUrlList").toStringList();
519 for (int ii = 0; ii < casterUrlList.count(); ii++) {
520 QUrl url(casterUrlList[ii]);
521 if (url.host() == newHost) {
522 _casterUserLineEdit->setText(
523 QUrl::fromPercentEncoding(url.userName().toAscii()));
524 _casterPasswordLineEdit->setText(
525 QUrl::fromPercentEncoding(url.password().toAscii()));
526 if (url.port() > 0) {
527 _casterPortLineEdit->setText(QString("%1").arg(url.port()));
528 }
529 else {
530 _casterPortLineEdit->setText("");
531 }
532 }
533 }
534}
535
536// Caster table
537////////////////////////////////////////////////////////////////////////////
538bncCasterTableDlg::bncCasterTableDlg(const QString& ntripVersion,
539 QWidget* parent) :
540 QDialog(parent) {
541
542 static const QStringList labels = QString("host,port,identifier,operator,nmea,country,lat,long,link").split(",");
543
544 _casterTable = new QTableWidget(this);
545
546 QUrl url;
547 url.setHost("www.rtcm-ntrip.org");
548 url.setPath("/");
549 if (ntripVersion == "2s") {
550 url.setPort(443);
551 url.setScheme("https");
552 }
553 else {
554 url.setPort(2101);
555 url.setScheme("http");
556 }
557
558 bncNetQuery* query = 0;
559 if (ntripVersion == "2") {
560 query = new bncNetQueryV2(false);
561 }
562 else if (ntripVersion == "2s") {
563 query = new bncNetQueryV2(true);
564 }
565 else {
566 query = new bncNetQueryV1();
567 }
568
569 QByteArray outData;
570 query->waitForRequestResult(url, outData);
571
572 QStringList lines;
573 if (query->status() == bncNetQuery::finished) {
574 QTextStream in(outData);
575 QString line = in.readLine();
576 while ( !line.isNull() ) {
577 line = in.readLine();
578 if (line.indexOf("CAS") == 0) {
579 QStringList hlp = line.split(";");
580 if (hlp.size() > labels.size()) {
581 lines.push_back(line);
582 }
583 }
584 }
585 }
586
587 delete query;
588
589 if (lines.size() > 0) {
590 _casterTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
591 _casterTable->setSelectionBehavior(QAbstractItemView::SelectRows);
592
593 QStringList hlp = lines[0].split(";");
594 _casterTable->setColumnCount(labels.size());
595 _casterTable->setRowCount(lines.size());
596
597 for (int nRow = 0; nRow < lines.size(); nRow++) {
598 QStringList columns = lines[nRow].split(";");
599 for (int ic = 1; ic < columns.size(); ic++) {
600 if (ic == 5) {
601 if (columns[ic] == "0") {
602 columns[ic] = "no";
603 } else {
604 columns[ic] = "yes";
605 }
606 }
607 QTableWidgetItem* item = new QTableWidgetItem(columns[ic]);
608 item->setFlags(item->flags() & ~Qt::ItemIsEditable);
609 _casterTable->setItem(nRow, ic-1, item);
610 }
611 }
612 }
613 _casterTable->setHorizontalHeaderLabels(labels);
614 _casterTable->setSortingEnabled(true);
615 _casterTable->sortItems(0);
616 int ww = QFontMetrics(this->font()).width('w');
617 _casterTable->horizontalHeader()->resizeSection(0,15*ww);
618 _casterTable->horizontalHeader()->resizeSection(1, 5*ww);
619 _casterTable->horizontalHeader()->resizeSection(2,15*ww);
620 _casterTable->horizontalHeader()->resizeSection(3,15*ww);
621 _casterTable->horizontalHeader()->resizeSection(4, 5*ww);
622 _casterTable->horizontalHeader()->resizeSection(5, 7*ww);
623 _casterTable->horizontalHeader()->resizeSection(6, 7*ww);
624 _casterTable->horizontalHeader()->resizeSection(7, 7*ww);
625 _casterTable->horizontalHeader()->resizeSection(8,15*ww);
626
627 _closeButton = new QPushButton("Cancel");
628 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
629 _closeButton->setMinimumWidth(8*ww);
630 _closeButton->setMaximumWidth(8*ww);
631
632 _okButton = new QPushButton(tr("OK"), this);
633 connect(_okButton, SIGNAL(clicked()), this, SLOT(slotAcceptCasterTable()));
634 _okButton->setMinimumWidth(8*ww);
635 _okButton->setMaximumWidth(8*ww);
636
637 _whatsThisButton = new QPushButton(tr("Help=Shift+F1"), this);
638 connect(_whatsThisButton, SIGNAL(clicked()), this, SLOT(slotWhatsThis()));
639 _whatsThisButton->setMinimumWidth(12*ww);
640 _whatsThisButton->setMaximumWidth(12*ww);
641
642 _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>."));
643
644 QGridLayout* dlgLayout = new QGridLayout();
645 dlgLayout->addWidget(new QLabel(" List of NTRIP Broadcasters from www.rtcm-ntrip.org"), 0,0,1,3,Qt::AlignLeft);
646 dlgLayout->addWidget(_casterTable, 1, 0, 1, 3);
647 dlgLayout->addWidget(_whatsThisButton, 2, 0);
648 dlgLayout->addWidget(_closeButton, 2, 1, Qt::AlignRight);
649 dlgLayout->addWidget(_okButton, 2, 2);
650
651 setMinimumSize(600,400);
652 setWindowTitle(tr("Select Broadcaster"));
653 setLayout(dlgLayout);
654 resize(68*ww, 50*ww);
655 show();
656}
657
658// Caster table destructor
659////////////////////////////////////////////////////////////////////////////
660bncCasterTableDlg::~bncCasterTableDlg() {
661 delete _casterTable;
662 delete _okButton;
663 delete _closeButton;
664 delete _whatsThisButton;
665}
666
667// Caster table what's this
668////////////////////////////////////////////////////////////////////////////
669void bncCasterTableDlg:: slotWhatsThis() {
670 QWhatsThis::enterWhatsThisMode();
671}
672
673// Accept caster table
674////////////////////////////////////////////////////////////////////////////
675void bncCasterTableDlg::slotAcceptCasterTable() {
676 if (_casterTable) {
677 for (int ir = _casterTable->rowCount() - 1; ir >= 0 ; ir--) {
678 if (_casterTable->isItemSelected(_casterTable->item(ir,0))) {
679 emit newCaster(_casterTable->item(ir,0)->text(),
680 _casterTable->item(ir,1)->text());
681 }
682 }
683 }
684 QDialog::accept();
685}
Note: See TracBrowser for help on using the repository browser.