summaryrefslogtreecommitdiffstats
path: root/korganizer/printing/calprintpluginbase.h
diff options
context:
space:
mode:
Diffstat (limited to 'korganizer/printing/calprintpluginbase.h')
-rw-r--r--korganizer/printing/calprintpluginbase.h514
1 files changed, 514 insertions, 0 deletions
diff --git a/korganizer/printing/calprintpluginbase.h b/korganizer/printing/calprintpluginbase.h
new file mode 100644
index 00000000..9312d004
--- /dev/null
+++ b/korganizer/printing/calprintpluginbase.h
@@ -0,0 +1,514 @@
+/*
+ This file is part of KOrganizer.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2003 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+#ifndef CALPRINTPLUGINBASE_H
+#define CALPRINTPLUGINBASE_H
+// #define KORG_NOPRINTER
+
+#ifndef KORG_NOPRINTER
+
+#include <qdatetime.h>
+#include <kprinter.h>
+#include <kdepimmacros.h>
+#include <libkcal/calendar.h>
+#include <libkcal/event.h>
+#include <libkcal/todo.h>
+#include "korganizer/printplugin.h"
+#include "korganizer/corehelper.h"
+
+
+class PrintCellItem;
+
+class QWidget;
+
+using namespace KCal;
+
+
+#define PORTRAIT_HEADER_HEIGHT 72 // header height, for portrait orientation
+#define LANDSCAPE_HEADER_HEIGHT 54 // header height, for landscape orientation
+#define SUBHEADER_HEIGHT 20 // subheader height, for all orientations
+#define MARGIN_SIZE 36 // margins, for all orientations
+#define PADDING_SIZE 7 // padding between the various top-level boxes
+#define BOX_BORDER_WIDTH 2 // width of the border of all top-level boxes
+#define EVENT_BORDER_WIDTH 0 // with of the border of all incidence boxes
+
+#define TIMELINE_WIDTH 50 // width of timeline (day and timetable)
+
+/**
+ Base class for KOrganizer printing classes. Each sub class represents one
+ calendar print format.
+*/
+class KDE_EXPORT CalPrintPluginBase : public KOrg::PrintPlugin
+{
+ public:
+ enum DisplayFlags {
+ Text=0x0001,
+ TimeBoxes=0x0002
+ };
+
+ public:
+ /**
+ Constructor
+ */
+ CalPrintPluginBase();
+ virtual ~CalPrintPluginBase();
+
+ /**
+ Returns widget for configuring the print format.
+ */
+ virtual QWidget *createConfigWidget( QWidget * );
+
+ /**
+ Actually do the printing.
+
+ \param p QPainter the print result is painted to
+ \param width Width of printable area
+ \param height Height of printable area
+ */
+ virtual void print( QPainter &p, int width, int height ) = 0;
+ /**
+ Start printing.
+ */
+ virtual void doPrint( KPrinter *printer );
+
+ /**
+ Load print format configuration from config file.
+ */
+ virtual void loadConfig() = 0;
+ /**
+ Write print format configuration to config file.
+ */
+ virtual void saveConfig() = 0;
+
+ /**
+ Load complete config. This also calls loadConfig() of the derived class.
+ */
+ void doLoadConfig();
+ /**
+ Save complete config. This also calls saveConfig() of the derived class.
+ */
+ void doSaveConfig();
+
+ /** HELPER FUNCTIONS */
+ public:
+ void setKOrgCoreHelper( KOrg::CoreHelper*helper );
+ bool useColors() const;
+ void setUseColors( bool useColors );
+
+ /** Helper functions to hide the KOrg::CoreHelper */
+ QColor categoryBgColor( Incidence *incidence );
+ QColor textColor( const QColor &color );
+ QTime dayStart();
+ bool isWorkingDay( const QDate &dt );
+ QString holidayString( const QDate &dt );
+ Event *holiday( const QDate &dt );
+
+ /**
+ Determines the column of the given weekday ( 1=Monday, 7=Sunday ), taking the
+ start of the week setting into account as given in kcontrol.
+ \param weekday Index of the weekday
+ */
+ static int weekdayColumn( int weekday );
+ void setCategoryColors( QPainter &p, Incidence *incidence );
+
+ KPrinter::Orientation orientation() const;
+
+ /** Returns the height of the page header. If the height was explicitly
+ set using setHeaderHeight, that value is returned, otherwise a
+ default value based on the printer orientation.
+ \return height of the page header of the printout
+ */
+ int headerHeight() const;
+ void setHeaderHeight( const int height );
+
+ int subHeaderHeight() const;
+ void setSubHeaderHeight( const int height );
+
+ int margin() const;
+ void setMargin( const int margin );
+
+ int padding() const;
+ void setPadding( const int margin );
+
+ int borderWidth() const;
+ void setBorderWidth( const int border );
+
+ const KCalendarSystem *calendarSystem() const;
+ void setCalendarSystem( const KCalendarSystem *calsys );
+
+
+ /*****************************************************************
+ ** PRINTING HELPER FUNCTIONS **
+ *****************************************************************/
+ public:
+ /**
+ Draw a box with given width at the given coordinates.
+ \param p The printer to be used
+ \param linewidth The border width of the box
+ \param rect The rectangle of the box
+ */
+ static void drawBox( QPainter &p, int linewidth, const QRect &rect );
+ /**
+ Draw a shaded box with given width at the given coordinates.
+ \param p The printer to be used
+ \param linewidth The border width of the box
+ \param brush The brush to fill the box
+ \param rect The rectangle of the box
+ */
+ static void drawShadedBox( QPainter &p, int linewidth, const QBrush &brush, const QRect &rect );
+
+ /**
+ Print the given string (event summary) in the given rectangle. Margins
+ and justification (centered or not) are automatically adjusted.
+ \param p QPainter of the printout
+ \param box Coordinates of the surrounding event box
+ \param str The text to be printed in the box
+ */
+ void printEventString( QPainter &p, const QRect &box, const QString &str, int flags = -1 );
+
+ /**
+ Print the box for the given event with the given string.
+ \param p QPainer of the printout
+ \param box Coordinates of the event's box
+ \param incidence The incidence (if available), from which the category
+ color will be deduced, if applicable.
+ \param str The string to print inside the box
+ */
+ void showEventBox( QPainter &p, const QRect &box, Incidence *incidence, const QString &str, int flags = -1 );
+
+ /**
+ Draw a subheader box with a shaded background and the given string
+ \param p QPainter of the printout
+ \param str Text to be printed inside the box
+ \param box Coordinates of the box
+ */
+ void drawSubHeaderBox(QPainter &p, const QString &str, const QRect &box );
+
+ /**
+ Draw an event box with vertical text.
+ \param p QPainter of the printout
+ \param box Coordinates of the box
+ \param str ext to be printed inside the box
+ */
+ void drawVerticalBox( QPainter &p, const QRect &box, const QString &str );
+
+ /**
+ Draw a component box with a heading (printed in bold).
+ \param p QPainter of the printout
+ \param box Coordinates of the box
+ \param caption Caption string to be printed inside the box
+ \param contents Normal text contents of the box. If contents.isNull(),
+ then no text will be printed, only the caption.
+ \param sameLine Whether the contents should start on the same line as
+ the caption (the space below the caption text will be
+ used as indentation in the subsequent lines) or on the
+ next line (no indentation of the contents)
+ \param expand Whether to expand the box vertically to fit the
+ whole text in it.
+ \return The bottom of the printed box. If expand==true, the bottom of
+ the drawn box is returned, if expand==false, the vertical
+ end of the printed contents inside the box is returned.
+ If you want to print some custom graphics or text below
+ the contents, use the return value as the top-value of your
+ custom contents in that case.
+ */
+ int drawBoxWithCaption( QPainter &p, const QRect &box, const QString &caption,
+ const QString &contents,
+ bool sameLine, bool expand, const QFont &captionFont, const QFont &textFont );
+
+ /**
+ Draw the gray header bar of the printout to the QPainter.
+ It prints the given text and optionally one or two small
+ month views, as specified by the two QDate. The printed
+ text can also contain a line feed.
+ If month2 is invalid, only the month that contains month1
+ is printed.
+ E.g. the filofax week view draws just the current month,
+ while the month view draws the previous and the next month.
+ \param p QPainter of the printout
+ \param title The string printed as the title of the page
+ (e.g. the date, date range or todo list title)
+ \param month1 Date specifying the month for the left one of
+ the small month views in the title bar. If left
+ empty, only month2 will be printed (or none,
+ it that is invalid as well).
+ \param month2 Date specifying the month for the right one of
+ the small month views in the title bar. If left
+ empty, only month1 will be printed (or none,
+ it that is invalid as well).
+ \param box coordinates of the title bar
+ \param expand Whether to expand the box vertically to fit the
+ whole title in it.
+ \return The bottom of the printed box. If expand==false, this
+ is box.bottom, otherwise it is larger than box.bottom
+ and matches the y-coordinate of the surrounding rectangle.
+ */
+ int drawHeader( QPainter &p, QString title,
+ const QDate &month1, const QDate &month2,
+ const QRect &box, bool expand = false );
+ /**
+ Draw a small calendar with the days of a month into the given area.
+ Used for example in the title bar of the sheet.
+ \param p QPainter of the printout
+ \param qd Arbitrary Date within the month to be printed.
+ \param box coordinates of the small calendar
+ */
+ void drawSmallMonth( QPainter &p, const QDate &qd, const QRect &box );
+
+ /**
+ Draw a horizontal bar with the weekday names of the given date range
+ in the given area of the painter.
+ This is used for the weekday-bar on top of the timetable view and the month view.
+ \param p QPainter of the printout
+ \param fromDate First date of the printed dates
+ \param toDate Last date of the printed dates
+ \param box coordinates of the box for the days of the week
+ */
+ void drawDaysOfWeek( QPainter &p,
+ const QDate &fromDate, const QDate &toDate,
+ const QRect &box );
+ /**
+ Draw a single weekday name in a box inside the given area of the painter.
+ This is called in a loop by drawDaysOfWeek.
+ \param p QPainter of the printout
+ \param qd Date of the printed day
+ \param box coordinates of the weekbox
+ */
+ void drawDaysOfWeekBox( QPainter &p, const QDate &qd, const QRect &box );
+ /**
+ Draw a (vertical) time scale from time fromTime to toTime inside the given area of the painter.
+ Every hour will have a one-pixel line over the whole width, every
+ half-hour the line will only span the left half of the width.
+ This is used in the day and timetable print styles
+ \param p QPainter of the printout
+ \param fromTime Start time of the time range to display
+ \param toTime End time of the time range to display
+ \param box coordinates of the timeline
+ */
+ void drawTimeLine( QPainter &p,
+ const QTime &fromTime, const QTime &toTime,
+ const QRect &box );
+
+ /**
+ Draw the all-day box for the agenda print view (the box on top which
+ doesn't have a time on the time scale associated). If expandable is set,
+ height is the cell height of a single cell, and the returned height will
+ be the total height used for the all-day events. If !expandable, only one
+ cell will be used, and multiple events are concatenated using ", ".
+ \param p QPainter of the printout
+ \param eventList The list of all-day events that are supposed to be printed
+ inside this box
+ \param qd The date of the currently printed day
+ \param expandable If true, height is the height of one single cell, the printout
+ will use as many cells as events in the list and return the total height
+ needed for all of them. If false, height specifies the total height
+ allowed for all events, and the events are displayed in one cell,
+ with their summaries concatenated by ", ".
+ \param box coordinates of the all day box.
+ \return The height used for the all-day box.
+ */
+ int drawAllDayBox( QPainter &p, Event::List &eventList,
+ const QDate &qd, bool expandable,
+ const QRect &box );
+ /**
+ Draw the agenda box for the day print style (the box showing all events of that day).
+ Also draws a grid with half-hour spacing of the grid lines.
+ \param p QPainter of the printout
+ \param eventList The list of the events that are supposed to be printed
+ inside this box
+ \param qd The date of the currently printed day
+ \param expandable If true, the start and end times are adjusted to include
+ the whole range of all events of that day, not just of the given time range.
+ The height of the box will not be affected by this (but the height
+ of one hour will be scaled down so that the whole range fits into
+ the box. fromTime and toTime receive the actual time range printed
+ by this function).
+ \param fromTime Start of the time range to be printed. Might be adjusted
+ to include all events if expandable==true
+ \param toTime End of the time range to be printed. Might be adjusted
+ to include all events if expandable==true
+ \param box coordinates of the agenda day box.
+ */
+ void drawAgendaDayBox( QPainter &p, Event::List &eventList,
+ const QDate &qd, bool expandable,
+ QTime &fromTime, QTime &toTime,
+ const QRect &box );
+
+ void drawAgendaItem( PrintCellItem *item, QPainter &p,
+ const QDateTime &startPrintDate,
+ const QDateTime &endPrintDate,
+ float minlen, const QRect &box );
+
+ /**
+ Draw the box containing a list of all events of the given day (with their times,
+ of course). Used in the Filofax and the month print style.
+ \param p QPainter of the printout
+ \param qd The date of the currently printed day. All events of the calendar
+ that appear on that day will be printed.
+ \param box coordinates of the day box.
+ \param fullDate Whether the title bar of the box should contain the full
+ date string or just a short.
+ \param printRecurDaily Whether daily recurring incidences should be printed.
+ \param printRecurWeekly Whether weekly recurring incidences should be printed.
+ */
+ void drawDayBox( QPainter &p, const QDate &qd,
+ const QRect &box,
+ bool fullDate = false, bool printRecurDaily = true,
+ bool printRecurWeekly = true );
+ /**
+ Draw the week (filofax) table of the week containing the date qd. The first
+ three days of the week will be shown in the first column (using drawDayBox),
+ the remaining four in the second column, where the last two days of the week
+ (typically Saturday and Sunday) only get half the height of the other day boxes.
+ \param p QPainter of the printout
+ \param qd Arbitrary date within the week to be printed.
+ \param box coordinates of the week box.
+ */
+ void drawWeek( QPainter &p, const QDate &qd,
+ const QRect &box );
+ /**
+ Draw the timetable view of the given time range from fromDate to toDate.
+ On the left side the time scale is printed (using drawTimeLine), then each
+ day gets one column (printed using drawAgendaDayBox),
+ and the events are displayed as boxes (like in korganizer's day/week view).
+ The first cell of each column contains the all-day events (using
+ drawAllDayBox with expandable=false).
+ The given time range cannot be expanded to include all events.
+ \param p QPainter of the printout
+ \param fromDate First day to be included in the page
+ \param toDate Last day to be included in the page
+ \param fromTime Start time of the displayed time range
+ \param toTime End time of the displayed time range
+ \param box coordinates of the time table.
+ */
+ void drawTimeTable( QPainter &p, const QDate &fromDate, const QDate &toDate,
+ QTime &fromTime, QTime &toTime,
+ const QRect &box );
+
+ /**
+ Draw the month table of the month containing the date qd. Each day gets one
+ box (using drawDayBox) that contains a list of all events on that day. They are arranged
+ in a matrix, with the first column being the first day of the
+ week (so it might display some days of the previous and the next month).
+ Above the matrix there is a bar showing the weekdays (drawn using drawDaysOfWeek).
+ \param p QPainter of the printout
+ \param qd Arbitrary date within the month to be printed.
+ \param recurDaily Whether daily recurring incidences should be printed.
+ \param recurWeekly Whether weekly recurring incidences should be printed.
+ \param weeknumbers Whether the week numbers are printed left of each row of the matrix
+ \param box coordinates of the month.
+ */
+ void drawMonthTable( QPainter &p, const QDate &qd, bool weeknumbers,
+ bool recurDaily, bool recurWeekly,
+ const QRect &box );
+ /**
+ Draw a vertical representation of the month containing the date dt. Each
+ day gets one line.
+ \param p QPainter of the printout
+ \param dt Arbitrary date within the month to be printed
+ \param box coordinates of the box reserved for the month
+ \param maxdays Days to print. If a value of -1 is given, the number of days
+ is deduced from the month. If maxdays is larger than the
+ number of days in the month, the remaining boxes are
+ shaded to indicate they are not days of the month.
+ \param subDailyFlags Bitfield consisting of DisplayFlags flags to determine
+ how events that do not cross midnight should be printed.
+ \param holidaysFlags Bitfield consisting of DisplayFlags flags to determine
+ how holidays should be printed.
+ */
+ void drawMonth( QPainter &p, const QDate &dt, const QRect &box, int maxdays = -1, int subDailyFlags = TimeBoxes, int holidaysFlags = Text );
+
+ /**
+ Internal class representing the start of a todo.
+ */
+ class TodoParentStart;
+
+ /**
+ Draws single to-do and its (intented) sub-to-dos, optionally connects them by a tree-like line, and optionally shows due date, summary, description and priority.
+ \param count The number of the currently printed to-do (count will be incremented for each to-do drawn)
+ \param todo The to-do to be printed. It's sub-to-dos are recursively drawn, so drawTodo should only be called on the to-dos of the highest level.
+ \param p QPainter of the printout
+ \param sortField Specifies on which attribute of the todo you want to sort.
+ \param sortDir Specifies if you want to sort ascending or descending.
+ \param connectSubTodos Whether sub-to-dos shall be connected with their parent by a line (tree-like).
+ \param strikeoutCompleted Whether completed to-dos should be printed with strike-out summaries.
+ \param desc Whether to print the whole description of the to-do (the summary is always printed).
+ \param posPriority x-coordinate where the priority is supposed to be printed. If <0, no priority will be printed.
+ \param posSummary x-coordinate where the summary of the to-do is supposed to be printed.
+ \param posDueDt x-coordinate where the due date is supposed to the be printed. If <0, no due date will be printed.
+ \param posPercentComplete x-coordinate where the percentage complete is supposed to be printed. If <0, percentage complete will not be printed.
+ \param level Level of the current to-do in the to-do hierarchy (0 means highest level of printed to-dos, 1 are their sub-to-dos, etc.)
+ \param x x-coordinate of the upper left coordinate of the first to-do.
+ \param y y-coordinate of the upper left coordinate of the first to-do.
+ \param width width of the whole to-do list.
+ \param pageHeight Total height allowed for the to-do list on a page. If an to-do would be below that line, a new page is started.
+ \param todoList Contains a list of sub-todos for the specified @p todo .
+ \param r Internal (used when printing sub-to-dos to give information about its parent)
+ */
+ void drawTodo( int &count, Todo *todo, QPainter &p,
+ TodoSortField sortField, SortDirection sortDir,
+ bool connectSubTodos, bool strikeoutCompleted, bool desc,
+ int posPriority, int posSummary, int posDueDt,
+ int posPercentComplete, int level, int x, int &y,
+ int width, int pageHeight,
+ const Todo::List &todoList, TodoParentStart *r = 0 );
+
+ /**
+ Draws single journal item.
+ \param journal The item to be printed.
+ \param p QPainter of the printout
+ \param x x-coordinate of the upper left coordinate of the first item
+ \param y y-coordinate of the upper left coordinate of the first item
+ \param width width of the whole list
+ \param pageHeight Total height allowed for the list on a page. If an item
+ would be below that line, a new page is started.
+ */
+ void drawJournal( Journal * journal, QPainter &p, int x, int &y,
+ int width, int pageHeight );
+ void drawJournalField( QPainter &p, QString field, QString text,
+ int x, int &y, int width, int pageHeight );
+
+ void drawSplitHeaderRight( QPainter &p, const QDate &fd, const QDate &td,
+ const QDate &cd, int width, int height );
+
+
+ protected:
+ void drawIncidence( QPainter &p, const QRect &dayBox, const QString &time,
+ const QString &summary, int &textY );
+
+ protected:
+ bool mUseColors;
+ int mHeaderHeight;
+ int mSubHeaderHeight;
+ int mMargin;
+ int mPadding;
+ int mBorder;
+ const KCalendarSystem *mCalSys;
+
+ public:
+};
+
+#endif
+
+#endif