You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
412 lines
9.8 KiB
412 lines
9.8 KiB
15 years ago
|
/***************************************************************************
|
||
|
mreportviewer.cpp - Kugar QT report viewer widget
|
||
|
-------------------
|
||
|
begin : Fri Aug 13 1999
|
||
|
copyright : (C) 1999 by Mutiny Bay Software
|
||
|
email : info@mutinybaysoftware.com
|
||
|
copyright : (C) 2002 Alexander Dymo
|
||
|
email : cloudtemple@mksat.net
|
||
|
***************************************************************************/
|
||
|
|
||
|
#include <qapplication.h>
|
||
|
#include <kmessagebox.h>
|
||
|
#include <kprinter.h>
|
||
|
#include <klocale.h>
|
||
|
|
||
|
#include "mreportviewer.h"
|
||
|
|
||
|
namespace Kugar
|
||
|
{
|
||
|
|
||
|
/** Constructor */
|
||
|
MReportViewer::MReportViewer( MReportEngine *engine, QWidget *parent, const char *name ) : QWidget( parent, name ), progress( 0 )
|
||
|
{
|
||
|
rptEngine = engine;
|
||
|
rptEngine->addRef();
|
||
|
init();
|
||
|
}
|
||
|
|
||
|
MReportViewer::MReportViewer( QWidget *parent, const char *name ) : QWidget( parent, name ), progress( 0 )
|
||
|
{
|
||
|
// Create the scrollview
|
||
|
rptEngine = new MReportEngine();
|
||
|
init();
|
||
|
}
|
||
|
|
||
|
void MReportViewer::init()
|
||
|
{
|
||
|
scroller = new QScrollView( this );
|
||
|
|
||
|
// Connect the rendering update signal and slot
|
||
|
connect( rptEngine, SIGNAL( signalRenderStatus( int ) ),
|
||
|
SLOT( slotRenderProgress( int ) ) );
|
||
|
|
||
|
connect( rptEngine, SIGNAL( preferedTemplate( const QString & ) ),
|
||
|
SIGNAL( preferedTemplate( const QString & ) ) );
|
||
|
|
||
|
// Get the current color palette
|
||
|
QPalette p = palette();
|
||
|
QColorGroup g = p.active();
|
||
|
|
||
|
// Set the scroller's background color
|
||
|
scroller->viewport() ->setBackgroundColor( g.mid() );
|
||
|
|
||
|
// Create the report display widget
|
||
|
display = new MPageDisplay( scroller->viewport() );
|
||
|
|
||
|
// Set the display's default background color
|
||
|
display->setBackgroundColor( white );
|
||
|
|
||
|
// Add the display to the scrollview
|
||
|
scroller->addChild( display );
|
||
|
|
||
|
//Hide the display, we don't have a report yet ..
|
||
|
display->hide();
|
||
|
}
|
||
|
|
||
|
/** Destructor */
|
||
|
MReportViewer::~MReportViewer()
|
||
|
{
|
||
|
clearReport();
|
||
|
rptEngine->removeRef();
|
||
|
}
|
||
|
|
||
|
/** Report viewer's paint event */
|
||
|
void MReportViewer::paintEvent( QPaintEvent* event )
|
||
|
{}
|
||
|
|
||
|
/** Report viewer's resize event */
|
||
|
void MReportViewer::resizeEvent( QResizeEvent* event )
|
||
|
{
|
||
|
scroller->resize( event->size() );
|
||
|
}
|
||
|
|
||
|
// Set the report's data from an in-line string.
|
||
|
|
||
|
bool MReportViewer::setReportData( const QString &data )
|
||
|
{
|
||
|
return rptEngine -> setReportData( data );
|
||
|
}
|
||
|
|
||
|
|
||
|
// Set the report's data from an i/o device.
|
||
|
|
||
|
bool MReportViewer::setReportData( QIODevice *dev )
|
||
|
{
|
||
|
return rptEngine -> setReportData( dev );
|
||
|
}
|
||
|
|
||
|
|
||
|
// Set the report's template from an in-line string.
|
||
|
|
||
|
bool MReportViewer::setReportTemplate( const QString &tpl )
|
||
|
{
|
||
|
return rptEngine -> setReportTemplate( tpl );
|
||
|
}
|
||
|
|
||
|
|
||
|
// Set the report's template from an i/o device.
|
||
|
|
||
|
bool MReportViewer::setReportTemplate( QIODevice *dev )
|
||
|
{
|
||
|
return rptEngine -> setReportTemplate( dev );
|
||
|
}
|
||
|
|
||
|
|
||
|
/** Generates the report's page collection */
|
||
|
bool MReportViewer::renderReport()
|
||
|
{
|
||
|
// Render the report
|
||
|
report = rptEngine->renderReport();
|
||
|
|
||
|
// Display the first page of the report
|
||
|
if ( report && report->getFirstPage() != 0 )
|
||
|
{
|
||
|
display->setPageDimensions( report->pageDimensions() );
|
||
|
display->setPage( report->getFirstPage() );
|
||
|
display->show();
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/** Clears the report's page collection */
|
||
|
void MReportViewer::clearReport()
|
||
|
{
|
||
|
// Hide the display
|
||
|
display->hide();
|
||
|
}
|
||
|
|
||
|
/** Prints the rendered report to the selected printer - displays KDE print dialog */
|
||
|
void MReportViewer::printReport()
|
||
|
{
|
||
|
// Check for a report
|
||
|
if ( !report )
|
||
|
return ;
|
||
|
|
||
|
// Get the page count
|
||
|
int cnt = report->pageCount();
|
||
|
|
||
|
// Check if there is a report or any pages to print
|
||
|
if ( cnt == 0 )
|
||
|
{
|
||
|
KMessageBox::error( this, i18n( "There are no pages in the\nreport to print." ) );
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
// Set the printer dialog
|
||
|
KPrinter printer;
|
||
|
|
||
|
setupPrinter( printer );
|
||
|
if ( printer.setup( this ) )
|
||
|
printReport( printer );
|
||
|
}
|
||
|
|
||
|
/** Shows the first page in the report */
|
||
|
void MReportViewer::slotFirstPage()
|
||
|
{
|
||
|
QPicture * page;
|
||
|
|
||
|
if ( !report )
|
||
|
return ;
|
||
|
|
||
|
if ( ( page = report->getFirstPage() ) != 0 )
|
||
|
{
|
||
|
display->setPage( page );
|
||
|
display->repaint();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** Shows the next page in the report */
|
||
|
void MReportViewer::slotNextPage()
|
||
|
{
|
||
|
QPicture * page;
|
||
|
|
||
|
if ( !report )
|
||
|
return ;
|
||
|
|
||
|
int index = report->getCurrentIndex();
|
||
|
|
||
|
if ( ( page = report->getNextPage() ) != 0 )
|
||
|
{
|
||
|
display->setPage( page );
|
||
|
display->repaint();
|
||
|
}
|
||
|
else
|
||
|
report->setCurrentPage( index );
|
||
|
}
|
||
|
|
||
|
/** Shows the prevoius page in the report */
|
||
|
void MReportViewer::slotPrevPage()
|
||
|
{
|
||
|
QPicture * page;
|
||
|
|
||
|
if ( !report )
|
||
|
return ;
|
||
|
|
||
|
int index = report->getCurrentIndex();
|
||
|
|
||
|
if ( ( page = report->getPreviousPage() ) != 0 )
|
||
|
{
|
||
|
display->setPage( page );
|
||
|
display->repaint();
|
||
|
}
|
||
|
else
|
||
|
report->setCurrentPage( index );
|
||
|
}
|
||
|
|
||
|
/** Shows the last page in the report */
|
||
|
void MReportViewer::slotLastPage()
|
||
|
{
|
||
|
QPicture * page;
|
||
|
|
||
|
if ( !report )
|
||
|
return ;
|
||
|
|
||
|
if ( ( page = report->getLastPage() ) != 0 )
|
||
|
{
|
||
|
display->setPage( page );
|
||
|
display->repaint();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** Cancel printing of the report */
|
||
|
void MReportViewer::slotCancelPrinting()
|
||
|
{
|
||
|
printer->abort();
|
||
|
}
|
||
|
|
||
|
/** Updates rendering progress */
|
||
|
void MReportViewer::slotRenderProgress( int p )
|
||
|
{
|
||
|
|
||
|
// Check if the dialog was created
|
||
|
if ( progress == 0 )
|
||
|
{
|
||
|
totalSteps = rptEngine->getRenderSteps();
|
||
|
progress = new QProgressDialog( i18n("Creating report..."), i18n("Cancel"),
|
||
|
totalSteps, this, "progress", true );
|
||
|
progress->setMinimumDuration( M_PROGRESS_DELAY );
|
||
|
}
|
||
|
|
||
|
// Update the dialog
|
||
|
progress->setProgress( p );
|
||
|
qApp->processEvents();
|
||
|
|
||
|
// Check if the action was canceled
|
||
|
if ( progress->wasCancelled() )
|
||
|
{
|
||
|
progress->setProgress( totalSteps );
|
||
|
rptEngine->slotCancelRendering();
|
||
|
}
|
||
|
|
||
|
// Cleanup dialog if necessary
|
||
|
if ( progress->progress() == -1 )
|
||
|
{
|
||
|
delete progress;
|
||
|
progress = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
// Return the preferred size.
|
||
|
|
||
|
QSize MReportViewer::sizeHint() const
|
||
|
{
|
||
|
return scroller -> sizeHint();
|
||
|
}
|
||
|
|
||
|
void MReportViewer::printReport( KPrinter &printer )
|
||
|
{
|
||
|
// Check for a report
|
||
|
if ( !report )
|
||
|
return ;
|
||
|
|
||
|
// Get the page count
|
||
|
int cnt = report->pageCount();
|
||
|
|
||
|
// Check if there is a report or any pages to print
|
||
|
if ( cnt == 0 )
|
||
|
{
|
||
|
KMessageBox::error( this, i18n( "There are no pages in the\nreport to print." ) );
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
QPicture* page;
|
||
|
QPainter painter;
|
||
|
bool printRev;
|
||
|
|
||
|
// Save the viewer's page index
|
||
|
int viewIdx = report->getCurrentIndex();
|
||
|
|
||
|
// Check the order we are printing the pages
|
||
|
if ( printer.pageOrder() == KPrinter::FirstPageFirst )
|
||
|
printRev = false;
|
||
|
else
|
||
|
printRev = true;
|
||
|
|
||
|
// Get the count of pages and copies to print
|
||
|
int printFrom = printer.fromPage() - 1;
|
||
|
int printTo = printer.toPage();
|
||
|
int printCnt = ( printTo - printFrom );
|
||
|
int printCopies = printer.numCopies();
|
||
|
int totalSteps = printCnt * printCopies;
|
||
|
int currentStep = 1;
|
||
|
|
||
|
// Set copies to 1, KPrinter copies does not appear to work ...
|
||
|
printer.setNumCopies( 1 );
|
||
|
|
||
|
// Setup the progress dialog
|
||
|
QProgressDialog progress( i18n( "Printing report..." ),
|
||
|
i18n( "Cancel" ),
|
||
|
totalSteps, this, "progress", true );
|
||
|
progress.setMinimumDuration( M_PROGRESS_DELAY );
|
||
|
QObject::connect( &progress, SIGNAL( cancelled() ), this, SLOT( slotCancelPrinting() ) );
|
||
|
progress.setProgress( 0 );
|
||
|
qApp->processEvents();
|
||
|
|
||
|
// Start the printer
|
||
|
painter.begin( &printer );
|
||
|
|
||
|
// Print each copy
|
||
|
for ( int j = 0; j < printCopies; j++ )
|
||
|
{
|
||
|
// Print each page in the collection
|
||
|
for ( int i = printFrom ; i < printTo; i++, currentStep++ )
|
||
|
{
|
||
|
if ( !printer.aborted() )
|
||
|
{
|
||
|
progress.setProgress( currentStep );
|
||
|
qApp->processEvents();
|
||
|
|
||
|
if ( printRev )
|
||
|
report->setCurrentPage( ( printCnt == 1 ) ? i : ( printCnt - 1 ) - i );
|
||
|
else
|
||
|
report->setCurrentPage( i );
|
||
|
|
||
|
page = report->getCurrentPage();
|
||
|
page->play( &painter );
|
||
|
if ( i < printCnt - 1 )
|
||
|
printer.newPage();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
j = printCopies;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if ( j < printCopies - 1 )
|
||
|
printer.newPage();
|
||
|
}
|
||
|
|
||
|
// Cleanup printing
|
||
|
setCursor( arrowCursor );
|
||
|
painter.end();
|
||
|
report->setCurrentPage( viewIdx );
|
||
|
}
|
||
|
|
||
|
void MReportViewer::setupPrinter( KPrinter &printer )
|
||
|
{
|
||
|
int cnt = report->pageCount();
|
||
|
|
||
|
printer.setPageSize( ( KPrinter::PageSize ) report->pageSize() );
|
||
|
printer.setOrientation( ( KPrinter::Orientation ) report->pageOrientation() );
|
||
|
printer.setMinMax( 1, cnt );
|
||
|
printer.setFromTo( 1, cnt );
|
||
|
printer.setFullPage( true );
|
||
|
}
|
||
|
|
||
|
void MReportViewer::printReportSilent( int printFrom, int printTo, int printCopies, QString printerName )
|
||
|
{
|
||
|
int cnt = report->pageCount();
|
||
|
if ( printFrom == -1 )
|
||
|
printFrom = 1;
|
||
|
if ( printTo == -1 )
|
||
|
printTo = cnt;
|
||
|
if ( printCopies == -1 )
|
||
|
printCopies = 1;
|
||
|
|
||
|
|
||
|
printer = new KPrinter();
|
||
|
|
||
|
printer->setPageSize( ( KPrinter::PageSize ) report->pageSize() );
|
||
|
printer->setOrientation( ( KPrinter::Orientation ) report->pageOrientation() );
|
||
|
printer->setMinMax( 1, cnt );
|
||
|
printer->setFullPage( true );
|
||
|
printer->setNumCopies( printCopies );
|
||
|
printer->setFromTo( printFrom, printTo );
|
||
|
if ( !printerName.isEmpty() )
|
||
|
printer->setPrinterName( printerName );
|
||
|
|
||
|
printReport( *printer );
|
||
|
|
||
|
delete printer;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
#include "mreportviewer.moc"
|