#include "dialogbase.h"
#include <QSize>
#include <QApplication>
#include <QFontMetrics>
#include <QTextStream>
#include <QMessageBox>
#include <QPushButton>
#include <QUrl>

DialogBase::DialogBase()
  : QDialog(), m_useStdOut(false), m_useCheckbox(false), m_delimiter('/')
  , m_urlEncode(false)
{
    m_view.setupUi( this );
    m_view.checkbox->setVisible(false);
    m_view.icon->setVisible(false);
    connect( this, SIGNAL(accepted()), this, SLOT(slotInputAccepted()));
    connect( this, SIGNAL(accepted()), this, SLOT(displayChecked()));
}


void DialogBase::setStandardOutput( bool useStdOutput )
{
    m_useStdOut = useStdOutput;
}

void DialogBase::printOutput( const QString &output )
{
    QTextStream s(m_useStdOut ? stdout : stderr, QIODevice::WriteOnly);

	if (m_urlEncode)
        s << QUrl::toPercentEncoding(output, "", "~\\");
	else
        s << output;
}

void DialogBase::printOutput( int output )
{
     printOutput( QString::number( output ) );
}

void DialogBase::printOutput( const QStringList &output )
{
    QTextStream s(m_useStdOut ? stdout : stderr, QIODevice::WriteOnly);

	if (m_urlEncode)
	{
		QStringList o;

		for (QStringList::const_iterator i = output.begin();
		     i != output.end(); ++i)
   	    	o << QUrl::toPercentEncoding(*i, "", "~\\");

		s << o.join(m_delimiter);
	}
	else
	{
		s << output.join(m_delimiter);
	}
}

void DialogBase::setIcon( const QString &icon )
{
    if ( !icon.isEmpty() )
    {
        m_view.icon->setPixmap(QIcon(icon).pixmap(48));
        m_view.icon->setVisible(true);
    }
}

bool DialogBase::adjustSize( const QString &width, const QString &height )
{
    bool isNumber = false;
    QFontMetrics fm = QApplication::fontMetrics();
    int wd = width.toInt(&isNumber) * fm.averageCharWidth();
    if( isNumber == false )
        return false;

    int ht = height.toInt(&isNumber) * fm.height();
    if( isNumber == false )
        return false;

    QDialog::adjustSize();
    if( wd == 0 )
        wd = QDialog::width();
    if( ht == 0 )
        ht = QDialog::height();

    resize(wd,ht);

    return true;
}

void DialogBase::setButtons( const QDialogButtonBox::StandardButtons &buttons )
{
    m_view.result->setStandardButtons(buttons);
}

void DialogBase::setTitle( const QString &title )
{
    setWindowTitle(title);
}

void DialogBase::setBackTitle( const QString &backTitle )
{
    m_view.backtitle->setTitle( backTitle );
}

void DialogBase::setText( const QString &text )
{
    m_view.text->setText(text);
}

void DialogBase::enableCheckArea( const QString &label, bool checked )
{
    m_view.checkbox->setText(label);
    m_view.checkbox->setChecked(checked);
    m_view.checkbox->setVisible(true);
    m_useCheckbox = checked;

}

void DialogBase::setInputWidget( QWidget *widget )
{
    m_view.inputlayout->addWidget(widget);
}

QWidget *DialogBase::inputWidgetParent( )
{
    return m_view.backtitle;
}

void DialogBase::displayChecked( )
{
    if( m_useCheckbox )
    {
        if( m_view.checkbox->isChecked() )
            printOutput( "\nchecked\n" );
        else
            printOutput("\nunchecked\n");
    }
}

void DialogBase::slotInputAccepted()
{

}

void DialogBase::addHelp( const QString &help )
{
    QPushButton *button = m_view.result->addButton(QDialogButtonBox::Help);
    connect( button, SIGNAL(clicked()), this, SLOT(displayHelp()));
    m_helpText = help;
}

void DialogBase::displayHelp()
{
    QMessageBox::information(this, "Help", m_helpText );
}

void DialogBase::setDelimiter( const QChar &ch )
{
    m_delimiter = ch;
}

void DialogBase::setUrlEncodeOutput( bool b)
{
    m_urlEncode = b;
}

void DialogBase::hideButtons()
{
    m_view.result->hide();
}

void DialogBase::setOkLabel( const QString &text )
{
    QPushButton *button = m_view.result->button(QDialogButtonBox::Ok);
    if ( button )
        button->setText(text);
}

void DialogBase::setCancelLabel( const QString &text )
{
    QPushButton *button = m_view.result->button(QDialogButtonBox::Cancel);
    if ( button )
        button->setText(text);
}

void DialogBase::showOk()
{
    QPushButton *button = m_view.result->button(QDialogButtonBox::Ok);
    if ( button )
        button->show();
}

void DialogBase::showCancel()
{
    QPushButton *button = m_view.result->button(QDialogButtonBox::Cancel);
    if ( button )
        button->show();
}

void DialogBase::hideOk()
{
    QPushButton *button = m_view.result->button(QDialogButtonBox::Ok);
    if ( button )
        button->hide();
}

void DialogBase::hideCancel()
{
    QPushButton *button = m_view.result->button(QDialogButtonBox::Cancel);
    if ( button )
        button->hide();
}

void DialogBase::setAlignment(Qt::Alignment alignment)
{
    m_view.text->setAlignment( alignment );
}

void DialogBase::setNoWrap( )
{
    m_view.text->setWordWrap(false);
}

void DialogBase::hideText()
{
    m_view.text->hide();
}

