summaryrefslogtreecommitdiff
path: root/libopie2/opiepim
Unidiff
Diffstat (limited to 'libopie2/opiepim') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/core/opimnotify.cpp251
-rw-r--r--libopie2/opiepim/core/opimnotify.h67
-rw-r--r--libopie2/opiepim/core/opimnotifymanager.cpp240
-rw-r--r--libopie2/opiepim/core/opimnotifymanager.h40
-rw-r--r--libopie2/opiepim/core/opimrecord.cpp141
-rw-r--r--libopie2/opiepim/core/opimrecord.h66
-rw-r--r--libopie2/opiepim/ocontact.cpp749
-rw-r--r--libopie2/opiepim/ocontact.h43
-rw-r--r--libopie2/opiepim/ocontactfields.cpp496
-rw-r--r--libopie2/opiepim/ocontactfields.h32
-rw-r--r--libopie2/opiepim/oevent.cpp870
-rw-r--r--libopie2/opiepim/oevent.h165
-rw-r--r--libopie2/opiepim/orecordlist.h230
-rw-r--r--libopie2/opiepim/otodo.cpp602
-rw-r--r--libopie2/opiepim/otodo.h147
15 files changed, 2491 insertions, 1648 deletions
diff --git a/libopie2/opiepim/core/opimnotify.cpp b/libopie2/opiepim/core/opimnotify.cpp
index c61f9da..43858f0 100644
--- a/libopie2/opiepim/core/opimnotify.cpp
+++ b/libopie2/opiepim/core/opimnotify.cpp
@@ -23,236 +23,357 @@
23 -_. . . )=. = Library General Public License along with 23 -_. . . )=. = Library General Public License along with
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29#include <qshared.h>
30 29
31#include <opie2/opimnotify.h> 30#include "opimnotify.h"
32 31
33namespace Opie { 32/* QT */
33#include <qshared.h>
34 34
35struct OPimNotify::Data : public QShared { 35namespace Opie
36 Data() : QShared(),dur(-1),parent(0) { 36{
37 37
38struct OPimNotify::Data : public QShared
39{
40 Data() : QShared(), dur( -1 ), parent( 0 )
41 {
38 } 42 }
39 QDateTime start; 43 QDateTime start;
40 int dur; 44 int dur;
41 QString application; 45 QString application;
42 int parent; 46 int parent;
43}; 47};
44 48
45OPimNotify::OPimNotify( const QDateTime& start, int duration, int parent ) { 49OPimNotify::OPimNotify( const QDateTime& start, int duration, int parent )
50{
46 data = new Data; 51 data = new Data;
47 data->start = start; 52 data->start = start;
48 data->dur = duration; 53 data->dur = duration;
49 data->parent = parent; 54 data->parent = parent;
50} 55}
51OPimNotify::OPimNotify( const OPimNotify& noti) 56
52 : data( noti.data ) 57
58OPimNotify::OPimNotify( const OPimNotify& noti )
59 : data( noti.data )
53{ 60{
54 data->ref(); 61 data->ref();
55} 62}
56OPimNotify::~OPimNotify() { 63
57 if ( data->deref() ) { 64
65OPimNotify::~OPimNotify()
66{
67 if ( data->deref() )
68 {
58 delete data; 69 delete data;
59 data = 0l; 70 data = 0l;
60 } 71 }
61} 72}
62 73
63OPimNotify &OPimNotify::operator=( const OPimNotify& noti) { 74
75OPimNotify &OPimNotify::operator=( const OPimNotify& noti )
76{
64 noti.data->ref(); 77 noti.data->ref();
65 deref(); 78 deref();
66 data = noti.data; 79 data = noti.data;
67 80
68 return *this; 81 return *this;
69} 82}
70bool OPimNotify::operator==( const OPimNotify& noti ) { 83
84
85bool OPimNotify::operator==( const OPimNotify& noti )
86{
71 if ( data == noti.data ) return true; 87 if ( data == noti.data ) return true;
72 if ( data->dur != noti.data->dur ) return false; 88 if ( data->dur != noti.data->dur ) return false;
73 if ( data->parent != noti.data->parent ) return false; 89 if ( data->parent != noti.data->parent ) return false;
74 if ( data->application != noti.data->application ) return false; 90 if ( data->application != noti.data->application ) return false;
75 if ( data->start != noti.data->start ) return false; 91 if ( data->start != noti.data->start ) return false;
76 92
77 return true; 93 return true;
78} 94}
79QDateTime OPimNotify::dateTime()const { 95
96
97QDateTime OPimNotify::dateTime() const
98{
80 return data->start; 99 return data->start;
81} 100}
82QString OPimNotify::service()const { 101
102
103QString OPimNotify::service() const
104{
83 return data->application; 105 return data->application;
84} 106}
85int OPimNotify::parent()const { 107
108
109int OPimNotify::parent() const
110{
86 return data->parent; 111 return data->parent;
87} 112}
88int OPimNotify::duration()const { 113
114
115int OPimNotify::duration() const
116{
89 return data->dur; 117 return data->dur;
90} 118}
91QDateTime OPimNotify::endTime()const { 119
92 return QDateTime( data->start.date(), data->start.time().addSecs( data->dur) ); 120
121QDateTime OPimNotify::endTime() const
122{
123 return QDateTime( data->start.date(), data->start.time().addSecs( data->dur ) );
93} 124}
94void OPimNotify::setDateTime( const QDateTime& time ) { 125
126
127void OPimNotify::setDateTime( const QDateTime& time )
128{
95 copyIntern(); 129 copyIntern();
96 data->start = time; 130 data->start = time;
97} 131}
98void OPimNotify::setDuration( int dur ) { 132
133
134void OPimNotify::setDuration( int dur )
135{
99 copyIntern(); 136 copyIntern();
100 data->dur = dur; 137 data->dur = dur;
101} 138}
102void OPimNotify::setParent( int uid ) { 139
140
141void OPimNotify::setParent( int uid )
142{
103 copyIntern(); 143 copyIntern();
104 data->parent = uid; 144 data->parent = uid;
105} 145}
106void OPimNotify::setService( const QString& str ) { 146
147
148void OPimNotify::setService( const QString& str )
149{
107 copyIntern(); 150 copyIntern();
108 data->application = str; 151 data->application = str;
109} 152}
110void OPimNotify::copyIntern() { 153
111 if ( data->count != 1 ) { 154
155void OPimNotify::copyIntern()
156{
157 if ( data->count != 1 )
158 {
112 data->deref(); 159 data->deref();
113 Data* dat = new Data; 160 Data* dat = new Data;
114 dat->start = data->start; 161 dat->start = data->start;
115 dat->dur = data->dur; 162 dat->dur = data->dur;
116 dat->application = data->application; 163 dat->application = data->application;
117 dat->parent = data->parent; 164 dat->parent = data->parent;
118 data = dat; 165 data = dat;
119 } 166 }
120} 167}
121void OPimNotify::deref() { 168
122 if ( data->deref() ) { 169
170void OPimNotify::deref()
171{
172 if ( data->deref() )
173 {
123 delete data; 174 delete data;
124 data = 0; 175 data = 0;
125 } 176 }
126} 177}
127 178
179
128/***********************************************************/ 180/***********************************************************/
129struct OPimAlarm::Data : public QShared { 181struct OPimAlarm::Data : public QShared
130 Data() : QShared() { 182{
183 Data() : QShared()
184 {
131 sound = 1; 185 sound = 1;
132 } 186 }
133 int sound; 187 int sound;
134 QString file; 188 QString file;
135}; 189};
190
191
136OPimAlarm::OPimAlarm( int sound, const QDateTime& start, int duration, int parent ) 192OPimAlarm::OPimAlarm( int sound, const QDateTime& start, int duration, int parent )
137 : OPimNotify( start, duration, parent ) 193 : OPimNotify( start, duration, parent )
138{ 194{
139 data = new Data; 195 data = new Data;
140 data->sound = sound; 196 data->sound = sound;
141} 197}
142OPimAlarm::OPimAlarm( const OPimAlarm& al) 198
143 : OPimNotify(al), data( al.data ) 199
200OPimAlarm::OPimAlarm( const OPimAlarm& al )
201 : OPimNotify( al ), data( al.data )
144{ 202{
145 data->ref(); 203 data->ref();
146} 204}
147OPimAlarm::~OPimAlarm() { 205
148 if ( data->deref() ) { 206
207OPimAlarm::~OPimAlarm()
208{
209 if ( data->deref() )
210 {
149 delete data; 211 delete data;
150 data = 0l; 212 data = 0l;
151 } 213 }
152} 214}
153OPimAlarm &OPimAlarm::operator=( const OPimAlarm& al) 215
216
217OPimAlarm &OPimAlarm::operator=( const OPimAlarm& al )
154{ 218{
155 OPimNotify::operator=( al ); 219 OPimNotify::operator=( al );
156 deref(); 220 deref();
157 al.data->ref(); 221 al.data->ref();
158 222
159 data = al.data; 223 data = al.data;
160 224
161 225
162 return *this; 226 return *this;
163} 227}
164bool OPimAlarm::operator==( const OPimAlarm& al) { 228
229
230bool OPimAlarm::operator==( const OPimAlarm& al )
231{
165 if ( data->sound != al.data->sound ) return false; 232 if ( data->sound != al.data->sound ) return false;
166 else if ( data->sound == Custom && data->file != al.data->file ) 233 else if ( data->sound == Custom && data->file != al.data->file )
167 return false; 234 return false;
168 235
169 return OPimNotify::operator==( al ); 236 return OPimNotify::operator==( al );
170} 237}
171QString OPimAlarm::type()const { 238
172 return QString::fromLatin1("OPimAlarm"); 239
240QString OPimAlarm::type() const
241{
242 return QString::fromLatin1( "OPimAlarm" );
173} 243}
174int OPimAlarm::sound()const { 244
245
246int OPimAlarm::sound() const
247{
175 return data->sound; 248 return data->sound;
176} 249}
177QString OPimAlarm::file()const { 250
251
252QString OPimAlarm::file() const
253{
178 return data->file; 254 return data->file;
179} 255}
180void OPimAlarm::setSound( int snd) { 256
257
258void OPimAlarm::setSound( int snd )
259{
181 copyIntern(); 260 copyIntern();
182 data->sound = snd; 261 data->sound = snd;
183} 262}
184void OPimAlarm::setFile( const QString& sound ) { 263
264
265void OPimAlarm::setFile( const QString& sound )
266{
185 copyIntern(); 267 copyIntern();
186 data->file = sound; 268 data->file = sound;
187} 269}
188void OPimAlarm::deref() { 270
189 if ( data->deref() ) { 271
272void OPimAlarm::deref()
273{
274 if ( data->deref() )
275 {
190 delete data; 276 delete data;
191 data = 0l; 277 data = 0l;
192 } 278 }
193} 279}
194void OPimAlarm::copyIntern() { 280
195 if ( data->count != 1 ) { 281
282void OPimAlarm::copyIntern()
283{
284 if ( data->count != 1 )
285 {
196 data->deref(); 286 data->deref();
197 Data *newDat = new Data; 287 Data *newDat = new Data;
198 newDat->sound = data->sound; 288 newDat->sound = data->sound;
199 newDat->file = data->file; 289 newDat->file = data->file;
200 data = newDat; 290 data = newDat;
201 } 291 }
202} 292}
293
294
203/************************/ 295/************************/
204struct OPimReminder::Data : public QShared { 296struct OPimReminder::Data : public QShared
205 Data() : QShared(), record( 0) { 297{
206 } 298 Data() : QShared(), record( 0 )
299 {}
207 int record; 300 int record;
208 301
209}; 302};
210OPimReminder::OPimReminder( int uid, const QDateTime& start, int dur, int parent ) 303
211 : OPimNotify( start, dur, parent ) 304
305OPimReminder::OPimReminder( int uid, const QDateTime& start, int dur, int parent )
306 : OPimNotify( start, dur, parent )
212{ 307{
213 data = new Data; 308 data = new Data;
214 data->record = uid; 309 data->record = uid;
215} 310}
311
312
216OPimReminder::OPimReminder( const OPimReminder& rem ) 313OPimReminder::OPimReminder( const OPimReminder& rem )
217 : OPimNotify( rem ), data( rem.data ) 314 : OPimNotify( rem ), data( rem.data )
218{ 315{
219 data->ref(); 316 data->ref();
220} 317}
221OPimReminder& OPimReminder::operator=( const OPimReminder& rem) { 318
222 OPimNotify::operator=(rem ); 319
320OPimReminder& OPimReminder::operator=( const OPimReminder& rem )
321{
322 OPimNotify::operator=( rem );
223 323
224 deref(); 324 deref();
225 rem.data->ref(); 325 rem.data->ref();
226 data = rem.data; 326 data = rem.data;
227 327
228 return *this; 328 return *this;
229} 329}
230bool OPimReminder::operator==( const OPimReminder& rem) { 330
331
332bool OPimReminder::operator==( const OPimReminder& rem )
333{
231 if ( data->record != rem.data->record ) return false; 334 if ( data->record != rem.data->record ) return false;
232 335
233 return OPimNotify::operator==( rem ); 336 return OPimNotify::operator==( rem );
234} 337}
235QString OPimReminder::type()const { 338
236 return QString::fromLatin1("OPimReminder"); 339
340QString OPimReminder::type() const
341{
342 return QString::fromLatin1( "OPimReminder" );
237} 343}
238int OPimReminder::recordUid()const { 344
345
346int OPimReminder::recordUid() const
347{
239 return data->record; 348 return data->record;
240} 349}
241void OPimReminder::setRecordUid( int uid ) { 350
351
352void OPimReminder::setRecordUid( int uid )
353{
242 copyIntern(); 354 copyIntern();
243 data->record = uid; 355 data->record = uid;
244} 356}
245void OPimReminder::deref() { 357
246 if ( data->deref() ) { 358
359void OPimReminder::deref()
360{
361 if ( data->deref() )
362 {
247 delete data; 363 delete data;
248 data = 0l; 364 data = 0l;
249 } 365 }
250} 366}
251void OPimReminder::copyIntern() { 367
252 if ( data->count != 1 ) { 368
253 Data* da = new Data; 369void OPimReminder::copyIntern()
370{
371 if ( data->count != 1 )
372 {
373 Data * da = new Data;
254 da->record = data->record; 374 da->record = data->record;
255 data = da; 375 data = da;
256 } 376 }
257} 377}
378
258} 379}
diff --git a/libopie2/opiepim/core/opimnotify.h b/libopie2/opiepim/core/opimnotify.h
index fed3970..d0e40ca 100644
--- a/libopie2/opiepim/core/opimnotify.h
+++ b/libopie2/opiepim/core/opimnotify.h
@@ -23,20 +23,22 @@
23 -_. . . )=. = Library General Public License along with 23 -_. . . )=. = Library General Public License along with
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29#ifndef OPIE_PIM_NOTIFY_H
30#define OPIE_PIM_NOTIFY_H
31 29
30#ifndef OPIMNOTIFY_H
31#define OPIMNOTIFY_H
32
33/* QT */
32#include <qdatetime.h> 34#include <qdatetime.h>
33#include <qvaluelist.h> 35#include <qvaluelist.h>
34 36
35 37namespace Opie
36namespace Opie { 38{
37/** 39/**
38 * This is the base class of Notifiers. Possible 40 * This is the base class of Notifiers. Possible
39 * notifiers would be Alarms, Reminders 41 * notifiers would be Alarms, Reminders
40 * What they share is that they have 42 * What they share is that they have
41 * A DateTime, Type, Duration 43 * A DateTime, Type, Duration
42 * This is what this base class takes care of 44 * This is what this base class takes care of
@@ -44,50 +46,52 @@ namespace Opie {
44 */ 46 */
45/* 47/*
46 * TALK to eilers: have a class OPimDuration which sets the Duration 48 * TALK to eilers: have a class OPimDuration which sets the Duration
47 * given on the Due/Start Date? -zecke 49 * given on the Due/Start Date? -zecke
48 * discuss: do we need a uid for the notify? -zecke 50 * discuss: do we need a uid for the notify? -zecke
49 */ 51 */
50class OPimNotify { 52class OPimNotify
51public: 53{
54
55 public:
52 typedef QValueList<OPimNotify> ValueList; 56 typedef QValueList<OPimNotify> ValueList;
53 OPimNotify( const QDateTime& start = QDateTime(), int duration = 0, int parent = 0 ); 57 OPimNotify( const QDateTime& start = QDateTime(), int duration = 0, int parent = 0 );
54 OPimNotify( const OPimNotify& ); 58 OPimNotify( const OPimNotify& );
55 virtual ~OPimNotify(); 59 virtual ~OPimNotify();
56 60
57 OPimNotify &operator=(const OPimNotify& ); 61 OPimNotify &operator=( const OPimNotify& );
58 bool operator==( const OPimNotify& ); 62 bool operator==( const OPimNotify& );
59 63
60 virtual QString type()const = 0; 64 virtual QString type() const = 0;
61 65
62 /** start date */ 66 /** start date */
63 QDateTime dateTime()const; 67 QDateTime dateTime() const;
64 QString service()const; 68 QString service() const;
65 69
66 /** 70 /**
67 * RETURN the parent uid 71 * RETURN the parent uid
68 */ 72 */
69 int parent()const; 73 int parent() const;
70 74
71 /** 75 /**
72 * in Seconds 76 * in Seconds
73 */ 77 */
74 int duration()const; 78 int duration() const;
75 79
76 /** 80 /**
77 * Start Time + Duration 81 * Start Time + Duration
78 */ 82 */
79 QDateTime endTime()const; 83 QDateTime endTime() const;
80 84
81 void setDateTime( const QDateTime& ); 85 void setDateTime( const QDateTime& );
82 void setDuration( int dur ); 86 void setDuration( int dur );
83 void setParent(int uid ); 87 void setParent( int uid );
84 void setService( const QString& ); 88 void setService( const QString& );
85 89
86 90
87private: 91 private:
88 inline void copyIntern(); 92 inline void copyIntern();
89 void deref(); 93 void deref();
90 struct Data; 94 struct Data;
91 Data* data; 95 Data* data;
92 96
93 /* d-pointer */ 97 /* d-pointer */
@@ -97,31 +101,32 @@ private:
97}; 101};
98/** 102/**
99 * An alarm is a sound/mail/buzzer played/send 103 * An alarm is a sound/mail/buzzer played/send
100 * at a given time to inform about 104 * at a given time to inform about
101 * an Event 105 * an Event
102 */ 106 */
103class OPimAlarm : public OPimNotify { 107class OPimAlarm : public OPimNotify
104public: 108{
105 enum Sound{Loud=1, Silent=0, Custom=2 }; 109 public:
110 enum Sound{Loud = 1, Silent = 0, Custom = 2 };
106 OPimAlarm( int sound = Silent, const QDateTime& start = QDateTime(), int duration = 0, int parent = 0 ); 111 OPimAlarm( int sound = Silent, const QDateTime& start = QDateTime(), int duration = 0, int parent = 0 );
107 OPimAlarm( const OPimAlarm& ); 112 OPimAlarm( const OPimAlarm& );
108 ~OPimAlarm(); 113 ~OPimAlarm();
109 114
110 OPimAlarm &operator=( const OPimAlarm& ); 115 OPimAlarm &operator=( const OPimAlarm& );
111 bool operator==( const OPimAlarm& ); 116 bool operator==( const OPimAlarm& );
112 QString type()const; 117 QString type() const;
113 118
114 int sound()const; 119 int sound() const;
115 QString file()const; 120 QString file() const;
116 121
117 void setSound( int ); 122 void setSound( int );
118 /* only when sound is custom... */ 123 /* only when sound is custom... */
119 void setFile( const QString& sound ); 124 void setFile( const QString& sound );
120 125
121private: 126 private:
122 void deref(); 127 void deref();
123 void copyIntern(); 128 void copyIntern();
124 struct Data; 129 struct Data;
125 Data * data; 130 Data * data;
126 131
127 class Private; 132 class Private;
@@ -132,39 +137,39 @@ private:
132/** 137/**
133 * A Reminder will be put into the 138 * A Reminder will be put into the
134 * datebook 139 * datebook
135 * Note that the returned dateTime() may be not valid. 140 * Note that the returned dateTime() may be not valid.
136 * In these cases one must resolve the uid and get the OEvent 141 * In these cases one must resolve the uid and get the OEvent
137 */ 142 */
138class OPimReminder : public OPimNotify { 143class OPimReminder : public OPimNotify
139public: 144{
140 145 public:
141 /** 146 /**
142 * c'tor of a reminder 147 * c'tor of a reminder
143 * @param uid The uid of the Record inside the Datebook 148 * @param uid The uid of the Record inside the Datebook
144 * @param start the StartDate invalid for all day... 149 * @param start the StartDate invalid for all day...
145 * @param duration The duration of the event ( -1 for all day ) 150 * @param duration The duration of the event ( -1 for all day )
146 * @param parent The 'parent' record of this reminder 151 * @param parent The 'parent' record of this reminder
147 */ 152 */
148 OPimReminder( int uid = 0, const QDateTime& start = QDateTime(), 153 OPimReminder( int uid = 0, const QDateTime& start = QDateTime(),
149 int duration = 0, int parent = 0 ); 154 int duration = 0, int parent = 0 );
150 OPimReminder( const OPimReminder& ); 155 OPimReminder( const OPimReminder& );
151 OPimReminder &operator=(const OPimReminder& ); 156 OPimReminder &operator=( const OPimReminder& );
152 157
153 QString type()const; 158 QString type() const;
154 159
155 bool operator==( const OPimReminder& ); 160 bool operator==( const OPimReminder& );
156 161
157 /** 162 /**
158 * the uid of the alarm 163 * the uid of the alarm
159 * inside the 'datebook' application 164 * inside the 'datebook' application
160 */ 165 */
161 int recordUid()const; 166 int recordUid() const;
162 void setRecordUid( int uid ); 167 void setRecordUid( int uid );
163 168
164private: 169 private:
165 void deref(); 170 void deref();
166 void copyIntern(); 171 void copyIntern();
167 172
168 struct Data; 173 struct Data;
169 Data* data; 174 Data* data;
170 class Private; 175 class Private;
diff --git a/libopie2/opiepim/core/opimnotifymanager.cpp b/libopie2/opiepim/core/opimnotifymanager.cpp
index 1771fad..a54d597 100644
--- a/libopie2/opiepim/core/opimnotifymanager.cpp
+++ b/libopie2/opiepim/core/opimnotifymanager.cpp
@@ -23,171 +23,227 @@
23 -_. . . )=. = Library General Public License along with 23 -_. . . )=. = Library General Public License along with
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29#include <opie2/opimnotifymanager.h>
30 29
30#include "opimnotifymanager.h"
31
32/* OPIE */
31#include <opie2/oconversion.h> 33#include <opie2/oconversion.h>
32 34
35/* QT */
33#include <qstringlist.h> 36#include <qstringlist.h>
34 37
35namespace Opie { 38namespace Opie
39{
36 40
37OPimNotifyManager::OPimNotifyManager( const Reminders& rem, const Alarms& al) 41OPimNotifyManager::OPimNotifyManager( const Reminders& rem, const Alarms& al )
38 : m_rem( rem ), m_al( al ) 42 : m_rem( rem ), m_al( al )
39{} 43{}
40OPimNotifyManager::~OPimNotifyManager() { 44
41} 45
46OPimNotifyManager::~OPimNotifyManager()
47{}
48
49
42/* use static_cast and type instead of dynamic... */ 50/* use static_cast and type instead of dynamic... */
43void OPimNotifyManager::add( const OPimNotify& noti) { 51void OPimNotifyManager::add( const OPimNotify& noti )
44 if ( noti.type() == QString::fromLatin1("OPimReminder") ) { 52{
45 const OPimReminder& rem = static_cast<const OPimReminder&>(noti); 53 if ( noti.type() == QString::fromLatin1( "OPimReminder" ) )
54 {
55 const OPimReminder & rem = static_cast<const OPimReminder&>( noti );
46 m_rem.append( rem ); 56 m_rem.append( rem );
47 }else if ( noti.type() == QString::fromLatin1("OPimAlarm") ) { 57 }
48 const OPimAlarm& al = static_cast<const OPimAlarm&>(noti); 58 else if ( noti.type() == QString::fromLatin1( "OPimAlarm" ) )
59 {
60 const OPimAlarm & al = static_cast<const OPimAlarm&>( noti );
49 m_al.append( al ); 61 m_al.append( al );
50 } 62 }
51} 63}
52void OPimNotifyManager::remove( const OPimNotify& noti) { 64
53 if ( noti.type() == QString::fromLatin1("OPimReminder") ) { 65
54 const OPimReminder& rem = static_cast<const OPimReminder&>(noti); 66void OPimNotifyManager::remove( const OPimNotify& noti )
67{
68 if ( noti.type() == QString::fromLatin1( "OPimReminder" ) )
69 {
70 const OPimReminder & rem = static_cast<const OPimReminder&>( noti );
55 m_rem.remove( rem ); 71 m_rem.remove( rem );
56 }else if ( noti.type() == QString::fromLatin1("OPimAlarm") ) { 72 }
57 const OPimAlarm& al = static_cast<const OPimAlarm&>(noti); 73 else if ( noti.type() == QString::fromLatin1( "OPimAlarm" ) )
74 {
75 const OPimAlarm & al = static_cast<const OPimAlarm&>( noti );
58 m_al.remove( al ); 76 m_al.remove( al );
59 } 77 }
60} 78}
61void OPimNotifyManager::replace( const OPimNotify& noti) { 79
62 if ( noti.type() == QString::fromLatin1("OPimReminder") ) { 80
63 const OPimReminder& rem = static_cast<const OPimReminder&>(noti); 81void OPimNotifyManager::replace( const OPimNotify& noti )
82{
83 if ( noti.type() == QString::fromLatin1( "OPimReminder" ) )
84 {
85 const OPimReminder & rem = static_cast<const OPimReminder&>( noti );
64 m_rem.remove( rem ); 86 m_rem.remove( rem );
65 m_rem.append( rem ); 87 m_rem.append( rem );
66 }else if ( noti.type() == QString::fromLatin1("OPimAlarm") ) { 88 }
67 const OPimAlarm& al = static_cast<const OPimAlarm&>(noti); 89 else if ( noti.type() == QString::fromLatin1( "OPimAlarm" ) )
90 {
91 const OPimAlarm & al = static_cast<const OPimAlarm&>( noti );
68 m_al.remove( al ); 92 m_al.remove( al );
69 m_al.append( al ); 93 m_al.append( al );
70 } 94 }
71} 95}
72OPimNotifyManager::Reminders OPimNotifyManager::reminders()const { 96
97
98OPimNotifyManager::Reminders OPimNotifyManager::reminders() const
99{
73 return m_rem; 100 return m_rem;
74} 101}
75OPimNotifyManager::Alarms OPimNotifyManager::alarms()const { 102
103
104OPimNotifyManager::Alarms OPimNotifyManager::alarms() const
105{
76 return m_al; 106 return m_al;
77} 107}
78OPimAlarm OPimNotifyManager::alarmAtDateTime( const QDateTime& when, bool& found ) const {
79 Alarms::ConstIterator it;
80 found = true;
81 108
82 for ( it = m_al.begin(); it != m_al.end(); ++it ){
83 if ( (*it).dateTime() == when )
84 return (*it);
85 }
86 109
87 // Fall through if nothing could be found 110OPimAlarm OPimNotifyManager::alarmAtDateTime( const QDateTime& when, bool& found ) const
88 found = false; 111{
89 OPimAlarm empty; 112 Alarms::ConstIterator it;
90 return empty; 113 found = true;
114
115 for ( it = m_al.begin(); it != m_al.end(); ++it )
116 {
117 if ( ( *it ).dateTime() == when )
118 return ( *it );
119 }
120
121 // Fall through if nothing could be found
122 found = false;
123 OPimAlarm empty;
124 return empty;
91} 125}
92 126
93 127
94void OPimNotifyManager::setAlarms( const Alarms& al) { 128void OPimNotifyManager::setAlarms( const Alarms& al )
129{
95 m_al = al; 130 m_al = al;
96} 131}
97void OPimNotifyManager::setReminders( const Reminders& rem) { 132
133
134void OPimNotifyManager::setReminders( const Reminders& rem )
135{
98 m_rem = rem; 136 m_rem = rem;
99} 137}
138
139
100/* FIXME!!! */ 140/* FIXME!!! */
101/** 141/**
102 * The idea is to check if the provider for our service 142 * The idea is to check if the provider for our service
103 * is online 143 * is online
104 * if it is we will use QCOP 144 * if it is we will use QCOP
105 * if not the Factory to get the backend... 145 * if not the Factory to get the backend...
106 * Qtopia1.6 services would be kewl to have here.... 146 * Qtopia1.6 services would be kewl to have here....
107 */ 147 */
108void OPimNotifyManager::registerNotify( const OPimNotify& ) { 148void OPimNotifyManager::registerNotify( const OPimNotify& )
109 149{
110} 150}
151
152
111/* FIXME!!! */ 153/* FIXME!!! */
112/** 154/**
113 * same as above... 155 * same as above...
114 * Also implement Url model 156 * Also implement Url model
115 * have a MainWindow.... 157 * have a MainWindow....
116 */ 158 */
117void OPimNotifyManager::deregister( const OPimNotify& ) { 159void OPimNotifyManager::deregister( const OPimNotify& )
118 160{
119} 161}
120 162
121bool OPimNotifyManager::isEmpty()const { 163
122 qWarning("is Empty called on OPimNotifyManager %d %d", m_rem.count(), m_al.count() ); 164bool OPimNotifyManager::isEmpty() const
165{
166 qWarning( "is Empty called on OPimNotifyManager %d %d", m_rem.count(), m_al.count() );
123 if ( m_rem.isEmpty() && m_al.isEmpty() ) return true; 167 if ( m_rem.isEmpty() && m_al.isEmpty() ) return true;
124 else return false; 168 else return false;
125} 169}
126 170
127// Taken from otodoaccessxml.. 171
172// Taken from otodoaccessxml.. code duplication bad. any alternative?
128QString OPimNotifyManager::alarmsToString() const 173QString OPimNotifyManager::alarmsToString() const
129{ 174{
130 QString str; 175 QString str;
131 176
132 OPimNotifyManager::Alarms alarms = m_al; 177 OPimNotifyManager::Alarms alarms = m_al;
133 if ( !alarms.isEmpty() ) { 178 if ( !alarms.isEmpty() )
134 QStringList als; 179 {
135 OPimNotifyManager::Alarms::Iterator it = alarms.begin(); 180 QStringList als;
136 for ( ; it != alarms.end(); ++it ) { 181 OPimNotifyManager::Alarms::Iterator it = alarms.begin();
137 /* only if time is valid */ 182 for ( ; it != alarms.end(); ++it )
138 if ( (*it).dateTime().isValid() ) { 183 {
139 als << OConversion::dateTimeToString( (*it).dateTime() ) 184 /* only if time is valid */
140 + ":" + QString::number( (*it).duration() ) 185 if ( ( *it ).dateTime().isValid() )
141 + ":" + QString::number( (*it).sound() ) 186 {
142 + ":"; 187 als << OConversion::dateTimeToString( ( *it ).dateTime() )
143 } 188 + ":" + QString::number( ( *it ).duration() )
144 } 189 + ":" + QString::number( ( *it ).sound() )
145 // now write the list 190 + ":";
146 qWarning("als: %s", als.join("____________").latin1() ); 191 }
147 str = als.join(";"); 192 }
148 } 193 // now write the list
149 194 qWarning( "als: %s", als.join( "____________" ).latin1() );
150 return str; 195 str = als.join( ";" );
196 }
197
198 return str;
151} 199}
200
201
152QString OPimNotifyManager::remindersToString() const 202QString OPimNotifyManager::remindersToString() const
153{ 203{
154 QString str; 204 QString str;
155 205
156 OPimNotifyManager::Reminders reminders = m_rem; 206 OPimNotifyManager::Reminders reminders = m_rem;
157 if (!reminders.isEmpty() ) { 207 if ( !reminders.isEmpty() )
158 OPimNotifyManager::Reminders::Iterator it = reminders.begin(); 208 {
159 QStringList records; 209 OPimNotifyManager::Reminders::Iterator it = reminders.begin();
160 for ( ; it != reminders.end(); ++it ) { 210 QStringList records;
161 records << QString::number( (*it).recordUid() ); 211 for ( ; it != reminders.end(); ++it )
162 } 212 {
163 str = records.join(";"); 213 records << QString::number( ( *it ).recordUid() );
164 } 214 }
215 str = records.join( ";" );
216 }
165 217
166 return str; 218 return str;
167} 219}
168 220
221
169void OPimNotifyManager::alarmsFromString( const QString& str ) 222void OPimNotifyManager::alarmsFromString( const QString& str )
170{ 223{
171 QStringList als = QStringList::split(";", str ); 224 QStringList als = QStringList::split( ";", str );
172 for (QStringList::Iterator it = als.begin(); it != als.end(); ++it ) { 225 for ( QStringList::Iterator it = als.begin(); it != als.end(); ++it )
173 QStringList alarm = QStringList::split(":", (*it), TRUE ); // allow empty 226 {
174 qWarning("alarm: %s", alarm.join("___").latin1() ); 227 QStringList alarm = QStringList::split( ":", ( *it ), TRUE ); // allow empty
175 qWarning("alarm[0]: %s %s", alarm[0].latin1(), 228 qWarning( "alarm: %s", alarm.join( "___" ).latin1() );
176 OConversion::dateTimeFromString( alarm[0] ).toString().latin1() ); 229 qWarning( "alarm[0]: %s %s", alarm[ 0 ].latin1(),
177 OPimAlarm al( alarm[2].toInt(), OConversion::dateTimeFromString( alarm[0] ), 230 OConversion::dateTimeFromString( alarm[ 0 ] ).toString().latin1() );
178 alarm[1].toInt() ); 231 OPimAlarm al( alarm[ 2 ].toInt(), OConversion::dateTimeFromString( alarm[ 0 ] ),
179 add( al ); 232 alarm[ 1 ].toInt() );
180 } 233 add( al );
234 }
181} 235}
182 236
237
183void OPimNotifyManager::remindersFromString( const QString& str ) 238void OPimNotifyManager::remindersFromString( const QString& str )
184{ 239{
185 240
186 QStringList rems = QStringList::split(";", str ); 241 QStringList rems = QStringList::split( ";", str );
187 for (QStringList::Iterator it = rems.begin(); it != rems.end(); ++it ) { 242 for ( QStringList::Iterator it = rems.begin(); it != rems.end(); ++it )
188 OPimReminder rem( (*it).toInt() ); 243 {
189 add( rem ); 244 OPimReminder rem( ( *it ).toInt() );
190 } 245 add( rem );
191 246 }
247
192} 248}
193} 249}
diff --git a/libopie2/opiepim/core/opimnotifymanager.h b/libopie2/opiepim/core/opimnotifymanager.h
index 0272e5d..9241ea2 100644
--- a/libopie2/opiepim/core/opimnotifymanager.h
+++ b/libopie2/opiepim/core/opimnotifymanager.h
@@ -23,50 +23,54 @@
23 -_. . . )=. = Library General Public License along with 23 -_. . . )=. = Library General Public License along with
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29#ifndef OPIE_PIM_NOTIFY_MANAGER_H 29#ifndef OPIMNOTIFYMANAGER_H
30#define OPIE_PIM_NOTIFY_MANAGER_H 30#define OPIMNOTIFYMANAGER_H
31
32#include <qvaluelist.h>
33 31
32/* OPIE */
34#include <opie2/opimnotify.h> 33#include <opie2/opimnotify.h>
35 34
36namespace Opie { 35/* QT */
36#include <qvaluelist.h>
37
38namespace Opie
39{
37/** 40/**
38 * The notify manager keeps track of the Notifiers.... 41 * The notify manager keeps track of the Notifiers....
39 */ 42 */
40class OPimNotifyManager { 43class OPimNotifyManager
41public: 44{
45 public:
42 typedef QValueList<OPimReminder> Reminders; 46 typedef QValueList<OPimReminder> Reminders;
43 typedef QValueList<OPimAlarm> Alarms; 47 typedef QValueList<OPimAlarm> Alarms;
44 OPimNotifyManager( const Reminders& rems = Reminders(), const Alarms& alarms = Alarms() ); 48 OPimNotifyManager( const Reminders& rems = Reminders(), const Alarms& alarms = Alarms() );
45 ~OPimNotifyManager(); 49 ~OPimNotifyManager();
46 50
47 /* we will cast it for you ;) */ 51 /* we will cast it for you ;) */
48 void add( const OPimNotify& ); 52 void add( const OPimNotify& );
49 void remove( const OPimNotify& ); 53 void remove( const OPimNotify& );
50 /* replaces all with this one! */ 54 /* replaces all with this one! */
51 void replace( const OPimNotify& ); 55 void replace( const OPimNotify& );
52 56
53 Reminders reminders()const; 57 Reminders reminders() const;
54 58
55 /** 59 /**
56 * Return 60 * Return
57 */ 61 */
58 Alarms alarms()const; 62 Alarms alarms() const;
59 63
60 /** 64 /**
61 * Return alarm at DateTime "when". If more than one is registered at this 65 * Return alarm at DateTime "when". If more than one is registered at this
62 * DateTime, the first one is returned. 66 * DateTime, the first one is returned.
63 * If none was found, an empty Alarm is returned. 67 * If none was found, an empty Alarm is returned.
64 * @param when The date and time of the returned alarm 68 * @param when The date and time of the returned alarm
65 * @param found Returns true if anything was found. 69 * @param found Returns true if anything was found.
66 * @return Returns the found alarm at given DateTime. It is empty if found is false 70 * @return Returns the found alarm at given DateTime. It is empty if found is false
67 * (nothing could be found at given date and time) 71 * (nothing could be found at given date and time)
68 */ 72 */
69 OPimAlarm alarmAtDateTime( const QDateTime& when, bool& found ) const; 73 OPimAlarm alarmAtDateTime( const QDateTime& when, bool& found ) const;
70 74
71 void setAlarms( const Alarms& ); 75 void setAlarms( const Alarms& );
72 void setReminders( const Reminders& ); 76 void setReminders( const Reminders& );
@@ -80,38 +84,36 @@ public:
80 84
81 /** 85 /**
82 * this will do the opposite.. 86 * this will do the opposite..
83 */ 87 */
84 void deregister( const OPimNotify& ); 88 void deregister( const OPimNotify& );
85 89
86 bool isEmpty()const; 90 bool isEmpty() const;
87 91
88 /** 92 /**
89 * Return all alarms as string 93 * Return all alarms as string
90 */ 94 */
91 QString alarmsToString() const; 95 QString alarmsToString() const;
92 /** 96 /**
93 * Return all notifiers as string 97 * Return all notifiers as string
94 */ 98 */
95 QString remindersToString() const; 99 QString remindersToString() const;
96 100
97 /** 101 /**
98 * Convert string to alarms 102 * Convert string to alarms
99 * @param str String created by alarmsToString() 103 * @param str String created by alarmsToString()
100 */ 104 */
101 void alarmsFromString( const QString& str ); 105 void alarmsFromString( const QString& str );
102 106
103 /** 107 /**
104 * Convert string to reminders 108 * Convert string to reminders
105 * @param str String created by remindersToString() 109 * @param str String created by remindersToString()
106 */ 110 */
107 void remindersFromString( const QString& str ); 111 void remindersFromString( const QString& str );
108 112
109 113 private:
110
111private:
112 Reminders m_rem; 114 Reminders m_rem;
113 Alarms m_al; 115 Alarms m_al;
114 116
115 class Private; 117 class Private;
116 Private *d; 118 Private *d;
117 119
diff --git a/libopie2/opiepim/core/opimrecord.cpp b/libopie2/opiepim/core/opimrecord.cpp
index 72bb372..c603f44 100644
--- a/libopie2/opiepim/core/opimrecord.cpp
+++ b/libopie2/opiepim/core/opimrecord.cpp
@@ -23,73 +23,98 @@
23 -_. . . )=. = Library General Public License along with 23 -_. . . )=. = Library General Public License along with
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29#include <qarray.h>
30 29
30#include "opimrecord.h"
31
32/* OPIE */
31#include <qpe/categories.h> 33#include <qpe/categories.h>
32#include <qpe/categoryselect.h> 34#include <qpe/categoryselect.h>
33 35
34#include <opie2/opimrecord.h> 36/* QT */
37#include <qarray.h>
35 38
36namespace Opie { 39namespace Opie
40{
37Qtopia::UidGen OPimRecord::m_uidGen( Qtopia::UidGen::Qtopia ); 41Qtopia::UidGen OPimRecord::m_uidGen( Qtopia::UidGen::Qtopia );
38 42
39 43
40OPimRecord::OPimRecord( int uid ) 44OPimRecord::OPimRecord( int uid )
41 : Qtopia::Record() { 45 : Qtopia::Record()
46{
42 47
43 m_lastHit = -1; 48 m_lastHit = -1;
44 setUid( uid ); 49 setUid( uid );
45} 50}
46OPimRecord::~OPimRecord() { 51
47} 52
53OPimRecord::~OPimRecord()
54{}
55
56
48OPimRecord::OPimRecord( const OPimRecord& rec ) 57OPimRecord::OPimRecord( const OPimRecord& rec )
49 : Qtopia::Record( rec ) 58 : Qtopia::Record( rec )
50{ 59{
51 (*this) = rec; 60 ( *this ) = rec;
52} 61}
53 62
54OPimRecord &OPimRecord::operator=( const OPimRecord& rec) { 63
55 if ( this == &rec ) return *this; 64OPimRecord &OPimRecord::operator=( const OPimRecord& rec )
65{
66 if ( this == &rec ) return * this;
56 67
57 Qtopia::Record::operator=( rec ); 68 Qtopia::Record::operator=( rec );
58 m_xrefman = rec.m_xrefman; 69 m_xrefman = rec.m_xrefman;
59 m_lastHit = rec.m_lastHit; 70 m_lastHit = rec.m_lastHit;
60 71
61 return *this; 72 return *this;
62} 73}
74
75
63/* 76/*
64 * category names 77 * category names
65 */ 78 */
66QStringList OPimRecord::categoryNames( const QString& appname ) const { 79QStringList OPimRecord::categoryNames( const QString& appname ) const
80{
67 QStringList list; 81 QStringList list;
68 QArray<int> cats = categories(); 82 QArray<int> cats = categories();
69 Categories catDB; 83 Categories catDB;
70 catDB.load( categoryFileName() ); 84 catDB.load( categoryFileName() );
71 85
72 for (uint i = 0; i < cats.count(); i++ ) { 86 for ( uint i = 0; i < cats.count(); i++ )
73 list << catDB.label( appname, cats[i] ); 87 {
88 list << catDB.label( appname, cats[ i ] );
74 } 89 }
75 90
76 return list; 91 return list;
77} 92}
78void OPimRecord::setCategoryNames( const QStringList& ) {
79 93
94
95void OPimRecord::setCategoryNames( const QStringList& )
96{
80} 97}
81void OPimRecord::addCategoryName( const QString& ) { 98
99
100void OPimRecord::addCategoryName( const QString& )
101{
82 Categories catDB; 102 Categories catDB;
83 catDB.load( categoryFileName() ); 103 catDB.load( categoryFileName() );
84 104
85 105
86} 106}
87bool OPimRecord::isEmpty()const { 107
108
109bool OPimRecord::isEmpty() const
110{
88 return ( uid() == 0 ); 111 return ( uid() == 0 );
89} 112}
113
114
90/*QString OPimRecord::crossToString()const { 115/*QString OPimRecord::crossToString()const {
91 QString str; 116 QString str;
92 QMap<QString, QArray<int> >::ConstIterator it; 117 QMap<QString, QArray<int> >::ConstIterator it;
93 for (it = m_relations.begin(); it != m_relations.end(); ++it ) { 118 for (it = m_relations.begin(); it != m_relations.end(); ++it ) {
94 QArray<int> id = it.data(); 119 QArray<int> id = it.data();
95 for ( uint i = 0; i < id.size(); ++i ) { 120 for ( uint i = 0; i < id.size(); ++i ) {
@@ -99,92 +124,116 @@ bool OPimRecord::isEmpty()const {
99 str = str.remove( str.length()-1, 1); // strip the ; 124 str = str.remove( str.length()-1, 1); // strip the ;
100 //qWarning("IDS " + str ); 125 //qWarning("IDS " + str );
101 126
102 return str; 127 return str;
103 }*/ 128 }*/
104/* if uid = 1 assign a new one */ 129/* if uid = 1 assign a new one */
105void OPimRecord::setUid( int uid ) { 130void OPimRecord::setUid( int uid )
106 if ( uid == 1) 131{
132 if ( uid == 1 )
107 uid = uidGen().generate(); 133 uid = uidGen().generate();
108 134
109 Qtopia::Record::setUid( uid ); 135 Qtopia::Record::setUid( uid );
110}; 136};
111Qtopia::UidGen &OPimRecord::uidGen() { 137
138
139Qtopia::UidGen &OPimRecord::uidGen()
140{
112 return m_uidGen; 141 return m_uidGen;
113} 142}
114OPimXRefManager &OPimRecord::xrefmanager() { 143
144
145OPimXRefManager &OPimRecord::xrefmanager()
146{
115 return m_xrefman; 147 return m_xrefman;
116} 148}
117int OPimRecord::rtti(){ 149
150
151int OPimRecord::rtti()
152{
118 return 0; 153 return 0;
119} 154}
120 155
121/** 156/**
122 * now let's put our data into the stream 157 * now let's put our data into the stream
123 */ 158 */
124/* 159/*
125 * First read UID 160 * First read UID
126 * Categories 161 * Categories
127 * XRef 162 * XRef
128 */ 163 */
129bool OPimRecord::loadFromStream( QDataStream& stream ) { 164bool OPimRecord::loadFromStream( QDataStream& stream )
165{
130 int Int; 166 int Int;
131 uint UInt; 167 uint UInt;
132 stream >> Int; 168 stream >> Int;
133 setUid(Int); 169 setUid( Int );
134 170
135 /** Categories */ 171 /** Categories */
136 stream >> UInt; 172 stream >> UInt;
137 QArray<int> array(UInt); 173 QArray<int> array( UInt );
138 for (uint i = 0; i < UInt; i++ ) { 174 for ( uint i = 0; i < UInt; i++ )
139 stream >> array[i]; 175 {
176 stream >> array[ i ];
140 } 177 }
141 setCategories( array ); 178 setCategories( array );
142 179
143 /* 180 /*
144 * now we do the X-Ref stuff 181 * now we do the X-Ref stuff
145 */ 182 */
146 OPimXRef xref; 183 OPimXRef xref;
147 stream >> UInt; 184 stream >> UInt;
148 for ( uint i = 0; i < UInt; i++ ) { 185 for ( uint i = 0; i < UInt; i++ )
186 {
149 xref.setPartner( OPimXRef::One, partner( stream ) ); 187 xref.setPartner( OPimXRef::One, partner( stream ) );
150 xref.setPartner( OPimXRef::Two, partner( stream ) ); 188 xref.setPartner( OPimXRef::Two, partner( stream ) );
151 m_xrefman.add( xref ); 189 m_xrefman.add( xref );
152 } 190 }
153 191
154 return true; 192 return true;
155} 193}
156bool OPimRecord::saveToStream( QDataStream& stream )const { 194
195
196bool OPimRecord::saveToStream( QDataStream& stream ) const
197{
157 /** UIDs */ 198 /** UIDs */
158 199
159 stream << uid(); 200 stream << uid();
160 201
161 /** Categories */ 202 /** Categories */
162 stream << categories().count(); 203 stream << categories().count();
163 for ( uint i = 0; i < categories().count(); i++ ) { 204 for ( uint i = 0; i < categories().count(); i++ )
164 stream << categories()[i]; 205 {
206 stream << categories() [ i ];
165 } 207 }
166 208
167 /* 209 /*
168 * first the XRef count 210 * first the XRef count
169 * then the xrefs 211 * then the xrefs
170 */ 212 */
171 stream << m_xrefman.list().count(); 213 stream << m_xrefman.list().count();
172 for ( OPimXRef::ValueList::ConstIterator it = m_xrefman.list().begin(); 214 for ( OPimXRef::ValueList::ConstIterator it = m_xrefman.list().begin();
173 it != m_xrefman.list().end(); ++it ) { 215 it != m_xrefman.list().end(); ++it )
174 flush( (*it).partner( OPimXRef::One), stream ); 216 {
175 flush( (*it).partner( OPimXRef::Two), stream ); 217 flush( ( *it ).partner( OPimXRef::One ), stream );
218 flush( ( *it ).partner( OPimXRef::Two ), stream );
176 } 219 }
177 return true; 220 return true;
178} 221}
179void OPimRecord::flush( const OPimXRefPartner& par, QDataStream& str ) const{ 222
223
224void OPimRecord::flush( const OPimXRefPartner& par, QDataStream& str ) const
225{
180 str << par.service(); 226 str << par.service();
181 str << par.uid(); 227 str << par.uid();
182 str << par.field(); 228 str << par.field();
183} 229}
184OPimXRefPartner OPimRecord::partner( QDataStream& stream ) { 230
231
232OPimXRefPartner OPimRecord::partner( QDataStream& stream )
233{
185 OPimXRefPartner par; 234 OPimXRefPartner par;
186 QString str; 235 QString str;
187 int i; 236 int i;
188 237
189 stream >> str; 238 stream >> str;
190 par.setService( str ); 239 par.setService( str );
@@ -194,20 +243,32 @@ OPimXRefPartner OPimRecord::partner( QDataStream& stream ) {
194 243
195 stream >> i ; 244 stream >> i ;
196 par.setField( i ); 245 par.setField( i );
197 246
198 return par; 247 return par;
199} 248}
200void OPimRecord::setLastHitField( int lastHit )const { 249
250
251void OPimRecord::setLastHitField( int lastHit ) const
252{
201 m_lastHit = lastHit; 253 m_lastHit = lastHit;
202} 254}
203int OPimRecord::lastHitField()const{ 255
256
257int OPimRecord::lastHitField() const
258{
204 return m_lastHit; 259 return m_lastHit;
205} 260}
206QMap<QString, QString> OPimRecord::toExtraMap()const { 261
262
263QMap<QString, QString> OPimRecord::toExtraMap() const
264{
207 return customMap; 265 return customMap;
208} 266}
209void OPimRecord::setExtraMap( const QMap<QString, QString>& map) { 267
268
269void OPimRecord::setExtraMap( const QMap<QString, QString>& map )
270{
210 customMap = map; 271 customMap = map;
211} 272}
212 273
213} 274}
diff --git a/libopie2/opiepim/core/opimrecord.h b/libopie2/opiepim/core/opimrecord.h
index 63a3a98..4981a41 100644
--- a/libopie2/opiepim/core/opimrecord.h
+++ b/libopie2/opiepim/core/opimrecord.h
@@ -23,43 +23,47 @@
23 -_. . . )=. = Library General Public License along with 23 -_. . . )=. = Library General Public License along with
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29#ifndef OPIE_PIM_RECORD_H
30#define OPIE_PIM_RECORD_H
31 29
32#include <qdatastream.h> 30#ifndef OPIMRECORD_H
33#include <qmap.h> 31#define OPIMRECORD_H
34#include <qstring.h>
35#include <qstringlist.h>
36 32
33/* OPIE */
34#include <opie2/opimxrefmanager.h>
37/* 35/*
38 * we need to get customMap which is private... 36 * we need to get customMap which is private...
39 */ 37 */
40#define private protected 38#define private protected
41#include <qpe/palmtoprecord.h> 39#include <qpe/palmtoprecord.h>
42#undef private 40#undef private
43 41
44#include <opie2/opimxrefmanager.h> 42/* QT */
43#include <qdatastream.h>
44#include <qmap.h>
45#include <qstring.h>
46#include <qstringlist.h>
45 47
46namespace Opie { 48namespace Opie
49{
47/** 50/**
48 * This is the base class for 51 * This is the base class for
49 * all PIM Records 52 * all PIM Records
50 * 53 *
51 */ 54 */
52class OPimRecord : public Qtopia::Record { 55class OPimRecord : public Qtopia::Record
53public: 56{
57 public:
54 /** 58 /**
55 * c'tor 59 * c'tor
56 * uid of 0 isEmpty 60 * uid of 0 isEmpty
57 * uid of 1 will be assigned a new one 61 * uid of 1 will be assigned a new one
58 */ 62 */
59 OPimRecord(int uid = 0); 63 OPimRecord( int uid = 0 );
60 ~OPimRecord(); 64 ~OPimRecord();
61 65
62 /** 66 /**
63 * copy c'tor 67 * copy c'tor
64 */ 68 */
65 OPimRecord( const OPimRecord& rec ); 69 OPimRecord( const OPimRecord& rec );
@@ -69,13 +73,13 @@ public:
69 */ 73 */
70 OPimRecord &operator=( const OPimRecord& ); 74 OPimRecord &operator=( const OPimRecord& );
71 75
72 /** 76 /**
73 * category names resolved 77 * category names resolved
74 */ 78 */
75 QStringList categoryNames( const QString& appname )const; 79 QStringList categoryNames( const QString& appname ) const;
76 80
77 /** 81 /**
78 * set category names they will be resolved 82 * set category names they will be resolved
79 */ 83 */
80 void setCategoryNames( const QStringList& ); 84 void setCategoryNames( const QStringList& );
81 85
@@ -86,59 +90,61 @@ public:
86 void addCategoryName( const QString& ); 90 void addCategoryName( const QString& );
87 91
88 /** 92 /**
89 * if a Record isEmpty 93 * if a Record isEmpty
90 * it's empty if it's 0 94 * it's empty if it's 0
91 */ 95 */
92 virtual bool isEmpty()const; 96 virtual bool isEmpty() const;
93 97
94 /** 98 /**
95 * toRichText summary 99 * toRichText summary
96 */ 100 */
97 virtual QString toRichText()const = 0; 101 virtual QString toRichText() const = 0;
98 102
99 /** 103 /**
100 * a small one line summary 104 * a small one line summary
101 */ 105 */
102 virtual QString toShortText()const = 0; 106 virtual QString toShortText() const = 0;
103 107
104 /** 108 /**
105 * the name of the Record 109 * the name of the Record
106 */ 110 */
107 virtual QString type()const = 0; 111 virtual QString type() const = 0;
108 112
109 /** 113 /**
110 * matches the Records the regular expression? 114 * matches the Records the regular expression?
111 */ 115 */
112 virtual bool match( const QString &regexp ) const 116 virtual bool match( const QString &regexp ) const
113 {setLastHitField( -1 ); 117 {
114 return Qtopia::Record::match(QRegExp(regexp));}; 118 setLastHitField( -1 );
119 return Qtopia::Record::match( QRegExp( regexp ) );
120 };
115 121
116 /** 122 /**
117 * if implemented this function returns which item has been 123 * if implemented this function returns which item has been
118 * last hit by the match() function. 124 * last hit by the match() function.
119 * or -1 if not implemented or no hit has occured 125 * or -1 if not implemented or no hit has occured
120 */ 126 */
121 int lastHitField()const; 127 int lastHitField() const;
122 128
123 /** 129 /**
124 * converts the internal structure to a map 130 * converts the internal structure to a map
125 */ 131 */
126 virtual QMap<int, QString> toMap()const = 0; 132 virtual QMap<int, QString> toMap() const = 0;
127 // virtual fromMap( const <int, QString>& map ) = 0; // Should be added in the future (eilers) 133 // virtual fromMap( const <int, QString>& map ) = 0; // Should be added in the future (eilers)
128 134
129 /** 135 /**
130 * key value representation of extra items 136 * key value representation of extra items
131 */ 137 */
132 QMap<QString, QString> toExtraMap()const; 138 QMap<QString, QString> toExtraMap() const;
133 void setExtraMap( const QMap<QString, QString>& ); 139 void setExtraMap( const QMap<QString, QString>& );
134 140
135 /** 141 /**
136 * the name for a recordField 142 * the name for a recordField
137 */ 143 */
138 virtual QString recordField(int)const = 0; 144 virtual QString recordField( int ) const = 0;
139 145
140 /** 146 /**
141 * returns a reference of the 147 * returns a reference of the
142 * Cross Reference Manager 148 * Cross Reference Manager
143 * Partner 'One' is THIS PIM RECORD! 149 * Partner 'One' is THIS PIM RECORD!
144 * 'Two' is the Partner where we link to 150 * 'Two' is the Partner where we link to
@@ -158,30 +164,30 @@ public:
158 164
159 /** 165 /**
160 * some marshalling and de marshalling code 166 * some marshalling and de marshalling code
161 * saves the OPimRecord 167 * saves the OPimRecord
162 * to and from a DataStream 168 * to and from a DataStream
163 */ 169 */
164 virtual bool loadFromStream(QDataStream& ); 170 virtual bool loadFromStream( QDataStream& );
165 virtual bool saveToStream( QDataStream& stream )const; 171 virtual bool saveToStream( QDataStream& stream ) const;
166 172
167protected: 173 protected:
168 // need to be const cause it is called from const methods 174 // need to be const cause it is called from const methods
169 mutable int m_lastHit; 175 mutable int m_lastHit;
170 void setLastHitField( int lastHit )const; 176 void setLastHitField( int lastHit ) const;
171 Qtopia::UidGen &uidGen(); 177 Qtopia::UidGen &uidGen();
172// QString crossToString()const; 178 // QString crossToString()const;
173 179
174private: 180 private:
175 class OPimRecordPrivate; 181 class OPimRecordPrivate;
176 OPimRecordPrivate *d; 182 OPimRecordPrivate *d;
177 OPimXRefManager m_xrefman; 183 OPimXRefManager m_xrefman;
178 static Qtopia::UidGen m_uidGen; 184 static Qtopia::UidGen m_uidGen;
179 185
180private: 186 private:
181 void flush( const OPimXRefPartner&, QDataStream& stream )const; 187 void flush( const OPimXRefPartner&, QDataStream& stream ) const;
182 OPimXRefPartner partner( QDataStream& ); 188 OPimXRefPartner partner( QDataStream& );
183}; 189};
184 190
185} 191}
186 192
187#endif 193#endif
diff --git a/libopie2/opiepim/ocontact.cpp b/libopie2/opiepim/ocontact.cpp
index f1a22a7..fa5313f 100644
--- a/libopie2/opiepim/ocontact.cpp
+++ b/libopie2/opiepim/ocontact.cpp
@@ -1,9 +1,9 @@
1/* 1/*
2 This file is part of the Opie Project 2 This file is part of the Opie Project
3 Copyright (C) The Main Author <main-author@whereever.org> 3 Copyright (C) Stefan Eilers <eilers.stefan@epost.de>
4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org> 4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org>
5 .=l. 5 .=l.
6 .>+-= 6 .>+-=
7 _;:, .> :=|. This program is free software; you can 7 _;:, .> :=|. This program is free software; you can
8.> <`_, > . <= redistribute it and/or modify it under 8.> <`_, > . <= redistribute it and/or modify it under
9:`=1 )Y*s>-.-- : the terms of the GNU Library General Public 9:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
@@ -24,47 +24,31 @@
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29 29
30/**********************************************************************
31** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
32** Copyright (C) 2002-2003 by Stefan Eilers (eilers.stefan@epost.de)
33**
34** This file may be distributed and/or modified under the terms of the
35** GNU General Public License version 2 as published by the Free Software
36** Foundation and appearing in the file LICENSE.GPL included in the
37** packaging of this file.
38**
39** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
40** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
41**
42** See http://www.trolltech.com/gpl/ for GPL licensing information.
43**
44** Contact info@trolltech.com if any conditions of this licensing are
45** not clear to you.
46**
47**********************************************************************/
48
49#define QTOPIA_INTERNAL_CONTACT_MRE 30#define QTOPIA_INTERNAL_CONTACT_MRE
50 31
51#include <opie2/ocontact.h> 32#include "ocontact.h"
33
34/* OPIE */
52#include <opie2/opimresolver.h> 35#include <opie2/opimresolver.h>
53#include <opie2/oconversion.h> 36#include <opie2/oconversion.h>
54
55#include <qpe/stringutil.h> 37#include <qpe/stringutil.h>
56#include <qpe/timestring.h> 38#include <qpe/timestring.h>
57#include <qpe/config.h> 39#include <qpe/config.h>
58 40
41/* QT */
59#include <qobject.h> 42#include <qobject.h>
60#include <qregexp.h> 43#include <qregexp.h>
61#include <qstylesheet.h> 44#include <qstylesheet.h>
62#include <qfileinfo.h> 45#include <qfileinfo.h>
63#include <qmap.h> 46#include <qmap.h>
64 47
48/* STD */
65#include <stdio.h> 49#include <stdio.h>
66 50
67/*! 51/*!
68 \class Contact contact.h 52 \class Contact contact.h
69 \brief The Contact class holds the data of an address book entry. 53 \brief The Contact class holds the data of an address book entry.
70 54
@@ -73,51 +57,50 @@
73 57
74 \ingroup qtopiaemb 58 \ingroup qtopiaemb
75 \ingroup qtopiadesktop 59 \ingroup qtopiadesktop
76*/ 60*/
77 61
78 62
79namespace Opie { 63namespace Opie
64{
80/*! 65/*!
81 Creates a new, empty contact. 66 Creates a new, empty contact.
82*/ 67*/
83OContact::OContact() 68OContact::OContact():OPimRecord(), mMap(), d( 0 )
84 : OPimRecord(), mMap(), d( 0 ) 69{}
85{
86}
87 70
88/*! 71/*!
89 \internal 72 \internal
90 Creates a new contact. The properties of the contact are 73 Creates a new contact. The properties of the contact are
91 set from \a fromMap. 74 set from \a fromMap.
92*/ 75*/
93OContact::OContact( const QMap<int, QString> &fromMap ) : 76OContact::OContact( const QMap<int, QString> &fromMap ):OPimRecord(), mMap( fromMap ), d( 0 )
94 OPimRecord(), mMap( fromMap ), d( 0 )
95{ 77{
96 QString cats = mMap[ Qtopia::AddressCategory ]; 78 QString cats = mMap[ Qtopia::AddressCategory ];
97 if ( !cats.isEmpty() ) 79 if ( !cats.isEmpty() )
98 setCategories( idsFromString( cats ) ); 80 setCategories( idsFromString( cats ) );
99 81
100 QString uidStr = find( Qtopia::AddressUid ); 82 QString uidStr = find( Qtopia::AddressUid );
101 83
102 if ( uidStr.isEmpty() || (uidStr.toInt() == 0) ){ 84 if ( uidStr.isEmpty() || ( uidStr.toInt() == 0 ) )
103 qWarning( "Invalid UID found. Generate new one.." ); 85 {
104 setUid( uidGen().generate() ); 86 qWarning( "Invalid UID found. Generate new one.." );
105 }else 87 setUid( uidGen().generate() );
106 setUid( uidStr.toInt() ); 88 }
89 else
90 setUid( uidStr.toInt() );
107 91
108// if ( !uidStr.isEmpty() ) 92 // if ( !uidStr.isEmpty() )
109 // setUid( uidStr.toInt() ); 93 // setUid( uidStr.toInt() );
110} 94}
111 95
112/*! 96/*!
113 Destroys a contact. 97 Destroys a contact.
114*/ 98*/
115OContact::~OContact() 99OContact::~OContact()
116{ 100{}
117}
118 101
119/*! \fn void OContact::setTitle( const QString &str ) 102/*! \fn void OContact::setTitle( const QString &str )
120 Sets the title of the contact to \a str. 103 Sets the title of the contact to \a str.
121*/ 104*/
122 105
123/*! \fn void OContact::setFirstName( const QString &str ) 106/*! \fn void OContact::setFirstName( const QString &str )
@@ -452,13 +435,13 @@ OContact::~OContact()
452*/ 435*/
453QMap<int, QString> OContact::toMap() const 436QMap<int, QString> OContact::toMap() const
454{ 437{
455 QMap<int, QString> map = mMap; 438 QMap<int, QString> map = mMap;
456 QString cats = idsToString( categories() ); 439 QString cats = idsToString( categories() );
457 if ( !cats.isEmpty() ) 440 if ( !cats.isEmpty() )
458 map.insert( Qtopia::AddressCategory, cats ); 441 map.insert( Qtopia::AddressCategory, cats );
459 return map; 442 return map;
460} 443}
461 444
462/*! 445/*!
463 Returns a rich text formatted QString representing the contents the contact. 446 Returns a rich text formatted QString representing the contents the contact.
464*/ 447*/
@@ -466,366 +449,412 @@ QString OContact::toRichText() const
466{ 449{
467 QString text; 450 QString text;
468 QString value, comp, state; 451 QString value, comp, state;
469 QString str; 452 QString str;
470 bool marker = false; 453 bool marker = false;
471 454
472 Config cfg("qpe"); 455 Config cfg( "qpe" );
473 cfg.setGroup("Appearance"); 456 cfg.setGroup( "Appearance" );
474 int addressformat = cfg.readNumEntry( "AddressFormat", Zip_City_State ); 457 int addressformat = cfg.readNumEntry( "AddressFormat", Zip_City_State );
475 458
476 // name, jobtitle and company 459 // name, jobtitle and company
477 if ( !(value = fullName()).isEmpty() ) 460 if ( !( value = fullName() ).isEmpty() )
478 text += "<b><h3><img src=\"addressbook/AddressBook\"> " + Qtopia::escapeString(value) + "</h3></b>"; 461 text += "<b><h3><img src=\"addressbook/AddressBook\"> " + Qtopia::escapeString( value ) + "</h3></b>";
479 462
480 if ( !(value = jobTitle()).isEmpty() ) 463 if ( !( value = jobTitle() ).isEmpty() )
481 text += Qtopia::escapeString(value) + " "; 464 text += Qtopia::escapeString( value ) + " ";
482 465
483 comp = company(); 466 comp = company();
484 if ( !(value = department()).isEmpty() ) { 467 if ( !( value = department() ).isEmpty() )
485 text += Qtopia::escapeString(value); 468 {
486 if ( comp ) 469 text += Qtopia::escapeString( value );
487 text += ", " + Qtopia::escapeString(comp); 470 if ( comp )
488 }else if ( comp ) 471 text += ", " + Qtopia::escapeString( comp );
489 text += "<br>" + Qtopia::escapeString(comp); 472 }
473 else if ( comp )
474 text += "<br>" + Qtopia::escapeString( comp );
490 text += "<br><hr>"; 475 text += "<br><hr>";
491 476
492 // defailt email 477 // defailt email
493 QString defEmail = defaultEmail(); 478 QString defEmail = defaultEmail();
494 if ( !defEmail.isEmpty() ){ 479 if ( !defEmail.isEmpty() )
495 text += "<b><img src=\"addressbook/email\"> " + QObject::tr("Default Email: ") + "</b>" 480 {
496 + Qtopia::escapeString(defEmail); 481 text += "<b><img src=\"addressbook/email\"> " + QObject::tr( "Default Email: " ) + "</b>"
497 marker = true; 482 + Qtopia::escapeString( defEmail );
483 marker = true;
498 } 484 }
499 485
500 // business address 486 // business address
501 if ( !businessStreet().isEmpty() || !businessCity().isEmpty() || 487 if ( !businessStreet().isEmpty() || !businessCity().isEmpty() ||
502 !businessZip().isEmpty() || !businessCountry().isEmpty() ) { 488 !businessZip().isEmpty() || !businessCountry().isEmpty() )
503 text += QObject::tr( "<br><b>Work Address:</b>" ); 489 {
504 marker = true; 490 text += QObject::tr( "<br><b>Work Address:</b>" );
491 marker = true;
505 } 492 }
506 493
507 if ( !(value = businessStreet()).isEmpty() ){ 494 if ( !( value = businessStreet() ).isEmpty() )
508 text += "<br>" + Qtopia::escapeString(value); 495 {
509 marker = true; 496 text += "<br>" + Qtopia::escapeString( value );
497 marker = true;
510 } 498 }
511 499
512 switch( addressformat ){ 500 switch ( addressformat )
513 case Zip_City_State:{ // Zip_Code City, State 501 {
514 state = businessState(); 502 case Zip_City_State:
515 if ( !(value = businessZip()).isEmpty() ){ 503 { // Zip_Code City, State
516 text += "<br>" + Qtopia::escapeString(value) + " "; 504 state = businessState();
517 marker = true; 505 if ( !( value = businessZip() ).isEmpty() )
518 506 {
519 } 507 text += "<br>" + Qtopia::escapeString( value ) + " ";
520 if ( !(value = businessCity()).isEmpty() ) { 508 marker = true;
521 marker = true; 509
522 if ( businessZip().isEmpty() && !businessStreet().isEmpty() ) 510 }
523 text += "<br>"; 511 if ( !( value = businessCity() ).isEmpty() )
524 text += Qtopia::escapeString(value); 512 {
525 if ( state ) 513 marker = true;
526 text += ", " + Qtopia::escapeString(state); 514 if ( businessZip().isEmpty() && !businessStreet().isEmpty() )
527 } else if ( !state.isEmpty() ){ 515 text += "<br>";
528 text += "<br>" + Qtopia::escapeString(state); 516 text += Qtopia::escapeString( value );
529 marker = true; 517 if ( state )
530 } 518 text += ", " + Qtopia::escapeString( state );
531 break; 519 }
532 } 520 else if ( !state.isEmpty() )
533 case City_State_Zip:{ // City, State Zip_Code 521 {
534 state = businessState(); 522 text += "<br>" + Qtopia::escapeString( state );
535 if ( !(value = businessCity()).isEmpty() ) { 523 marker = true;
536 marker = true; 524 }
537 text += "<br>" + Qtopia::escapeString(value); 525 break;
538 if ( state ) 526 }
539 text += ", " + Qtopia::escapeString(state); 527 case City_State_Zip:
540 } else if ( !state.isEmpty() ){ 528 { // City, State Zip_Code
541 text += "<br>" + Qtopia::escapeString(state); 529 state = businessState();
542 marker = true; 530 if ( !( value = businessCity() ).isEmpty() )
543 } 531 {
544 if ( !(value = businessZip()).isEmpty() ){ 532 marker = true;
545 text += " " + Qtopia::escapeString(value); 533 text += "<br>" + Qtopia::escapeString( value );
546 marker = true; 534 if ( state )
547 } 535 text += ", " + Qtopia::escapeString( state );
548 break; 536 }
549 } 537 else if ( !state.isEmpty() )
538 {
539 text += "<br>" + Qtopia::escapeString( state );
540 marker = true;
541 }
542 if ( !( value = businessZip() ).isEmpty() )
543 {
544 text += " " + Qtopia::escapeString( value );
545 marker = true;
546 }
547 break;
548 }
550 } 549 }
551 550
552 if ( !(value = businessCountry()).isEmpty() ){ 551 if ( !( value = businessCountry() ).isEmpty() )
553 text += "<br>" + Qtopia::escapeString(value); 552 {
554 marker = true; 553 text += "<br>" + Qtopia::escapeString( value );
554 marker = true;
555 } 555 }
556 556
557 // rest of Business data 557 // rest of Business data
558 str = office(); 558 str = office();
559 if ( !str.isEmpty() ){ 559 if ( !str.isEmpty() )
560 text += "<br><b>" + QObject::tr("Office: ") + "</b>" 560 {
561 + Qtopia::escapeString(str); 561 text += "<br><b>" + QObject::tr( "Office: " ) + "</b>"
562 marker = true; 562 + Qtopia::escapeString( str );
563 marker = true;
563 } 564 }
564 str = businessWebpage(); 565 str = businessWebpage();
565 if ( !str.isEmpty() ){ 566 if ( !str.isEmpty() )
566 text += "<br><b><img src=\"addressbook/webpagework\"> " + QObject::tr("Business Web Page: ") + "</b>" 567 {
567 + Qtopia::escapeString(str); 568 text += "<br><b><img src=\"addressbook/webpagework\"> " + QObject::tr( "Business Web Page: " ) + "</b>"
568 marker = true; 569 + Qtopia::escapeString( str );
570 marker = true;
569 } 571 }
570 str = businessPhone(); 572 str = businessPhone();
571 if ( !str.isEmpty() ){ 573 if ( !str.isEmpty() )
572 text += "<br><b><img src=\"addressbook/phonework\"> " + QObject::tr("Business Phone: ") + "</b>" 574 {
573 + Qtopia::escapeString(str); 575 text += "<br><b><img src=\"addressbook/phonework\"> " + QObject::tr( "Business Phone: " ) + "</b>"
574 marker = true; 576 + Qtopia::escapeString( str );
577 marker = true;
575 } 578 }
576 str = businessFax(); 579 str = businessFax();
577 if ( !str.isEmpty() ){ 580 if ( !str.isEmpty() )
578 text += "<br><b><img src=\"addressbook/faxwork\"> " + QObject::tr("Business Fax: ") + "</b>" 581 {
579 + Qtopia::escapeString(str); 582 text += "<br><b><img src=\"addressbook/faxwork\"> " + QObject::tr( "Business Fax: " ) + "</b>"
580 marker = true; 583 + Qtopia::escapeString( str );
584 marker = true;
581 } 585 }
582 str = businessMobile(); 586 str = businessMobile();
583 if ( !str.isEmpty() ){ 587 if ( !str.isEmpty() )
584 text += "<br><b><img src=\"addressbook/mobilework\"> " + QObject::tr("Business Mobile: ") + "</b>" 588 {
585 + Qtopia::escapeString(str); 589 text += "<br><b><img src=\"addressbook/mobilework\"> " + QObject::tr( "Business Mobile: " ) + "</b>"
586 marker = true; 590 + Qtopia::escapeString( str );
591 marker = true;
587 } 592 }
588 str = businessPager(); 593 str = businessPager();
589 if ( !str.isEmpty() ){ 594 if ( !str.isEmpty() )
590 text += "<br><b>" + QObject::tr("Business Pager: ") + "</b>" 595 {
591 + Qtopia::escapeString(str); 596 text += "<br><b>" + QObject::tr( "Business Pager: " ) + "</b>"
592 marker = true; 597 + Qtopia::escapeString( str );
598 marker = true;
593 } 599 }
594 600
595 // text += "<br>"; 601 // text += "<br>";
596 602
597 // home address 603 // home address
598 if ( !homeStreet().isEmpty() || !homeCity().isEmpty() || 604 if ( !homeStreet().isEmpty() || !homeCity().isEmpty() ||
599 !homeZip().isEmpty() || !homeCountry().isEmpty() ) { 605 !homeZip().isEmpty() || !homeCountry().isEmpty() )
600 text += QObject::tr( "<br><b>Home Address:</b>" ); 606 {
601 marker = true; 607 text += QObject::tr( "<br><b>Home Address:</b>" );
608 marker = true;
602 } 609 }
603 610
604 if ( !(value = homeStreet()).isEmpty() ){ 611 if ( !( value = homeStreet() ).isEmpty() )
605 text += "<br>" + Qtopia::escapeString(value); 612 {
606 marker = true; 613 text += "<br>" + Qtopia::escapeString( value );
614 marker = true;
607 } 615 }
608 616
609 switch( addressformat ){ 617 switch ( addressformat )
610 case Zip_City_State:{ // Zip_Code City, State 618 {
611 state = homeState(); 619 case Zip_City_State:
612 if ( !(value = homeZip()).isEmpty() ){ 620 { // Zip_Code City, State
613 text += "<br>" + Qtopia::escapeString(value) + " "; 621 state = homeState();
614 marker = true; 622 if ( !( value = homeZip() ).isEmpty() )
615 } 623 {
616 if ( !(value = homeCity()).isEmpty() ) { 624 text += "<br>" + Qtopia::escapeString( value ) + " ";
617 marker = true; 625 marker = true;
618 if ( homeZip().isEmpty() && !homeStreet().isEmpty() ) 626 }
619 text += "<br>"; 627 if ( !( value = homeCity() ).isEmpty() )
620 text += Qtopia::escapeString(value); 628 {
621 if ( !state.isEmpty() ) 629 marker = true;
622 text += ", " + Qtopia::escapeString(state); 630 if ( homeZip().isEmpty() && !homeStreet().isEmpty() )
623 } else if (!state.isEmpty()) { 631 text += "<br>";
624 text += "<br>" + Qtopia::escapeString(state); 632 text += Qtopia::escapeString( value );
625 marker = true; 633 if ( !state.isEmpty() )
626 } 634 text += ", " + Qtopia::escapeString( state );
627 break; 635 }
628 } 636 else if ( !state.isEmpty() )
629 case City_State_Zip:{ // City, State Zip_Code 637 {
630 state = homeState(); 638 text += "<br>" + Qtopia::escapeString( state );
631 if ( !(value = homeCity()).isEmpty() ) { 639 marker = true;
632 marker = true; 640 }
633 text += "<br>" + Qtopia::escapeString(value); 641 break;
634 if ( state ) 642 }
635 text += ", " + Qtopia::escapeString(state); 643 case City_State_Zip:
636 } else if ( !state.isEmpty() ){ 644 { // City, State Zip_Code
637 text += "<br>" + Qtopia::escapeString(state); 645 state = homeState();
638 marker = true; 646 if ( !( value = homeCity() ).isEmpty() )
639 } 647 {
640 if ( !(value = homeZip()).isEmpty() ){ 648 marker = true;
641 text += " " + Qtopia::escapeString(value); 649 text += "<br>" + Qtopia::escapeString( value );
642 marker = true; 650 if ( state )
643 } 651 text += ", " + Qtopia::escapeString( state );
644 break; 652 }
645 } 653 else if ( !state.isEmpty() )
654 {
655 text += "<br>" + Qtopia::escapeString( state );
656 marker = true;
657 }
658 if ( !( value = homeZip() ).isEmpty() )
659 {
660 text += " " + Qtopia::escapeString( value );
661 marker = true;
662 }
663 break;
664 }
646 } 665 }
647 666
648 if ( !(value = homeCountry()).isEmpty() ){ 667 if ( !( value = homeCountry() ).isEmpty() )
649 text += "<br>" + Qtopia::escapeString(value); 668 {
650 marker = true; 669 text += "<br>" + Qtopia::escapeString( value );
670 marker = true;
651 } 671 }
652 672
653 // rest of Home data 673 // rest of Home data
654 str = homeWebpage(); 674 str = homeWebpage();
655 if ( !str.isEmpty() ){ 675 if ( !str.isEmpty() )
656 text += "<br><b><img src=\"addressbook/webpagehome\"> " + QObject::tr("Home Web Page: ") + "</b>" 676 {
657 + Qtopia::escapeString(str); 677 text += "<br><b><img src=\"addressbook/webpagehome\"> " + QObject::tr( "Home Web Page: " ) + "</b>"
658 marker = true; 678 + Qtopia::escapeString( str );
679 marker = true;
659 } 680 }
660 str = homePhone(); 681 str = homePhone();
661 if ( !str.isEmpty() ){ 682 if ( !str.isEmpty() )
662 text += "<br><b><img src=\"addressbook/phonehome\"> " + QObject::tr("Home Phone: ") + "</b>" 683 {
663 + Qtopia::escapeString(str); 684 text += "<br><b><img src=\"addressbook/phonehome\"> " + QObject::tr( "Home Phone: " ) + "</b>"
664 marker = true; 685 + Qtopia::escapeString( str );
686 marker = true;
665 } 687 }
666 str = homeFax(); 688 str = homeFax();
667 if ( !str.isEmpty() ){ 689 if ( !str.isEmpty() )
668 text += "<br><b><img src=\"addressbook/faxhome\"> " + QObject::tr("Home Fax: ") + "</b>" 690 {
669 + Qtopia::escapeString(str); 691 text += "<br><b><img src=\"addressbook/faxhome\"> " + QObject::tr( "Home Fax: " ) + "</b>"
670 marker = true; 692 + Qtopia::escapeString( str );
693 marker = true;
671 } 694 }
672 str = homeMobile(); 695 str = homeMobile();
673 if ( !str.isEmpty() ){ 696 if ( !str.isEmpty() )
674 text += "<br><b><img src=\"addressbook/mobilehome\"> " + QObject::tr("Home Mobile: ") + "</b>" 697 {
675 + Qtopia::escapeString(str); 698 text += "<br><b><img src=\"addressbook/mobilehome\"> " + QObject::tr( "Home Mobile: " ) + "</b>"
676 marker = true; 699 + Qtopia::escapeString( str );
700 marker = true;
677 } 701 }
678 702
679 if ( marker ) 703 if ( marker )
680 text += "<br><hr>"; 704 text += "<br><hr>";
681 705
682 // the rest... 706 // the rest...
683 str = emails(); 707 str = emails();
684 if ( !str.isEmpty() && ( str != defEmail ) ) 708 if ( !str.isEmpty() && ( str != defEmail ) )
685 text += "<br><b>" + QObject::tr("All Emails: ") + "</b>" 709 text += "<br><b>" + QObject::tr( "All Emails: " ) + "</b>"
686 + Qtopia::escapeString(str); 710 + Qtopia::escapeString( str );
687 str = profession(); 711 str = profession();
688 if ( !str.isEmpty() ) 712 if ( !str.isEmpty() )
689 text += "<br><b>" + QObject::tr("Profession: ") + "</b>" 713 text += "<br><b>" + QObject::tr( "Profession: " ) + "</b>"
690 + Qtopia::escapeString(str); 714 + Qtopia::escapeString( str );
691 str = assistant(); 715 str = assistant();
692 if ( !str.isEmpty() ) 716 if ( !str.isEmpty() )
693 text += "<br><b>" + QObject::tr("Assistant: ") + "</b>" 717 text += "<br><b>" + QObject::tr( "Assistant: " ) + "</b>"
694 + Qtopia::escapeString(str); 718 + Qtopia::escapeString( str );
695 str = manager(); 719 str = manager();
696 if ( !str.isEmpty() ) 720 if ( !str.isEmpty() )
697 text += "<br><b>" + QObject::tr("Manager: ") + "</b>" 721 text += "<br><b>" + QObject::tr( "Manager: " ) + "</b>"
698 + Qtopia::escapeString(str); 722 + Qtopia::escapeString( str );
699 str = gender(); 723 str = gender();
700 if ( !str.isEmpty() && str.toInt() != 0 ) { 724 if ( !str.isEmpty() && str.toInt() != 0 )
701 text += "<br>"; 725 {
702 if ( str.toInt() == 1 ) 726 text += "<br>";
703 str = QObject::tr( "Male" ); 727 if ( str.toInt() == 1 )
704 else if ( str.toInt() == 2 ) 728 str = QObject::tr( "Male" );
705 str = QObject::tr( "Female" ); 729 else if ( str.toInt() == 2 )
706 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str; 730 str = QObject::tr( "Female" );
731 text += "<b>" + QObject::tr( "Gender: " ) + "</b>" + str;
707 } 732 }
708 str = spouse(); 733 str = spouse();
709 if ( !str.isEmpty() ) 734 if ( !str.isEmpty() )
710 text += "<br><b>" + QObject::tr("Spouse: ") + "</b>" 735 text += "<br><b>" + QObject::tr( "Spouse: " ) + "</b>"
711 + Qtopia::escapeString(str); 736 + Qtopia::escapeString( str );
712 if ( birthday().isValid() ){ 737 if ( birthday().isValid() )
713 str = TimeString::numberDateString( birthday() ); 738 {
714 text += "<br><b>" + QObject::tr("Birthday: ") + "</b>" 739 str = TimeString::numberDateString( birthday() );
715 + Qtopia::escapeString(str); 740 text += "<br><b>" + QObject::tr( "Birthday: " ) + "</b>"
741 + Qtopia::escapeString( str );
716 } 742 }
717 if ( anniversary().isValid() ){ 743 if ( anniversary().isValid() )
718 str = TimeString::numberDateString( anniversary() ); 744 {
719 text += "<br><b>" + QObject::tr("Anniversary: ") + "</b>" 745 str = TimeString::numberDateString( anniversary() );
720 + Qtopia::escapeString(str); 746 text += "<br><b>" + QObject::tr( "Anniversary: " ) + "</b>"
747 + Qtopia::escapeString( str );
721 } 748 }
722 str = children(); 749 str = children();
723 if ( !str.isEmpty() ) 750 if ( !str.isEmpty() )
724 text += "<br><b>" + QObject::tr("Children: ") + "</b>" 751 text += "<br><b>" + QObject::tr( "Children: " ) + "</b>"
725 + Qtopia::escapeString(str); 752 + Qtopia::escapeString( str );
726 753
727 str = nickname(); 754 str = nickname();
728 if ( !str.isEmpty() ) 755 if ( !str.isEmpty() )
729 text += "<br><b>" + QObject::tr("Nickname: ") + "</b>" 756 text += "<br><b>" + QObject::tr( "Nickname: " ) + "</b>"
730 + Qtopia::escapeString(str); 757 + Qtopia::escapeString( str );
731 758
732 // categories 759 // categories
733 if ( categoryNames("Contacts").count() ){ 760 if ( categoryNames( "Contacts" ).count() )
734 text += "<br><b>" + QObject::tr( "Category:") + "</b> "; 761 {
735 text += categoryNames("Contacts").join(", "); 762 text += "<br><b>" + QObject::tr( "Category:" ) + "</b> ";
763 text += categoryNames( "Contacts" ).join( ", " );
736 } 764 }
737 765
738 // notes last 766 // notes last
739 if ( !(value = notes()).isEmpty() ) { 767 if ( !( value = notes() ).isEmpty() )
740 text += "<br><hr><b>" + QObject::tr( "Notes:") + "</b> "; 768 {
741 QRegExp reg("\n"); 769 text += "<br><hr><b>" + QObject::tr( "Notes:" ) + "</b> ";
742 770 QRegExp reg( "\n" );
743 //QString tmp = Qtopia::escapeString(value); 771
744 QString tmp = QStyleSheet::convertFromPlainText(value); 772 //QString tmp = Qtopia::escapeString(value);
745 //tmp.replace( reg, "<br>" ); 773 QString tmp = QStyleSheet::convertFromPlainText( value );
746 text += "<br>" + tmp + "<br>"; 774 //tmp.replace( reg, "<br>" );
775 text += "<br>" + tmp + "<br>";
747 } 776 }
748 return text; 777 return text;
749} 778}
750 779
751/*! 780/*!
752 \internal 781 \internal
753*/ 782*/
754void OContact::insert( int key, const QString &v ) 783void OContact::insert( int key, const QString &v )
755{ 784{
756 QString value = v.stripWhiteSpace(); 785 QString value = v.stripWhiteSpace();
757 if ( value.isEmpty() ) 786 if ( value.isEmpty() )
758 mMap.remove( key ); 787 mMap.remove( key );
759 else 788 else
760 mMap.insert( key, value ); 789 mMap.insert( key, value );
761} 790}
762 791
763/*! 792/*!
764 \internal 793 \internal
765*/ 794*/
766void OContact::replace( int key, const QString & v ) 795void OContact::replace( int key, const QString & v )
767{ 796{
768 QString value = v.stripWhiteSpace(); 797 QString value = v.stripWhiteSpace();
769 if ( value.isEmpty() ) 798 if ( value.isEmpty() )
770 mMap.remove( key ); 799 mMap.remove( key );
771 else 800 else
772 mMap.replace( key, value ); 801 mMap.replace( key, value );
773} 802}
774 803
775/*! 804/*!
776 \internal 805 \internal
777*/ 806*/
778QString OContact::find( int key ) const 807QString OContact::find( int key ) const
779{ 808{
780 return mMap[key]; 809 return mMap[ key ];
781} 810}
782 811
783/*! 812/*!
784 \internal 813 \internal
785*/ 814*/
786QString OContact::displayAddress( const QString &street, 815QString OContact::displayAddress( const QString &street,
787 const QString &city, 816 const QString &city,
788 const QString &state, 817 const QString &state,
789 const QString &zip, 818 const QString &zip,
790 const QString &country ) const 819 const QString &country ) const
791{ 820{
792 QString s = street; 821 QString s = street;
793 if ( !street.isEmpty() ) 822 if ( !street.isEmpty() )
794 s+= "\n"; 823 s += "\n";
795 s += city; 824 s += city;
796 if ( !city.isEmpty() && !state.isEmpty() ) 825 if ( !city.isEmpty() && !state.isEmpty() )
797 s += ", "; 826 s += ", ";
798 s += state; 827 s += state;
799 if ( !state.isEmpty() && !zip.isEmpty() ) 828 if ( !state.isEmpty() && !zip.isEmpty() )
800 s += " "; 829 s += " ";
801 s += zip; 830 s += zip;
802 if ( !country.isEmpty() && !s.isEmpty() ) 831 if ( !country.isEmpty() && !s.isEmpty() )
803 s += "\n"; 832 s += "\n";
804 s += country; 833 s += country;
805 return s; 834 return s;
806} 835}
807 836
808/*! 837/*!
809 \internal 838 \internal
810*/ 839*/
811QString OContact::displayBusinessAddress() const 840QString OContact::displayBusinessAddress() const
812{ 841{
813 return displayAddress( businessStreet(), businessCity(), 842 return displayAddress( businessStreet(), businessCity(),
814 businessState(), businessZip(), 843 businessState(), businessZip(),
815 businessCountry() ); 844 businessCountry() );
816} 845}
817 846
818/*! 847/*!
819 \internal 848 \internal
820*/ 849*/
821QString OContact::displayHomeAddress() const 850QString OContact::displayHomeAddress() const
822{ 851{
823 return displayAddress( homeStreet(), homeCity(), 852 return displayAddress( homeStreet(), homeCity(),
824 homeState(), homeZip(), 853 homeState(), homeZip(),
825 homeCountry() ); 854 homeCountry() );
826} 855}
827 856
828/*! 857/*!
829 Returns the full name of the contact 858 Returns the full name of the contact
830*/ 859*/
831QString OContact::fullName() const 860QString OContact::fullName() const
@@ -834,31 +863,35 @@ QString OContact::fullName() const
834 QString firstName = find( Qtopia::FirstName ); 863 QString firstName = find( Qtopia::FirstName );
835 QString middleName = find( Qtopia::MiddleName ); 864 QString middleName = find( Qtopia::MiddleName );
836 QString lastName = find( Qtopia::LastName ); 865 QString lastName = find( Qtopia::LastName );
837 QString suffix = find( Qtopia::Suffix ); 866 QString suffix = find( Qtopia::Suffix );
838 867
839 QString name = title; 868 QString name = title;
840 if ( !firstName.isEmpty() ) { 869 if ( !firstName.isEmpty() )
841 if ( !name.isEmpty() ) 870 {
842 name += " "; 871 if ( !name.isEmpty() )
843 name += firstName; 872 name += " ";
873 name += firstName;
844 } 874 }
845 if ( !middleName.isEmpty() ) { 875 if ( !middleName.isEmpty() )
846 if ( !name.isEmpty() ) 876 {
847 name += " "; 877 if ( !name.isEmpty() )
848 name += middleName; 878 name += " ";
879 name += middleName;
849 } 880 }
850 if ( !lastName.isEmpty() ) { 881 if ( !lastName.isEmpty() )
851 if ( !name.isEmpty() ) 882 {
852 name += " "; 883 if ( !name.isEmpty() )
853 name += lastName; 884 name += " ";
885 name += lastName;
854 } 886 }
855 if ( !suffix.isEmpty() ) { 887 if ( !suffix.isEmpty() )
856 if ( !name.isEmpty() ) 888 {
857 name += " "; 889 if ( !name.isEmpty() )
858 name += suffix; 890 name += " ";
891 name += suffix;
859 } 892 }
860 return name.simplifyWhiteSpace(); 893 return name.simplifyWhiteSpace();
861} 894}
862 895
863/*! 896/*!
864 Returns a list of the names of the children of the contact. 897 Returns a list of the names of the children of the contact.
@@ -897,17 +930,18 @@ QStringList OContact::childrenList() const
897*/ 930*/
898QStringList OContact::emailList() const 931QStringList OContact::emailList() const
899{ 932{
900 QString emailStr = emails(); 933 QString emailStr = emails();
901 934
902 QStringList r; 935 QStringList r;
903 if ( !emailStr.isEmpty() ) { 936 if ( !emailStr.isEmpty() )
904 qDebug(" emailstr "); 937 {
905 QStringList l = QStringList::split( emailSeparator(), emailStr ); 938 qDebug( " emailstr " );
906 for ( QStringList::ConstIterator it = l.begin();it != l.end();++it ) 939 QStringList l = QStringList::split( emailSeparator(), emailStr );
907 r += (*it).simplifyWhiteSpace(); 940 for ( QStringList::ConstIterator it = l.begin();it != l.end();++it )
941 r += ( *it ).simplifyWhiteSpace();
908 } 942 }
909 943
910 return r; 944 return r;
911} 945}
912 946
913/*! 947/*!
@@ -921,21 +955,21 @@ void OContact::setFileAs()
921 QString lastName, firstName, middleName, fileas; 955 QString lastName, firstName, middleName, fileas;
922 956
923 lastName = find( Qtopia::LastName ); 957 lastName = find( Qtopia::LastName );
924 firstName = find( Qtopia::FirstName ); 958 firstName = find( Qtopia::FirstName );
925 middleName = find( Qtopia::MiddleName ); 959 middleName = find( Qtopia::MiddleName );
926 if ( !lastName.isEmpty() && !firstName.isEmpty() 960 if ( !lastName.isEmpty() && !firstName.isEmpty()
927 && !middleName.isEmpty() ) 961 && !middleName.isEmpty() )
928 fileas = lastName + ", " + firstName + " " + middleName; 962 fileas = lastName + ", " + firstName + " " + middleName;
929 else if ( !lastName.isEmpty() && !firstName.isEmpty() ) 963 else if ( !lastName.isEmpty() && !firstName.isEmpty() )
930 fileas = lastName + ", " + firstName; 964 fileas = lastName + ", " + firstName;
931 else if ( !lastName.isEmpty() || !firstName.isEmpty() || 965 else if ( !lastName.isEmpty() || !firstName.isEmpty() ||
932 !middleName.isEmpty() ) 966 !middleName.isEmpty() )
933 fileas = firstName + ( firstName.isEmpty() ? "" : " " ) 967 fileas = firstName + ( firstName.isEmpty() ? "" : " " )
934 + middleName + ( middleName.isEmpty() ? "" : " " ) 968 + middleName + ( middleName.isEmpty() ? "" : " " )
935 + lastName; 969 + lastName;
936 970
937 replace( Qtopia::FileAs, fileas ); 971 replace( Qtopia::FileAs, fileas );
938} 972}
939 973
940/*! 974/*!
941 \internal 975 \internal
@@ -943,27 +977,29 @@ void OContact::setFileAs()
943*/ 977*/
944void OContact::save( QString &buf ) const 978void OContact::save( QString &buf ) const
945{ 979{
946 static const QStringList SLFIELDS = fields(); 980 static const QStringList SLFIELDS = fields();
947 // I'm expecting "<Contact " in front of this... 981 // I'm expecting "<Contact " in front of this...
948 for ( QMap<int, QString>::ConstIterator it = mMap.begin(); 982 for ( QMap<int, QString>::ConstIterator it = mMap.begin();
949 it != mMap.end(); ++it ) { 983 it != mMap.end(); ++it )
950 const QString &value = it.data(); 984 {
951 int key = it.key(); 985 const QString &value = it.data();
952 if ( !value.isEmpty() ) { 986 int key = it.key();
953 if ( key == Qtopia::AddressCategory || key == Qtopia::AddressUid) 987 if ( !value.isEmpty() )
954 continue; 988 {
955 989 if ( key == Qtopia::AddressCategory || key == Qtopia::AddressUid )
956 key -= Qtopia::AddressCategory+1; 990 continue;
957 buf += SLFIELDS[key]; 991
958 buf += "=\"" + Qtopia::escapeString(value) + "\" "; 992 key -= Qtopia::AddressCategory + 1;
959 } 993 buf += SLFIELDS[ key ];
994 buf += "=\"" + Qtopia::escapeString( value ) + "\" ";
995 }
960 } 996 }
961 buf += customToXml(); 997 buf += customToXml();
962 if ( categories().count() > 0 ) 998 if ( categories().count() > 0 )
963 buf += "Categories=\"" + idsToString( categories() ) + "\" "; 999 buf += "Categories=\"" + idsToString( categories() ) + "\" ";
964 buf += "Uid=\"" + QString::number( uid() ) + "\" "; 1000 buf += "Uid=\"" + QString::number( uid() ) + "\" ";
965 // You need to close this yourself 1001 // You need to close this yourself
966} 1002}
967 1003
968 1004
969/*! 1005/*!
@@ -1058,181 +1094,200 @@ void OContact::setChildren( const QString &str )
1058bool OContact::match( const QRegExp &r ) const 1094bool OContact::match( const QRegExp &r ) const
1059{ 1095{
1060 setLastHitField( -1 ); 1096 setLastHitField( -1 );
1061 bool match; 1097 bool match;
1062 match = false; 1098 match = false;
1063 QMap<int, QString>::ConstIterator it; 1099 QMap<int, QString>::ConstIterator it;
1064 for ( it = mMap.begin(); it != mMap.end(); ++it ) { 1100 for ( it = mMap.begin(); it != mMap.end(); ++it )
1065 if ( (*it).find( r ) > -1 ) { 1101 {
1102 if ( ( *it ).find( r ) > -1 )
1103 {
1066 setLastHitField( it.key() ); 1104 setLastHitField( it.key() );
1067 match = true; 1105 match = true;
1068 break; 1106 break;
1069 } 1107 }
1070 } 1108 }
1071 return match; 1109 return match;
1072} 1110}
1073 1111
1074 1112
1075QString OContact::toShortText() const 1113QString OContact::toShortText() const
1076{ 1114{
1077 return ( fullName() ); 1115 return ( fullName() );
1078} 1116}
1117
1118
1079QString OContact::type() const 1119QString OContact::type() const
1080{ 1120{
1081 return QString::fromLatin1( "OContact" ); 1121 return QString::fromLatin1( "OContact" );
1082} 1122}
1083 1123
1084 1124
1085
1086class QString OContact::recordField( int pos ) const 1125class QString OContact::recordField( int pos ) const
1087{ 1126{
1088 QStringList SLFIELDS = fields(); // ?? why this ? (se) 1127 QStringList SLFIELDS = fields(); // ?? why this ? (se)
1089 return SLFIELDS[pos]; 1128 return SLFIELDS[ pos ];
1090} 1129}
1091 1130
1092// In future releases, we should store birthday and anniversary 1131// In future releases, we should store birthday and anniversary
1093// internally as QDate instead of QString ! 1132// internally as QDate instead of QString !
1094// QString is always too complicate to interprete (DD.MM.YY, DD/MM/YY, MM/DD/YY, etc..)(se) 1133// QString is always too complicate to interprete (DD.MM.YY, DD/MM/YY, MM/DD/YY, etc..)(se)
1095 1134
1096/*! \fn void OContact::setBirthday( const QDate& date ) 1135/*! \fn void OContact::setBirthday( const QDate& date )
1097 Sets the birthday for the contact to \a date. If date is null 1136 Sets the birthday for the contact to \a date. If date is null
1098 the current stored date will be removed. 1137 the current stored date will be removed.
1099*/ 1138*/
1100void OContact::setBirthday( const QDate &v ) 1139void OContact::setBirthday( const QDate &v )
1101{ 1140{
1102 if ( v.isNull() ){ 1141 if ( v.isNull() )
1103 qWarning( "Remove Birthday"); 1142 {
1104 replace( Qtopia::Birthday, QString::null ); 1143 qWarning( "Remove Birthday" );
1105 return; 1144 replace( Qtopia::Birthday, QString::null );
1106 } 1145 return ;
1146 }
1107 1147
1108 if ( v.isValid() ) 1148 if ( v.isValid() )
1109 replace( Qtopia::Birthday, OConversion::dateToString( v ) ); 1149 replace( Qtopia::Birthday, OConversion::dateToString( v ) );
1110 1150
1111} 1151}
1112 1152
1113 1153
1114/*! \fn void OContact::setAnniversary( const QDate &date ) 1154/*! \fn void OContact::setAnniversary( const QDate &date )
1115 Sets the anniversary of the contact to \a date. If date is 1155 Sets the anniversary of the contact to \a date. If date is
1116 null, the current stored date will be removed. 1156 null, the current stored date will be removed.
1117*/ 1157*/
1118void OContact::setAnniversary( const QDate &v ) 1158void OContact::setAnniversary( const QDate &v )
1119{ 1159{
1120 if ( v.isNull() ){ 1160 if ( v.isNull() )
1121 qWarning( "Remove Anniversary"); 1161 {
1122 replace( Qtopia::Anniversary, QString::null ); 1162 qWarning( "Remove Anniversary" );
1123 return; 1163 replace( Qtopia::Anniversary, QString::null );
1124 } 1164 return ;
1125 1165 }
1126 if ( v.isValid() ) 1166
1127 replace( Qtopia::Anniversary, OConversion::dateToString( v ) ); 1167 if ( v.isValid() )
1168 replace( Qtopia::Anniversary, OConversion::dateToString( v ) );
1128} 1169}
1129 1170
1171
1130/*! \fn QDate OContact::birthday() const 1172/*! \fn QDate OContact::birthday() const
1131 Returns the birthday of the contact. 1173 Returns the birthday of the contact.
1132*/ 1174*/
1133QDate OContact::birthday() const 1175QDate OContact::birthday() const
1134{ 1176{
1135 QString str = find( Qtopia::Birthday ); 1177 QString str = find( Qtopia::Birthday );
1136 // qWarning ("Birthday %s", str.latin1() ); 1178 // qWarning ("Birthday %s", str.latin1() );
1137 if ( !str.isEmpty() ) 1179 if ( !str.isEmpty() )
1138 return OConversion::dateFromString ( str ); 1180 return OConversion::dateFromString ( str );
1139 else 1181 else
1140 return QDate(); 1182 return QDate();
1141} 1183}
1142 1184
1143 1185
1144/*! \fn QDate OContact::anniversary() const 1186/*! \fn QDate OContact::anniversary() const
1145 Returns the anniversary of the contact. 1187 Returns the anniversary of the contact.
1146*/ 1188*/
1147QDate OContact::anniversary() const 1189QDate OContact::anniversary() const
1148{ 1190{
1149 QDate empty; 1191 QDate empty;
1150 QString str = find( Qtopia::Anniversary ); 1192 QString str = find( Qtopia::Anniversary );
1151 // qWarning ("Anniversary %s", str.latin1() ); 1193 // qWarning ("Anniversary %s", str.latin1() );
1152 if ( !str.isEmpty() ) 1194 if ( !str.isEmpty() )
1153 return OConversion::dateFromString ( str ); 1195 return OConversion::dateFromString ( str );
1154 else 1196 else
1155 return empty; 1197 return empty;
1156} 1198}
1157 1199
1158 1200
1159void OContact::insertEmail( const QString &v ) 1201void OContact::insertEmail( const QString &v )
1160{ 1202{
1161 //qDebug("insertEmail %s", v.latin1()); 1203 //qDebug("insertEmail %s", v.latin1());
1162 QString e = v.simplifyWhiteSpace(); 1204 QString e = v.simplifyWhiteSpace();
1163 QString def = defaultEmail(); 1205 QString def = defaultEmail();
1164 1206
1165 // if no default, set it as the default email and don't insert 1207 // if no default, set it as the default email and don't insert
1166 if ( def.isEmpty() ) { 1208 if ( def.isEmpty() )
1167 setDefaultEmail( e ); // will insert into the list for us 1209 {
1168 return; 1210 setDefaultEmail( e ); // will insert into the list for us
1211 return ;
1169 } 1212 }
1170 1213
1171 // otherwise, insert assuming doesn't already exist 1214 // otherwise, insert assuming doesn't already exist
1172 QString emailsStr = find( Qtopia::Emails ); 1215 QString emailsStr = find( Qtopia::Emails );
1173 if ( emailsStr.contains( e )) 1216 if ( emailsStr.contains( e ) )
1174 return; 1217 return ;
1175 if ( !emailsStr.isEmpty() ) 1218 if ( !emailsStr.isEmpty() )
1176 emailsStr += emailSeparator(); 1219 emailsStr += emailSeparator();
1177 emailsStr += e; 1220 emailsStr += e;
1178 replace( Qtopia::Emails, emailsStr ); 1221 replace( Qtopia::Emails, emailsStr );
1179} 1222}
1180 1223
1181void OContact::removeEmail( const QString &v ) 1224
1225 void OContact::removeEmail( const QString &v )
1182{ 1226{
1183 QString e = v.simplifyWhiteSpace(); 1227 QString e = v.simplifyWhiteSpace();
1184 QString def = defaultEmail(); 1228 QString def = defaultEmail();
1185 QString emailsStr = find( Qtopia::Emails ); 1229 QString emailsStr = find( Qtopia::Emails );
1186 QStringList emails = emailList(); 1230 QStringList emails = emailList();
1187 1231
1188 // otherwise, must first contain it 1232 // otherwise, must first contain it
1189 if ( !emailsStr.contains( e ) ) 1233 if ( !emailsStr.contains( e ) )
1190 return; 1234 return ;
1191 1235
1192 // remove it 1236 // remove it
1193 //qDebug(" removing email from list %s", e.latin1()); 1237 //qDebug(" removing email from list %s", e.latin1());
1194 emails.remove( e ); 1238 emails.remove( e );
1195 // reset the string 1239 // reset the string
1196 emailsStr = emails.join(emailSeparator()); // Sharp's brain dead separator 1240 emailsStr = emails.join( emailSeparator() ); // Sharp's brain dead separator
1197 replace( Qtopia::Emails, emailsStr ); 1241 replace( Qtopia::Emails, emailsStr );
1198 1242
1199 // if default, then replace the default email with the first one 1243 // if default, then replace the default email with the first one
1200 if ( def == e ) { 1244 if ( def == e )
1201 //qDebug("removeEmail is default; setting new default"); 1245 {
1202 if ( !emails.count() ) 1246 //qDebug("removeEmail is default; setting new default");
1203 clearEmails(); 1247 if ( !emails.count() )
1204 else // setDefaultEmail will remove e from the list 1248 clearEmails();
1205 setDefaultEmail( emails.first() ); 1249 else // setDefaultEmail will remove e from the list
1250 setDefaultEmail( emails.first() );
1206 } 1251 }
1207} 1252}
1253
1254
1208void OContact::clearEmails() 1255void OContact::clearEmails()
1209{ 1256{
1210 mMap.remove( Qtopia::DefaultEmail ); 1257 mMap.remove( Qtopia::DefaultEmail );
1211 mMap.remove( Qtopia::Emails ); 1258 mMap.remove( Qtopia::Emails );
1212} 1259}
1260
1261
1213void OContact::setDefaultEmail( const QString &v ) 1262void OContact::setDefaultEmail( const QString &v )
1214{ 1263{
1215 QString e = v.simplifyWhiteSpace(); 1264 QString e = v.simplifyWhiteSpace();
1216 1265
1217 //qDebug("OContact::setDefaultEmail %s", e.latin1()); 1266 //qDebug("OContact::setDefaultEmail %s", e.latin1());
1218 replace( Qtopia::DefaultEmail, e ); 1267 replace( Qtopia::DefaultEmail, e );
1219 1268
1220 if ( !e.isEmpty() ) 1269 if ( !e.isEmpty() )
1221 insertEmail( e ); 1270 insertEmail( e );
1222 1271
1223} 1272}
1224 1273
1274
1225void OContact::insertEmails( const QStringList &v ) 1275void OContact::insertEmails( const QStringList &v )
1226{ 1276{
1227 for ( QStringList::ConstIterator it = v.begin(); it != v.end(); ++it ) 1277 for ( QStringList::ConstIterator it = v.begin(); it != v.end(); ++it )
1228 insertEmail( *it ); 1278 insertEmail( *it );
1229} 1279}
1230int OContact::rtti() { 1280
1281
1282int OContact::rtti()
1283{
1231 return OPimResolver::AddressBook; 1284 return OPimResolver::AddressBook;
1232} 1285}
1286
1287
1233void OContact::setUid( int i ) 1288void OContact::setUid( int i )
1234{ 1289{
1235 OPimRecord::setUid(i); 1290 OPimRecord::setUid( i );
1236 replace( Qtopia::AddressUid , QString::number(i)); 1291 replace( Qtopia::AddressUid , QString::number( i ) );
1237} 1292}
1238} 1293}
diff --git a/libopie2/opiepim/ocontact.h b/libopie2/opiepim/ocontact.h
index 34888dc..445fd7d 100644
--- a/libopie2/opiepim/ocontact.h
+++ b/libopie2/opiepim/ocontact.h
@@ -23,48 +23,53 @@
23 -_. . . )=. = Library General Public License along with 23 -_. . . )=. = Library General Public License along with
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29#ifndef __OCONTACT_H__
30#define __OCONTACT_H__
31 29
30#ifndef OCONTACT_H
31#define OCONTACT_H
32
33/* OPIE */
32#include <opie2/opimrecord.h> 34#include <opie2/opimrecord.h>
33#include <qpe/recordfields.h> 35#include <qpe/recordfields.h>
34 36
37/* QT */
35#include <qdatetime.h> 38#include <qdatetime.h>
36#include <qstringlist.h> 39#include <qstringlist.h>
37 40
38#if defined(QPC_TEMPLATEDLL) 41#if defined(QPC_TEMPLATEDLL)
39// MOC_SKIP_BEGIN 42// MOC_SKIP_BEGIN
40QPC_TEMPLATEEXTERN template class QPC_EXPORT QMap<int, QString>; 43QPC_TEMPLATEEXTERN template class QPC_EXPORT QMap<int, QString>;
41// MOC_SKIP_END 44// MOC_SKIP_END
42#endif 45#endif
43 46
44namespace Opie { 47namespace Opie
48{
45class OContactPrivate; 49class OContactPrivate;
46 50
47/** 51/**
48 * OContact class represents a specialised PIM Record for contacts. 52 * OContact class represents a specialised PIM Record for contacts.
49 * It does store all kind of persopn related information. 53 * It does store all kind of persopn related information.
50 * 54 *
51 * @short Contact Container 55 * @short Contact Container
52 * @author TT, Stefan Eiler, Holger Freyther 56 * @author TT, Stefan Eiler, Holger Freyther
53 */ 57 */
54class QPC_EXPORT OContact : public OPimRecord 58class QPC_EXPORT OContact : public OPimRecord
55{ 59{
56 friend class DataSet; 60 friend class DataSet;
57public: 61
62 public:
58 OContact(); 63 OContact();
59 OContact( const QMap<int, QString> &fromMap ); 64 OContact( const QMap<int, QString> &fromMap );
60 virtual ~OContact(); 65 virtual ~OContact();
61 66
62 enum DateFormat{ 67 enum DateFormat{
63 Zip_City_State = 0, 68 Zip_City_State = 0,
64 City_State_Zip 69 City_State_Zip
65 }; 70 };
66 71
67 /* 72 /*
68 * do we need to inline them 73 * do we need to inline them
69 * if yes do we need to inline them this way? 74 * if yes do we need to inline them this way?
70 * -zecke 75 * -zecke
@@ -121,19 +126,19 @@ public:
121 void setBirthday( const QDate &v ); 126 void setBirthday( const QDate &v );
122 void setAnniversary( const QDate &v ); 127 void setAnniversary( const QDate &v );
123 void setNickname( const QString &v ) { replace( Qtopia::Nickname, v ); } 128 void setNickname( const QString &v ) { replace( Qtopia::Nickname, v ); }
124 void setChildren( const QString &v ); 129 void setChildren( const QString &v );
125 130
126 // other 131 // other
127 void setNotes( const QString &v ) { replace( Qtopia::Notes, v); } 132 void setNotes( const QString &v ) { replace( Qtopia::Notes, v ); }
128 133
129 virtual bool match( const QRegExp &regexp ) const; 134 virtual bool match( const QRegExp &regexp ) const;
130 135
131// // custom 136 // // custom
132// void setCustomField( const QString &key, const QString &v ) 137 // void setCustomField( const QString &key, const QString &v )
133// { replace(Custom- + key, v ); } 138 // { replace(Custom- + key, v ); }
134 139
135 // name 140 // name
136 QString fullName() const; 141 QString fullName() const;
137 QString title() const { return find( Qtopia::Title ); } 142 QString title() const { return find( Qtopia::Title ); }
138 QString firstName() const { return find( Qtopia::FirstName ); } 143 QString firstName() const { return find( Qtopia::FirstName ); }
139 QString middleName() const { return find( Qtopia::MiddleName ); } 144 QString middleName() const { return find( Qtopia::MiddleName ); }
@@ -182,13 +187,13 @@ public:
182 QString businessFax() const { return find( Qtopia::BusinessFax ); } 187 QString businessFax() const { return find( Qtopia::BusinessFax ); }
183 QString businessMobile() const { return find( Qtopia::BusinessMobile ); } 188 QString businessMobile() const { return find( Qtopia::BusinessMobile ); }
184 QString businessPager() const { return find( Qtopia::BusinessPager ); } 189 QString businessPager() const { return find( Qtopia::BusinessPager ); }
185 QString profession() const { return find( Qtopia::Profession ); } 190 QString profession() const { return find( Qtopia::Profession ); }
186 QString assistant() const { return find( Qtopia::Assistant ); } 191 QString assistant() const { return find( Qtopia::Assistant ); }
187 QString manager() const { return find( Qtopia::Manager ); } 192 QString manager() const { return find( Qtopia::Manager ); }
188 /** Multi line string containing all non-empty address info in the form 193 /** Multi line string containing all non-empty address info in the form
189 * Street 194 * Street
190 * City, State Zip 195 * City, State Zip
191 * Country 196 * Country
192 */ 197 */
193 QString displayBusinessAddress() const; 198 QString displayBusinessAddress() const;
194 199
@@ -210,40 +215,40 @@ public:
210 QMap<int, QString> toMap() const; 215 QMap<int, QString> toMap() const;
211 QString field( int key ) const { return find( key ); } 216 QString field( int key ) const { return find( key ); }
212 217
213 218
214 void setUid( int i ); 219 void setUid( int i );
215 220
216 QString toShortText()const; 221 QString toShortText() const;
217 QString type()const; 222 QString type() const;
218 class QString recordField(int) const; 223 class QString recordField( int ) const;
219 224
220 // Why private ? (eilers,se) 225 // Why private ? (eilers,se)
221 QString emailSeparator() const { return " "; } 226 QString emailSeparator() const { return " "; }
222 227
223 // the emails should be seperated by a comma 228 // the emails should be seperated by a comma
224 void setEmails( const QString &v ); 229 void setEmails( const QString &v );
225 QString emails() const { return find( Qtopia::Emails ); } 230 QString emails() const { return find( Qtopia::Emails ); }
226 static int rtti(); 231 static int rtti();
227 232
228private: 233 private:
229 // The XML Backend needs some access to the private functions 234 // The XML Backend needs some access to the private functions
230 friend class OContactAccessBackend_XML; 235 friend class OContactAccessBackend_XML;
231 236
232 void insert( int key, const QString &value ); 237 void insert( int key, const QString &value );
233 void replace( int key, const QString &value ); 238 void replace( int key, const QString &value );
234 QString find( int key ) const; 239 QString find( int key ) const;
235 static QStringList fields(); 240 static QStringList fields();
236 241
237 void save( QString &buf ) const; 242 void save( QString &buf ) const;
238 243
239 QString displayAddress( const QString &street, 244 QString displayAddress( const QString &street,
240 const QString &city, 245 const QString &city,
241 const QString &state, 246 const QString &state,
242 const QString &zip, 247 const QString &zip,
243 const QString &country ) const; 248 const QString &country ) const;
244 249
245 QMap<int, QString> mMap; 250 QMap<int, QString> mMap;
246 OContactPrivate *d; 251 OContactPrivate *d;
247}; 252};
248 253
249} 254}
diff --git a/libopie2/opiepim/ocontactfields.cpp b/libopie2/opiepim/ocontactfields.cpp
index deaa1e5..bec00f7 100644
--- a/libopie2/opiepim/ocontactfields.cpp
+++ b/libopie2/opiepim/ocontactfields.cpp
@@ -1,9 +1,9 @@
1/* 1/*
2 This file is part of the Opie Project 2 This file is part of the Opie Project
3 Copyright (C) The Main Author <main-author@whereever.org> 3 Copyright (C) Stefan Eilers <eilers.stefan@epost.de>
4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org> 4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org>
5 .=l. 5 .=l.
6 .>+-= 6 .>+-=
7 _;:, .> :=|. This program is free software; you can 7 _;:, .> :=|. This program is free software; you can
8.> <`_, > . <= redistribute it and/or modify it under 8.> <`_, > . <= redistribute it and/or modify it under
9:`=1 )Y*s>-.-- : the terms of the GNU Library General Public 9:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
@@ -24,35 +24,38 @@
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29 29
30#include <opie2/ocontactfields.h> 30#include "ocontactfields.h"
31 31
32#include <qstringlist.h> 32/* OPIE */
33#include <opie2/ocontact.h>
34#include <qpe/recordfields.h> // We should use our own enum in the future ..
35#include <qpe/config.h>
36
37/* QT */
33#include <qobject.h> 38#include <qobject.h>
39#include <qstringlist.h>
34 40
35// We should use our own enum in the future ..
36#include <qpe/recordfields.h>
37#include <qpe/config.h>
38#include <opie2/ocontact.h>
39 41
40namespace Opie { 42namespace Opie
43{
41/*! 44/*!
42 \internal 45 \internal
43 Returns a list of personal field names for a contact. 46 Returns a list of personal field names for a contact.
44*/ 47*/
45QStringList OContactFields::personalfields( bool sorted, bool translated ) 48QStringList OContactFields::personalfields( bool sorted, bool translated )
46{ 49{
47 QStringList list; 50 QStringList list;
48 QMap<int, QString> mapIdToStr; 51 QMap<int, QString> mapIdToStr;
49 if ( translated ) 52 if ( translated )
50 mapIdToStr = idToTrFields(); 53 mapIdToStr = idToTrFields();
51 else 54 else
52 mapIdToStr = idToUntrFields(); 55 mapIdToStr = idToUntrFields();
53 56
54 list.append( mapIdToStr[ Qtopia::AddressUid ] ); 57 list.append( mapIdToStr[ Qtopia::AddressUid ] );
55 list.append( mapIdToStr[ Qtopia::AddressCategory ] ); 58 list.append( mapIdToStr[ Qtopia::AddressCategory ] );
56 59
57 list.append( mapIdToStr[ Qtopia::Title ] ); 60 list.append( mapIdToStr[ Qtopia::Title ] );
58 list.append( mapIdToStr[ Qtopia::FirstName ] ); 61 list.append( mapIdToStr[ Qtopia::FirstName ] );
@@ -65,28 +68,28 @@ QStringList OContactFields::personalfields( bool sorted, bool translated )
65 list.append( mapIdToStr[ Qtopia::Department ] ); 68 list.append( mapIdToStr[ Qtopia::Department ] );
66 list.append( mapIdToStr[ Qtopia::Company ] ); 69 list.append( mapIdToStr[ Qtopia::Company ] );
67 70
68 list.append( mapIdToStr[ Qtopia::Notes ] ); 71 list.append( mapIdToStr[ Qtopia::Notes ] );
69 list.append( mapIdToStr[ Qtopia::Groups ] ); 72 list.append( mapIdToStr[ Qtopia::Groups ] );
70 73
71 if (sorted) list.sort(); 74 if ( sorted ) list.sort();
72 return list; 75 return list;
73} 76}
74 77
75/*! 78/*!
76 \internal 79 \internal
77 Returns a list of details field names for a contact. 80 Returns a list of details field names for a contact.
78*/ 81*/
79QStringList OContactFields::detailsfields( bool sorted, bool translated ) 82QStringList OContactFields::detailsfields( bool sorted, bool translated )
80{ 83{
81 QStringList list; 84 QStringList list;
82 QMap<int, QString> mapIdToStr; 85 QMap<int, QString> mapIdToStr;
83 if ( translated ) 86 if ( translated )
84 mapIdToStr = idToTrFields(); 87 mapIdToStr = idToTrFields();
85 else 88 else
86 mapIdToStr = idToUntrFields(); 89 mapIdToStr = idToUntrFields();
87 90
88 list.append( mapIdToStr[ Qtopia::Office ] ); 91 list.append( mapIdToStr[ Qtopia::Office ] );
89 list.append( mapIdToStr[ Qtopia::Profession ] ); 92 list.append( mapIdToStr[ Qtopia::Profession ] );
90 list.append( mapIdToStr[ Qtopia::Assistant ] ); 93 list.append( mapIdToStr[ Qtopia::Assistant ] );
91 list.append( mapIdToStr[ Qtopia::Manager ] ); 94 list.append( mapIdToStr[ Qtopia::Manager ] );
92 95
@@ -94,45 +97,45 @@ QStringList OContactFields::detailsfields( bool sorted, bool translated )
94 list.append( mapIdToStr[ Qtopia::Gender ] ); 97 list.append( mapIdToStr[ Qtopia::Gender ] );
95 list.append( mapIdToStr[ Qtopia::Birthday ] ); 98 list.append( mapIdToStr[ Qtopia::Birthday ] );
96 list.append( mapIdToStr[ Qtopia::Anniversary ] ); 99 list.append( mapIdToStr[ Qtopia::Anniversary ] );
97 list.append( mapIdToStr[ Qtopia::Nickname ] ); 100 list.append( mapIdToStr[ Qtopia::Nickname ] );
98 list.append( mapIdToStr[ Qtopia::Children ] ); 101 list.append( mapIdToStr[ Qtopia::Children ] );
99 102
100 if (sorted) list.sort(); 103 if ( sorted ) list.sort();
101 return list; 104 return list;
102} 105}
103 106
104/*! 107/*!
105 \internal 108 \internal
106 Returns a list of phone field names for a contact. 109 Returns a list of phone field names for a contact.
107*/ 110*/
108QStringList OContactFields::phonefields( bool sorted, bool translated ) 111QStringList OContactFields::phonefields( bool sorted, bool translated )
109{ 112{
110 QStringList list; 113 QStringList list;
111 QMap<int, QString> mapIdToStr; 114 QMap<int, QString> mapIdToStr;
112 if ( translated ) 115 if ( translated )
113 mapIdToStr = idToTrFields(); 116 mapIdToStr = idToTrFields();
114 else 117 else
115 mapIdToStr = idToUntrFields(); 118 mapIdToStr = idToUntrFields();
116 119
117 list.append( mapIdToStr[Qtopia::BusinessPhone] ); 120 list.append( mapIdToStr[ Qtopia::BusinessPhone ] );
118 list.append( mapIdToStr[Qtopia::BusinessFax] ); 121 list.append( mapIdToStr[ Qtopia::BusinessFax ] );
119 list.append( mapIdToStr[Qtopia::BusinessMobile] ); 122 list.append( mapIdToStr[ Qtopia::BusinessMobile ] );
120 list.append( mapIdToStr[Qtopia::BusinessPager] ); 123 list.append( mapIdToStr[ Qtopia::BusinessPager ] );
121 list.append( mapIdToStr[Qtopia::BusinessWebPage] ); 124 list.append( mapIdToStr[ Qtopia::BusinessWebPage ] );
122 125
123 list.append( mapIdToStr[Qtopia::DefaultEmail] ); 126 list.append( mapIdToStr[ Qtopia::DefaultEmail ] );
124 list.append( mapIdToStr[Qtopia::Emails] ); 127 list.append( mapIdToStr[ Qtopia::Emails ] );
125 128
126 list.append( mapIdToStr[Qtopia::HomePhone] ); 129 list.append( mapIdToStr[ Qtopia::HomePhone ] );
127 list.append( mapIdToStr[Qtopia::HomeFax] ); 130 list.append( mapIdToStr[ Qtopia::HomeFax ] );
128 list.append( mapIdToStr[Qtopia::HomeMobile] ); 131 list.append( mapIdToStr[ Qtopia::HomeMobile ] );
129 // list.append( mapIdToStr[Qtopia::HomePager] ); 132 // list.append( mapIdToStr[Qtopia::HomePager] );
130 list.append( mapIdToStr[Qtopia::HomeWebPage] ); 133 list.append( mapIdToStr[ Qtopia::HomeWebPage ] );
131 134
132 if (sorted) list.sort(); 135 if ( sorted ) list.sort();
133 136
134 return list; 137 return list;
135} 138}
136 139
137/*! 140/*!
138 \internal 141 \internal
@@ -140,106 +143,106 @@ QStringList OContactFields::phonefields( bool sorted, bool translated )
140*/ 143*/
141QStringList OContactFields::fields( bool sorted, bool translated ) 144QStringList OContactFields::fields( bool sorted, bool translated )
142{ 145{
143 QStringList list; 146 QStringList list;
144 QMap<int, QString> mapIdToStr; 147 QMap<int, QString> mapIdToStr;
145 if ( translated ) 148 if ( translated )
146 mapIdToStr = idToTrFields(); 149 mapIdToStr = idToTrFields();
147 else 150 else
148 mapIdToStr = idToUntrFields(); 151 mapIdToStr = idToUntrFields();
149 152
150 list += personalfields( sorted, translated ); 153 list += personalfields( sorted, translated );
151 154
152 list += phonefields( sorted, translated ); 155 list += phonefields( sorted, translated );
153 156
154 list.append( mapIdToStr[Qtopia::BusinessStreet] ); 157 list.append( mapIdToStr[ Qtopia::BusinessStreet ] );
155 list.append( mapIdToStr[Qtopia::BusinessCity] ); 158 list.append( mapIdToStr[ Qtopia::BusinessCity ] );
156 list.append( mapIdToStr[Qtopia::BusinessState] ); 159 list.append( mapIdToStr[ Qtopia::BusinessState ] );
157 list.append( mapIdToStr[Qtopia::BusinessZip] ); 160 list.append( mapIdToStr[ Qtopia::BusinessZip ] );
158 list.append( mapIdToStr[Qtopia::BusinessCountry] ); 161 list.append( mapIdToStr[ Qtopia::BusinessCountry ] );
159 162
160 list.append( mapIdToStr[Qtopia::HomeStreet] ); 163 list.append( mapIdToStr[ Qtopia::HomeStreet ] );
161 list.append( mapIdToStr[Qtopia::HomeCity] ); 164 list.append( mapIdToStr[ Qtopia::HomeCity ] );
162 list.append( mapIdToStr[Qtopia::HomeState] ); 165 list.append( mapIdToStr[ Qtopia::HomeState ] );
163 list.append( mapIdToStr[Qtopia::HomeZip] ); 166 list.append( mapIdToStr[ Qtopia::HomeZip ] );
164 list.append( mapIdToStr[Qtopia::HomeCountry] ); 167 list.append( mapIdToStr[ Qtopia::HomeCountry ] );
165 168
166 list += detailsfields( sorted, translated ); 169 list += detailsfields( sorted, translated );
167 170
168 if (sorted) list.sort(); 171 if ( sorted ) list.sort();
169 172
170 return list; 173 return list;
171} 174}
172 175
173 176
174/*! 177/*!
175 \internal 178 \internal
176 Returns an untranslated list of personal field names for a contact. 179 Returns an untranslated list of personal field names for a contact.
177*/ 180*/
178QStringList OContactFields::untrpersonalfields( bool sorted ) 181QStringList OContactFields::untrpersonalfields( bool sorted )
179{ 182{
180 return personalfields( sorted, false ); 183 return personalfields( sorted, false );
181} 184}
182 185
183 186
184/*! 187/*!
185 \internal 188 \internal
186 Returns a translated list of personal field names for a contact. 189 Returns a translated list of personal field names for a contact.
187*/ 190*/
188QStringList OContactFields::trpersonalfields( bool sorted ) 191QStringList OContactFields::trpersonalfields( bool sorted )
189{ 192{
190 return personalfields( sorted, true ); 193 return personalfields( sorted, true );
191} 194}
192 195
193 196
194/*! 197/*!
195 \internal 198 \internal
196 Returns an untranslated list of details field names for a contact. 199 Returns an untranslated list of details field names for a contact.
197*/ 200*/
198QStringList OContactFields::untrdetailsfields( bool sorted ) 201QStringList OContactFields::untrdetailsfields( bool sorted )
199{ 202{
200 return detailsfields( sorted, false ); 203 return detailsfields( sorted, false );
201} 204}
202 205
203 206
204/*! 207/*!
205 \internal 208 \internal
206 Returns a translated list of details field names for a contact. 209 Returns a translated list of details field names for a contact.
207*/ 210*/
208QStringList OContactFields::trdetailsfields( bool sorted ) 211QStringList OContactFields::trdetailsfields( bool sorted )
209{ 212{
210 return detailsfields( sorted, true ); 213 return detailsfields( sorted, true );
211} 214}
212 215
213 216
214/*! 217/*!
215 \internal 218 \internal
216 Returns a translated list of phone field names for a contact. 219 Returns a translated list of phone field names for a contact.
217*/ 220*/
218QStringList OContactFields::trphonefields( bool sorted ) 221QStringList OContactFields::trphonefields( bool sorted )
219{ 222{
220 return phonefields( sorted, true ); 223 return phonefields( sorted, true );
221} 224}
222 225
223/*! 226/*!
224 \internal 227 \internal
225 Returns an untranslated list of phone field names for a contact. 228 Returns an untranslated list of phone field names for a contact.
226*/ 229*/
227QStringList OContactFields::untrphonefields( bool sorted ) 230QStringList OContactFields::untrphonefields( bool sorted )
228{ 231{
229 return phonefields( sorted, false ); 232 return phonefields( sorted, false );
230} 233}
231 234
232 235
233/*! 236/*!
234 \internal 237 \internal
235 Returns a translated list of field names for a contact. 238 Returns a translated list of field names for a contact.
236*/ 239*/
237QStringList OContactFields::trfields( bool sorted ) 240QStringList OContactFields::trfields( bool sorted )
238{ 241{
239 return fields( sorted, true ); 242 return fields( sorted, true );
240} 243}
241 244
242/*! 245/*!
243 \internal 246 \internal
244 Returns an untranslated list of field names for a contact. 247 Returns an untranslated list of field names for a contact.
245*/ 248*/
@@ -247,262 +250,269 @@ QStringList OContactFields::untrfields( bool sorted )
247{ 250{
248 return fields( sorted, false ); 251 return fields( sorted, false );
249} 252}
250 253
251QMap<int, QString> OContactFields::idToTrFields() 254QMap<int, QString> OContactFields::idToTrFields()
252{ 255{
253 QMap<int, QString> ret_map; 256 QMap<int, QString> ret_map;
254 257
255 ret_map.insert( Qtopia::AddressUid, QObject::tr( "User Id" ) ); 258 ret_map.insert( Qtopia::AddressUid, QObject::tr( "User Id" ) );
256 ret_map.insert( Qtopia::AddressCategory, QObject::tr( "Categories" ) ); 259 ret_map.insert( Qtopia::AddressCategory, QObject::tr( "Categories" ) );
257 260
258 ret_map.insert( Qtopia::Title, QObject::tr( "Name Title") ); 261 ret_map.insert( Qtopia::Title, QObject::tr( "Name Title" ) );
259 ret_map.insert( Qtopia::FirstName, QObject::tr( "First Name" ) ); 262 ret_map.insert( Qtopia::FirstName, QObject::tr( "First Name" ) );
260 ret_map.insert( Qtopia::MiddleName, QObject::tr( "Middle Name" ) ); 263 ret_map.insert( Qtopia::MiddleName, QObject::tr( "Middle Name" ) );
261 ret_map.insert( Qtopia::LastName, QObject::tr( "Last Name" ) ); 264 ret_map.insert( Qtopia::LastName, QObject::tr( "Last Name" ) );
262 ret_map.insert( Qtopia::Suffix, QObject::tr( "Suffix" )); 265 ret_map.insert( Qtopia::Suffix, QObject::tr( "Suffix" ) );
263 ret_map.insert( Qtopia::FileAs, QObject::tr( "File As" ) ); 266 ret_map.insert( Qtopia::FileAs, QObject::tr( "File As" ) );
264 267
265 ret_map.insert( Qtopia::JobTitle, QObject::tr( "Job Title" ) ); 268 ret_map.insert( Qtopia::JobTitle, QObject::tr( "Job Title" ) );
266 ret_map.insert( Qtopia::Department, QObject::tr( "Department" ) ); 269 ret_map.insert( Qtopia::Department, QObject::tr( "Department" ) );
267 ret_map.insert( Qtopia::Company, QObject::tr( "Company" ) ); 270 ret_map.insert( Qtopia::Company, QObject::tr( "Company" ) );
268 ret_map.insert( Qtopia::BusinessPhone, QObject::tr( "Business Phone" ) ); 271 ret_map.insert( Qtopia::BusinessPhone, QObject::tr( "Business Phone" ) );
269 ret_map.insert( Qtopia::BusinessFax, QObject::tr( "Business Fax" ) ); 272 ret_map.insert( Qtopia::BusinessFax, QObject::tr( "Business Fax" ) );
270 ret_map.insert( Qtopia::BusinessMobile, QObject::tr( "Business Mobile" )); 273 ret_map.insert( Qtopia::BusinessMobile, QObject::tr( "Business Mobile" ) );
271 274
272 // email 275 // email
273 ret_map.insert( Qtopia::DefaultEmail, QObject::tr( "Default Email" ) ); 276 ret_map.insert( Qtopia::DefaultEmail, QObject::tr( "Default Email" ) );
274 ret_map.insert( Qtopia::Emails, QObject::tr( "Emails" ) ); 277 ret_map.insert( Qtopia::Emails, QObject::tr( "Emails" ) );
275 278
276 ret_map.insert( Qtopia::HomePhone, QObject::tr( "Home Phone" ) ); 279 ret_map.insert( Qtopia::HomePhone, QObject::tr( "Home Phone" ) );
277 ret_map.insert( Qtopia::HomeFax, QObject::tr( "Home Fax" ) ); 280 ret_map.insert( Qtopia::HomeFax, QObject::tr( "Home Fax" ) );
278 ret_map.insert( Qtopia::HomeMobile, QObject::tr( "Home Mobile" ) ); 281 ret_map.insert( Qtopia::HomeMobile, QObject::tr( "Home Mobile" ) );
279 282
280 // business 283 // business
281 ret_map.insert( Qtopia::BusinessStreet, QObject::tr( "Business Street" ) ); 284 ret_map.insert( Qtopia::BusinessStreet, QObject::tr( "Business Street" ) );
282 ret_map.insert( Qtopia::BusinessCity, QObject::tr( "Business City" ) ); 285 ret_map.insert( Qtopia::BusinessCity, QObject::tr( "Business City" ) );
283 ret_map.insert( Qtopia::BusinessState, QObject::tr( "Business State" ) ); 286 ret_map.insert( Qtopia::BusinessState, QObject::tr( "Business State" ) );
284 ret_map.insert( Qtopia::BusinessZip, QObject::tr( "Business Zip" ) ); 287 ret_map.insert( Qtopia::BusinessZip, QObject::tr( "Business Zip" ) );
285 ret_map.insert( Qtopia::BusinessCountry, QObject::tr( "Business Country" ) ); 288 ret_map.insert( Qtopia::BusinessCountry, QObject::tr( "Business Country" ) );
286 ret_map.insert( Qtopia::BusinessPager, QObject::tr( "Business Pager" ) ); 289 ret_map.insert( Qtopia::BusinessPager, QObject::tr( "Business Pager" ) );
287 ret_map.insert( Qtopia::BusinessWebPage, QObject::tr( "Business WebPage" ) ); 290 ret_map.insert( Qtopia::BusinessWebPage, QObject::tr( "Business WebPage" ) );
288 291
289 ret_map.insert( Qtopia::Office, QObject::tr( "Office" ) ); 292 ret_map.insert( Qtopia::Office, QObject::tr( "Office" ) );
290 ret_map.insert( Qtopia::Profession, QObject::tr( "Profession" ) ); 293 ret_map.insert( Qtopia::Profession, QObject::tr( "Profession" ) );
291 ret_map.insert( Qtopia::Assistant, QObject::tr( "Assistant" ) ); 294 ret_map.insert( Qtopia::Assistant, QObject::tr( "Assistant" ) );
292 ret_map.insert( Qtopia::Manager, QObject::tr( "Manager" ) ); 295 ret_map.insert( Qtopia::Manager, QObject::tr( "Manager" ) );
293 296
294 // home 297 // home
295 ret_map.insert( Qtopia::HomeStreet, QObject::tr( "Home Street" ) ); 298 ret_map.insert( Qtopia::HomeStreet, QObject::tr( "Home Street" ) );
296 ret_map.insert( Qtopia::HomeCity, QObject::tr( "Home City" ) ); 299 ret_map.insert( Qtopia::HomeCity, QObject::tr( "Home City" ) );
297 ret_map.insert( Qtopia::HomeState, QObject::tr( "Home State" ) ); 300 ret_map.insert( Qtopia::HomeState, QObject::tr( "Home State" ) );
298 ret_map.insert( Qtopia::HomeZip, QObject::tr( "Home Zip" ) ); 301 ret_map.insert( Qtopia::HomeZip, QObject::tr( "Home Zip" ) );
299 ret_map.insert( Qtopia::HomeCountry, QObject::tr( "Home Country" ) ); 302 ret_map.insert( Qtopia::HomeCountry, QObject::tr( "Home Country" ) );
300 ret_map.insert( Qtopia::HomeWebPage, QObject::tr( "Home Web Page" ) ); 303 ret_map.insert( Qtopia::HomeWebPage, QObject::tr( "Home Web Page" ) );
301 304
302 //personal 305 //personal
303 ret_map.insert( Qtopia::Spouse, QObject::tr( "Spouse" ) ); 306 ret_map.insert( Qtopia::Spouse, QObject::tr( "Spouse" ) );
304 ret_map.insert( Qtopia::Gender, QObject::tr( "Gender" ) ); 307 ret_map.insert( Qtopia::Gender, QObject::tr( "Gender" ) );
305 ret_map.insert( Qtopia::Birthday, QObject::tr( "Birthday" ) ); 308 ret_map.insert( Qtopia::Birthday, QObject::tr( "Birthday" ) );
306 ret_map.insert( Qtopia::Anniversary, QObject::tr( "Anniversary" ) ); 309 ret_map.insert( Qtopia::Anniversary, QObject::tr( "Anniversary" ) );
307 ret_map.insert( Qtopia::Nickname, QObject::tr( "Nickname" ) ); 310 ret_map.insert( Qtopia::Nickname, QObject::tr( "Nickname" ) );
308 ret_map.insert( Qtopia::Children, QObject::tr( "Children" ) ); 311 ret_map.insert( Qtopia::Children, QObject::tr( "Children" ) );
309 312
310 // other 313 // other
311 ret_map.insert( Qtopia::Notes, QObject::tr( "Notes" ) ); 314 ret_map.insert( Qtopia::Notes, QObject::tr( "Notes" ) );
312 315
313 316
314 return ret_map; 317 return ret_map;
315} 318}
316 319
317QMap<int, QString> OContactFields::idToUntrFields() 320QMap<int, QString> OContactFields::idToUntrFields()
318{ 321{
319 QMap<int, QString> ret_map; 322 QMap<int, QString> ret_map;
320 323
321 ret_map.insert( Qtopia::AddressUid, "User Id" ); 324 ret_map.insert( Qtopia::AddressUid, "User Id" );
322 ret_map.insert( Qtopia::AddressCategory, "Categories" ); 325 ret_map.insert( Qtopia::AddressCategory, "Categories" );
323 326
324 ret_map.insert( Qtopia::Title, "Name Title" ); 327 ret_map.insert( Qtopia::Title, "Name Title" );
325 ret_map.insert( Qtopia::FirstName, "First Name" ); 328 ret_map.insert( Qtopia::FirstName, "First Name" );
326 ret_map.insert( Qtopia::MiddleName, "Middle Name" ); 329 ret_map.insert( Qtopia::MiddleName, "Middle Name" );
327 ret_map.insert( Qtopia::LastName, "Last Name" ); 330 ret_map.insert( Qtopia::LastName, "Last Name" );
328 ret_map.insert( Qtopia::Suffix, "Suffix" ); 331 ret_map.insert( Qtopia::Suffix, "Suffix" );
329 ret_map.insert( Qtopia::FileAs, "File As" ); 332 ret_map.insert( Qtopia::FileAs, "File As" );
330 333
331 ret_map.insert( Qtopia::JobTitle, "Job Title" ); 334 ret_map.insert( Qtopia::JobTitle, "Job Title" );
332 ret_map.insert( Qtopia::Department, "Department" ); 335 ret_map.insert( Qtopia::Department, "Department" );
333 ret_map.insert( Qtopia::Company, "Company" ); 336 ret_map.insert( Qtopia::Company, "Company" );
334 ret_map.insert( Qtopia::BusinessPhone, "Business Phone" ); 337 ret_map.insert( Qtopia::BusinessPhone, "Business Phone" );
335 ret_map.insert( Qtopia::BusinessFax, "Business Fax" ); 338 ret_map.insert( Qtopia::BusinessFax, "Business Fax" );
336 ret_map.insert( Qtopia::BusinessMobile, "Business Mobile" ); 339 ret_map.insert( Qtopia::BusinessMobile, "Business Mobile" );
337 340
338 // email 341 // email
339 ret_map.insert( Qtopia::DefaultEmail, "Default Email" ); 342 ret_map.insert( Qtopia::DefaultEmail, "Default Email" );
340 ret_map.insert( Qtopia::Emails, "Emails" ); 343 ret_map.insert( Qtopia::Emails, "Emails" );
341 344
342 ret_map.insert( Qtopia::HomePhone, "Home Phone" ); 345 ret_map.insert( Qtopia::HomePhone, "Home Phone" );
343 ret_map.insert( Qtopia::HomeFax, "Home Fax" ); 346 ret_map.insert( Qtopia::HomeFax, "Home Fax" );
344 ret_map.insert( Qtopia::HomeMobile, "Home Mobile" ); 347 ret_map.insert( Qtopia::HomeMobile, "Home Mobile" );
345 348
346 // business 349 // business
347 ret_map.insert( Qtopia::BusinessStreet, "Business Street" ); 350 ret_map.insert( Qtopia::BusinessStreet, "Business Street" );
348 ret_map.insert( Qtopia::BusinessCity, "Business City" ); 351 ret_map.insert( Qtopia::BusinessCity, "Business City" );
349 ret_map.insert( Qtopia::BusinessState, "Business State" ); 352 ret_map.insert( Qtopia::BusinessState, "Business State" );
350 ret_map.insert( Qtopia::BusinessZip, "Business Zip" ); 353 ret_map.insert( Qtopia::BusinessZip, "Business Zip" );
351 ret_map.insert( Qtopia::BusinessCountry, "Business Country" ); 354 ret_map.insert( Qtopia::BusinessCountry, "Business Country" );
352 ret_map.insert( Qtopia::BusinessPager, "Business Pager" ); 355 ret_map.insert( Qtopia::BusinessPager, "Business Pager" );
353 ret_map.insert( Qtopia::BusinessWebPage, "Business WebPage" ); 356 ret_map.insert( Qtopia::BusinessWebPage, "Business WebPage" );
354 357
355 ret_map.insert( Qtopia::Office, "Office" ); 358 ret_map.insert( Qtopia::Office, "Office" );
356 ret_map.insert( Qtopia::Profession, "Profession" ); 359 ret_map.insert( Qtopia::Profession, "Profession" );
357 ret_map.insert( Qtopia::Assistant, "Assistant" ); 360 ret_map.insert( Qtopia::Assistant, "Assistant" );
358 ret_map.insert( Qtopia::Manager, "Manager" ); 361 ret_map.insert( Qtopia::Manager, "Manager" );
359 362
360 // home 363 // home
361 ret_map.insert( Qtopia::HomeStreet, "Home Street" ); 364 ret_map.insert( Qtopia::HomeStreet, "Home Street" );
362 ret_map.insert( Qtopia::HomeCity, "Home City" ); 365 ret_map.insert( Qtopia::HomeCity, "Home City" );
363 ret_map.insert( Qtopia::HomeState, "Home State" ); 366 ret_map.insert( Qtopia::HomeState, "Home State" );
364 ret_map.insert( Qtopia::HomeZip, "Home Zip" ); 367 ret_map.insert( Qtopia::HomeZip, "Home Zip" );
365 ret_map.insert( Qtopia::HomeCountry, "Home Country" ); 368 ret_map.insert( Qtopia::HomeCountry, "Home Country" );
366 ret_map.insert( Qtopia::HomeWebPage, "Home Web Page" ); 369 ret_map.insert( Qtopia::HomeWebPage, "Home Web Page" );
367 370
368 //personal 371 //personal
369 ret_map.insert( Qtopia::Spouse, "Spouse" ); 372 ret_map.insert( Qtopia::Spouse, "Spouse" );
370 ret_map.insert( Qtopia::Gender, "Gender" ); 373 ret_map.insert( Qtopia::Gender, "Gender" );
371 ret_map.insert( Qtopia::Birthday, "Birthday" ); 374 ret_map.insert( Qtopia::Birthday, "Birthday" );
372 ret_map.insert( Qtopia::Anniversary, "Anniversary" ); 375 ret_map.insert( Qtopia::Anniversary, "Anniversary" );
373 ret_map.insert( Qtopia::Nickname, "Nickname" ); 376 ret_map.insert( Qtopia::Nickname, "Nickname" );
374 ret_map.insert( Qtopia::Children, "Children" ); 377 ret_map.insert( Qtopia::Children, "Children" );
375 378
376 // other 379 // other
377 ret_map.insert( Qtopia::Notes, "Notes" ); 380 ret_map.insert( Qtopia::Notes, "Notes" );
378 ret_map.insert( Qtopia::Groups, "Groups" ); 381 ret_map.insert( Qtopia::Groups, "Groups" );
379 382
380 383
381 return ret_map; 384 return ret_map;
382} 385}
383 386
384QMap<QString, int> OContactFields::trFieldsToId() 387QMap<QString, int> OContactFields::trFieldsToId()
385{ 388{
386 QMap<int, QString> idtostr = idToTrFields(); 389 QMap<int, QString> idtostr = idToTrFields();
387 QMap<QString, int> ret_map; 390 QMap<QString, int> ret_map;
388 391
389 392
390 QMap<int, QString>::Iterator it; 393 QMap<int, QString>::Iterator it;
391 for( it = idtostr.begin(); it != idtostr.end(); ++it ) 394 for ( it = idtostr.begin(); it != idtostr.end(); ++it )
392 ret_map.insert( *it, it.key() ); 395 ret_map.insert( *it, it.key() );
393 396
394 397
395 return ret_map; 398 return ret_map;
396} 399}
397 400
398/* ======================================================================= */ 401/* ======================================================================= */
399 402
400QMap<QString, int> OContactFields::untrFieldsToId() 403QMap<QString, int> OContactFields::untrFieldsToId()
401{ 404{
402 QMap<int, QString> idtostr = idToUntrFields(); 405 QMap<int, QString> idtostr = idToUntrFields();
403 QMap<QString, int> ret_map; 406 QMap<QString, int> ret_map;
404 407
405 408
406 QMap<int, QString>::Iterator it; 409 QMap<int, QString>::Iterator it;
407 for( it = idtostr.begin(); it != idtostr.end(); ++it ) 410 for ( it = idtostr.begin(); it != idtostr.end(); ++it )
408 ret_map.insert( *it, it.key() ); 411 ret_map.insert( *it, it.key() );
409 412
410 413
411 return ret_map; 414 return ret_map;
412} 415}
413 416
414 417
415OContactFields::OContactFields(): 418OContactFields::OContactFields() :
416 fieldOrder( DEFAULT_FIELD_ORDER ), 419 fieldOrder( DEFAULT_FIELD_ORDER ),
417 changedFieldOrder( false ) 420 changedFieldOrder( false )
418{ 421{
419 // Get the global field order from the config file and 422 // Get the global field order from the config file and
420 // use it as a start pattern 423 // use it as a start pattern
421 Config cfg ( "AddressBook" ); 424 Config cfg ( "AddressBook" );
422 cfg.setGroup( "ContactFieldOrder" ); 425 cfg.setGroup( "ContactFieldOrder" );
423 globalFieldOrder = cfg.readEntry( "General", DEFAULT_FIELD_ORDER ); 426 globalFieldOrder = cfg.readEntry( "General", DEFAULT_FIELD_ORDER );
424} 427}
425 428
426OContactFields::~OContactFields(){ 429OContactFields::~OContactFields()
430{
427 431
428 // We will store the fieldorder into the config file 432 // We will store the fieldorder into the config file
429 // to reuse it for the future.. 433 // to reuse it for the future..
430 if ( changedFieldOrder ){ 434 if ( changedFieldOrder )
431 Config cfg ( "AddressBook" ); 435 {
432 cfg.setGroup( "ContactFieldOrder" ); 436 Config cfg ( "AddressBook" );
433 cfg.writeEntry( "General", globalFieldOrder ); 437 cfg.setGroup( "ContactFieldOrder" );
434 } 438 cfg.writeEntry( "General", globalFieldOrder );
439 }
435} 440}
436 441
437 442
438 443
439void OContactFields::saveToRecord( OContact &cnt ){ 444void OContactFields::saveToRecord( OContact &cnt )
445{
440 446
441 qDebug("ocontactfields saveToRecord: >%s<",fieldOrder.latin1()); 447 qDebug( "ocontactfields saveToRecord: >%s<", fieldOrder.latin1() );
442 448
443 // Store fieldorder into this contact. 449 // Store fieldorder into this contact.
444 cnt.setCustomField( CONTACT_FIELD_ORDER_NAME, fieldOrder ); 450 cnt.setCustomField( CONTACT_FIELD_ORDER_NAME, fieldOrder );
445 451
446 globalFieldOrder = fieldOrder; 452 globalFieldOrder = fieldOrder;
447 changedFieldOrder = true; 453 changedFieldOrder = true;
448 454
449} 455}
450 456
451void OContactFields::loadFromRecord( const OContact &cnt ){ 457void OContactFields::loadFromRecord( const OContact &cnt )
452 qDebug("ocontactfields loadFromRecord"); 458{
453 qDebug("loading >%s<",cnt.fullName().latin1()); 459 qDebug( "ocontactfields loadFromRecord" );
460 qDebug( "loading >%s<", cnt.fullName().latin1() );
454 461
455 // Get fieldorder for this contact. If none is defined, 462 // Get fieldorder for this contact. If none is defined,
456 // we will use the global one from the config file.. 463 // we will use the global one from the config file..
457 464
458 fieldOrder = cnt.customField( CONTACT_FIELD_ORDER_NAME ); 465 fieldOrder = cnt.customField( CONTACT_FIELD_ORDER_NAME );
459 466
460 qDebug("fieldOrder from contact>%s<",fieldOrder.latin1()); 467 qDebug( "fieldOrder from contact>%s<", fieldOrder.latin1() );
461 468
462 if (fieldOrder.isEmpty()){ 469 if ( fieldOrder.isEmpty() )
463 fieldOrder = globalFieldOrder; 470 {
464 } 471 fieldOrder = globalFieldOrder;
472 }
465 473
466 474
467 qDebug("effective fieldOrder in loadFromRecord >%s<",fieldOrder.latin1()); 475 qDebug( "effective fieldOrder in loadFromRecord >%s<", fieldOrder.latin1() );
468} 476}
469 477
470void OContactFields::setFieldOrder( int num, int index ){ 478void OContactFields::setFieldOrder( int num, int index )
471 qDebug("qcontactfields setfieldorder pos %i -> %i",num,index); 479{
480 qDebug( "qcontactfields setfieldorder pos %i -> %i", num, index );
472 481
473 fieldOrder[num] = QString::number( index, 16 )[0]; 482 fieldOrder[ num ] = QString::number( index, 16 ) [ 0 ];
474 483
475 // We will store this new fieldorder globally to 484 // We will store this new fieldorder globally to
476 // remember it for contacts which have none 485 // remember it for contacts which have none
477 globalFieldOrder = fieldOrder; 486 globalFieldOrder = fieldOrder;
478 changedFieldOrder = true; 487 changedFieldOrder = true;
479 488
480 qDebug("fieldOrder >%s<",fieldOrder.latin1()); 489 qDebug( "fieldOrder >%s<", fieldOrder.latin1() );
481} 490}
482 491
483int OContactFields::getFieldOrder( int num, int defIndex ){ 492int OContactFields::getFieldOrder( int num, int defIndex )
484 qDebug("ocontactfields getFieldOrder"); 493{
485 qDebug("fieldOrder >%s<",fieldOrder.latin1()); 494 qDebug( "ocontactfields getFieldOrder" );
495 qDebug( "fieldOrder >%s<", fieldOrder.latin1() );
486 496
487 // Get index of combo as char.. 497 // Get index of combo as char..
488 QChar poschar = fieldOrder[num]; 498 QChar poschar = fieldOrder[ num ];
489 499
490 bool ok; 500 bool ok;
491 int ret = 0; 501 int ret = 0;
492 // Convert char to number.. 502 // Convert char to number..
493 if ( !( poschar == QChar::null ) ) 503 if ( !( poschar == QChar::null ) )
494 ret = QString( poschar ).toInt(&ok, 16); 504 ret = QString( poschar ).toInt( &ok, 16 );
495 else 505 else
496 ok = false; 506 ok = false;
497 507
498 // Return default value if index for 508 // Return default value if index for
499 // num was not set or if anything else happened.. 509 // num was not set or if anything else happened..
500 if ( !ok ) ret = defIndex; 510 if ( !ok ) ret = defIndex;
501 511
502 qDebug("returning >%i<",ret); 512 qDebug( "returning >%i<", ret );
503 513
504 return ret; 514 return ret;
505 515
506} 516}
507 517
508} 518}
diff --git a/libopie2/opiepim/ocontactfields.h b/libopie2/opiepim/ocontactfields.h
index 993ce3b..9e89532 100644
--- a/libopie2/opiepim/ocontactfields.h
+++ b/libopie2/opiepim/ocontactfields.h
@@ -23,28 +23,34 @@
23 -_. . . )=. = Library General Public License along with 23 -_. . . )=. = Library General Public License along with
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29#ifndef OPIE_CONTACTS_FIELDS 29
30#define OPIE_CONTACTS_FIELDS 30#ifndef OCONTACTFIELDS_H
31#define OCONTACTFIELDS_H
31 32
32class QStringList; 33class QStringList;
33 34
35/* OPIE */
36#include <opie2/ocontact.h>
37
38/* QT */
34#include <qmap.h> 39#include <qmap.h>
35#include <qstring.h> 40#include <qstring.h>
36#include <opie2/ocontact.h>
37 41
38#define CONTACT_FIELD_ORDER_NAME "opie-contactfield-order" 42#define CONTACT_FIELD_ORDER_NAME "opie-contactfield-order"
39#define DEFAULT_FIELD_ORDER "__________" 43#define DEFAULT_FIELD_ORDER "__________"
40
41namespace Opie {
42class OContactFields{
43 44
44 public: 45namespace Opie
46{
47class OContactFields
48{
49
50 public:
45 OContactFields(); 51 OContactFields();
46 ~OContactFields(); 52 ~OContactFields();
47 /** Set the index for combo boxes. 53 /** Set the index for combo boxes.
48 * Sets the <b>index</b> of combo <b>num</b>. 54 * Sets the <b>index</b> of combo <b>num</b>.
49 * @param num selects the number of the combo 55 * @param num selects the number of the combo
50 * @param index sets the index in the combo 56 * @param index sets the index in the combo
@@ -52,34 +58,34 @@ class OContactFields{
52 void setFieldOrder( int num, int index ); 58 void setFieldOrder( int num, int index );
53 59
54 /** Get the index for combo boxes. 60 /** Get the index for combo boxes.
55 * Returns the index of combo <b>num</b> or defindex 61 * Returns the index of combo <b>num</b> or defindex
56 * if none was defined.. 62 * if none was defined..
57 * @param num Selects the number of the combo 63 * @param num Selects the number of the combo
58 * @param defIndex will be returned if none was defined (either 64 * @param defIndex will be returned if none was defined (either
59 * globally in the config file, nor by the contact which was used 65 * globally in the config file, nor by the contact which was used
60 * by loadFromRecord() ) 66 * by loadFromRecord() )
61 */ 67 */
62 int getFieldOrder( int num, int defIndex); 68 int getFieldOrder( int num, int defIndex );
63 69
64 /** Store fieldorder to contact. */ 70 /** Store fieldorder to contact. */
65 void saveToRecord( OContact& ); 71 void saveToRecord( OContact& );
66 /** Get Fieldorder from contact. */ 72 /** Get Fieldorder from contact. */
67 void loadFromRecord( const OContact& ); 73 void loadFromRecord( const OContact& );
68 74
69 private: 75 private:
70 QString fieldOrder; 76 QString fieldOrder;
71 QString globalFieldOrder; 77 QString globalFieldOrder;
72 bool changedFieldOrder; 78 bool changedFieldOrder;
73 79
74 public: 80 public:
75 static QStringList personalfields( bool sorted = true, bool translated = false ); 81 static QStringList personalfields( bool sorted = true, bool translated = false );
76 static QStringList phonefields( bool sorted = true, bool translated = false ); 82 static QStringList phonefields( bool sorted = true, bool translated = false );
77 static QStringList detailsfields( bool sorted = true, bool translated = false ); 83 static QStringList detailsfields( bool sorted = true, bool translated = false );
78 static QStringList fields( bool sorted = true, bool translated = false ); 84 static QStringList fields( bool sorted = true, bool translated = false );
79 85
80 static QStringList trpersonalfields( bool sorted = true ); 86 static QStringList trpersonalfields( bool sorted = true );
81 static QStringList untrpersonalfields( bool sorted = true ); 87 static QStringList untrpersonalfields( bool sorted = true );
82 static QStringList trphonefields( bool sorted = true ); 88 static QStringList trphonefields( bool sorted = true );
83 static QStringList untrphonefields( bool sorted = true ); 89 static QStringList untrphonefields( bool sorted = true );
84 static QStringList trdetailsfields( bool sorted = true ); 90 static QStringList trdetailsfields( bool sorted = true );
85 static QStringList untrdetailsfields( bool sorted = true ); 91 static QStringList untrdetailsfields( bool sorted = true );
diff --git a/libopie2/opiepim/oevent.cpp b/libopie2/opiepim/oevent.cpp
index de5e30b..d9cee2b 100644
--- a/libopie2/opiepim/oevent.cpp
+++ b/libopie2/opiepim/oevent.cpp
@@ -1,9 +1,9 @@
1/* 1/*
2 This file is part of the Opie Project 2 This file is part of the Opie Project
3 Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de) 3 Copyright (C) Stefan Eilers <Eilers.Stefan@epost.de>
4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org> 4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org>
5 .=l. 5 .=l.
6 .>+-= 6 .>+-=
7 _;:, .> :=|. This program is free software; you can 7 _;:, .> :=|. This program is free software; you can
8.> <`_, > . <= redistribute it and/or modify it under 8.> <`_, > . <= redistribute it and/or modify it under
9:`=1 )Y*s>-.-- : the terms of the GNU Library General Public 9:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
@@ -23,318 +23,442 @@
23 -_. . . )=. = Library General Public License along with 23 -_. . . )=. = Library General Public License along with
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29#include <qshared.h>
30#include <qarray.h>
31 29
32#include <qpe/palmtopuidgen.h> 30#include "oevent.h"
33#include <qpe/categories.h>
34#include <qpe/stringutil.h>
35 31
32/* OPIE */
36#include <opie2/orecur.h> 33#include <opie2/orecur.h>
37#include <opie2/opimresolver.h> 34#include <opie2/opimresolver.h>
38#include <opie2/opimnotifymanager.h> 35#include <opie2/opimnotifymanager.h>
36#include <qpe/categories.h>
37#include <qpe/palmtopuidgen.h>
38#include <qpe/stringutil.h>
39 39
40#include <opie2/oevent.h> 40/* QT */
41#include <qshared.h>
42#include <qarray.h>
41 43
42namespace Opie { 44namespace Opie
45{
43 46
44int OCalendarHelper::week( const QDate& date) { 47int OCalendarHelper::week( const QDate& date )
48{
45 // Calculates the week this date is in within that 49 // Calculates the week this date is in within that
46 // month. Equals the "row" is is in in the month view 50 // month. Equals the "row" is is in in the month view
47 int week = 1; 51 int week = 1;
48 QDate tmp( date.year(), date.month(), 1 ); 52 QDate tmp( date.year(), date.month(), 1 );
49 if ( date.dayOfWeek() < tmp.dayOfWeek() ) 53 if ( date.dayOfWeek() < tmp.dayOfWeek() )
50 ++week; 54 ++week;
51 55
52 week += ( date.day() - 1 ) / 7; 56 week += ( date.day() - 1 ) / 7;
53 57
54 return week; 58 return week;
55} 59}
56int OCalendarHelper::ocurrence( const QDate& date) { 60
61
62int OCalendarHelper::ocurrence( const QDate& date )
63{
57 // calculates the number of occurrances of this day of the 64 // calculates the number of occurrances of this day of the
58 // week till the given date (e.g 3rd Wednesday of the month) 65 // week till the given date (e.g 3rd Wednesday of the month)
59 return ( date.day() - 1 ) / 7 + 1; 66 return ( date.day() - 1 ) / 7 + 1;
60} 67}
61int OCalendarHelper::dayOfWeek( char day ) { 68
69
70int OCalendarHelper::dayOfWeek( char day )
71{
62 int dayOfWeek = 1; 72 int dayOfWeek = 1;
63 char i = ORecur::MON; 73 char i = ORecur::MON;
64 while ( !( i & day ) && i <= ORecur::SUN ) { 74 while ( !( i & day ) && i <= ORecur::SUN )
75 {
65 i <<= 1; 76 i <<= 1;
66 ++dayOfWeek; 77 ++dayOfWeek;
67 } 78 }
68 return dayOfWeek; 79 return dayOfWeek;
69} 80}
70int OCalendarHelper::monthDiff( const QDate& first, const QDate& second ) { 81
82
83int OCalendarHelper::monthDiff( const QDate& first, const QDate& second )
84{
71 return ( second.year() - first.year() ) * 12 + 85 return ( second.year() - first.year() ) * 12 +
72 second.month() - first.month(); 86 second.month() - first.month();
73} 87}
74 88
75struct OEvent::Data : public QShared { 89
76 Data() : QShared() { 90struct OEvent::Data : public QShared
91{
92 Data() : QShared()
93 {
77 child = 0; 94 child = 0;
78 recur = 0; 95 recur = 0;
79 manager = 0; 96 manager = 0;
80 isAllDay = false; 97 isAllDay = false;
81 parent = 0; 98 parent = 0;
82 } 99 }
83 ~Data() { 100 ~Data()
101 {
84 delete manager; 102 delete manager;
85 delete recur; 103 delete recur;
86 } 104 }
87 QString description; 105 QString description;
88 QString location; 106 QString location;
89 OPimNotifyManager* manager; 107 OPimNotifyManager* manager;
90 ORecur* recur; 108 ORecur* recur;
91 QString note; 109 QString note;
92 QDateTime created; 110 QDateTime created;
93 QDateTime start; 111 QDateTime start;
94 QDateTime end; 112 QDateTime end;
95 bool isAllDay : 1; 113bool isAllDay : 1;
96 QString timezone; 114 QString timezone;
97 QArray<int>* child; 115 QArray<int>* child;
98 int parent; 116 int parent;
99}; 117};
100 118
119
101OEvent::OEvent( int uid ) 120OEvent::OEvent( int uid )
102 : OPimRecord( uid ) { 121 : OPimRecord( uid )
122{
103 data = new Data; 123 data = new Data;
104} 124}
105OEvent::OEvent( const OEvent& ev) 125
106 : OPimRecord( ev ), data( ev.data ) 126
127OEvent::OEvent( const OEvent& ev )
128 : OPimRecord( ev ), data( ev.data )
107{ 129{
108 data->ref(); 130 data->ref();
109} 131}
110 132
133
111OEvent::OEvent( const QMap<int, QString> map ) 134OEvent::OEvent( const QMap<int, QString> map )
112 : OPimRecord( 0 ) 135 : OPimRecord( 0 )
113{ 136{
114 data = new Data; 137 data = new Data;
115 138
116 fromMap( map ); 139 fromMap( map );
117} 140}
118 141
119OEvent::~OEvent() { 142
120 if ( data->deref() ) { 143OEvent::~OEvent()
144{
145 if ( data->deref() )
146 {
121 delete data; 147 delete data;
122 data = 0; 148 data = 0;
123 } 149 }
124} 150}
125OEvent& OEvent::operator=( const OEvent& ev) { 151
126 if ( this == &ev ) return *this; 152
153OEvent& OEvent::operator=( const OEvent& ev )
154{
155 if ( this == &ev ) return * this;
127 156
128 OPimRecord::operator=( ev ); 157 OPimRecord::operator=( ev );
129 ev.data->ref(); 158 ev.data->ref();
130 deref(); 159 deref();
131 data = ev.data; 160 data = ev.data;
132 161
133 162
134 return *this; 163 return *this;
135} 164}
136QString OEvent::description()const { 165
166
167QString OEvent::description() const
168{
137 return data->description; 169 return data->description;
138} 170}
139void OEvent::setDescription( const QString& description ) { 171
172
173void OEvent::setDescription( const QString& description )
174{
140 changeOrModify(); 175 changeOrModify();
141 data->description = description; 176 data->description = description;
142} 177}
143void OEvent::setLocation( const QString& loc ) { 178
179
180void OEvent::setLocation( const QString& loc )
181{
144 changeOrModify(); 182 changeOrModify();
145 data->location = loc; 183 data->location = loc;
146} 184}
147QString OEvent::location()const { 185
186
187QString OEvent::location() const
188{
148 return data->location; 189 return data->location;
149} 190}
150OPimNotifyManager &OEvent::notifiers()const { 191
192
193OPimNotifyManager &OEvent::notifiers() const
194{
151 // I hope we can skip the changeOrModify here 195 // I hope we can skip the changeOrModify here
152 // the notifier should take care of it 196 // the notifier should take care of it
153 // and OPimNotify is shared too 197 // and OPimNotify is shared too
154 if (!data->manager ) 198 if ( !data->manager )
155 data->manager = new OPimNotifyManager; 199 data->manager = new OPimNotifyManager;
156 200
157 return *data->manager; 201 return *data->manager;
158} 202}
159bool OEvent::hasNotifiers()const { 203
160 if (!data->manager ) 204
205bool OEvent::hasNotifiers() const
206{
207 if ( !data->manager )
161 return false; 208 return false;
162 if (data->manager->reminders().isEmpty() && 209 if ( data->manager->reminders().isEmpty() &&
163 data->manager->alarms().isEmpty() ) 210 data->manager->alarms().isEmpty() )
164 return false; 211 return false;
165 212
166 return true; 213 return true;
167} 214}
168ORecur OEvent::recurrence()const { 215
169 if (!data->recur) 216
217ORecur OEvent::recurrence() const
218{
219 if ( !data->recur )
170 data->recur = new ORecur; 220 data->recur = new ORecur;
171 221
172 return *data->recur; 222 return *data->recur;
173} 223}
174void OEvent::setRecurrence( const ORecur& rec) { 224
225
226void OEvent::setRecurrence( const ORecur& rec )
227{
175 changeOrModify(); 228 changeOrModify();
176 if (data->recur ) 229 if ( data->recur )
177 (*data->recur) = rec; 230 ( *data->recur ) = rec;
178 else 231 else
179 data->recur = new ORecur( rec ); 232 data->recur = new ORecur( rec );
180} 233}
181bool OEvent::hasRecurrence()const { 234
182 if (!data->recur ) return false; 235
236bool OEvent::hasRecurrence() const
237{
238 if ( !data->recur ) return false;
183 return data->recur->doesRecur(); 239 return data->recur->doesRecur();
184} 240}
185QString OEvent::note()const { 241
242
243QString OEvent::note() const
244{
186 return data->note; 245 return data->note;
187} 246}
188void OEvent::setNote( const QString& note ) { 247
248
249void OEvent::setNote( const QString& note )
250{
189 changeOrModify(); 251 changeOrModify();
190 data->note = note; 252 data->note = note;
191} 253}
192QDateTime OEvent::createdDateTime()const { 254
255
256QDateTime OEvent::createdDateTime() const
257{
193 return data->created; 258 return data->created;
194} 259}
195void OEvent::setCreatedDateTime( const QDateTime& time ) { 260
261
262void OEvent::setCreatedDateTime( const QDateTime& time )
263{
196 changeOrModify(); 264 changeOrModify();
197 data->created = time; 265 data->created = time;
198} 266}
199QDateTime OEvent::startDateTime()const { 267
268
269QDateTime OEvent::startDateTime() const
270{
200 if ( data->isAllDay ) 271 if ( data->isAllDay )
201 return QDateTime( data->start.date(), QTime(0, 0, 0 ) ); 272 return QDateTime( data->start.date(), QTime( 0, 0, 0 ) );
202 return data->start; 273 return data->start;
203} 274}
204QDateTime OEvent::startDateTimeInZone()const { 275
276
277QDateTime OEvent::startDateTimeInZone() const
278{
205 /* if no timezone, or all day event or if the current and this timeZone match... */ 279 /* if no timezone, or all day event or if the current and this timeZone match... */
206 if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return startDateTime(); 280 if ( data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return startDateTime();
207 281
208 OTimeZone zone(data->timezone ); 282 OTimeZone zone( data->timezone );
209 return zone.toDateTime( data->start, OTimeZone::current() ); 283 return zone.toDateTime( data->start, OTimeZone::current() );
210} 284}
211void OEvent::setStartDateTime( const QDateTime& dt ) { 285
286
287void OEvent::setStartDateTime( const QDateTime& dt )
288{
212 changeOrModify(); 289 changeOrModify();
213 data->start = dt; 290 data->start = dt;
214} 291}
215QDateTime OEvent::endDateTime()const { 292
293
294QDateTime OEvent::endDateTime() const
295{
216 /* 296 /*
217 * if all Day event the end time needs 297 * if all Day event the end time needs
218 * to be on the same day as the start 298 * to be on the same day as the start
219 */ 299 */
220 if ( data->isAllDay ) 300 if ( data->isAllDay )
221 return QDateTime( data->start.date(), QTime(23, 59, 59 ) ); 301 return QDateTime( data->start.date(), QTime( 23, 59, 59 ) );
222 return data->end; 302 return data->end;
223} 303}
224QDateTime OEvent::endDateTimeInZone()const { 304
305
306QDateTime OEvent::endDateTimeInZone() const
307{
225 /* if no timezone, or all day event or if the current and this timeZone match... */ 308 /* if no timezone, or all day event or if the current and this timeZone match... */
226 if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return endDateTime(); 309 if ( data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return endDateTime();
227 310
228 OTimeZone zone(data->timezone ); 311 OTimeZone zone( data->timezone );
229 return zone.toDateTime( data->end, OTimeZone::current() ); 312 return zone.toDateTime( data->end, OTimeZone::current() );
230} 313}
231void OEvent::setEndDateTime( const QDateTime& dt ) { 314
315
316void OEvent::setEndDateTime( const QDateTime& dt )
317{
232 changeOrModify(); 318 changeOrModify();
233 data->end = dt; 319 data->end = dt;
234} 320}
235bool OEvent::isMultipleDay()const { 321
322
323bool OEvent::isMultipleDay() const
324{
236 return data->end.date().day() - data->start.date().day(); 325 return data->end.date().day() - data->start.date().day();
237} 326}
238bool OEvent::isAllDay()const { 327
328
329bool OEvent::isAllDay() const
330{
239 return data->isAllDay; 331 return data->isAllDay;
240} 332}
241void OEvent::setAllDay( bool allDay ) { 333
334
335void OEvent::setAllDay( bool allDay )
336{
242 changeOrModify(); 337 changeOrModify();
243 data->isAllDay = allDay; 338 data->isAllDay = allDay;
244 if (allDay ) data->timezone = "UTC"; 339 if ( allDay ) data->timezone = "UTC";
245} 340}
246void OEvent::setTimeZone( const QString& tz ) { 341
342
343void OEvent::setTimeZone( const QString& tz )
344{
247 changeOrModify(); 345 changeOrModify();
248 data->timezone = tz; 346 data->timezone = tz;
249} 347}
250QString OEvent::timeZone()const { 348
251 if (data->isAllDay ) return QString::fromLatin1("UTC"); 349
350QString OEvent::timeZone() const
351{
352 if ( data->isAllDay ) return QString::fromLatin1( "UTC" );
252 return data->timezone; 353 return data->timezone;
253} 354}
254bool OEvent::match( const QRegExp& re )const { 355
255 if ( re.match( data->description ) != -1 ){ 356
357bool OEvent::match( const QRegExp& re ) const
358{
359 if ( re.match( data->description ) != -1 )
360 {
256 setLastHitField( Qtopia::DatebookDescription ); 361 setLastHitField( Qtopia::DatebookDescription );
257 return true; 362 return true;
258 } 363 }
259 if ( re.match( data->note ) != -1 ){ 364 if ( re.match( data->note ) != -1 )
365 {
260 setLastHitField( Qtopia::Note ); 366 setLastHitField( Qtopia::Note );
261 return true; 367 return true;
262 } 368 }
263 if ( re.match( data->location ) != -1 ){ 369 if ( re.match( data->location ) != -1 )
370 {
264 setLastHitField( Qtopia::Location ); 371 setLastHitField( Qtopia::Location );
265 return true; 372 return true;
266 } 373 }
267 if ( re.match( data->start.toString() ) != -1 ){ 374 if ( re.match( data->start.toString() ) != -1 )
375 {
268 setLastHitField( Qtopia::StartDateTime ); 376 setLastHitField( Qtopia::StartDateTime );
269 return true; 377 return true;
270 } 378 }
271 if ( re.match( data->end.toString() ) != -1 ){ 379 if ( re.match( data->end.toString() ) != -1 )
380 {
272 setLastHitField( Qtopia::EndDateTime ); 381 setLastHitField( Qtopia::EndDateTime );
273 return true; 382 return true;
274 } 383 }
275 return false; 384 return false;
276} 385}
277QString OEvent::toRichText()const { 386
387
388QString OEvent::toRichText() const
389{
278 QString text, value; 390 QString text, value;
279 391
280 // description 392 // description
281 text += "<b><h3><img src=\"datebook/DateBook\">"; 393 text += "<b><h3><img src=\"datebook/DateBook\">";
282 if ( !description().isEmpty() ) { 394 if ( !description().isEmpty() )
283 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "" ); 395 {
396 text += Qtopia::escapeString( description() ).replace( QRegExp( "[\n]" ), "" );
284 } 397 }
285 text += "</h3></b><br><hr><br>"; 398 text += "</h3></b><br><hr><br>";
286 399
287 // location 400 // location
288 if ( !(value = location()).isEmpty() ) { 401 if ( !( value = location() ).isEmpty() )
402 {
289 text += "<b>" + QObject::tr( "Location:" ) + "</b> "; 403 text += "<b>" + QObject::tr( "Location:" ) + "</b> ";
290 text += Qtopia::escapeString(value) + "<br>"; 404 text += Qtopia::escapeString( value ) + "<br>";
291 } 405 }
292 406
293 // all day event 407 // all day event
294 if ( isAllDay() ) { 408 if ( isAllDay() )
409 {
295 text += "<b><i>" + QObject::tr( "This is an all day event" ) + "</i></b><br>"; 410 text += "<b><i>" + QObject::tr( "This is an all day event" ) + "</i></b><br>";
296 } 411 }
297 // multiple day event 412 // multiple day event
298 else if ( isMultipleDay () ) { 413 else if ( isMultipleDay () )
414 {
299 text += "<b><i>" + QObject::tr( "This is a multiple day event" ) + "</i></b><br>"; 415 text += "<b><i>" + QObject::tr( "This is a multiple day event" ) + "</i></b><br>";
300 } 416 }
301 // start & end times 417 // start & end times
302 else { 418 else
419 {
303 // start time 420 // start time
304 if ( startDateTime().isValid() ) { 421 if ( startDateTime().isValid() )
305 text += "<b>" + QObject::tr( "Start:") + "</b> "; 422 {
306 text += Qtopia::escapeString(startDateTime().toString() ). 423 text += "<b>" + QObject::tr( "Start:" ) + "</b> ";
307 replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 424 text += Qtopia::escapeString( startDateTime().toString() ).
425 replace( QRegExp( "[\n]" ), "<br>" ) + "<br>";
308 } 426 }
309 427
310 // end time 428 // end time
311 if ( endDateTime().isValid() ) { 429 if ( endDateTime().isValid() )
312 text += "<b>" + QObject::tr( "End:") + "</b> "; 430 {
313 text += Qtopia::escapeString(endDateTime().toString() ). 431 text += "<b>" + QObject::tr( "End:" ) + "</b> ";
314 replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 432 text += Qtopia::escapeString( endDateTime().toString() ).
433 replace( QRegExp( "[\n]" ), "<br>" ) + "<br>";
315 } 434 }
316 } 435 }
317 436
318 // categories 437 // categories
319 if ( categoryNames("Calendar").count() ){ 438 if ( categoryNames( "Calendar" ).count() )
320 text += "<b>" + QObject::tr( "Category:") + "</b> "; 439 {
321 text += categoryNames("Calendar").join(", "); 440 text += "<b>" + QObject::tr( "Category:" ) + "</b> ";
322 text += "<br>"; 441 text += categoryNames( "Calendar" ).join( ", " );
442 text += "<br>";
323 } 443 }
324 444
325 //notes 445 //notes
326 if ( !note().isEmpty() ) { 446 if ( !note().isEmpty() )
327 text += "<b>" + QObject::tr( "Note:") + "</b><br>"; 447 {
448 text += "<b>" + QObject::tr( "Note:" ) + "</b><br>";
328 text += note(); 449 text += note();
329// text += Qtopia::escapeString(note() ). 450 // text += Qtopia::escapeString(note() ).
330// replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 451 // replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
331 } 452 }
332 return text; 453 return text;
333} 454}
334QString OEvent::toShortText()const { 455
456
457QString OEvent::toShortText() const
458{
335 QString text; 459 QString text;
336 text += QString::number( startDateTime().date().day() ); 460 text += QString::number( startDateTime().date().day() );
337 text += "."; 461 text += ".";
338 text += QString::number( startDateTime().date().month() ); 462 text += QString::number( startDateTime().date().month() );
339 text += "."; 463 text += ".";
340 text += QString::number( startDateTime().date().year() ); 464 text += QString::number( startDateTime().date().year() );
@@ -343,35 +467,54 @@ QString OEvent::toShortText()const {
343 text += ":"; 467 text += ":";
344 text += QString::number( startDateTime().time().minute() ); 468 text += QString::number( startDateTime().time().minute() );
345 text += " - "; 469 text += " - ";
346 text += description(); 470 text += description();
347 return text; 471 return text;
348} 472}
349QString OEvent::type()const { 473
350 return QString::fromLatin1("OEvent"); 474
475QString OEvent::type() const
476{
477 return QString::fromLatin1( "OEvent" );
351} 478}
352QString OEvent::recordField( int /*id */ )const { 479
480
481QString OEvent::recordField( int /*id */ ) const
482{
353 return QString::null; 483 return QString::null;
354} 484}
355int OEvent::rtti() { 485
486
487int OEvent::rtti()
488{
356 return OPimResolver::DateBook; 489 return OPimResolver::DateBook;
357} 490}
358bool OEvent::loadFromStream( QDataStream& ) { 491
492
493bool OEvent::loadFromStream( QDataStream& )
494{
359 return true; 495 return true;
360} 496}
361bool OEvent::saveToStream( QDataStream& )const { 497
498
499bool OEvent::saveToStream( QDataStream& ) const
500{
362 return true; 501 return true;
363} 502}
364void OEvent::changeOrModify() { 503
365 if ( data->count != 1 ) { 504
505void OEvent::changeOrModify()
506{
507 if ( data->count != 1 )
508 {
366 data->deref(); 509 data->deref();
367 Data* d2 = new Data; 510 Data* d2 = new Data;
368 d2->description = data->description; 511 d2->description = data->description;
369 d2->location = data->location; 512 d2->location = data->location;
370 513
371 if (data->manager ) 514 if ( data->manager )
372 d2->manager = new OPimNotifyManager( *data->manager ); 515 d2->manager = new OPimNotifyManager( *data->manager );
373 516
374 if ( data->recur ) 517 if ( data->recur )
375 d2->recur = new ORecur( *data->recur ); 518 d2->recur = new ORecur( *data->recur );
376 519
377 d2->note = data->note; 520 d2->note = data->note;
@@ -379,222 +522,271 @@ void OEvent::changeOrModify() {
379 d2->start = data->start; 522 d2->start = data->start;
380 d2->end = data->end; 523 d2->end = data->end;
381 d2->isAllDay = data->isAllDay; 524 d2->isAllDay = data->isAllDay;
382 d2->timezone = data->timezone; 525 d2->timezone = data->timezone;
383 d2->parent = data->parent; 526 d2->parent = data->parent;
384 527
385 if ( data->child ) { 528 if ( data->child )
529 {
386 d2->child = new QArray<int>( *data->child ); 530 d2->child = new QArray<int>( *data->child );
387 d2->child->detach(); 531 d2->child->detach();
388 } 532 }
389 533
390 data = d2; 534 data = d2;
391 } 535 }
392} 536}
393void OEvent::deref() { 537
394 if ( data->deref() ) { 538
539void OEvent::deref()
540{
541 if ( data->deref() )
542 {
395 delete data; 543 delete data;
396 data = 0; 544 data = 0;
397 } 545 }
398} 546}
399// Exporting Event data to map. Using the same 547// Exporting Event data to map. Using the same
400// encoding as ODateBookAccessBackend_xml does.. 548// encoding as ODateBookAccessBackend_xml does..
401// Thus, we could remove the stuff there and use this 549// Thus, we could remove the stuff there and use this
402// for it and for all other places.. 550// for it and for all other places..
403// Encoding should happen at one place, only ! (eilers) 551// Encoding should happen at one place, only ! (eilers)
404QMap<int, QString> OEvent::toMap()const { 552QMap<int, QString> OEvent::toMap() const
553{
405 QMap<int, QString> retMap; 554 QMap<int, QString> retMap;
406 555
407 retMap.insert( OEvent::FUid, QString::number( uid() ) ); 556 retMap.insert( OEvent::FUid, QString::number( uid() ) );
408 retMap.insert( OEvent::FCategories, Qtopia::escapeString( Qtopia::Record::idsToString( categories() ) )); 557 retMap.insert( OEvent::FCategories, Qtopia::escapeString( Qtopia::Record::idsToString( categories() ) ) );
409 retMap.insert( OEvent::FDescription, Qtopia::escapeString( description() ) ); 558 retMap.insert( OEvent::FDescription, Qtopia::escapeString( description() ) );
410 retMap.insert( OEvent::FLocation, Qtopia::escapeString( location() ) ); 559 retMap.insert( OEvent::FLocation, Qtopia::escapeString( location() ) );
411 retMap.insert( OEvent::FType, isAllDay() ? "AllDay" : "" ); 560 retMap.insert( OEvent::FType, isAllDay() ? "AllDay" : "" );
412 OPimAlarm alarm = notifiers().alarms()[0]; 561 OPimAlarm alarm = notifiers().alarms() [ 0 ];
413 retMap.insert( OEvent::FAlarm, QString::number( alarm.dateTime().secsTo( startDateTime() ) / 60 ) ); 562 retMap.insert( OEvent::FAlarm, QString::number( alarm.dateTime().secsTo( startDateTime() ) / 60 ) );
414 retMap.insert( OEvent::FSound, (alarm.sound() == OPimAlarm::Loud) ? "loud" : "silent" ); 563 retMap.insert( OEvent::FSound, ( alarm.sound() == OPimAlarm::Loud ) ? "loud" : "silent" );
415 564
416 OTimeZone zone( timeZone().isEmpty() ? OTimeZone::current() : timeZone() ); 565 OTimeZone zone( timeZone().isEmpty() ? OTimeZone::current() : timeZone() );
417 retMap.insert( OEvent::FStart, QString::number( zone.fromUTCDateTime( zone.toDateTime( startDateTime(), OTimeZone::utc() ) ) ) ); 566 retMap.insert( OEvent::FStart, QString::number( zone.fromUTCDateTime( zone.toDateTime( startDateTime(), OTimeZone::utc() ) ) ) );
418 retMap.insert( OEvent::FEnd, QString::number( zone.fromUTCDateTime( zone.toDateTime( endDateTime(), OTimeZone::utc() ) ) ) ); 567 retMap.insert( OEvent::FEnd, QString::number( zone.fromUTCDateTime( zone.toDateTime( endDateTime(), OTimeZone::utc() ) ) ) );
419 retMap.insert( OEvent::FNote, Qtopia::escapeString( note() ) ); 568 retMap.insert( OEvent::FNote, Qtopia::escapeString( note() ) );
420 retMap.insert( OEvent::FTimeZone, timeZone().isEmpty() ? QString( "None" ) : timeZone() ); 569 retMap.insert( OEvent::FTimeZone, timeZone().isEmpty() ? QString( "None" ) : timeZone() );
421 if( parent() ) 570 if ( parent() )
422 retMap.insert( OEvent::FRecParent, QString::number( parent() ) ); 571 retMap.insert( OEvent::FRecParent, QString::number( parent() ) );
423 if( children().count() ){ 572 if ( children().count() )
424 QArray<int> childr = children(); 573 {
425 QString buf; 574 QArray<int> childr = children();
426 for ( uint i = 0; i < childr.count(); i++ ) { 575 QString buf;
427 if ( i != 0 ) buf += " "; 576 for ( uint i = 0; i < childr.count(); i++ )
428 buf += QString::number( childr[i] ); 577 {
429 } 578 if ( i != 0 ) buf += " ";
430 retMap.insert( OEvent::FRecChildren, buf ); 579 buf += QString::number( childr[ i ] );
431 } 580 }
432 581 retMap.insert( OEvent::FRecChildren, buf );
582 }
583
433 // Add recurrence stuff 584 // Add recurrence stuff
434 if( hasRecurrence() ){ 585 if ( hasRecurrence() )
435 ORecur recur = recurrence(); 586 {
436 QMap<int, QString> recFields = recur.toMap(); 587 ORecur recur = recurrence();
437 retMap.insert( OEvent::FRType, recFields[ORecur::RType] ); 588 QMap<int, QString> recFields = recur.toMap();
438 retMap.insert( OEvent::FRWeekdays, recFields[ORecur::RWeekdays] ); 589 retMap.insert( OEvent::FRType, recFields[ ORecur::RType ] );
439 retMap.insert( OEvent::FRPosition, recFields[ORecur::RPosition] ); 590 retMap.insert( OEvent::FRWeekdays, recFields[ ORecur::RWeekdays ] );
440 retMap.insert( OEvent::FRFreq, recFields[ORecur::RFreq] ); 591 retMap.insert( OEvent::FRPosition, recFields[ ORecur::RPosition ] );
441 retMap.insert( OEvent::FRHasEndDate, recFields[ORecur::RHasEndDate] ); 592 retMap.insert( OEvent::FRFreq, recFields[ ORecur::RFreq ] );
442 retMap.insert( OEvent::FREndDate, recFields[ORecur::EndDate] ); 593 retMap.insert( OEvent::FRHasEndDate, recFields[ ORecur::RHasEndDate ] );
443 retMap.insert( OEvent::FRCreated, recFields[ORecur::Created] ); 594 retMap.insert( OEvent::FREndDate, recFields[ ORecur::EndDate ] );
444 retMap.insert( OEvent::FRExceptions, recFields[ORecur::Exceptions] ); 595 retMap.insert( OEvent::FRCreated, recFields[ ORecur::Created ] );
445 } else { 596 retMap.insert( OEvent::FRExceptions, recFields[ ORecur::Exceptions ] );
446 ORecur recur = recurrence(); 597 }
447 QMap<int, QString> recFields = recur.toMap(); 598 else
448 retMap.insert( OEvent::FRType, recFields[ORecur::RType] ); 599 {
449 } 600 ORecur recur = recurrence();
450 601 QMap<int, QString> recFields = recur.toMap();
602 retMap.insert( OEvent::FRType, recFields[ ORecur::RType ] );
603 }
604
451 return retMap; 605 return retMap;
452} 606}
453 607
608
454void OEvent::fromMap( const QMap<int, QString>& map ) 609void OEvent::fromMap( const QMap<int, QString>& map )
455{ 610{
456 611
457 // We just want to set the UID if it is really stored. 612 // We just want to set the UID if it is really stored.
458 if ( !map[OEvent::FUid].isEmpty() ) 613 if ( !map[ OEvent::FUid ].isEmpty() )
459 setUid( map[OEvent::FUid].toInt() ); 614 setUid( map[ OEvent::FUid ].toInt() );
460 615
461 setCategories( idsFromString( map[OEvent::FCategories] ) ); 616 setCategories( idsFromString( map[ OEvent::FCategories ] ) );
462 setDescription( map[OEvent::FDescription] ); 617 setDescription( map[ OEvent::FDescription ] );
463 setLocation( map[OEvent::FLocation] ); 618 setLocation( map[ OEvent::FLocation ] );
464 619
465 if ( map[OEvent::FType] == "AllDay" ) 620 if ( map[ OEvent::FType ] == "AllDay" )
466 setAllDay( true ); 621 setAllDay( true );
467 else 622 else
468 setAllDay( false ); 623 setAllDay( false );
469 624
470 int alarmTime = -1; 625 int alarmTime = -1;
471 if( !map[OEvent::FAlarm].isEmpty() ) 626 if ( !map[ OEvent::FAlarm ].isEmpty() )
472 alarmTime = map[OEvent::FAlarm].toInt(); 627 alarmTime = map[ OEvent::FAlarm ].toInt();
473 628
474 int sound = ( ( map[OEvent::FSound] == "loud" ) ? OPimAlarm::Loud : OPimAlarm::Silent ); 629 int sound = ( ( map[ OEvent::FSound ] == "loud" ) ? OPimAlarm::Loud : OPimAlarm::Silent );
475 if ( ( alarmTime != -1 ) ){ 630 if ( ( alarmTime != -1 ) )
476 QDateTime dt = startDateTime().addSecs( -1*alarmTime*60 ); 631 {
477 OPimAlarm al( sound , dt ); 632 QDateTime dt = startDateTime().addSecs( -1 * alarmTime * 60 );
478 notifiers().add( al ); 633 OPimAlarm al( sound , dt );
479 } 634 notifiers().add( al );
480 if ( !map[OEvent::FTimeZone].isEmpty() && ( map[OEvent::FTimeZone] != "None" ) ){ 635 }
481 setTimeZone( map[OEvent::FTimeZone] ); 636 if ( !map[ OEvent::FTimeZone ].isEmpty() && ( map[ OEvent::FTimeZone ] != "None" ) )
482 } 637 {
483 638 setTimeZone( map[ OEvent::FTimeZone ] );
484 time_t start = (time_t) map[OEvent::FStart].toLong(); 639 }
485 time_t end = (time_t) map[OEvent::FEnd].toLong(); 640
486 641 time_t start = ( time_t ) map[ OEvent::FStart ].toLong();
487 /* AllDay is always in UTC */ 642 time_t end = ( time_t ) map[ OEvent::FEnd ].toLong();
488 if ( isAllDay() ) { 643
489 OTimeZone utc = OTimeZone::utc(); 644 /* AllDay is always in UTC */
490 setStartDateTime( utc.fromUTCDateTime( start ) ); 645 if ( isAllDay() )
491 setEndDateTime ( utc.fromUTCDateTime( end ) ); 646 {
492 setTimeZone( "UTC"); // make sure it is really utc 647 OTimeZone utc = OTimeZone::utc();
493 }else { 648 setStartDateTime( utc.fromUTCDateTime( start ) );
494 /* to current date time */ 649 setEndDateTime ( utc.fromUTCDateTime( end ) );
495 // qWarning(" Start is %d", start ); 650 setTimeZone( "UTC" ); // make sure it is really utc
496 OTimeZone zone( timeZone().isEmpty() ? OTimeZone::current() : timeZone() ); 651 }
497 QDateTime date = zone.toDateTime( start ); 652 else
498 qWarning(" Start is %s", date.toString().latin1() ); 653 {
499 setStartDateTime( zone.toDateTime( date, OTimeZone::current() ) ); 654 /* to current date time */
500 655 // qWarning(" Start is %d", start );
501 date = zone.toDateTime( end ); 656 OTimeZone zone( timeZone().isEmpty() ? OTimeZone::current() : timeZone() );
502 setEndDateTime ( zone.toDateTime( date, OTimeZone::current() ) ); 657 QDateTime date = zone.toDateTime( start );
503 } 658 qWarning( " Start is %s", date.toString().latin1() );
504 659 setStartDateTime( zone.toDateTime( date, OTimeZone::current() ) );
505 if ( !map[OEvent::FRecParent].isEmpty() ) 660
506 setParent( map[OEvent::FRecParent].toInt() ); 661 date = zone.toDateTime( end );
507 662 setEndDateTime ( zone.toDateTime( date, OTimeZone::current() ) );
508 if ( !map[OEvent::FRecChildren].isEmpty() ){ 663 }
509 QStringList list = QStringList::split(' ', map[OEvent::FRecChildren] ); 664
510 for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { 665 if ( !map[ OEvent::FRecParent ].isEmpty() )
511 addChild( (*it).toInt() ); 666 setParent( map[ OEvent::FRecParent ].toInt() );
512 } 667
513 } 668 if ( !map[ OEvent::FRecChildren ].isEmpty() )
514 669 {
515 // Fill recurrence stuff and put it directly into the ORecur-Object using fromMap.. 670 QStringList list = QStringList::split( ' ', map[ OEvent::FRecChildren ] );
516 if( !map[OEvent::FRType].isEmpty() ){ 671 for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
517 QMap<int, QString> recFields; 672 {
518 recFields.insert( ORecur::RType, map[OEvent::FRType] ); 673 addChild( ( *it ).toInt() );
519 recFields.insert( ORecur::RWeekdays, map[OEvent::FRWeekdays] ); 674 }
520 recFields.insert( ORecur::RPosition, map[OEvent::FRPosition] ); 675 }
521 recFields.insert( ORecur::RFreq, map[OEvent::FRFreq] ); 676
522 recFields.insert( ORecur::RHasEndDate, map[OEvent::FRHasEndDate] ); 677 // Fill recurrence stuff and put it directly into the ORecur-Object using fromMap..
523 recFields.insert( ORecur::EndDate, map[OEvent::FREndDate] ); 678 if ( !map[ OEvent::FRType ].isEmpty() )
524 recFields.insert( ORecur::Created, map[OEvent::FRCreated] ); 679 {
525 recFields.insert( ORecur::Exceptions, map[OEvent::FRExceptions] ); 680 QMap<int, QString> recFields;
526 ORecur recur( recFields ); 681 recFields.insert( ORecur::RType, map[ OEvent::FRType ] );
527 setRecurrence( recur ); 682 recFields.insert( ORecur::RWeekdays, map[ OEvent::FRWeekdays ] );
528 } 683 recFields.insert( ORecur::RPosition, map[ OEvent::FRPosition ] );
529 684 recFields.insert( ORecur::RFreq, map[ OEvent::FRFreq ] );
530} 685 recFields.insert( ORecur::RHasEndDate, map[ OEvent::FRHasEndDate ] );
531 686 recFields.insert( ORecur::EndDate, map[ OEvent::FREndDate ] );
532 687 recFields.insert( ORecur::Created, map[ OEvent::FRCreated ] );
533int OEvent::parent()const { 688 recFields.insert( ORecur::Exceptions, map[ OEvent::FRExceptions ] );
689 ORecur recur( recFields );
690 setRecurrence( recur );
691 }
692
693}
694
695
696int OEvent::parent() const
697{
534 return data->parent; 698 return data->parent;
535} 699}
536void OEvent::setParent( int uid ) { 700
701
702void OEvent::setParent( int uid )
703{
537 changeOrModify(); 704 changeOrModify();
538 data->parent = uid; 705 data->parent = uid;
539} 706}
540QArray<int> OEvent::children() const{ 707
541 if (!data->child) return QArray<int>(); 708
709QArray<int> OEvent::children() const
710{
711 if ( !data->child ) return QArray<int>();
542 else 712 else
543 return data->child->copy(); 713 return data->child->copy();
544} 714}
545void OEvent::setChildren( const QArray<int>& arr ) { 715
716
717void OEvent::setChildren( const QArray<int>& arr )
718{
546 changeOrModify(); 719 changeOrModify();
547 if (data->child) delete data->child; 720 if ( data->child ) delete data->child;
548 721
549 data->child = new QArray<int>( arr ); 722 data->child = new QArray<int>( arr );
550 data->child->detach(); 723 data->child->detach();
551} 724}
552void OEvent::addChild( int uid ) { 725
726
727void OEvent::addChild( int uid )
728{
553 changeOrModify(); 729 changeOrModify();
554 if (!data->child ) { 730 if ( !data->child )
555 data->child = new QArray<int>(1); 731 {
556 (*data->child)[0] = uid; 732 data->child = new QArray<int>( 1 );
557 }else{ 733 ( *data->child ) [ 0 ] = uid;
734 }
735 else
736 {
558 int count = data->child->count(); 737 int count = data->child->count();
559 data->child->resize( count + 1 ); 738 data->child->resize( count + 1 );
560 (*data->child)[count] = uid; 739 ( *data->child ) [ count ] = uid;
561 } 740 }
562} 741}
563void OEvent::removeChild( int uid ) { 742
564 if (!data->child || !data->child->contains( uid ) ) return; 743
744void OEvent::removeChild( int uid )
745{
746 if ( !data->child || !data->child->contains( uid ) ) return ;
565 changeOrModify(); 747 changeOrModify();
566 QArray<int> newAr( data->child->count() - 1 ); 748 QArray<int> newAr( data->child->count() - 1 );
567 int j = 0; 749 int j = 0;
568 uint count = data->child->count(); 750 uint count = data->child->count();
569 for ( uint i = 0; i < count; i++ ) { 751 for ( uint i = 0; i < count; i++ )
570 if ( (*data->child)[i] != uid ) { 752 {
571 newAr[j] = (*data->child)[i]; 753 if ( ( *data->child ) [ i ] != uid )
754 {
755 newAr[ j ] = ( *data->child ) [ i ];
572 j++; 756 j++;
573 } 757 }
574 } 758 }
575 (*data->child) = newAr; 759 ( *data->child ) = newAr;
576} 760}
577struct OEffectiveEvent::Data : public QShared { 761
578 Data() : QShared() { 762
579 } 763struct OEffectiveEvent::Data : public QShared
764{
765 Data() : QShared()
766 {}
580 OEvent event; 767 OEvent event;
581 QDate date; 768 QDate date;
582 QTime start, end; 769 QTime start, end;
583 QDate startDate, endDate; 770 QDate startDate, endDate;
584 bool dates : 1; 771bool dates : 1;
585}; 772};
586 773
587OEffectiveEvent::OEffectiveEvent() { 774
775OEffectiveEvent::OEffectiveEvent()
776{
588 data = new Data; 777 data = new Data;
589 data->date = QDate::currentDate(); 778 data->date = QDate::currentDate();
590 data->start = data->end = QTime::currentTime(); 779 data->start = data->end = QTime::currentTime();
591 data->dates = false; 780 data->dates = false;
592} 781}
782
783
593OEffectiveEvent::OEffectiveEvent( const OEvent& ev, const QDate& startDate, 784OEffectiveEvent::OEffectiveEvent( const OEvent& ev, const QDate& startDate,
594 Position pos ) { 785 Position pos )
786{
595 data = new Data; 787 data = new Data;
596 data->event = ev; 788 data->event = ev;
597 data->date = startDate; 789 data->date = startDate;
598 if ( pos & Start ) 790 if ( pos & Start )
599 data->start = ev.startDateTime().time(); 791 data->start = ev.startDateTime().time();
600 else 792 else
@@ -604,146 +796,230 @@ OEffectiveEvent::OEffectiveEvent( const OEvent& ev, const QDate& startDate,
604 data->end = ev.endDateTime().time(); 796 data->end = ev.endDateTime().time();
605 else 797 else
606 data->end = QTime( 23, 59, 59 ); 798 data->end = QTime( 23, 59, 59 );
607 799
608 data->dates = false; 800 data->dates = false;
609} 801}
610OEffectiveEvent::OEffectiveEvent( const OEffectiveEvent& ev) { 802
803
804OEffectiveEvent::OEffectiveEvent( const OEffectiveEvent& ev )
805{
611 data = ev.data; 806 data = ev.data;
612 data->ref(); 807 data->ref();
613} 808}
614OEffectiveEvent::~OEffectiveEvent() { 809
615 if ( data->deref() ) { 810
811OEffectiveEvent::~OEffectiveEvent()
812{
813 if ( data->deref() )
814 {
616 delete data; 815 delete data;
617 data = 0; 816 data = 0;
618 } 817 }
619} 818}
620OEffectiveEvent& OEffectiveEvent::operator=( const OEffectiveEvent& ev ) { 819
621 if ( *this == ev ) return *this; 820
821OEffectiveEvent& OEffectiveEvent::operator=( const OEffectiveEvent& ev )
822{
823 if ( *this == ev ) return * this;
622 824
623 ev.data->ref(); 825 ev.data->ref();
624 deref(); 826 deref();
625 data = ev.data; 827 data = ev.data;
626 828
627 return *this; 829 return *this;
628} 830}
629 831
630void OEffectiveEvent::setStartTime( const QTime& ti) { 832
833void OEffectiveEvent::setStartTime( const QTime& ti )
834{
631 changeOrModify(); 835 changeOrModify();
632 data->start = ti; 836 data->start = ti;
633} 837}
634void OEffectiveEvent::setEndTime( const QTime& en) { 838
839
840void OEffectiveEvent::setEndTime( const QTime& en )
841{
635 changeOrModify(); 842 changeOrModify();
636 data->end = en; 843 data->end = en;
637} 844}
638void OEffectiveEvent::setEvent( const OEvent& ev) { 845
846
847void OEffectiveEvent::setEvent( const OEvent& ev )
848{
639 changeOrModify(); 849 changeOrModify();
640 data->event = ev; 850 data->event = ev;
641} 851}
642void OEffectiveEvent::setDate( const QDate& da) { 852
853
854void OEffectiveEvent::setDate( const QDate& da )
855{
643 changeOrModify(); 856 changeOrModify();
644 data->date = da; 857 data->date = da;
645} 858}
859
860
646void OEffectiveEvent::setEffectiveDates( const QDate& from, 861void OEffectiveEvent::setEffectiveDates( const QDate& from,
647 const QDate& to ) { 862 const QDate& to )
648 if (!from.isValid() ) { 863{
864 if ( !from.isValid() )
865 {
649 data->dates = false; 866 data->dates = false;
650 return; 867 return ;
651 } 868 }
652 869
653 data->startDate = from; 870 data->startDate = from;
654 data->endDate = to; 871 data->endDate = to;
655} 872}
656QString OEffectiveEvent::description()const { 873
874
875QString OEffectiveEvent::description() const
876{
657 return data->event.description(); 877 return data->event.description();
658} 878}
659QString OEffectiveEvent::location()const { 879
880
881QString OEffectiveEvent::location() const
882{
660 return data->event.location(); 883 return data->event.location();
661} 884}
662QString OEffectiveEvent::note()const { 885
886
887QString OEffectiveEvent::note() const
888{
663 return data->event.note(); 889 return data->event.note();
664} 890}
665OEvent OEffectiveEvent::event()const { 891
892
893OEvent OEffectiveEvent::event() const
894{
666 return data->event; 895 return data->event;
667} 896}
668QTime OEffectiveEvent::startTime()const { 897
898
899QTime OEffectiveEvent::startTime() const
900{
669 return data->start; 901 return data->start;
670} 902}
671QTime OEffectiveEvent::endTime()const { 903
904
905QTime OEffectiveEvent::endTime() const
906{
672 return data->end; 907 return data->end;
673} 908}
674QDate OEffectiveEvent::date()const { 909
910
911QDate OEffectiveEvent::date() const
912{
675 return data->date; 913 return data->date;
676} 914}
677int OEffectiveEvent::length()const { 915
678 return (data->end.hour() * 60 - data->start.hour() * 60) 916
679 + QABS(data->start.minute() - data->end.minute() ); 917int OEffectiveEvent::length() const
918{
919 return ( data->end.hour() * 60 - data->start.hour() * 60 )
920 + QABS( data->start.minute() - data->end.minute() );
680} 921}
681int OEffectiveEvent::size()const { 922
923
924int OEffectiveEvent::size() const
925{
682 return ( data->end.hour() - data->start.hour() ) * 3600 926 return ( data->end.hour() - data->start.hour() ) * 3600
683 + (data->end.minute() - data->start.minute() * 60 927 + ( data->end.minute() - data->start.minute() * 60
684 + data->end.second() - data->start.second() ); 928 + data->end.second() - data->start.second() );
685} 929}
686QDate OEffectiveEvent::startDate()const { 930
931
932QDate OEffectiveEvent::startDate() const
933{
687 if ( data->dates ) 934 if ( data->dates )
688 return data->startDate; 935 return data->startDate;
689 else if ( data->event.hasRecurrence() ) // single day, since multi-day should have a d pointer 936 else if ( data->event.hasRecurrence() ) // single day, since multi-day should have a d pointer
690 return data->date; 937 return data->date;
691 else 938 else
692 return data->event.startDateTime().date(); 939 return data->event.startDateTime().date();
693} 940}
694QDate OEffectiveEvent::endDate()const { 941
942
943QDate OEffectiveEvent::endDate() const
944{
695 if ( data->dates ) 945 if ( data->dates )
696 return data->endDate; 946 return data->endDate;
697 else if ( data->event.hasRecurrence() ) 947 else if ( data->event.hasRecurrence() )
698 return data->date; 948 return data->date;
699 else 949 else
700 return data->event.endDateTime().date(); 950 return data->event.endDateTime().date();
701} 951}
702void OEffectiveEvent::deref() { 952
703 if ( data->deref() ) { 953
954void OEffectiveEvent::deref()
955{
956 if ( data->deref() )
957 {
704 delete data; 958 delete data;
705 data = 0; 959 data = 0;
706 } 960 }
707} 961}
708void OEffectiveEvent::changeOrModify() { 962
709 if ( data->count != 1 ) { 963
964void OEffectiveEvent::changeOrModify()
965{
966 if ( data->count != 1 )
967 {
710 data->deref(); 968 data->deref();
711 Data* d2 = new Data; 969 Data* d2 = new Data;
712 d2->event = data->event; 970 d2->event = data->event;
713 d2->date = data->date; 971 d2->date = data->date;
714 d2->start = data->start; 972 d2->start = data->start;
715 d2->end = data->end; 973 d2->end = data->end;
716 d2->startDate = data->startDate; 974 d2->startDate = data->startDate;
717 d2->endDate = data->endDate; 975 d2->endDate = data->endDate;
718 d2->dates = data->dates; 976 d2->dates = data->dates;
719 data = d2; 977 data = d2;
720 } 978 }
721} 979}
722bool OEffectiveEvent::operator<( const OEffectiveEvent &e ) const{ 980
981
982bool OEffectiveEvent::operator<( const OEffectiveEvent &e ) const
983{
723 if ( data->date < e.date() ) 984 if ( data->date < e.date() )
724 return TRUE; 985 return TRUE;
725 if ( data->date == e.date() ) 986 if ( data->date == e.date() )
726 return ( startTime() < e.startTime() ); 987 return ( startTime() < e.startTime() );
727 else 988 else
728 return FALSE; 989 return FALSE;
729} 990}
730bool OEffectiveEvent::operator<=( const OEffectiveEvent &e ) const{ 991
731 return (data->date <= e.date() ); 992
993bool OEffectiveEvent::operator<=( const OEffectiveEvent &e ) const
994{
995 return ( data->date <= e.date() );
732} 996}
733bool OEffectiveEvent::operator==( const OEffectiveEvent &e ) const { 997
998
999bool OEffectiveEvent::operator==( const OEffectiveEvent &e ) const
1000{
734 return ( date() == e.date() 1001 return ( date() == e.date()
735 && startTime() == e.startTime() 1002 && startTime() == e.startTime()
736 && endTime()== e.endTime() 1003 && endTime() == e.endTime()
737 && event() == e.event() ); 1004 && event() == e.event() );
738} 1005}
739bool OEffectiveEvent::operator!=( const OEffectiveEvent &e ) const { 1006
740 return !(*this == e ); 1007
1008bool OEffectiveEvent::operator!=( const OEffectiveEvent &e ) const
1009{
1010 return !( *this == e );
741} 1011}
742bool OEffectiveEvent::operator>( const OEffectiveEvent &e ) const { 1012
743 return !(*this <= e ); 1013
1014bool OEffectiveEvent::operator>( const OEffectiveEvent &e ) const
1015{
1016 return !( *this <= e );
744} 1017}
745bool OEffectiveEvent::operator>= ( const OEffectiveEvent &e ) const { 1018
746 return !(*this < e); 1019
1020bool OEffectiveEvent::operator>= ( const OEffectiveEvent &e ) const
1021{
1022 return !( *this < e );
747} 1023}
748 1024
749} 1025}
diff --git a/libopie2/opiepim/oevent.h b/libopie2/opiepim/oevent.h
index 9502efa..dc5e4d6 100644
--- a/libopie2/opiepim/oevent.h
+++ b/libopie2/opiepim/oevent.h
@@ -1,9 +1,9 @@
1/* 1/*
2 This file is part of the Opie Project 2 This file is part of the Opie Project
3 Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de) 3 Copyright (C) Stefan Eilers <Eilers.Stefan@epost.de>
4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org> 4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org>
5 .=l. 5 .=l.
6 .>+-= 6 .>+-=
7 _;:, .> :=|. This program is free software; you can 7 _;:, .> :=|. This program is free software; you can
8.> <`_, > . <= redistribute it and/or modify it under 8.> <`_, > . <= redistribute it and/or modify it under
9:`=1 )Y*s>-.-- : the terms of the GNU Library General Public 9:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
@@ -25,27 +25,30 @@
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29// CONTAINS GPLed code of TT 29// CONTAINS GPLed code of TT
30 30
31#ifndef OPIE_PIM_EVENT_H 31#ifndef OEVENT_H
32#define OPIE_PIM_EVENT_H 32#define OEVENT_H
33
34#include <qstring.h>
35#include <qdatetime.h>
36#include <qvaluelist.h>
37 33
34/* OPIE */
35#include <opie2/otimezone.h>
36#include <opie2/opimrecord.h>
38#include <qpe/recordfields.h> 37#include <qpe/recordfields.h>
39#include <qpe/palmtopuidgen.h> 38#include <qpe/palmtopuidgen.h>
40 39
41#include <opie2/otimezone.h> 40/* QT */
42#include <opie2/opimrecord.h> 41#include <qstring.h>
42#include <qdatetime.h>
43#include <qvaluelist.h>
43 44
44namespace Opie { 45namespace Opie
45struct OCalendarHelper { 46{
47struct OCalendarHelper
48{
46 /** calculate the week number of the date */ 49 /** calculate the week number of the date */
47 static int week( const QDate& ); 50 static int week( const QDate& );
48 /** calculate the occurence of week days since the start of the month */ 51 /** calculate the occurence of week days since the start of the month */
49 static int ocurrence( const QDate& ); 52 static int ocurrence( const QDate& );
50 53
51 // returns the dayOfWeek for the *first* day it finds (ignores 54 // returns the dayOfWeek for the *first* day it finds (ignores
@@ -62,47 +65,48 @@ class ORecur;
62 65
63/** 66/**
64 * This is the container for all Events. It encapsules all 67 * This is the container for all Events. It encapsules all
65 * available information for a single Event 68 * available information for a single Event
66 * @short container for events. 69 * @short container for events.
67 */ 70 */
68class OEvent : public OPimRecord { 71class OEvent : public OPimRecord
69public: 72{
73 public:
70 typedef QValueList<OEvent> ValueList; 74 typedef QValueList<OEvent> ValueList;
71 /** 75 /**
72 * RecordFields contain possible attributes 76 * RecordFields contain possible attributes
73 * used in the Results of toMap().. 77 * used in the Results of toMap()..
74 */ 78 */
75 enum RecordFields { 79 enum RecordFields {
76 FUid = Qtopia::UID_ID, 80 FUid = Qtopia::UID_ID,
77 FCategories = Qtopia::CATEGORY_ID, 81 FCategories = Qtopia::CATEGORY_ID,
78 FDescription = 0, 82 FDescription = 0,
79 FLocation, 83 FLocation,
80 FType, 84 FType,
81 FAlarm, 85 FAlarm,
82 FSound, 86 FSound,
83 FRType, 87 FRType,
84 FRWeekdays, 88 FRWeekdays,
85 FRPosition, 89 FRPosition,
86 FRFreq, 90 FRFreq,
87 FRHasEndDate, 91 FRHasEndDate,
88 FREndDate, 92 FREndDate,
89 FRCreated, 93 FRCreated,
90 FRExceptions, 94 FRExceptions,
91 FStart, 95 FStart,
92 FEnd, 96 FEnd,
93 FNote, 97 FNote,
94 FTimeZone, 98 FTimeZone,
95 FRecParent, 99 FRecParent,
96 FRecChildren, 100 FRecChildren,
97 }; 101 };
98 102
99 /** 103 /**
100 * Start with an Empty OEvent. UID == 0 means that it is empty 104 * Start with an Empty OEvent. UID == 0 means that it is empty
101 */ 105 */
102 OEvent(int uid = 0); 106 OEvent( int uid = 0 );
103 107
104 /** 108 /**
105 * copy c'tor 109 * copy c'tor
106 */ 110 */
107 OEvent( const OEvent& ); 111 OEvent( const OEvent& );
108 112
@@ -111,152 +115,155 @@ public:
111 * @see enum RecordFields 115 * @see enum RecordFields
112 */ 116 */
113 OEvent( const QMap<int, QString> map ); 117 OEvent( const QMap<int, QString> map );
114 ~OEvent(); 118 ~OEvent();
115 OEvent &operator=( const OEvent& ); 119 OEvent &operator=( const OEvent& );
116 120
117 QString description()const; 121 QString description() const;
118 void setDescription( const QString& description ); 122 void setDescription( const QString& description );
119 123
120 QString location()const; 124 QString location() const;
121 void setLocation( const QString& loc ); 125 void setLocation( const QString& loc );
122 126
123 bool hasNotifiers()const; 127 bool hasNotifiers() const;
124 OPimNotifyManager &notifiers()const; 128 OPimNotifyManager &notifiers() const;
125 129
126 ORecur recurrence()const; 130 ORecur recurrence() const;
127 void setRecurrence( const ORecur& ); 131 void setRecurrence( const ORecur& );
128 bool hasRecurrence()const; 132 bool hasRecurrence() const;
129 133
130 QString note()const; 134 QString note() const;
131 void setNote( const QString& note ); 135 void setNote( const QString& note );
132 136
133 137
134 QDateTime createdDateTime()const; 138 QDateTime createdDateTime() const;
135 void setCreatedDateTime( const QDateTime& dt); 139 void setCreatedDateTime( const QDateTime& dt );
136 140
137 /** set the date to dt. dt is the QDateTime in localtime */ 141 /** set the date to dt. dt is the QDateTime in localtime */
138 void setStartDateTime( const QDateTime& ); 142 void setStartDateTime( const QDateTime& );
139 /** returns the datetime in the local timeZone */ 143 /** returns the datetime in the local timeZone */
140 QDateTime startDateTime()const; 144 QDateTime startDateTime() const;
141 145
142 /** returns the start datetime in the current zone */ 146 /** returns the start datetime in the current zone */
143 QDateTime startDateTimeInZone()const; 147 QDateTime startDateTimeInZone() const;
144 148
145 /** in current timezone */ 149 /** in current timezone */
146 void setEndDateTime( const QDateTime& ); 150 void setEndDateTime( const QDateTime& );
147 /** in current timezone */ 151 /** in current timezone */
148 QDateTime endDateTime()const; 152 QDateTime endDateTime() const;
149 QDateTime endDateTimeInZone()const; 153 QDateTime endDateTimeInZone() const;
150 154
151 bool isMultipleDay()const; 155 bool isMultipleDay() const;
152 bool isAllDay()const; 156 bool isAllDay() const;
153 void setAllDay( bool isAllDay ); 157 void setAllDay( bool isAllDay );
154 158
155 /* pin this event to a timezone! FIXME */ 159 /* pin this event to a timezone! FIXME */
156 void setTimeZone( const QString& timeZone ); 160 void setTimeZone( const QString& timeZone );
157 QString timeZone()const; 161 QString timeZone() const;
158 162
159 163
160 virtual bool match( const QRegExp& )const; 164 virtual bool match( const QRegExp& ) const;
161 165
162 /** For exception to recurrence here is a list of children... */ 166 /** For exception to recurrence here is a list of children... */
163 QArray<int> children()const; 167 QArray<int> children() const;
164 void setChildren( const QArray<int>& ); 168 void setChildren( const QArray<int>& );
165 void addChild( int uid ); 169 void addChild( int uid );
166 void removeChild( int uid ); 170 void removeChild( int uid );
167 171
168 /** return the parent OEvent */ 172 /** return the parent OEvent */
169 int parent()const; 173 int parent() const;
170 void setParent( int uid ); 174 void setParent( int uid );
171 175
172 176
173 /* needed reimp */ 177 /* needed reimp */
174 QString toRichText()const; 178 QString toRichText() const;
175 QString toShortText()const; 179 QString toShortText() const;
176 QString type()const; 180 QString type() const;
177 181
178 QMap<int, QString> toMap()const; 182 QMap<int, QString> toMap() const;
179 void fromMap( const QMap<int, QString>& map ); 183 void fromMap( const QMap<int, QString>& map );
180 QString recordField(int )const; 184 QString recordField( int ) const;
181 185
182 static int rtti(); 186 static int rtti();
183 187
184 bool loadFromStream( QDataStream& ); 188 bool loadFromStream( QDataStream& );
185 bool saveToStream( QDataStream& )const; 189 bool saveToStream( QDataStream& ) const;
186 190
187/* bool operator==( const OEvent& ); 191 /* bool operator==( const OEvent& );
188 bool operator!=( const OEvent& ); 192 bool operator!=( const OEvent& );
189 bool operator<( const OEvent& ); 193 bool operator<( const OEvent& );
190 bool operator<=( const OEvent& ); 194 bool operator<=( const OEvent& );
191 bool operator>( const OEvent& ); 195 bool operator>( const OEvent& );
192 bool operator>=(const OEvent& ); 196 bool operator>=(const OEvent& );
193*/ 197 */
194private: 198
199 private:
195 inline void changeOrModify(); 200 inline void changeOrModify();
196 void deref(); 201 void deref();
197 struct Data; 202 struct Data;
198 Data* data; 203 Data* data;
199 class Private; 204 class Private;
200 Private* priv; 205 Private* priv;
201 206
202}; 207};
203 208
204/** 209/**
205 * AN Event can span through multiple days. We split up a multiday eve 210 * AN Event can span through multiple days. We split up a multiday eve
206 */ 211 */
207class OEffectiveEvent { 212class OEffectiveEvent
208public: 213{
214
215 public:
209 typedef QValueList<OEffectiveEvent> ValueList; 216 typedef QValueList<OEffectiveEvent> ValueList;
210 enum Position { MidWay, Start, End, StartEnd }; 217 enum Position { MidWay, Start, End, StartEnd };
211 // If we calculate the effective event of a multi-day event 218 // If we calculate the effective event of a multi-day event
212 // we have to figure out whether we are at the first day, 219 // we have to figure out whether we are at the first day,
213 // at the end, or anywhere else ("middle"). This is important 220 // at the end, or anywhere else ("middle"). This is important
214 // for the start/end times (00:00/23:59) 221 // for the start/end times (00:00/23:59)
215 // MidWay: 00:00 -> 23:59, as we are "in the middle" of a multi- 222 // MidWay: 00:00 -> 23:59, as we are "in the middle" of a multi-
216 // day event 223 // day event
217 // Start: start time -> 23:59 224 // Start: start time -> 23:59
218 // End: 00:00 -> end time 225 // End: 00:00 -> end time
219 // Start | End == StartEnd: for single-day events (default) 226 // Start | End == StartEnd: for single-day events (default)
220 // here we draw start time -> end time 227 // here we draw start time -> end time
221 OEffectiveEvent(); 228 OEffectiveEvent();
222 OEffectiveEvent( const OEvent& event, const QDate& startDate, Position pos = StartEnd ); 229 OEffectiveEvent( const OEvent& event, const QDate& startDate, Position pos = StartEnd );
223 OEffectiveEvent( const OEffectiveEvent& ); 230 OEffectiveEvent( const OEffectiveEvent& );
224 OEffectiveEvent &operator=(const OEffectiveEvent& ); 231 OEffectiveEvent &operator=( const OEffectiveEvent& );
225 ~OEffectiveEvent(); 232 ~OEffectiveEvent();
226 233
227 void setStartTime( const QTime& ); 234 void setStartTime( const QTime& );
228 void setEndTime( const QTime& ); 235 void setEndTime( const QTime& );
229 void setEvent( const OEvent& ); 236 void setEvent( const OEvent& );
230 void setDate( const QDate& ); 237 void setDate( const QDate& );
231 238
232 void setEffectiveDates( const QDate& from, const QDate& to ); 239 void setEffectiveDates( const QDate& from, const QDate& to );
233 240
234 QString description()const; 241 QString description() const;
235 QString location()const; 242 QString location() const;
236 QString note()const; 243 QString note() const;
237 OEvent event()const; 244 OEvent event() const;
238 QTime startTime()const; 245 QTime startTime() const;
239 QTime endTime()const; 246 QTime endTime() const;
240 QDate date()const; 247 QDate date() const;
241 248
242 /* return the length in hours */ 249 /* return the length in hours */
243 int length()const; 250 int length() const;
244 int size()const; 251 int size() const;
245 252
246 QDate startDate()const; 253 QDate startDate() const;
247 QDate endDate()const; 254 QDate endDate() const;
248 255
249 bool operator<( const OEffectiveEvent &e ) const; 256 bool operator<( const OEffectiveEvent &e ) const;
250 bool operator<=( const OEffectiveEvent &e ) const; 257 bool operator<=( const OEffectiveEvent &e ) const;
251 bool operator==( const OEffectiveEvent &e ) const; 258 bool operator==( const OEffectiveEvent &e ) const;
252 bool operator!=( const OEffectiveEvent &e ) const; 259 bool operator!=( const OEffectiveEvent &e ) const;
253 bool operator>( const OEffectiveEvent &e ) const; 260 bool operator>( const OEffectiveEvent &e ) const;
254 bool operator>= ( const OEffectiveEvent &e ) const; 261 bool operator>= ( const OEffectiveEvent &e ) const;
255 262
256private: 263 private:
257 void deref(); 264 void deref();
258 inline void changeOrModify(); 265 inline void changeOrModify();
259 class Private; 266 class Private;
260 Private* priv; 267 Private* priv;
261 struct Data; 268 struct Data;
262 Data* data; 269 Data* data;
diff --git a/libopie2/opiepim/orecordlist.h b/libopie2/opiepim/orecordlist.h
index 8f0011b..1742dcc 100644
--- a/libopie2/opiepim/orecordlist.h
+++ b/libopie2/opiepim/orecordlist.h
@@ -24,35 +24,40 @@
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29 29
30#ifndef OPIE_RECORD_LIST_H 30#ifndef ORECORDLIST_H
31#define OPIE_RECORD_LIST_H 31#define ORECORDLIST_H
32
33#include <qarray.h>
34 32
33/* OPIE */
35#include <opie2/otemplatebase.h> 34#include <opie2/otemplatebase.h>
36#include <opie2/opimrecord.h> 35#include <opie2/opimrecord.h>
37 36
38namespace Opie { 37/* QT */
38#include <qarray.h>
39
40namespace Opie
41{
39 42
40class ORecordListIteratorPrivate; 43class ORecordListIteratorPrivate;
41/** 44/**
42 * Our List Iterator 45 * Our List Iterator
43 * it behaves like STL or Qt 46 * it behaves like STL or Qt
44 * 47 *
45 * for(it = list.begin(); it != list.end(); ++it ) 48 * for(it = list.begin(); it != list.end(); ++it )
46 * doSomeCoolStuff( (*it) ); 49 * doSomeCoolStuff( (*it) );
47 */ 50 */
48template <class T> class ORecordList; 51template <class T> class ORecordList;
49template <class T = OPimRecord> 52template <class T = OPimRecord>
50class ORecordListIterator { 53class ORecordListIterator
54{
51 friend class ORecordList<T>; 55 friend class ORecordList<T>;
52public: 56
57 public:
53 typedef OTemplateBase<T> Base; 58 typedef OTemplateBase<T> Base;
54 59
55 /** 60 /**
56 * The c'tor used internally from 61 * The c'tor used internally from
57 * ORecordList 62 * ORecordList
58 */ 63 */
@@ -62,13 +67,13 @@ public:
62 * The standard c'tor 67 * The standard c'tor
63 */ 68 */
64 ORecordListIterator(); 69 ORecordListIterator();
65 ~ORecordListIterator(); 70 ~ORecordListIterator();
66 71
67 ORecordListIterator( const ORecordListIterator& ); 72 ORecordListIterator( const ORecordListIterator& );
68 ORecordListIterator &operator=(const ORecordListIterator& ); 73 ORecordListIterator &operator=( const ORecordListIterator& );
69 74
70 /** 75 /**
71 * a * operator ;) 76 * a * operator ;)
72 * use it like this T = (*it); 77 * use it like this T = (*it);
73 */ 78 */
74 T operator*(); 79 T operator*();
@@ -78,53 +83,55 @@ public:
78 bool operator==( const ORecordListIterator& it ); 83 bool operator==( const ORecordListIterator& it );
79 bool operator!=( const ORecordListIterator& it ); 84 bool operator!=( const ORecordListIterator& it );
80 85
81 /** 86 /**
82 * the current item 87 * the current item
83 */ 88 */
84 uint current()const; 89 uint current() const;
85 90
86 /** 91 /**
87 * the number of items 92 * the number of items
88 */ 93 */
89 uint count()const; 94 uint count() const;
90 95
91 /** 96 /**
92 * sets the current item 97 * sets the current item
93 */ 98 */
94 void setCurrent( uint cur ); 99 void setCurrent( uint cur );
95 100
96private: 101 private:
97 QArray<int> m_uids; 102 QArray<int> m_uids;
98 uint m_current; 103 uint m_current;
99 const Base* m_temp; 104 const Base* m_temp;
100 bool m_end : 1; 105 bool m_end : 1;
101 T m_record; 106 T m_record;
102 bool m_direction :1; 107 bool m_direction : 1;
103 108
104 /* d pointer for future versions */ 109 /* d pointer for future versions */
105 ORecordListIteratorPrivate *d; 110 ORecordListIteratorPrivate *d;
106}; 111};
107 112
113
108class ORecordListPrivate; 114class ORecordListPrivate;
109/** 115/**
110 * The recordlist used as a return type 116 * The recordlist used as a return type
111 * from OPimAccessTemplate 117 * from OPimAccessTemplate
112 */ 118 */
113template <class T = OPimRecord > 119template <class T = OPimRecord >
114class ORecordList { 120class ORecordList
115public: 121{
122 public:
116 typedef OTemplateBase<T> Base; 123 typedef OTemplateBase<T> Base;
117 typedef ORecordListIterator<T> Iterator; 124 typedef ORecordListIterator<T> Iterator;
118 125
119 /** 126 /**
120 * c'tor 127 * c'tor
121 */ 128 */
122 ORecordList () { 129 ORecordList ()
123 } 130 {}
124ORecordList( const QArray<int>& ids, 131 ORecordList( const QArray<int>& ids,
125 const Base* ); 132 const Base* );
126 ~ORecordList(); 133 ~ORecordList();
127 134
128 /** 135 /**
129 * the first iterator 136 * the first iterator
130 */ 137 */
@@ -135,202 +142,261 @@ ORecordList( const QArray<int>& ids,
135 */ 142 */
136 Iterator end(); 143 Iterator end();
137 144
138 /** 145 /**
139 * the number of items in the list 146 * the number of items in the list
140 */ 147 */
141 uint count()const; 148 uint count() const;
142 149
143 T operator[]( uint i ); 150 T operator[] ( uint i );
144 int uidAt(uint i ); 151 int uidAt( uint i );
145 152
146 /** 153 /**
147 * Remove the contact with given uid 154 * Remove the contact with given uid
148 */ 155 */
149 bool remove( int uid ); 156 bool remove( int uid );
150 157
151 /* 158 /*
152 ConstIterator begin()const; 159 ConstIterator begin()const;
153 ConstIterator end()const; 160 ConstIterator end()const;
154 */ 161 */
155private: 162 private:
156 QArray<int> m_ids; 163 QArray<int> m_ids;
157 const Base* m_acc; 164 const Base* m_acc;
158 ORecordListPrivate *d; 165 ORecordListPrivate *d;
159}; 166};
160 167
168
161/* ok now implement it */ 169/* ok now implement it */
162template <class T> 170template <class T>
163ORecordListIterator<T>::ORecordListIterator() { 171ORecordListIterator<T>::ORecordListIterator()
172{
164 m_current = 0; 173 m_current = 0;
165 m_temp = 0l; 174 m_temp = 0l;
166 m_end = true; 175 m_end = true;
167 m_record = T(); 176 m_record = T();
168 /* forward */ 177 /* forward */
169 m_direction = TRUE; 178 m_direction = TRUE;
170} 179}
180
181
171template <class T> 182template <class T>
172ORecordListIterator<T>::~ORecordListIterator() { 183ORecordListIterator<T>::~ORecordListIterator()
173/* nothing to delete */ 184{
185 /* nothing to delete */
174} 186}
175 187
188
176template <class T> 189template <class T>
177ORecordListIterator<T>::ORecordListIterator( const ORecordListIterator<T>& it) { 190ORecordListIterator<T>::ORecordListIterator( const ORecordListIterator<T>& it )
178// qWarning("ORecordListIterator copy c'tor"); 191{
192 // qWarning("ORecordListIterator copy c'tor");
179 m_uids = it.m_uids; 193 m_uids = it.m_uids;
180 m_current = it.m_current; 194 m_current = it.m_current;
181 m_temp = it.m_temp; 195 m_temp = it.m_temp;
182 m_end = it.m_end; 196 m_end = it.m_end;
183 m_record = it.m_record; 197 m_record = it.m_record;
184 m_direction = it.m_direction; 198 m_direction = it.m_direction;
185} 199}
186 200
201
187template <class T> 202template <class T>
188ORecordListIterator<T> &ORecordListIterator<T>::operator=( const ORecordListIterator<T>& it) { 203ORecordListIterator<T> &ORecordListIterator<T>::operator=( const ORecordListIterator<T>& it )
204{
189 m_uids = it.m_uids; 205 m_uids = it.m_uids;
190 m_current = it.m_current; 206 m_current = it.m_current;
191 m_temp = it.m_temp; 207 m_temp = it.m_temp;
192 m_end = it.m_end; 208 m_end = it.m_end;
193 m_record = it.m_record; 209 m_record = it.m_record;
194 210
195 return *this; 211 return *this;
196} 212}
197 213
214
198template <class T> 215template <class T>
199T ORecordListIterator<T>::operator*() { 216T ORecordListIterator<T>::operator*()
200 //qWarning("operator* %d %d", m_current, m_uids[m_current] ); 217{
201 if (!m_end ) 218 //qWarning("operator* %d %d", m_current, m_uids[m_current] );
202 m_record = m_temp->find( m_uids[m_current], m_uids, m_current, 219 if ( !m_end )
220 m_record = m_temp->find( m_uids[ m_current ], m_uids, m_current,
203 m_direction ? Base::Forward : 221 m_direction ? Base::Forward :
204 Base::Reverse ); 222 Base::Reverse );
205 else 223 else
206 m_record = T(); 224 m_record = T();
207 225
208 return m_record; 226 return m_record;
209} 227}
210 228
229
211template <class T> 230template <class T>
212ORecordListIterator<T> &ORecordListIterator<T>::operator++() { 231ORecordListIterator<T> &ORecordListIterator<T>::operator++()
232{
213 m_direction = true; 233 m_direction = true;
214 if (m_current < m_uids.count() ) { 234 if ( m_current < m_uids.count() )
235 {
215 m_end = false; 236 m_end = false;
216 ++m_current; 237 ++m_current;
217 }else 238 }
239 else
218 m_end = true; 240 m_end = true;
219 241
220 return *this; 242 return *this;
221} 243}
244
245
222template <class T> 246template <class T>
223ORecordListIterator<T> &ORecordListIterator<T>::operator--() { 247ORecordListIterator<T> &ORecordListIterator<T>::operator--()
248{
224 m_direction = false; 249 m_direction = false;
225 if ( m_current > 0 ) { 250 if ( m_current > 0 )
251 {
226 --m_current; 252 --m_current;
227 m_end = false; 253 m_end = false;
228 } else 254 }
255 else
229 m_end = true; 256 m_end = true;
230 257
231 return *this; 258 return *this;
232} 259}
233 260
261
234template <class T> 262template <class T>
235bool ORecordListIterator<T>::operator==( const ORecordListIterator<T>& it ) { 263bool ORecordListIterator<T>::operator==( const ORecordListIterator<T>& it )
264{
236 265
237 /* if both are at we're the same.... */ 266 /* if both are at we're the same.... */
238 if ( m_end == it.m_end ) return true; 267 if ( m_end == it.m_end ) return true;
239 268
240 if ( m_uids != it.m_uids ) return false; 269 if ( m_uids != it.m_uids ) return false;
241 if ( m_current != it.m_current ) return false; 270 if ( m_current != it.m_current ) return false;
242 if ( m_temp != it.m_temp ) return false; 271 if ( m_temp != it.m_temp ) return false;
243 272
244 return true; 273 return true;
245} 274}
275
276
246template <class T> 277template <class T>
247bool ORecordListIterator<T>::operator!=( const ORecordListIterator<T>& it ) { 278bool ORecordListIterator<T>::operator!=( const ORecordListIterator<T>& it )
248 return !(*this == it ); 279{
280 return !( *this == it );
249} 281}
282
283
250template <class T> 284template <class T>
251ORecordListIterator<T>::ORecordListIterator( const QArray<int> uids, 285ORecordListIterator<T>::ORecordListIterator( const QArray<int> uids,
252 const Base* t ) 286 const Base* t )
253 : m_uids( uids ), m_current( 0 ), m_temp( t ), m_end( false ), 287 : m_uids( uids ), m_current( 0 ), m_temp( t ), m_end( false ),
254 m_direction( false ) 288 m_direction( false )
255{ 289{
256 /* if the list is empty we're already at the end of the list */ 290 /* if the list is empty we're already at the end of the list */
257 if (uids.count() == 0 ) 291 if ( uids.count() == 0 )
258 m_end = true; 292 m_end = true;
259} 293}
294
295
260template <class T> 296template <class T>
261uint ORecordListIterator<T>::current()const { 297uint ORecordListIterator<T>::current() const
298{
262 return m_current; 299 return m_current;
263} 300}
301
302
264template <class T> 303template <class T>
265void ORecordListIterator<T>::setCurrent( uint cur ) { 304void ORecordListIterator<T>::setCurrent( uint cur )
266 if( cur < m_uids.count() ) { 305{
267 m_end = false; 306 if ( cur < m_uids.count() )
268 m_current= cur; 307 {
308 m_end = false;
309 m_current = cur;
269 } 310 }
270} 311}
271template <class T> 312template <class T>
272uint ORecordListIterator<T>::count()const { 313uint ORecordListIterator<T>::count() const
314{
273 return m_uids.count(); 315 return m_uids.count();
274} 316}
317
318
275template <class T> 319template <class T>
276ORecordList<T>::ORecordList( const QArray<int>& ids, 320ORecordList<T>::ORecordList( const QArray<int>& ids,
277 const Base* acc ) 321 const Base* acc )
278 : m_ids( ids ), m_acc( acc ) 322 : m_ids( ids ), m_acc( acc )
279{ 323{}
280} 324
325
281template <class T> 326template <class T>
282ORecordList<T>::~ORecordList() { 327ORecordList<T>::~ORecordList()
283/* nothing to do here */ 328{
329 /* nothing to do here */
284} 330}
331
332
285template <class T> 333template <class T>
286typename ORecordList<T>::Iterator ORecordList<T>::begin() { 334typename ORecordList<T>::Iterator ORecordList<T>::begin()
335{
287 Iterator it( m_ids, m_acc ); 336 Iterator it( m_ids, m_acc );
288 return it; 337 return it;
289} 338}
339
340
290template <class T> 341template <class T>
291typename ORecordList<T>::Iterator ORecordList<T>::end() { 342typename ORecordList<T>::Iterator ORecordList<T>::end()
343{
292 Iterator it( m_ids, m_acc ); 344 Iterator it( m_ids, m_acc );
293 it.m_end = true; 345 it.m_end = true;
294 it.m_current = m_ids.count(); 346 it.m_current = m_ids.count();
295 347
296 return it; 348 return it;
297} 349}
350
351
298template <class T> 352template <class T>
299uint ORecordList<T>::count()const { 353uint ORecordList<T>::count() const
300return m_ids.count(); 354{
355 return m_ids.count();
301} 356}
357
358
302template <class T> 359template <class T>
303T ORecordList<T>::operator[]( uint i ) { 360T ORecordList<T>::operator[] ( uint i )
361{
304 if ( i >= m_ids.count() ) 362 if ( i >= m_ids.count() )
305 return T(); 363 return T();
306 /* forward */ 364 /* forward */
307 return m_acc->find( m_ids[i], m_ids, i ); 365 return m_acc->find( m_ids[ i ], m_ids, i );
308}
309template <class T>
310int ORecordList<T>::uidAt( uint i ) {
311 return m_ids[i];
312} 366}
313 367
368
314template <class T> 369template <class T>
315bool ORecordList<T>::remove( int uid ) { 370int ORecordList<T>::uidAt( uint i )
316 QArray<int> copy( m_ids.count() ); 371{
317 int counter = 0; 372 return m_ids[ i ];
318 bool ret_val = false; 373}
319 374
320 for (uint i = 0; i < m_ids.count(); i++){
321 if ( m_ids[i] != uid ){
322 copy[counter++] = m_ids[i];
323 375
324 }else 376template <class T>
325 ret_val = true; 377bool ORecordList<T>::remove( int uid )
326 } 378{
379 QArray<int> copy( m_ids.count() );
380 int counter = 0;
381 bool ret_val = false;
382
383 for ( uint i = 0; i < m_ids.count(); i++ )
384 {
385 if ( m_ids[ i ] != uid )
386 {
387 copy[ counter++ ] = m_ids[ i ];
388
389 }
390 else
391 ret_val = true;
392 }
327 393
328 copy.resize( counter ); 394 copy.resize( counter );
329 m_ids = copy; 395 m_ids = copy;
330 396
331 397
332 return ret_val; 398 return ret_val;
333} 399}
334 400
335} 401}
336#endif 402#endif
diff --git a/libopie2/opiepim/otodo.cpp b/libopie2/opiepim/otodo.cpp
index 3eb0026..f534067 100644
--- a/libopie2/opiepim/otodo.cpp
+++ b/libopie2/opiepim/otodo.cpp
@@ -23,51 +23,54 @@
23 -_. . . )=. = Library General Public License along with 23 -_. . . )=. = Library General Public License along with
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29#include <qobject.h>
30#include <qshared.h>
31
32 29
30#include "otodo.h"
33 31
32/* OPIE */
33#include <opie2/opimstate.h>
34#include <opie2/orecur.h>
35#include <opie2/opimmaintainer.h>
36#include <opie2/opimnotifymanager.h>
37#include <opie2/opimresolver.h>
34#include <qpe/palmtopuidgen.h> 38#include <qpe/palmtopuidgen.h>
35#include <qpe/stringutil.h> 39#include <qpe/stringutil.h>
36#include <qpe/palmtoprecord.h> 40#include <qpe/palmtoprecord.h>
37#include <qpe/stringutil.h> 41#include <qpe/stringutil.h>
38#include <qpe/categories.h> 42#include <qpe/categories.h>
39#include <qpe/categoryselect.h> 43#include <qpe/categoryselect.h>
40 44
45/* QT */
46#include <qobject.h>
47#include <qshared.h>
41 48
42#include <opie2/opimstate.h> 49namespace Opie
43#include <opie2/orecur.h> 50{
44#include <opie2/opimmaintainer.h>
45#include <opie2/opimnotifymanager.h>
46#include <opie2/opimresolver.h>
47
48#include <opie2/otodo.h>
49
50namespace Opie {
51 51
52struct OTodo::OTodoData : public QShared { 52struct OTodo::OTodoData : public QShared
53 OTodoData() : QShared() { 53{
54 OTodoData() : QShared()
55 {
54 recur = 0; 56 recur = 0;
55 state = 0; 57 state = 0;
56 maintainer = 0; 58 maintainer = 0;
57 notifiers = 0; 59 notifiers = 0;
58 }; 60 };
59 ~OTodoData() { 61 ~OTodoData()
62 {
60 delete recur; 63 delete recur;
61 delete maintainer; 64 delete maintainer;
62 delete notifiers; 65 delete notifiers;
63 } 66 }
64 67
65 QDate date; 68 QDate date;
66 bool isCompleted:1; 69 bool isCompleted: 1;
67 bool hasDate:1; 70 bool hasDate: 1;
68 int priority; 71 int priority;
69 QString desc; 72 QString desc;
70 QString sum; 73 QString sum;
71 QMap<QString, QString> extra; 74 QMap<QString, QString> extra;
72 ushort prog; 75 ushort prog;
73 OPimState *state; 76 OPimState *state;
@@ -75,476 +78,635 @@ struct OTodo::OTodoData : public QShared {
75 OPimMaintainer *maintainer; 78 OPimMaintainer *maintainer;
76 QDate start; 79 QDate start;
77 QDate completed; 80 QDate completed;
78 OPimNotifyManager *notifiers; 81 OPimNotifyManager *notifiers;
79}; 82};
80 83
81OTodo::OTodo(const OTodo &event ) 84
82 : OPimRecord( event ), data( event.data ) 85OTodo::OTodo( const OTodo &event )
86 : OPimRecord( event ), data( event.data )
83{ 87{
84 data->ref(); 88 data->ref();
85// qWarning("ref up"); 89 // qWarning("ref up");
86} 90}
87OTodo::~OTodo() {
88 91
89// qWarning("~OTodo " ); 92
90 if ( data->deref() ) { 93OTodo::~OTodo()
91// qWarning("OTodo::dereffing"); 94{
95
96 // qWarning("~OTodo " );
97 if ( data->deref() )
98 {
99 // qWarning("OTodo::dereffing");
92 delete data; 100 delete data;
93 data = 0l; 101 data = 0l;
94 } 102 }
95} 103}
96OTodo::OTodo(bool completed, int priority, 104
97 const QArray<int> &category, 105
98 const QString& summary, 106OTodo::OTodo( bool completed, int priority,
99 const QString &description, 107 const QArray<int> &category,
100 ushort progress, 108 const QString& summary,
101 bool hasDate, QDate date, int uid ) 109 const QString &description,
102 : OPimRecord( uid ) 110 ushort progress,
111 bool hasDate, QDate date, int uid )
112 : OPimRecord( uid )
103{ 113{
104// qWarning("OTodoData " + summary); 114 // qWarning("OTodoData " + summary);
105 setCategories( category ); 115 setCategories( category );
106 116
107 data = new OTodoData; 117 data = new OTodoData;
108 118
109 data->date = date; 119 data->date = date;
110 data->isCompleted = completed; 120 data->isCompleted = completed;
111 data->hasDate = hasDate; 121 data->hasDate = hasDate;
112 data->priority = priority; 122 data->priority = priority;
113 data->sum = summary; 123 data->sum = summary;
114 data->prog = progress; 124 data->prog = progress;
115 data->desc = Qtopia::simplifyMultiLineSpace(description ); 125 data->desc = Qtopia::simplifyMultiLineSpace( description );
116} 126}
117OTodo::OTodo(bool completed, int priority, 127
118 const QStringList &category, 128
119 const QString& summary, 129OTodo::OTodo( bool completed, int priority,
120 const QString &description, 130 const QStringList &category,
121 ushort progress, 131 const QString& summary,
122 bool hasDate, QDate date, int uid ) 132 const QString &description,
123 : OPimRecord( uid ) 133 ushort progress,
134 bool hasDate, QDate date, int uid )
135 : OPimRecord( uid )
124{ 136{
125// qWarning("OTodoData" + summary); 137 // qWarning("OTodoData" + summary);
126 setCategories( idsFromString( category.join(";") ) ); 138 setCategories( idsFromString( category.join( ";" ) ) );
127 139
128 data = new OTodoData; 140 data = new OTodoData;
129 141
130 data->date = date; 142 data->date = date;
131 data->isCompleted = completed; 143 data->isCompleted = completed;
132 data->hasDate = hasDate; 144 data->hasDate = hasDate;
133 data->priority = priority; 145 data->priority = priority;
134 data->sum = summary; 146 data->sum = summary;
135 data->prog = progress; 147 data->prog = progress;
136 data->desc = Qtopia::simplifyMultiLineSpace(description ); 148 data->desc = Qtopia::simplifyMultiLineSpace( description );
137} 149}
138bool OTodo::match( const QRegExp &regExp )const 150
151
152bool OTodo::match( const QRegExp &regExp ) const
139{ 153{
140 if( QString::number( data->priority ).find( regExp ) != -1 ){ 154 if ( QString::number( data->priority ).find( regExp ) != -1 )
141 setLastHitField( Priority ); 155 {
142 return true; 156 setLastHitField( Priority );
143 }else if( data->hasDate && data->date.toString().find( regExp) != -1 ){ 157 return true;
144 setLastHitField( HasDate ); 158 }
145 return true; 159 else if ( data->hasDate && data->date.toString().find( regExp ) != -1 )
146 }else if(data->desc.find( regExp ) != -1 ){ 160 {
161 setLastHitField( HasDate );
162 return true;
163 }
164 else if ( data->desc.find( regExp ) != -1 )
165 {
147 setLastHitField( Description ); 166 setLastHitField( Description );
148 return true; 167 return true;
149 }else if(data->sum.find( regExp ) != -1 ) { 168 }
169 else if ( data->sum.find( regExp ) != -1 )
170 {
150 setLastHitField( Summary ); 171 setLastHitField( Summary );
151 return true; 172 return true;
152 } 173 }
153 return false; 174 return false;
154} 175}
176
177
155bool OTodo::isCompleted() const 178bool OTodo::isCompleted() const
156{ 179{
157 return data->isCompleted; 180 return data->isCompleted;
158} 181}
182
183
159bool OTodo::hasDueDate() const 184bool OTodo::hasDueDate() const
160{ 185{
161 return data->hasDate; 186 return data->hasDate;
162} 187}
163bool OTodo::hasStartDate()const { 188
189
190bool OTodo::hasStartDate() const
191{
164 return data->start.isValid(); 192 return data->start.isValid();
165} 193}
166bool OTodo::hasCompletedDate()const { 194
195
196bool OTodo::hasCompletedDate() const
197{
167 return data->completed.isValid(); 198 return data->completed.isValid();
168} 199}
169int OTodo::priority()const 200
201
202int OTodo::priority() const
170{ 203{
171 return data->priority; 204 return data->priority;
172} 205}
206
207
173QString OTodo::summary() const 208QString OTodo::summary() const
174{ 209{
175 return data->sum; 210 return data->sum;
176} 211}
212
213
177ushort OTodo::progress() const 214ushort OTodo::progress() const
178{ 215{
179 return data->prog; 216 return data->prog;
180} 217}
181QDate OTodo::dueDate()const 218
219
220QDate OTodo::dueDate() const
182{ 221{
183 return data->date; 222 return data->date;
184} 223}
185QDate OTodo::startDate()const { 224
225
226QDate OTodo::startDate() const
227{
186 return data->start; 228 return data->start;
187} 229}
188QDate OTodo::completedDate()const { 230
231
232QDate OTodo::completedDate() const
233{
189 return data->completed; 234 return data->completed;
190} 235}
191QString OTodo::description()const 236
237
238QString OTodo::description() const
192{ 239{
193 return data->desc; 240 return data->desc;
194} 241}
195bool OTodo::hasState() const{ 242
196 if (!data->state ) return false; 243
244bool OTodo::hasState() const
245{
246 if ( !data->state ) return false;
197 return ( data->state->state() != OPimState::Undefined ); 247 return ( data->state->state() != OPimState::Undefined );
198} 248}
199OPimState OTodo::state()const { 249
200 if (!data->state ) { 250
251OPimState OTodo::state() const
252{
253 if ( !data->state )
254 {
201 OPimState state; 255 OPimState state;
202 return state; 256 return state;
203 } 257 }
204 258
205 return (*data->state); 259 return ( *data->state );
206} 260}
207bool OTodo::hasRecurrence()const { 261
208 if (!data->recur) return false; 262
263bool OTodo::hasRecurrence() const
264{
265 if ( !data->recur ) return false;
209 return data->recur->doesRecur(); 266 return data->recur->doesRecur();
210} 267}
211ORecur OTodo::recurrence()const {
212 if (!data->recur) return ORecur();
213 268
214 return (*data->recur); 269
270ORecur OTodo::recurrence() const
271{
272 if ( !data->recur ) return ORecur();
273
274 return ( *data->recur );
215} 275}
216bool OTodo::hasMaintainer()const {
217 if (!data->maintainer) return false;
218 276
219 return (data->maintainer->mode() != OPimMaintainer::Undefined ); 277
278bool OTodo::hasMaintainer() const
279{
280 if ( !data->maintainer ) return false;
281
282 return ( data->maintainer->mode() != OPimMaintainer::Undefined );
220} 283}
221OPimMaintainer OTodo::maintainer()const {
222 if (!data->maintainer) return OPimMaintainer();
223 284
224 return (*data->maintainer); 285
286OPimMaintainer OTodo::maintainer() const
287{
288 if ( !data->maintainer ) return OPimMaintainer();
289
290 return ( *data->maintainer );
225} 291}
292
293
226void OTodo::setCompleted( bool completed ) 294void OTodo::setCompleted( bool completed )
227{ 295{
228 changeOrModify(); 296 changeOrModify();
229 data->isCompleted = completed; 297 data->isCompleted = completed;
230} 298}
299
300
231void OTodo::setHasDueDate( bool hasDate ) 301void OTodo::setHasDueDate( bool hasDate )
232{ 302{
233 changeOrModify(); 303 changeOrModify();
234 data->hasDate = hasDate; 304 data->hasDate = hasDate;
235} 305}
236void OTodo::setDescription(const QString &desc ) 306
307
308void OTodo::setDescription( const QString &desc )
237{ 309{
238// qWarning( "desc " + desc ); 310 // qWarning( "desc " + desc );
239 changeOrModify(); 311 changeOrModify();
240 data->desc = Qtopia::simplifyMultiLineSpace(desc ); 312 data->desc = Qtopia::simplifyMultiLineSpace( desc );
241} 313}
314
315
242void OTodo::setSummary( const QString& sum ) 316void OTodo::setSummary( const QString& sum )
243{ 317{
244 changeOrModify(); 318 changeOrModify();
245 data->sum = sum; 319 data->sum = sum;
246} 320}
247void OTodo::setPriority(int prio ) 321
322
323void OTodo::setPriority( int prio )
248{ 324{
249 changeOrModify(); 325 changeOrModify();
250 data->priority = prio; 326 data->priority = prio;
251} 327}
328
329
252void OTodo::setDueDate( const QDate& date ) 330void OTodo::setDueDate( const QDate& date )
253{ 331{
254 changeOrModify(); 332 changeOrModify();
255 data->date = date; 333 data->date = date;
256} 334}
257void OTodo::setStartDate( const QDate& date ) { 335
336
337void OTodo::setStartDate( const QDate& date )
338{
258 changeOrModify(); 339 changeOrModify();
259 data->start = date; 340 data->start = date;
260} 341}
261void OTodo::setCompletedDate( const QDate& date ) { 342
343
344void OTodo::setCompletedDate( const QDate& date )
345{
262 changeOrModify(); 346 changeOrModify();
263 data->completed = date; 347 data->completed = date;
264} 348}
265void OTodo::setState( const OPimState& state ) { 349
350
351void OTodo::setState( const OPimState& state )
352{
266 changeOrModify(); 353 changeOrModify();
267 if (data->state ) 354 if ( data->state )
268 (*data->state) = state; 355 ( *data->state ) = state;
269 else 356 else
270 data->state = new OPimState( state ); 357 data->state = new OPimState( state );
271} 358}
272void OTodo::setRecurrence( const ORecur& rec) { 359
360
361void OTodo::setRecurrence( const ORecur& rec )
362{
273 changeOrModify(); 363 changeOrModify();
274 if (data->recur ) 364 if ( data->recur )
275 (*data->recur) = rec; 365 ( *data->recur ) = rec;
276 else 366 else
277 data->recur = new ORecur( rec ); 367 data->recur = new ORecur( rec );
278} 368}
279void OTodo::setMaintainer( const OPimMaintainer& pim ) { 369
370
371void OTodo::setMaintainer( const OPimMaintainer& pim )
372{
280 changeOrModify(); 373 changeOrModify();
281 374
282 if (data->maintainer ) 375 if ( data->maintainer )
283 (*data->maintainer) = pim; 376 ( *data->maintainer ) = pim;
284 else 377 else
285 data->maintainer = new OPimMaintainer( pim ); 378 data->maintainer = new OPimMaintainer( pim );
286} 379}
380
381
287bool OTodo::isOverdue( ) 382bool OTodo::isOverdue( )
288{ 383{
289 if( data->hasDate && !data->isCompleted) 384 if ( data->hasDate && !data->isCompleted )
290 return QDate::currentDate() > data->date; 385 return QDate::currentDate() > data->date;
291 return false; 386 return false;
292} 387}
293void OTodo::setProgress(ushort progress ) 388
389
390void OTodo::setProgress( ushort progress )
294{ 391{
295 changeOrModify(); 392 changeOrModify();
296 data->prog = progress; 393 data->prog = progress;
297} 394}
298QString OTodo::toShortText() const { 395
299 return summary(); 396
397QString OTodo::toShortText() const
398{
399 return summary();
300} 400}
401
402
301/*! 403/*!
302 Returns a richt text string 404 Returns a richt text string
303*/ 405*/
304QString OTodo::toRichText() const 406QString OTodo::toRichText() const
305{ 407{
306 QString text; 408 QString text;
307 QStringList catlist; 409 QStringList catlist;
308 410
309 // summary 411 // summary
310 text += "<b><h3><img src=\"todo/TodoList\"> "; 412 text += "<b><h3><img src=\"todo/TodoList\"> ";
311 if ( !summary().isEmpty() ) { 413 if ( !summary().isEmpty() )
312 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "" ); 414 {
313 } 415 text += Qtopia::escapeString( summary() ).replace( QRegExp( "[\n]" ), "" );
314 text += "</h3></b><br><hr><br>"; 416 }
315 417 text += "</h3></b><br><hr><br>";
316 // description 418
317 if( !description().isEmpty() ){ 419 // description
318 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>"; 420 if ( !description().isEmpty() )
319 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 421 {
320 } 422 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>";
321 423 text += Qtopia::escapeString( description() ).replace( QRegExp( "[\n]" ), "<br>" ) + "<br>";
322 // priority 424 }
323 int priorityval = priority(); 425
324 text += "<b>" + QObject::tr( "Priority:") +" </b><img src=\"todo/priority" + 426 // priority
325 QString::number( priorityval ) + "\"> "; 427 int priorityval = priority();
326 428 text += "<b>" + QObject::tr( "Priority:" ) + " </b><img src=\"todo/priority" +
327 switch ( priorityval ) 429 QString::number( priorityval ) + "\"> ";
328 { 430
431 switch ( priorityval )
432 {
329 case 1 : text += QObject::tr( "Very high" ); 433 case 1 : text += QObject::tr( "Very high" );
330 break; 434 break;
331 case 2 : text += QObject::tr( "High" ); 435 case 2 : text += QObject::tr( "High" );
332 break; 436 break;
333 case 3 : text += QObject::tr( "Normal" ); 437 case 3 : text += QObject::tr( "Normal" );
334 break; 438 break;
335 case 4 : text += QObject::tr( "Low" ); 439 case 4 : text += QObject::tr( "Low" );
336 break; 440 break;
337 case 5 : text += QObject::tr( "Very low" ); 441 case 5 : text += QObject::tr( "Very low" );
338 break; 442 break;
339 }; 443 };
340 text += "<br>"; 444 text += "<br>";
341 445
342 // progress 446 // progress
343 text += "<b>" + QObject::tr( "Progress:") + " </b>" 447 text += "<b>" + QObject::tr( "Progress:" ) + " </b>"
344 + QString::number( progress() ) + " %<br>"; 448 + QString::number( progress() ) + " %<br>";
345 449
346 // due date 450 // due date
347 if (hasDueDate() ){ 451 if ( hasDueDate() )
348 QDate dd = dueDate(); 452 {
349 int off = QDate::currentDate().daysTo( dd ); 453 QDate dd = dueDate();
350 454 int off = QDate::currentDate().daysTo( dd );
351 text += "<b>" + QObject::tr( "Deadline:" ) + " </b><font color=\""; 455
352 if ( off < 0 ) 456 text += "<b>" + QObject::tr( "Deadline:" ) + " </b><font color=\"";
353 text += "#FF0000"; 457 if ( off < 0 )
354 else if ( off == 0 ) 458 text += "#FF0000";
355 text += "#FFFF00"; 459 else if ( off == 0 )
356 else if ( off > 0 ) 460 text += "#FFFF00";
357 text += "#00FF00"; 461 else if ( off > 0 )
358 462 text += "#00FF00";
359 text += "\">" + dd.toString() + "</font><br>"; 463
360 } 464 text += "\">" + dd.toString() + "</font><br>";
361 465 }
362 // categories 466
363 text += "<b>" + QObject::tr( "Category:") + "</b> "; 467 // categories
364 text += categoryNames( "Todo List" ).join(", "); 468 text += "<b>" + QObject::tr( "Category:" ) + "</b> ";
365 text += "<br>"; 469 text += categoryNames( "Todo List" ).join( ", " );
366 470 text += "<br>";
367 return text; 471
368} 472 return text;
369bool OTodo::hasNotifiers()const { 473}
370 if (!data->notifiers) return false; 474
475
476bool OTodo::hasNotifiers() const
477{
478 if ( !data->notifiers ) return false;
371 return !data->notifiers->isEmpty(); 479 return !data->notifiers->isEmpty();
372} 480}
373OPimNotifyManager& OTodo::notifiers() { 481
374 if (!data->notifiers ) 482
483OPimNotifyManager& OTodo::notifiers()
484{
485 if ( !data->notifiers )
375 data->notifiers = new OPimNotifyManager; 486 data->notifiers = new OPimNotifyManager;
376 return (*data->notifiers); 487 return ( *data->notifiers );
377} 488}
378const OPimNotifyManager& OTodo::notifiers()const{ 489
379 if (!data->notifiers ) 490
491const OPimNotifyManager& OTodo::notifiers() const
492{
493 if ( !data->notifiers )
380 data->notifiers = new OPimNotifyManager; 494 data->notifiers = new OPimNotifyManager;
381 495
382 return (*data->notifiers); 496 return ( *data->notifiers );
383} 497}
384 498
385bool OTodo::operator<( const OTodo &toDoEvent )const{ 499
386 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 500bool OTodo::operator<( const OTodo &toDoEvent ) const
387 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 501{
388 if( hasDueDate() && toDoEvent.hasDueDate() ){ 502 if ( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
389 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 503 if ( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
390 return priority() < toDoEvent.priority(); 504 if ( hasDueDate() && toDoEvent.hasDueDate() )
391 }else{ 505 {
392 return dueDate() < toDoEvent.dueDate(); 506 if ( dueDate() == toDoEvent.dueDate() )
393 } 507 { // let's the priority decide
508 return priority() < toDoEvent.priority();
509 }
510 else
511 {
512 return dueDate() < toDoEvent.dueDate();
513 }
394 } 514 }
395 return false; 515 return false;
396} 516}
397bool OTodo::operator<=(const OTodo &toDoEvent )const 517
518
519bool OTodo::operator<=( const OTodo &toDoEvent ) const
398{ 520{
399 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 521 if ( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
400 if( !hasDueDate() && toDoEvent.hasDueDate() ) return true; 522 if ( !hasDueDate() && toDoEvent.hasDueDate() ) return true;
401 if( hasDueDate() && toDoEvent.hasDueDate() ){ 523 if ( hasDueDate() && toDoEvent.hasDueDate() )
402 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 524 {
403 return priority() <= toDoEvent.priority(); 525 if ( dueDate() == toDoEvent.dueDate() )
404 }else{ 526 { // let's the priority decide
405 return dueDate() <= toDoEvent.dueDate(); 527 return priority() <= toDoEvent.priority();
406 } 528 }
529 else
530 {
531 return dueDate() <= toDoEvent.dueDate();
532 }
407 } 533 }
408 return true; 534 return true;
409} 535}
410bool OTodo::operator>(const OTodo &toDoEvent )const 536
537
538bool OTodo::operator>( const OTodo &toDoEvent ) const
411{ 539{
412 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return false; 540 if ( !hasDueDate() && !toDoEvent.hasDueDate() ) return false;
413 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 541 if ( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
414 if( hasDueDate() && toDoEvent.hasDueDate() ){ 542 if ( hasDueDate() && toDoEvent.hasDueDate() )
415 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 543 {
416 return priority() > toDoEvent.priority(); 544 if ( dueDate() == toDoEvent.dueDate() )
417 }else{ 545 { // let's the priority decide
418 return dueDate() > toDoEvent.dueDate(); 546 return priority() > toDoEvent.priority();
419 } 547 }
548 else
549 {
550 return dueDate() > toDoEvent.dueDate();
551 }
420 } 552 }
421 return false; 553 return false;
422} 554}
423bool OTodo::operator>=(const OTodo &toDoEvent )const 555
556
557bool OTodo::operator>=( const OTodo &toDoEvent ) const
424{ 558{
425 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 559 if ( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
426 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 560 if ( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
427 if( hasDueDate() && toDoEvent.hasDueDate() ){ 561 if ( hasDueDate() && toDoEvent.hasDueDate() )
428 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 562 {
429 return priority() > toDoEvent.priority(); 563 if ( dueDate() == toDoEvent.dueDate() )
430 }else{ 564 { // let's the priority decide
431 return dueDate() > toDoEvent.dueDate(); 565 return priority() > toDoEvent.priority();
432 } 566 }
567 else
568 {
569 return dueDate() > toDoEvent.dueDate();
570 }
433 } 571 }
434 return true; 572 return true;
435} 573}
436bool OTodo::operator==(const OTodo &toDoEvent )const 574
575
576bool OTodo::operator==( const OTodo &toDoEvent ) const
437{ 577{
438 if ( data->priority != toDoEvent.data->priority ) return false; 578 if ( data->priority != toDoEvent.data->priority ) return false;
439 if ( data->priority != toDoEvent.data->prog ) return false; 579 if ( data->priority != toDoEvent.data->prog ) return false;
440 if ( data->isCompleted != toDoEvent.data->isCompleted ) return false; 580 if ( data->isCompleted != toDoEvent.data->isCompleted ) return false;
441 if ( data->hasDate != toDoEvent.data->hasDate ) return false; 581 if ( data->hasDate != toDoEvent.data->hasDate ) return false;
442 if ( data->date != toDoEvent.data->date ) return false; 582 if ( data->date != toDoEvent.data->date ) return false;
443 if ( data->sum != toDoEvent.data->sum ) return false; 583 if ( data->sum != toDoEvent.data->sum ) return false;
444 if ( data->desc != toDoEvent.data->desc ) return false; 584 if ( data->desc != toDoEvent.data->desc ) return false;
445 if ( data->maintainer != toDoEvent.data->maintainer ) 585 if ( data->maintainer != toDoEvent.data->maintainer )
446 return false; 586 return false;
447 587
448 return OPimRecord::operator==( toDoEvent ); 588 return OPimRecord::operator==( toDoEvent );
449} 589}
450void OTodo::deref() {
451 590
452// qWarning("deref in ToDoEvent"); 591
453 if ( data->deref() ) { 592void OTodo::deref()
454// qWarning("deleting"); 593{
594
595 // qWarning("deref in ToDoEvent");
596 if ( data->deref() )
597 {
598 // qWarning("deleting");
455 delete data; 599 delete data;
456 data= 0; 600 data = 0;
457 } 601 }
458} 602}
459OTodo &OTodo::operator=(const OTodo &item ) 603
604
605OTodo &OTodo::operator=( const OTodo &item )
460{ 606{
461 if ( this == &item ) return *this; 607 if ( this == &item ) return * this;
462 608
463 OPimRecord::operator=( item ); 609 OPimRecord::operator=( item );
464 //qWarning("operator= ref "); 610 //qWarning("operator= ref ");
465 item.data->ref(); 611 item.data->ref();
466 deref(); 612 deref();
467 data = item.data; 613 data = item.data;
468 614
469 return *this; 615 return *this;
470} 616}
471 617
472QMap<int, QString> OTodo::toMap() const { 618
619QMap<int, QString> OTodo::toMap() const
620{
473 QMap<int, QString> map; 621 QMap<int, QString> map;
474 622
475 map.insert( Uid, QString::number( uid() ) ); 623 map.insert( Uid, QString::number( uid() ) );
476 map.insert( Category, idsToString( categories() ) ); 624 map.insert( Category, idsToString( categories() ) );
477 map.insert( HasDate, QString::number( data->hasDate ) ); 625 map.insert( HasDate, QString::number( data->hasDate ) );
478 map.insert( Completed, QString::number( data->isCompleted ) ); 626 map.insert( Completed, QString::number( data->isCompleted ) );
479 map.insert( Description, data->desc ); 627 map.insert( Description, data->desc );
480 map.insert( Summary, data->sum ); 628 map.insert( Summary, data->sum );
481 map.insert( Priority, QString::number( data->priority ) ); 629 map.insert( Priority, QString::number( data->priority ) );
482 map.insert( DateDay, QString::number( data->date.day() ) ); 630 map.insert( DateDay, QString::number( data->date.day() ) );
483 map.insert( DateMonth, QString::number( data->date.month() ) ); 631 map.insert( DateMonth, QString::number( data->date.month() ) );
484 map.insert( DateYear, QString::number( data->date.year() ) ); 632 map.insert( DateYear, QString::number( data->date.year() ) );
485 map.insert( Progress, QString::number( data->prog ) ); 633 map.insert( Progress, QString::number( data->prog ) );
486// map.insert( CrossReference, crossToString() ); 634 // map.insert( CrossReference, crossToString() );
487 /* FIXME!!! map.insert( State, ); 635 /* FIXME!!! map.insert( State, );
488 map.insert( Recurrence, ); 636 map.insert( Recurrence, );
489 map.insert( Reminders, ); 637 map.insert( Reminders, );
490 map. 638 map.
491 */ 639 */
492 return map; 640 return map;
493} 641}
494 642
643
495/** 644/**
496 * change or modify looks at the ref count and either 645 * change or modify looks at the ref count and either
497 * creates a new QShared Object or it can modify it 646 * creates a new QShared Object or it can modify it
498 * right in place 647 * right in place
499 */ 648 */
500void OTodo::changeOrModify() { 649void OTodo::changeOrModify()
501 if ( data->count != 1 ) { 650{
502 qWarning("changeOrModify"); 651 if ( data->count != 1 )
652 {
653 qWarning( "changeOrModify" );
503 data->deref(); 654 data->deref();
504 OTodoData* d2 = new OTodoData(); 655 OTodoData* d2 = new OTodoData();
505 copy(data, d2 ); 656 copy( data, d2 );
506 data = d2; 657 data = d2;
507 } 658 }
508} 659}
660
661
509// WATCHOUT 662// WATCHOUT
510/* 663/*
511 * if you add something to the Data struct 664 * if you add something to the Data struct
512 * be sure to copy it here 665 * be sure to copy it here
513 */ 666 */
514void OTodo::copy( OTodoData* src, OTodoData* dest ) { 667void OTodo::copy( OTodoData* src, OTodoData* dest )
668{
515 dest->date = src->date; 669 dest->date = src->date;
516 dest->isCompleted = src->isCompleted; 670 dest->isCompleted = src->isCompleted;
517 dest->hasDate = src->hasDate; 671 dest->hasDate = src->hasDate;
518 dest->priority = src->priority; 672 dest->priority = src->priority;
519 dest->desc = src->desc; 673 dest->desc = src->desc;
520 dest->sum = src->sum; 674 dest->sum = src->sum;
521 dest->extra = src->extra; 675 dest->extra = src->extra;
522 dest->prog = src->prog; 676 dest->prog = src->prog;
523 677
524 if (src->state ) 678 if ( src->state )
525 dest->state = new OPimState( *src->state ); 679 dest->state = new OPimState( *src->state );
526 680
527 if (src->recur ) 681 if ( src->recur )
528 dest->recur = new ORecur( *src->recur ); 682 dest->recur = new ORecur( *src->recur );
529 683
530 if (src->maintainer ) 684 if ( src->maintainer )
531 dest->maintainer = new OPimMaintainer( *src->maintainer ) 685 dest->maintainer = new OPimMaintainer( *src->maintainer )
532 ; 686 ;
533 dest->start = src->start; 687 dest->start = src->start;
534 dest->completed = src->completed; 688 dest->completed = src->completed;
535 689
536 if (src->notifiers ) 690 if ( src->notifiers )
537 dest->notifiers = new OPimNotifyManager( *src->notifiers ); 691 dest->notifiers = new OPimNotifyManager( *src->notifiers );
538} 692}
539QString OTodo::type() const { 693
540 return QString::fromLatin1("OTodo"); 694
695QString OTodo::type() const
696{
697 return QString::fromLatin1( "OTodo" );
541} 698}
542QString OTodo::recordField(int /*id*/ )const { 699
700
701QString OTodo::recordField( int /*id*/ ) const
702{
543 return QString::null; 703 return QString::null;
544} 704}
545 705
546int OTodo::rtti(){ 706
707int OTodo::rtti()
708{
547 return OPimResolver::TodoList; 709 return OPimResolver::TodoList;
548} 710}
549 711
550} 712}
diff --git a/libopie2/opiepim/otodo.h b/libopie2/opiepim/otodo.h
index 61add04..04dd269 100644
--- a/libopie2/opiepim/otodo.h
+++ b/libopie2/opiepim/otodo.h
@@ -1,59 +1,61 @@
1/* 1/*
2 This file is part of the Opie Project 2 This file is part of the Opie Project
3 Copyright (C) The Main Author <main-author@whereever.org> 3 Copyright (C) The Main Author <main-author@whereever.org>
4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org> 4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org>
5 .=l. 5 .=l.
6 .>+-= 6 .>+-=
7 _;:, .> :=|. This program is free software; you can 7_;:, .> :=|. This program is free software; you can
8.> <`_, > . <= redistribute it and/or modify it under 8.> <`_, > . <= redistribute it and/or modify it under
9:`=1 )Y*s>-.-- : the terms of the GNU Library General Public 9:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
10.="- .-=="i, .._ License as published by the Free Software 10.="- .-=="i, .._ License as published by the Free Software
11 - . .-<_> .<> Foundation; either version 2 of the License, 11- . .-<_> .<> Foundation; either version 2 of the License,
12 ._= =} : or (at your option) any later version. 12 ._= =} : or (at your option) any later version.
13 .%`+i> _;_. 13 .%`+i> _;_.
14 .i_,=:_. -<s. This program is distributed in the hope that 14 .i_,=:_. -<s. This program is distributed in the hope that
15 + . -:. = it will be useful, but WITHOUT ANY WARRANTY; 15 + . -:. = it will be useful, but WITHOUT ANY WARRANTY;
16 : .. .:, . . . without even the implied warranty of 16 : .. .:, . . . without even the implied warranty of
17 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A 17 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A
18 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU 18 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
19..}^=.= = ; Library General Public License for more 19..}^=.= = ; Library General Public License for more
20++= -. .` .: details. 20++= -. .` .: details.
21 : = ...= . :.=- 21: = ...= . :.=-
22 -. .:....=;==+<; You should have received a copy of the GNU 22-. .:....=;==+<; You should have received a copy of the GNU
23 -_. . . )=. = Library General Public License along with 23 -_. . . )=. = Library General Public License along with
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29#ifndef OPIE_TODO_EVENT_H
30#define OPIE_TODO_EVENT_H
31 29
30#ifndef OTODOEVENT_H
31#define OTODOEVENT_H
32 32
33/* OPIE */
34#include <opie2/opimrecord.h>
35#include <qpe/recordfields.h>
36#include <qpe/palmtopuidgen.h>
37
38/* QT */
33#include <qarray.h> 39#include <qarray.h>
34#include <qmap.h> 40#include <qmap.h>
35#include <qregexp.h> 41#include <qregexp.h>
36#include <qstringlist.h> 42#include <qstringlist.h>
37#include <qdatetime.h> 43#include <qdatetime.h>
38#include <qvaluelist.h> 44#include <qvaluelist.h>
39 45
40#include <qpe/recordfields.h> 46namespace Opie
41#include <qpe/palmtopuidgen.h> 47{
42
43#include <opie2/opimrecord.h>
44
45
46namespace Opie {
47 48
48class OPimState; 49class OPimState;
49class ORecur; 50class ORecur;
50class OPimMaintainer; 51class OPimMaintainer;
51class OPimNotifyManager; 52class OPimNotifyManager;
52class OTodo : public OPimRecord { 53class OTodo : public OPimRecord
53public: 54{
55 public:
54 typedef QValueList<OTodo> ValueList; 56 typedef QValueList<OTodo> ValueList;
55 enum RecordFields { 57 enum RecordFields {
56 Uid = Qtopia::UID_ID, 58 Uid = Qtopia::UID_ID,
57 Category = Qtopia::CATEGORY_ID, 59 Category = Qtopia::CATEGORY_ID,
58 HasDate, 60 HasDate,
59 Completed, 61 Completed,
@@ -71,15 +73,15 @@ public:
71 Reminders, 73 Reminders,
72 Notifiers, 74 Notifiers,
73 Maintainer, 75 Maintainer,
74 StartDate, 76 StartDate,
75 CompletedDate 77 CompletedDate
76 }; 78 };
77 public: 79 public:
78 // priorities from Very low to very high 80 // priorities from Very low to very high
79 enum TaskPriority { VeryHigh=1, High, Normal, Low, VeryLow }; 81 enum TaskPriority { VeryHigh = 1, High, Normal, Low, VeryLow };
80 82
81 /* Constructs a new ToDoEvent 83 /* Constructs a new ToDoEvent
82 @param completed Is the TodoEvent completed 84 @param completed Is the TodoEvent completed
83 @param priority What is the priority of this ToDoEvent 85 @param priority What is the priority of this ToDoEvent
84 @param category Which category does it belong( uid ) 86 @param category Which category does it belong( uid )
85 @param summary A small summary of the todo 87 @param summary A small summary of the todo
@@ -98,19 +100,19 @@ public:
98 100
99 OTodo( bool completed, int priority, 101 OTodo( bool completed, int priority,
100 const QArray<int>& category, 102 const QArray<int>& category,
101 const QString& summary = QString::null, 103 const QString& summary = QString::null,
102 const QString& description = QString::null, 104 const QString& description = QString::null,
103 ushort progress = 0, 105 ushort progress = 0,
104 bool hasDate = false, QDate date = QDate::currentDate(), 106 bool hasDate = false, QDate date = QDate::currentDate(),
105 int uid = 0 /* empty */ ); 107 int uid = 0 /* empty */ );
106 108
107 /** Copy c'tor 109 /** Copy c'tor
108 * 110 *
109 */ 111 */
110 OTodo(const OTodo & ); 112 OTodo( const OTodo & );
111 113
112 /** 114 /**
113 *destructor 115 *destructor
114 */ 116 */
115 ~OTodo(); 117 ~OTodo();
116 118
@@ -120,118 +122,118 @@ public:
120 bool isCompleted() const; 122 bool isCompleted() const;
121 123
122 /** 124 /**
123 * Does this Event have a deadline 125 * Does this Event have a deadline
124 */ 126 */
125 bool hasDueDate() const; 127 bool hasDueDate() const;
126 bool hasStartDate()const; 128 bool hasStartDate() const;
127 bool hasCompletedDate()const; 129 bool hasCompletedDate() const;
128 130
129 /** 131 /**
130 * What is the priority? 132 * What is the priority?
131 */ 133 */
132 int priority()const ; 134 int priority() const ;
133 135
134 /** 136 /**
135 * progress as ushort 0, 20, 40, 60, 80 or 100% 137 * progress as ushort 0, 20, 40, 60, 80 or 100%
136 */ 138 */
137 ushort progress() const; 139 ushort progress() const;
138 140
139 /** 141 /**
140 * The due Date 142 * The due Date
141 */ 143 */
142 QDate dueDate()const; 144 QDate dueDate() const;
143 145
144 /** 146 /**
145 * When did it start? 147 * When did it start?
146 */ 148 */
147 QDate startDate()const; 149 QDate startDate() const;
148 150
149 /** 151 /**
150 * When was it completed? 152 * When was it completed?
151 */ 153 */
152 QDate completedDate()const; 154 QDate completedDate() const;
153 155
154 /** 156 /**
155 * does it have a state? 157 * does it have a state?
156 */ 158 */
157 bool hasState()const; 159 bool hasState() const;
158 160
159 /** 161 /**
160 * What is the state of this OTodo? 162 * What is the state of this OTodo?
161 */ 163 */
162 OPimState state()const; 164 OPimState state() const;
163 165
164 /** 166 /**
165 * has recurrence? 167 * has recurrence?
166 */ 168 */
167 bool hasRecurrence()const; 169 bool hasRecurrence() const;
168 170
169 /** 171 /**
170 * the recurrance of this 172 * the recurrance of this
171 */ 173 */
172 ORecur recurrence()const; 174 ORecur recurrence() const;
173 175
174 /** 176 /**
175 * does this OTodo have a maintainer? 177 * does this OTodo have a maintainer?
176 */ 178 */
177 bool hasMaintainer()const; 179 bool hasMaintainer() const;
178 180
179 /** 181 /**
180 * the Maintainer of this OTodo 182 * the Maintainer of this OTodo
181 */ 183 */
182 OPimMaintainer maintainer()const; 184 OPimMaintainer maintainer() const;
183 185
184 /** 186 /**
185 * The description of the todo 187 * The description of the todo
186 */ 188 */
187 QString description()const; 189 QString description() const;
188 190
189 /** 191 /**
190 * A small summary of the todo 192 * A small summary of the todo
191 */ 193 */
192 QString summary() const; 194 QString summary() const;
193 195
194 /** 196 /**
195 * @reimplemented 197 * @reimplemented
196 * Return this todoevent in a RichText formatted QString 198 * Return this todoevent in a RichText formatted QString
197 */ 199 */
198 QString toRichText() const; 200 QString toRichText() const;
199 201
200 bool hasNotifiers()const; 202 bool hasNotifiers() const;
201 /* 203 /*
202 * FIXME check if the sharing is still fine!! -zecke 204 * FIXME check if the sharing is still fine!! -zecke
203 * ### CHECK If API is fine 205 * ### CHECK If API is fine
204 */ 206 */
205 /** 207 /**
206 * return a reference to our notifiers... 208 * return a reference to our notifiers...
207 */ 209 */
208 OPimNotifyManager &notifiers(); 210 OPimNotifyManager &notifiers();
209 211
210 /** 212 /**
211 * 213 *
212 */ 214 */
213 const OPimNotifyManager &notifiers()const; 215 const OPimNotifyManager &notifiers() const;
214 216
215 /** 217 /**
216 * reimplementations 218 * reimplementations
217 */ 219 */
218 QString type()const; 220 QString type() const;
219 QString toShortText()const; 221 QString toShortText() const;
220 QString recordField(int id )const; 222 QString recordField( int id ) const;
221 223
222 /** 224 /**
223 * toMap puts all data into the map. int relates 225 * toMap puts all data into the map. int relates
224 * to ToDoEvent RecordFields enum 226 * to ToDoEvent RecordFields enum
225 */ 227 */
226 QMap<int, QString> toMap()const; 228 QMap<int, QString> toMap() const;
227 229
228 /** 230 /**
229 * Set if this Todo is completed 231 * Set if this Todo is completed
230 */ 232 */
231 void setCompleted(bool completed ); 233 void setCompleted( bool completed );
232 234
233 /** 235 /**
234 * set if this todo got an end data 236 * set if this todo got an end data
235 */ 237 */
236 void setHasDueDate( bool hasDate ); 238 void setHasDueDate( bool hasDate );
237 // FIXME we do not have these for start, completed 239 // FIXME we do not have these for start, completed
@@ -239,13 +241,13 @@ public:
239 // out if it's has a date... 241 // out if it's has a date...
240 // decide what to do here? -zecke 242 // decide what to do here? -zecke
241 243
242 /** 244 /**
243 * Set the priority of the Todo 245 * Set the priority of the Todo
244 */ 246 */
245 void setPriority(int priority ); 247 void setPriority( int priority );
246 248
247 /** 249 /**
248 * Set the progress. 250 * Set the progress.
249 */ 251 */
250 void setProgress( ushort progress ); 252 void setProgress( ushort progress );
251 253
@@ -263,53 +265,56 @@ public:
263 * set the completed date 265 * set the completed date
264 */ 266 */
265 void setCompletedDate( const QDate& date ); 267 void setCompletedDate( const QDate& date );
266 268
267 void setRecurrence( const ORecur& ); 269 void setRecurrence( const ORecur& );
268 270
269 void setDescription(const QString& ); 271 void setDescription( const QString& );
270 void setSummary(const QString& ); 272 void setSummary( const QString& );
271 273
272 /** 274 /**
273 * set the state of a Todo 275 * set the state of a Todo
274 * @param state State what the todo should take 276 * @param state State what the todo should take
275 */ 277 */
276 void setState( const OPimState& state); 278 void setState( const OPimState& state );
277 279
278 /** 280 /**
279 * set the Maintainer Mode 281 * set the Maintainer Mode
280 */ 282 */
281 void setMaintainer( const OPimMaintainer& ); 283 void setMaintainer( const OPimMaintainer& );
282 284
283 bool isOverdue(); 285 bool isOverdue();
284 286
285 287
286 virtual bool match( const QRegExp &r )const; 288 virtual bool match( const QRegExp &r ) const;
287 289
288 bool operator<(const OTodo &toDoEvent )const; 290 bool operator<( const OTodo &toDoEvent ) const;
289 bool operator<=(const OTodo &toDoEvent )const; 291 bool operator<=( const OTodo &toDoEvent ) const;
290 bool operator!=(const OTodo &toDoEvent )const; 292 bool operator!=( const OTodo &toDoEvent ) const;
291 bool operator>(const OTodo &toDoEvent )const; 293 bool operator>( const OTodo &toDoEvent ) const;
292 bool operator>=(const OTodo &toDoEvent)const; 294 bool operator>=( const OTodo &toDoEvent ) const;
293 bool operator==(const OTodo &toDoEvent )const; 295 bool operator==( const OTodo &toDoEvent ) const;
294 OTodo &operator=(const OTodo &toDoEvent ); 296 OTodo &operator=( const OTodo &toDoEvent );
295 297
296 static int rtti(); 298 static int rtti();
297 299
298 private: 300 private:
299 class OTodoPrivate; 301 class OTodoPrivate;
300 struct OTodoData; 302 struct OTodoData;
301 303
302 void deref(); 304 void deref();
303 inline void changeOrModify(); 305 inline void changeOrModify();
304 void copy( OTodoData* src, OTodoData* dest ); 306 void copy( OTodoData* src, OTodoData* dest );
305 OTodoPrivate *d; 307 OTodoPrivate *d;
306 OTodoData *data; 308 OTodoData *data;
307 309
308}; 310};
309inline bool OTodo::operator!=(const OTodo &toDoEvent )const { 311
310 return !(*this == toDoEvent); 312
313inline bool OTodo::operator!=( const OTodo &toDoEvent ) const
314{
315 return !( *this == toDoEvent );
311} 316}
312 317
313} 318}
314 319
315#endif 320#endif