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

Last change on this file since 8269 was 8269, checked in by stuerze, 21 months 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.