00001 #include "printpreview.h"
00002
00003 PrintPreviewDialog::PrintPreviewDialog(QString docname, QTableView *p_tableView, QPrinter * p_printer, QWidget *parent) : QDialog(parent)
00004 {
00005 tableView=p_tableView;
00006 leftMargin=80;
00007 rightMargin=80;
00008 topMargin=40;
00009 bottomMargin=40;
00010 spacing=4;
00011 headerSize=60;
00012 footerSize=60;
00013 sceneZoomFactor=100;
00014 columnZoomFactor=0.65;
00015
00016 model= tableView->model();
00017
00018
00019 printer=p_printer;
00020 printer->setFullPage(true);
00021 switch(QLocale::system().country())
00022 {
00023 case QLocale::AnyCountry:
00024
00025 case QLocale::Canada:
00026
00027 case QLocale::UnitedStates:
00028
00029 case QLocale::UnitedStatesMinorOutlyingIslands:
00030 printer->setPageSize(QPrinter::Letter);
00031 break;
00032
00033 default:
00034 printer->setPageSize(QPrinter::A4);
00035 break;
00036 }
00037
00038 QFileInfo fi(docname);
00039 setHeaderText(fi.baseName());
00040 footerText=tr("Seite: ");
00041
00042
00043
00044 for (int i=0; i<model->columnCount(); i++)
00045 {
00046 int colWidth=tableView->columnWidth(i);
00047 colSizes.append(QTextLength(QTextLength::FixedLength,colWidth));
00048 }
00049
00050
00051 titleFont=tableView->font();
00052 titleFont.setPointSize(24);
00053 titleFont.setBold(false);
00054 titleFont.setUnderline(false);
00055 titleFmt =new QFontMetrics(titleFont);
00056
00057
00058
00059 headerFont=tableView->font();
00060 headerFont.setBold(true);
00061 headerFont.setUnderline(true);
00062 headerFont.setPointSize(9);
00063 headerFmt =new QFontMetrics(headerFont);
00064
00065
00066 font=tableView->font();
00067 headerFont.setPointSize(9);
00068 fmt =new QFontMetrics(font);
00069
00070
00071 QString date=QDate::currentDate().toString(QLocale().dateFormat());
00072 QString time=QTime::currentTime().toString(QLocale().timeFormat(QLocale::ShortFormat));
00073 headerStdText = date+" "+time;
00074
00075 setupPage();
00076 columnMultiplier=pageScene.width()/tableView->width()*columnZoomFactor;
00077
00078 on_pageSpinBox_valueChanged(1);
00079 }
00080
00081 int PrintPreviewDialog::exec()
00082 {
00083 setupUi(this);
00084 graphicsView->setScene(&pageScene);
00085 graphicsView->ensureVisible(0,0,10,10);
00086 connect(okPushButton, SIGNAL(clicked()), this, SLOT(print()));
00087 setupSpinBox();
00088 return QDialog::exec();
00089 }
00090
00091 PrintPreviewDialog::~PrintPreviewDialog()
00092 {
00093
00094 }
00095
00096 void PrintPreviewDialog::on_setupToolButton_clicked()
00097 {
00098 QPageSetupDialog *dialog;
00099 dialog = new QPageSetupDialog(printer, this);
00100 if(dialog->exec() == QDialog::Rejected)
00101 {
00102 return;
00103 }
00104 setupPage();
00105 on_pageSpinBox_valueChanged(1);
00106 setupSpinBox();
00107 }
00108
00109 void PrintPreviewDialog::on_zoomInToolButton_clicked()
00110 {
00111 graphicsView->scale(1.5,1.5);
00112 }
00113
00114 void PrintPreviewDialog::on_zoomOutToolButton_clicked()
00115 {
00116 graphicsView->scale(1 / 1.5, 1 / 1.5);
00117 }
00118
00119 void PrintPreviewDialog::on_pageSpinBox_valueChanged(int value)
00120 {
00121 paintPage(value);
00122 pageScene.addRect(0,0,pageScene.width(),pageScene.height(),QPen(Qt::black, 2.0));
00123 }
00124
00125 void PrintPreviewDialog::setupSpinBox()
00126 {
00127 pageSpinBox->setPrefix(QString::number(pages)+" / ");
00128 pageSpinBox->setMaximum(pages);
00129 }
00130
00131 void PrintPreviewDialog::setupPage()
00132 {
00133 rowHeight=font.pointSize()+spacing;
00134 QRectF rect=printer->paperRect();
00135 QRectF rectNew = QRectF(0,0,rect.width() / printer->logicalDpiX() * sceneZoomFactor, rect.height() / printer->logicalDpiY() * sceneZoomFactor);
00136 pageScene.setSceneRect(rectNew);
00137
00138
00139 lines = (int)(((pageScene.height()-topMargin-bottomMargin-headerSize-footerSize)/rowHeight)-3);
00140
00141
00142 QAbstractItemModel *model= tableView->model();
00143 int rowCount=model->rowCount();
00144 double div = rowCount / lines;
00145 int modulo = rowCount % lines;
00146 if(modulo == 0 )
00147 {
00148 pages = QVariant(div).toInt();
00149 }
00150 else
00151 {
00152 div = div+1.0;
00153 pages = QVariant(div).toInt();
00154 }
00155 }
00156
00157 void PrintPreviewDialog::setHeaderText(const QString &text)
00158 {
00159 headerText=text;
00160 }
00161
00162 void PrintPreviewDialog::print()
00163 {
00164
00165 printer->setFromTo(1,pages);
00166 printer->setOutputFormat(QPrinter::NativeFormat);
00167 printer->setOutputFileName("");
00168 QPrintDialog dialog(printer, this);
00169 dialog.setWindowTitle(tr("Dokument ausdrucken"));
00170 if(dialog.exec() == QDialog::Rejected)
00171 {
00172 return;
00173 }
00174 setupPage();
00175
00176
00177
00178 int doccopies;
00179 int pagecopies;
00180 if(printer->collateCopies())
00181 {
00182 doccopies = 1;
00183 pagecopies = printer->numCopies();
00184 }
00185 else
00186 {
00187 doccopies = printer->numCopies();
00188 pagecopies = 1;
00189 }
00190
00191
00192 int firstpage = printer->fromPage();
00193 int lastpage = printer->toPage();
00194 if(firstpage == 0 && lastpage == 0)
00195 {
00196 firstpage = 1;
00197 lastpage =pages;
00198 }
00199
00200
00201 bool ascending = true;
00202 if(printer->pageOrder() == QPrinter::LastPageFirst) {
00203 int tmp = firstpage;
00204 firstpage = lastpage;
00205 lastpage = tmp;
00206 ascending = false;
00207 }
00208
00209
00210 QPainter painter(printer);
00211 painter.setRenderHint(QPainter::Antialiasing);
00212 for (int dc=0; dc<doccopies; dc++)
00213 {
00214 int pagenum = firstpage;
00215 while (true)
00216 {
00217 for (int pc=0; pc<pagecopies; pc++)
00218 {
00219 if(printer->printerState() == QPrinter::Aborted || printer->printerState() == QPrinter::Error)
00220 {
00221 break;
00222 }
00223
00224
00225 pageScene.render(&painter);
00226 if(pc < pagecopies-1) printer->newPage();
00227 }
00228 if(pagenum == lastpage) break;
00229 if(ascending)
00230 {
00231 pagenum++;
00232 }
00233 else
00234 {
00235 pagenum--;
00236 }
00237 printer->newPage();
00238 }
00239
00240 if(dc < doccopies-1)
00241 printer->newPage();
00242 }
00243 }
00244
00245 void PrintPreviewDialog::exportPdf(const QString &filename)
00246 {
00247
00248 QString dialogcaption = "PDF exportieren";
00249 QString exportname = QFileDialog::getSaveFileName(this, dialogcaption, filename, "*.pdf");
00250 if(exportname.isEmpty()) return;
00251 if(QFileInfo(exportname).suffix().isEmpty())
00252 exportname.append(".pdf");
00253
00254
00255 printer->setOutputFormat(QPrinter::PdfFormat);
00256 printer->setOutputFileName(exportname);
00257
00258
00259 QPainter painter(printer);
00260 painter.setRenderHint(QPainter::Antialiasing);
00261 for (int pagenum=1; pagenum<=pages; pagenum++) {
00262 paintPage(pagenum);
00263 pageScene.render(&painter);
00264 if(pagenum < pages) {
00265 printer->newPage();
00266 }
00267 }
00268 }
00269
00270 void PrintPreviewDialog::paintPage(int pagenum)
00271 {
00272
00273 QList<QGraphicsItem*> L = pageScene.items();
00274 while ( ! L.empty() ) {
00275 pageScene.removeItem( L.first() );
00276 delete L.first();
00277 L.removeFirst();
00278 }
00279
00280
00281 int csize=0;
00282 for (int i=0; i<model->columnCount(); i++) {
00283 int logicalIndex=tableView->horizontalHeader()->logicalIndex(i);
00284 QString txt = model->headerData(logicalIndex,Qt::Horizontal,Qt::DisplayRole).toString();
00285 QGraphicsTextItem *item=new QGraphicsTextItem();
00286 item->setFont(headerFont);
00287 txt=headerFmt->elidedText(txt,Qt::ElideRight,QVariant(colSizes[logicalIndex].rawValue()).toInt()-8);
00288 item->setPlainText(txt);
00289 item->moveBy((csize*columnMultiplier)+leftMargin,topMargin+headerSize+(spacing*2));
00290 csize=csize+QVariant(colSizes[logicalIndex].rawValue()).toInt();
00291 pageScene.addItem(item);
00292 }
00293
00294
00295 for (int i=0; i<lines; i++) {
00296 csize=0;
00297 for (int j=0; j<model->columnCount(); j++) {
00298 int logicalIndex=tableView->horizontalHeader()->logicalIndex(j);
00299 QString txt = model->data(model->index((pagenum-1)*lines+i,logicalIndex)).toString();
00300 QGraphicsTextItem *item=new QGraphicsTextItem();
00301 item->setFont(font);
00302 txt=fmt->elidedText(txt,Qt::ElideRight,QVariant(colSizes[logicalIndex].rawValue()).toInt()-8);
00303 item->setPlainText(txt);
00304 item->moveBy((csize*columnMultiplier)+leftMargin,(i*rowHeight)+topMargin+headerSize+(rowHeight*2));
00305 csize=csize+QVariant(colSizes[logicalIndex].rawValue()).toInt();
00306 pageScene.addItem(item);
00307
00308 }
00309 }
00310
00311
00312 if(headerSize > 0) {
00313
00314 pageScene.addLine(leftMargin,headerSize+topMargin,pageScene.width()-rightMargin, headerSize+topMargin,QPen(Qt::black, 1.0));
00315
00316
00317 QGraphicsTextItem *titleItem=new QGraphicsTextItem();
00318 titleItem->setFont(titleFont);
00319 titleItem->setPlainText(headerText);
00320 int titleWidth=titleFmt->width(headerText);
00321 double xpos=(pageScene.width()/2)-(titleWidth/2);
00322 double ypos=(headerSize/2)-(titleFmt->height()/2);
00323 titleItem->moveBy(xpos,ypos+topMargin);
00324 pageScene.addItem(titleItem);
00325
00326
00327 QGraphicsTextItem *item=new QGraphicsTextItem();
00328 item->setFont(font);
00329 item->setPlainText(headerStdText);
00330 item->moveBy(leftMargin,headerSize-rowHeight-spacing+topMargin);
00331 pageScene.addItem(item);
00332 }
00333
00334
00335 if(footerSize > 0) {
00336 pageScene.addLine(leftMargin,pageScene.height()-footerSize-bottomMargin,pageScene.width()-rightMargin, pageScene.height()-footerSize-bottomMargin,QPen(Qt::black, 1.0));
00337 QGraphicsTextItem *item=new QGraphicsTextItem();
00338 item->setFont(font);
00339 item->setPlainText(footerText+QString::number(pages)+" / "+QString::number(pagenum));
00340 item->moveBy(leftMargin,pageScene.height()-footerSize-bottomMargin+spacing);
00341 pageScene.addItem(item);
00342 }
00343
00344 }