kplato

kptcalendar.h

00001 /* This file is part of the KDE project
00002    Copyright (C) 2003 - 2005 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; }
00128     CalendarDay *weekday(int day) const;
00129     CalendarDay *weekday(const QDate &date) const { return weekday(date.dayOfWeek()-1); }
00130     CalendarDay *replace(int weekday, CalendarDay *day) {
00131         CalendarDay *d = m_weekdays.at(weekday);
00132         m_weekdays.replace(weekday, day);
00133         return d;
00134     }
00135     IntMap map();
00136     
00137     void setWeekday(IntMap::iterator it, int state) { m_weekdays.at(it.key())->setState(state); }
00138 
00139     int state(const QDate &date) const;
00140     int state(int weekday) const;
00141     void setState(int weekday, int state);
00142     
00143     const QPtrList<QPair<QTime, QTime> > &intervals(int weekday) const;
00144     void setIntervals(int weekday, QPtrList<QPair<QTime, QTime> >intervals);
00145     void clearIntervals(int weekday);
00146     
00147     bool operator==(const CalendarWeekdays *weekdays) const;
00148     bool operator!=(const CalendarWeekdays *weekdays) const;
00149 
00150     Duration effort(const QDate &date, const QTime &start, const QTime &end);
00151     
00158     QPair<QTime, QTime> interval(const QDate date, const QTime &start, const QTime &end) const;
00163     bool hasInterval(const QDate date, const QTime &start, const QTime &end) const;
00164     bool hasInterval() const;
00165 
00166     Duration duration() const;
00167     Duration duration(int weekday) const;
00168 
00170     QTime startOfDay(int weekday) const;
00172     QTime endOfDay(int weekday) const;
00173 
00174     const CalendarWeekdays &copy(const CalendarWeekdays &weekdays);
00175 
00176 private:
00177     QPtrList<CalendarDay> m_weekdays;
00178     double m_workHours;
00179 
00180 #ifndef NDEBUG
00181 public:
00182     void printDebug(QCString indent="");
00183 #endif
00184 };
00185 
00203 class Calendar {
00204 
00205 public:
00206     Calendar();
00207     Calendar(QString name, Calendar *parent=0);
00208     Calendar(Calendar *calendar);
00209     ~Calendar();
00210 
00211     QString name() const { return m_name; }
00212     void setName(QString name) { m_name = name; }
00213 
00214     Calendar *parent() const { return m_parent; }
00215     void setParent(Calendar *parent) { m_parent = parent; }
00216     
00217     Project *project() const { return m_project; }
00218     void setProject(Project *project);
00219 
00220     bool isDeleted() const { return m_deleted; }
00221     void setDeleted(bool yes);
00222 
00223     QString id() const { return m_id; }
00224     bool setId(QString id);
00225     void generateId();
00226     
00227     bool load(QDomElement &element);
00228     void save(QDomElement &element) const;
00229 
00234     CalendarDay *findDay(const QDate &date, bool skipUndefined=false) const;
00235     bool addDay(CalendarDay *day) { return m_days.insert(0, day); }
00236     bool removeDay(CalendarDay *day) { return m_days.removeRef(day); }
00237     CalendarDay *takeDay(CalendarDay *day) { return m_days.take(m_days.find(day)); }
00238     const QPtrList<CalendarDay> &days() const { return m_days; }
00239     
00244     int parentDayState(const QDate &date) const;
00245     
00246     IntMap weekdaysMap() { return m_weekdays->map(); }
00247     void setWeekday(IntMap::iterator it, int state) { m_weekdays->setWeekday(it, state); }
00248     CalendarWeekdays *weekdays() { return m_weekdays; }
00249     CalendarDay *weekday(int day) const { return m_weekdays->weekday(day); }
00250 
00251     QString parentId() const { return m_parentId; }
00252     void setParentId(QString id) { m_parentId = id; }
00253 
00254     bool hasParent(Calendar *cal);
00255 
00260     Duration effort(const QDate &date, const QTime &start, const QTime &end) const;
00265     Duration effort(const DateTime &start, const DateTime &end) const;
00266 
00273     QPair<DateTime, DateTime> firstInterval(const DateTime &start, const DateTime &end) const;
00274     
00281     QPair<QTime, QTime> firstInterval(const QDate &date, const QTime &start, const QTime &end) const;
00282     
00287     bool hasInterval(const DateTime &start, const DateTime &end) const;
00288         
00293     bool hasInterval(const QDate &date, const QTime &start, const QTime &end) const;
00294         
00299     DateTime firstAvailableAfter(const DateTime &time, const DateTime &limit);
00304     DateTime firstAvailableBefore(const DateTime &time, const DateTime &limit);
00305 
00306     Calendar *findCalendar() const { return findCalendar(m_id); }
00307     Calendar *findCalendar(const QString &id) const;
00308     bool removeId() { return removeId(m_id); }
00309     bool removeId(const QString &id);
00310     void insertId(const QString &id);
00311 
00312 protected:
00313     const Calendar &copy(Calendar &calendar);
00314     void init();
00315     
00316 private:
00317     QString m_name;
00318     Calendar *m_parent;
00319     Project *m_project;
00320     bool m_deleted;
00321     QString m_id;
00322     QString m_parentId;
00323 
00324     QPtrList<CalendarDay> m_days;
00325     CalendarWeekdays *m_weekdays;
00326 
00327 #ifndef NDEBUG
00328 public:
00329     void printDebug(QCString indent="");
00330 #endif
00331 };
00332 
00333 class StandardWorktime
00334 {
00335 public:
00336     StandardWorktime();
00337     StandardWorktime(StandardWorktime* worktime);
00338     ~StandardWorktime();
00339     
00341     Duration durationYear() const { return m_year; }
00343     double year() const { return m_year.toDouble(Duration::Unit_h); }
00345     void setYear(const Duration year) { m_year = year; }
00347     void setYear(double hours) { m_year = Duration((Q_INT64)(hours*60.0*60.0)); }
00348     
00350     Duration durationMonth() const { return m_month; }
00352     double month() const  { return m_month.toDouble(Duration::Unit_h); }
00354     void setMonth(const Duration month) { m_month = month; }
00356     void setMonth(double hours) { m_month = Duration((Q_INT64)(hours*60.0*60.0)); }
00357     
00359     Duration durationWeek() const { return m_week; }
00361     double week() const { return m_week.toDouble(Duration::Unit_h); }
00363     void setWeek(const Duration week) { m_week = week; }
00365     void setWeek(double hours) { m_week = Duration((Q_INT64)(hours*60.0*60.0)); }
00366     
00368     Duration durationDay() const { return m_day; }
00370     double day() const { return m_day.toDouble(Duration::Unit_h); }
00372     void setDay(const Duration day) { m_day = day; }
00374     void setDay(double hours) { m_day = Duration((Q_INT64)(hours*60.0*60.0)); }
00375     
00376     bool load(QDomElement &element);
00377     void save(QDomElement &element) const;
00378 
00379 protected:
00380     void init();
00381     
00382 private:
00383     Duration m_year;
00384     Duration m_month;
00385     Duration m_week;
00386     Duration m_day;
00387     
00388 #ifndef NDEBUG
00389 public:
00390     void printDebug(QCString indent="");
00391 #endif
00392 };
00393 
00394 }  //KPlato namespace
00395 
00396 #endif
KDE Home | KDE Accessibility Home | Description of Access Keys