1 /***************************************************************************
2 FET
3 -------------------
4 copyright : (C) by Liviu Lalescu, Volker Dirr
5 email : Liviu Lalescu: see https://lalescu.ro/liviu/ , Volker Dirr: see https://www.timetabling.de/
6 ***************************************************************************
7 timetableprintform.cpp - description
8 -------------------
9 begin : March 2010
10 copyright : (C) by Volker Dirr
11 : https://www.timetabling.de/
12 ***************************************************************************
13 * *
14 * This program is free software: you can redistribute it and/or modify *
15 * it under the terms of the GNU Affero General Public License as *
16 * published by the Free Software Foundation, either version 3 of the *
17 * License, or (at your option) any later version. *
18 * *
19 ***************************************************************************/
20
21 //BE CAREFUL: work ONLY with INTERNAL data in this source!!!
22
23 //maybe TODO: maybe use only HTML level 1 instead of 3? advantage: a bit speedup. disadvantage: no coloring
24
25 #include <QtGlobal>
26 #include <QSizePolicy>
27
28 #include "timetableprintform.h"
29
30 #include "timetable.h"
31 #include "timetable_defs.h"
32 #include "timetableexport.h"
33 #include "solution.h"
34
35 #include "longtextmessagebox.h"
36
37 #if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
38 #include <QtWidgets>
39 #else
40 #include <QtGui>
41 #endif
42
43 #include <QString>
44 #include <QStringList>
45 #include <QSet>
46 #include <QList>
47
48 #ifndef QT_NO_PRINTER
49 #include <QPrinter>
50 #include <QPrintDialog>
51 #include <QPrintPreviewDialog>
52
53 #if QT_VERSION >= QT_VERSION_CHECK(5,15,2)
54 #include <QPageSize>
55 #endif
56
57 #endif
58
59 //std::stable_sort
60 #include <algorithm>
61
62 extern Timetable gt;
63 extern bool students_schedule_ready;
64 extern bool teachers_schedule_ready;
65 extern bool rooms_schedule_ready;
66
67 extern QHash<int, int> hashActivityColorBySubject;
68 extern QList<int> activeHashActivityColorBySubject;
69 extern QHash<int, int> hashActivityColorBySubjectAndStudents;
70 extern QList<int> activeHashActivityColorBySubjectAndStudents;
71
72 extern QString generationLocalizedTime;
73
74 extern const QString COMPANY;
75 extern const QString PROGRAM;
76
77 static int numberOfPlacedActivities1;
78
79 #ifdef QT_NO_PRINTER
80 static QMap<LocaleString, int> paperSizesMap;
81 #else
82
83 #if QT_VERSION >= QT_VERSION_CHECK(5,15,2)
84 static QMap<LocaleString, QPageSize> paperSizesMap;
85 #else
86 static QMap<LocaleString, QPrinter::PaperSize> paperSizesMap;
87 #endif
88
89 #endif
90
91 const QString CBTablesState="/timetables-combo-box-state";
92
93 const QString RBDaysHorizontalState="/days-horizontal-radio-button-state";
94 const QString RBDaysVerticalState="/days-vertical-radio-button-state";
95 const QString RBTimeHorizontalState="/time-horizontal-radio-button-state";
96 const QString RBTimeVerticalState="/time-vertical-radio-button-state";
97 //By Liviu Lalescu - not used anymore
98 //const QString CBDivideTimeAxisByDayState="/divide-time-axis-timetables-by-days";
99 const QString RBTimeHorizontalDayState="/time-horizontal-per-day-radio-button-state";
100 const QString RBTimeVerticalDayState="/time-vertical-per-day-radio-button-state";
101
102 const QString CBBreakState="/page-break-combo-box-state";
103 const QString CBWhiteSpaceState="/white-space-combo-box-state";
104 const QString CBprinterModeState="/printer-mode-combo-box-state";
105 const QString CBpaperSizeState="/paper-size-combo-box-state";
106 const QString CBorientationModeState="/orientation-mode-combo-box-state";
107
108 //const QString markNotAvailableState="/mark-not-available-check-box-state";
109 //const QString markBreakState="/mark-break-check-box-state";
110 //const QString printSameStartingTimeState="/print-same-starting-time-box-state";
111 const QString printDetailedTablesState="/print-detailed-tables-check-box-state";
112 const QString printActivityTagsState="/print-activity-tags-check-box-state";
113 const QString printRepeatNamesState="/print-repeat-names-check-box-state";
114 const QString printAutomaticColorsState="/print-automatic-colors-check-box-state";
115
116 const QString activitiesPaddingState="/activity-padding-spin-box-value-state";
117 const QString tablePaddingState="/table-padding-spin-box-value-state";
118 const QString fontSizeTableState="/font-size-spin-box-value-state";
119 const QString maxNamesState="/max-names-spin-box-value-state";
120 const QString leftPageMarginState="/left-page-margin-spin-box-value-state";
121 const QString topPageMarginState="/top-page-margin-spin-box-value-state";
122 const QString rightPageMarginState="/right-page-margin-spin-box-value-state";
123 const QString bottomPageMarginState="/bottom-page-margin-spin-box-value-state";
124
125 //by Liviu Lalescu - unused anymore
126 /*static bool dividePrefixSuffix(const QString& str, QString& left, QString& right)
127 {
128 QStringList list=str.split("%1");
129 assert(list.count()>=1);
130 left=list.at(0);
131 if(list.count()>=2){
132 right=list.at(1);
133 return true;
134 }
135 else{
136 right=QString("");
137 return false;
138 }
139 }*/
140
StartTimetablePrint()141 StartTimetablePrint::StartTimetablePrint()
142 {
143 }
144
~StartTimetablePrint()145 StartTimetablePrint::~StartTimetablePrint()
146 {
147 }
148
startTimetablePrint(QWidget * parent)149 void StartTimetablePrint::startTimetablePrint(QWidget* parent)
150 {
151 if(gt.rules.initialized
152 && students_schedule_ready
153 && teachers_schedule_ready
154 && rooms_schedule_ready
155 && gt.rules.nInternalTeachers==gt.rules.teachersList.count()
156 && gt.rules.nInternalRooms==gt.rules.roomsList.count()
157 && gt.rules.internalStructureComputed){
158
159 //prepare calculation
160 numberOfPlacedActivities1=0;
161 int numberOfPlacedActivities2=0;
162 TimetableExport::getNumberOfPlacedActivities(numberOfPlacedActivities1, numberOfPlacedActivities2);
163
164 TimetablePrintForm tpfd(parent);
165 tpfd.exec();
166
167 } else {
168 QMessageBox::warning(parent, tr("FET warning"),
169 tr("Printing is currently not possible, because you modified the dataset. Please generate a new timetable before printing."));
170 }
171 }
172
173 // this is very similar to statisticsexport.cpp. so please also check there if you change something here!
TimetablePrintForm(QWidget * parent)174 TimetablePrintForm::TimetablePrintForm(QWidget *parent): QDialog(parent){
175 this->setWindowTitle(tr("Print timetable dialog"));
176
177 QHBoxLayout* wholeDialog=new QHBoxLayout(this);
178
179 QVBoxLayout* leftDialog=new QVBoxLayout();
180
181 QStringList timetableNames;
182 timetableNames<<tr("Subgroups")
183 <<tr("Subgroups (sorted)")
184 <<tr("Groups")
185 <<tr("Years")
186 <<tr("Teachers")
187 <<tr("Teachers' Free Periods")
188 <<tr("Rooms")
189 <<tr("Subjects")
190 <<tr("Activity Tags")
191 <<tr("All activities")
192 <<tr("Students Statistics")
193 <<tr("Teachers Statistics");
194 CBTables=new QComboBox();
195 CBTables->addItems(timetableNames);
196
197 namesList = new QListWidget();
198 namesList->setSelectionMode(QAbstractItemView::MultiSelection);
199
200 QHBoxLayout* selectUnselect=new QHBoxLayout();
201 pbSelectAll=new QPushButton(tr("All", "Refers to a list of items, select all. Please keep translation short"));
202 //pbSelectAll->setAutoDefault(false);
203 pbUnselectAll=new QPushButton(tr("None", "Refers to a list of items, select none. Please keep translation short"));
204 selectUnselect->addWidget(pbSelectAll);
205 selectUnselect->addWidget(pbUnselectAll);
206
207 leftDialog->addWidget(CBTables);
208 leftDialog->addWidget(namesList);
209 leftDialog->addLayout(selectUnselect);
210
211 QVBoxLayout* rightDialog=new QVBoxLayout();
212
213 /*QGroupBox**/ actionsBox=new QGroupBox(tr("Print"));
214 QGridLayout* actionsBoxGrid=new QGridLayout();
215 RBDaysHorizontal= new QRadioButton(tr("Days horizontal"));
216 RBDaysVertical= new QRadioButton(tr("Days vertical"));
217 RBTimeHorizontal= new QRadioButton(tr("Time horizontal"));
218 RBTimeVertical= new QRadioButton(tr("Time vertical"));
219 //By Liviu Lalescu - not used anymore
220 //CBDivideTimeAxisByDay=new QCheckBox(tr("Divide by days", "Refers to dividing time axis timetables by days"));
221 //CBDivideTimeAxisByDay->setChecked(false);
222 RBTimeHorizontalDay= new QRadioButton(tr("Time horizontal per day"));
223 RBTimeVerticalDay= new QRadioButton(tr("Time vertical per day"));
224
225 actionsBoxGrid->addWidget(RBDaysHorizontal,0,0);
226 actionsBoxGrid->addWidget(RBDaysVertical,0,1);
227 actionsBoxGrid->addWidget(RBTimeHorizontal,1,0);
228 actionsBoxGrid->addWidget(RBTimeVertical,1,1);
229 //actionsBoxGrid->addWidget(CBDivideTimeAxisByDay, 2, 0, 1, 2);
230 actionsBoxGrid->addWidget(RBTimeHorizontalDay,2,0);
231 actionsBoxGrid->addWidget(RBTimeVerticalDay,2,1);
232 RBDaysHorizontal->setChecked(true);
233 //CBDivideTimeAxisByDay->setDisabled(RBDaysHorizontal->isChecked() || RBDaysVertical->isChecked());
234 actionsBox->setLayout(actionsBoxGrid);
235
236 /*QGroupBox**/ optionsBox=new QGroupBox(tr("Options"));
237 QGridLayout* optionsBoxGrid=new QGridLayout();
238
239 QStringList breakStrings;
240 //strings by Liviu Lalescu
241 breakStrings<<tr("Page-break: none", "No page-break between timetables. Please keep translation short")
242 <<tr("Page-break: always", "Page-break after each timetable. Please keep translation short")
243 <<tr("Page-break: even", "Page-break after each even timetable. Please keep translation short");
244 CBBreak=new QComboBox();
245 CBBreak->addItems(breakStrings);
246 CBBreak->setCurrentIndex(1);
247 CBBreak->setSizePolicy(QSizePolicy::Expanding, CBBreak->sizePolicy().verticalPolicy());
248
249 QStringList whiteSpaceStrings;
250 whiteSpaceStrings<<QString("normal")<<QString("pre")<<QString("nowrap")<<QString("pre-wrap"); //don't translate these strings, because they are css parameters!
251 CBWhiteSpace=new QComboBox();
252 CBWhiteSpace->addItems(whiteSpaceStrings);
253 CBWhiteSpace->setCurrentIndex(0);
254 CBWhiteSpace->setSizePolicy(QSizePolicy::Expanding, CBWhiteSpace->sizePolicy().verticalPolicy());
255
256 QStringList printerOrientationStrings;
257 printerOrientationStrings<<tr("Portrait")<<tr("Landscape");
258 CBorientationMode=new QComboBox();
259 CBorientationMode->addItems(printerOrientationStrings);
260 CBorientationMode->setCurrentIndex(0);
261 //CBorientationMode->setDisabled(true);
262 CBorientationMode->setSizePolicy(QSizePolicy::Expanding, CBorientationMode->sizePolicy().verticalPolicy());
263
264 /* QStringList printerModeStrings;
265 printerModeStrings<<tr("ScreenResolution")<<tr("PrinterResolution")<<tr("HighResolution");
266 CBprinterMode=new QComboBox();
267 CBprinterMode->addItems(printerModeStrings);
268 CBprinterMode->setCurrentIndex(2);
269 CBprinterMode->setDisabled(true);
270 CBprinterMode->setSizePolicy(QSizePolicy::Expanding, CBprinterMode->sizePolicy().verticalPolicy());
271 */
272 paperSizesMap.clear();
273 #ifdef QT_NO_PRINTER
274 paperSizesMap.insert(tr("Custom", "Type of paper size"), 30);
275 #else
276
277 #if QT_VERSION >= QT_VERSION_CHECK(5,15,2)
278 paperSizesMap.insert(tr("A0", "Type of paper size"), QPageSize(QPageSize::A0));
279 paperSizesMap.insert(tr("A1", "Type of paper size"), QPageSize(QPageSize::A1));
280 paperSizesMap.insert(tr("A2", "Type of paper size"), QPageSize(QPageSize::A2));
281 paperSizesMap.insert(tr("A3", "Type of paper size"), QPageSize(QPageSize::A3));
282 paperSizesMap.insert(tr("A4", "Type of paper size"), QPageSize(QPageSize::A4));
283 paperSizesMap.insert(tr("A5", "Type of paper size"), QPageSize(QPageSize::A5));
284 paperSizesMap.insert(tr("A6", "Type of paper size"), QPageSize(QPageSize::A6));
285 paperSizesMap.insert(tr("A7", "Type of paper size"), QPageSize(QPageSize::A7));
286 paperSizesMap.insert(tr("A8", "Type of paper size"), QPageSize(QPageSize::A8));
287 paperSizesMap.insert(tr("A9", "Type of paper size"), QPageSize(QPageSize::A9));
288 paperSizesMap.insert(tr("B0", "Type of paper size"), QPageSize(QPageSize::B0));
289 paperSizesMap.insert(tr("B1", "Type of paper size"), QPageSize(QPageSize::B1));
290 paperSizesMap.insert(tr("B2", "Type of paper size"), QPageSize(QPageSize::B2));
291 paperSizesMap.insert(tr("B3", "Type of paper size"), QPageSize(QPageSize::B3));
292 paperSizesMap.insert(tr("B4", "Type of paper size"), QPageSize(QPageSize::B4));
293 paperSizesMap.insert(tr("B5", "Type of paper size"), QPageSize(QPageSize::B5));
294 paperSizesMap.insert(tr("B6", "Type of paper size"), QPageSize(QPageSize::B6));
295 paperSizesMap.insert(tr("B7", "Type of paper size"), QPageSize(QPageSize::B7));
296 paperSizesMap.insert(tr("B8", "Type of paper size"), QPageSize(QPageSize::B8));
297 paperSizesMap.insert(tr("B9", "Type of paper size"), QPageSize(QPageSize::B9));
298 paperSizesMap.insert(tr("B10", "Type of paper size"), QPageSize(QPageSize::B10));
299 paperSizesMap.insert(tr("C5E", "Type of paper size"), QPageSize(QPageSize::C5E));
300 paperSizesMap.insert(tr("Comm10E", "Type of paper size"), QPageSize(QPageSize::Comm10E));
301 paperSizesMap.insert(tr("DLE", "Type of paper size"), QPageSize(QPageSize::DLE));
302 paperSizesMap.insert(tr("Executive", "Type of paper size"), QPageSize(QPageSize::Executive));
303 paperSizesMap.insert(tr("Folio", "Type of paper size"), QPageSize(QPageSize::Folio));
304 paperSizesMap.insert(tr("Ledger", "Type of paper size"), QPageSize(QPageSize::Ledger));
305 paperSizesMap.insert(tr("Legal", "Type of paper size"), QPageSize(QPageSize::Legal));
306 paperSizesMap.insert(tr("Letter", "Type of paper size"), QPageSize(QPageSize::Letter));
307 paperSizesMap.insert(tr("Tabloid", "Type of paper size"), QPageSize(QPageSize::Tabloid));
308 #else
309 paperSizesMap.insert(tr("A0", "Type of paper size"), QPrinter::A0);
310 paperSizesMap.insert(tr("A1", "Type of paper size"), QPrinter::A1);
311 paperSizesMap.insert(tr("A2", "Type of paper size"), QPrinter::A2);
312 paperSizesMap.insert(tr("A3", "Type of paper size"), QPrinter::A3);
313 paperSizesMap.insert(tr("A4", "Type of paper size"), QPrinter::A4);
314 paperSizesMap.insert(tr("A5", "Type of paper size"), QPrinter::A5);
315 paperSizesMap.insert(tr("A6", "Type of paper size"), QPrinter::A6);
316 paperSizesMap.insert(tr("A7", "Type of paper size"), QPrinter::A7);
317 paperSizesMap.insert(tr("A8", "Type of paper size"), QPrinter::A8);
318 paperSizesMap.insert(tr("A9", "Type of paper size"), QPrinter::A9);
319 paperSizesMap.insert(tr("B0", "Type of paper size"), QPrinter::B0);
320 paperSizesMap.insert(tr("B1", "Type of paper size"), QPrinter::B1);
321 paperSizesMap.insert(tr("B2", "Type of paper size"), QPrinter::B2);
322 paperSizesMap.insert(tr("B3", "Type of paper size"), QPrinter::B3);
323 paperSizesMap.insert(tr("B4", "Type of paper size"), QPrinter::B4);
324 paperSizesMap.insert(tr("B5", "Type of paper size"), QPrinter::B5);
325 paperSizesMap.insert(tr("B6", "Type of paper size"), QPrinter::B6);
326 paperSizesMap.insert(tr("B7", "Type of paper size"), QPrinter::B7);
327 paperSizesMap.insert(tr("B8", "Type of paper size"), QPrinter::B8);
328 paperSizesMap.insert(tr("B9", "Type of paper size"), QPrinter::B9);
329 paperSizesMap.insert(tr("B10", "Type of paper size"), QPrinter::B10);
330 paperSizesMap.insert(tr("C5E", "Type of paper size"), QPrinter::C5E);
331 paperSizesMap.insert(tr("Comm10E", "Type of paper size"), QPrinter::Comm10E);
332 paperSizesMap.insert(tr("DLE", "Type of paper size"), QPrinter::DLE);
333 paperSizesMap.insert(tr("Executive", "Type of paper size"), QPrinter::Executive);
334 paperSizesMap.insert(tr("Folio", "Type of paper size"), QPrinter::Folio);
335 paperSizesMap.insert(tr("Ledger", "Type of paper size"), QPrinter::Ledger);
336 paperSizesMap.insert(tr("Legal", "Type of paper size"), QPrinter::Legal);
337 paperSizesMap.insert(tr("Letter", "Type of paper size"), QPrinter::Letter);
338 paperSizesMap.insert(tr("Tabloid", "Type of paper size"), QPrinter::Tabloid);
339 #endif
340
341 #endif
342
343 CBpaperSize=new QComboBox();
344
345 //CBpaperSize->addItems(paperSizesMap.keys());
346 QList<LocaleString> items=paperSizesMap.keys();
347 for(const LocaleString& s : qAsConst(items))
348 CBpaperSize->addItem(s);
349
350 if(CBpaperSize->count()>=5)
351 CBpaperSize->setCurrentIndex(4);
352 else if(CBpaperSize->count()>=1)
353 CBpaperSize->setCurrentIndex(0);
354 CBpaperSize->setSizePolicy(QSizePolicy::Expanding, CBpaperSize->sizePolicy().verticalPolicy());
355
356 // markNotAvailable=new QCheckBox(tr("Mark not available"));
357 // markNotAvailable->setChecked(true);
358
359 // markBreak=new QCheckBox(tr("Mark break"));
360 // markBreak->setChecked(true);
361
362 // printSameStartingTime=new QCheckBox(tr("Print same starting time"));
363 // printSameStartingTime->setChecked(false);
364
365 printDetailedTables=new QCheckBox(tr("Detailed tables"));
366 printDetailedTables->setChecked(true);
367
368 printActivityTags=new QCheckBox(tr("Activity tags"));
369 printActivityTags->setChecked(true);
370
371 repeatNames=new QCheckBox(tr("Repeat vertical names"));
372 repeatNames->setChecked(false);
373
374 automaticColors=new QCheckBox(tr("Colors"));
375 automaticColors->setChecked(false);
376
377 fontSizeTable=new QSpinBox;
378 fontSizeTable->setRange(4, 20);
379 fontSizeTable->setValue(8);
380
381 /*QString str, left, right;
382 str=tr("Font size: %1 pt");
383 dividePrefixSuffix(str, left, right);
384 fontSizeTable->setPrefix(left);
385 fontSizeTable->setSuffix(right);*/
386
387 QString s=tr("Font size: %1 pt", "pt means points for font size, when printing the timetable");
388 QStringList sl=s.split("%1");
389 QString prefix=sl.at(0);
390 QString suffix;
391 if(sl.count()<2)
392 suffix=QString("");
393 else
394 suffix=sl.at(1);
395 fontSizeTable->setPrefix(prefix);
396 fontSizeTable->setSuffix(suffix);
397 //fontSizeTable->setPrefix(tr("Font size:")+QString(" "));
398 //fontSizeTable->setSuffix(QString(" ")+tr("pt", "Means points for font size, when printing the timetable"));
399
400 fontSizeTable->setSizePolicy(QSizePolicy::Expanding, fontSizeTable->sizePolicy().verticalPolicy());
401
402 activitiesPadding=new QSpinBox;
403 activitiesPadding->setRange(0, 25);
404 activitiesPadding->setValue(0);
405
406 /*str=tr("Activities padding: %1 px");
407 dividePrefixSuffix(str, left, right);
408 activitiesPadding->setPrefix(left);
409 activitiesPadding->setSuffix(right);*/
410
411 s=tr("Activities padding: %1 px", "px means pixels, when printing the timetable");
412 sl=s.split("%1");
413 prefix=sl.at(0);
414 if(sl.count()<2)
415 suffix=QString("");
416 else
417 suffix=sl.at(1);
418 activitiesPadding->setPrefix(prefix);
419 activitiesPadding->setSuffix(suffix);
420 //activitiesPadding->setPrefix(tr("Activities padding:")+QString(" "));
421 //activitiesPadding->setSuffix(QString(" ")+tr("px", "Means pixels, when printing the timetable"));
422
423 activitiesPadding->setSizePolicy(QSizePolicy::Expanding, activitiesPadding->sizePolicy().verticalPolicy());
424
425 tablePadding=new QSpinBox;
426 tablePadding->setRange(1, 99);
427 tablePadding->setValue(1);
428
429 /*str=tr("Space after table: +%1 px");
430 dividePrefixSuffix(str, left, right);
431 tablePadding->setPrefix(left);
432 tablePadding->setSuffix(right);*/
433
434 s=tr("Space after table: +%1 px", "px means pixels, when printing the timetable");
435 sl=s.split("%1");
436 prefix=sl.at(0);
437 if(sl.count()<2)
438 suffix=QString("");
439 else
440 suffix=sl.at(1);
441 tablePadding->setPrefix(prefix);
442 tablePadding->setSuffix(suffix);
443 //tablePadding->setPrefix(tr("Space after table:")+QString(" +"));
444 //tablePadding->setSuffix(QString(" ")+tr("px", "Means pixels, when printing the timetable"));
445
446 tablePadding->setSizePolicy(QSizePolicy::Expanding, tablePadding->sizePolicy().verticalPolicy());
447
448 maxNames=new QSpinBox;
449 maxNames->setRange(1, 999);
450 maxNames->setValue(10);
451
452 /*str=tr("Split after %1 names");
453 dividePrefixSuffix(str, left, right);
454 maxNames->setPrefix(left);
455 maxNames->setSuffix(right);*/
456
457 s=tr("Split after: %1 names");
458 sl=s.split("%1");
459 prefix=sl.at(0);
460 if(sl.count()<2)
461 suffix=QString("");
462 else
463 suffix=sl.at(1);
464 maxNames->setPrefix(prefix);
465 maxNames->setSuffix(suffix);
466 //maxNames->setPrefix(tr("Split after:", "When printing, the whole phrase is 'Split after ... names'")+QString(" "));
467 //maxNames->setSuffix(QString(" ")+tr("names", "When printing, the whole phrase is 'Split after ... names'"));
468
469 maxNames->setSizePolicy(QSizePolicy::Expanding, maxNames->sizePolicy().verticalPolicy());
470
471 leftPageMargin=new QSpinBox;
472 leftPageMargin->setRange(0, 50);
473 leftPageMargin->setValue(10);
474
475 /*str=tr("Left margin: %1 mm");
476 dividePrefixSuffix(str, left, right);
477 leftPageMargin->setPrefix(left);
478 leftPageMargin->setSuffix(right);*/
479
480 s=tr("Left margin: %1 mm", "mm means millimeters");
481 sl=s.split("%1");
482 prefix=sl.at(0);
483 if(sl.count()<2)
484 suffix=QString("");
485 else
486 suffix=sl.at(1);
487 leftPageMargin->setPrefix(prefix);
488 leftPageMargin->setSuffix(suffix);
489 //leftPageMargin->setPrefix(tr("Left margin:")+QString(" "));
490 //leftPageMargin->setSuffix(QString(" ")+tr("mm", "Means milimeter, when setting page margin"));
491
492 leftPageMargin->setSizePolicy(QSizePolicy::Expanding, leftPageMargin->sizePolicy().verticalPolicy());
493
494 topPageMargin=new QSpinBox;
495 topPageMargin->setRange(0, 50);
496 topPageMargin->setValue(10);
497
498 /*str=tr("Top margin: %1 mm");
499 dividePrefixSuffix(str, left, right);
500 topPageMargin->setPrefix(left);
501 topPageMargin->setSuffix(right);*/
502
503 s=tr("Top margin: %1 mm", "mm means millimeters");
504 sl=s.split("%1");
505 prefix=sl.at(0);
506 if(sl.count()<2)
507 suffix=QString("");
508 else
509 suffix=sl.at(1);
510 topPageMargin->setPrefix(prefix);
511 topPageMargin->setSuffix(suffix);
512 //topPageMargin->setPrefix(tr("Top margin:")+QString(" "));
513 //topPageMargin->setSuffix(QString(" ")+tr("mm", "Means milimeter, when setting page margin"));
514
515 topPageMargin->setSizePolicy(QSizePolicy::Expanding, topPageMargin->sizePolicy().verticalPolicy());
516
517 rightPageMargin=new QSpinBox;
518 rightPageMargin->setRange(0, 50);
519 rightPageMargin->setValue(10);
520
521 /*str=tr("Right margin: %1 mm");
522 dividePrefixSuffix(str, left, right);
523 rightPageMargin->setPrefix(left);
524 rightPageMargin->setSuffix(right);*/
525
526 s=tr("Right margin: %1 mm", "mm means millimeters");
527 sl=s.split("%1");
528 prefix=sl.at(0);
529 if(sl.count()<2)
530 suffix=QString("");
531 else
532 suffix=sl.at(1);
533 rightPageMargin->setPrefix(prefix);
534 rightPageMargin->setSuffix(suffix);
535 //rightPageMargin->setPrefix(tr("Right margin:")+QString(" "));
536 //rightPageMargin->setSuffix(QString(" ")+tr("mm", "Means milimeter, when setting page margin"));
537
538 rightPageMargin->setSizePolicy(QSizePolicy::Expanding, rightPageMargin->sizePolicy().verticalPolicy());
539
540 bottomPageMargin=new QSpinBox;
541 bottomPageMargin->setRange(0, 50);
542 bottomPageMargin->setValue(10);
543
544 /*str=tr("Bottom margin: %1 mm");
545 dividePrefixSuffix(str, left, right);
546 bottomPageMargin->setPrefix(left);
547 bottomPageMargin->setSuffix(right);*/
548
549 s=tr("Bottom margin: %1 mm", "mm means millimeters");
550 sl=s.split("%1");
551 prefix=sl.at(0);
552 if(sl.count()<2)
553 suffix=QString("");
554 else
555 suffix=sl.at(1);
556 bottomPageMargin->setPrefix(prefix);
557 bottomPageMargin->setSuffix(suffix);
558 //bottomPageMargin->setPrefix(tr("Bottom margin:")+QString(" "));
559 //bottomPageMargin->setSuffix(QString(" ")+tr("mm", "Means milimeter, when setting page margin"));
560
561 bottomPageMargin->setSizePolicy(QSizePolicy::Expanding, bottomPageMargin->sizePolicy().verticalPolicy());
562
563 pbPrintPreviewSmall=new QPushButton(tr("Teaser", "Small print preview. Please keep translation short"));
564 pbPrintPreviewFull=new QPushButton(tr("Preview", "Full print preview. Please keep translation short"));
565 pbPrint=new QPushButton(tr("Print", "Please keep translation short"));
566
567 pbClose=new QPushButton(tr("Close", "Please keep translation short"));
568 pbClose->setAutoDefault(false);
569
570 optionsBoxGrid->addWidget(leftPageMargin,0,0);
571 optionsBoxGrid->addWidget(rightPageMargin,1,0);
572 optionsBoxGrid->addWidget(topPageMargin,2,0);
573 optionsBoxGrid->addWidget(bottomPageMargin,3,0);
574
575 optionsBoxGrid->addWidget(fontSizeTable,0,1);
576 optionsBoxGrid->addWidget(maxNames,1,1);
577 optionsBoxGrid->addWidget(activitiesPadding,2,1);
578 optionsBoxGrid->addWidget(tablePadding,3,1);
579
580 optionsBoxGrid->addWidget(CBpaperSize,4,0);
581 optionsBoxGrid->addWidget(CBWhiteSpace,4,1);
582 optionsBoxGrid->addWidget(CBorientationMode,5,0);
583 optionsBoxGrid->addWidget(CBBreak,5,1);
584 // optionsBoxGrid->addWidget(CBprinterMode,5,0);
585 optionsBoxGrid->addWidget(printActivityTags,6,0);
586 optionsBoxGrid->addWidget(printDetailedTables,6,1);
587
588 optionsBoxGrid->addWidget(repeatNames,7,0);
589 optionsBoxGrid->addWidget(automaticColors,7,1);
590
591 optionsBox->setLayout(optionsBoxGrid);
592 optionsBox->setSizePolicy(QSizePolicy::Expanding, optionsBox->sizePolicy().verticalPolicy());
593
594 // maybe TODO: be careful. the form is pretty full already!
595 // be careful: these are global settings, so it will also change html output setting?! so it need parameter in each function!
596 // optionsBoxVertical->addWidget(markNotAvailable);
597 // optionsBoxVertical->addWidget(markBreak);
598 // optionsBoxVertical->addWidget(printSameStartingTime);
599 // maybe TODO: select font, select color, select them also for line 0-4!
600
601 QHBoxLayout* previewPrintClose=new QHBoxLayout();
602 previewPrintClose->addStretch();
603 previewPrintClose->addWidget(pbPrintPreviewSmall);
604 previewPrintClose->addWidget(pbPrintPreviewFull);
605 previewPrintClose->addWidget(pbPrint);
606 previewPrintClose->addStretch();
607 previewPrintClose->addWidget(pbClose);
608
609 rightDialog->addWidget(actionsBox);
610 rightDialog->addWidget(optionsBox);
611 rightDialog->addStretch();
612 rightDialog->addLayout(previewPrintClose);
613
614 wholeDialog->addLayout(leftDialog);
615 wholeDialog->addLayout(rightDialog);
616
617 updateNamesList();
618
619 connect(CBTables, SIGNAL(currentIndexChanged(int)), this, SLOT(updateNamesList()));
620 connect(pbSelectAll, SIGNAL(clicked()), this, SLOT(selectAll()));
621 connect(pbUnselectAll, SIGNAL(clicked()), this, SLOT(unselectAll()));
622 connect(pbPrint, SIGNAL(clicked()), this, SLOT(print()));
623 connect(pbPrintPreviewSmall, SIGNAL(clicked()), this, SLOT(printPreviewSmall()));
624 connect(pbPrintPreviewFull, SIGNAL(clicked()), this, SLOT(printPreviewFull()));
625 connect(pbClose, SIGNAL(clicked()), this, SLOT(close()));
626
627 //connect(RBDaysHorizontal, SIGNAL(toggled(bool)), this, SLOT(updateCBDivideTimeAxisByDay()));
628 //connect(RBDaysVertical, SIGNAL(toggled(bool)), this, SLOT(updateCBDivideTimeAxisByDay()));
629 //connect(RBTimeHorizontal, SIGNAL(toggled(bool)), this, SLOT(updateCBDivideTimeAxisByDay()));
630 //connect(RBTimeVertical, SIGNAL(toggled(bool)), this, SLOT(updateCBDivideTimeAxisByDay()));
631
632 int ww=this->sizeHint().width();
633 if(ww>900)
634 ww=900;
635 if(ww<700)
636 ww=700;
637
638 int hh=this->sizeHint().height();
639 if(hh>650)
640 hh=650;
641 if(hh<500)
642 hh=500;
643
644 this->resize(ww, hh);
645 centerWidgetOnScreen(this);
646 restoreFETDialogGeometry(this);
647
648 QSettings settings(COMPANY, PROGRAM);
649
650 if(settings.contains(this->metaObject()->className()+CBTablesState))
651 CBTables->setCurrentIndex(settings.value(this->metaObject()->className()+CBTablesState).toInt());
652
653 if(settings.contains(this->metaObject()->className()+RBDaysHorizontalState))
654 RBDaysHorizontal->setChecked(settings.value(this->metaObject()->className()+RBDaysHorizontalState).toBool());
655 if(settings.contains(this->metaObject()->className()+RBDaysVerticalState))
656 RBDaysVertical->setChecked(settings.value(this->metaObject()->className()+RBDaysVerticalState).toBool());
657 if(settings.contains(this->metaObject()->className()+RBTimeHorizontalState))
658 RBTimeHorizontal->setChecked(settings.value(this->metaObject()->className()+RBTimeHorizontalState).toBool());
659 if(settings.contains(this->metaObject()->className()+RBTimeVerticalState))
660 RBTimeVertical->setChecked(settings.value(this->metaObject()->className()+RBTimeVerticalState).toBool());
661 //if(settings.contains(this->metaObject()->className()+CBDivideTimeAxisByDayState))
662 // CBDivideTimeAxisByDay->setChecked(settings.value(this->metaObject()->className()+CBDivideTimeAxisByDayState).toBool());
663 if(settings.contains(this->metaObject()->className()+RBTimeHorizontalDayState))
664 RBTimeHorizontalDay->setChecked(settings.value(this->metaObject()->className()+RBTimeHorizontalDayState).toBool());
665 if(settings.contains(this->metaObject()->className()+RBTimeVerticalDayState))
666 RBTimeVerticalDay->setChecked(settings.value(this->metaObject()->className()+RBTimeVerticalDayState).toBool());
667 //
668 if(settings.contains(this->metaObject()->className()+CBBreakState))
669 CBBreak->setCurrentIndex(settings.value(this->metaObject()->className()+CBBreakState).toInt());
670 if(settings.contains(this->metaObject()->className()+CBWhiteSpaceState))
671 CBWhiteSpace->setCurrentIndex(settings.value(this->metaObject()->className()+CBWhiteSpaceState).toInt());
672 //if(settings.contains(this->metaObject()->className()+CBprinterModeState))
673 // CBprinterMode->setCurrentIndex(settings.value(this->metaObject()->className()+CBprinterModeState).toInt());
674 if(settings.contains(this->metaObject()->className()+CBpaperSizeState))
675 CBpaperSize->setCurrentIndex(settings.value(this->metaObject()->className()+CBpaperSizeState).toInt());
676 if(settings.contains(this->metaObject()->className()+CBorientationModeState))
677 CBorientationMode->setCurrentIndex(settings.value(this->metaObject()->className()+CBorientationModeState).toInt());
678 //
679 //if(settings.contains(this->metaObject()->className()+markNotAvailableState))
680 // markNotAvailable->setChecked(settings.value(this->metaObject()->className()+markNotAvailableState).toBool());
681 //if(settings.contains(this->metaObject()->className()+markBreakState))
682 // markBreak->setChecked(settings.value(this->metaObject()->className()+markBreakState).toBool());
683 //if(settings.contains(this->metaObject()->className()+printSameStartingTimeState))
684 // printSameStartingTime->setChecked(settings.value(this->metaObject()->className()+printSameStartingTimeState).toBool());
685 if(settings.contains(this->metaObject()->className()+printDetailedTablesState))
686 printDetailedTables->setChecked(settings.value(this->metaObject()->className()+printDetailedTablesState).toBool());
687 if(settings.contains(this->metaObject()->className()+printActivityTagsState))
688 printActivityTags->setChecked(settings.value(this->metaObject()->className()+printActivityTagsState).toBool());
689 if(settings.contains(this->metaObject()->className()+printRepeatNamesState))
690 repeatNames->setChecked(settings.value(this->metaObject()->className()+printRepeatNamesState).toBool());
691 if(settings.contains(this->metaObject()->className()+printAutomaticColorsState))
692 automaticColors->setChecked(settings.value(this->metaObject()->className()+printAutomaticColorsState).toBool());
693 //
694 if(settings.contains(this->metaObject()->className()+activitiesPaddingState))
695 activitiesPadding->setValue(settings.value(this->metaObject()->className()+activitiesPaddingState).toInt());
696 if(settings.contains(this->metaObject()->className()+tablePaddingState))
697 tablePadding->setValue(settings.value(this->metaObject()->className()+tablePaddingState).toInt());
698 if(settings.contains(this->metaObject()->className()+fontSizeTableState))
699 fontSizeTable->setValue(settings.value(this->metaObject()->className()+fontSizeTableState).toInt());
700 if(settings.contains(this->metaObject()->className()+maxNamesState))
701 maxNames->setValue(settings.value(this->metaObject()->className()+maxNamesState).toInt());
702 if(settings.contains(this->metaObject()->className()+leftPageMarginState))
703 leftPageMargin->setValue(settings.value(this->metaObject()->className()+leftPageMarginState).toInt());
704 if(settings.contains(this->metaObject()->className()+topPageMarginState))
705 topPageMargin->setValue(settings.value(this->metaObject()->className()+topPageMarginState).toInt());
706 if(settings.contains(this->metaObject()->className()+CBorientationModeState))
707 rightPageMargin->setValue(settings.value(this->metaObject()->className()+rightPageMarginState).toInt());
708 if(settings.contains(this->metaObject()->className()+bottomPageMarginState))
709 bottomPageMargin->setValue(settings.value(this->metaObject()->className()+bottomPageMarginState).toInt());
710 }
711
~TimetablePrintForm()712 TimetablePrintForm::~TimetablePrintForm(){
713 saveFETDialogGeometry(this);
714
715 QSettings settings(COMPANY, PROGRAM);
716 //save other settings
717 settings.setValue(this->metaObject()->className()+CBTablesState, CBTables->currentIndex());
718
719 settings.setValue(this->metaObject()->className()+RBDaysHorizontalState, RBDaysHorizontal->isChecked());
720 settings.setValue(this->metaObject()->className()+RBDaysVerticalState, RBDaysVertical->isChecked());
721 settings.setValue(this->metaObject()->className()+RBTimeHorizontalState, RBTimeHorizontal->isChecked());
722 settings.setValue(this->metaObject()->className()+RBTimeVerticalState, RBTimeVertical->isChecked());
723 //settings.setValue(this->metaObject()->className()+CBDivideTimeAxisByDayState, CBDivideTimeAxisByDay->isChecked());
724 settings.setValue(this->metaObject()->className()+RBTimeHorizontalDayState, RBTimeHorizontalDay->isChecked());
725 settings.setValue(this->metaObject()->className()+RBTimeVerticalDayState, RBTimeVerticalDay->isChecked());
726 //
727 settings.setValue(this->metaObject()->className()+CBBreakState, CBBreak->currentIndex());
728 settings.setValue(this->metaObject()->className()+CBWhiteSpaceState, CBWhiteSpace->currentIndex());
729 //settings.setValue(this->metaObject()->className()+CBprinterModeState, CBprinterMode->currentIndex());
730 settings.setValue(this->metaObject()->className()+CBpaperSizeState, CBpaperSize->currentIndex());
731 settings.setValue(this->metaObject()->className()+CBorientationModeState, CBorientationMode->currentIndex());
732 //
733 //settings.setValue(this->metaObject()->className()+markNotAvailableState, markNotAvailable->isChecked());
734 //settings.setValue(this->metaObject()->className()+markBreakState, markBreak->isChecked());
735 //settings.setValue(this->metaObject()->className()+printSameStartingTimeState, printSameStartingTime->isChecked());
736 settings.setValue(this->metaObject()->className()+printDetailedTablesState, printDetailedTables->isChecked());
737 settings.setValue(this->metaObject()->className()+printActivityTagsState, printActivityTags->isChecked());
738 settings.setValue(this->metaObject()->className()+printRepeatNamesState, repeatNames->isChecked());
739 settings.setValue(this->metaObject()->className()+printAutomaticColorsState, automaticColors->isChecked());
740 //
741 settings.setValue(this->metaObject()->className()+activitiesPaddingState, activitiesPadding->value());
742 settings.setValue(this->metaObject()->className()+tablePaddingState, tablePadding->value());
743 settings.setValue(this->metaObject()->className()+fontSizeTableState, fontSizeTable->value());
744 settings.setValue(this->metaObject()->className()+maxNamesState, maxNames->value());
745 settings.setValue(this->metaObject()->className()+leftPageMarginState, leftPageMargin->value());
746 settings.setValue(this->metaObject()->className()+topPageMarginState, topPageMargin->value());
747 settings.setValue(this->metaObject()->className()+rightPageMarginState, rightPageMargin->value());
748 settings.setValue(this->metaObject()->className()+bottomPageMarginState, bottomPageMargin->value());
749 }
750
selectAll()751 void TimetablePrintForm::selectAll(){
752 namesList->selectAll();
753 }
754
unselectAll()755 void TimetablePrintForm::unselectAll(){
756 namesList->clearSelection();
757 }
758
updateNamesList()759 void TimetablePrintForm::updateNamesList(){
760 namesList->clear();
761
762 if(CBTables->currentIndex()==0){
763 for(int subgroup=0; subgroup<gt.rules.nInternalSubgroups; subgroup++){
764 QString name = gt.rules.internalSubgroupsList[subgroup]->name;
765 namesList->addItem(name);
766 QListWidgetItem* tmpItem=namesList->item(subgroup);
767 tmpItem->setSelected(true);
768 }
769 printActivityTags->setDisabled(false);
770 printDetailedTables->setDisabled(true);
771
772 RBDaysHorizontal->setDisabled(false);
773 RBDaysVertical->setDisabled(false);
774 RBTimeHorizontal->setDisabled(false);
775 RBTimeVertical->setDisabled(false);
776 //CBDivideTimeAxisByDay->setDisabled(RBDaysHorizontal->isChecked() || RBDaysVertical->isChecked());
777 RBTimeHorizontalDay->setDisabled(false);
778 RBTimeVerticalDay->setDisabled(false);
779 } else if(CBTables->currentIndex()==1){
780 QList<StudentsSubgroup*> lst;
781
782 for(int subgroup=0; subgroup<gt.rules.nInternalSubgroups; subgroup++)
783 lst.append(gt.rules.internalSubgroupsList[subgroup]);
784
785 std::stable_sort(lst.begin(), lst.end(), subgroupsAscending);
786
787 subgroupsSortedOrder.clear();
788 for(int subgroup=0; subgroup<gt.rules.nInternalSubgroups; subgroup++){
789 subgroupsSortedOrder.append(lst.at(subgroup)->indexInInternalSubgroupsList);
790 namesList->addItem(lst.at(subgroup)->name);
791 QListWidgetItem* tmpItem=namesList->item(subgroup);
792 tmpItem->setSelected(true);
793 }
794
795 printActivityTags->setDisabled(false);
796 printDetailedTables->setDisabled(true);
797
798 RBDaysHorizontal->setDisabled(false);
799 RBDaysVertical->setDisabled(false);
800 RBTimeHorizontal->setDisabled(false);
801 RBTimeVertical->setDisabled(false);
802 //CBDivideTimeAxisByDay->setDisabled(RBDaysHorizontal->isChecked() || RBDaysVertical->isChecked());
803 RBTimeHorizontalDay->setDisabled(false);
804 RBTimeVerticalDay->setDisabled(false);
805 } else if(CBTables->currentIndex()==2){
806 for(int group=0; group<gt.rules.internalGroupsList.size(); group++){
807 QString name = gt.rules.internalGroupsList[group]->name;
808 namesList->addItem(name);
809 QListWidgetItem* tmpItem=namesList->item(group);
810 tmpItem->setSelected(true);
811 }
812 printActivityTags->setDisabled(false);
813 printDetailedTables->setDisabled(false); //this one is changed
814
815 RBDaysHorizontal->setDisabled(false);
816 RBDaysVertical->setDisabled(false);
817 RBTimeHorizontal->setDisabled(false);
818 RBTimeVertical->setDisabled(false);
819 //CBDivideTimeAxisByDay->setDisabled(RBDaysHorizontal->isChecked() || RBDaysVertical->isChecked());
820 RBTimeHorizontalDay->setDisabled(false);
821 RBTimeVerticalDay->setDisabled(false);
822 } else if(CBTables->currentIndex()==3){
823 for(int year=0; year<gt.rules.augmentedYearsList.size(); year++){
824 QString name = gt.rules.augmentedYearsList[year]->name;
825 namesList->addItem(name);
826 QListWidgetItem* tmpItem=namesList->item(year);
827 tmpItem->setSelected(true);
828 }
829 printActivityTags->setDisabled(false);
830 printDetailedTables->setDisabled(false); //this one is changed
831
832 RBDaysHorizontal->setDisabled(false);
833 RBDaysVertical->setDisabled(false);
834 RBTimeHorizontal->setDisabled(false);
835 RBTimeVertical->setDisabled(false);
836 //CBDivideTimeAxisByDay->setDisabled(RBDaysHorizontal->isChecked() || RBDaysVertical->isChecked());
837 RBTimeHorizontalDay->setDisabled(false);
838 RBTimeVerticalDay->setDisabled(false);
839 } else if(CBTables->currentIndex()==4){
840 for(int teacher=0; teacher<gt.rules.nInternalTeachers; teacher++){
841 QString teacher_name = gt.rules.internalTeachersList[teacher]->name;
842 namesList->addItem(teacher_name);
843 QListWidgetItem* tmpItem=namesList->item(teacher);
844 tmpItem->setSelected(true);
845 }
846 printActivityTags->setDisabled(false);
847 printDetailedTables->setDisabled(true);
848
849 RBDaysHorizontal->setDisabled(false);
850 RBDaysVertical->setDisabled(false);
851 RBTimeHorizontal->setDisabled(false);
852 RBTimeVertical->setDisabled(false);
853 //CBDivideTimeAxisByDay->setDisabled(RBDaysHorizontal->isChecked() || RBDaysVertical->isChecked());
854 RBTimeHorizontalDay->setDisabled(false);
855 RBTimeVerticalDay->setDisabled(false);
856 } else if(CBTables->currentIndex()==5){
857 QString name = tr("All teachers");
858 namesList->addItem(name);
859 QListWidgetItem* tmpItem=namesList->item(0);
860 tmpItem->setSelected(true);
861
862 printActivityTags->setDisabled(true);
863 printDetailedTables->setDisabled(false);
864
865 if(!RBDaysVertical->isChecked())
866 RBDaysHorizontal->setChecked(true);
867
868 RBDaysHorizontal->setDisabled(false);
869 RBDaysVertical->setDisabled(false);
870 RBTimeHorizontal->setDisabled(true);
871 RBTimeVertical->setDisabled(true);
872 //CBDivideTimeAxisByDay->setDisabled(RBDaysHorizontal->isChecked() || RBDaysVertical->isChecked());
873 RBTimeHorizontalDay->setDisabled(true);
874 RBTimeVerticalDay->setDisabled(true);
875 } else if(CBTables->currentIndex()==6){
876 for(int room=0; room<gt.rules.nInternalRooms; room++){
877 QString name = gt.rules.internalRoomsList[room]->name;
878 namesList->addItem(name);
879 QListWidgetItem* tmpItem=namesList->item(room);
880 tmpItem->setSelected(true);
881 }
882 printActivityTags->setDisabled(false);
883 printDetailedTables->setDisabled(true);
884
885 RBDaysHorizontal->setDisabled(false);
886 RBDaysVertical->setDisabled(false);
887 RBTimeHorizontal->setDisabled(false);
888 RBTimeVertical->setDisabled(false);
889 //CBDivideTimeAxisByDay->setDisabled(RBDaysHorizontal->isChecked() || RBDaysVertical->isChecked());
890 RBTimeHorizontalDay->setDisabled(false);
891 RBTimeVerticalDay->setDisabled(false);
892 } else if(CBTables->currentIndex()==7){
893 for(int subject=0; subject<gt.rules.nInternalSubjects; subject++){
894 QString name = gt.rules.internalSubjectsList[subject]->name;
895 namesList->addItem(name);
896 QListWidgetItem* tmpItem=namesList->item(subject);
897 tmpItem->setSelected(true);
898 }
899 printActivityTags->setDisabled(false);
900 printDetailedTables->setDisabled(true);
901
902 RBDaysHorizontal->setDisabled(false);
903 RBDaysVertical->setDisabled(false);
904 RBTimeHorizontal->setDisabled(false);
905 RBTimeVertical->setDisabled(false);
906 //CBDivideTimeAxisByDay->setDisabled(RBDaysHorizontal->isChecked() || RBDaysVertical->isChecked());
907 RBTimeHorizontalDay->setDisabled(false);
908 RBTimeVerticalDay->setDisabled(false);
909 } else if(CBTables->currentIndex()==8){
910 for(int activityTag=0; activityTag<gt.rules.nInternalActivityTags; activityTag++){
911 QString name = gt.rules.internalActivityTagsList[activityTag]->name;
912 namesList->addItem(name);
913 QListWidgetItem* tmpItem=namesList->item(activityTag);
914 if(gt.rules.internalActivityTagsList[activityTag]->printable){
915 tmpItem->setSelected(true);
916
917 } else {
918 tmpItem->setHidden(true); //Add and hide it (do not skip adding), because I work with the index and the index will be wrong if I don't add it.
919 //Maybe TODO: Rethink/check if I can skip adding it, if I also don't add them into the hash hashActivityTagIDsTimetable in timetableexport.cpp
920 }
921 }
922 printActivityTags->setDisabled(false);
923 printDetailedTables->setDisabled(true);
924
925 RBDaysHorizontal->setDisabled(false);
926 RBDaysVertical->setDisabled(false);
927 RBTimeHorizontal->setDisabled(false);
928 RBTimeVertical->setDisabled(false);
929 //CBDivideTimeAxisByDay->setDisabled(RBDaysHorizontal->isChecked() || RBDaysVertical->isChecked());
930 RBTimeHorizontalDay->setDisabled(false);
931 RBTimeVerticalDay->setDisabled(false);
932 } else if(CBTables->currentIndex()==9){
933 QString name = tr("All activities");
934 namesList->addItem(name);
935 QListWidgetItem* tmpItem=namesList->item(0);
936 tmpItem->setSelected(true);
937
938 printActivityTags->setDisabled(false);
939 printDetailedTables->setDisabled(true);
940
941 RBDaysHorizontal->setDisabled(false);
942 RBDaysVertical->setDisabled(false);
943 RBTimeHorizontal->setDisabled(false);
944 RBTimeVertical->setDisabled(false);
945 //CBDivideTimeAxisByDay->setDisabled(RBDaysHorizontal->isChecked() || RBDaysVertical->isChecked());
946 RBTimeHorizontalDay->setDisabled(false);
947 RBTimeVerticalDay->setDisabled(false);
948 } else if(CBTables->currentIndex()==10){
949 QString name = tr("All students");
950 namesList->addItem(name);
951 QListWidgetItem* tmpItem=namesList->item(0);
952 tmpItem->setSelected(true);
953
954 printActivityTags->setDisabled(true);
955 printDetailedTables->setDisabled(false);
956
957 if(!RBDaysVertical->isChecked())
958 RBDaysHorizontal->setChecked(true);
959
960 RBDaysHorizontal->setDisabled(true);
961 RBDaysVertical->setDisabled(true);
962 RBTimeHorizontal->setDisabled(true);
963 RBTimeVertical->setDisabled(true);
964 //CBDivideTimeAxisByDay->setDisabled(RBDaysHorizontal->isChecked() || RBDaysVertical->isChecked());
965 RBTimeHorizontalDay->setDisabled(true);
966 RBTimeVerticalDay->setDisabled(true);
967 } else if(CBTables->currentIndex()==11){
968 QString name = tr("All teachers");
969 namesList->addItem(name);
970 QListWidgetItem* tmpItem=namesList->item(0);
971 tmpItem->setSelected(true);
972
973 printActivityTags->setDisabled(true);
974 printDetailedTables->setDisabled(false);
975
976 if(!RBDaysVertical->isChecked())
977 RBDaysHorizontal->setChecked(true);
978
979 RBDaysHorizontal->setDisabled(true);
980 RBDaysVertical->setDisabled(true);
981 RBTimeHorizontal->setDisabled(true);
982 RBTimeVertical->setDisabled(true);
983 //CBDivideTimeAxisByDay->setDisabled(RBDaysHorizontal->isChecked() || RBDaysVertical->isChecked());
984 RBTimeHorizontalDay->setDisabled(true);
985 RBTimeVerticalDay->setDisabled(true);
986 } else assert(0==1);
987 }
988
updateHtmlPrintString(bool printAll)989 QString TimetablePrintForm::updateHtmlPrintString(bool printAll){
990 QString saveTime=generationLocalizedTime;
991 QString tmp;
992 tmp+="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n";
993 tmp+=" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n\n";
994
995 if(LANGUAGE_STYLE_RIGHT_TO_LEFT==false)
996 tmp+="<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\""+LANGUAGE_FOR_HTML+"\" xml:lang=\""+LANGUAGE_FOR_HTML+"\">\n";
997 else
998 tmp+="<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\""+LANGUAGE_FOR_HTML+"\" xml:lang=\""+LANGUAGE_FOR_HTML+"\" dir=\"rtl\">\n";
999
1000 //QTBUG-9438
1001 //QTBUG-2730
1002 tmp+=" <head>\n";
1003 tmp+=" <title>"+protect2(gt.rules.institutionName)+"</title>\n";
1004 tmp+=" <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n";
1005 tmp+=" <style type=\"text/css\">\n";
1006
1007 //this variant doesn't need the "back" stuff, but there will be an empty last page!
1008 //but you need to care about correct odd and even like in the groups tables
1009 /* tmp+=" table.even_table {\n";
1010 if(CBBreak->currentIndex()==1 || CBBreak->currentIndex()==2){
1011 tmp+=" page-break-after: always;";
1012 } //else {
1013 //tmp+=" padding-top: "+QString::number(tablePadding->value())+"px;\n"; //not possible: qt bug. (*1*)
1014 //tmp+=" padding-bottom: "+QString::number(tablePadding->value())+"px;\n"; //not possible: qt bug. (*1*)
1015 //}
1016 tmp+=" }\n";
1017 tmp+=" table.odd_table {\n";
1018 if(CBBreak->currentIndex()==1){
1019 tmp+=" page-break-after: always;";
1020 } //else {
1021 //tmp+=" padding-top: "+QString::number(tablePadding->value())+"px;\n"; //not possible: qt bug. (*1*)
1022 //tmp+=" padding-bottom: "+QString::number(tablePadding->value())+"px;\n"; //not possible: qt bug. (*1*)
1023 //}
1024 tmp+=" }\n";
1025 */
1026
1027 //start. the "back" stuff is needed because of a qt bug (*1*). it also solves the last empty page problem.
1028 tmp+=" p.back0 {\n"; //i can't to that with a class in table, because of a qt bug
1029 if(CBBreak->currentIndex()==0)
1030 tmp+=" font-size: "+QString::number(tablePadding->value())+"pt;\n"; //i can't do that in table, because it will also affect detailed table cells. it is not possible with a class, because of a qt bug.
1031 else
1032 tmp+=" font-size: 1pt;\n"; //font size 0 is not possible.
1033 // tmp+=" padding-top: "+QString::number(tablePadding->value())+"px;\n"; //not possible: qt bug.
1034 // tmp+=" padding-bottom: "+QString::number(tablePadding->value())+"px;\n"; //not possible: qt bug.
1035 if(CBBreak->currentIndex()==1 || CBBreak->currentIndex()==2)
1036 tmp+=" page-break-after: always;";
1037 tmp+=" }\n";
1038 tmp+=" p.back1 {\n"; //i can't to that with a class in table, because of a qt bug
1039 if(CBBreak->currentIndex()==0 || CBBreak->currentIndex()==2)
1040 tmp+=" font-size: "+QString::number(tablePadding->value())+"pt;\n"; //i can't do that in table, because it will also affect detailed table cells. it is not possible with a class, because of a qt bug.
1041 else
1042 tmp+=" font-size: 1pt;\n"; //font size 0 is not possible.
1043 // tmp+=" padding-top: "+QString::number(tablePadding->value())+"px;\n"; //not possible: qt bug.
1044 // tmp+=" padding-bottom: "+QString::number(tablePadding->value())+"px;\n"; //not possible: qt bug.
1045 if(CBBreak->currentIndex()==1)
1046 tmp+=" page-break-after: always;";
1047 tmp+=" }\n";
1048 //end. the "back" stuff is only needed because of a qt bug (*1*). delete this as soon as bug is solved
1049
1050 int htmlLevel=3;
1051 if(automaticColors->isChecked()){
1052 htmlLevel=7;
1053 }
1054 if(htmlLevel==7){ // must be written before LEVEL 3, because LEVEL 3 should have higher priority
1055 TimetableExport::computeHashActivityColorBySubject();
1056 TimetableExport::computeHashActivityColorBySubjectAndStudents();
1057
1058 int cnt=0;
1059 for(int i : qAsConst(activeHashActivityColorBySubject)){
1060 Activity* act=>.rules.internalActivitiesList[i];
1061
1062 QString tmpString=act->subjectName;
1063
1064 //similar to the coloring by Marco Vassura (start)
1065 int r, g, b;
1066 TimetableExport::stringToColor(tmpString, r, g, b);
1067 tmp += "td.c_"+QString::number(cnt+1)+" { /* Activity id: "+QString::number(act->id)+" (subject) */\n ";
1068 tmp+="background-color: rgb("+QString::number(r)+", "+QString::number(g)+", "+QString::number(b)+");\n";
1069 double brightness = double(r)*0.299 + double(g)*0.587 + double(b)*0.114;
1070 if (brightness<127.5)
1071 tmp+=" color: white;\n";
1072 else
1073 tmp+=" color: black;\n";
1074 tmp+="}\n\n";
1075 //similar to the coloring by Marco Vassura (end)
1076 cnt++;
1077 }
1078 for(int i : qAsConst(activeHashActivityColorBySubjectAndStudents)){
1079 Activity* act=>.rules.internalActivitiesList[i];
1080
1081 QString tmpString=act->subjectName+" "+act->studentsNames.join(" ,");
1082
1083 //similar to the coloring by Marco Vassura (start)
1084 int r, g, b;
1085 TimetableExport::stringToColor(tmpString, r, g, b);
1086 tmp += "td.c_"+QString::number(cnt+1)+" { /* Activity id: "+QString::number(act->id)+" (subject+students) */\n ";
1087 tmp+="background-color: rgb("+QString::number(r)+", "+QString::number(g)+", "+QString::number(b)+");\n";
1088 double brightness = double(r)*0.299 + double(g)*0.587 + double(b)*0.114;
1089 if (brightness<127.5)
1090 tmp+=" color: white;\n";
1091 else
1092 tmp+=" color: black;\n";
1093 tmp+="}\n\n";
1094 //similar to the coloring by Marco Vassura (end)
1095 cnt++;
1096 }
1097
1098 // QHashIterator<QString, QString> i(hashColorStringIDsTimetable);
1099 // qWarning("prepare css file");
1100 // while(i.hasNext()) {
1101 // qWarning("add color in css file");
1102 // i.next();
1103 // tmp+="td.c_"+i.value()+" { /* "+i.key()+" */\n ";
1104 //
1105 // //similar to the coloring by Marco Vassura (start)
1106 // int r, g, b;
1107 // TimetableExport::stringToColor(i.key(), r, g, b);
1108 // tmp+="background-color: rgb("+QString::number(r)+", "+QString::number(g)+", "+QString::number(b)+");\n";
1109 // double brightness = double(r)*0.299 + double(g)*0.587 + double(b)*0.114;
1110 // if (brightness<127.5)
1111 // tmp+=" color: white;\n";
1112 // else
1113 // tmp+=" color: black;\n";
1114 // //similar to the coloring by Marco Vassura (end)
1115 // tmp+="}\n\n";
1116 // }
1117 }
1118
1119 tmp+=" table {\n";
1120 tmp+=" font-size: "+QString::number(fontSizeTable->value())+"pt;\n";
1121 tmp+=" padding-top: "+QString::number(tablePadding->value())+"px;\n";
1122 tmp+=" page-break-inside: avoid;\n";
1123 tmp+=" }\n";
1124 tmp+=" th {\n";
1125 tmp+=" text-align: center;\n"; //currently no effect because of a qt bug (compare http://bugreports.qt.nokia.com/browse/QTBUG-2730 )
1126 tmp+=" vertical-align: middle;\n";
1127 tmp+=" white-space: "+CBWhiteSpace->currentText()+";\n";
1128 tmp+=" }\n";
1129 tmp+=" td {\n";
1130 tmp+=" text-align: center;\n"; //currently no effect because of a qt bug (compare http://bugreports.qt.nokia.com/browse/QTBUG-2730 )
1131 tmp+=" vertical-align: middle;\n";
1132 tmp+=" white-space: "+CBWhiteSpace->currentText()+";\n";
1133 tmp+=" padding-left: "+QString::number(activitiesPadding->value())+"px;\n";
1134 tmp+=" padding-right: "+QString::number(activitiesPadding->value())+"px;\n";
1135 tmp+=" }\n";
1136 tmp+=" td.detailed {\n";
1137 // tmp+=" padding-left: 4px;\n";
1138 // tmp+=" padding-right: 4px;\n";
1139 tmp+=" }\n";
1140 tmp+=" th.xAxis {\n"; //needs level 2
1141 // tmp+=" padding-left: 4px;\n";
1142 // tmp+=" padding-right: 4px;\n";
1143 tmp+=" }\n";
1144 tmp+=" th.yAxis {\n"; //needs level 2
1145 // tmp+=" padding-top: 4px;\n";
1146 // tmp+=" padding-bottom: 4px;\n";
1147 tmp+=" }\n";
1148 tmp+=" tr.line0, div.line0 {\n"; //needs level 3
1149 tmp+=" /*font-size: 12pt;*/\n";
1150 if(htmlLevel!=7){
1151 tmp+=" color: gray;\n";
1152 }
1153 tmp+=" }\n";
1154 tmp+=" tr.line1, div.line1 {\n"; //needs level 3
1155 tmp+=" /*font-size: 12pt;*/\n";
1156 tmp+=" }\n";
1157 tmp+=" tr.line2, div.line2 {\n"; //needs level 3
1158 tmp+=" /*font-size: 12pt;*/\n";
1159 if(htmlLevel!=7){
1160 tmp+=" color: gray;\n";
1161 }
1162 tmp+=" }\n";
1163 tmp+=" tr.line3, div.line3 {\n"; //needs level 3
1164 tmp+=" /*font-size: 12pt;*/\n";
1165 if(htmlLevel!=7){
1166 tmp+=" color: silver;\n";
1167 }
1168 tmp+=" }\n";
1169 tmp+=" </style>\n";
1170 tmp+=" </head>\n\n";
1171 tmp+=" <body id=\"top\">\n";
1172
1173 if(numberOfPlacedActivities1!=gt.rules.nInternalActivities)
1174 tmp+=" <h1>"+tr("Warning! Only %1 out of %2 activities placed!").arg(numberOfPlacedActivities1).arg(gt.rules.nInternalActivities)+"</h1>\n";
1175
1176 QList<int> includedNamesIndex;
1177 QSet<int> excludedNamesIndex;
1178 for(int nameIndex=0; nameIndex<namesList->count(); nameIndex++){
1179 QListWidgetItem* tmpItem=namesList->item(nameIndex);
1180 if(tmpItem->isSelected()){
1181 includedNamesIndex<<nameIndex;
1182 } else {
1183 excludedNamesIndex<<nameIndex;
1184 }
1185 }
1186
1187 //maybe TODO: do the pagebreak similar in timetableexport. (so remove the odd and even table tag and use only back1 and back2 (maybe rename to odd and even))
1188 // check the GroupsTimetableDaysHorizontalHtml and Year parameter then (iNi%2) isn't needed anymore then.
1189 if(RBDaysHorizontal->isChecked()){
1190 for(int iNi=0; iNi<includedNamesIndex.size(); iNi++){
1191 switch(CBTables->currentIndex()){
1192 case 0: tmp+=TimetableExport::singleSubgroupsTimetableDaysHorizontalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1193 case 1: tmp+=TimetableExport::singleSubgroupsTimetableDaysHorizontalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), repeatNames->isChecked(), subgroupsSortedOrder); break;
1194 case 2: tmp+=TimetableExport::singleGroupsTimetableDaysHorizontalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), printDetailedTables->isChecked(), repeatNames->isChecked()); break;
1195 case 3: tmp+=TimetableExport::singleYearsTimetableDaysHorizontalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), printDetailedTables->isChecked(), repeatNames->isChecked()); break;
1196 case 4: tmp+=TimetableExport::singleTeachersTimetableDaysHorizontalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1197 case 5: tmp+=TimetableExport::singleTeachersFreePeriodsTimetableDaysHorizontalHtml(htmlLevel, saveTime, printDetailedTables->isChecked(), repeatNames->isChecked()); break;
1198 case 6: tmp+=TimetableExport::singleRoomsTimetableDaysHorizontalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1199 case 7: tmp+=TimetableExport::singleSubjectsTimetableDaysHorizontalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1200 case 8: tmp+=TimetableExport::singleActivityTagsTimetableDaysHorizontalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1201 case 9: tmp+=TimetableExport::singleAllActivitiesTimetableDaysHorizontalHtml(htmlLevel, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1202 case 10: tmp+=TimetableExport::singleStudentsStatisticsHtml(htmlLevel, saveTime, printDetailedTables->isChecked(), repeatNames->isChecked(), printAll); break;
1203 case 11: tmp+=TimetableExport::singleTeachersStatisticsHtml(htmlLevel, saveTime, printDetailedTables->isChecked(), repeatNames->isChecked(), printAll); break;
1204 default: assert(0==1);
1205 }
1206 if(iNi<includedNamesIndex.size()-1){
1207 if(iNi%2==0){
1208 tmp+=" <p class=\"back1\"><br /></p>\n\n";
1209 } else {
1210 if(!printAll) break;
1211 tmp+=" <p class=\"back0\"><br /></p>\n\n";
1212 }
1213 }
1214 }
1215 }
1216 if(RBDaysVertical->isChecked()){
1217 for(int iNi=0; iNi<includedNamesIndex.size(); iNi++){
1218 switch(CBTables->currentIndex()){
1219 case 0: tmp+=TimetableExport::singleSubgroupsTimetableDaysVerticalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1220 case 1: tmp+=TimetableExport::singleSubgroupsTimetableDaysVerticalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), repeatNames->isChecked(), subgroupsSortedOrder); break;
1221 case 2: tmp+=TimetableExport::singleGroupsTimetableDaysVerticalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), printDetailedTables->isChecked(), repeatNames->isChecked()); break;
1222 case 3: tmp+=TimetableExport::singleYearsTimetableDaysVerticalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), printDetailedTables->isChecked(), repeatNames->isChecked()); break;
1223 case 4: tmp+=TimetableExport::singleTeachersTimetableDaysVerticalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1224 case 5: tmp+=TimetableExport::singleTeachersFreePeriodsTimetableDaysVerticalHtml(htmlLevel, saveTime, printDetailedTables->isChecked(), repeatNames->isChecked()); break;
1225 case 6: tmp+=TimetableExport::singleRoomsTimetableDaysVerticalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1226 case 7: tmp+=TimetableExport::singleSubjectsTimetableDaysVerticalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1227 case 8: tmp+=TimetableExport::singleActivityTagsTimetableDaysVerticalHtml(htmlLevel, includedNamesIndex.at(iNi), saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1228 case 9: tmp+=TimetableExport::singleAllActivitiesTimetableDaysVerticalHtml(htmlLevel, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1229 default: assert(0==1);
1230 }
1231 if(iNi<includedNamesIndex.size()-1){
1232 if(iNi%2==0){
1233 tmp+=" <p class=\"back1\"><br /></p>\n\n";
1234 } else {
1235 if(!printAll) break;
1236 tmp+=" <p class=\"back0\"><br /></p>\n\n";
1237 }
1238 }
1239 }
1240 }
1241 if(RBTimeHorizontal->isChecked() /*&& !CBDivideTimeAxisByDay->isChecked()*/){
1242 int count=0;
1243 while(excludedNamesIndex.size()<namesList->count()){
1244 switch(CBTables->currentIndex()){
1245 case 0: tmp+=TimetableExport::singleSubgroupsTimetableTimeHorizontalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1246 case 1: tmp+=TimetableExport::singleSubgroupsTimetableTimeHorizontalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked(), subgroupsSortedOrder); break;
1247 case 2: tmp+=TimetableExport::singleGroupsTimetableTimeHorizontalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), printDetailedTables->isChecked(), repeatNames->isChecked()); break;
1248 case 3: tmp+=TimetableExport::singleYearsTimetableTimeHorizontalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), printDetailedTables->isChecked(), repeatNames->isChecked()); break;
1249 case 4: tmp+=TimetableExport::singleTeachersTimetableTimeHorizontalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1250 case 5: /*tmp+=TimetableExport::singleTeachersFreePeriodsTimetableTimeHorizontalHtml(htmlLevel, saveTime, printDetailedTables->isChecked(), repeatNames->isChecked());*/ break;
1251 case 6: tmp+=TimetableExport::singleRoomsTimetableTimeHorizontalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1252 case 7: tmp+=TimetableExport::singleSubjectsTimetableTimeHorizontalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1253 case 8: tmp+=TimetableExport::singleActivityTagsTimetableTimeHorizontalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1254 case 9: tmp+=TimetableExport::singleAllActivitiesTimetableTimeHorizontalHtml(htmlLevel, saveTime, printActivityTags->isChecked(), repeatNames->isChecked());
1255 excludedNamesIndex<<-1; break;
1256 default: assert(0==1);
1257 }
1258 if(excludedNamesIndex.size()<namesList->count()){
1259 if(count%2==0){
1260 tmp+=" <p class=\"back1\"><br /></p>\n\n";
1261 } else {
1262 if(!printAll) break;
1263 tmp+=" <p class=\"back0\"><br /></p>\n\n";
1264 }
1265 count++;
1266 }
1267 }
1268 }
1269 if(RBTimeVertical->isChecked() /*&& !CBDivideTimeAxisByDay->isChecked()*/){
1270 int count=0;
1271 while(excludedNamesIndex.size()<namesList->count()){
1272 switch(CBTables->currentIndex()){
1273 case 0: tmp+=TimetableExport::singleSubgroupsTimetableTimeVerticalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1274 case 1: tmp+=TimetableExport::singleSubgroupsTimetableTimeVerticalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked(), subgroupsSortedOrder); break;
1275 case 2: tmp+=TimetableExport::singleGroupsTimetableTimeVerticalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), printDetailedTables->isChecked(), repeatNames->isChecked()); break;
1276 case 3: tmp+=TimetableExport::singleYearsTimetableTimeVerticalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), printDetailedTables->isChecked(), repeatNames->isChecked()); break;
1277 case 4: tmp+=TimetableExport::singleTeachersTimetableTimeVerticalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1278 case 5: /*tmp+=TimetableExport::singleTeachersFreePeriodsTimetableTimeVerticalHtml(htmlLevel, saveTime, printDetailedTables->isChecked(), repeatNames->isChecked());*/ break;
1279 case 6: tmp+=TimetableExport::singleRoomsTimetableTimeVerticalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1280 case 7: tmp+=TimetableExport::singleSubjectsTimetableTimeVerticalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1281 case 8: tmp+=TimetableExport::singleActivityTagsTimetableTimeVerticalHtml(htmlLevel, maxNames->value(), excludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1282 case 9: tmp+=TimetableExport::singleAllActivitiesTimetableTimeVerticalHtml(htmlLevel, saveTime, printActivityTags->isChecked(), repeatNames->isChecked());
1283 excludedNamesIndex<<-1; break;
1284 default: assert(0==1);
1285 }
1286 if(excludedNamesIndex.size()<namesList->count()){
1287 if(count%2==0){
1288 tmp+=" <p class=\"back1\"><br /></p>\n\n";
1289 } else {
1290 if(!printAll) break;
1291 tmp+=" <p class=\"back0\"><br /></p>\n\n";
1292 }
1293 count++;
1294 }
1295 }
1296 }
1297 if(RBTimeHorizontalDay->isChecked() /*&& CBDivideTimeAxisByDay->isChecked()*/){
1298 int count=0;
1299 for(int day=0; day<gt.rules.nDaysPerWeek; day++){
1300 QSet<int> tmpExcludedNamesIndex;
1301 tmpExcludedNamesIndex=excludedNamesIndex;
1302 while(tmpExcludedNamesIndex.size()<namesList->count()){
1303 switch(CBTables->currentIndex()){
1304 case 0: tmp+=TimetableExport::singleSubgroupsTimetableTimeHorizontalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1305 case 1: tmp+=TimetableExport::singleSubgroupsTimetableTimeHorizontalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked(), subgroupsSortedOrder); break;
1306 case 2: tmp+=TimetableExport::singleGroupsTimetableTimeHorizontalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), printDetailedTables->isChecked(), repeatNames->isChecked()); break;
1307 case 3: tmp+=TimetableExport::singleYearsTimetableTimeHorizontalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), printDetailedTables->isChecked(), repeatNames->isChecked()); break;
1308 case 4: tmp+=TimetableExport::singleTeachersTimetableTimeHorizontalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1309 case 5: /*tmp+=TimetableExport::singleTeachersFreePeriodsTimetableTimeHorizontalDailyHtml(htmlLevel, day, saveTime, printDetailedTables->isChecked(), repeatNames->isChecked());*/ break;
1310 case 6: tmp+=TimetableExport::singleRoomsTimetableTimeHorizontalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1311 case 7: tmp+=TimetableExport::singleSubjectsTimetableTimeHorizontalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1312 case 8: tmp+=TimetableExport::singleActivityTagsTimetableTimeHorizontalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1313 case 9: tmp+=TimetableExport::singleAllActivitiesTimetableTimeHorizontalDailyHtml(htmlLevel, day, saveTime, printActivityTags->isChecked(), repeatNames->isChecked());
1314 tmpExcludedNamesIndex<<-1; break;
1315 default: assert(0==1);
1316 }
1317 if(!(tmpExcludedNamesIndex.size()==namesList->count() && day==gt.rules.nDaysPerWeek-1)){
1318 if(count%2==0){
1319 tmp+=" <p class=\"back1\"><br /></p>\n\n";
1320 } else {
1321 if(!printAll) break;
1322 tmp+=" <p class=\"back0\"><br /></p>\n\n";
1323 }
1324 count++;
1325 }
1326 }
1327 if(!printAll) break;
1328 }
1329 }
1330 if(RBTimeVerticalDay->isChecked() /*&& CBDivideTimeAxisByDay->isChecked()*/){
1331 int count=0;
1332 for(int day=0; day<gt.rules.nDaysPerWeek; day++){
1333 QSet<int> tmpExcludedNamesIndex;
1334 tmpExcludedNamesIndex=excludedNamesIndex;
1335 while(tmpExcludedNamesIndex.size()<namesList->count()){
1336 switch(CBTables->currentIndex()){
1337 case 0: tmp+=TimetableExport::singleSubgroupsTimetableTimeVerticalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1338 case 1: tmp+=TimetableExport::singleSubgroupsTimetableTimeVerticalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked(), subgroupsSortedOrder); break;
1339 case 2: tmp+=TimetableExport::singleGroupsTimetableTimeVerticalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), printDetailedTables->isChecked(), repeatNames->isChecked()); break;
1340 case 3: tmp+=TimetableExport::singleYearsTimetableTimeVerticalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), printDetailedTables->isChecked(), repeatNames->isChecked()); break;
1341 case 4: tmp+=TimetableExport::singleTeachersTimetableTimeVerticalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1342 case 5: /*tmp+=TimetableExport::singleTeachersFreePeriodsTimetableTimeVerticalDailyHtml(htmlLevel, day, saveTime, printDetailedTables->isChecked(), repeatNames->isChecked());*/ break;
1343 case 6: tmp+=TimetableExport::singleRoomsTimetableTimeVerticalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1344 case 7: tmp+=TimetableExport::singleSubjectsTimetableTimeVerticalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1345 case 8: tmp+=TimetableExport::singleActivityTagsTimetableTimeVerticalDailyHtml(htmlLevel, day, maxNames->value(), tmpExcludedNamesIndex, saveTime, printActivityTags->isChecked(), repeatNames->isChecked()); break;
1346 case 9: tmp+=TimetableExport::singleAllActivitiesTimetableTimeVerticalDailyHtml(htmlLevel, day, saveTime, printActivityTags->isChecked(), repeatNames->isChecked());
1347 tmpExcludedNamesIndex<<-1; break;
1348 default: assert(0==1);
1349 }
1350 if(!(tmpExcludedNamesIndex.size()==namesList->count() && day==gt.rules.nDaysPerWeek-1)){
1351 if(count%2==0){
1352 tmp+=" <p class=\"back1\"><br /></p>\n\n";
1353 } else {
1354 if(!printAll) break;
1355 tmp+=" <p class=\"back0\"><br /></p>\n\n";
1356 }
1357 count++;
1358 }
1359 }
1360 if(!printAll) break;
1361 }
1362 }
1363 // end
1364
1365 tmp+=" </body>\n";
1366 tmp+="</html>\n\n";
1367
1368 return tmp;
1369 }
1370
1371 /*void TimetablePrintForm::updateCBDivideTimeAxisByDay()
1372 {
1373 CBDivideTimeAxisByDay->setDisabled(RBDaysHorizontal->isChecked() || RBDaysVertical->isChecked());
1374 }*/
1375
print()1376 void TimetablePrintForm::print(){
1377 #ifdef QT_NO_PRINTER
1378 QMessageBox::warning(this, tr("FET warning"), tr("FET is compiled without printer support "
1379 "- it is impossible to print from this dialog. Please open the HTML timetables from the results directory"));
1380 #else
1381 QPrinter printer(QPrinter::HighResolution);
1382
1383 assert(paperSizesMap.contains(CBpaperSize->currentText()));
1384 #if QT_VERSION >= QT_VERSION_CHECK(5,15,2)
1385 printer.setPageSize(paperSizesMap.value(CBpaperSize->currentText()));
1386 #else
1387 printer.setPaperSize(paperSizesMap.value(CBpaperSize->currentText()));
1388 #endif
1389
1390 switch(CBorientationMode->currentIndex()){
1391 #if QT_VERSION >= QT_VERSION_CHECK(5,15,2)
1392 case 0: printer.setPageOrientation(QPageLayout::Portrait); break;
1393 case 1: printer.setPageOrientation(QPageLayout::Landscape); break;
1394 #else
1395 case 0: printer.setOrientation(QPrinter::Portrait); break;
1396 case 1: printer.setOrientation(QPrinter::Landscape); break;
1397 #endif
1398 default: assert(0==1);
1399 }
1400 #if QT_VERSION >= QT_VERSION_CHECK(5,3,0)
1401 QMarginsF printerMargins;
1402 printerMargins.setLeft(leftPageMargin->value());
1403 printerMargins.setRight(rightPageMargin->value());
1404 printerMargins.setBottom(bottomPageMargin->value());
1405 printerMargins.setTop(topPageMargin->value());
1406 if(!printer.setPageMargins(printerMargins, QPageLayout::Millimeter)){
1407 printerMargins=printer.pageLayout().minimumMargins();
1408 QMessageBox::warning(this, tr("FET warning"), tr("No margins set, because at least one value is too small. "
1409 "You need to enter at least:\nLeft: %1\nRight: %2\nTop: %3\nBottom: %4")
1410 .arg(printerMargins.left()).arg(printerMargins.right()).arg(printerMargins.top()).arg(printerMargins.bottom()));
1411 }
1412 #else
1413 printer.setPageMargins(leftPageMargin->value(), topPageMargin->value(), rightPageMargin->value(), bottomPageMargin->value(), QPrinter::Millimeter);
1414 #endif
1415 //QPrintDialog *printDialog = new QPrintDialog(&printer, this);
1416 QPrintDialog printDialog(&printer, this);
1417 printDialog.setWindowTitle(tr("Print timetable"));
1418 if (printDialog.exec() == QDialog::Accepted) {
1419 QTextDocument textDocument;
1420 textDocument.documentLayout()->setPaintDevice(&printer);
1421 #if QT_VERSION >= QT_VERSION_CHECK(5,15,2)
1422 textDocument.setPageSize(QSizeF(printer.pageLayout().paintRectPixels(printer.resolution()).size()));
1423 #else
1424 textDocument.setPageSize(QSizeF(printer.pageRect().size()));
1425 #endif
1426 textDocument.setHtml(updateHtmlPrintString(true));
1427 textDocument.print(&printer);
1428 }
1429 //delete printDialog;
1430 #endif
1431 }
1432
printPreviewFull()1433 void TimetablePrintForm::printPreviewFull(){
1434 #ifdef QT_NO_PRINTER
1435 QMessageBox::warning(this, tr("FET warning"), tr("FET is compiled without printer support "
1436 "- it is impossible to print from this dialog. Please open the HTML timetables from the results directory"));
1437 #else
1438 QPrinter printer(QPrinter::HighResolution);
1439
1440 assert(paperSizesMap.contains(CBpaperSize->currentText()));
1441 #if QT_VERSION >= QT_VERSION_CHECK(5,3,0)
1442 printer.setPageSize(paperSizesMap.value(CBpaperSize->currentText()));
1443 #else
1444 printer.setPaperSize(paperSizesMap.value(CBpaperSize->currentText()));
1445 #endif
1446
1447 switch(CBorientationMode->currentIndex()){
1448 #if QT_VERSION >= QT_VERSION_CHECK(5,15,2)
1449 case 0: printer.setPageOrientation(QPageLayout::Portrait); break;
1450 case 1: printer.setPageOrientation(QPageLayout::Landscape); break;
1451 #else
1452 case 0: printer.setOrientation(QPrinter::Portrait); break;
1453 case 1: printer.setOrientation(QPrinter::Landscape); break;
1454 #endif
1455 default: assert(0==1);
1456 }
1457 #if QT_VERSION >= QT_VERSION_CHECK(5,3,0)
1458 QMarginsF printerMargins;
1459 printerMargins.setLeft(leftPageMargin->value());
1460 printerMargins.setRight(rightPageMargin->value());
1461 printerMargins.setBottom(bottomPageMargin->value());
1462 printerMargins.setTop(topPageMargin->value());
1463 if(!printer.setPageMargins(printerMargins, QPageLayout::Millimeter)){
1464 printerMargins=printer.pageLayout().minimumMargins();
1465 QMessageBox::warning(this, tr("FET warning"), tr("No margins set, because at least one value is too small. "
1466 "You need to enter at least:\nLeft: %1\nRight: %2\nTop: %3\nBottom: %4")
1467 .arg(printerMargins.left()).arg(printerMargins.right()).arg(printerMargins.top()).arg(printerMargins.bottom()));
1468 }
1469 #else
1470 printer.setPageMargins(leftPageMargin->value(), topPageMargin->value(), rightPageMargin->value(), bottomPageMargin->value(), QPrinter::Millimeter);
1471 #endif
1472 QPrintPreviewDialog printPreviewFull(&printer, this);
1473 connect(&printPreviewFull, SIGNAL(paintRequested(QPrinter*)), SLOT(updatePreviewFull(QPrinter*)));
1474 printPreviewFull.exec();
1475 #endif
1476 }
1477
updatePreviewFull(QPrinter * printer)1478 void TimetablePrintForm::updatePreviewFull(QPrinter* printer){
1479 #ifdef QT_NO_PRINTER
1480 Q_UNUSED(printer);
1481
1482 QMessageBox::warning(this, tr("FET warning"), tr("FET is compiled without printer support "
1483 "- it is impossible to print from this dialog. Please open the HTML timetables from the results directory"));
1484 #else
1485 QTextDocument textDocument;
1486 textDocument.documentLayout()->setPaintDevice(printer);
1487 #if QT_VERSION >= QT_VERSION_CHECK(5,15,2)
1488 textDocument.setPageSize(QSizeF(printer->pageLayout().paintRectPixels(printer->resolution()).size()));
1489 #else
1490 textDocument.setPageSize(QSizeF(printer->pageRect().size()));
1491 #endif
1492 textDocument.setHtml(updateHtmlPrintString(true));
1493 textDocument.print(printer);
1494 #endif
1495 }
1496
printPreviewSmall()1497 void TimetablePrintForm::printPreviewSmall(){
1498 #ifdef QT_NO_PRINTER
1499 QMessageBox::warning(this, tr("FET warning"), tr("FET is compiled without printer support "
1500 "- it is impossible to print from this dialog. Please open the HTML timetables from the results directory"));
1501 #else
1502 QPrinter printer(QPrinter::HighResolution);
1503
1504 assert(paperSizesMap.contains(CBpaperSize->currentText()));
1505 #if QT_VERSION >= QT_VERSION_CHECK(5,3,0)
1506 printer.setPageSize(paperSizesMap.value(CBpaperSize->currentText()));
1507 #else
1508 printer.setPaperSize(paperSizesMap.value(CBpaperSize->currentText()));
1509 #endif
1510
1511 switch(CBorientationMode->currentIndex()){
1512 #if QT_VERSION >= QT_VERSION_CHECK(5,15,2)
1513 case 0: printer.setPageOrientation(QPageLayout::Portrait); break;
1514 case 1: printer.setPageOrientation(QPageLayout::Landscape); break;
1515 #else
1516 case 0: printer.setOrientation(QPrinter::Portrait); break;
1517 case 1: printer.setOrientation(QPrinter::Landscape); break;
1518 #endif
1519 default: assert(0==1);
1520 }
1521
1522 #if QT_VERSION >= QT_VERSION_CHECK(5,3,0)
1523 QMarginsF printerMargins;
1524 printerMargins.setLeft(leftPageMargin->value());
1525 printerMargins.setRight(rightPageMargin->value());
1526 printerMargins.setBottom(bottomPageMargin->value());
1527 printerMargins.setTop(topPageMargin->value());
1528 if(!printer.setPageMargins(printerMargins, QPageLayout::Millimeter)){
1529 printerMargins=printer.pageLayout().minimumMargins();
1530 QMessageBox::warning(this, tr("FET warning"), tr("No margins set, because at least one value is too small. "
1531 "You need to enter at least:\nLeft: %1\nRight: %2\nTop: %3\nBottom: %4")
1532 .arg(printerMargins.left()).arg(printerMargins.right()).arg(printerMargins.top()).arg(printerMargins.bottom()));
1533 }
1534 #else
1535 printer.setPageMargins(leftPageMargin->value(), topPageMargin->value(), rightPageMargin->value(), bottomPageMargin->value(), QPrinter::Millimeter);
1536 #endif
1537 QPrintPreviewDialog printPreviewSmall(&printer, this);
1538 connect(&printPreviewSmall, SIGNAL(paintRequested(QPrinter*)), SLOT(updatePreviewSmall(QPrinter*)));
1539 printPreviewSmall.exec();
1540 #endif
1541 }
1542
updatePreviewSmall(QPrinter * printer)1543 void TimetablePrintForm::updatePreviewSmall(QPrinter* printer){
1544 #ifdef QT_NO_PRINTER
1545 Q_UNUSED(printer);
1546
1547 QMessageBox::warning(this, tr("FET warning"), tr("FET is compiled without printer support "
1548 "- it is impossible to print from this dialog. Please open the HTML timetables from the results directory"));
1549 #else
1550 QTextDocument textDocument;
1551 textDocument.documentLayout()->setPaintDevice(printer);
1552 #if QT_VERSION >= QT_VERSION_CHECK(5,15,2)
1553 textDocument.setPageSize(QSizeF(printer->pageLayout().paintRectPixels(printer->resolution()).size()));
1554 #else
1555 textDocument.setPageSize(QSizeF(printer->pageRect().size()));
1556 #endif
1557 textDocument.setHtml(updateHtmlPrintString(false));
1558 textDocument.print(printer);
1559 #endif
1560 }
1561