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=&gt.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=&gt.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