summaryrefslogtreecommitdiffabout
path: root/korganizer/kdatenavigator.h
blob: 31776876c2a6d8c89c13e9032c81d5f724194529 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/*
    This file is part of KOrganizer.
    Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>

    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 KDATENAVIGATOR_H
#define KDATENAVIGATOR_H

#include <qframe.h>
#include <qdatetime.h>
#include <qlabel.h>

#include <libkcal/calendar.h>

#include "kodaymatrix.h"

class QPushButton;
class QTimer;

class KCalendarSystem;

class NavigatorBar;

class KDateNavigator: public QFrame
{
    Q_OBJECT
  public:
    KDateNavigator( QWidget *parent = 0,const char *name = 0 );
    ~KDateNavigator();

    /** The DateNavigator automatically checks for
    * the passage of midnight. If rollover type is 
    * set to None, no signals are emitted and no
    * processing is done. With rollover set to 
    * FollowDay, the day highlighter changes at
    * midnight and dayPassed() is emitted.
    * With FollowMonth, it has the same effect
    * as FollowDay but also adjusts the month that is 
    * visible and emits monthPassed() when the month changes.
    */
    enum RolloverType { None, FollowDay, FollowMonth } ;
    void enableRollover( RolloverType );

    void setShowWeekNums( bool enabled );
    void setCalendar( Calendar * );
    void setBaseDate( const QDate & , bool doRepaint = true );
    KCal::DateList selectedDates() const { return mSelectedDates; }
    NavigatorBar *navigatorBar() const { return mNavigatorBar; }
    void setMonthSignalOffset ( int off ) { mMonthSignalOffset = off;}
    QSize yourSizeHint() { return mySizeHint; }
    QFont yourFontHint( QSize , bool * b);
    bool fontChanged() {return mFontChanged; }
    void unsetFontChanged() { mFontChanged = false; }
    KODayMatrix *dayMatrix() { return daymatrix  ;} 
    QSize sizeHint() const;
    void changeFont ( QFont fo ); 
  public slots:
    void selectDates( const KCal::DateList & );
    void updateView();
    void updateConfig();
    void updateDayMatrix();

  signals:
    void datesSelected( const KCal::DateList & );
    void eventDropped( Event * );
    void weekClicked( const QDate &);

    void goPrevious();
    void goNext();

    void goNextMonth();
    void goPrevMonth();
    void goNextYear();
    void goPrevYear();
    void monthSelected( int );

    // Signals emitted at midnight carrying the new date.
    void dayPassed( QDate );
    void monthPassed( QDate );

  protected slots:

     /**
     * Called regularly to see if we need to update the view
     * wrt. the today box and the month box. Only important
     * if you leave KOrganizer idle for long periods of time.
     *
     * Until we have a reliable way of setting QTimers to go
     * off at a particular wall-clock time, we need this,
     * which calls passedMidnight() at the right moments.
     */
     void possiblyPastMidnight();

     /** handles updating the view when midnight has come by due to idle time.
     *
     */
     void passedMidnight();
     void slotMonthSelected( int m );
  protected:
    void updateDates();

    void wheelEvent (QWheelEvent *);

    bool eventFilter (QObject *,QEvent *);

  private:
    QSize mySizeHint;
    bool mFontChanged;
    int mMonthSignalOffset;
    NavigatorBar *mNavigatorBar;

    QFrame *headingSep;
    QFrame *weeknumSep;
    QLabel *headings[7];
    QLabel *weeknos[7];
    KODayMatrix *daymatrix;

    KCal::DateList mSelectedDates;
    QDate m_MthYr;
    int m_fstDayOfWk;
    bool m_bShowWeekNums;

    int dayNum(int row, int col);
    int dayToIndex(int dayNum);

    Calendar *mCalendar;
    KCalendarSystem *mCalendarSystem;

    const QString *curHeaders;

    /** used to update the day view periodically, in particular every
    * midnight to move the "today" rectangle.
    */
    QTimer *updateTimer;
    QDate lastDayChecked;
    RolloverType updateRollover;

    // Disabling copy constructor and assignment operator
    KDateNavigator(const KDateNavigator & );
    KDateNavigator &operator=(const KDateNavigator &);
};

#endif