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

Last change on this file since 4658 was 4658, checked in by mervart, 12 years ago
File size: 23.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 t_bncMap* bncMap = new t_bncMap(this);
327
328 bncMap->setGeometry( x(), int(y()+height()*1.3), 800, 600 );
329
330 for (int ii = 0; ii < _allLines.size(); ii++) {
331 if (_allLines.at(ii).startsWith("STR") == true) {
332 QStringList tmp = _allLines.at(ii).split(';');
333 if (tmp.size() > 10) {
334 double latDeg = tmp.at(9).toDouble();
335 double lonDeg = tmp.at(10).toDouble();
336 QString name = tmp.at(1);
337 bncMap->slotNewPoint(name, latDeg, lonDeg);
338 }
339 }
340 }
341
342 bncMap->show();
343}
344
345// Select slot
346////////////////////////////////////////////////////////////////////////////
347void bncTableDlg::select() {
348
349 QString ntripVersion = _ntripVersionComboBox->currentText();
350
351 QUrl url;
352 if (ntripVersion == "2s") {
353 url.setScheme("https");
354 }
355 else {
356 url.setScheme("http");
357 }
358 url.setHost(_casterHostComboBox->currentText());
359 url.setPort(_casterPortLineEdit->text().toInt());
360 url.setUserName(QUrl::toPercentEncoding(_casterUserLineEdit->text()));
361 url.setPassword(QUrl::toPercentEncoding(_casterPasswordLineEdit->text()));
362 addUrl(url);
363
364 QStringList* mountPoints = new QStringList;
365 if (_table) {
366 for (int ir = 0; ir < _table->rowCount(); ir++) {
367 QTableWidgetItem* item = _table->item(ir,0);
368 QString site = _table->item(ir,0)->text();
369 QString format = _table->item(ir,2)->text();
370 QString latitude = _table->item(ir,8)->text();
371 QString longitude = _table->item(ir,9)->text();
372 QString nmea = _table->item(ir,10)->text();
373 format.replace(" ", "_");
374 if (_table->isItemSelected(item)) {
375 url.setPath(item->text());
376 mountPoints->push_back(url.toString() + " " + format + " " + latitude
377 + " " + longitude + " " + nmea + " " + ntripVersion);
378
379 site.resize(4);
380 }
381 }
382 }
383 emit newMountPoints(mountPoints);
384}
385
386// User changed the selection of mountPoints
387////////////////////////////////////////////////////////////////////////////
388void bncTableDlg::slotSelectionChanged() {
389 if (_table->selectedItems().isEmpty()) {
390 }
391}
392
393// Whats This Help
394void bncTableDlg::slotWhatsThis() {
395QWhatsThis::enterWhatsThisMode();
396}
397
398// Slot caster table
399////////////////////////////////////////////////////////////////////////////
400void bncTableDlg::slotCasterTable() {
401
402 _buttonCasterTable->setEnabled(false);
403 _casterHostComboBox->setEnabled(false);
404 _casterPortLineEdit->setEnabled(false);
405 _casterUserLineEdit->setEnabled(false);
406 _casterPasswordLineEdit->setEnabled(false);
407 _ntripVersionComboBox->setEnabled(false);
408 _buttonWhatsThis->setEnabled(false);
409 _buttonGet->setEnabled(false);
410 _buttonClose->setEnabled(false);
411 _buttonSelect->setEnabled(false);
412
413 bncCasterTableDlg* dlg =
414 new bncCasterTableDlg(_ntripVersionComboBox->currentText(), this);
415 dlg->move(this->pos().x()+50, this->pos().y()+50);
416 connect(dlg, SIGNAL(newCaster(QString, QString)),
417 this, SLOT(slotNewCaster(QString, QString)));
418 dlg->exec();
419 delete dlg;
420
421 _buttonCasterTable->setEnabled(true);
422 _casterHostComboBox->setEnabled(true);
423 _casterPortLineEdit->setEnabled(true);
424 _casterUserLineEdit->setEnabled(true);
425 _casterPasswordLineEdit->setEnabled(true);
426 _ntripVersionComboBox->setEnabled(true);
427 _buttonWhatsThis->setEnabled(true);
428 _buttonGet->setEnabled(true);
429 _buttonClose->setEnabled(true);
430 _buttonSelect->setEnabled(true);
431
432}
433
434// New caster selected
435////////////////////////////////////////////////////////////////////////////
436void bncTableDlg::slotNewCaster(QString newCasterHost, QString newCasterPort) {
437
438 _casterHostComboBox->insertItem(0, newCasterHost);
439 _casterHostComboBox->setCurrentIndex(0);
440 _casterUserLineEdit->setText("");
441 _casterPasswordLineEdit->setText("");
442 _casterPortLineEdit->setText(newCasterPort);
443
444 QString ntripVersion = _ntripVersionComboBox->currentText();
445
446 QUrl url;
447 if (ntripVersion == "2s") {
448 url.setScheme("https");
449 }
450 else {
451 url.setScheme("http");
452 }
453 url.setHost(newCasterHost);
454 url.setPort(newCasterPort.toInt());
455 addUrl(url);
456
457 _casterHostComboBox->setCurrentIndex(0);
458}
459
460// New caster selected
461////////////////////////////////////////////////////////////////////////////
462void bncTableDlg::addUrl(const QUrl& url) {
463 bncSettings settings;
464 QStringList oldUrlList = settings.value("casterUrlList").toStringList();
465 QStringList newUrlList;
466 newUrlList << url.toString();
467 for (int ii = 0; ii < oldUrlList.count(); ii++) {
468 QUrl oldUrl(oldUrlList[ii]);
469 if (url.host() != oldUrl.host()) {
470 newUrlList << oldUrl.toString();
471 }
472 }
473 settings.setValue("casterUrlList", newUrlList);
474}
475
476// New caster selected in combobox
477////////////////////////////////////////////////////////////////////////////
478void bncTableDlg::slotCasterHostChanged(const QString& newHost) {
479 bncSettings settings;
480 QStringList casterUrlList = settings.value("casterUrlList").toStringList();
481 for (int ii = 0; ii < casterUrlList.count(); ii++) {
482 QUrl url(casterUrlList[ii]);
483 if (url.host() == newHost) {
484 _casterUserLineEdit->setText(
485 QUrl::fromPercentEncoding(url.userName().toAscii()));
486 _casterPasswordLineEdit->setText(
487 QUrl::fromPercentEncoding(url.password().toAscii()));
488 if (url.port() > 0) {
489 _casterPortLineEdit->setText(QString("%1").arg(url.port()));
490 }
491 else {
492 _casterPortLineEdit->setText("");
493 }
494 }
495 }
496}
497
498// Caster table
499////////////////////////////////////////////////////////////////////////////
500bncCasterTableDlg::bncCasterTableDlg(const QString& ntripVersion,
501 QWidget* parent) :
502 QDialog(parent) {
503
504 static const QStringList labels = QString("host,port,identifier,operator,nmea,country,lat,long,link").split(",");
505
506 _casterTable = new QTableWidget(this);
507
508 QUrl url;
509 url.setHost("www.rtcm-ntrip.org");
510 url.setPath("/");
511 if (ntripVersion == "2s") {
512 url.setPort(443);
513 url.setScheme("https");
514 }
515 else {
516 url.setPort(2101);
517 url.setScheme("http");
518 }
519
520 bncNetQuery* query = 0;
521 if (ntripVersion == "2") {
522 query = new bncNetQueryV2(false);
523 }
524 else if (ntripVersion == "2s") {
525 query = new bncNetQueryV2(true);
526 }
527 else {
528 query = new bncNetQueryV1();
529 }
530
531 QByteArray outData;
532 query->waitForRequestResult(url, outData);
533
534 QStringList lines;
535 if (query->status() == bncNetQuery::finished) {
536 QTextStream in(outData);
537 QString line = in.readLine();
538 while ( !line.isNull() ) {
539 line = in.readLine();
540 if (line.indexOf("CAS") == 0) {
541 QStringList hlp = line.split(";");
542 if (hlp.size() > labels.size()) {
543 lines.push_back(line);
544 }
545 }
546 }
547 }
548
549 delete query;
550
551 if (lines.size() > 0) {
552 _casterTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
553 _casterTable->setSelectionBehavior(QAbstractItemView::SelectRows);
554
555 QStringList hlp = lines[0].split(";");
556 _casterTable->setColumnCount(labels.size());
557 _casterTable->setRowCount(lines.size());
558
559 for (int nRow = 0; nRow < lines.size(); nRow++) {
560 QStringList columns = lines[nRow].split(";");
561 for (int ic = 1; ic < columns.size(); ic++) {
562 if (ic == 5) {
563 if (columns[ic] == "0") {
564 columns[ic] = "no";
565 } else {
566 columns[ic] = "yes";
567 }
568 }
569 QTableWidgetItem* item = new QTableWidgetItem(columns[ic]);
570 item->setFlags(item->flags() & ~Qt::ItemIsEditable);
571 _casterTable->setItem(nRow, ic-1, item);
572 }
573 }
574 }
575 _casterTable->setHorizontalHeaderLabels(labels);
576 _casterTable->setSortingEnabled(true);
577 _casterTable->sortItems(0);
578 int ww = QFontMetrics(this->font()).width('w');
579 _casterTable->horizontalHeader()->resizeSection(0,15*ww);
580 _casterTable->horizontalHeader()->resizeSection(1, 5*ww);
581 _casterTable->horizontalHeader()->resizeSection(2,15*ww);
582 _casterTable->horizontalHeader()->resizeSection(3,15*ww);
583 _casterTable->horizontalHeader()->resizeSection(4, 5*ww);
584 _casterTable->horizontalHeader()->resizeSection(5, 7*ww);
585 _casterTable->horizontalHeader()->resizeSection(6, 7*ww);
586 _casterTable->horizontalHeader()->resizeSection(7, 7*ww);
587 _casterTable->horizontalHeader()->resizeSection(8,15*ww);
588
589 _closeButton = new QPushButton("Cancel");
590 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
591 _closeButton->setMinimumWidth(8*ww);
592 _closeButton->setMaximumWidth(8*ww);
593
594 _okButton = new QPushButton(tr("OK"), this);
595 connect(_okButton, SIGNAL(clicked()), this, SLOT(slotAcceptCasterTable()));
596 _okButton->setMinimumWidth(8*ww);
597 _okButton->setMaximumWidth(8*ww);
598
599 _whatsThisButton = new QPushButton(tr("Help=Shift+F1"), this);
600 connect(_whatsThisButton, SIGNAL(clicked()), this, SLOT(slotWhatsThis()));
601 _whatsThisButton->setMinimumWidth(12*ww);
602 _whatsThisButton->setMaximumWidth(12*ww);
603
604 _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>."));
605
606 QGridLayout* dlgLayout = new QGridLayout();
607 dlgLayout->addWidget(new QLabel(" List of NTRIP Broadcasters from www.rtcm-ntrip.org"), 0,0,1,3,Qt::AlignLeft);
608 dlgLayout->addWidget(_casterTable, 1, 0, 1, 3);
609 dlgLayout->addWidget(_whatsThisButton, 2, 0);
610 dlgLayout->addWidget(_closeButton, 2, 1, Qt::AlignRight);
611 dlgLayout->addWidget(_okButton, 2, 2);
612
613 setMinimumSize(600,400);
614 setWindowTitle(tr("Select Broadcaster"));
615 setLayout(dlgLayout);
616 resize(68*ww, 50*ww);
617 show();
618}
619
620// Caster table destructor
621////////////////////////////////////////////////////////////////////////////
622bncCasterTableDlg::~bncCasterTableDlg() {
623 delete _casterTable;
624 delete _okButton;
625 delete _closeButton;
626 delete _whatsThisButton;
627}
628
629// Caster table what's this
630////////////////////////////////////////////////////////////////////////////
631void bncCasterTableDlg:: slotWhatsThis() {
632 QWhatsThis::enterWhatsThisMode();
633}
634
635// Accept caster table
636////////////////////////////////////////////////////////////////////////////
637void bncCasterTableDlg::slotAcceptCasterTable() {
638 if (_casterTable) {
639 for (int ir = _casterTable->rowCount() - 1; ir >= 0 ; ir--) {
640 if (_casterTable->isItemSelected(_casterTable->item(ir,0))) {
641 emit newCaster(_casterTable->item(ir,0)->text(),
642 _casterTable->item(ir,1)->text());
643 }
644 }
645 }
646 QDialog::accept();
647}
Note: See TracBrowser for help on using the repository browser.