diff options
Diffstat (limited to 'korganizer/kodaymatrix.h')
-rw-r--r-- | korganizer/kodaymatrix.h | 318 |
1 files changed, 318 insertions, 0 deletions
diff --git a/korganizer/kodaymatrix.h b/korganizer/kodaymatrix.h new file mode 100644 index 000000000..a76e61874 --- /dev/null +++ b/korganizer/kodaymatrix.h @@ -0,0 +1,318 @@ +/* + This file is part of KOrganizer. + + Copyright (c) 2001 Eitzenberger Thomas <thomas.eitzenberger@siemens.at> + Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org> + Copyright (C) 2003-2004 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 KODAYMATRIX_H +#define KODAYMATRIX_H + +#include <libkcal/incidencebase.h> +#include <libkcal/calendar.h> + +#include <qframe.h> +#include <qcolor.h> +#include <qtooltip.h> +#include <qmap.h> + +class QDragEnterEvent; +class QDragMoveEvent; +class QDragLeaveEvent; +class QDropEvent; + +class KODayMatrix; + +namespace KCal { +class Incidence; +class Calendar; +} +using namespace KCal; + + +/** + * small helper class to dynamically show tooltips inside the day matrix. + * This class asks the day matrix object for a appropriate label which + * is in our special case the name of the holiday or null if this day is no holiday. + */ +class DynamicTip : public QToolTip +{ + public: + /** + * Constructor that expects a KODayMatrix object as parent. + * + * @param parent the parent KODayMatrix control. + */ + DynamicTip( QWidget *parent ); + + protected: + /** + * Qt's callback to ask the object to provide an approrpiate text for the + * tooltip to be shown. + * + * @param pos coordinates of the mouse. + */ + void maybeTip( const QPoint &pos ); + + private: + /** the parent control this tooltip is designed for. */ + KODayMatrix *mMatrix; +}; + +/** + * Replacement for kdpdatebuton.cpp that used 42 widgets for the day matrix to be displayed. + * Cornelius thought this was a waste of memory and a lot of overhead. + * In addition the selection was not very intuitive so I decided to rewrite it using a QFrame + * that draws the labels and allows for dragging selection while maintaining nearly full + * compatibility in behavior with its predecessor. + * + * The following functionality has been changed: + * + * o when shifting events in the agenda view from one day to another the day matrix is updated now + * o dragging an event to the matrix will MOVE not COPY the event to the new date. + * o no support for Ctrl+click to create groups of dates + * (This has not really been supported in the predecessor. It was not very intuitive nor was it + * user friendly.) + * This feature has been replaced with dragging a selection on the matrix. The matrix will + * automatically choose the appropriate selection (e.g. you are not any longer able to select + * two distinct groups of date selections as in the old class) + * o now that you can select more then a week it can happen that not all selected days are + * displayed in the matrix. However this is preferred to the alternative which would mean to + * adjust the selection and leave some days undisplayed while scrolling through the months + * + * @short day matrix widget of the KDateNavigator + * + * @author Eitzenberger Thomas + */ +class KODayMatrix: public QFrame, public KCal::Calendar::Observer +{ + Q_OBJECT + public: + /** constructor to create a day matrix widget. + * + * @param parent widget that is the parent of the day matrix. + * Normally this should be a KDateNavigator + * @param name name of the widget + */ + KODayMatrix( QWidget *parent, const char *name ); + + /** destructor that deallocates all dynamically allocated private members. + */ + ~KODayMatrix(); + + /** + Associate a calendar with this day matrix. If there is a calendar, the day + matrix will accept drops and days with events will be highlighted. + */ + void setCalendar( Calendar * ); + + /** updates the day matrix to start with the given date. Does all the necessary + * checks for holidays or events on a day and stores them for display later on. + * Does NOT update the view visually. Call repaint() for this. + * + * @param actdate recalculates the day matrix to show NUMDAYS starting from this + * date. + */ + void updateView( const QDate &actdate ); + + /** + Update event states of dates. Depending of the preferences days with + events are highlighted in some way. + */ + void updateEvents(); + + /** returns the QDate object associated with day indexed by the + * supplied offset. + */ + const QDate& getDate( int offset ); + + /** returns the official name of this holy day or 0 if there is no label + * for this day. + */ + QString getHolidayLabel( int offset ); + + /** adds all actual selected days from mSelStart to mSelEnd to the supplied + * DateList. + */ + void addSelectedDaysTo( DateList & ); + + /** sets the actual to be displayed selection in the day matrix starting from + * start and ending with end. Theview must be manually updated by calling + * repaint. (?) + */ + void setSelectedDaysFrom( const QDate &start, const QDate &end ); + + /** + Clear all selections. + */ + void clearSelection(); + + /** Is today visible in the view? Keep this in sync with + * the values today (below) can take. + */ + bool isTodayVisible() const { return mToday >= 0; } + + /** If today is visible, then we can find out if today is + * near the beginning or the end of the month. + * This is dependent on today remaining the index + * in the array of visible dates and going from + * top left (0) to bottom right (41). + */ + bool isBeginningOfMonth() const { return mToday <= 8; } + bool isEndOfMonth() const { return mToday >= 27; } + + /* reimplmented from KCal::Calendar::Observer */ + void calendarIncidenceAdded( Incidence *incidence ); + void calendarIncidenceChanged( Incidence *incidence ); + void calendarIncidenceRemoved( Incidence *incidence ); + + public slots: + /** Recalculates all the flags of the days in the matrix like holidays or events + * on a day (Actually calls above method with the actual startdate). + */ + void updateView(); + + /** + * Calculate which square in the matrix should be + * hilighted to indicate it's today. + */ + void recalculateToday(); + + /** + * Handle resource changes. + */ + void resourcesChanged(); + + signals: + /** emitted if the user selects a block of days with the mouse by dragging a rectangle + * inside the matrix + * + * @param daylist list of days that have been selected by the user + */ + void selected( const KCal::DateList &daylist ); + + /** emitted if the user has dropped an incidence (event or todo) inside the matrix + * + * @param incidence the dropped calendar incidence + * @param dt QDate that has been selected + */ + void incidenceDropped( Incidence *incidence, const QDate &dt ); + /** emitted if the user has dropped an event inside the matrix and chose to move it instead of copy + * + * @param oldincidence the new calendar incidence + * @param dt QDate that has been selected + */ + void incidenceDroppedMove( Incidence *oldincidence, const QDate &dt ); + + protected: + void paintEvent( QPaintEvent *ev ); + + void mousePressEvent( QMouseEvent *e ); + + void mouseReleaseEvent( QMouseEvent *e ); + + void mouseMoveEvent( QMouseEvent *e ); + + void dragEnterEvent( QDragEnterEvent * ); + + void dragMoveEvent( QDragMoveEvent * ); + + void dragLeaveEvent( QDragLeaveEvent * ); + + void dropEvent( QDropEvent * ); + + void resizeEvent( QResizeEvent * ); + + private: + /** returns the index of the day located at the matrix's widget (x,y) position. + * + * @param x horizontal coordinate + * @param y vertical coordinate + */ + int getDayIndexFrom( int x, int y ); + + /** calculates a "shaded" color from the supplied color object. + * (Copied from Cornelius's kdpdatebutton.cpp) + * + * @param color source based on which a shaded color should be calculated. + */ + QColor getShadedColor( const QColor &color ); + + /** number of days to be displayed. For now there is no support for any other number then 42. + so change it at your own risk :o) */ + static const int NUMDAYS; + + /** calendar instance to be queried for holidays, events, ... */ + Calendar *mCalendar; + + /** starting date of the matrix */ + QDate mStartDate; + + /** array of day labels to optimeize drawing performance. */ + QString *mDayLabels; + + /** array of days displayed to reduce memory consumption by + subsequently calling QDate::addDays(). */ + QDate *mDays; + + /** array of storing the number of events on a given day. + * used for drawing a bold font if there is at least one event on that day. + */ + int *mEvents; + + /** stores holiday names of the days shown in the matrix. */ + QMap<int,QString> mHolidays; + + /** index of today or -1 if today is not visible in the matrix. */ + int mToday; + + /** index of day where dragged selection was initiated. + used to detect "negative" timely selections */ + int mSelInit; + + /** if mSelStart has this value it indicates that there is no + actual selection in the matrix. */ + static const int NOSELECTION; + + /** index of first selected day. */ + int mSelStart; + + /** index of last selected day. */ + int mSelEnd; + + /** dynamic tooltip to handle mouse dependent tips for each day in the matrix. */ + DynamicTip* mToolTip; + + /** default width of the frame drawn around today if it is visible in the matrix. */ + int mTodayMarginWidth; + + /** stores actual size of each day in the widget so that I don't need to ask this data + * on every repaint. + */ + QRect mDaySize; + + /** + * Indicate pending calendar changes. + */ + bool mPendingChanges; +}; + +#endif |