From cf029a4007ea344c530d8a71cd0b012393ebd7ba Mon Sep 17 00:00:00 2001
From: mickeyl <mickeyl>
Date: Wed, 09 Apr 2003 21:40:31 +0000
Subject: - improve keyboard handling

- enable sniffer-menu
- fix handling of start/stop button
- add simple statistic window, fancy will follow ;-)
---
diff --git a/noncore/net/wellenreiter/gui/gui.pro b/noncore/net/wellenreiter/gui/gui.pro
index 5970b01..08eb18a 100644
--- a/noncore/net/wellenreiter/gui/gui.pro
+++ b/noncore/net/wellenreiter/gui/gui.pro
@@ -10,6 +10,7 @@ HEADERS         = wellenreiterbase.h \
                   scanlist.h \
                   logwindow.h \
                   hexwindow.h \
+                  statwindow.h \
                   configwindow.h \
                   manufacturers.h
 
@@ -20,6 +21,7 @@ SOURCES         = main.cpp \
                   scanlist.cpp \
                   logwindow.cpp \
                   hexwindow.cpp \
+                  statwindow.cpp \
                   configwindow.cpp \
                   manufacturers.cpp
 
diff --git a/noncore/net/wellenreiter/gui/mainwindow.cpp b/noncore/net/wellenreiter/gui/mainwindow.cpp
index 69d2b3a..94e3f28 100644
--- a/noncore/net/wellenreiter/gui/mainwindow.cpp
+++ b/noncore/net/wellenreiter/gui/mainwindow.cpp
@@ -60,30 +60,26 @@ WellenreiterMainWindow::WellenreiterMainWindow( QWidget * parent, const char * n
 
     infoIconSet = new QIconSet( Resource::loadPixmap( "wellenreiter/InfoIcon" ) );
     settingsIconSet = new QIconSet( Resource::loadPixmap( "wellenreiter/SettingsIcon" ) );
-    #ifdef QWS
-    searchIconSet = new QIconSet( Resource::loadPixmap( "wellenreiter/SearchIcon" ) );
-    cancelIconSet = new QIconSet( Resource::loadPixmap( "wellenreiter/CancelIcon" ) );
-    #else
-    startStopIconSet = new QIconSet();
-    startStopIconSet->setPixmap( Resource::loadPixmap( "wellenreiter/SearchIcon" ), QIconSet::Automatic, QIconSet::Normal, QIconSet::Off );
-    startStopIconSet->setPixmap( Resource::loadPixmap( "wellenreiter/CancelIcon" ), QIconSet::Automatic, QIconSet::Normal, QIconSet::On );
-    #endif
+    startIconSet = new QIconSet( Resource::loadPixmap( "wellenreiter/SearchIcon" ) );
+    stopIconSet = new QIconSet( Resource::loadPixmap( "wellenreiter/CancelIcon" ) );
 
     // setup tool buttons
 
-    startStopButton = new QToolButton( 0 );
+    startButton = new QToolButton( 0 );
     #ifdef QWS
-    startStopButton->setAutoRaise( true );
+    startButton->setAutoRaise( true );
     #endif
+    startButton->setIconSet( *startIconSet );
+    startButton->setEnabled( false );
+    connect( startButton, SIGNAL( clicked() ), mw, SLOT( startClicked() ) );
+
+    stopButton = new QToolButton( 0 );
     #ifdef QWS
-    startStopButton->setOnIconSet( *cancelIconSet );
-    startStopButton->setOffIconSet( *searchIconSet );
-    #else
-    startStopButton->setIconSet( *startStopIconSet );
+    stopButton->setAutoRaise( true );
     #endif
-    startStopButton->setToggleButton( true );
-    connect( startStopButton, SIGNAL( clicked() ), mw, SLOT( startStopClicked() ) );
-    startStopButton->setEnabled( false );
+    stopButton->setIconSet( *stopIconSet );
+    stopButton->setEnabled( false );
+    connect( stopButton, SIGNAL( clicked() ), mw, SLOT( stopClicked() ) );
 
     QToolButton* c = new QToolButton( 0 );
     #ifdef QWS
@@ -125,8 +121,12 @@ WellenreiterMainWindow::WellenreiterMainWindow( QWidget * parent, const char * n
     view->insertItem( "&Configure..." );
 
     QPopupMenu* sniffer = new QPopupMenu( mb );
-    sniffer->insertItem( "&Configure..." );
+    sniffer->insertItem( "&Configure...", this, SLOT( showConfigure() ) );
     sniffer->insertSeparator();
+    startID = sniffer->insertItem( "&Start", mw, SLOT( startClicked() ) );
+    sniffer->setItemEnabled( startID, false );
+    stopID = sniffer->insertItem( "Sto&p", mw, SLOT( stopClicked() ) );
+    sniffer->setItemEnabled( stopID, false );
 
     QPopupMenu* demo = new QPopupMenu( mb );
     demo->insertItem( "&Add something", this, SLOT( demoAddStations() ) );
@@ -135,28 +135,35 @@ WellenreiterMainWindow::WellenreiterMainWindow( QWidget * parent, const char * n
     id = mb->insertItem( "&View", view );
     mb->setItemEnabled( id, false );
     id = mb->insertItem( "&Sniffer", sniffer );
-    mb->setItemEnabled( id, false );
     id = mb->insertItem( "&Demo", demo );
     mb->setItemEnabled( id, true );
 
     #ifdef QWS
-    mb->insertItem( startStopButton );
+    mb->insertItem( startButton );
+    mb->insertItem( stopButton );
     mb->insertItem( c );
     mb->insertItem( d );
     #else // Qt3 changed the insertion order. It's now totally random :(
     mb->insertItem( d );
     mb->insertItem( c );
-    mb->insertItem( startStopButton );
+    mb->insertItem( stopButton );
+    mb->insertItem( startButton );
     #endif
 
+    updateToolButtonState();
+
     // setup status bar (for now only on X11)
 
     #ifndef QWS
     statusBar()->message( "Ready." );
     #endif
 
+    connect( mw, SIGNAL( startedSniffing() ), this, SLOT( changedSniffingState() ) );
+    connect( mw, SIGNAL( stoppedSniffing() ), this, SLOT( changedSniffingState() ) );
 };
 
+
+
 void WellenreiterMainWindow::showConfigure()
 {
     qDebug( "show configure..." );
@@ -166,35 +173,45 @@ void WellenreiterMainWindow::showConfigure()
     #endif
     int result = cw->exec();
 
-    if ( result )
-    {
-        // check configuration from config window
+    if ( result ) updateToolButtonState();
+}
 
-        const QString& interface = cw->interfaceName->currentText();
-        const int cardtype = cw->daemonDeviceType();
-        const int interval = cw->daemonHopInterval();
 
-        if ( ( interface != "<select>" ) && ( cardtype != 0 ) )
-            startStopButton->setEnabled( true );
-            //TODO ...
-        else
-            startStopButton->setEnabled( false );
-            //TODO ...
+
+void WellenreiterMainWindow::updateToolButtonState()
+{
+    const QString& interface = cw->interfaceName->currentText();
+    const int cardtype = cw->daemonDeviceType();
+    const int interval = cw->daemonHopInterval();
+
+    if ( ( interface != "<select>" ) && ( cardtype != 0 ) )
+    {
+        startButton->setEnabled( true );
+        menuBar()->setItemEnabled( startID, true );
+    }
+    else
+    {
+        startButton->setEnabled( false );
+        menuBar()->setItemEnabled( startID, false );
     }
 }
 
-WellenreiterMainWindow::~WellenreiterMainWindow()
+
+void WellenreiterMainWindow::changedSniffingState()
 {
+    startButton->setEnabled( !mw->sniffing );
+    menuBar()->setItemEnabled( startID, !mw->sniffing );
+    stopButton->setEnabled( mw->sniffing );
+    menuBar()->setItemEnabled( stopID, mw->sniffing );
+}
 
+
+WellenreiterMainWindow::~WellenreiterMainWindow()
+{
     delete infoIconSet;
     delete settingsIconSet;
-    #ifdef QWS
-    delete searchIconSet;
-    delete cancelIconSet;
-    #else
-    delete startStopIconSet;
-    #endif
-
+    delete startIconSet;
+    delete stopIconSet;
 };
 
 void WellenreiterMainWindow::demoAddStations()
diff --git a/noncore/net/wellenreiter/gui/mainwindow.h b/noncore/net/wellenreiter/gui/mainwindow.h
index 1b08c5b..1e191e5 100644
--- a/noncore/net/wellenreiter/gui/mainwindow.h
+++ b/noncore/net/wellenreiter/gui/mainwindow.h
@@ -35,16 +35,19 @@ class WellenreiterMainWindow: public QMainWindow
     Wellenreiter* mw;
     WellenreiterConfigWindow* cw;
 
-    QIconSet* startStopIconSet;
-    const QIconSet* searchIconSet;
+    const QIconSet* startIconSet;
+    const QIconSet* stopIconSet;
     const QIconSet* infoIconSet;
     const QIconSet* settingsIconSet;
-    const QIconSet* cancelIconSet;
 
-    QToolButton* startStopButton;
+    QToolButton* startButton;
+    QToolButton* stopButton;
+    int startID;
+    int stopID;
 
   protected:
     virtual void closeEvent( QCloseEvent* );
+    void updateToolButtonState();
 
   private:
     QString getFileName( bool save );
@@ -57,6 +60,7 @@ class WellenreiterMainWindow: public QMainWindow
     void fileSaveSession();
     void fileLoadSession();
     void fileNew();
+    void changedSniffingState();
 };
 
 #endif
diff --git a/noncore/net/wellenreiter/gui/statwindow.cpp b/noncore/net/wellenreiter/gui/statwindow.cpp
new file mode 100644
index 0000000..07d34ef
--- a/dev/null
+++ b/noncore/net/wellenreiter/gui/statwindow.cpp
@@ -0,0 +1,45 @@
+/**********************************************************************
+** Copyright (C) 2002 Michael 'Mickey' Lauer.  All rights reserved.
+**
+** This file is part of Opie Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+**********************************************************************/
+
+#include "statwindow.h"
+#include <qmultilineedit.h>
+
+MStatWindow::MStatWindow( QWidget * parent, const char * name, WFlags f )
+           :QVBox( parent, name, f )
+{
+    ledit = new QMultiLineEdit( this );
+    ledit->setFont( QFont( "fixed", 10 ) );
+
+    // FIXME: Set properties( font, read-only, etc...)
+
+};
+
+void MStatWindow::log( QString text )
+{
+
+    ledit->append( text );
+
+};
+
+const QString MStatWindow::getLog() const
+{
+    return ledit->text();
+}
+
+void MStatWindow::clear()
+{
+    ledit->clear();
+}
+
diff --git a/noncore/net/wellenreiter/gui/statwindow.h b/noncore/net/wellenreiter/gui/statwindow.h
new file mode 100644
index 0000000..bbdf777
--- a/dev/null
+++ b/noncore/net/wellenreiter/gui/statwindow.h
@@ -0,0 +1,40 @@
+/**********************************************************************
+** Copyright (C) 2002 Michael 'Mickey' Lauer.  All rights reserved.
+**
+** This file is part of Opie Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+**********************************************************************/
+
+#ifndef STATWINDOW_H
+#define STATWINDOW_H
+
+#include <qvbox.h>
+
+class QString;
+class QMultiLineEdit;
+
+class MStatWindow: public QVBox
+{
+
+  public:
+    MStatWindow( QWidget * parent = 0, const char * name = "MStatWindow", WFlags f = 0 );
+  
+    void log( QString text );
+    const QString getLog() const;
+    void clear();
+    
+  protected:
+    QMultiLineEdit* ledit;
+
+};
+
+#endif
+
diff --git a/noncore/net/wellenreiter/gui/wellenreiter.cpp b/noncore/net/wellenreiter/gui/wellenreiter.cpp
index 0bfc8e9..3372883 100644
--- a/noncore/net/wellenreiter/gui/wellenreiter.cpp
+++ b/noncore/net/wellenreiter/gui/wellenreiter.cpp
@@ -34,6 +34,7 @@ using namespace Opie;
 #include <qmessagebox.h>
 #include <qcombobox.h>
 #include <qspinbox.h>
+#include <qtoolbutton.h>
 #include <qmainwindow.h>
 
 // Standard
@@ -52,7 +53,7 @@ using namespace Opie;
 #include "logwindow.h"
 #include "hexwindow.h"
 #include "configwindow.h"
-
+#include "statwindow.h"
 #include "manufacturers.h"
 
 Wellenreiter::Wellenreiter( QWidget* parent )
@@ -217,99 +218,122 @@ void Wellenreiter::receivePacket(OPacket* p)
     }
 }
 
-void Wellenreiter::startStopClicked()
+
+void Wellenreiter::stopClicked()
 {
-    if ( sniffing )
+    disconnect( SIGNAL( receivedPacket(OPacket*) ), this, SLOT( receivePacket(OPacket*) ) );
+    disconnect( SIGNAL( hopped(int) ), this, SLOT( channelHopped(int) ) );
+    iface->setChannelHopping(); // stop hopping channels
+    pcap->close();
+    sniffing = false;
+    #ifdef QWS
+    oApp->setTitle();
+    #else
+    qApp->mainWidget()->setCaption( "Wellenreiter II" );
+    #endif
+
+    // get interface name from config window
+    const QString& interface = configwindow->interfaceName->currentText();
+    ONetwork* net = ONetwork::instance();
+    iface = static_cast<OWirelessNetworkInterface*>(net->interface( interface ));
+
+    // switch off monitor mode
+    iface->setMonitorMode( false );
+    // switch off promisc flag
+    iface->setPromiscuousMode( false );
+
+    system( "cardctl reset; sleep 1" ); //FIXME: Use OProcess
+    logwindow->log( "(i) Stopped Scanning." );
+    assert( parent() );
+    ( (QMainWindow*) parent() )->setCaption( "Wellenreiter II" );
+
+    // message the user
+    QMessageBox::information( this, "Wellenreiter II", "Your wireless card\nshould now be usable again." );
+
+    sniffing = false;
+    emit( stoppedSniffing() );
+
+    // print out statistics
+    statwindow->log( "-----------------------------------------" );
+    statwindow->log( "- Wellenreiter II Capturing Statistic -" );
+    statwindow->log( "-----------------------------------------" );
+    statwindow->log( "Packet Type         |   Receive Count" );
+
+    for( QMap<QString,int>::ConstIterator it = pcap->statistics().begin(); it != pcap->statistics().end(); ++it )
     {
-        disconnect( SIGNAL( receivedPacket(OPacket*) ), this, SLOT( receivePacket(OPacket*) ) );
-        disconnect( SIGNAL( hopped(int) ), this, SLOT( channelHopped(int) ) );
-        iface->setChannelHopping(); // stop hopping channels
-        pcap->close();
-        sniffing = false;
-        #ifdef QWS
-        oApp->setTitle();
-        #else
-        qApp->mainWidget()->setCaption( "Wellenreiter II" );
-        #endif
-
-        // get interface name from config window
-        const QString& interface = configwindow->interfaceName->currentText();
-        ONetwork* net = ONetwork::instance();
-        iface = static_cast<OWirelessNetworkInterface*>(net->interface( interface ));
-
-        // switch off monitor mode
-        iface->setMonitorMode( false );
-        // switch off promisc flag
-        iface->setPromiscuousMode( false );
-
-        system( "cardctl reset; sleep 1" ); //FIXME: Use OProcess
-        logwindow->log( "(i) Stopped Scanning." );
-        assert( parent() );
-        ( (QMainWindow*) parent() )->setCaption( "Wellenreiter II" );
-
-        // message the user
-        QMessageBox::information( this, "Wellenreiter II", "Your wireless card\nshould now be usable again." );
+        QString left;
+        left.sprintf( "%s", (const char*) it.key() );
+        left = left.leftJustify( 20 );
+        left.append( '|' );
+        QString right;
+        right.sprintf( "%d", it.data() );
+        right = right.rightJustify( 7 );
+        statwindow->log( left + right );
     }
 
-    else
-    {
-        // get configuration from config window
+}
 
-        const QString& interface = configwindow->interfaceName->currentText();
-        const int cardtype = configwindow->daemonDeviceType();
-        const int interval = configwindow->daemonHopInterval();
 
-        if ( ( interface == "" ) || ( cardtype == 0 ) )
-        {
-            QMessageBox::information( this, "Wellenreiter II", "Your device is not\nproperly configured. Please reconfigure!" );
-            return;
-        }
+void Wellenreiter::startClicked()
+{
+    // get configuration from config window
 
-        // configure device
+    const QString& interface = configwindow->interfaceName->currentText();
+    const int cardtype = configwindow->daemonDeviceType();
+    const int interval = configwindow->daemonHopInterval();
 
-        ONetwork* net = ONetwork::instance();
-        iface = static_cast<OWirelessNetworkInterface*>(net->interface( interface ));
+    if ( ( interface == "" ) || ( cardtype == 0 ) )
+    {
+        QMessageBox::information( this, "Wellenreiter II", "Your device is not\nproperly configured. Please reconfigure!" );
+        return;
+    }
 
-        // set monitor mode
+    // configure device
 
-        switch ( cardtype )
-        {
-            case 1: iface->setMonitoring( new OCiscoMonitoringInterface( iface ) ); break;
-            case 2: iface->setMonitoring( new OWlanNGMonitoringInterface( iface ) ); break;
-            case 3: iface->setMonitoring( new OHostAPMonitoringInterface( iface ) ); break;
-            case 4: iface->setMonitoring( new OOrinocoMonitoringInterface( iface ) ); break;
-            default: assert( 0 ); // shouldn't happen
-        }
+    ONetwork* net = ONetwork::instance();
+    iface = static_cast<OWirelessNetworkInterface*>(net->interface( interface ));
 
-        iface->setMonitorMode( true );
+    // set monitor mode
 
-        if ( !iface->monitorMode() )
-        {
-            QMessageBox::warning( this, "Wellenreiter II", "Can't set device into monitor mode." );
-            return;
-        }
+    switch ( cardtype )
+    {
+        case 1: iface->setMonitoring( new OCiscoMonitoringInterface( iface ) ); break;
+        case 2: iface->setMonitoring( new OWlanNGMonitoringInterface( iface ) ); break;
+        case 3: iface->setMonitoring( new OHostAPMonitoringInterface( iface ) ); break;
+        case 4: iface->setMonitoring( new OOrinocoMonitoringInterface( iface ) ); break;
+        default:
+            QMessageBox::information( this, "Wellenreiter II", "Bring your device into\nmonitor mode now." );
+    }
 
-        // open pcap and start sniffing
-        pcap->open( interface );
+    if ( cardtype > 0 && cardtype < 5 )
+        iface->setMonitorMode( true );
 
-        if ( !pcap->isOpen() )
-        {
-            QMessageBox::warning( this, "Wellenreiter II", "Can't open packet capturer:\n" + QString(strerror( errno ) ));
-            return;
-        }
+    if ( !iface->monitorMode() )
+    {
+        QMessageBox::warning( this, "Wellenreiter II", "Can't set device into monitor mode." );
+        return;
+    }
 
-        // set capturer to non-blocking mode
-        pcap->setBlocking( false );
+    // open pcap and start sniffing
+    pcap->open( interface );
 
-        // start channel hopper
-        iface->setChannelHopping( 1000 ); //use interval from config window
+    if ( !pcap->isOpen() )
+    {
+        QMessageBox::warning( this, "Wellenreiter II", "Can't open packet capturer:\n" + QString(strerror( errno ) ));
+        return;
+    }
 
-        // connect
-        connect( pcap, SIGNAL( receivedPacket(OPacket*) ), this, SLOT( receivePacket(OPacket*) ) );
-        connect( iface->channelHopper(), SIGNAL( hopped(int) ), this, SLOT( channelHopped(int) ) );
+    // set capturer to non-blocking mode
+    pcap->setBlocking( false );
 
-        logwindow->log( "(i) Started Scanning." );
-        sniffing = true;
+    // start channel hopper
+    iface->setChannelHopping( 1000 ); //use interval from config window
 
-    }
+    // connect
+    connect( pcap, SIGNAL( receivedPacket(OPacket*) ), this, SLOT( receivePacket(OPacket*) ) );
+    connect( iface->channelHopper(), SIGNAL( hopped(int) ), this, SLOT( channelHopped(int) ) );
+
+    logwindow->log( "(i) Started Scanning." );
+    sniffing = true;
+    emit( startedSniffing() );
 }
diff --git a/noncore/net/wellenreiter/gui/wellenreiter.h b/noncore/net/wellenreiter/gui/wellenreiter.h
index 85f889b..839c77e 100644
--- a/noncore/net/wellenreiter/gui/wellenreiter.h
+++ b/noncore/net/wellenreiter/gui/wellenreiter.h
@@ -47,17 +47,23 @@ class Wellenreiter : public WellenreiterBase {
     MHexWindow* hexWindow() const { return hexwindow; };
     bool isDaemonRunning() const { return sniffing; };
 
+    bool sniffing;
+
   public slots:
     void channelHopped(int);
     void receivePacket(OPacket*);
-    void startStopClicked();
+    void startClicked();
+    void stopClicked();
+
+  signals:
+    void startedSniffing();
+    void stoppedSniffing();
 
   private:
     #ifdef QWS
     OSystem _system;                // Opie Operating System identifier
     #endif
 
-    bool sniffing;
     OWirelessNetworkInterface* iface;
     OPacketCapturer* pcap;
     ManufacturerDB* manufacturerdb;
diff --git a/noncore/net/wellenreiter/gui/wellenreiterbase.cpp b/noncore/net/wellenreiter/gui/wellenreiterbase.cpp
index 3a703bc..245b9fc 100644
--- a/noncore/net/wellenreiter/gui/wellenreiterbase.cpp
+++ b/noncore/net/wellenreiter/gui/wellenreiterbase.cpp
@@ -30,6 +30,7 @@
 #include "logwindow.h"
 #include "hexwindow.h"
 #include "scanlist.h"
+#include "statwindow.h"
 
 #ifdef QWS
 #include <qpe/resource.h>
@@ -40,8 +41,8 @@
 #endif
 
 
-/* 
- *  Constructs a WellenreiterBase which is a child of 'parent', with the 
+/*
+ *  Constructs a WellenreiterBase which is a child of 'parent', with the
  *  name 'name' and widget flags set to 'f' 
  */
 WellenreiterBase::WellenreiterBase( QWidget* parent,  const char* name, WFlags fl )
@@ -78,16 +79,18 @@ WellenreiterBase::WellenreiterBase( QWidget* parent,  const char* name, WFlags f
     netview = new MScanListView( ap );
     apLayout->addWidget( netview );
 
-
     //--------- LOG TAB --------------
 
     logwindow = new MLogWindow( TabWidget, "Log" );
 
-
     //--------- HEX TAB --------------
 
     hexwindow = new MHexWindow( TabWidget, "Hex" );
 
+    //--------- STAT TAB --------------
+
+    statwindow = new MStatWindow( TabWidget, "Stat" );
+
     //--------- ABOUT TAB --------------
 
     about = new QWidget( TabWidget, "about" );
@@ -125,25 +128,27 @@ WellenreiterBase::WellenreiterBase( QWidget* parent,  const char* name, WFlags f
     aboutLayout->addWidget( TextLabel1_4_2, 1, 0 );
 
 #ifdef QWS
-    TabWidget->addTab( ap, "wellenreiter/networks", tr( "Networks" ) );
+    TabWidget->addTab( ap, "wellenreiter/networks", tr( "Nets" ) );
     TabWidget->addTab( logwindow, "wellenreiter/log", tr( "Log" ) );
     TabWidget->addTab( hexwindow, "wellenreiter/hex", tr( "Hex" ) );
+    TabWidget->addTab( statwindow, "wellenreiter/stat", tr( "Stats" ) );
     TabWidget->addTab( about, "wellenreiter/about", tr( "About" ) );
 #else
     TabWidget->addTab( ap, /* "wellenreiter/networks", */ tr( "Networks" ) );
     TabWidget->addTab( logwindow, /* "wellenreiter/log", */ tr( "Log" ) );
     TabWidget->addTab( hexwindow, /* "wellenreiter/hex", */ tr( "Hex" ) );
+    TabWidget->addTab( statwindow, /* "wellenreiter/hex", */ tr( "Stat" ) );
     TabWidget->addTab( about, /* "wellenreiter/about", */ tr( "About" ) );
 #endif
     WellenreiterBaseLayout->addWidget( TabWidget );
-   
+
 #ifdef QWS
-    TabWidget->setCurrentTab( tr( "Networks" ) );
+    TabWidget->setCurrentTab( tr( "Nets" ) );
 #endif
 
 }
 
-/*  
+/*
  *  Destroys the object and frees any allocated resources
  */
 WellenreiterBase::~WellenreiterBase()
diff --git a/noncore/net/wellenreiter/gui/wellenreiterbase.h b/noncore/net/wellenreiter/gui/wellenreiterbase.h
index 1fa1ea3..ad2e96c 100644
--- a/noncore/net/wellenreiter/gui/wellenreiterbase.h
+++ b/noncore/net/wellenreiter/gui/wellenreiterbase.h
@@ -27,6 +27,7 @@ class MScanListItem;
 class QPushButton;
 class MLogWindow;
 class MHexWindow;
+class MStatWindow;
 
 #ifdef QWS
 class OTabWidget;
@@ -51,6 +52,7 @@ public:
     MScanListView* netview;
     MLogWindow* logwindow;
     MHexWindow* hexwindow;
+    MStatWindow* statwindow;
     QWidget* about;
     QLabel* PixmapLabel1_3_2;
     QLabel* TextLabel1_4_2;
@@ -66,7 +68,7 @@ protected:
     QPixmap* ani3;
     QPixmap* ani4;
 
-    
+
 };
 
 #endif // WELLENREITERBASE_H
--
cgit v0.9.0.2