kplato

kptcalendar.h

00001 /* This file is part of the KDE project
00002    Copyright (C) 2003 - 2006 Dag Andersen <danders@get2net.dk>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation; 
00007    version 2 of the License.
00008 
00009    This library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this library; see the file COPYING.LIB.  If not, write to
00016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017  * Boston, MA 02110-1301, USA.
00018 */
00019 
00020 #ifndef KPTCALENDAR_H
00021 #define KPTCALENDAR_H
00022 
00023 #include "kptmap.h"
00024 #include "kptduration.h"
00025 
00026 #include <qdatetime.h>
00027 #include <qpair.h>
00028 #include <qptrlist.h>
00029 
00030 class QDomElement;
00031 class QDateTime;
00032 class QTime;
00033 class QDate;
00034 class QString;
00035 
00036 namespace KPlato
00037 {
00038 
00039 class DateTime;
00040 class Project;
00041 
00042 class CalendarDay {
00043 
00044 public:
00045     CalendarDay();
00046     CalendarDay(int state);
00047     CalendarDay(QDate date, int state=0);
00048     CalendarDay(CalendarDay *day);
00049     ~CalendarDay();
00050 
00051     bool load(QDomElement &element);
00052     void save(QDomElement &element) const;
00053 
00054     const QPtrList<QPair<QTime, QTime> > &workingIntervals() const { return m_workingIntervals; }
00055     void addInterval(QPair<QTime, QTime> *interval);
00056     void addInterval(QPair<QTime, QTime> interval) { addInterval(new QPair<QTime, QTime>(interval)); }
00057     void clearIntervals() { m_workingIntervals.clear(); }
00058     void setIntervals(QPtrList<QPair<QTime, QTime> > intervals) { 
00059         m_workingIntervals.clear();
00060         m_workingIntervals = intervals;
00061     }
00062     
00063     QTime startOfDay() const;
00064     QTime endOfDay() const;
00065     
00066     QDate date() const { return m_date; }
00067     void setDate(QDate date) { m_date = date; }
00068     int state() const { return m_state; }
00069     void setState(int state) { m_state = state; }
00070 
00071     bool operator==(const CalendarDay *day) const;
00072     bool operator==(const CalendarDay &day) const;
00073     bool operator!=(const CalendarDay *day) const;
00074     bool operator!=(const CalendarDay &day) const;
00075 
00080     Duration effort(const QTime &start, const QTime &end);
00081 
00087     QPair<QTime, QTime> interval(const QTime &start, const QTime &end) const;
00088     
00089     bool hasInterval() const;
00090 
00095     bool hasInterval(const QTime &start, const QTime &end) const;
00096     
00097     Duration duration() const;
00098     
00099     const CalendarDay &copy(const CalendarDay &day);
00100 
00101 private:
00102     QDate m_date; //NOTE: inValid if used for weekdays
00103     int m_state;
00104     QPtrList<QPair<QTime, QTime> > m_workingIntervals;
00105 
00106 #ifndef NDEBUG
00107 public:
00108     void printDebug(QCString indent="");
00109 #endif
00110 };
00111 
00112 class CalendarWeekdays {
00113 
00114 public:
00115     CalendarWeekdays();
00116     CalendarWeekdays(CalendarWeekdays *weekdays);
00117     ~CalendarWeekdays();
00118 
00119     bool load(QDomElement &element);
00120     void save(QDomElement &element) const;
00121 
00122     void addWeekday(CalendarDay *day) { m_weekdays.append(day); }
00123     const QPtrList<CalendarDay> &weekdays() const { return m_weekdays; }
00129     CalendarDay *weekday(int day) const;
00130     CalendarDay *weekday(const QDate &date) const { return weekday(date.dayOfWeek()-1); }
00131     CalendarDay *replace(int weekday, CalendarDay *day) {
00132         CalendarDay *d = m_weekdays.at(weekday);
00133         m_weekdays.replace(weekday, day);
00134         return d;
00135     }
00136     IntMap map();
00137     
00138     void setWeekday(IntMap::iterator it, int state) { m_weekdays.at(it.key())->setState(state); }
00139 
00140     int state(const QDate &date) const;
00141     int state(int weekday) const;
00142     void setState(int weekday, int state);
00143     
00144     const QPtrList<QPair<QTime, QTime> > &intervals(int weekday) const;
00145     void setIntervals(int weekday, QPtrList<QPair<QTime, QTime> >intervals);
00146     void clearIntervals(int weekday);
00147     
00148     bool operator==(const CalendarWeekdays *weekdays) const;
00149     bool operator!=(const CalendarWeekdays *weekdays) const;
00150 
00151     Duration effort(const QDate &date, const QTime &start, const QTime &end);
00152     
00159     QPair<QTime, QTime> interval(const QDate date, const QTime &start, const QTime &end) const;
00164     bool hasInterval(const QDate date, const QTime &start, const QTime &end) const;
00165     bool hasInterval() const;
00166 
00167     Duration duration() const;
00168     Duration duration(int weekday) const;
00169 
00171     QTime startOfDay(int weekday) const;
00173     QTime endOfDay(int weekday) const;
00174 
00175     const CalendarWeekdays &copy(const CalendarWeekdays &weekdays);
00176 
00177 private:
00178     QPtrList<CalendarDay> m_weekdays;
00179     double m_workHours;
00180 
00181 #ifndef NDEBUG
00182 public:
00183     void printDebug(QCString indent="");
00184 #endif
00185 };
00186 
00204 class Calendar {
00205 
00206 public:
00207     Calendar();
00208     Calendar(QString name, Calendar *parent=0);
00209     Calendar(Calendar *calendar);
00210     ~Calendar();
00211 
00212     QString name() const { return m_name; }
00213     void setName(QString name) { m_name = name; }
00214 
00215     Calendar *parent() const { return m_parent; }
00216     void setParent(Calendar *parent) { m_parent = parent; }
00217     
00218     Project *project() const { return m_project; }
00219     void setProject(Project *project);
00220 
00221     bool isDeleted() const { return m_deleted; }
00222     void setDeleted(bool yes);
00223 
00224     QString id() const { return m_id; }
00225     bool setId(QString id);
00226     void generateId();
00227     
00228     bool load(QDomElement &element);
00229     void save(QDomElement &element) const;
00230 
00235     CalendarDay *findDay(const QDate &date, bool skipUndefined=false) const;
00236     bool addDay(CalendarDay *day) { return m_days.insert(0, day); }
00237     bool removeDay(CalendarDay *day) { return m_days.removeRef(day); }
00238     CalendarDay *takeDay(CalendarDay *day) { return m_days.take(m_days.find(day)); }
00239     const QPtrList<CalendarDay> &days() const { return m_days; }
00240     
00245     int parentDayState(const QDate &date) const;
00246     
00247     IntMap weekdaysMap() { return m_weekdays->map(); }
00248     void setWeekday(IntMap::iterator it, int state) { m_weekdays->setWeekday(it, state); }
00249     CalendarWeekdays *weekdays() { return m_weekdays; }
00250     CalendarDay *weekday(int day) const { return m_weekdays->weekday(day); }
00251 
00252     QString parentId() const { return m_parentId; }
00253     void setParentId(QString id) { m_parentId = id; }
00254 
00255     bool hasParent(Calendar *cal);
00256 
00261     Duration effort(const QDate &date, const QTime &start, const QTime &end) const;
00266     Duration effort(const DateTime &start, const DateTime &end) const;
00267 
00274     QPair<DateTime, DateTime> firstInterval(const DateTime &start, const DateTime &end) const;
00275     
00282     QPair<QTime, QTime> firstInterval(const QDate &date, const QTime &start, const QTime &end) const;
00283     
00288     bool hasInterval(const DateTime &start, const DateTime &end) const;
00289         
00294     bool hasInterval(const QDate &date, const QTime &start, const QTime &end) const;
00295         
00300     DateTime firstAvailableAfter(const DateTime &time, const DateTime &limit);
00305     DateTime firstAvailableBefore(const DateTime &time, const DateTime &limit);
00306 
00307     Calendar *findCalendar() const { return findCalendar(m_id); }
00308     Calendar *findCalendar(const QString &id) const;
00309     bool removeId() { return removeId(m_id); }
00310     bool removeId(const QString &id);
00311     void insertId(const QString &id);
00312 
00313 protected:
00314     const Calendar &copy(Calendar &calendar);
00315     void init();
00316     
00317 private:
00318     QString m_name;
00319     Calendar *m_parent;
00320     Project *m_project;
00321     bool m_deleted;
00322     QString m_id;
00323     QString m_parentId;
00324 
00325     QPtrList<CalendarDay> m_days;
00326     CalendarWeekdays *m_weekdays;
00327 
00328 #ifndef NDEBUG
00329 public:
00330     void printDebug(QCString indent="");
00331 #endif
00332 };
00333 
00334 class StandardWorktime
00335 {
00336 public:
00337     StandardWorktime();
00338     StandardWorktime(StandardWorktime* worktime);
00339     ~StandardWorktime();
00340     
00342     Duration durationYear() const { return m_year; }
00344     double year() const { return m_year.toDouble(Duration::Unit_h); }
00346     void setYear(const Duration year) { m_year = year; }
00348     void setYear(double hours) { m_year = Duration((Q_INT64)(hours*60.0*60.0)); }
00349     
00351     Duration durationMonth() const { return m_month; }
00353     double month() const  { return m_month.toDouble(Duration::Unit_h); }
00355     void setMonth(const Duration month) { m_month = month; }
00357     void setMonth(double hours) { m_month = Duration((Q_INT64)(hours*60.0*60.0)); }
00358     
00360     Duration durationWeek() const { return m_week; }
00362     double week() const { return m_week.toDouble(Duration::Unit_h); }
00364     void setWeek(const Duration week) { m_week = week; }
00366     void setWeek(double hours) { m_week = Duration((Q_INT64)(hours*60.0*60.0)); }
00367     
00369     Duration durationDay() const { return m_day; }
00371     double day() const { return m_day.toDouble(Duration::Unit_h); }
00373     void setDay(const Duration day) { m_day = day; }
00375     void setDay(double hours) { m_day = Duration((Q_INT64)(hours*60.0*60.0)); }
00376     
00377     bool load(QDomElement &element);
00378     void save(QDomElement &element) const;
00379 
00380     Calendar *calendar() const { return m_calendar; }
00381     
00382 protected:
00383     void init();
00384     
00385 private:
00386     Duration m_year;
00387     Duration m_month;
00388     Duration m_week;
00389     Duration m_day;
00390     
00391     Calendar *m_calendar;
00392     
00393 #ifndef NDEBUG
00394 public:
00395     void printDebug(QCString indent="");
00396 #endif
00397 };
00398 
00399 }  //KPlato namespace
00400 
00401 #endif
KDE Home | KDE Accessibility Home | Description of Access Keys