Index: /trunk/BNC/.cvsignore
===================================================================
--- /trunk/BNC/.cvsignore	(revision 82)
+++ /trunk/BNC/.cvsignore	(revision 83)
@@ -7,2 +7,3 @@
 moc_bnctabledlg.cpp
 moc_bncwindow.cpp
+moc_bncapp.cpp
Index: /trunk/BNC/bnctabledlg.cpp
===================================================================
--- /trunk/BNC/bnctabledlg.cpp	(revision 82)
+++ /trunk/BNC/bnctabledlg.cpp	(revision 83)
@@ -152,4 +152,5 @@
       }
     }
+    _table->sortItems(0);
   }
 }
Index: /trunk/BNC/bncutils.cpp
===================================================================
--- /trunk/BNC/bncutils.cpp	(revision 83)
+++ /trunk/BNC/bncutils.cpp	(revision 83)
@@ -0,0 +1,36 @@
+
+/* -------------------------------------------------------------------------
+ * Bernese NTRIP Client
+ * -------------------------------------------------------------------------
+ *
+ * Class:      bncutils
+ *
+ * Purpose:    Auxiliary Functions
+ *
+ * Author:     L. Mervart
+ *
+ * Created:    30-Aug-2006
+ *
+ * Changes:    
+ *
+ * -----------------------------------------------------------------------*/
+
+#include <QRegExp>
+#include <QStringList>
+
+#include "bncutils.h"
+
+void expandEnvVar(QString& str) {
+
+  QRegExp rx("(\\$\\{.+\\})");
+
+  if (rx.indexIn(str) != -1) {
+    QStringListIterator it(rx.capturedTexts());
+    if (it.hasNext()) {
+      QString rxStr  = it.next();
+      QString envVar = rxStr.mid(2,rxStr.length()-3);
+      str.replace(rxStr, qgetenv(envVar.toAscii()));
+    }
+  }
+
+}
Index: /trunk/BNC/bncutils.h
===================================================================
--- /trunk/BNC/bncutils.h	(revision 83)
+++ /trunk/BNC/bncutils.h	(revision 83)
@@ -0,0 +1,9 @@
+
+#ifndef BNCUTILS_H
+#define BNCUTILS_H
+
+#include <QString>
+
+void expandEnvVar(QString& str);
+
+#endif
Index: /trunk/BNC/bncwindow.cpp
===================================================================
--- /trunk/BNC/bncwindow.cpp	(revision 82)
+++ /trunk/BNC/bncwindow.cpp	(revision 83)
@@ -26,5 +26,5 @@
 bncWindow::bncWindow() {
 
-  setMinimumSize(600,400);
+  setMinimumSize(400,600);
 
   // Create Actions
@@ -44,4 +44,5 @@
   _actDeleteMountPoints = new QAction(tr("&Delete Mount Points"),this);
   connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
+  _actDeleteMountPoints->setEnabled(false);
 
   _actGetData = new QAction(tr("&Get Data"),this);
@@ -75,25 +76,44 @@
   _canvas->setLayout(layout);
 
+  _userLabel          = new QLabel("user");
+  _passwordLabel      = new QLabel("password");
   _proxyHostLabel     = new QLabel("proxy host");
   _proxyPortLabel     = new QLabel("proxy port");
-  _userLabel          = new QLabel("user");
-  _passwordLabel      = new QLabel("password");
-  _outFileLabel       = new QLabel("output file");
-  _outPortLabel       = new QLabel("output port");
+  _outFileLabel       = new QLabel("ASCII output file (full path)");
+  _outPortLabel       = new QLabel("port for binary output");
+  _rnxPathLabel       = new QLabel("RINEX path");
+  _rnxSkelLabel       = new QLabel("RINEX skeleton extension");
+  _rnxIntrLabel       = new QLabel("RINEX file interval");
   _mountPointsLabel   = new QLabel("mount points");
+  _logLabel           = new QLabel("log");
 
   QSettings settings;
 
   _proxyHostLineEdit  = new QLineEdit(settings.value("proxyHost").toString());
+  int ww = QFontMetrics(_proxyHostLineEdit->font()).width('w');
+  _proxyHostLineEdit->setMaximumWidth(12*ww);
   _proxyPortLineEdit  = new QLineEdit(settings.value("proxyPort").toString());
+  _proxyPortLineEdit->setMaximumWidth(9*ww);
   _userLineEdit       = new QLineEdit(settings.value("user").toString());
+  _userLineEdit->setMaximumWidth(9*ww);
   _passwordLineEdit   = new QLineEdit(settings.value("password").toString());
+  _passwordLineEdit->setMaximumWidth(9*ww);
   _passwordLineEdit->setEchoMode(QLineEdit::Password);
   _outFileLineEdit    = new QLineEdit(settings.value("outFile").toString());
   _outPortLineEdit    = new QLineEdit(settings.value("outPort").toString());
+  _outPortLineEdit->setMaximumWidth(9*ww);
+  _rnxPathLineEdit    = new QLineEdit(settings.value("rnxPath").toString());
+  _rnxSkelLineEdit    = new QLineEdit(settings.value("rnxSkel").toString());
+  _rnxSkelLineEdit->setMaximumWidth(5*ww);
+  _rnxIntrSpinBox     = new QSpinBox();
+  _rnxIntrSpinBox->setMaximumWidth(12*ww);
+  _rnxIntrSpinBox->setValue(settings.value("rnxIntr").toInt());
+  _rnxIntrSpinBox->setSuffix("  hour");
+  _rnxIntrSpinBox->setRange(1,24);
+  _rnxIntrSpinBox->setSingleStep(23);
   _mountPointsTable   = new QTableWidget(0,2);
-  _mountPointsTable->setMaximumHeight(100);
+  _mountPointsTable->setMaximumHeight(140);
+  _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
   _mountPointsTable->horizontalHeader()->hide();
-  _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
   _mountPointsTable->verticalHeader()->hide();
   _mountPointsTable->setGridStyle(Qt::NoPen);
@@ -107,4 +127,5 @@
   while (it.hasNext()) {
     QStringList hlp = it.next().split(" ");
+    if (hlp.size() <= 1) continue;
     QString mPoint = hlp[0];
     QString format = hlp[1];
@@ -114,20 +135,35 @@
     iRow++;
   }
-
-  layout->addWidget(_proxyHostLabel,     0, 0);
-  layout->addWidget(_proxyHostLineEdit,  0, 1);
-  layout->addWidget(_proxyPortLabel,     0, 2);
-  layout->addWidget(_proxyPortLineEdit,  0, 3);
-  layout->addWidget(_userLabel,          1, 0);
-  layout->addWidget(_userLineEdit,       1, 1);
-  layout->addWidget(_passwordLabel,      1, 2);
-  layout->addWidget(_passwordLineEdit,   1, 3);
-  layout->addWidget(_outFileLabel,       2, 0);
-  layout->addWidget(_outFileLineEdit,    2, 1);
-  layout->addWidget(_outPortLabel,       2, 2);
-  layout->addWidget(_outPortLineEdit,    2, 3);
-
-  layout->addWidget(_mountPointsLabel,   3, 0);
-  layout->addWidget(_mountPointsTable,   3, 1, 1, 3);
+  _mountPointsTable->sortItems(0);
+
+  connect(_mountPointsTable, SIGNAL(itemSelectionChanged()), 
+          SLOT(slotSelectionChanged()));
+
+  _log = new QTextEdit();
+  _log->setMaximumHeight(120);
+  _log->setReadOnly(true);
+
+  layout->addWidget(_userLabel,          0, 0);
+  layout->addWidget(_userLineEdit,       0, 1);
+  layout->addWidget(_passwordLabel,      0, 2);
+  layout->addWidget(_passwordLineEdit,   0, 3);
+  layout->addWidget(_proxyHostLabel,     1, 0);
+  layout->addWidget(_proxyHostLineEdit,  1, 1);
+  layout->addWidget(_proxyPortLabel,     1, 2);
+  layout->addWidget(_proxyPortLineEdit,  1, 3);
+  layout->addWidget(_outFileLabel,       2, 1);
+  layout->addWidget(_outFileLineEdit,    2, 2, 1, 2);
+  layout->addWidget(_outPortLabel,       3, 1);
+  layout->addWidget(_outPortLineEdit,    3, 2);
+  layout->addWidget(_rnxPathLabel,       4, 1);
+  layout->addWidget(_rnxPathLineEdit,    4, 2, 1, 2);
+  layout->addWidget(_rnxSkelLabel,       5, 1);
+  layout->addWidget(_rnxSkelLineEdit,    5, 2);
+  layout->addWidget(_rnxIntrLabel,       6, 1);
+  layout->addWidget(_rnxIntrSpinBox,     6, 2);
+  layout->addWidget(_mountPointsLabel,   7, 0);
+  layout->addWidget(_mountPointsTable,   7, 1, 1, 3);
+  layout->addWidget(_logLabel,           8, 0);
+  layout->addWidget(_log,                8, 1, 1, 3);
 
   _bncCaster = 0;
@@ -144,4 +180,5 @@
   bncTableDlg* dlg = new bncTableDlg(this, _proxyHostLineEdit->text(),
                                      _proxyPortLineEdit->text().toInt());
+  dlg->move(this->pos().x()+50, this->pos().y()+50);
   connect(dlg, SIGNAL(newMountPoints(QStringList*)), 
           this, SLOT(slotNewMountPoints(QStringList*)));
@@ -154,6 +191,18 @@
 ////////////////////////////////////////////////////////////////////////////
 void bncWindow::slotDeleteMountPoints() {
-  _mountPointsTable->clear();
-  _mountPointsTable->setRowCount(0);
+  while(1) {
+    bool itemRemoved = false;
+    for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
+      if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,0))) {
+        _mountPointsTable->removeRow(iRow);
+        itemRemoved = true;
+        break;
+      }
+    }
+    if (!itemRemoved) {
+      break;
+    }
+  }
+  _actDeleteMountPoints->setEnabled(false);
 }
 
@@ -172,4 +221,5 @@
     iRow++;
   }
+  _mountPointsTable->sortItems(0);
   if (mountPoints->count() > 0) {
     _actGetData->setEnabled(true);
@@ -188,4 +238,7 @@
   settings.setValue("outFile",     _outFileLineEdit->text());
   settings.setValue("outPort",     _outPortLineEdit->text());
+  settings.setValue("rnxPath",     _rnxPathLineEdit->text());
+  settings.setValue("rnxIntr",     _rnxIntrSpinBox->value());
+  settings.setValue("rnxSkel",     _rnxSkelLineEdit->text());
   QStringList mountPoints;
   for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
@@ -199,7 +252,6 @@
 ////////////////////////////////////////////////////////////////////////////
 void bncWindow::slotGetThreadErrors() {
-  QMessageBox::warning(0, "BNC", "All Get Threads Terminated");
+  slotMessage("All Get Threads Terminated");
   _actAddMountPoints->setEnabled(true);
-  _actDeleteMountPoints->setEnabled(true);
   _actGetData->setEnabled(true);
 }
@@ -223,4 +275,7 @@
           this, SLOT(slotGetThreadErrors()));
 
+  connect(_bncCaster, SIGNAL(newMessage(const QByteArray&)), 
+          this, SLOT(slotMessage(const QByteArray&)));
+
   _bncCaster->start();
 
@@ -234,4 +289,8 @@
                                                mountPoint, user, password,
                                                format);
+
+    connect(getThread, SIGNAL(newMessage(const QByteArray&)), 
+            this, SLOT(slotMessage(const QByteArray&)));
+
     _bncCaster->addGetThread(getThread);
 
@@ -239,2 +298,44 @@
   }
 }
+
+// Close Application gracefully
+////////////////////////////////////////////////////////////////////////////
+void bncWindow::closeEvent(QCloseEvent* event) {
+
+  int iRet = QMessageBox::question(this, "Close", "Save Options?", 
+                                   QMessageBox::Yes, QMessageBox::No,
+                                   QMessageBox::Cancel);
+
+  if      (iRet == QMessageBox::Cancel) {
+    event->ignore();
+    return;
+  }
+  else if (iRet == QMessageBox::Yes) {
+    slotSaveOptions();
+  }
+
+  return QMainWindow::closeEvent(event);
+}
+
+// User changed the selection of mountPoints
+////////////////////////////////////////////////////////////////////////////
+void bncWindow::slotSelectionChanged() {
+  if (_mountPointsTable->selectedItems().isEmpty()) {
+    _actDeleteMountPoints->setEnabled(false);
+  }
+  else {
+    _actDeleteMountPoints->setEnabled(true);
+  }
+}
+
+// Display Program Messages 
+////////////////////////////////////////////////////////////////////////////
+void bncWindow::slotMessage(const QByteArray& msg) {
+
+  const int maxBufferSize = 10000;
+ 
+  QString txt = _log->toPlainText() + "\n" + msg;
+  _log->clear();
+  _log->append(txt.right(maxBufferSize));
+}  
+
Index: /trunk/BNC/bncwindow.h
===================================================================
--- /trunk/BNC/bncwindow.h	(revision 82)
+++ /trunk/BNC/bncwindow.h	(revision 83)
@@ -13,5 +13,8 @@
   public:
     bncWindow();
-    ~bncWindow();  
+    ~bncWindow();
+  
+  public slots:  
+    void slotMessage(const QByteArray& msg);
 
   private slots:
@@ -22,4 +25,8 @@
     void slotDeleteMountPoints();
     void slotGetThreadErrors();
+    void slotSelectionChanged();
+
+  protected:
+    virtual void closeEvent(QCloseEvent *);
 
   private:
@@ -38,7 +45,11 @@
     QLabel*    _userLabel;
     QLabel*    _passwordLabel;
+    QLabel*    _rnxPathLabel;
+    QLabel*    _rnxSkelLabel;
+    QLabel*    _rnxIntrLabel;
     QLabel*    _mountPointsLabel;
     QLabel*    _outFileLabel;
     QLabel*    _outPortLabel;
+    QLabel*    _logLabel;
 
     QLineEdit* _proxyHostLineEdit;
@@ -48,8 +59,12 @@
     QLineEdit* _outFileLineEdit;
     QLineEdit* _outPortLineEdit;
+    QLineEdit* _rnxPathLineEdit;
+    QLineEdit* _rnxSkelLineEdit;
+    QSpinBox*  _rnxIntrSpinBox;
+    QTableWidget* _mountPointsTable;
+
+    QTextEdit*  _log;
 
     QWidget*   _canvas;
-
-    QTableWidget* _mountPointsTable;
 
     bncCaster* _bncCaster;
