00001 #include "printing.h"
00002 #include "../Data/project.h"
00003 #include "../Data/dataexercise.h"
00004 #include "../Data/dataproject.h"
00005 #include "../Models/exercisemodel.h"
00006 #include "../Models/accountmodel.h"
00007 #include "../Views/descriptionwidget.h"
00008 #include "../Views/accountingrecordwidget.h"
00009 #include "../Views/piechartview.h"
00010 #include "../Data/settings.h"
00011 #include <QLayout>
00012 #include <QTableWidget>
00013 #include <QHeaderView>
00014
00015 Printing::Printing(QPrinter *printer, Settings &settings, ExerciseModel *model, DataProject *project, AccountModel *table, QObject *parent) : QObject(parent)
00016 {
00017
00018 p_project = project;
00019 p_printer = printer;
00020 p_printer->setOutputFormat(QPrinter::NativeFormat);
00021
00022 this->settings = &settings;
00023
00024 p_model = model;
00025 p_table = table;
00026
00027
00028 leftMargin = 40;
00029 leftMarginExercise = 50;
00030 rightMargin = 40;
00031 topMargin = 40;
00032 bottomMargin = 40;
00033 spacing = 4;
00034 headerSize = 60;
00035 footerSize = 60;
00036 sceneZoomFactor = 100;
00037
00038
00039 chapterTitleFont = QFont();
00040 chapterTitleFont.setPointSize(16);
00041 chapterTitleFont.setBold(true);
00042 chapterTitleFont.setUnderline(true);
00043 titleFmt = new QFontMetrics(chapterTitleFont);
00044
00045
00046 exerciseTitleFont = QFont();
00047 exerciseTitleFont.setBold(true);
00048 exerciseTitleFont.setUnderline(false);
00049 exerciseTitleFont.setPointSize(14);
00050
00051
00052 font = QFont();
00053 exerciseTitleFont.setPointSize(11);
00054
00055 headerText = Project::name();
00056 }
00057
00058
00059 void Printing::setupPage(QGraphicsScene *pageScene)
00060 {
00061 rowHeight = font.pointSize() + spacing;
00062 QRectF rect=p_printer->paperRect();
00063 QRectF rectNew = QRectF(0,0,rect.width() / p_printer->logicalDpiX() * sceneZoomFactor, rect.height() / p_printer->logicalDpiY() * sceneZoomFactor);
00064 pageScene->setSceneRect(rectNew);
00065
00066
00067 pageScene->addLine(leftMargin,headerSize+topMargin,pageScene->width()-rightMargin, headerSize+topMargin,QPen(Qt::black, 1.0));
00068
00069
00070 QGraphicsTextItem *titleItem=new QGraphicsTextItem();
00071 titleItem->setFont(projectTitleFont);
00072 titleItem->setPlainText(headerText);
00073 int titleWidth=titleFmt->width(headerText);
00074 double xpos=(pageScene->width()/2)-(titleWidth/2);
00075 double ypos=(headerSize/2)-(titleFmt->height()/2);
00076 titleItem->moveBy(xpos,ypos+topMargin);
00077 pageScene->addItem(titleItem);
00078
00079
00080 QString date=QDate::currentDate().toString(QLocale().dateFormat());
00081 QString time=QTime::currentTime().toString(QLocale().timeFormat(QLocale::ShortFormat));
00082 QString mergedDateTime = date + " " + time;
00083 QGraphicsTextItem *item = new QGraphicsTextItem();
00084 item->setFont(font);
00085 item->setPlainText(mergedDateTime);
00086 item->moveBy(leftMargin,headerSize-rowHeight-spacing+topMargin);
00087 pageScene->addItem(item);
00088 }
00089
00090 void Printing::print()
00091 {
00092 QPrintDialog dialog(p_printer, NULL);
00093
00094 if (dialog.exec() == QDialog::Rejected)
00095 {
00096 return;
00097 }
00098 else
00099 {
00100 QPainter p_painter(p_printer);
00101 p_painter.setRenderHint(QPainter::HighQualityAntialiasing, true);
00102 for(int k = 0; k < p_printer->numCopies(); k++)
00103 {
00104 for(int i = 0;i < pageSceneList.count(); i++)
00105 {
00106 pageSceneList.value(i)->render(&p_painter);
00107 p_printer->newPage();
00108 }
00109 }
00110 }
00111 }
00112
00113 void Printing::paintPage(bool placeForSolution, bool extraPageForSolution)
00114 {
00115 if(pageSceneList.count() != 0)
00116 {
00117 pageSceneList.clear();
00118 }
00119
00120
00121 QString chapterTitle, exerciseTitle;
00122 int space = 30;
00123 QModelIndex currentChapterIndex = p_model->index(0, 0, QModelIndex());
00124 for(int i = 0; currentChapterIndex.isValid(); i++)
00125 {
00126 QModelIndex currentExerciseIndex = p_model->index(0,0, currentChapterIndex);
00127 for(int j = 0; currentExerciseIndex.isValid(); j++)
00128 {
00129 if(p_model->data(currentExerciseIndex, Qt::CheckStateRole).toBool())
00130 {
00131 QGraphicsScene *p_pageScene = new QGraphicsScene();
00132 setupPage(p_pageScene);
00133
00134 chapterTitle = currentChapterIndex.data(0).toString();
00135
00136 QGraphicsTextItem *chapterTitleItem = new QGraphicsTextItem();
00137 chapterTitleItem->setFont(chapterTitleFont);
00138 chapterTitleItem->setPlainText(chapterTitle);
00139 chapterTitleItem->moveBy(leftMargin, headerSize-rowHeight-spacing+topMargin+space);
00140 p_pageScene->addItem(chapterTitleItem);
00141 space += 40;
00142
00143
00144 exerciseTitle = currentExerciseIndex.data(0).toString();
00145 QGraphicsTextItem *exerciseTitleItem = new QGraphicsTextItem();
00146 exerciseTitleItem->setFont(exerciseTitleFont);
00147 exerciseTitleItem->setPlainText(exerciseTitle);
00148 exerciseTitleItem->moveBy(leftMarginExercise, headerSize-rowHeight-spacing+topMargin+space);
00149 p_pageScene->addItem(exerciseTitleItem);
00150 space += 30;
00151
00152
00153 qDebug()<<"Chapter: "<<chapterTitle<<" Exercise: "<<exerciseTitle;
00154 DataExercise *currentExercise = p_project->exercise(chapterTitle, exerciseTitle);
00155
00156
00157 int maximumWidthExercise = (int)p_pageScene->width()-rightMargin-leftMarginExercise;
00158
00159
00160 DescriptionWidget *descriptionWidget = new DescriptionWidget();
00161 descriptionWidget->createWidgetForPupil(currentExercise);
00162 descriptionWidget->setMaximumWidth(maximumWidthExercise);
00163
00164 QGraphicsProxyWidget *proxy = p_pageScene->addWidget(descriptionWidget);
00165 proxy->setPos(leftMarginExercise, headerSize-rowHeight-spacing+topMargin+space);
00166 QSizeF size = proxy->size();
00167 space += (int)size.height() + 20;
00168
00169 if(placeForSolution)
00170 {
00171 QGraphicsTextItem *emptySolutionItem = new QGraphicsTextItem();
00172 emptySolutionItem->setFont(font);
00173 emptySolutionItem->moveBy(leftMarginExercise, headerSize-rowHeight-spacing+topMargin+space);
00174 p_pageScene->addItem(emptySolutionItem);
00175 space += 100;
00176 }
00177 else
00178 {
00179 if(currentExercise->accountingRecords()->size() > 0)
00180 {
00181
00182 AccountingRecordWidget *accountingRecordWidget = new AccountingRecordWidget();
00183 accountingRecordWidget->setSettings(settings);
00184 accountingRecordWidget->makeWidgetForPrinter(p_table, currentExercise, true);
00185
00186 QGraphicsProxyWidget *proxya = p_pageScene->addWidget(accountingRecordWidget);
00187 proxya->setPos(leftMarginExercise, headerSize-rowHeight-spacing+topMargin+space);
00188 size = proxya->size();
00189 space += (int)size.height() + 20;
00190 }
00191 }
00192
00193 if(!extraPageForSolution)
00194 {
00195 if(currentExercise->solutionRecords()->size() > 0)
00196 {
00197
00198 QGraphicsTextItem *titleItem = new QGraphicsTextItem();
00199 titleItem->setFont(font);
00200 titleItem->setPlainText("Lösung: ");
00201 titleItem->moveBy(leftMarginExercise, headerSize-rowHeight-spacing+topMargin+space);
00202 p_pageScene->addItem(titleItem);
00203 space += 30;
00204
00205
00206 AccountingRecordWidget *accountingRecordWidgets = new AccountingRecordWidget();
00207 accountingRecordWidgets->setSettings(settings);
00208 accountingRecordWidgets->makeWidgetForPrinter(p_table, currentExercise, false);
00209
00210 QGraphicsProxyWidget *proxyas = p_pageScene->addWidget(accountingRecordWidgets);
00211 proxyas->setPos(leftMarginExercise, headerSize-rowHeight-spacing+topMargin+space);
00212 size = proxyas->size();
00213 space += (int)size.height() + 20;
00214 }
00215 }
00216 pageSceneList.append(p_pageScene);
00217 }
00218
00219 currentExerciseIndex = p_model->index(j+1, 0, currentChapterIndex);
00220 space = 30;
00221 }
00222
00223 currentChapterIndex = p_model->index(i+1, 0, QModelIndex());
00224 }
00225 if(extraPageForSolution)
00226 {
00227 paintExtraPageForSolution();
00228 }
00229 }
00230
00231 void Printing::paintFooter()
00232 {
00233 for(int i = 0;i < pageSceneList.count(); i++)
00234 {
00235 pageSceneList.value(i)->addLine(leftMargin,pageSceneList.value(i)->height()-footerSize-bottomMargin,pageSceneList.value(i)->width()-rightMargin, pageSceneList.value(i)->height()-footerSize-bottomMargin,QPen(Qt::black, 1.0));
00236 QGraphicsTextItem *item=new QGraphicsTextItem();
00237 item->setFont(font);
00238
00239 item->setPlainText(QString::number(i+1) + "/" + QString::number(pageSceneList.count()));
00240 item->moveBy(leftMargin,pageSceneList.value(i)->height()-footerSize-bottomMargin+spacing);
00241 pageSceneList.value(i)->addItem(item);
00242 }
00243 }
00244
00245 QGraphicsScene* Printing::pageScene(int nr)
00246 {
00247 return pageSceneList.value(nr);
00248 }
00249
00250 void Printing::paintIntroPage()
00251 {
00252 QString owner = Project::ownerName();
00253 QString description = Project::description();
00254 QString mailaddy = Project::ownerEmail();
00255 QDateTime datecreation = Project::dateCreation();
00256 QDateTime datemodification = Project::dateModified();
00257 QGraphicsScene *p_pageScene = new QGraphicsScene();
00258
00259 setupPage(p_pageScene);
00260
00261
00262 QGraphicsTextItem *titleItem = new QGraphicsTextItem();
00263 titleItem->setFont(chapterTitleFont);
00264 titleItem->setPlainText(headerText);
00265 titleItem->moveBy(leftMargin,130);
00266 p_pageScene->addItem(titleItem);
00267
00268
00269 QGraphicsTextItem *ownerItem = new QGraphicsTextItem();
00270 ownerItem->setFont(exerciseTitleFont);
00271 ownerItem->setPlainText("Besitzer: " + owner);
00272 ownerItem->moveBy(leftMargin,170);
00273 p_pageScene->addItem(ownerItem);
00274
00275
00276 QGraphicsTextItem *descItem = new QGraphicsTextItem();
00277 descItem->setFont(exerciseTitleFont);
00278 descItem->setPlainText("Allgemeine Informationen zum Dokument");
00279 descItem->moveBy(leftMargin,280);
00280 p_pageScene->addItem(descItem);
00281
00282
00283 QGraphicsTextItem *descriptionItem = new QGraphicsTextItem();
00284 descriptionItem->setFont(font);
00285 descriptionItem->setPlainText(description);
00286 descriptionItem->moveBy(leftMargin,300);
00287 p_pageScene->addItem(descriptionItem);
00288
00289
00290 QGraphicsTextItem *resultItem = new QGraphicsTextItem();
00291 resultItem->setFont(exerciseTitleFont);
00292 resultItem->setPlainText("Status der Übung");
00293 resultItem->moveBy(leftMargin, 375);
00294 p_pageScene->addItem(resultItem);
00295
00296
00297
00298
00299 PieChartView *piechart = new PieChartView();
00300 piechart->setModel(p_model);
00301 piechart->setFrameShape(QFrame::NoFrame);
00302 QGraphicsProxyWidget *proxy = p_pageScene->addWidget(piechart);
00303 proxy->setPos(leftMargin, 400);
00304 qreal pieChartHeight = proxy->size().height();
00305
00306
00307 if(!settings->teacher())
00308 {
00309
00310 QList<int> items = piechart->aggregateItemList();
00311 qDebug()<<"items: " << items;
00312 QTableWidget *states = new QTableWidget();
00313 states->setFrameShape(QFrame::NoFrame);
00314 states->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
00315
00316 states->insertColumn(0);
00317 QStringList hheader;
00318 hheader<<"Anzahl";
00319 states->setHorizontalHeaderLabels(hheader);
00320
00321 states->insertRow(0);
00322 states->insertRow(0);
00323 states->insertRow(0);
00324
00325 QTableWidgetItem *vitem1 = new QTableWidgetItem("Richtig");
00326 vitem1->setIcon(QIcon(":/misc/Correct"));
00327 vitem1->setFlags(Qt::NoItemFlags);
00328 states->setVerticalHeaderItem(0, vitem1);
00329
00330 QTableWidgetItem *vitem2 = new QTableWidgetItem("Falsch");
00331 vitem2->setIcon(QIcon(":/misc/Wrong"));
00332 vitem2->setFlags(Qt::NoItemFlags);
00333 states->setVerticalHeaderItem(1, vitem2);
00334
00335 QTableWidgetItem *vitem3 = new QTableWidgetItem("Unvollständig");
00336 vitem3->setIcon(QIcon(":/misc/Incomplete"));
00337 vitem3->setFlags(Qt::NoItemFlags);
00338 states->setVerticalHeaderItem(2, vitem3);
00339
00340 states->verticalHeader()->setIconSize(QSize(24,24));
00341
00342 for(int i = 0; i < items.count(); i++)
00343 {
00344 int item = items.value(i);
00345 QTableWidgetItem *tab = new QTableWidgetItem(QString::number(item));
00346 tab->setFlags(Qt::NoItemFlags);
00347 states->setItem(0, i, tab);
00348 }
00349 QGraphicsProxyWidget *table = p_pageScene->addWidget(states);
00350 table->setPos(leftMargin, 400 + pieChartHeight + 20);
00351 }
00352
00353
00354 QGraphicsTextItem *mailItem = new QGraphicsTextItem();
00355 mailItem->setFont(font);
00356 mailItem->setPlainText("Mailadresse: " + mailaddy);
00357 mailItem->moveBy(leftMargin, 1000);
00358 p_pageScene->addItem(mailItem);
00359
00360
00361 QGraphicsTextItem *dateCreationItem = new QGraphicsTextItem();
00362 dateCreationItem->setFont(font);
00363 dateCreationItem->setPlainText("Erstelldatum: " + datecreation.toString());
00364 dateCreationItem->moveBy(leftMargin,1020);
00365 p_pageScene->addItem(dateCreationItem);
00366
00367
00368 QGraphicsTextItem *dateModificationItem = new QGraphicsTextItem();
00369 dateModificationItem->setFont(font);
00370 dateModificationItem->setPlainText("Änderdatum: " + datemodification.toString());
00371 dateModificationItem->moveBy(leftMargin,1040);
00372 p_pageScene->addItem(dateModificationItem);
00373
00374
00375
00376 pageSceneList.insert(0,p_pageScene);
00377 }
00378
00379 void Printing::paintExtraPageForSolution()
00380 {
00381
00382 int space = 30;
00383 QString chapterTitle, exerciseTitle;
00384 QModelIndex currentChapterIndex = p_model->index(0, 0, QModelIndex());
00385 for(int i = 0; currentChapterIndex.isValid(); i++)
00386 {
00387 QModelIndex currentExerciseIndex = p_model->index(0,0, currentChapterIndex);
00388 for(int j = 0; currentExerciseIndex.isValid(); j++)
00389 {
00390 if(p_model->data(currentExerciseIndex, Qt::CheckStateRole).toBool())
00391 {
00392 QGraphicsScene *p_pageScene = new QGraphicsScene();
00393 setupPage(p_pageScene);
00394
00395 chapterTitle = currentChapterIndex.data(0).toString();
00396
00397 QGraphicsTextItem *chapterTitleItem = new QGraphicsTextItem();
00398 chapterTitleItem->setFont(chapterTitleFont);
00399 chapterTitleItem->setPlainText(chapterTitle);
00400 chapterTitleItem->moveBy(leftMargin, headerSize-rowHeight-spacing+topMargin+space);
00401 p_pageScene->addItem(chapterTitleItem);
00402 space += 40;
00403
00404
00405 exerciseTitle = currentExerciseIndex.data(0).toString();
00406 QGraphicsTextItem *exerciseTitleItem = new QGraphicsTextItem();
00407 exerciseTitleItem->setFont(exerciseTitleFont);
00408 exerciseTitleItem->setPlainText(exerciseTitle);
00409 exerciseTitleItem->moveBy(leftMarginExercise, headerSize-rowHeight-spacing+topMargin+space);
00410 p_pageScene->addItem(exerciseTitleItem);
00411 space += 30;
00412
00413
00414 qDebug()<<"Chapter: "<<chapterTitle<<" Exercise: "<<exerciseTitle;
00415 DataExercise *currentExercise = p_project->exercise(chapterTitle, exerciseTitle);
00416
00417
00418 if(currentExercise->solutionRecords()->size() > 0)
00419 {
00420
00421 QGraphicsTextItem *titleItem = new QGraphicsTextItem();
00422 titleItem->setFont(font);
00423 titleItem->setPlainText("Lösung: ");
00424 titleItem->moveBy(leftMarginExercise, headerSize-rowHeight-spacing+topMargin+space);
00425 p_pageScene->addItem(titleItem);
00426 space += 30;
00427
00428
00429 int maximumWidthExercise = (int)p_pageScene->width()-rightMargin-leftMarginExercise;
00430
00431
00432 AccountingRecordWidget *accountingRecordWidgets = new AccountingRecordWidget();
00433 accountingRecordWidgets->setSettings(settings);
00434 accountingRecordWidgets->makeWidgetForPrinter(p_table, currentExercise, false);
00435
00436 QGraphicsProxyWidget *proxyas = p_pageScene->addWidget(accountingRecordWidgets);
00437 proxyas->setPos(leftMarginExercise, headerSize-rowHeight-spacing+topMargin+space);
00438 QSizeF size = proxyas->size();
00439 space += (int)size.height() + 20;
00440 }
00441 pageSceneList.append(p_pageScene);
00442 }
00443
00444 currentExerciseIndex = p_model->index(j+1, 0, currentChapterIndex);
00445 space = 30;
00446 }
00447
00448 currentChapterIndex = p_model->index(i+1, 0, QModelIndex());
00449 }
00450 }
00451
00452 int Printing::pageCount()
00453 {
00454 return pageSceneList.count();
00455 }