#include "textdialog.h"
#include <QTextEdit>
#include <QFile>
#include <QTextStream>
#include <QFileSystemWatcher>
#include <QSocketNotifier>
#include <QTextCursor>

#include <qdebug.h>

TextDialog::TextDialog() : DialogBase(), m_fswatcher(0), m_inputNotifier(0)
{
    m_input = new QTextEdit(inputWidgetParent());
    setInputWidget(m_input);
    hideText();
}

DialogBase *TextDialog::createWidget( Mode mode, const QString &inputFile )
{
    QFile input(inputFile);
    if( inputFile == "-" )
      input.open(0, QIODevice::ReadOnly );
    else if( !input.open(QIODevice::ReadOnly ) )
      return 0;

    TextDialog *dlg = new TextDialog;
    dlg->setupFile(mode, &input);
    return dlg;
}

void TextDialog::setupStdInput( Mode mode )
{

    m_mode = mode;
}

void TextDialog::setupFile( Mode mode, QFile *input )
{
    if( mode == Edit )
    {
        setButtons(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
    }
    else if( mode == View )
    {
        setButtons(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
		hideCancel();
        m_input->setReadOnly(true);
    }
    else
    {
        setButtons(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
		setOkLabel("Close");
		hideCancel();
        m_input->setReadOnly(true);
	if( input->fileName().isEmpty() )
	{
	    m_inputNotifier = new QSocketNotifier(0,QSocketNotifier::Read,this);
	    connect(m_inputNotifier,SIGNAL(activated(int)),
	    this,SLOT(gotStdInput()));
	}
	else
	{
	    m_fswatcher = new QFileSystemWatcher(this);
	    m_fswatcher->addPath( input->fileName() );
	    connect( m_fswatcher, SIGNAL(fileChanged(QString)),
	    this, SLOT(fileChanged(QString)));
	}
    }

    if( !input->fileName().isEmpty() )
    {
	QTextStream ts(input);
	m_input->setText( ts.readAll() );
    }

    if( mode == Tail )
    {
        m_input->moveCursor(QTextCursor::End);
        m_input->ensureCursorVisible();
    }

    if ( mode == Tail || mode == Log )
    {
        m_fileName = input->fileName();
        m_offset = input->pos();
    }

    m_mode = mode;
}

void TextDialog::slotInputAccepted()
{
    if( m_mode == Edit )
        printOutput( m_input->toPlainText() );
}

void TextDialog::fileChanged( const QString & path )
{
    QFile inputFile( path );
    if( inputFile.open(QIODevice::ReadOnly ) )
    {
        QTextStream ts(&inputFile);
        inputFile.seek(m_offset);
        QTextCursor tc( m_input->document() );
        tc.movePosition(QTextCursor::End);
        tc.insertText( ts.read( inputFile.size() - m_offset ));
        m_offset = inputFile.pos();
        if( m_mode == Tail )
        {
            m_input->moveCursor(QTextCursor::End);
            m_input->ensureCursorVisible();
        }
    }
}

void TextDialog::gotStdInput( )
{
    QTextStream ts( stdin, QIODevice::ReadOnly );
    QTextCursor tc( m_input->document() );
    tc.movePosition(QTextCursor::End);
    tc.insertText(  ts.readLine() );

    if( m_mode == Tail )
    {
	m_input->moveCursor(QTextCursor::End);
	m_input->ensureCursorVisible();
    }
}

