summaryrefslogtreecommitdiffabout
path: root/korganizer/calprintbase.h
Side-by-side diff
Diffstat (limited to 'korganizer/calprintbase.h') (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/calprintbase.h379
1 files changed, 379 insertions, 0 deletions
diff --git a/korganizer/calprintbase.h b/korganizer/calprintbase.h
new file mode 100644
index 0000000..7409143
--- a/dev/null
+++ b/korganizer/calprintbase.h
@@ -0,0 +1,379 @@
+/*
+ This file is part of KOrganizer.
+
+ Copyright (c) 1998 Preston Brown
+ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 CALPRINTBASE_H
+#define CALPRINTBASE_H
+// #define KORG_NOPRINTER
+
+#ifndef KORG_NOPRINTER
+
+#include <qwidget.h>
+#include <qdatetime.h>
+#include <kprinter.h>
+#include <kconfig.h>
+#include <libkcal/event.h>
+
+class PrintCellItem;
+
+namespace KCal {
+class Calendar;
+class Todo;
+}
+
+using namespace KCal;
+
+/**
+ Base class for KOrganizer printing classes. Each sub class represents one
+ calendar print format.
+*/
+class CalPrintBase : public QObject
+{
+ Q_OBJECT
+ public:
+ /**
+ Constructor
+
+ \param pr KPrinter object used to print.
+ \param cal Calendar to be printed.
+ \param cfg KConfig object for reading/writing printing configuration
+ */
+ CalPrintBase( KPrinter *pr, Calendar *cal, KConfig *cfg );
+ virtual ~CalPrintBase();
+
+ /**
+ Returns short description of print format.
+ */
+ virtual QString description() = 0;
+ /**
+ Returns long description of print format.
+ */
+ virtual QString longDescription() = 0;
+
+ /**
+ Returns widget for configuring the print format.
+ */
+ virtual QWidget *configWidget( 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();
+
+ /**
+ Orientation of printout. Default is Portrait. If your plugin wants
+ to use some other orientation as default (e.g. depending on some
+ config settings), implement this function in your subclass and
+ return the desired orientation.
+ */
+ virtual KPrinter::Orientation orientation() { return KPrinter::Portrait; }
+
+ /**
+ 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();
+
+
+ public slots:
+ /**
+ Read settings from configuration widget and apply them to current object.
+ */
+ virtual void readSettingsWidget() {}
+ /**
+ Set configuration widget to reflect settings of current object.
+ */
+ virtual void setSettingsWidget() {}
+
+ /**
+ Set date range which should be printed.
+ */
+ virtual void setDateRange( const QDate &from, const QDate &to )
+ {
+ mFromDate = from;
+ mToDate = to;
+ }
+
+ protected:
+ int weekdayColumn( int weekday );
+
+ QDate mFromDate;
+ QDate mToDate;
+ bool mUseColors;
+
+ public:
+ /**
+ Internal class representing the start of a todo.
+ */
+ class TodoParentStart;
+
+ protected:
+ /**
+ 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 x x-coordinate of the upper left coordinate of the title bar
+ \param y y-coordinate of the upper left coordinate of the title bar
+ \param width width of the title bar
+ \param height height of the title bar
+ */
+ void drawHeader( QPainter &p, QString title,
+ const QDate &month1, const QDate &month2,
+ int x, int y, int width, int height );
+ /**
+ 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 x x-coordinate of the upper left coordinate of the small calendar
+ \param y y-coordinate of the upper left coordinate of the small calendar
+ \param width width of the small calendar
+ \param height height of the small calendar
+ */
+ void drawSmallMonth( QPainter &p, const QDate &qd,
+ int x, int y, int width, int height );
+
+ /**
+ 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
+ */
+ void drawDaysOfWeek( QPainter &p,
+ const QDate &fromDate, const QDate &toDate,
+ int x, int y, int width, int height );
+ /**
+ 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
+ */
+ void drawDaysOfWeekBox( QPainter &p, const QDate &qd,
+ int x, int y, int width, int height );
+ /**
+ 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
+ */
+ void drawTimeLine( QPainter &p,
+ const QTime &fromTime, const QTime &toTime,
+ int x, int y, int width, int height );
+ /**
+ 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 ", ".
+ */
+ void drawAllDayBox( QPainter &p, Event::List &eventList,
+ const QDate &qd, bool expandable,
+ int x, int y, int width, int &height );
+ /**
+ 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
+ */
+ void drawAgendaDayBox( QPainter &p, Event::List &eventList,
+ const QDate &qd, bool expandable,
+ QTime &fromTime, QTime &toTime,
+ int x, int y, int width, int height);
+
+ void drawAgendaItem( PrintCellItem *item, QPainter &p, const QDate &,
+ const QDateTime &startPrintDate,
+ const QDateTime &endPrintDate,
+ float minlen, int x, int y, int width );
+ /**
+ 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 fullDate Whether the title bar of the box should contain the full
+ date string or just a short.
+ */
+ void drawDayBox( QPainter &p, const QDate &qd,
+ int x, int y, int width, int height,
+ bool fullDate = false );
+ /**
+ 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.
+ */
+ void drawWeek( QPainter &p, const QDate &qd,
+ int x, int y, int width, int height );
+ /**
+ 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
+ */
+ void drawTimeTable( QPainter &p, const QDate &fromDate, const QDate &toDate,
+ QTime &fromTime, QTime &toTime,
+ int x, int y, int width, int height );
+
+ /**
+ 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 weeknumbers Whether the week numbers are printed left of each row of the matrix
+ */
+ void drawMonth( QPainter &p, const QDate &qd, bool weeknumbers,
+ int x, int y, int width, int height );
+
+ /**
+ Draws single todo item and its (intented) subitems, 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 todo (count will be incremented for each drawn item)
+ \param item The item to be printed. It's subitems are recursively
+ drawn, so drawTodo should only be called on the
+ items of the highest level.
+ \param p QPainter of the printout
+ \param connectSubTodos Whether subtodos shall be connected with their parent by a line (tree-like).
+ \param desc Whether to print the whole description of the item (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 item 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 level Level of the current item in the todo hierarchy (0 means highest
+ level of printed items, 1 are their subtodos, etc.)
+ \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 todo list
+ \param height Space left on the first page of the todo list
+ \param pageHeight Total height allowed for the todo list on a page. The first page uses height,
+ but at each line break the current position is reset to 0 and the
+ height is set to pageHeight.
+ \param r Internal (used when printing sub items to give information about its parent)
+ */
+ void drawTodo( bool completed, int &count, Todo * item, QPainter &p, bool connectSubTodos,
+ bool desc, int pospriority, int possummary, int posDueDt,
+ int level, int x, int &y, int width, int &height,
+ int pageHeight, TodoParentStart *r = 0 );
+
+ void drawSplitWeek( QPainter &p, const QDate &fd, const QDate &td );
+ void drawSplitHeaderRight( QPainter &p, const QDate &fd, const QDate &td,
+ const QDate &cd, int width, int height );
+ void drawSplitDay( QPainter &p, const QDate &qd, int width, int height,
+ int offsetLeft );
+ void drawSplitTimes( QPainter &p, int width, int timeWidth, int height );
+
+ /**
+ 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
+ */
+ int weekDayColumn( int weekday );
+
+ KPrinter *mPrinter;
+ Calendar *mCalendar;
+ KConfig *mConfig;
+ //QWidget *mConfigWidget;
+
+ protected:
+ // TODO_RK: move these to the appropriate subclasses or set them globally.
+ static int mSubHeaderHeight;
+ static int mHeaderHeight;
+ static int mMargin;
+};
+
+#endif
+
+#endif