-rw-r--r-- | libopie/pim/oevent.cpp | 64 |
1 files changed, 61 insertions, 3 deletions
diff --git a/libopie/pim/oevent.cpp b/libopie/pim/oevent.cpp index ada596c..c3eeee2 100644 --- a/libopie/pim/oevent.cpp +++ b/libopie/pim/oevent.cpp | |||
@@ -21,119 +21,129 @@ int OCalendarHelper::week( const QDate& date) { | |||
21 | 21 | ||
22 | return week; | 22 | return week; |
23 | } | 23 | } |
24 | int OCalendarHelper::ocurrence( const QDate& date) { | 24 | int OCalendarHelper::ocurrence( const QDate& date) { |
25 | // calculates the number of occurrances of this day of the | 25 | // calculates the number of occurrances of this day of the |
26 | // week till the given date (e.g 3rd Wednesday of the month) | 26 | // week till the given date (e.g 3rd Wednesday of the month) |
27 | return ( date.day() - 1 ) / 7 + 1; | 27 | return ( date.day() - 1 ) / 7 + 1; |
28 | } | 28 | } |
29 | int OCalendarHelper::dayOfWeek( char day ) { | 29 | int OCalendarHelper::dayOfWeek( char day ) { |
30 | int dayOfWeek = 1; | 30 | int dayOfWeek = 1; |
31 | char i = ORecur::MON; | 31 | char i = ORecur::MON; |
32 | while ( !( i & day ) && i <= ORecur::SUN ) { | 32 | while ( !( i & day ) && i <= ORecur::SUN ) { |
33 | i <<= 1; | 33 | i <<= 1; |
34 | ++dayOfWeek; | 34 | ++dayOfWeek; |
35 | } | 35 | } |
36 | return dayOfWeek; | 36 | return dayOfWeek; |
37 | } | 37 | } |
38 | int OCalendarHelper::monthDiff( const QDate& first, const QDate& second ) { | 38 | int OCalendarHelper::monthDiff( const QDate& first, const QDate& second ) { |
39 | return ( second.year() - first.year() ) * 12 + | 39 | return ( second.year() - first.year() ) * 12 + |
40 | second.month() - first.month(); | 40 | second.month() - first.month(); |
41 | } | 41 | } |
42 | 42 | ||
43 | struct OEvent::Data : public QShared { | 43 | struct OEvent::Data : public QShared { |
44 | Data() : QShared() { | 44 | Data() : QShared() { |
45 | child = 0; | ||
45 | recur = 0; | 46 | recur = 0; |
46 | manager = 0; | 47 | manager = 0; |
47 | isAllDay = false; | 48 | isAllDay = false; |
49 | parent = 0; | ||
48 | } | 50 | } |
49 | ~Data() { | 51 | ~Data() { |
50 | delete manager; | 52 | delete manager; |
51 | delete recur; | 53 | delete recur; |
52 | } | 54 | } |
53 | QString description; | 55 | QString description; |
54 | QString location; | 56 | QString location; |
55 | OPimNotifyManager* manager; | 57 | OPimNotifyManager* manager; |
56 | ORecur* recur; | 58 | ORecur* recur; |
57 | QString note; | 59 | QString note; |
58 | QDateTime created; | 60 | QDateTime created; |
59 | QDateTime start; | 61 | QDateTime start; |
60 | QDateTime end; | 62 | QDateTime end; |
61 | bool isAllDay : 1; | 63 | bool isAllDay : 1; |
62 | QString timezone; | 64 | QString timezone; |
65 | QArray<int>* child; | ||
66 | int parent; | ||
63 | }; | 67 | }; |
64 | 68 | ||
65 | OEvent::OEvent( int uid ) | 69 | OEvent::OEvent( int uid ) |
66 | : OPimRecord( uid ) { | 70 | : OPimRecord( uid ) { |
67 | data = new Data; | 71 | data = new Data; |
68 | } | 72 | } |
69 | OEvent::OEvent( const OEvent& ev) | 73 | OEvent::OEvent( const OEvent& ev) |
70 | : OPimRecord( ev ), data( ev.data ) | 74 | : OPimRecord( ev ), data( ev.data ) |
71 | { | 75 | { |
72 | data->ref(); | 76 | data->ref(); |
73 | } | 77 | } |
74 | OEvent::~OEvent() { | 78 | OEvent::~OEvent() { |
75 | if ( data->deref() ) { | 79 | if ( data->deref() ) { |
76 | delete data; | 80 | delete data; |
77 | data = 0; | 81 | data = 0; |
78 | } | 82 | } |
79 | } | 83 | } |
80 | OEvent& OEvent::operator=( const OEvent& ev) { | 84 | OEvent& OEvent::operator=( const OEvent& ev) { |
81 | if ( *this == ev ) return *this; | 85 | if ( *this == ev ) return *this; |
82 | 86 | ||
83 | OPimRecord::operator=( ev ); | 87 | OPimRecord::operator=( ev ); |
84 | ev.data->ref(); | 88 | ev.data->ref(); |
85 | deref(); | 89 | deref(); |
86 | data = ev.data; | 90 | data = ev.data; |
87 | 91 | ||
88 | 92 | ||
89 | return *this; | 93 | return *this; |
90 | } | 94 | } |
91 | QString OEvent::description()const { | 95 | QString OEvent::description()const { |
92 | return data->description; | 96 | return data->description; |
93 | } | 97 | } |
94 | void OEvent::setDescription( const QString& description ) { | 98 | void OEvent::setDescription( const QString& description ) { |
95 | changeOrModify(); | 99 | changeOrModify(); |
96 | data->description = description; | 100 | data->description = description; |
97 | } | 101 | } |
98 | void OEvent::setLocation( const QString& loc ) { | 102 | void OEvent::setLocation( const QString& loc ) { |
99 | changeOrModify(); | 103 | changeOrModify(); |
100 | data->location = loc; | 104 | data->location = loc; |
101 | } | 105 | } |
102 | QString OEvent::location()const { | 106 | QString OEvent::location()const { |
103 | return data->location; | 107 | return data->location; |
104 | } | 108 | } |
105 | OPimNotifyManager &OEvent::notifiers() { | 109 | OPimNotifyManager &OEvent::notifiers()const { |
106 | // I hope we can skip the changeOrModify here | 110 | // I hope we can skip the changeOrModify here |
107 | // the notifier should take care of it | 111 | // the notifier should take care of it |
108 | // and OPimNotify is shared too | 112 | // and OPimNotify is shared too |
109 | if (!data->manager ) | 113 | if (!data->manager ) |
110 | data->manager = new OPimNotifyManager; | 114 | data->manager = new OPimNotifyManager; |
111 | 115 | ||
112 | return *data->manager; | 116 | return *data->manager; |
113 | } | 117 | } |
114 | bool OEvent::hasNotifiers()const { | 118 | bool OEvent::hasNotifiers()const { |
115 | return ( data->manager); | 119 | if (!data->manager ) |
120 | return false; | ||
121 | if (data->manager->reminders().isEmpty() && | ||
122 | data->manager->alarms().isEmpty() ) | ||
123 | return false; | ||
124 | |||
125 | return true; | ||
116 | } | 126 | } |
117 | ORecur OEvent::recurrence()const { | 127 | ORecur OEvent::recurrence()const { |
118 | if (!data->recur) | 128 | if (!data->recur) |
119 | data->recur = new ORecur; | 129 | data->recur = new ORecur; |
120 | 130 | ||
121 | return *data->recur; | 131 | return *data->recur; |
122 | } | 132 | } |
123 | void OEvent::setRecurrence( const ORecur& rec) { | 133 | void OEvent::setRecurrence( const ORecur& rec) { |
124 | changeOrModify(); | 134 | changeOrModify(); |
125 | if (data->recur ) | 135 | if (data->recur ) |
126 | (*data->recur) = rec; | 136 | (*data->recur) = rec; |
127 | else | 137 | else |
128 | data->recur = new ORecur( rec ); | 138 | data->recur = new ORecur( rec ); |
129 | } | 139 | } |
130 | bool OEvent::hasRecurrence()const { | 140 | bool OEvent::hasRecurrence()const { |
131 | if (!data->recur ) return false; | 141 | if (!data->recur ) return false; |
132 | return data->recur->doesRecur(); | 142 | return data->recur->doesRecur(); |
133 | } | 143 | } |
134 | QString OEvent::note()const { | 144 | QString OEvent::note()const { |
135 | return data->note; | 145 | return data->note; |
136 | } | 146 | } |
137 | void OEvent::setNote( const QString& note ) { | 147 | void OEvent::setNote( const QString& note ) { |
138 | changeOrModify(); | 148 | changeOrModify(); |
139 | data->note = note; | 149 | data->note = note; |
@@ -176,109 +186,157 @@ QDateTime OEvent::endDateTimeInZone()const { | |||
176 | 186 | ||
177 | OTimeZone zone(data->timezone ); | 187 | OTimeZone zone(data->timezone ); |
178 | return zone.toDateTime( data->end, OTimeZone::current() ); | 188 | return zone.toDateTime( data->end, OTimeZone::current() ); |
179 | } | 189 | } |
180 | void OEvent::setEndDateTime( const QDateTime& dt ) { | 190 | void OEvent::setEndDateTime( const QDateTime& dt ) { |
181 | changeOrModify(); | 191 | changeOrModify(); |
182 | data->end = dt; | 192 | data->end = dt; |
183 | } | 193 | } |
184 | bool OEvent::isMultipleDay()const { | 194 | bool OEvent::isMultipleDay()const { |
185 | return data->end.date().day() - data->start.date().day(); | 195 | return data->end.date().day() - data->start.date().day(); |
186 | } | 196 | } |
187 | bool OEvent::isAllDay()const { | 197 | bool OEvent::isAllDay()const { |
188 | return data->isAllDay; | 198 | return data->isAllDay; |
189 | } | 199 | } |
190 | void OEvent::setAllDay( bool allDay ) { | 200 | void OEvent::setAllDay( bool allDay ) { |
191 | changeOrModify(); | 201 | changeOrModify(); |
192 | data->isAllDay = allDay; | 202 | data->isAllDay = allDay; |
193 | if (allDay ) data->timezone = "UTC"; | 203 | if (allDay ) data->timezone = "UTC"; |
194 | } | 204 | } |
195 | void OEvent::setTimeZone( const QString& tz ) { | 205 | void OEvent::setTimeZone( const QString& tz ) { |
196 | changeOrModify(); | 206 | changeOrModify(); |
197 | data->timezone = tz; | 207 | data->timezone = tz; |
198 | } | 208 | } |
199 | QString OEvent::timeZone()const { | 209 | QString OEvent::timeZone()const { |
210 | if (data->isAllDay ) return QString::fromLatin1("UTC"); | ||
200 | return data->timezone; | 211 | return data->timezone; |
201 | } | 212 | } |
202 | bool OEvent::match( const QRegExp& )const { | 213 | bool OEvent::match( const QRegExp& )const { |
203 | // FIXME | 214 | // FIXME |
204 | return false; | 215 | return false; |
205 | } | 216 | } |
206 | QString OEvent::toRichText()const { | 217 | QString OEvent::toRichText()const { |
207 | // FIXME | 218 | // FIXME |
208 | return "OEvent test"; | 219 | return "OEvent test"; |
209 | } | 220 | } |
210 | QString OEvent::toShortText()const { | 221 | QString OEvent::toShortText()const { |
211 | return "OEvent shotText"; | 222 | return "OEvent shotText"; |
212 | } | 223 | } |
213 | QString OEvent::type()const { | 224 | QString OEvent::type()const { |
214 | return QString::fromLatin1("OEvent"); | 225 | return QString::fromLatin1("OEvent"); |
215 | } | 226 | } |
216 | QString OEvent::recordField( int /*id */ )const { | 227 | QString OEvent::recordField( int /*id */ )const { |
217 | return QString::null; | 228 | return QString::null; |
218 | } | 229 | } |
219 | int OEvent::rtti() { | 230 | int OEvent::rtti() { |
220 | return OPimResolver::DateBook; | 231 | return OPimResolver::DateBook; |
221 | } | 232 | } |
222 | bool OEvent::loadFromStream( QDataStream& ) { | 233 | bool OEvent::loadFromStream( QDataStream& ) { |
223 | return true; | 234 | return true; |
224 | } | 235 | } |
225 | bool OEvent::saveToStream( QDataStream& )const { | 236 | bool OEvent::saveToStream( QDataStream& )const { |
226 | return true; | 237 | return true; |
227 | } | 238 | } |
228 | void OEvent::changeOrModify() { | 239 | void OEvent::changeOrModify() { |
229 | if ( data->count != 1 ) { | 240 | if ( data->count != 1 ) { |
230 | data->deref(); | 241 | data->deref(); |
231 | Data* d2 = new Data; | 242 | Data* d2 = new Data; |
232 | d2->description = data->description; | 243 | d2->description = data->description; |
233 | d2->location = data->location; | 244 | d2->location = data->location; |
234 | d2->manager = data->manager; | 245 | d2->manager = data->manager; |
235 | d2->recur = data->recur; | 246 | d2->recur = data->recur; |
236 | d2->note = data->note; | 247 | d2->note = data->note; |
237 | d2->created = data->created; | 248 | d2->created = data->created; |
238 | d2->start = data->start; | 249 | d2->start = data->start; |
239 | d2->end = data->end; | 250 | d2->end = data->end; |
240 | d2->isAllDay = data->isAllDay; | 251 | d2->isAllDay = data->isAllDay; |
241 | d2->timezone = data->timezone; | 252 | d2->timezone = data->timezone; |
253 | d2->parent = data->parent; | ||
254 | d2->child = data->child; | ||
255 | |||
256 | if (d2->child ) | ||
257 | d2->child->detach(); | ||
242 | 258 | ||
243 | data = d2; | 259 | data = d2; |
244 | } | 260 | } |
245 | } | 261 | } |
246 | void OEvent::deref() { | 262 | void OEvent::deref() { |
247 | if ( data->deref() ) { | 263 | if ( data->deref() ) { |
248 | delete data; | 264 | delete data; |
249 | data = 0; | 265 | data = 0; |
250 | } | 266 | } |
251 | } | 267 | } |
252 | // FIXME | 268 | // FIXME |
253 | QMap<int, QString> OEvent::toMap()const { | 269 | QMap<int, QString> OEvent::toMap()const { |
254 | return QMap<int, QString>(); | 270 | return QMap<int, QString>(); |
255 | } | 271 | } |
256 | QMap<QString, QString> OEvent::toExtraMap()const { | 272 | QMap<QString, QString> OEvent::toExtraMap()const { |
257 | return QMap<QString, QString>(); | 273 | return QMap<QString, QString>(); |
258 | } | 274 | } |
275 | int OEvent::parent()const { | ||
276 | return data->parent; | ||
277 | } | ||
278 | void OEvent::setParent( int uid ) { | ||
279 | changeOrModify(); | ||
280 | data->parent = uid; | ||
281 | } | ||
282 | QArray<int> OEvent::children() const{ | ||
283 | if (!data->child) return QArray<int>(); | ||
284 | else | ||
285 | return data->child->copy(); | ||
286 | } | ||
287 | void OEvent::setChildren( const QArray<int>& arr ) { | ||
288 | changeOrModify(); | ||
289 | if (data->child) delete data->child; | ||
259 | 290 | ||
260 | 291 | data->child = new QArray<int>( arr ); | |
292 | data->child->detach(); | ||
293 | } | ||
294 | void OEvent::addChild( int uid ) { | ||
295 | changeOrModify(); | ||
296 | if (!data->child ) { | ||
297 | data->child = new QArray<int>(1); | ||
298 | (*data->child)[0] = uid; | ||
299 | }else{ | ||
300 | int count = data->child->count(); | ||
301 | data->child->resize( count + 1 ); | ||
302 | (*data->child)[count] = uid; | ||
303 | } | ||
304 | } | ||
305 | void OEvent::removeChild( int uid ) { | ||
306 | if (!data->child || !data->child->contains( uid ) ) return; | ||
307 | changeOrModify(); | ||
308 | QArray<int> newAr( data->child->count() - 1 ); | ||
309 | int j = 0; | ||
310 | uint count = data->child->count(); | ||
311 | for ( uint i = 0; i < count; i++ ) { | ||
312 | if ( (*data->child)[i] != uid ) { | ||
313 | newAr[j] = (*data->child)[i]; | ||
314 | j++; | ||
315 | } | ||
316 | } | ||
317 | (*data->child) = newAr; | ||
318 | } | ||
261 | struct OEffectiveEvent::Data : public QShared { | 319 | struct OEffectiveEvent::Data : public QShared { |
262 | Data() : QShared() { | 320 | Data() : QShared() { |
263 | } | 321 | } |
264 | OEvent event; | 322 | OEvent event; |
265 | QDate date; | 323 | QDate date; |
266 | QTime start, end; | 324 | QTime start, end; |
267 | QDate startDate, endDate; | 325 | QDate startDate, endDate; |
268 | bool dates : 1; | 326 | bool dates : 1; |
269 | }; | 327 | }; |
270 | 328 | ||
271 | OEffectiveEvent::OEffectiveEvent() { | 329 | OEffectiveEvent::OEffectiveEvent() { |
272 | data = new Data; | 330 | data = new Data; |
273 | data->date = QDate::currentDate(); | 331 | data->date = QDate::currentDate(); |
274 | data->start = data->end = QTime::currentTime(); | 332 | data->start = data->end = QTime::currentTime(); |
275 | data->dates = false; | 333 | data->dates = false; |
276 | } | 334 | } |
277 | OEffectiveEvent::OEffectiveEvent( const OEvent& ev, const QDate& startDate, | 335 | OEffectiveEvent::OEffectiveEvent( const OEvent& ev, const QDate& startDate, |
278 | Position pos ) { | 336 | Position pos ) { |
279 | data = new Data; | 337 | data = new Data; |
280 | data->event = ev; | 338 | data->event = ev; |
281 | data->date = startDate; | 339 | data->date = startDate; |
282 | if ( pos & Start ) | 340 | if ( pos & Start ) |
283 | data->start = ev.startDateTime().time(); | 341 | data->start = ev.startDateTime().time(); |
284 | else | 342 | else |