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

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