/********************************************************************************************************
 * PROGRAM      : WERTer
 * DATE - TIME  : Samstag 13 Mai 2006 - 16h47
 * AUTHOR       : Dipl.-Ing. (FH) Mike Beck ( mike.beck ibmiller.de )
 * FILENAME     : printPreviewDialog.cpp
 * LICENSE      : GPL
 * COMMENTARY   :
 ********************************************************************************************************/
#include "printPreviewDialog.h"
//
#include <QCloseEvent>
#include <QPrinter>
#include <QProgressDialog>
#include <QPrintDialog>
#include <QMessageBox>
#include <QFileDialog>
//
QPointer<PrintPreviewDialog> PrintPreviewDialog::_self = 0L;
//
PrintPreviewDialog* PrintPreviewDialog::self( QWidget* parent ) {
    if ( !_self )
        _self = new PrintPreviewDialog( parent );
    return _self;
}
//
PrintPreviewDialog::PrintPreviewDialog( QWidget* parent )
        : QDialog( parent ) {
    setupUi( this );
    textEdit->setReadOnly (true);
    createActions();
    /// for Debugging
    QString printText;
    printText.append("<TABLE cellSpacing=0 cellPadding=0 width=\"100%\" border=0>");
    printText.append("<TBODY>");
    printText.append("<TR>");
    printText.append("<TD vAlign=top height=21>");
    printText.append("<H1>Testausgabe</H1></TD></TR>");
    printText.append("<TR>");
    printText.append("<TD vAlign=top height=21>bla bla bla (Seite 1");
    printText.append("</TD></TR></TBODY></TABLE>");
    printText.append("<!-- pagebreak -->");
    printText.append("<TABLE cellSpacing=0 cellPadding=0 width=\"100%\" border=0>");
    printText.append("<TBODY>");
    printText.append("<TR>");
    printText.append("<TD vAlign=top height=21>");
    printText.append("<H1>Testausgabe</H1></TD></TR>");
    printText.append("<TR>");
    printText.append("<TD vAlign=top height=21>bla bla bla (Seite 2");
    printText.append("</TD></TR></TBODY></TABLE>");
    printText.append("<!-- pagebreak -->");
    printText.append("<TABLE cellSpacing=0 cellPadding=0 width=\"100%\" border=0>");
    printText.append("<TBODY>");
    printText.append("<TR>");
    printText.append("<TD vAlign=top height=21>");
    printText.append("<H1>Testausgabe</H1></TD></TR>");
    printText.append("<TR>");
    printText.append("<TD vAlign=top height=21>bla bla bla (Seite 3");
    printText.append("</TD></TR></TBODY></TABLE>");
    printText.append("<!-- pagebreak -->");
    printText.append("<TABLE cellSpacing=0 cellPadding=0 width=\"100%\" border=0>");
    printText.append("<TBODY>");
    printText.append("<TR>");
    printText.append("<TD vAlign=top height=21>");
    printText.append("<H1>Testausgabe</H1></TD></TR>");
    printText.append("<TR>");
    printText.append("<TD vAlign=top height=21>bla bla bla (Seite 4");
    printText.append("</TD></TR></TBODY></TABLE>");
    printText.append("<!-- pagebreak -->");
    printText.append("<TABLE cellSpacing=0 cellPadding=0 width=\"100%\" border=0>");
    printText.append("<TBODY>");
    printText.append("<TR>");
    printText.append("<TD vAlign=top height=21>");
    printText.append("<H1>Testausgabe</H1></TD></TR>");
    printText.append("<TR>");
    printText.append("<TD vAlign=top height=21>bla bla bla (Seite 5");
    printText.append("</TD></TR></TBODY></TABLE>");
    QStringList docText;
    docText = printText.split("<!-- pagebreak -->", QString::SkipEmptyParts);
    emit setText(docText);
}
//
void PrintPreviewDialog::createActions() {
    connect(pB_Print,SIGNAL(clicked()),this,SLOT(print()));
    connect(pB_PDF,SIGNAL(clicked()),this,SLOT(pdf()));
    connect(pB_previousPage,SIGNAL(clicked()),this,SLOT(previousPage()));
    connect(pB_nextPage,SIGNAL(clicked()),this,SLOT(nextPage()));
}
void PrintPreviewDialog::setText(QStringList docText) {
    documentText = docText;
    gotoPage(0);
}
void PrintPreviewDialog::print() {
    output("print");
}
void PrintPreviewDialog::pdf() {
    output("pdf");
}
//
void PrintPreviewDialog::gotoPage(int page) {
    if (page > documentText.count()-1) {
        page = documentText.count() - 1;
    }
    else if (page < 0) {
        page = 0;
    }
    cPage = page;
    textEdit->setHtml(createHeader()+documentText.at(page)+createFooter());
}
void PrintPreviewDialog::nextPage() {
    gotoPage(++cPage);
}
void PrintPreviewDialog::previousPage() {
    gotoPage(--cPage);
}
void PrintPreviewDialog::output(QString how) {
    QPrinter* printer = new QPrinter(QPrinter::HighResolution);
    int from = 0;
    int to = documentText.count();
    if (how=="pdf") {
        printer->setOutputFormat(QPrinter::PdfFormat);
        printer->setOutputFileName(QFileDialog::getSaveFileName(this,"Dateiname wählen",".","Adobe Portable Document Format (*.pdf)"));
        printer->setFullPage(TRUE);
        printer->setColorMode(QPrinter::Color);
        printer->setOrientation(QPrinter::Portrait);
        printer->setPageSize(QPrinter::A4);
        printer->setCreator("WERTERmittlung");
    }
    else {
        printer->setOutputFormat(QPrinter::NativeFormat);
        QPrintDialog printDialog(printer, this);
        if (printDialog.exec() != QDialog::Accepted) {
            return;
        }
        if (printer->toPage() > documentText.count()
                || printer->toPage()==0) {
            to = documentText.count();
        }
        else {
            to = printer->toPage();
        }
        if (printer->fromPage() <0) {
            from = 0;
        }
        else {
            from = printer->fromPage();
        }
        printer->setPrintRange(QPrinter::AllPages);
    }

    QProgressDialog progress("Drucke...", "Druck abbrechen", 0, to-from, this);
    progress.setAutoReset(true);
    progress.setAutoClose(true);
    progress.show();

    for (int i=from; i<to; i++) {
        progress.setValue(i-from);
        qApp->processEvents();

        if (progress.wasCanceled())
            break;

        gotoPage(i);
        textEdit->document()->print(printer);
        printer->newPage();
    }
    emit this->close();
}
//
void PrintPreviewDialog::closeEvent( QCloseEvent* e ) {
    e->accept();
}
//
QString PrintPreviewDialog::createHeader() {
    QString h;
    h.append("<html><head>");
    h.append("<title>Titel</title>");
    h.append("</head><body>");
    h.append("<TABLE  width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">");
    h.append("<TR><TD align=\"left\">&nbsp;</TD>");
    h.append("<TR><TD align=\"center\">&nbsp;</TD>");
    h.append("<tr><td align=\"right\">Seite " + getsPageNumber() + "</td></tr>");
    h.append("</TABLE>");
    h.append("<hr noshade>");
    h.append("<TABLE  width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"height:100%\">");
    h.append("<TR style=\"height:100%\"><TD>");
    return h;
}
//
QString PrintPreviewDialog::createFooter() {
    QString f;
    f.append("</TD></TR></TABLE>");
    f.append("<hr noshade>");
    f.append("<TABLE width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">");
    f.append("<TR><TD align=\"left\">&nbsp;</TD>");
    f.append("<TR><TD align=\"center\">&nbsp;</TD>");
    f.append("<tr><TD align=\"right\">Erzeugt:" + QCoreApplication::applicationName() + " Stand: </td></tr>");
    f.append("</TABLE>");
    f.append("</body></html>");
    return f;
}
QString PrintPreviewDialog::getsPageNumber() {
    QString n;
    n.setNum(getiPageNumber()+1);
    return n;
}
int PrintPreviewDialog::getiPageNumber() {
    return cPage;
}
