#ifndef MAINWINDOW_HVTEST_H
#define MAINWINDOW_HVTEST_H

#include <iostream>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <fstream>
#include <QtGui>
#include <stdarg.h>
#include <vector>
#include <TQtWidget.h>

#include <CAENHVWrapper.h>
#include <A1526Control.h>
#include <A1526Timer.h>
#include <enviro.h>

class A1526Control;
class A1526TimerWindow;
class MainWindow;
class enviro;

/*****************************
 * Class for the textconsole *
 *****************************/
class TextEditIoDevice : public QIODevice 
{
    Q_OBJECT

public:
  TextEditIoDevice(QTextEdit *const textEdit, QObject *const parent) 
    : QIODevice(parent), textEdit(textEdit) {
    open(QIODevice::WriteOnly|QIODevice::Text);
  }

protected:
    qint64 readData(char *data, qint64 maxSize){
	data = NULL;
	return maxSize;
    }

    qint64 writeData(const char *data, qint64 maxSize){
        if (textEdit) {
	    textEdit->insertPlainText(data);
	    QTextCursor c = textEdit->textCursor();
	    c.movePosition(QTextCursor::End);
	    textEdit->setTextCursor(c);
	}
        return maxSize;
    }

private:
    QPointer<QTextEdit> textEdit;
};

/*********************************************************
 * Class ChangeLoginWindow: change the IP/Login settings *
 *********************************************************/
class ChangeLoginWindow : public QDialog
{
    Q_OBJECT

public:
    ChangeLoginWindow(MainWindow *parent = 0, QString IP = "IP", 
		      QString userName = "userName", QString passwd = "passwd");

public slots:
    void Accept();
    void Reject(){ this->close(); };

private:
    MainWindow* myMainWindow;
    QLineEdit* IPEdit;
    QLineEdit* userNameEdit;
    QLineEdit* passwdEdit;
};

/********************
 * Class MainWindow *
 ********************/
class MainWindow : public QWidget
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = 0, QApplication *app = 0);
    ~MainWindow();
    void initWindow();
    void printc(const char*,...);
    void print(const char*,...);
    bool init();
    char* getName(){return name;}
    //QTextEdit* getConsole() { return myconsole; }
    //QIODevice* getConsoleDevice() { return myconsoledevice; }
    enviro* getEnviro() { return myenviro; }
    //QTextStream* getOConsole() { return oconsole; }

signals:
  void consolewrite( const QString );

public slots:
    void changeLogin();
    void getCrateMap();
    void ShowA1526Control();
    void kill();
    void clearAlarm();
    void quit();
    void quit2();
    void quitloginfailed();
    void Showenviro();
    void printc(const QString);

public:
    //QString message;
    //QTextStream* oconsole;
    QTextEdit *myconsole;
    enviro* myenviro;
    QIODevice* myconsoledevice;
    
private:
    QApplication* myApp;
    QGridLayout *myLayout;
    ChangeLoginWindow* myChangeLoginWindow;
    A1526Control* myA1526Control;
    char buffer[20];
    char* name;

protected:
    void closeEvent(QCloseEvent *event);
};
  
#endif
