• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

PIMPrint Library

  • sources
  • kde-4.14
  • kdepim
  • pimprint
  • calendar
calprintday.cpp
Go to the documentation of this file.
1 /*
2  This file is part of the PimPrint library.
3 
4  Copyright (C) 2012-2013 Allen Winter <winter@kde.org>
5 
6  This library is free software; you can redistribute it and/or
7  modify it under the terms of the GNU Library General Public
8  License as published by the Free Software Foundation; either
9  version 2 of the License, or (at your option) any later version.
10 
11  This library is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU Library General Public License for more details.
15 
16  You should have received a copy of the GNU Library General Public License
17  along with this library; see the file COPYING.LIB. If not, write to the
18  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  Boston, MA 02110-1301, USA.
20 */
21 
22 #include "calprintday.h"
23 
24 #include <calendarsupport/utils.h>
25 
26 #include <KCalCore/Event>
27 #include <KCalCore/Todo>
28 
29 #include <KGlobal>
30 #include <KSystemTimeZones>
31 
32 #include <qmath.h>
33 
34 using namespace PimPrint::Calendar;
35 
36 //@cond PRIVATE
37 class PimPrint::Calendar::CalPrintDay::Private
38 {
39 public:
40  Private()
41  {
42  }
43 
44  QDate mStartDate; // starting date of print
45  QDate mEndDate; // ending date of print
46  QTime mStartTime; // starting time of each day's print
47  QTime mEndTime; // ending time of each day's print
48 };
49 //@endcond
50 
51 CalPrintDay::CalPrintDay(QPrinter *printer)
52  : CalPrintBase(printer),
53  d(new PimPrint::Calendar::CalPrintDay::Private)
54 {
55  //TODO:
56  // set the calendar and calendar system
57 
58  // Set default print style
59  setPrintStyle(CalPrintBase::DayTimeTable);
60 
61  // Set default Info options
62  setInfoOptions(CalPrintBase::InfoTimeRange);
63 
64  // Set default Type options
65  setTypeOptions(0);
66 
67  // Set default Range options
68  setRangeOptions(0);
69 
70  // Set default Extra options
71  setExtraOptions(0);
72 }
73 
74 CalPrintDay::~CalPrintDay()
75 {
76  delete d;
77 }
78 
79 void CalPrintDay::print(QPainter &p)
80 {
81  switch (printStyle()) {
82  case CalPrintBase::DayFiloFax:
83  drawDayFiloFax(p);
84  break;
85  case CalPrintBase::DaySingleTimeTable:
86  drawDaySingleTimeTable(p);
87  break;
88  case CalPrintBase::DayTimeTable:
89  default:
90  drawDayTimeTable(p);
91  break;
92  }
93 }
94 
95 void CalPrintDay::setStartDate(const QDate &date)
96 {
97  d->mStartDate = date;
98 }
99 
100 QDate CalPrintDay::startDate() const
101 {
102  return d->mStartDate;
103 }
104 
105 void CalPrintDay::setEndDate(const QDate &date)
106 {
107  d->mEndDate = date;
108 }
109 
110 QDate CalPrintDay::endDate() const
111 {
112  return d->mEndDate;
113 }
114 
115 void CalPrintDay::setStartTime(const QTime &time)
116 {
117  d->mStartTime = time;
118 }
119 
120 QTime CalPrintDay::startTime() const
121 {
122  return d->mStartTime;
123 }
124 
125 void CalPrintDay::setEndTime(const QTime &time)
126 {
127  d->mEndTime = time;
128 }
129 
130 QTime CalPrintDay::endTime() const
131 {
132  return d->mEndTime;
133 }
134 
135 QRect CalPrintDay::drawHeader(QPainter &p,
136  const QDate &startDate, const QDate &endDate) const
137 {
138  if (!startDate.isValid()) {
139  return QRect();
140  }
141 
142  KLocale *local = KGlobal::locale();
143 
144  QString title;
145  if (endDate.isValid()) {
146  const QString line1 = local->formatDate(startDate);
147  const QString line2 = local->formatDate(endDate);
148  if (useLandscape()) {
149  title = i18nc("date from-to", "%1 - %2", line1, line2);
150  } else {
151  title = i18nc("date from-\nto", "%1 -\n%2", line1, line2);
152  }
153  } else {
154  title = local->formatDate(startDate);
155  }
156 
157  const QRect headerBox(0, 0, pageWidth(), headerHeight());
158  CalPrintBase::drawHeader(p, headerBox, title, startDate);
159  return headerBox;
160 }
161 
162 QRect CalPrintDay::drawFooter(QPainter &p) const
163 {
164  QRect footerBox(0, pageHeight() - footerHeight(), pageWidth(), footerHeight());
165 
166  CalPrintBase::drawFooter(p, footerBox);
167 
168  return footerBox;
169 }
170 
171 void CalPrintDay::drawDays(QPainter &p,
172  const QDate &start, const QDate &end,
173  const QTime &startTime, const QTime &endTime,
174  const QRect &box) const
175 {
176  const int numberOfDays = start.daysTo(end) + 1;
177 
178  int cellWidth, vcells;
179  if (!useLandscape()) {
180  // 2 columns
181  vcells = qCeil(static_cast<double>(numberOfDays) / 2.0);
182  if (numberOfDays > 1) {
183  cellWidth = box.width() / 2;
184  } else {
185  cellWidth = box.width();
186  }
187  } else {
188  // landscape: N columns
189  vcells = 1;
190  cellWidth = box.width() / numberOfDays;
191  }
192 
193  const int cellHeight = box.height() / vcells;
194  QDate weekDate = start;
195  for (int i = 0; i < numberOfDays; ++i, weekDate = weekDate.addDays(1)) {
196  const int hpos = i / vcells;
197  const int vpos = i % vcells;
198  const QRect dayBox(box.left() + cellWidth * hpos,
199  box.top() + cellHeight * vpos,
200  cellWidth,
201  cellHeight);
202 
203  drawDayBox(p, dayBox, weekDate, startTime, endTime, true);
204 
205  } // for i through all selected days
206 }
207 
208 void CalPrintDay::drawDayFiloFax(QPainter &p) const
209 {
210  QDate curDay(d->mStartDate);
211 
212  QRect headerBox = drawHeader(p, d->mStartDate, d->mEndDate);
213 
214  QRect daysBox(headerBox);
215  daysBox.setTop(headerBox.bottom() + padding());
216  daysBox.setBottom(pageHeight() - footerHeight());
217 
218  drawDays(p, d->mStartDate, d->mEndDate, d->mStartTime, d->mEndTime, daysBox);
219 
220  if (extraOptions().testFlag(CalPrintBase::ExtraFooter)) {
221  drawFooter(p);
222  }
223 }
224 
225 void CalPrintDay::drawDaySingleTimeTable(QPainter &p) const
226 {
227  QDate curDay(d->mStartDate);
228 
229  QRect headerBox = drawHeader(p, d->mStartDate, d->mEndDate);
230 
231  QRect daysBox(headerBox);
232  daysBox.setTop(headerBox.bottom() + padding());
233  daysBox.setBottom(pageHeight() - footerHeight());
234 
235  drawTimeTable(p, daysBox,
236  d->mStartDate, d->mEndDate,
237  d->mStartTime, d->mEndTime,
238  rangeOptions().testFlag(CalPrintBase::RangeTimeExpand));
239 
240  if (extraOptions().testFlag(CalPrintBase::ExtraFooter)) {
241  drawFooter(p);
242  }
243 }
244 
245 void CalPrintDay::drawDayTimeTable(QPainter &p) const
246 {
247  QDate curDay(d->mStartDate);
248 
249  KDateTime::Spec timeSpec = KSystemTimeZones::local();
250 
251  QTime curStartTime(d->mStartTime);
252  QTime curEndTime(d->mEndTime);
253 
254  // For an invalid time range, simply show one hour, starting at the hour
255  // before the given start time
256  if (curEndTime <= curStartTime) {
257  curStartTime = QTime(curStartTime.hour(), 0, 0);
258  curEndTime = curStartTime.addSecs(3600);
259  }
260 
261  do {
262  QRect headerBox = drawHeader(p, curDay, QDate());
263 
264  KCalCore::Event::List eventList =
265  printCalendar()->events(curDay, timeSpec,
266  KCalCore::EventSortStartDate,
267  KCalCore::SortDirectionAscending);
268 
269  // split out the all day events as they will be printed in a separate box
270  KCalCore::Event::List alldayEvents, timedEvents;
271  Q_FOREACH (const KCalCore::Event::Ptr &event, eventList) {
272  if (event->allDay()) {
273  alldayEvents.append(event);
274  } else {
275  timedEvents.append(event);
276  }
277  }
278 
279  const int fontSize = 11;
280  QFont textFont("sans-serif", fontSize, QFont::Normal);
281  p.setFont(textFont);
282  const int lineSpacing = p.fontMetrics().lineSpacing();
283 
284  const int tlWidth = timeLineWidth();
285  const int padMargin = padding();
286  const int maxAllDayEvents = 8; // the max we allow to be printed, sorry.
287  int allDayHeight = qMin(alldayEvents.count(), maxAllDayEvents) * lineSpacing;
288  allDayHeight = qMax(allDayHeight, (5 * lineSpacing)) + (2 * padMargin);
289  QRect allDayBox(tlWidth + padMargin, headerBox.bottom() + padMargin,
290  pageWidth() - tlWidth - padMargin, allDayHeight);
291  if (alldayEvents.count() > 0) {
292  // draw the side bar for all-day events
293  QFont oldFont(p.font());
294  p.setFont(QFont("sans-serif", 9, QFont::Normal));
295  drawVerticalBox(p,
296  boxBorderWidth(),
297  QRect(0, headerBox.bottom() + padMargin,
298  tlWidth, allDayHeight),
299  i18n("Today's Events"),
300  Qt::AlignHCenter | Qt::AlignVCenter | Qt::TextWordWrap);
301  p.setFont(oldFont);
302 
303  // now draw at most maxAllDayEvents in the all-day box
304  drawBox(p, boxBorderWidth(), allDayBox);
305 
306  QRect itemBox(allDayBox);
307  itemBox.setLeft(tlWidth + (2 * padMargin));
308  itemBox.setTop(itemBox.top() + padMargin);
309  itemBox.setBottom(itemBox.top() + lineSpacing);
310  int count = 0;
311  Q_FOREACH (const KCalCore::Event::Ptr &event, alldayEvents) {
312  if (count == maxAllDayEvents) {
313  break;
314  }
315  count++;
316  QString str;
317  if (event->location().isEmpty()) {
318  str = cleanString(event->summary());
319  } else {
320  str = i18nc("summary, location", "%1, %2",
321  cleanString(event->summary()),
322  cleanString(event->location()));
323  }
324  drawItemString(p, itemBox, str);
325  itemBox.setTop(itemBox.bottom());
326  itemBox.setBottom(itemBox.top() + lineSpacing);
327  }
328  } else {
329  allDayBox.setBottom(headerBox.bottom());
330  }
331 
332  QRect dayBox(allDayBox);
333  dayBox.setTop(allDayBox.bottom() + padMargin);
334  dayBox.setBottom(pageHeight() - footerHeight());
335  QList<QDate> workDays = CalendarSupport::workDays(curDay, curDay);
336  drawAgendaDayBox(p, dayBox, curDay, timedEvents,
337  curStartTime, curEndTime,
338  workDays);
339 
340  QRect tlBox(dayBox);
341  tlBox.setLeft(0);
342  tlBox.setWidth(tlWidth);
343  drawTimeLine(p, curStartTime, curEndTime, tlBox);
344 
345  if (extraOptions().testFlag(CalPrintBase::ExtraFooter)) {
346  drawFooter(p);
347  }
348 
349  curDay = curDay.addDays(1);
350  if (curDay <= d->mEndDate) {
351  thePrinter()->newPage();
352  }
353  } while (curDay <= d->mEndDate);
354 }
QDate::daysTo
int daysTo(const QDate &d) const
PimPrint::Calendar::CalPrintDay::setEndTime
void setEndTime(const QTime &time)
Sets the printout ending time.
Definition: calprintday.cpp:125
QRect::setBottom
void setBottom(int y)
PimPrint::Calendar::CalPrintDay::startTime
QTime startTime() const
Returns the current print starting time.
PimPrint::Calendar::CalPrintBase::setPrintStyle
void setPrintStyle(const Style style)
Sets the printing Style.
Definition: calprintbase.cpp:193
PimPrint::Calendar::CalPrintBase::setExtraOptions
void setExtraOptions(ExtraOptions flags)
Sets extra options for printing.
Definition: calprintbase.cpp:361
PimPrint::Calendar::CalPrintDay::drawDayFiloFax
void drawDayFiloFax(QPainter &p) const
Definition: calprintday.cpp:208
PimPrint::Calendar::CalPrintBase::drawBox
void drawBox(QPainter &p, const int linewidth, const QRect &box) const
Draws a box with given width at the given coordinates.
Definition: calprintbase.cpp:371
PimPrint::Calendar::CalPrintBase::printStyle
Style printStyle() const
Returns the current printing Style.
Definition: calprintbase.cpp:198
PimPrint::Calendar::CalPrintBase::DayFiloFax
Definition: calprintbase.h:124
PimPrint::Calendar::CalPrintBase::thePrinter
QPrinter * thePrinter() const
Returns a pointer to the currently set QPrinter.
Definition: calprintbase.cpp:168
PimPrint::Calendar::CalPrintDay
Definition: calprintday.h:42
PimPrint::Calendar::CalPrintBase::drawAgendaDayBox
void drawAgendaDayBox(QPainter &p, const QRect &box, const QDate &date, const KCalCore::Event::List &eventList, const QTime &startTime, const QTime &endTime, const QList< QDate > &workDays) const
Draws the agenda box.
Definition: calprintbase.cpp:724
QPrinter
PimPrint::Calendar::CalPrintBase::RangeTimeExpand
Definition: calprintbase.h:296
PimPrint::Calendar::CalPrintBase::DayTimeTable
Definition: calprintbase.h:125
QPainter::font
const QFont & font() const
PimPrint::Calendar::CalPrintDay::drawDayTimeTable
void drawDayTimeTable(QPainter &p) const
Definition: calprintday.cpp:245
QFont
PimPrint::Calendar::CalPrintDay::endDate
QDate endDate() const
Returns the current print ending date.
PimPrint::Calendar::CalPrintBase::extraOptions
ExtraOptions extraOptions() const
Returns the current extra option flags.
Definition: calprintbase.cpp:366
PimPrint::Calendar::CalPrintBase::pageWidth
int pageWidth() const
Returns the current printed page width.
QRect::height
int height() const
PimPrint::Calendar::CalPrintBase::drawTimeTable
void drawTimeTable(QPainter &p, const QRect &box, const QDate &startDate, const QDate &endDate, const QTime &startTime, const QTime &endTime, bool expandAll=false) const
Draws the timetable view of the given time range from startDate to endDate.
Definition: calprintbase.cpp:655
PimPrint::Calendar::CalPrintDay::~CalPrintDay
virtual ~CalPrintDay()
Definition: calprintday.cpp:74
PimPrint::Calendar::CalPrintBase::drawVerticalBox
void drawVerticalBox(QPainter &p, const int linewidth, const QRect &box, const QString &str, int flags=-1) const
Draws an event box with vertical text.
Definition: calprintbase.cpp:425
QTime
PimPrint::Calendar::CalPrintDay::drawDaySingleTimeTable
void drawDaySingleTimeTable(QPainter &p) const
Definition: calprintday.cpp:225
PimPrint::Calendar::CalPrintBase::timeLineWidth
int timeLineWidth() const
Returns the width of timelines.
QObject::event
virtual bool event(QEvent *e)
PimPrint::Calendar::CalPrintBase::rangeOptions
RangeOptions rangeOptions() const
Returns the current time-range option flags.
Definition: calprintbase.cpp:356
QRect
QPainter::setFont
void setFont(const QFont &font)
PimPrint::Calendar::CalPrintBase::InfoTimeRange
Definition: calprintbase.h:281
PimPrint::Calendar::CalPrintBase::drawItemString
void drawItemString(QPainter &p, const QRect &box, const QString &str, int flags=-1) const
Draws the given string (incidence summary) in the given rectangle.
Definition: calprintbase.cpp:395
QRect::top
int top() const
PimPrint::Calendar::CalPrintBase::boxBorderWidth
int boxBorderWidth() const
Returns the width of box borders.
QRect::setTop
void setTop(int y)
QRect::left
int left() const
QPainter
QRect::setWidth
void setWidth(int width)
PimPrint::Calendar::CalPrintBase::ExtraFooter
Definition: calprintbase.h:309
QDate::isValid
bool isValid() const
PimPrint::Calendar::CalPrintBase::drawFooter
int drawFooter(QPainter &p, const QRect &box) const
Draws a page footer containing the printing date and possibly other things, like a page number...
Definition: calprintbase.cpp:568
QTime::addSecs
QTime addSecs(int s) const
PimPrint::Calendar::CalPrintBase
Definition: calprintbase.h:67
PimPrint::Calendar::CalPrintBase::printCalendar
KCalCore::Calendar::Ptr printCalendar() const
Returns a pointer to the currently set print calendar.
Definition: calprintbase.cpp:178
PimPrint::Calendar::CalPrintBase::drawTimeLine
void drawTimeLine(QPainter &p, const QTime &startTime, const QTime &endTime, const QRect &box) const
Draws a (vertical) time scale from time startTime to endTime inside the given area of the painter...
Definition: calprintbase.cpp:583
PimPrint::Calendar::CalPrintBase::padding
int padding() const
Returns the current padding margin.
QDate
PimPrint::Calendar::CalPrintDay::setStartTime
void setStartTime(const QTime &time)
Sets the printout starting time.
Definition: calprintday.cpp:115
QString
QList
QTime::hour
int hour() const
calprintday.h
PimPrint::Calendar::CalPrintBase::setRangeOptions
void setRangeOptions(RangeOptions flags)
Sets time-range options for printing.
Definition: calprintbase.cpp:351
PimPrint::Calendar::CalPrintBase::headerHeight
int headerHeight() const
Returns the current height of the page header.
PimPrint::Calendar::CalPrintDay::setStartDate
void setStartDate(const QDate &date)
Sets the printout starting date.
Definition: calprintday.cpp:95
QPrinter::newPage
bool newPage()
PimPrint::Calendar::CalPrintDay::startDate
QDate startDate() const
Returns the current print starting date.
PimPrint::Calendar::CalPrintBase::setInfoOptions
void setInfoOptions(InfoOptions flags)
Sets information options for printing.
Definition: calprintbase.cpp:331
PimPrint::Calendar::CalPrintBase::drawHeader
int drawHeader(QPainter &p, const QRect &box, const QString &title, const QDate &leftMonth=QDate(), const QDate &rightMonth=QDate(), const bool expand=false, const QColor &backColor=QColor()) const
Draws the gray header bar of the printout to the QPainter.
Definition: calprintbase.cpp:497
PimPrint::Calendar::CalPrintBase::footerHeight
int footerHeight() const
Returns the current height of the page footer.
PimPrint::Calendar::CalPrintBase::drawDayBox
void drawDayBox(QPainter &p, const QRect &box, const QDate &date, const QTime &startTime, const QTime &endTime, bool fullDate=false) const
Draws the box containing a list of all events and to-dos of the given day.
Definition: calprintbase.cpp:1141
QRect::width
int width() const
PimPrint::Calendar::CalPrintBase::useLandscape
bool useLandscape() const
Returns if the current printed page orientation is landscape.
QPainter::fontMetrics
QFontMetrics fontMetrics() const
PimPrint::Calendar::CalPrintDay::print
void print(QPainter &p)
Definition: calprintday.cpp:79
PimPrint::Calendar::CalPrintBase::setTypeOptions
void setTypeOptions(TypeOptions flags)
Sets type options for printing.
Definition: calprintbase.cpp:341
QRect::bottom
int bottom() const
PimPrint::Calendar::CalPrintBase::pageHeight
int pageHeight() const
Returns the current printed page height.
PimPrint::Calendar::CalPrintDay::CalPrintDay
CalPrintDay(QPrinter *printer)
Definition: calprintday.cpp:51
PimPrint::Calendar::CalPrintBase::cleanString
QString cleanString(const QString &str) const
Cleans a string of newlines and other characters that shouldn't be printed.
Definition: calprintbase.cpp:1336
QDate::addDays
QDate addDays(int ndays) const
PimPrint::Calendar::CalPrintDay::endTime
QTime endTime() const
Returns the current print ending time.
QRect::setLeft
void setLeft(int x)
PimPrint::Calendar::CalPrintDay::setEndDate
void setEndDate(const QDate &date)
Sets the printout ending date.
Definition: calprintday.cpp:105
PimPrint::Calendar::CalPrintBase::DaySingleTimeTable
Definition: calprintbase.h:126
QFontMetrics::lineSpacing
int lineSpacing() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:32:09 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

PIMPrint Library

Skip menu "PIMPrint Library"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer
  • pimprint

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal