kplato

kptcalendar.h
1/* This file is part of the KDE project
2 Copyright (C) 2003 - 2006 Dag Andersen <danders@get2net.dk>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation;
7 version 2 of the License.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18*/
19
20#ifndef KPTCALENDAR_H
21#define KPTCALENDAR_H
22
23#include "kptmap.h"
24#include "kptduration.h"
25
26#include <tqdatetime.h>
27#include <tqpair.h>
28#include <tqptrlist.h>
29
30class TQDomElement;
31class TQDateTime;
32class TQTime;
33class TQDate;
34class TQString;
35
36namespace KPlato
37{
38
39class DateTime;
40class Project;
41
42class CalendarDay {
43
44public:
45 CalendarDay();
46 CalendarDay(int state);
47 CalendarDay(TQDate date, int state=0);
48 CalendarDay(CalendarDay *day);
49 ~CalendarDay();
50
51 bool load(TQDomElement &element);
52 void save(TQDomElement &element) const;
53
54 const TQPtrList<TQPair<TQTime, TQTime> > &workingIntervals() const { return m_workingIntervals; }
55 void addInterval(TQPair<TQTime, TQTime> *interval);
56 void addInterval(TQPair<TQTime, TQTime> interval) { addInterval(new TQPair<TQTime, TQTime>(interval)); }
57 void clearIntervals() { m_workingIntervals.clear(); }
58 void setIntervals(TQPtrList<TQPair<TQTime, TQTime> > intervals) {
59 m_workingIntervals.clear();
60 m_workingIntervals = intervals;
61 }
62
63 TQTime startOfDay() const;
64 TQTime endOfDay() const;
65
66 TQDate date() const { return m_date; }
67 void setDate(TQDate date) { m_date = date; }
68 int state() const { return m_state; }
69 void setState(int state) { m_state = state; }
70
71 bool operator==(const CalendarDay *day) const;
72 bool operator==(const CalendarDay &day) const;
73 bool operator!=(const CalendarDay *day) const;
74 bool operator!=(const CalendarDay &day) const;
75
80 Duration effort(const TQTime &start, const TQTime &end);
81
87 TQPair<TQTime, TQTime> interval(const TQTime &start, const TQTime &end) const;
88
89 bool hasInterval() const;
90
95 bool hasInterval(const TQTime &start, const TQTime &end) const;
96
97 Duration duration() const;
98
99 const CalendarDay &copy(const CalendarDay &day);
100
101private:
102 TQDate m_date; //NOTE: inValid if used for weekdays
103 int m_state;
104 TQPtrList<TQPair<TQTime, TQTime> > m_workingIntervals;
105
106#ifndef NDEBUG
107public:
108 void printDebug(TQCString indent="");
109#endif
110};
111
112class CalendarWeekdays {
113
114public:
115 CalendarWeekdays();
116 CalendarWeekdays(CalendarWeekdays *weekdays);
117 ~CalendarWeekdays();
118
119 bool load(TQDomElement &element);
120 void save(TQDomElement &element) const;
121
122 void addWeekday(CalendarDay *day) { m_weekdays.append(day); }
123 const TQPtrList<CalendarDay> &weekdays() const { return m_weekdays; }
129 CalendarDay *weekday(int day) const;
130 CalendarDay *weekday(const TQDate &date) const { return weekday(date.dayOfWeek()-1); }
131 CalendarDay *replace(int weekday, CalendarDay *day) {
132 CalendarDay *d = m_weekdays.at(weekday);
133 m_weekdays.replace(weekday, day);
134 return d;
135 }
136 IntMap map();
137
138 void setWeekday(IntMap::iterator it, int state) { m_weekdays.at(it.key())->setState(state); }
139
140 int state(const TQDate &date) const;
141 int state(int weekday) const;
142 void setState(int weekday, int state);
143
144 const TQPtrList<TQPair<TQTime, TQTime> > &intervals(int weekday) const;
145 void setIntervals(int weekday, TQPtrList<TQPair<TQTime, TQTime> >intervals);
146 void clearIntervals(int weekday);
147
148 bool operator==(const CalendarWeekdays *weekdays) const;
149 bool operator!=(const CalendarWeekdays *weekdays) const;
150
151 Duration effort(const TQDate &date, const TQTime &start, const TQTime &end);
152
159 TQPair<TQTime, TQTime> interval(const TQDate date, const TQTime &start, const TQTime &end) const;
164 bool hasInterval(const TQDate date, const TQTime &start, const TQTime &end) const;
165 bool hasInterval() const;
166
167 Duration duration() const;
168 Duration duration(int weekday) const;
169
171 TQTime startOfDay(int weekday) const;
173 TQTime endOfDay(int weekday) const;
174
175 const CalendarWeekdays &copy(const CalendarWeekdays &weekdays);
176
177private:
178 TQPtrList<CalendarDay> m_weekdays;
179 double m_workHours;
180
181#ifndef NDEBUG
182public:
183 void printDebug(TQCString indent="");
184#endif
185};
186
204class Calendar {
205
206public:
207 Calendar();
208 Calendar(TQString name, Calendar *parent=0);
209 Calendar(Calendar *calendar);
210 ~Calendar();
211
212 TQString name() const { return m_name; }
213 void setName(TQString name) { m_name = name; }
214
215 Calendar *parent() const { return m_parent; }
216 void setParent(Calendar *parent) { m_parent = parent; }
217
218 Project *project() const { return m_project; }
219 void setProject(Project *project);
220
221 bool isDeleted() const { return m_deleted; }
222 void setDeleted(bool yes);
223
224 TQString id() const { return m_id; }
225 bool setId(TQString id);
226 void generateId();
227
228 bool load(TQDomElement &element);
229 void save(TQDomElement &element) const;
230
235 CalendarDay *findDay(const TQDate &date, bool skipUndefined=false) const;
236 bool addDay(CalendarDay *day) { return m_days.insert(0, day); }
237 bool removeDay(CalendarDay *day) { return m_days.removeRef(day); }
238 CalendarDay *takeDay(CalendarDay *day) { return m_days.take(m_days.find(day)); }
239 const TQPtrList<CalendarDay> &days() const { return m_days; }
240
245 int parentDayState(const TQDate &date) const;
246
247 IntMap weekdaysMap() { return m_weekdays->map(); }
248 void setWeekday(IntMap::iterator it, int state) { m_weekdays->setWeekday(it, state); }
249 CalendarWeekdays *weekdays() { return m_weekdays; }
250 CalendarDay *weekday(int day) const { return m_weekdays->weekday(day); }
251
252 TQString parentId() const { return m_parentId; }
253 void setParentId(TQString id) { m_parentId = id; }
254
255 bool hasParent(Calendar *cal);
256
261 Duration effort(const TQDate &date, const TQTime &start, const TQTime &end) const;
266 Duration effort(const DateTime &start, const DateTime &end) const;
267
274 TQPair<DateTime, DateTime> firstInterval(const DateTime &start, const DateTime &end) const;
275
282 TQPair<TQTime, TQTime> firstInterval(const TQDate &date, const TQTime &start, const TQTime &end) const;
283
288 bool hasInterval(const DateTime &start, const DateTime &end) const;
289
294 bool hasInterval(const TQDate &date, const TQTime &start, const TQTime &end) const;
295
300 DateTime firstAvailableAfter(const DateTime &time, const DateTime &limit);
305 DateTime firstAvailableBefore(const DateTime &time, const DateTime &limit);
306
307 Calendar *findCalendar() const { return findCalendar(m_id); }
308 Calendar *findCalendar(const TQString &id) const;
309 bool removeId() { return removeId(m_id); }
310 bool removeId(const TQString &id);
311 void insertId(const TQString &id);
312
313protected:
314 const Calendar &copy(Calendar &calendar);
315 void init();
316
317private:
318 TQString m_name;
319 Calendar *m_parent;
320 Project *m_project;
321 bool m_deleted;
322 TQString m_id;
323 TQString m_parentId;
324
325 TQPtrList<CalendarDay> m_days;
326 CalendarWeekdays *m_weekdays;
327
328#ifndef NDEBUG
329public:
330 void printDebug(TQCString indent="");
331#endif
332};
333
334class StandardWorktime
335{
336public:
337 StandardWorktime();
338 StandardWorktime(StandardWorktime* worktime);
339 ~StandardWorktime();
340
342 Duration durationYear() const { return m_year; }
344 double year() const { return m_year.toDouble(Duration::Unit_h); }
346 void setYear(const Duration year) { m_year = year; }
348 void setYear(double hours) { m_year = Duration((TQ_INT64)(hours*60.0*60.0)); }
349
351 Duration durationMonth() const { return m_month; }
353 double month() const { return m_month.toDouble(Duration::Unit_h); }
355 void setMonth(const Duration month) { m_month = month; }
357 void setMonth(double hours) { m_month = Duration((TQ_INT64)(hours*60.0*60.0)); }
358
360 Duration durationWeek() const { return m_week; }
362 double week() const { return m_week.toDouble(Duration::Unit_h); }
364 void setWeek(const Duration week) { m_week = week; }
366 void setWeek(double hours) { m_week = Duration((TQ_INT64)(hours*60.0*60.0)); }
367
369 Duration durationDay() const { return m_day; }
371 double day() const { return m_day.toDouble(Duration::Unit_h); }
373 void setDay(const Duration day) { m_day = day; }
375 void setDay(double hours) { m_day = Duration((TQ_INT64)(hours*60.0*60.0)); }
376
377 bool load(TQDomElement &element);
378 void save(TQDomElement &element) const;
379
380 Calendar *calendar() const { return m_calendar; }
381
382protected:
383 void init();
384
385private:
386 Duration m_year;
387 Duration m_month;
388 Duration m_week;
389 Duration m_day;
390
391 Calendar *m_calendar;
392
393#ifndef NDEBUG
394public:
395 void printDebug(TQCString indent="");
396#endif
397};
398
399} //KPlato namespace
400
401#endif
int parentDayState(const TQDate &date) const
Returns the state of definition for parents day date in it.
CalendarDay * findDay(const TQDate &date, bool skipUndefined=false) const
Find the definition for the day date.
TQPair< DateTime, DateTime > firstInterval(const DateTime &start, const DateTime &end) const
Returns the first 'work interval' for the interval starting at start and ending at end.
bool hasInterval(const DateTime &start, const DateTime &end) const
Returns true if at least a part of a 'work interval' exists for the interval starting at start and en...
DateTime firstAvailableAfter(const DateTime &time, const DateTime &limit)
Find the first available time after time before limit.
Duration effort(const TQDate &date, const TQTime &start, const TQTime &end) const
Returns the amount of 'worktime' that can be done on the date date between the times start and end.
DateTime firstAvailableBefore(const DateTime &time, const DateTime &limit)
Find the first available time backwards from time.
DateTime is a TQDateTime which knows about Duration.
Definition kptdatetime.h:33
Project is the main node in a project, it contains child nodes and possibly sub-projects.
Definition kptproject.h:52