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

Last change on this file since 8269 was 8269, checked in by stuerze, 6 years ago

minor changes

File size: 24.5 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#include <QHeaderView>
43#include <QLabel>
44#include <QLineEdit>
45#include <QMessageBox>
46#include <QVBoxLayout>
47
48#include "bnctabledlg.h"
49#include "bncgetthread.h"
50#include "bncnetqueryv1.h"
51#include "bncnetqueryv2.h"
52#include "bncsettings.h"
53#include "bncmap.h"
54
55using namespace std;
56
57// Constructor
58////////////////////////////////////////////////////////////////////////////
59bncTableDlg::bncTableDlg(QWidget* parent) : QDialog(parent) {
60
61 setMinimumSize(600,400);
62 setWindowTitle(tr("Add Streams from Caster"));
63
64 QVBoxLayout* mainLayout = new QVBoxLayout(this);
65
66 int ww = QFontMetrics(font()).width('w');
67
68 _casterPortLineEdit = new QLineEdit();
69 _casterPortLineEdit->setMaximumWidth(9*ww);
70
71 _casterUserLineEdit = new QLineEdit();
72 _casterUserLineEdit->setMaximumWidth(9*ww);
73
74 _casterPasswordLineEdit = new QLineEdit();
75 _casterPasswordLineEdit->setMaximumWidth(9*ww);
76 _casterPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
77
78 _casterHostComboBox = new QComboBox();
79 _casterHostComboBox->setMaxCount(10);
80 _casterHostComboBox->setDuplicatesEnabled(false);
81 _casterHostComboBox->setEditable(true);
82 _casterHostComboBox->setMinimumWidth(20*ww);
83 _casterHostComboBox->setMaximumWidth(20*ww);
84 connect(_casterHostComboBox, SIGNAL(currentIndexChanged(const QString&)),
85 this, SLOT(slotCasterHostChanged(const QString&)));
86 bncSettings settings;
87 settings.remove("casterHostList");
88 settings.remove("casterHost");
89 settings.remove("casterPort");
90 settings.remove("casterUser");
91 settings.remove("casterPassword");
92 QStringList casterUrlList = settings.value("casterUrlList").toStringList();
93 for (int ii = 0; ii < casterUrlList.count(); ii++) {
94 QUrl url(casterUrlList[ii]);
95 _casterHostComboBox->addItem(url.host());
96 }
97
98 _ntripVersionComboBox = new QComboBox();
99 _ntripVersionComboBox->addItems(QString("1,2,2s,R,U").split(","));
100 int kk = _ntripVersionComboBox->findText(settings.value("ntripVersion").toString());
101 if (kk != -1) {
102 _ntripVersionComboBox->setCurrentIndex(kk);
103 }
104 _ntripVersionComboBox->setMaximumWidth(5*ww);
105
106 _buttonCasterTable = new QPushButton(tr("Show"), this);
107 connect(_buttonCasterTable, SIGNAL(clicked()), this, SLOT(slotCasterTable()));
108 _buttonCasterTable->setMaximumWidth(6*ww);
109
110 // WhatsThis, Add Streams from Caster, Top
111 // ---------------------------------------
112 _casterHostComboBox->setWhatsThis(tr("<p>Enter the Ntrip Broadcaster URL or IP number.</p><p>Note that EUREF and IGS operate Ntrip Broadcasters at <u>www.euref-ip.net</u>, <u>www.igs-ip.net</u>, <u>products.igs-ip.net</u>, and <u>mgex.igs-ip.net</u>.</p>"));
113 _casterPortLineEdit->setWhatsThis(tr("<p>Enter the Ntrip Broadcaster port number.</p></p>Note that 80 and 2101 are often used port numbers. Note further that Ntrip Version 2 via SSL usually requires specifying port 443.</p>"));
114 _buttonCasterTable->setWhatsThis(tr("<p>Hit 'Show' for a table of known Ntrip Broadcaster installations as maintained at <u>http://www.rtcm-ntrip.org/home.</u></p><p>A window opens which allows to select a broadcaster for stream retrieval.</p>"));
115 _casterUserLineEdit->setWhatsThis(tr("<p>Access to streams on Ntrip Broadcasters can be restricted. You may need to enter a valid 'User' ID and 'Password' for access to protected streams.</p><p>Accounts are usually provided per Ntrip Broadcaster following a registration process. Register via <u>https://registration.rtcm-ntrip.org</u> for access to protected streams on <u>www.euref-ip.net</u>, <u>www.igs-ip.net</u>, <u>products.igs-ip.net</u>, or <u>mges.igs-ip.net</u>.</p>"));
116 _casterPasswordLineEdit->setWhatsThis(tr("<p>Enter a valid 'Password' for access to protected streams.</p>"));
117 _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 (usually port 443)<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>"));
118
119 QGridLayout* editLayout = new QGridLayout;
120 editLayout->addWidget(new QLabel(tr("Caster host")), 0, 0);
121 editLayout->addWidget(_casterHostComboBox, 0, 1);
122 editLayout->addWidget(new QLabel(tr(" Caster port")), 0, 2, Qt::AlignRight);
123 editLayout->addWidget(_casterPortLineEdit, 0, 3);
124 editLayout->addWidget(new QLabel(tr("Casters table")), 0, 4, Qt::AlignRight);
125 editLayout->addWidget(_buttonCasterTable, 0, 5);
126 editLayout->addWidget(new QLabel(tr("User")), 1, 0, Qt::AlignRight);
127 editLayout->addWidget(_casterUserLineEdit, 1, 1);
128 editLayout->addWidget(new QLabel(tr("Password")), 1, 2, Qt::AlignRight);
129 editLayout->addWidget(_casterPasswordLineEdit, 1, 3);
130 editLayout->addWidget(new QLabel(tr(" Ntrip Version")),1, 4, Qt::AlignRight);
131 editLayout->addWidget(_ntripVersionComboBox, 1, 5);
132
133 mainLayout->addLayout(editLayout);
134
135
136 _table = new QTableWidget(this);
137 connect(_table, SIGNAL(itemSelectionChanged()),
138 this, SLOT(slotSelectionChanged()));
139 mainLayout->addWidget(_table);
140
141 _buttonWhatsThis = new QPushButton(tr("Help=Shift+F1"), this);
142 connect(_buttonWhatsThis, SIGNAL(clicked()), this, SLOT(slotWhatsThis()));
143
144 _buttonGet = new QPushButton(tr("Get table"), this);
145 _buttonGet->setDefault(true);
146 connect(_buttonGet, SIGNAL(clicked()), this, SLOT(slotGetTable()));
147
148 _buttonMap = new QPushButton(tr("Map"), this);
149 _buttonMap->setEnabled(false);
150 connect(_buttonMap, SIGNAL(clicked()), this, SLOT(slotShowMap()));
151
152 _buttonClose = new QPushButton(tr("Close"), this);
153 connect(_buttonClose, SIGNAL(clicked()), this, SLOT(close()));
154
155 _buttonSelect = new QPushButton(tr("Select"), this);
156 connect(_buttonSelect, SIGNAL(clicked()), this, SLOT(select()));
157
158 // WhatsThis, Add Streams from Caster, Bottom
159 // ------------------------------------------
160 _table->setWhatsThis(tr("<p>Use the 'Get Table' button to download the source-table 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 or not a stream comes from a virtual reference station (VRS).</p>"));
161 _buttonMap->setWhatsThis(tr("<p>Draw distribution map of streams in downloaded caster source-table. Use mouse to zoom in or out.</p><p>Left button: Draw rectangle to zoom in.<br>Right button: Zoom out.<br>Middle button: Zoom back.</p>"));
162 _buttonGet->setWhatsThis(tr("<p>Download source-table from specified caster.</p>"));
163 _buttonClose->setWhatsThis(tr("<p>Close window.</p>"));
164 _buttonSelect->setWhatsThis(tr("<p>Select streams highlighted in downloaded source-table.</p>"));
165
166 QHBoxLayout* buttonLayout = new QHBoxLayout;
167 buttonLayout->addWidget(_buttonWhatsThis);
168 buttonLayout->addStretch(1);
169 buttonLayout->addWidget(_buttonMap);
170 buttonLayout->addWidget(_buttonGet);
171 buttonLayout->addWidget(_buttonSelect);
172 buttonLayout->addWidget(_buttonClose);
173
174 mainLayout->addLayout(buttonLayout);
175}
176
177// Destructor
178////////////////////////////////////////////////////////////////////////////
179bncTableDlg::~bncTableDlg() {
180 delete _casterHostComboBox;
181 delete _casterPortLineEdit;
182 delete _casterUserLineEdit;
183 delete _casterPasswordLineEdit;
184 bncSettings settings;
185 settings.setValue("ntripVersion", _ntripVersionComboBox->currentText());
186 delete _ntripVersionComboBox;
187 delete _buttonMap;
188 delete _buttonGet;
189 delete _buttonClose;
190 delete _buttonSelect;
191 delete _buttonWhatsThis;
192 delete _buttonCasterTable;
193 delete _table;
194}
195
196// Read full caster table (static)
197////////////////////////////////////////////////////////////////////////////
198t_irc bncTableDlg::getFullTable(const QString& ntripVersion,
199 const QString& casterHost,
200 int casterPort, QStringList& allLines,
201 bool alwaysRead) {
202
203 static QMutex mutex;
204 static QMap<QString, QStringList> allTables;
205
206 QMutexLocker locker(&mutex);
207
208 if (!alwaysRead && allTables.find(casterHost) != allTables.end()) {
209 allLines = allTables.find(casterHost).value();
210 return success;
211 }
212
213 allLines.clear();
214
215 bncNetQuery* query = 0;
216 if (ntripVersion == "2") {
217 query = new bncNetQueryV2(false);
218 }
219 else if (ntripVersion == "2s") {
220 query = new bncNetQueryV2(true);
221 }
222 else {
223 query = new bncNetQueryV1();
224 }
225
226 QUrl url;
227 url.setHost(casterHost);
228 url.setPort(casterPort);
229 url.setPath("/");
230 if (ntripVersion == "2s") {
231 url.setScheme("https");
232 }
233 else {
234 url.setScheme("http");
235 }
236
237 QByteArray outData;
238 query->waitForRequestResult(url, outData);
239 if (query->status() == bncNetQuery::finished) {
240 QTextStream in(outData);
241 QString line = in.readLine();
242 while ( !line.isNull() ) {
243 allLines.append(line);
244 line = in.readLine();
245 }
246 allTables.insert(casterHost, allLines);
247 delete query;
248 return success;
249 }
250 else {
251 delete query;
252 return failure;
253 }
254}
255
256// Read Table from Caster
257////////////////////////////////////////////////////////////////////////////
258void bncTableDlg::slotGetTable() {
259
260 _buttonGet->setEnabled(false);
261 _buttonMap->setEnabled(true);
262 _buttonCasterTable->setEnabled(false);
263
264 if ( getFullTable(_ntripVersionComboBox->currentText(),
265 _casterHostComboBox->currentText(),
266 _casterPortLineEdit->text().toInt(),
267 _allLines, true) != success ) {
268 QMessageBox::warning(0, "BNC", "Cannot retrieve table of data");
269 _buttonGet->setEnabled(true);
270 return;
271 }
272
273 static const QStringList labels = QString("mountpoint,identifier,format,"
274 "format-details,carrier,system,network,country,lat,long,"
275 "nmea,solution,generator,compress.,auth.,fee,bitrate,"
276 "misc").split(",");
277
278 QStringList lines;
279 QStringListIterator it(_allLines);
280 while (it.hasNext()) {
281 QString line = it.next();
282 if (line.indexOf("STR") == 0) {
283 QStringList hlp = line.split(";");
284 if (hlp.size() > labels.size()) {
285 lines.push_back(line);
286 }
287 }
288 }
289
290 if (lines.size() > 0) {
291 _table->setSelectionMode(QAbstractItemView::ExtendedSelection);
292 _table->setSelectionBehavior(QAbstractItemView::SelectRows);
293 _table->setColumnCount(labels.size());
294 _table->setRowCount(lines.size());
295 for (int nRow = 0; nRow < lines.size(); nRow++) {
296 QStringList columns = lines[nRow].split(";");
297 for (int ic = 1; ic < columns.size(); ic++) {
298 if (ic == 11) {
299 if (columns[ic] == "0") {
300 columns[ic] = "no";
301 } else {
302 columns[ic] = "yes";
303 }
304 }
305 QTableWidgetItem* item = new QTableWidgetItem(columns[ic]);
306 item->setFlags(item->flags() & ~Qt::ItemIsEditable);
307 _table->setItem(nRow, ic-1, item);
308 }
309 }
310 _table->setHorizontalHeaderLabels(labels);
311 _table->setSortingEnabled(true);
312 int ww = QFontMetrics(this->font()).width('w');
313 _table->horizontalHeader()->resizeSection( 0,10*ww);
314 _table->horizontalHeader()->resizeSection( 1,10*ww);
315 _table->horizontalHeader()->resizeSection( 2, 8*ww);
316 _table->horizontalHeader()->resizeSection( 3,22*ww);
317 _table->horizontalHeader()->resizeSection( 4, 5*ww);
318 _table->horizontalHeader()->resizeSection( 5, 8*ww);
319 _table->horizontalHeader()->resizeSection( 6, 8*ww);
320 _table->horizontalHeader()->resizeSection( 7, 7*ww);
321 _table->horizontalHeader()->resizeSection( 8, 6*ww);
322 _table->horizontalHeader()->resizeSection( 9, 6*ww);
323 _table->horizontalHeader()->resizeSection(10, 6*ww);
324 _table->horizontalHeader()->resizeSection(11, 6*ww);
325 _table->horizontalHeader()->resizeSection(12,15*ww);
326 _table->horizontalHeader()->resizeSection(13, 8*ww);
327 _table->horizontalHeader()->resizeSection(14, 5*ww);
328 _table->horizontalHeader()->resizeSection(15, 5*ww);
329 _table->horizontalHeader()->resizeSection(16, 7*ww);
330 _table->horizontalHeader()->resizeSection(17,15*ww);
331 _table->sortItems(0);
332 }
333}
334
335// Show world map
336////////////////////////////////////////////////////////////////////////////
337void bncTableDlg::slotShowMap() {
338
339 t_bncMap* bncMap = new t_bncMap(this);
340
341 bncMap->setMinimumSize(800, 600);
342
343 for (int ii = 0; ii < _allLines.size(); ii++) {
344 if (_allLines.at(ii).startsWith("STR") == true) {
345 QStringList tmp = _allLines.at(ii).split(';');
346 if (tmp.size() > 10) {
347 double latDeg = tmp.at(9).toDouble();
348 double lonDeg = tmp.at(10).toDouble();
349 QString name = tmp.at(1);
350 bncMap->slotNewPoint(name, latDeg, lonDeg);
351 }
352 }
353 }
354
355 bncMap->show();
356}
357
358// Select slot
359////////////////////////////////////////////////////////////////////////////
360void bncTableDlg::select() {
361
362 QString ntripVersion = _ntripVersionComboBox->currentText();
363
364 QUrl url;
365 if (ntripVersion == "2s") {
366 url.setScheme("https");
367 }
368 else {
369 url.setScheme("http");
370 }
371 url.setHost(_casterHostComboBox->currentText());
372 url.setPort(_casterPortLineEdit->text().toInt());
373 url.setUserName(QUrl::toPercentEncoding(_casterUserLineEdit->text()));
374 url.setPassword(QUrl::toPercentEncoding(_casterPasswordLineEdit->text()));
375 addUrl(url);
376
377 QStringList* mountPoints = new QStringList;
378 if (_table) {
379 for (int ir = 0; ir < _table->rowCount(); ir++) {
380 QTableWidgetItem* item = _table->item(ir,0);
381 QString site = _table->item(ir,0)->text();
382 QString format = _table->item(ir,2)->text();
383 QString country = _table->item(ir,7)->text();
384 QString latitude = _table->item(ir,8)->text();
385 QString longitude = _table->item(ir,9)->text();
386 QString nmea = _table->item(ir,10)->text();
387 format.replace(" ", "_");
388 if (_table->isItemSelected(item)) {
389 url.setPath("/"+item->text());
390 mountPoints->push_back(url.toString() + " " + format + " " + country + " " + latitude
391 + " " + longitude + " " + nmea + " " + ntripVersion);
392 site.resize(4);
393 }
394 }
395 }
396 emit newMountPoints(mountPoints);
397}
398
399// User changed the selection of mountPoints
400////////////////////////////////////////////////////////////////////////////
401void bncTableDlg::slotSelectionChanged() {
402 if (_table->selectedItems().isEmpty()) {
403 }
404}
405
406// Whats This Help
407void bncTableDlg::slotWhatsThis() {
408QWhatsThis::enterWhatsThisMode();
409}
410
411// Slot caster table
412////////////////////////////////////////////////////////////////////////////
413void bncTableDlg::slotCasterTable() {
414
415 _buttonCasterTable->setEnabled(false);
416 _casterHostComboBox->setEnabled(false);
417 _casterPortLineEdit->setEnabled(false);
418 _casterUserLineEdit->setEnabled(false);
419 _casterPasswordLineEdit->setEnabled(false);
420 _ntripVersionComboBox->setEnabled(false);
421 _buttonWhatsThis->setEnabled(false);
422 _buttonGet->setEnabled(false);
423 _buttonClose->setEnabled(false);
424 _buttonSelect->setEnabled(false);
425
426 bncCasterTableDlg* dlg =
427 new bncCasterTableDlg(_ntripVersionComboBox->currentText(), this);
428 dlg->move(this->pos().x()+50, this->pos().y()+50);
429 connect(dlg, SIGNAL(newCaster(QString, QString)),
430 this, SLOT(slotNewCaster(QString, QString)));
431 dlg->exec();
432 delete dlg;
433
434 _buttonCasterTable->setEnabled(true);
435 _casterHostComboBox->setEnabled(true);
436 _casterPortLineEdit->setEnabled(true);
437 _casterUserLineEdit->setEnabled(true);
438 _casterPasswordLineEdit->setEnabled(true);
439 _ntripVersionComboBox->setEnabled(true);
440 _buttonWhatsThis->setEnabled(true);
441 _buttonGet->setEnabled(true);
442 _buttonClose->setEnabled(true);
443 _buttonSelect->setEnabled(true);
444
445}
446
447// New caster selected
448////////////////////////////////////////////////////////////////////////////
449void bncTableDlg::slotNewCaster(QString newCasterHost, QString newCasterPort) {
450
451 _casterHostComboBox->insertItem(0, newCasterHost);
452 _casterHostComboBox->setCurrentIndex(0);
453 _casterUserLineEdit->setText("");
454 _casterPasswordLineEdit->setText("");
455 _casterPortLineEdit->setText(newCasterPort);
456
457 QString ntripVersion = _ntripVersionComboBox->currentText();
458
459 QUrl url;
460 if (ntripVersion == "2s") {
461 url.setScheme("https");
462 }
463 else {
464 url.setScheme("http");
465 }
466 url.setHost(newCasterHost);
467 url.setPort(newCasterPort.toInt());
468 addUrl(url);
469
470 _casterHostComboBox->setCurrentIndex(0);
471}
472
473// New caster selected
474////////////////////////////////////////////////////////////////////////////
475void bncTableDlg::addUrl(const QUrl& url) {
476 bncSettings settings;
477 QStringList oldUrlList = settings.value("casterUrlList").toStringList();
478 QStringList newUrlList;
479 newUrlList << url.toString();
480 for (int ii = 0; ii < oldUrlList.count(); ii++) {
481 QUrl oldUrl(oldUrlList[ii]);
482 if (url.host() != oldUrl.host()) {
483 newUrlList << oldUrl.toString();
484 }
485 }
486 settings.setValue("casterUrlList", newUrlList);
487}
488
489// New caster selected in combobox
490////////////////////////////////////////////////////////////////////////////
491void bncTableDlg::slotCasterHostChanged(const QString& newHost) {
492 bncSettings settings;
493 QStringList casterUrlList = settings.value("casterUrlList").toStringList();
494 for (int ii = 0; ii < casterUrlList.count(); ii++) {
495 QUrl url(casterUrlList[ii]);
496 if (url.host() == newHost) {
497 _casterUserLineEdit->setText(
498 QUrl::fromPercentEncoding(url.userName().toLatin1()));
499 _casterPasswordLineEdit->setText(
500 QUrl::fromPercentEncoding(url.password().toLatin1()));
501 if (url.port() > 0) {
502 _casterPortLineEdit->setText(QString("%1").arg(url.port()));
503 }
504 else {
505 _casterPortLineEdit->setText("");
506 }
507 }
508 }
509}
510
511// Caster table
512////////////////////////////////////////////////////////////////////////////
513bncCasterTableDlg::bncCasterTableDlg(const QString& ntripVersion,
514 QWidget* parent) :
515 QDialog(parent) {
516
517 static const QStringList labels = QString("host,port,identifier,operator,nmea,country,lat,long,fallback host, fallback port,link").split(",");
518
519 _casterTable = new QTableWidget(this);
520
521 QUrl url;
522 url.setHost("www.rtcm-ntrip.org");
523 url.setPath("/");
524 if (ntripVersion == "2s") {
525 url.setPort(443);
526 url.setScheme("https");
527 }
528 else {
529 url.setPort(2101);
530 url.setScheme("http");
531 }
532
533 bncNetQuery* query = 0;
534 if (ntripVersion == "2") {
535 query = new bncNetQueryV2(false);
536 }
537 else if (ntripVersion == "2s") {
538 query = new bncNetQueryV2(true);
539 }
540 else {
541 query = new bncNetQueryV1();
542 }
543
544 QByteArray outData;
545 query->waitForRequestResult(url, outData);
546
547 QStringList lines;
548 if (query->status() == bncNetQuery::finished) {
549 QTextStream in(outData);
550 QString line = in.readLine();
551 while ( !line.isNull() ) {
552 line = in.readLine();
553 if (line.indexOf("CAS") == 0) {
554 QStringList hlp = line.split(";");
555 if (hlp.size() > labels.size()) {
556 lines.push_back(line);
557 }
558 }
559 }
560 }
561
562 delete query;
563
564 if (lines.size() > 0) {
565 _casterTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
566 _casterTable->setSelectionBehavior(QAbstractItemView::SelectRows);
567
568 QStringList hlp = lines[0].split(";");
569 _casterTable->setColumnCount(labels.size());
570 _casterTable->setRowCount(lines.size());
571
572 for (int nRow = 0; nRow < lines.size(); nRow++) {
573 QStringList columns = lines[nRow].split(";");
574 for (int ic = 1; ic < columns.size(); ic++) {
575 if (ic == 5) {
576 if (columns[ic] == "0") {
577 columns[ic] = "no";
578 } else {
579 columns[ic] = "yes";
580 }
581 }
582 QTableWidgetItem* item = new QTableWidgetItem(columns[ic]);
583 item->setFlags(item->flags() & ~Qt::ItemIsEditable);
584 _casterTable->setItem(nRow, ic-1, item);
585 }
586 }
587 }
588 _casterTable->setHorizontalHeaderLabels(labels);
589 _casterTable->setSortingEnabled(true);
590 _casterTable->sortItems(0);
591 int ww = QFontMetrics(this->font()).width('w');
592 _casterTable->horizontalHeader()->resizeSection(0,15*ww);
593 _casterTable->horizontalHeader()->resizeSection(1, 5*ww);
594 _casterTable->horizontalHeader()->resizeSection(2,15*ww);
595 _casterTable->horizontalHeader()->resizeSection(3,15*ww);
596 _casterTable->horizontalHeader()->resizeSection(4, 5*ww);
597 _casterTable->horizontalHeader()->resizeSection(5, 7*ww);
598 _casterTable->horizontalHeader()->resizeSection(6, 7*ww);
599 _casterTable->horizontalHeader()->resizeSection(7, 7*ww);
600 _casterTable->horizontalHeader()->resizeSection(8,15*ww);
601
602 _closeButton = new QPushButton("Cancel");
603 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
604 _closeButton->setMinimumWidth(8*ww);
605 _closeButton->setMaximumWidth(8*ww);
606
607 _okButton = new QPushButton(tr("OK"), this);
608 connect(_okButton, SIGNAL(clicked()), this, SLOT(slotAcceptCasterTable()));
609 _okButton->setMinimumWidth(8*ww);
610 _okButton->setMaximumWidth(8*ww);
611
612 _whatsThisButton = new QPushButton(tr("Help=Shift+F1"), this);
613 connect(_whatsThisButton, SIGNAL(clicked()), this, SLOT(slotWhatsThis()));
614 _whatsThisButton->setMinimumWidth(12*ww);
615 _whatsThisButton->setMaximumWidth(12*ww);
616
617 // WhatsThis, List of Ntrip Broadcasters from www.rtcm-ntrip.org
618 // -------------------------------------------------------------
619 _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>"));
620
621 QGridLayout* dlgLayout = new QGridLayout();
622 dlgLayout->addWidget(new QLabel(" List of Ntrip Broadcasters from www.rtcm-ntrip.org"), 0,0,1,3,Qt::AlignLeft);
623 dlgLayout->addWidget(_casterTable, 1, 0, 1, 3);
624 dlgLayout->addWidget(_whatsThisButton, 2, 0);
625 dlgLayout->addWidget(_closeButton, 2, 1, Qt::AlignRight);
626 dlgLayout->addWidget(_okButton, 2, 2);
627
628 setMinimumSize(600,400);
629 setWindowTitle(tr("Select Broadcaster"));
630 setLayout(dlgLayout);
631 resize(68*ww, 50*ww);
632 _casterTable->hideColumn(8);
633 _casterTable->hideColumn(9);
634 show();
635}
636
637// Caster table destructor
638////////////////////////////////////////////////////////////////////////////
639bncCasterTableDlg::~bncCasterTableDlg() {
640 delete _casterTable;
641 delete _okButton;
642 delete _closeButton;
643 delete _whatsThisButton;
644}
645
646// Caster table what's this
647////////////////////////////////////////////////////////////////////////////
648void bncCasterTableDlg:: slotWhatsThis() {
649 QWhatsThis::enterWhatsThisMode();
650}
651
652// Accept caster table
653////////////////////////////////////////////////////////////////////////////
654void bncCasterTableDlg::slotAcceptCasterTable() {
655 if (_casterTable) {
656 for (int ir = _casterTable->rowCount() - 1; ir >= 0 ; ir--) {
657 if (_casterTable->isItemSelected(_casterTable->item(ir,0))) {
658 emit newCaster(_casterTable->item(ir,0)->text(),
659 _casterTable->item(ir,1)->text());
660 }
661 }
662 }
663 QDialog::accept();
664}
Note: See TracBrowser for help on using the repository browser.