/*
* Table View Print & Preview dialog
* Copyright (C) 2004-2008 by Gordos Kund / QnD Co Bt.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* Please contact gordos.kund@gmail.com with any questions on this license.
*/
#include "tdpreviewdialog.h"
#include <QtCore/QDebug>
#include <QtGui/QTextDocument>
#include <QtGui/QPageSetupDialog>
#include <QtGui/QGraphicsTextItem>
#include <QtGui/QHeaderView>
#include <QtGui/QPainter>
#include <QtCore/QTime>
#include <QtGui/QPrintDialog>
#include <QtCore/QRectF>
TDPreviewDialog::TDPreviewDialog(QTableView *p_tableView, QPrinter * p_printer, QWidget *parent) : QDialog(parent)
{
//variables
tableView=p_tableView;
leftMargin=80;
rightMargin=80;
topMargin=40;
bottomMargin=40;
spacing=4;
headerSize=60;
footerSize=60;
sceneZoomFactor=100;
columnZoomFactor=0.65;
gridMode=NoGrid;
model= tableView->model();
//setup printer
printer=p_printer;
printer->setFullPage(true);
switch (QLocale::system().country()) {
case QLocale::AnyCountry:
case QLocale::Canada:
case QLocale::UnitedStates:
case QLocale::UnitedStatesMinorOutlyingIslands:
printer->setPageSize(QPrinter::Letter);
break;
default:
printer->setPageSize(QPrinter::A4);
break;
}
setHeaderText("Document");
footerText=trUtf8("Page: ");
//get column widths
for (int i=0; i<model->columnCount(); i++) {
int colWidth=tableView->columnWidth(i);
colSizes.append(QTextLength(QTextLength::FixedLength,colWidth));
}
//title font
titleFont=tableView->font();
titleFont.setPointSize(24);
titleFont.setBold(false);
titleFont.setUnderline(false);
titleFmt =new QFontMetrics(titleFont);
//header font
headerFont=tableView->font();
headerFont.setBold(true);
headerFont.setUnderline(true);
headerFont.setPointSize(9);
headerFmt =new QFontMetrics(headerFont);
//normal font
font=tableView->font();
headerFont.setPointSize(9);
fmt =new QFontMetrics(font);
QString date=QDate::currentDate().toString(QLocale().dateFormat());
QString time=QTime::currentTime().toString(QLocale().timeFormat(QLocale::ShortFormat));
headerStdText = date+" "+time;
setupPage();
columnMultiplier=pageScene.width()/tableView->width()*columnZoomFactor;
}
//=================================================================
int TDPreviewDialog::exec()
{
//GUI
ui.setupUi(this);
connect(ui.horizontalSlider, SIGNAL(valueChanged(int)), ui.pageSpinBox, SLOT(setValue(int)));
connect(ui.prevToolButton, SIGNAL(clicked()), ui.pageSpinBox, SLOT(stepDown()));
connect(ui.nextToolButton, SIGNAL(clicked()), ui.pageSpinBox, SLOT(stepUp()));
ui.graphicsView->setScene(&pageScene);
ui.graphicsView->ensureVisible(0,0,10,10);
setupSpinBox();
on_pageSpinBox_valueChanged(1);
return QDialog::exec();
}
//=================================================================
TDPreviewDialog::~TDPreviewDialog()
{}
//=================================================================
void TDPreviewDialog::on_setupToolButton_clicked()
{
QPageSetupDialog *dialog;
dialog = new QPageSetupDialog(printer, this);
if (dialog->exec() == QDialog::Rejected) {
return;
}
setupPage();
on_pageSpinBox_valueChanged(1);
setupSpinBox();
}
//=================================================================
void TDPreviewDialog::on_zoomInToolButton_clicked()
{
ui.graphicsView->scale(1.5,1.5);
}
//=================================================================
void TDPreviewDialog::on_zoomOutToolButton_clicked()
{
ui.graphicsView->scale(1 / 1.5, 1 / 1.5);
}
//=================================================================
void TDPreviewDialog::on_pageSpinBox_valueChanged(int value)
{
paintPage(value);
pageScene.addRect(0,0,pageScene.width(),pageScene.height(),QPen(Qt::black, 2.0));
}
//=================================================================
void TDPreviewDialog::setupSpinBox()
{
ui.pageSpinBox->setPrefix(QString::number(pages)+" / ");
ui.pageSpinBox->setMaximum(pages);
ui.horizontalSlider->setMaximum(pages);
}
//=================================================================
void TDPreviewDialog::setupPage()
{
rowHeight=font.pointSize()+spacing;
QRectF rect=printer->paperRect();
QRectF rectNew = QRectF(0,0,rect.width() / printer->logicalDpiX() * sceneZoomFactor, rect.height() / printer->logicalDpiY() * sceneZoomFactor);
pageScene.setSceneRect(rectNew);
//count lines
lines = ((pageScene.height()-topMargin-bottomMargin-headerSize-footerSize)/rowHeight)-3;
//count pages
QAbstractItemModel *model= tableView->model();
int rowCount=model->rowCount();
double div = rowCount / lines;
int modulo = rowCount % lines;
if (modulo == 0 ) {
pages = QVariant(div).toInt();
} else {
div = div+1.0;
pages = QVariant(div).toInt();
}
}
//=================================================================
void TDPreviewDialog::setHeaderText(const QString &text)
{
headerText=text;
}
//=================================================================
void TDPreviewDialog::print()
{
//printDialog
printer->setFromTo(1,pages);
printer->setOutputFormat(QPrinter::NativeFormat);
printer->setOutputFileName("");
QPrintDialog dialog(printer, this);
dialog.setWindowTitle("Print Document");
if (dialog.exec() == QDialog::Rejected) {
return;
}
setupPage();
// get num copies
int doccopies;
int pagecopies;
if (printer->collateCopies()) {
doccopies = 1;
pagecopies = printer->numCopies();
} else {
doccopies = printer->numCopies();
pagecopies = 1;
}
// get page range
int firstpage = printer->fromPage();
int lastpage = printer->toPage();
if (firstpage == 0 && lastpage == 0) { // all pages
firstpage = 1;
lastpage =pages;
}
// print order
bool ascending = true;
if (printer->pageOrder() == QPrinter::LastPageFirst) {
int tmp = firstpage;
firstpage = lastpage;
lastpage = tmp;
ascending = false;
}
// loop through and print pages
QPainter painter(printer);
for (int dc=0; dc<doccopies; dc++) {
int pagenum = firstpage;
while (true) {
for (int pc=0; pc<pagecopies; pc++) {
if (printer->printerState() == QPrinter::Aborted ||
printer->printerS
评论28
最新资源