summaryrefslogtreecommitdiff
path: root/libopie/pim/oevent.cpp
Unidiff
Diffstat (limited to 'libopie/pim/oevent.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/pim/oevent.cpp64
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}
24int OCalendarHelper::ocurrence( const QDate& date) { 24int 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}
29int OCalendarHelper::dayOfWeek( char day ) { 29int 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}
38int OCalendarHelper::monthDiff( const QDate& first, const QDate& second ) { 38int 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
43struct OEvent::Data : public QShared { 43struct 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
65OEvent::OEvent( int uid ) 69OEvent::OEvent( int uid )
66 : OPimRecord( uid ) { 70 : OPimRecord( uid ) {
67 data = new Data; 71 data = new Data;
68} 72}
69OEvent::OEvent( const OEvent& ev) 73OEvent::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}
74OEvent::~OEvent() { 78OEvent::~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}
80OEvent& OEvent::operator=( const OEvent& ev) { 84OEvent& 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}
91QString OEvent::description()const { 95QString OEvent::description()const {
92 return data->description; 96 return data->description;
93} 97}
94void OEvent::setDescription( const QString& description ) { 98void OEvent::setDescription( const QString& description ) {
95 changeOrModify(); 99 changeOrModify();
96 data->description = description; 100 data->description = description;
97} 101}
98void OEvent::setLocation( const QString& loc ) { 102void OEvent::setLocation( const QString& loc ) {
99 changeOrModify(); 103 changeOrModify();
100 data->location = loc; 104 data->location = loc;
101} 105}
102QString OEvent::location()const { 106QString OEvent::location()const {
103 return data->location; 107 return data->location;
104} 108}
105OPimNotifyManager &OEvent::notifiers() { 109OPimNotifyManager &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}
114bool OEvent::hasNotifiers()const { 118bool 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}
117ORecur OEvent::recurrence()const { 127ORecur 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}
123void OEvent::setRecurrence( const ORecur& rec) { 133void 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}
130bool OEvent::hasRecurrence()const { 140bool 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}
134QString OEvent::note()const { 144QString OEvent::note()const {
135 return data->note; 145 return data->note;
136} 146}
137void OEvent::setNote( const QString& note ) { 147void 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}
180void OEvent::setEndDateTime( const QDateTime& dt ) { 190void OEvent::setEndDateTime( const QDateTime& dt ) {
181 changeOrModify(); 191 changeOrModify();
182 data->end = dt; 192 data->end = dt;
183} 193}
184bool OEvent::isMultipleDay()const { 194bool 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}
187bool OEvent::isAllDay()const { 197bool OEvent::isAllDay()const {
188 return data->isAllDay; 198 return data->isAllDay;
189} 199}
190void OEvent::setAllDay( bool allDay ) { 200void 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}
195void OEvent::setTimeZone( const QString& tz ) { 205void OEvent::setTimeZone( const QString& tz ) {
196 changeOrModify(); 206 changeOrModify();
197 data->timezone = tz; 207 data->timezone = tz;
198} 208}
199QString OEvent::timeZone()const { 209QString OEvent::timeZone()const {
210 if (data->isAllDay ) return QString::fromLatin1("UTC");
200 return data->timezone; 211 return data->timezone;
201} 212}
202bool OEvent::match( const QRegExp& )const { 213bool OEvent::match( const QRegExp& )const {
203 // FIXME 214 // FIXME
204 return false; 215 return false;
205} 216}
206QString OEvent::toRichText()const { 217QString OEvent::toRichText()const {
207 // FIXME 218 // FIXME
208 return "OEvent test"; 219 return "OEvent test";
209} 220}
210QString OEvent::toShortText()const { 221QString OEvent::toShortText()const {
211 return "OEvent shotText"; 222 return "OEvent shotText";
212} 223}
213QString OEvent::type()const { 224QString OEvent::type()const {
214 return QString::fromLatin1("OEvent"); 225 return QString::fromLatin1("OEvent");
215} 226}
216QString OEvent::recordField( int /*id */ )const { 227QString OEvent::recordField( int /*id */ )const {
217 return QString::null; 228 return QString::null;
218} 229}
219int OEvent::rtti() { 230int OEvent::rtti() {
220 return OPimResolver::DateBook; 231 return OPimResolver::DateBook;
221} 232}
222bool OEvent::loadFromStream( QDataStream& ) { 233bool OEvent::loadFromStream( QDataStream& ) {
223 return true; 234 return true;
224} 235}
225bool OEvent::saveToStream( QDataStream& )const { 236bool OEvent::saveToStream( QDataStream& )const {
226 return true; 237 return true;
227} 238}
228void OEvent::changeOrModify() { 239void 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}
246void OEvent::deref() { 262void 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
253QMap<int, QString> OEvent::toMap()const { 269QMap<int, QString> OEvent::toMap()const {
254 return QMap<int, QString>(); 270 return QMap<int, QString>();
255} 271}
256QMap<QString, QString> OEvent::toExtraMap()const { 272QMap<QString, QString> OEvent::toExtraMap()const {
257 return QMap<QString, QString>(); 273 return QMap<QString, QString>();
258} 274}
275int OEvent::parent()const {
276 return data->parent;
277}
278void OEvent::setParent( int uid ) {
279 changeOrModify();
280 data->parent = uid;
281}
282QArray<int> OEvent::children() const{
283 if (!data->child) return QArray<int>();
284 else
285 return data->child->copy();
286}
287void 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}
294void 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}
305void 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}
261struct OEffectiveEvent::Data : public QShared { 319struct 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
271OEffectiveEvent::OEffectiveEvent() { 329OEffectiveEvent::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}
277OEffectiveEvent::OEffectiveEvent( const OEvent& ev, const QDate& startDate, 335OEffectiveEvent::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