summaryrefslogtreecommitdiff
path: root/libopie2/opiepim
authormickeyl <mickeyl>2004-02-23 13:15:42 (UTC)
committer mickeyl <mickeyl>2004-02-23 13:15:42 (UTC)
commitf9f0c26d9ac94586ffc36efa1b582ece3dbc43cf (patch) (unidiff)
tree4044006e676c78370fdeccf960ea4214f13eabd2 /libopie2/opiepim
parent2d37d653310da0a9d6e2e2e6c9f5bf092e54cbbb (diff)
downloadopie-f9f0c26d9ac94586ffc36efa1b582ece3dbc43cf.zip
opie-f9f0c26d9ac94586ffc36efa1b582ece3dbc43cf.tar.gz
opie-f9f0c26d9ac94586ffc36efa1b582ece3dbc43cf.tar.bz2
cosmetics
Diffstat (limited to 'libopie2/opiepim') (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opiepim/core/opimnotify.cpp219
-rw-r--r--libopie2/opiepim/core/opimnotify.h21
-rw-r--r--libopie2/opiepim/core/opimnotifymanager.cpp120
-rw-r--r--libopie2/opiepim/core/opimnotifymanager.h18
-rw-r--r--libopie2/opiepim/core/opimrecord.cpp117
-rw-r--r--libopie2/opiepim/core/opimrecord.h28
-rw-r--r--libopie2/opiepim/ocontact.cpp235
-rw-r--r--libopie2/opiepim/ocontact.h11
-rw-r--r--libopie2/opiepim/ocontactfields.cpp40
-rw-r--r--libopie2/opiepim/ocontactfields.h16
-rw-r--r--libopie2/opiepim/oevent.cpp534
-rw-r--r--libopie2/opiepim/oevent.h33
-rw-r--r--libopie2/opiepim/orecordlist.h142
-rw-r--r--libopie2/opiepim/otodo.cpp294
-rw-r--r--libopie2/opiepim/otodo.h27
15 files changed, 1349 insertions, 506 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}
56
57
51OPimNotify::OPimNotify( const OPimNotify& noti) 58OPimNotify::OPimNotify( const OPimNotify& noti)
52 : data( noti.data ) 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
120
121QDateTime OPimNotify::endTime() const
122{
92 return QDateTime( data->start.date(), data->start.time().addSecs( data->dur) ); 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}
198
199
142OPimAlarm::OPimAlarm( const OPimAlarm& al) 200OPimAlarm::OPimAlarm( const OPimAlarm& al)
143 : OPimNotify(al), data( al.data ) 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}
215
216
153OPimAlarm &OPimAlarm::operator=( const OPimAlarm& al) 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
239
240QString OPimAlarm::type() const
241{
172 return QString::fromLatin1("OPimAlarm"); 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};
303
304
210OPimReminder::OPimReminder( int uid, const QDateTime& start, int dur, int parent ) 305OPimReminder::OPimReminder( int uid, const QDateTime& start, int dur, int parent )
211 : OPimNotify( start, dur, 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
319
320OPimReminder& OPimReminder::operator=( const OPimReminder& rem )
321{
222 OPimNotify::operator=(rem ); 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
339
340QString OPimReminder::type() const
341{
236 return QString::fromLatin1("OPimReminder"); 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
369void OPimReminder::copyIntern()
370{
371 if ( data->count != 1 )
372 {
253 Data* da = new Data; 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,13 +46,15 @@ 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
53{
54
51public: 55public:
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
@@ -97,13 +101,14 @@ 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
108{
104public: 109public:
105 enum Sound{Loud=1, Silent=0, Custom=2 }; 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
@@ -132,15 +137,15 @@ 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
144{
139public: 145public:
140
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
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,122 +23,170 @@
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{
53 if ( noti.type() == QString::fromLatin1( "OPimReminder" ) )
54 {
45 const OPimReminder& rem = static_cast<const OPimReminder&>(noti); 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 }
58 else if ( noti.type() == QString::fromLatin1( "OPimAlarm" ) )
59 {
48 const OPimAlarm& al = static_cast<const OPimAlarm&>(noti); 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
66void OPimNotifyManager::remove( const OPimNotify& noti )
67{
68 if ( noti.type() == QString::fromLatin1( "OPimReminder" ) )
69 {
54 const OPimReminder& rem = static_cast<const OPimReminder&>(noti); 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 }
73 else if ( noti.type() == QString::fromLatin1( "OPimAlarm" ) )
74 {
57 const OPimAlarm& al = static_cast<const OPimAlarm&>(noti); 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
81void OPimNotifyManager::replace( const OPimNotify& noti )
82{
83 if ( noti.type() == QString::fromLatin1( "OPimReminder" ) )
84 {
63 const OPimReminder& rem = static_cast<const OPimReminder&>(noti); 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 }
89 else if ( noti.type() == QString::fromLatin1( "OPimAlarm" ) )
90 {
67 const OPimAlarm& al = static_cast<const OPimAlarm&>(noti); 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 { 108
109
110OPimAlarm OPimNotifyManager::alarmAtDateTime( const QDateTime& when, bool& found ) const
111{
79 Alarms::ConstIterator it; 112 Alarms::ConstIterator it;
80 found = true; 113 found = true;
81 114
82 for ( it = m_al.begin(); it != m_al.end(); ++it ){ 115 for ( it = m_al.begin(); it != m_al.end(); ++it )
116 {
83 if ( (*it).dateTime() == when ) 117 if ( (*it).dateTime() == when )
84 return (*it); 118 return (*it);
85 } 119 }
86 120
87 // Fall through if nothing could be found 121 // Fall through if nothing could be found
88 found = false; 122 found = false;
89 OPimAlarm empty; 123 OPimAlarm empty;
90 return 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
164bool OPimNotifyManager::isEmpty() const
165{
122 qWarning("is Empty called on OPimNotifyManager %d %d", m_rem.count(), m_al.count() ); 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() )
179 {
134 QStringList als; 180 QStringList als;
135 OPimNotifyManager::Alarms::Iterator it = alarms.begin(); 181 OPimNotifyManager::Alarms::Iterator it = alarms.begin();
136 for ( ; it != alarms.end(); ++it ) { 182 for ( ; it != alarms.end(); ++it )
183 {
137 /* only if time is valid */ 184 /* only if time is valid */
138 if ( (*it).dateTime().isValid() ) { 185 if ( ( *it ).dateTime().isValid() )
186 {
139 als << OConversion::dateTimeToString( (*it).dateTime() ) 187 als << OConversion::dateTimeToString( (*it).dateTime() )
140 + ":" + QString::number( (*it).duration() ) 188 + ":" + QString::number( (*it).duration() )
141 + ":" + QString::number( (*it).sound() ) 189 + ":" + QString::number( (*it).sound() )
142 + ":"; 190 + ":";
143 } 191 }
144 } 192 }
@@ -146,48 +194,56 @@ QString OPimNotifyManager::alarmsToString() const
146 qWarning("als: %s", als.join("____________").latin1() ); 194 qWarning("als: %s", als.join("____________").latin1() );
147 str = als.join(";"); 195 str = als.join(";");
148 } 196 }
149 197
150 return str; 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() )
208 {
158 OPimNotifyManager::Reminders::Iterator it = reminders.begin(); 209 OPimNotifyManager::Reminders::Iterator it = reminders.begin();
159 QStringList records; 210 QStringList records;
160 for ( ; it != reminders.end(); ++it ) { 211 for ( ; it != reminders.end(); ++it )
212 {
161 records << QString::number( (*it).recordUid() ); 213 records << QString::number( (*it).recordUid() );
162 } 214 }
163 str = records.join(";"); 215 str = records.join(";");
164 } 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 )
226 {
173 QStringList alarm = QStringList::split(":", (*it), TRUE ); // allow empty 227 QStringList alarm = QStringList::split(":", (*it), TRUE ); // allow empty
174 qWarning("alarm: %s", alarm.join("___").latin1() ); 228 qWarning("alarm: %s", alarm.join("___").latin1() );
175 qWarning("alarm[0]: %s %s", alarm[0].latin1(), 229 qWarning("alarm[0]: %s %s", alarm[0].latin1(),
176 OConversion::dateTimeFromString( alarm[0] ).toString().latin1() ); 230 OConversion::dateTimeFromString( alarm[0] ).toString().latin1() );
177 OPimAlarm al( alarm[2].toInt(), OConversion::dateTimeFromString( alarm[0] ), 231 OPimAlarm al( alarm[2].toInt(), OConversion::dateTimeFromString( alarm[0] ),
178 alarm[1].toInt() ); 232 alarm[1].toInt() );
179 add( al ); 233 add( al );
180 } 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 )
243 {
188 OPimReminder rem( (*it).toInt() ); 244 OPimReminder rem( (*it).toInt() );
189 add( rem ); 245 add( rem );
190 } 246 }
191 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,24 +23,28 @@
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
44{
41public: 45public:
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
@@ -103,14 +107,12 @@ public:
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
110
111private: 113private:
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;
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
64OPimRecord &OPimRecord::operator=( const OPimRecord& rec )
65{
55 if ( this == &rec ) return *this; 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++ )
87 {
73 list << catDB.label( appname, cats[i] ); 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 )
131{
106 if ( uid == 1) 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++ )
175 {
139 stream >> array[i]; 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++ )
205 {
164 stream << categories()[i]; 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 )
216 {
174 flush( (*it).partner( OPimXRef::One), stream ); 217 flush( (*it).partner( OPimXRef::One), stream );
175 flush( (*it).partner( OPimXRef::Two), 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,36 +23,40 @@
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
56{
53public: 57public:
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 */
@@ -107,14 +111,16 @@ public:
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 */
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 ) )
85 {
103 qWarning( "Invalid UID found. Generate new one.." ); 86 qWarning( "Invalid UID found. Generate new one.." );
104 setUid( uidGen().generate() ); 87 setUid( uidGen().generate() );
105 }else 88 }
89 else
106 setUid( uidStr.toInt() ); 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 )
@@ -478,202 +461,243 @@ QString OContact::toRichText() const
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() )
468 {
485 text += Qtopia::escapeString(value); 469 text += Qtopia::escapeString(value);
486 if ( comp ) 470 if ( comp )
487 text += ", " + Qtopia::escapeString(comp); 471 text += ", " + Qtopia::escapeString(comp);
488 }else if ( comp ) 472 }
473 else if ( comp )
489 text += "<br>" + Qtopia::escapeString(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() )
480 {
495 text += "<b><img src=\"addressbook/email\"> " + QObject::tr("Default Email: ") + "</b>" 481 text += "<b><img src=\"addressbook/email\"> " + QObject::tr("Default Email: ") + "</b>"
496 + Qtopia::escapeString(defEmail); 482 + Qtopia::escapeString(defEmail);
497 marker = true; 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() )
489 {
503 text += QObject::tr( "<br><b>Work Address:</b>" ); 490 text += QObject::tr( "<br><b>Work Address:</b>" );
504 marker = true; 491 marker = true;
505 } 492 }
506 493
507 if ( !(value = businessStreet()).isEmpty() ){ 494 if ( !( value = businessStreet() ).isEmpty() )
495 {
508 text += "<br>" + Qtopia::escapeString(value); 496 text += "<br>" + Qtopia::escapeString(value);
509 marker = true; 497 marker = true;
510 } 498 }
511 499
512 switch( addressformat ){ 500 switch ( addressformat )
513 case Zip_City_State:{ // Zip_Code City, State 501 {
502 case Zip_City_State:
503 { // Zip_Code City, State
514 state = businessState(); 504 state = businessState();
515 if ( !(value = businessZip()).isEmpty() ){ 505 if ( !( value = businessZip() ).isEmpty() )
506 {
516 text += "<br>" + Qtopia::escapeString(value) + " "; 507 text += "<br>" + Qtopia::escapeString(value) + " ";
517 marker = true; 508 marker = true;
518 509
519 } 510 }
520 if ( !(value = businessCity()).isEmpty() ) { 511 if ( !( value = businessCity() ).isEmpty() )
512 {
521 marker = true; 513 marker = true;
522 if ( businessZip().isEmpty() && !businessStreet().isEmpty() ) 514 if ( businessZip().isEmpty() && !businessStreet().isEmpty() )
523 text += "<br>"; 515 text += "<br>";
524 text += Qtopia::escapeString(value); 516 text += Qtopia::escapeString(value);
525 if ( state ) 517 if ( state )
526 text += ", " + Qtopia::escapeString(state); 518 text += ", " + Qtopia::escapeString(state);
527 } else if ( !state.isEmpty() ){ 519 }
520 else if ( !state.isEmpty() )
521 {
528 text += "<br>" + Qtopia::escapeString(state); 522 text += "<br>" + Qtopia::escapeString(state);
529 marker = true; 523 marker = true;
530 } 524 }
531 break; 525 break;
532 } 526 }
533 case City_State_Zip:{ // City, State Zip_Code 527 case City_State_Zip:
528 { // City, State Zip_Code
534 state = businessState(); 529 state = businessState();
535 if ( !(value = businessCity()).isEmpty() ) { 530 if ( !( value = businessCity() ).isEmpty() )
531 {
536 marker = true; 532 marker = true;
537 text += "<br>" + Qtopia::escapeString(value); 533 text += "<br>" + Qtopia::escapeString(value);
538 if ( state ) 534 if ( state )
539 text += ", " + Qtopia::escapeString(state); 535 text += ", " + Qtopia::escapeString(state);
540 } else if ( !state.isEmpty() ){ 536 }
537 else if ( !state.isEmpty() )
538 {
541 text += "<br>" + Qtopia::escapeString(state); 539 text += "<br>" + Qtopia::escapeString(state);
542 marker = true; 540 marker = true;
543 } 541 }
544 if ( !(value = businessZip()).isEmpty() ){ 542 if ( !( value = businessZip() ).isEmpty() )
543 {
545 text += " " + Qtopia::escapeString(value); 544 text += " " + Qtopia::escapeString(value);
546 marker = true; 545 marker = true;
547 } 546 }
548 break; 547 break;
549 } 548 }
550 } 549 }
551 550
552 if ( !(value = businessCountry()).isEmpty() ){ 551 if ( !( value = businessCountry() ).isEmpty() )
552 {
553 text += "<br>" + Qtopia::escapeString(value); 553 text += "<br>" + Qtopia::escapeString(value);
554 marker = true; 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 {
560 text += "<br><b>" + QObject::tr("Office: ") + "</b>" 561 text += "<br><b>" + QObject::tr("Office: ") + "</b>"
561 + Qtopia::escapeString(str); 562 + Qtopia::escapeString(str);
562 marker = true; 563 marker = true;
563 } 564 }
564 str = businessWebpage(); 565 str = businessWebpage();
565 if ( !str.isEmpty() ){ 566 if ( !str.isEmpty() )
567 {
566 text += "<br><b><img src=\"addressbook/webpagework\"> " + QObject::tr("Business Web Page: ") + "</b>" 568 text += "<br><b><img src=\"addressbook/webpagework\"> " + QObject::tr("Business Web Page: ") + "</b>"
567 + Qtopia::escapeString(str); 569 + Qtopia::escapeString(str);
568 marker = true; 570 marker = true;
569 } 571 }
570 str = businessPhone(); 572 str = businessPhone();
571 if ( !str.isEmpty() ){ 573 if ( !str.isEmpty() )
574 {
572 text += "<br><b><img src=\"addressbook/phonework\"> " + QObject::tr("Business Phone: ") + "</b>" 575 text += "<br><b><img src=\"addressbook/phonework\"> " + QObject::tr("Business Phone: ") + "</b>"
573 + Qtopia::escapeString(str); 576 + Qtopia::escapeString(str);
574 marker = true; 577 marker = true;
575 } 578 }
576 str = businessFax(); 579 str = businessFax();
577 if ( !str.isEmpty() ){ 580 if ( !str.isEmpty() )
581 {
578 text += "<br><b><img src=\"addressbook/faxwork\"> " + QObject::tr("Business Fax: ") + "</b>" 582 text += "<br><b><img src=\"addressbook/faxwork\"> " + QObject::tr("Business Fax: ") + "</b>"
579 + Qtopia::escapeString(str); 583 + Qtopia::escapeString(str);
580 marker = true; 584 marker = true;
581 } 585 }
582 str = businessMobile(); 586 str = businessMobile();
583 if ( !str.isEmpty() ){ 587 if ( !str.isEmpty() )
588 {
584 text += "<br><b><img src=\"addressbook/mobilework\"> " + QObject::tr("Business Mobile: ") + "</b>" 589 text += "<br><b><img src=\"addressbook/mobilework\"> " + QObject::tr("Business Mobile: ") + "</b>"
585 + Qtopia::escapeString(str); 590 + Qtopia::escapeString(str);
586 marker = true; 591 marker = true;
587 } 592 }
588 str = businessPager(); 593 str = businessPager();
589 if ( !str.isEmpty() ){ 594 if ( !str.isEmpty() )
595 {
590 text += "<br><b>" + QObject::tr("Business Pager: ") + "</b>" 596 text += "<br><b>" + QObject::tr("Business Pager: ") + "</b>"
591 + Qtopia::escapeString(str); 597 + Qtopia::escapeString(str);
592 marker = true; 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() )
606 {
600 text += QObject::tr( "<br><b>Home Address:</b>" ); 607 text += QObject::tr( "<br><b>Home Address:</b>" );
601 marker = true; 608 marker = true;
602 } 609 }
603 610
604 if ( !(value = homeStreet()).isEmpty() ){ 611 if ( !( value = homeStreet() ).isEmpty() )
612 {
605 text += "<br>" + Qtopia::escapeString(value); 613 text += "<br>" + Qtopia::escapeString(value);
606 marker = true; 614 marker = true;
607 } 615 }
608 616
609 switch( addressformat ){ 617 switch ( addressformat )
610 case Zip_City_State:{ // Zip_Code City, State 618 {
619 case Zip_City_State:
620 { // Zip_Code City, State
611 state = homeState(); 621 state = homeState();
612 if ( !(value = homeZip()).isEmpty() ){ 622 if ( !( value = homeZip() ).isEmpty() )
623 {
613 text += "<br>" + Qtopia::escapeString(value) + " "; 624 text += "<br>" + Qtopia::escapeString(value) + " ";
614 marker = true; 625 marker = true;
615 } 626 }
616 if ( !(value = homeCity()).isEmpty() ) { 627 if ( !( value = homeCity() ).isEmpty() )
628 {
617 marker = true; 629 marker = true;
618 if ( homeZip().isEmpty() && !homeStreet().isEmpty() ) 630 if ( homeZip().isEmpty() && !homeStreet().isEmpty() )
619 text += "<br>"; 631 text += "<br>";
620 text += Qtopia::escapeString(value); 632 text += Qtopia::escapeString(value);
621 if ( !state.isEmpty() ) 633 if ( !state.isEmpty() )
622 text += ", " + Qtopia::escapeString(state); 634 text += ", " + Qtopia::escapeString(state);
623 } else if (!state.isEmpty()) { 635 }
636 else if ( !state.isEmpty() )
637 {
624 text += "<br>" + Qtopia::escapeString(state); 638 text += "<br>" + Qtopia::escapeString(state);
625 marker = true; 639 marker = true;
626 } 640 }
627 break; 641 break;
628 } 642 }
629 case City_State_Zip:{ // City, State Zip_Code 643 case City_State_Zip:
644 { // City, State Zip_Code
630 state = homeState(); 645 state = homeState();
631 if ( !(value = homeCity()).isEmpty() ) { 646 if ( !( value = homeCity() ).isEmpty() )
647 {
632 marker = true; 648 marker = true;
633 text += "<br>" + Qtopia::escapeString(value); 649 text += "<br>" + Qtopia::escapeString(value);
634 if ( state ) 650 if ( state )
635 text += ", " + Qtopia::escapeString(state); 651 text += ", " + Qtopia::escapeString(state);
636 } else if ( !state.isEmpty() ){ 652 }
653 else if ( !state.isEmpty() )
654 {
637 text += "<br>" + Qtopia::escapeString(state); 655 text += "<br>" + Qtopia::escapeString(state);
638 marker = true; 656 marker = true;
639 } 657 }
640 if ( !(value = homeZip()).isEmpty() ){ 658 if ( !( value = homeZip() ).isEmpty() )
659 {
641 text += " " + Qtopia::escapeString(value); 660 text += " " + Qtopia::escapeString(value);
642 marker = true; 661 marker = true;
643 } 662 }
644 break; 663 break;
645 } 664 }
646 } 665 }
647 666
648 if ( !(value = homeCountry()).isEmpty() ){ 667 if ( !( value = homeCountry() ).isEmpty() )
668 {
649 text += "<br>" + Qtopia::escapeString(value); 669 text += "<br>" + Qtopia::escapeString(value);
650 marker = true; 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() )
676 {
656 text += "<br><b><img src=\"addressbook/webpagehome\"> " + QObject::tr("Home Web Page: ") + "</b>" 677 text += "<br><b><img src=\"addressbook/webpagehome\"> " + QObject::tr("Home Web Page: ") + "</b>"
657 + Qtopia::escapeString(str); 678 + Qtopia::escapeString(str);
658 marker = true; 679 marker = true;
659 } 680 }
660 str = homePhone(); 681 str = homePhone();
661 if ( !str.isEmpty() ){ 682 if ( !str.isEmpty() )
683 {
662 text += "<br><b><img src=\"addressbook/phonehome\"> " + QObject::tr("Home Phone: ") + "</b>" 684 text += "<br><b><img src=\"addressbook/phonehome\"> " + QObject::tr("Home Phone: ") + "</b>"
663 + Qtopia::escapeString(str); 685 + Qtopia::escapeString(str);
664 marker = true; 686 marker = true;
665 } 687 }
666 str = homeFax(); 688 str = homeFax();
667 if ( !str.isEmpty() ){ 689 if ( !str.isEmpty() )
690 {
668 text += "<br><b><img src=\"addressbook/faxhome\"> " + QObject::tr("Home Fax: ") + "</b>" 691 text += "<br><b><img src=\"addressbook/faxhome\"> " + QObject::tr("Home Fax: ") + "</b>"
669 + Qtopia::escapeString(str); 692 + Qtopia::escapeString(str);
670 marker = true; 693 marker = true;
671 } 694 }
672 str = homeMobile(); 695 str = homeMobile();
673 if ( !str.isEmpty() ){ 696 if ( !str.isEmpty() )
697 {
674 text += "<br><b><img src=\"addressbook/mobilehome\"> " + QObject::tr("Home Mobile: ") + "</b>" 698 text += "<br><b><img src=\"addressbook/mobilehome\"> " + QObject::tr("Home Mobile: ") + "</b>"
675 + Qtopia::escapeString(str); 699 + Qtopia::escapeString(str);
676 marker = true; 700 marker = true;
677 } 701 }
678 702
679 if ( marker ) 703 if ( marker )
@@ -694,30 +718,33 @@ QString OContact::toRichText() const
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 )
725 {
701 text += "<br>"; 726 text += "<br>";
702 if ( str.toInt() == 1 ) 727 if ( str.toInt() == 1 )
703 str = QObject::tr( "Male" ); 728 str = QObject::tr( "Male" );
704 else if ( str.toInt() == 2 ) 729 else if ( str.toInt() == 2 )
705 str = QObject::tr( "Female" ); 730 str = QObject::tr( "Female" );
706 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str; 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() )
738 {
713 str = TimeString::numberDateString( birthday() ); 739 str = TimeString::numberDateString( birthday() );
714 text += "<br><b>" + QObject::tr("Birthday: ") + "</b>" 740 text += "<br><b>" + QObject::tr("Birthday: ") + "</b>"
715 + Qtopia::escapeString(str); 741 + Qtopia::escapeString(str);
716 } 742 }
717 if ( anniversary().isValid() ){ 743 if ( anniversary().isValid() )
744 {
718 str = TimeString::numberDateString( anniversary() ); 745 str = TimeString::numberDateString( anniversary() );
719 text += "<br><b>" + QObject::tr("Anniversary: ") + "</b>" 746 text += "<br><b>" + QObject::tr("Anniversary: ") + "</b>"
720 + Qtopia::escapeString(str); 747 + Qtopia::escapeString(str);
721 } 748 }
722 str = children(); 749 str = children();
723 if ( !str.isEmpty() ) 750 if ( !str.isEmpty() )
@@ -727,19 +754,21 @@ QString OContact::toRichText() const
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() )
761 {
734 text += "<br><b>" + QObject::tr( "Category:") + "</b> "; 762 text += "<br><b>" + QObject::tr( "Category:") + "</b> ";
735 text += categoryNames("Contacts").join(", "); 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() )
768 {
740 text += "<br><hr><b>" + QObject::tr( "Notes:") + "</b> "; 769 text += "<br><hr><b>" + QObject::tr( "Notes:") + "</b> ";
741 QRegExp reg("\n"); 770 QRegExp reg("\n");
742 771
743 //QString tmp = Qtopia::escapeString(value); 772 //QString tmp = Qtopia::escapeString(value);
744 QString tmp = QStyleSheet::convertFromPlainText(value); 773 QString tmp = QStyleSheet::convertFromPlainText(value);
745 //tmp.replace( reg, "<br>" ); 774 //tmp.replace( reg, "<br>" );
@@ -834,28 +863,32 @@ 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() )
870 {
841 if ( !name.isEmpty() ) 871 if ( !name.isEmpty() )
842 name += " "; 872 name += " ";
843 name += firstName; 873 name += firstName;
844 } 874 }
845 if ( !middleName.isEmpty() ) { 875 if ( !middleName.isEmpty() )
876 {
846 if ( !name.isEmpty() ) 877 if ( !name.isEmpty() )
847 name += " "; 878 name += " ";
848 name += middleName; 879 name += middleName;
849 } 880 }
850 if ( !lastName.isEmpty() ) { 881 if ( !lastName.isEmpty() )
882 {
851 if ( !name.isEmpty() ) 883 if ( !name.isEmpty() )
852 name += " "; 884 name += " ";
853 name += lastName; 885 name += lastName;
854 } 886 }
855 if ( !suffix.isEmpty() ) { 887 if ( !suffix.isEmpty() )
888 {
856 if ( !name.isEmpty() ) 889 if ( !name.isEmpty() )
857 name += " "; 890 name += " ";
858 name += suffix; 891 name += suffix;
859 } 892 }
860 return name.simplifyWhiteSpace(); 893 return name.simplifyWhiteSpace();
861} 894}
@@ -897,13 +930,14 @@ 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() )
937 {
904 qDebug(" emailstr "); 938 qDebug(" emailstr ");
905 QStringList l = QStringList::split( emailSeparator(), emailStr ); 939 QStringList l = QStringList::split( emailSeparator(), emailStr );
906 for ( QStringList::ConstIterator it = l.begin();it != l.end();++it ) 940 for ( QStringList::ConstIterator it = l.begin();it != l.end();++it )
907 r += (*it).simplifyWhiteSpace(); 941 r += (*it).simplifyWhiteSpace();
908 } 942 }
909 943
@@ -943,16 +977,18 @@ 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 )
984 {
950 const QString &value = it.data(); 985 const QString &value = it.data();
951 int key = it.key(); 986 int key = it.key();
952 if ( !value.isEmpty() ) { 987 if ( !value.isEmpty() )
988 {
953 if ( key == Qtopia::AddressCategory || key == Qtopia::AddressUid) 989 if ( key == Qtopia::AddressCategory || key == Qtopia::AddressUid)
954 continue; 990 continue;
955 991
956 key -= Qtopia::AddressCategory+1; 992 key -= Qtopia::AddressCategory+1;
957 buf += SLFIELDS[key]; 993 buf += SLFIELDS[key];
958 buf += "=\"" + Qtopia::escapeString(value) + "\" "; 994 buf += "=\"" + Qtopia::escapeString(value) + "\" ";
@@ -1058,14 +1094,16 @@ 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;
@@ -1073,19 +1111,20 @@ bool OContact::match( const QRegExp &r ) const
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
@@ -1096,13 +1135,14 @@ class QString OContact::recordField( int pos ) const
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() )
1142 {
1103 qWarning( "Remove Birthday"); 1143 qWarning( "Remove Birthday");
1104 replace( Qtopia::Birthday, QString::null ); 1144 replace( Qtopia::Birthday, QString::null );
1105 return; 1145 return;
1106 } 1146 }
1107 1147
1108 if ( v.isValid() ) 1148 if ( v.isValid() )
@@ -1114,22 +1154,24 @@ void OContact::setBirthday( const QDate &v )
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() )
1161 {
1121 qWarning( "Remove Anniversary"); 1162 qWarning( "Remove Anniversary");
1122 replace( Qtopia::Anniversary, QString::null ); 1163 replace( Qtopia::Anniversary, QString::null );
1123 return; 1164 return;
1124 } 1165 }
1125 1166
1126 if ( v.isValid() ) 1167 if ( v.isValid() )
1127 replace( Qtopia::Anniversary, OConversion::dateToString( v ) ); 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 );
@@ -1160,13 +1202,14 @@ void 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() )
1209 {
1167 setDefaultEmail( e ); // will insert into the list for us 1210 setDefaultEmail( e ); // will insert into the list for us
1168 return; 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 );
@@ -1175,12 +1218,13 @@ void OContact::insertEmail( const QString &v )
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
1224
1181void OContact::removeEmail( const QString &v ) 1225void 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();
@@ -1194,45 +1238,56 @@ void OContact::removeEmail( const QString &v )
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 )
1245 {
1201 //qDebug("removeEmail is default; setting new default"); 1246 //qDebug("removeEmail is default; setting new default");
1202 if ( !emails.count() ) 1247 if ( !emails.count() )
1203 clearEmails(); 1248 clearEmails();
1204 else // setDefaultEmail will remove e from the list 1249 else // setDefaultEmail will remove e from the list
1205 setDefaultEmail( emails.first() ); 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,40 +23,45 @@
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;
61
57public: 62public:
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{
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,23 +24,26 @@
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{
@@ -420,70 +423,77 @@ OContactFields::OContactFields():
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 )
435 {
431 Config cfg ( "AddressBook" ); 436 Config cfg ( "AddressBook" );
432 cfg.setGroup( "ContactFieldOrder" ); 437 cfg.setGroup( "ContactFieldOrder" );
433 cfg.writeEntry( "General", globalFieldOrder ); 438 cfg.writeEntry( "General", globalFieldOrder );
434 } 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 )
458{
452 qDebug("ocontactfields loadFromRecord"); 459 qDebug("ocontactfields loadFromRecord");
453 qDebug("loading >%s<",cnt.fullName().latin1()); 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() )
470 {
463 fieldOrder = globalFieldOrder; 471 fieldOrder = globalFieldOrder;
464 } 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 )
479{
471 qDebug("qcontactfields setfieldorder pos %i -> %i",num,index); 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 )
493{
484 qDebug("ocontactfields getFieldOrder"); 494 qDebug("ocontactfields getFieldOrder");
485 qDebug("fieldOrder >%s<",fieldOrder.latin1()); 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
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,26 +23,32 @@
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 44
41namespace Opie { 45namespace Opie
42class OContactFields{ 46{
47class OContactFields
48{
43 49
44 public: 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>.
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,67 +23,85 @@
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;
@@ -95,246 +113,352 @@ struct OEvent::Data : public QShared {
95 bool isAllDay : 1; 113 bool 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}
125
126
105OEvent::OEvent( const OEvent& ev) 127OEvent::OEvent( const OEvent& ev)
106 : OPimRecord( ev ), data( ev.data ) 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
152
153OEvent& OEvent::operator=( const OEvent& ev )
154{
126 if ( this == &ev ) return *this; 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
204
205bool OEvent::hasNotifiers() const
206{
160 if (!data->manager ) 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
216
217ORecur OEvent::recurrence() const
218{
169 if (!data->recur) 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
235
236bool OEvent::hasRecurrence() const
237{
182 if (!data->recur ) return false; 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
349
350QString OEvent::timeZone() const
351{
251 if (data->isAllDay ) return QString::fromLatin1("UTC"); 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() )
395 {
283 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "" ); 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() )
422 {
305 text += "<b>" + QObject::tr( "Start:") + "</b> "; 423 text += "<b>" + QObject::tr( "Start:") + "</b> ";
306 text += Qtopia::escapeString(startDateTime().toString() ). 424 text += Qtopia::escapeString(startDateTime().toString() ).
307 replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 425 replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
308 } 426 }
309 427
310 // end time 428 // end time
311 if ( endDateTime().isValid() ) { 429 if ( endDateTime().isValid() )
430 {
312 text += "<b>" + QObject::tr( "End:") + "</b> "; 431 text += "<b>" + QObject::tr( "End:") + "</b> ";
313 text += Qtopia::escapeString(endDateTime().toString() ). 432 text += Qtopia::escapeString(endDateTime().toString() ).
314 replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 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() )
439 {
320 text += "<b>" + QObject::tr( "Category:") + "</b> "; 440 text += "<b>" + QObject::tr( "Category:") + "</b> ";
321 text += categoryNames("Calendar").join(", "); 441 text += categoryNames("Calendar").join(", ");
322 text += "<br>"; 442 text += "<br>";
323 } 443 }
324 444
325 //notes 445 //notes
326 if ( !note().isEmpty() ) { 446 if ( !note().isEmpty() )
447 {
327 text += "<b>" + QObject::tr( "Note:") + "</b><br>"; 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,29 +467,48 @@ 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
474
475QString OEvent::type() const
476{
350 return QString::fromLatin1("OEvent"); 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 )
@@ -379,32 +522,38 @@ 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() ) );
@@ -417,43 +566,49 @@ QMap<int, QString> OEvent::toMap()const {
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() )
573 {
424 QArray<int> childr = children(); 574 QArray<int> childr = children();
425 QString buf; 575 QString buf;
426 for ( uint i = 0; i < childr.count(); i++ ) { 576 for ( uint i = 0; i < childr.count(); i++ )
577 {
427 if ( i != 0 ) buf += " "; 578 if ( i != 0 ) buf += " ";
428 buf += QString::number( childr[i] ); 579 buf += QString::number( childr[i] );
429 } 580 }
430 retMap.insert( OEvent::FRecChildren, buf ); 581 retMap.insert( OEvent::FRecChildren, buf );
431 } 582 }
432 583
433 // Add recurrence stuff 584 // Add recurrence stuff
434 if( hasRecurrence() ){ 585 if ( hasRecurrence() )
586 {
435 ORecur recur = recurrence(); 587 ORecur recur = recurrence();
436 QMap<int, QString> recFields = recur.toMap(); 588 QMap<int, QString> recFields = recur.toMap();
437 retMap.insert( OEvent::FRType, recFields[ORecur::RType] ); 589 retMap.insert( OEvent::FRType, recFields[ORecur::RType] );
438 retMap.insert( OEvent::FRWeekdays, recFields[ORecur::RWeekdays] ); 590 retMap.insert( OEvent::FRWeekdays, recFields[ORecur::RWeekdays] );
439 retMap.insert( OEvent::FRPosition, recFields[ORecur::RPosition] ); 591 retMap.insert( OEvent::FRPosition, recFields[ORecur::RPosition] );
440 retMap.insert( OEvent::FRFreq, recFields[ORecur::RFreq] ); 592 retMap.insert( OEvent::FRFreq, recFields[ORecur::RFreq] );
441 retMap.insert( OEvent::FRHasEndDate, recFields[ORecur::RHasEndDate] ); 593 retMap.insert( OEvent::FRHasEndDate, recFields[ORecur::RHasEndDate] );
442 retMap.insert( OEvent::FREndDate, recFields[ORecur::EndDate] ); 594 retMap.insert( OEvent::FREndDate, recFields[ORecur::EndDate] );
443 retMap.insert( OEvent::FRCreated, recFields[ORecur::Created] ); 595 retMap.insert( OEvent::FRCreated, recFields[ORecur::Created] );
444 retMap.insert( OEvent::FRExceptions, recFields[ORecur::Exceptions] ); 596 retMap.insert( OEvent::FRExceptions, recFields[ORecur::Exceptions] );
445 } else { 597 }
598 else
599 {
446 ORecur recur = recurrence(); 600 ORecur recur = recurrence();
447 QMap<int, QString> recFields = recur.toMap(); 601 QMap<int, QString> recFields = recur.toMap();
448 retMap.insert( OEvent::FRType, recFields[ORecur::RType] ); 602 retMap.insert( OEvent::FRType, recFields[ORecur::RType] );
449 } 603 }
450 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() );
@@ -469,31 +624,36 @@ void OEvent::fromMap( const QMap<int, QString>& map )
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 ) )
631 {
476 QDateTime dt = startDateTime().addSecs( -1*alarmTime*60 ); 632 QDateTime dt = startDateTime().addSecs( -1*alarmTime*60 );
477 OPimAlarm al( sound , dt ); 633 OPimAlarm al( sound , dt );
478 notifiers().add( al ); 634 notifiers().add( al );
479 } 635 }
480 if ( !map[OEvent::FTimeZone].isEmpty() && ( map[OEvent::FTimeZone] != "None" ) ){ 636 if ( !map[ OEvent::FTimeZone ].isEmpty() && ( map[ OEvent::FTimeZone ] != "None" ) )
637 {
481 setTimeZone( map[OEvent::FTimeZone] ); 638 setTimeZone( map[OEvent::FTimeZone] );
482 } 639 }
483 640
484 time_t start = (time_t) map[OEvent::FStart].toLong(); 641 time_t start = (time_t) map[OEvent::FStart].toLong();
485 time_t end = (time_t) map[OEvent::FEnd].toLong(); 642 time_t end = (time_t) map[OEvent::FEnd].toLong();
486 643
487 /* AllDay is always in UTC */ 644 /* AllDay is always in UTC */
488 if ( isAllDay() ) { 645 if ( isAllDay() )
646 {
489 OTimeZone utc = OTimeZone::utc(); 647 OTimeZone utc = OTimeZone::utc();
490 setStartDateTime( utc.fromUTCDateTime( start ) ); 648 setStartDateTime( utc.fromUTCDateTime( start ) );
491 setEndDateTime ( utc.fromUTCDateTime( end ) ); 649 setEndDateTime ( utc.fromUTCDateTime( end ) );
492 setTimeZone( "UTC"); // make sure it is really utc 650 setTimeZone( "UTC"); // make sure it is really utc
493 }else { 651 }
652 else
653 {
494 /* to current date time */ 654 /* to current date time */
495 // qWarning(" Start is %d", start ); 655 // qWarning(" Start is %d", start );
496 OTimeZone zone( timeZone().isEmpty() ? OTimeZone::current() : timeZone() ); 656 OTimeZone zone( timeZone().isEmpty() ? OTimeZone::current() : timeZone() );
497 QDateTime date = zone.toDateTime( start ); 657 QDateTime date = zone.toDateTime( start );
498 qWarning(" Start is %s", date.toString().latin1() ); 658 qWarning(" Start is %s", date.toString().latin1() );
499 setStartDateTime( zone.toDateTime( date, OTimeZone::current() ) ); 659 setStartDateTime( zone.toDateTime( date, OTimeZone::current() ) );
@@ -502,21 +662,24 @@ void OEvent::fromMap( const QMap<int, QString>& map )
502 setEndDateTime ( zone.toDateTime( date, OTimeZone::current() ) ); 662 setEndDateTime ( zone.toDateTime( date, OTimeZone::current() ) );
503 } 663 }
504 664
505 if ( !map[OEvent::FRecParent].isEmpty() ) 665 if ( !map[OEvent::FRecParent].isEmpty() )
506 setParent( map[OEvent::FRecParent].toInt() ); 666 setParent( map[OEvent::FRecParent].toInt() );
507 667
508 if ( !map[OEvent::FRecChildren].isEmpty() ){ 668 if ( !map[ OEvent::FRecChildren ].isEmpty() )
669 {
509 QStringList list = QStringList::split(' ', map[OEvent::FRecChildren] ); 670 QStringList list = QStringList::split(' ', map[OEvent::FRecChildren] );
510 for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { 671 for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
672 {
511 addChild( (*it).toInt() ); 673 addChild( (*it).toInt() );
512 } 674 }
513 } 675 }
514 676
515 // Fill recurrence stuff and put it directly into the ORecur-Object using fromMap.. 677 // Fill recurrence stuff and put it directly into the ORecur-Object using fromMap..
516 if( !map[OEvent::FRType].isEmpty() ){ 678 if ( !map[ OEvent::FRType ].isEmpty() )
679 {
517 QMap<int, QString> recFields; 680 QMap<int, QString> recFields;
518 recFields.insert( ORecur::RType, map[OEvent::FRType] ); 681 recFields.insert( ORecur::RType, map[OEvent::FRType] );
519 recFields.insert( ORecur::RWeekdays, map[OEvent::FRWeekdays] ); 682 recFields.insert( ORecur::RWeekdays, map[OEvent::FRWeekdays] );
520 recFields.insert( ORecur::RPosition, map[OEvent::FRPosition] ); 683 recFields.insert( ORecur::RPosition, map[OEvent::FRPosition] );
521 recFields.insert( ORecur::RFreq, map[OEvent::FRFreq] ); 684 recFields.insert( ORecur::RFreq, map[OEvent::FRFreq] );
522 recFields.insert( ORecur::RHasEndDate, map[OEvent::FRHasEndDate] ); 685 recFields.insert( ORecur::RHasEndDate, map[OEvent::FRHasEndDate] );
@@ -527,74 +690,103 @@ void OEvent::fromMap( const QMap<int, QString>& map )
527 setRecurrence( recur ); 690 setRecurrence( recur );
528 } 691 }
529 692
530} 693}
531 694
532 695
533int OEvent::parent()const { 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
708
709QArray<int> OEvent::children() const
710{
541 if (!data->child) return QArray<int>(); 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 )
731 {
555 data->child = new QArray<int>(1); 732 data->child = new QArray<int>(1);
556 (*data->child)[0] = uid; 733 (*data->child)[0] = uid;
557 }else{ 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
743
744void OEvent::removeChild( int uid )
745{
564 if (!data->child || !data->child->contains( uid ) ) return; 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 {
753 if ( ( *data->child ) [ i ] != uid )
754 {
571 newAr[j] = (*data->child)[i]; 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; 771 bool 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
820
821OEffectiveEvent& OEffectiveEvent::operator=( const OEffectiveEvent& ev )
822{
621 if ( *this == ev ) return *this; 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
916
917int OEffectiveEvent::length() const
918{
678 return (data->end.hour() * 60 - data->start.hour() * 60) 919 return (data->end.hour() * 60 - data->start.hour() * 60)
679 + QABS(data->start.minute() - data->end.minute() ); 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
992
993bool OEffectiveEvent::operator<=( const OEffectiveEvent &e ) const
994{
731 return (data->date <= e.date() ); 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
1007
1008bool OEffectiveEvent::operator!=( const OEffectiveEvent &e ) const
1009{
740 return !(*this == e ); 1010 return !(*this == e );
741} 1011}
742bool OEffectiveEvent::operator>( const OEffectiveEvent &e ) const { 1012
1013
1014bool OEffectiveEvent::operator>( const OEffectiveEvent &e ) const
1015{
743 return !(*this <= e ); 1016 return !(*this <= e );
744} 1017}
745bool OEffectiveEvent::operator>= ( const OEffectiveEvent &e ) const { 1018
1019
1020bool OEffectiveEvent::operator>= ( const OEffectiveEvent &e ) const
1021{
746 return !(*this < e); 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,13 +65,14 @@ 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
72{
69public: 73public:
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 */
@@ -188,12 +192,13 @@ public:
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*/
198
194private: 199private:
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;
@@ -201,13 +206,15 @@ private:
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
213{
214
208public: 215public:
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
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,34 +24,39 @@
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>;
56
52public: 57public:
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
@@ -102,28 +107,30 @@ private:
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
121{
115public: 122public:
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, 131ORecordList( 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
@@ -155,176 +162,235 @@ ORecordList( const QArray<int>& ids,
155private: 162private:
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()
184{
173/* nothing to delete */ 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 )
191{
178// qWarning("ORecordListIterator copy c'tor"); 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*()
217{
200 //qWarning("operator* %d %d", m_current, m_uids[m_current] ); 218 //qWarning("operator* %d %d", m_current, m_uids[m_current] );
201 if (!m_end ) 219 if (!m_end )
202 m_record = m_temp->find( m_uids[m_current], m_uids, m_current, 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 )
279{
248 return !(*this == it ); 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{
306 if ( cur < m_uids.count() )
307 {
267 m_end = false; 308 m_end = false;
268 m_current= cur; 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()
328{
283/* nothing to do here */ 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
354{
300return m_ids.count(); 355return 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} 366}
367
368
309template <class T> 369template <class T>
310int ORecordList<T>::uidAt( uint i ) { 370int ORecordList<T>::uidAt( uint i )
371{
311 return m_ids[i]; 372 return m_ids[i];
312} 373}
313 374
375
314template <class T> 376template <class T>
315bool ORecordList<T>::remove( int uid ) { 377bool ORecordList<T>::remove( int uid )
378{
316 QArray<int> copy( m_ids.count() ); 379 QArray<int> copy( m_ids.count() );
317 int counter = 0; 380 int counter = 0;
318 bool ret_val = false; 381 bool ret_val = false;
319 382
320 for (uint i = 0; i < m_ids.count(); i++){ 383 for ( uint i = 0; i < m_ids.count(); i++ )
321 if ( m_ids[i] != uid ){ 384 {
385 if ( m_ids[ i ] != uid )
386 {
322 copy[counter++] = m_ids[i]; 387 copy[counter++] = m_ids[i];
323 388
324 }else 389 }
390 else
325 ret_val = true; 391 ret_val = true;
326 } 392 }
327 393
328 copy.resize( counter ); 394 copy.resize( counter );
329 m_ids = copy; 395 m_ids = copy;
330 396
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,43 +23,46 @@
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;
@@ -75,27 +78,34 @@ 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
84
81OTodo::OTodo(const OTodo &event ) 85OTodo::OTodo(const OTodo &event )
82 : OPimRecord( event ), data( event.data ) 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() { 91
92
93OTodo::~OTodo()
94{
88 95
89// qWarning("~OTodo " ); 96// qWarning("~OTodo " );
90 if ( data->deref() ) { 97 if ( data->deref() )
98 {
91// qWarning("OTodo::dereffing"); 99// qWarning("OTodo::dereffing");
92 delete data; 100 delete data;
93 data = 0l; 101 data = 0l;
94 } 102 }
95} 103}
104
105
96OTodo::OTodo(bool completed, int priority, 106OTodo::OTodo(bool completed, int priority,
97 const QArray<int> &category, 107 const QArray<int> &category,
98 const QString& summary, 108 const QString& summary,
99 const QString &description, 109 const QString &description,
100 ushort progress, 110 ushort progress,
101 bool hasDate, QDate date, int uid ) 111 bool hasDate, QDate date, int uid )
@@ -111,12 +121,14 @@ OTodo::OTodo(bool completed, int priority,
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}
127
128
117OTodo::OTodo(bool completed, int priority, 129OTodo::OTodo(bool completed, int priority,
118 const QStringList &category, 130 const QStringList &category,
119 const QString& summary, 131 const QString& summary,
120 const QString &description, 132 const QString &description,
121 ushort progress, 133 ushort progress,
122 bool hasDate, QDate date, int uid ) 134 bool hasDate, QDate date, int uid )
@@ -132,192 +144,284 @@ OTodo::OTodo(bool completed, int priority,
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}
150
151
138bool OTodo::match( const QRegExp &regExp )const 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 )
155 {
141 setLastHitField( Priority ); 156 setLastHitField( Priority );
142 return true; 157 return true;
143 }else if( data->hasDate && data->date.toString().find( regExp) != -1 ){ 158 }
159 else if ( data->hasDate && data->date.toString().find( regExp ) != -1 )
160 {
144 setLastHitField( HasDate ); 161 setLastHitField( HasDate );
145 return true; 162 return true;
146 }else if(data->desc.find( regExp ) != -1 ){ 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}
200
201
169int OTodo::priority()const 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}
218
219
181QDate OTodo::dueDate()const 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}
236
237
191QString OTodo::description()const 238QString OTodo::description()const
192{ 239{
193 return data->desc; 240 return data->desc;
194} 241}
195bool OTodo::hasState() const{ 242
243
244bool OTodo::hasState() const
245{
196 if (!data->state ) return false; 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
262
263bool OTodo::hasRecurrence() const
264{
208 if (!data->recur) return false; 265 if (!data->recur) return false;
209 return data->recur->doesRecur(); 266 return data->recur->doesRecur();
210} 267}
211ORecur OTodo::recurrence()const { 268
269
270ORecur OTodo::recurrence() const
271{
212 if (!data->recur) return ORecur(); 272 if (!data->recur) return ORecur();
213 273
214 return (*data->recur); 274 return (*data->recur);
215} 275}
216bool OTodo::hasMaintainer()const { 276
277
278bool OTodo::hasMaintainer() const
279{
217 if (!data->maintainer) return false; 280 if (!data->maintainer) return false;
218 281
219 return (data->maintainer->mode() != OPimMaintainer::Undefined ); 282 return (data->maintainer->mode() != OPimMaintainer::Undefined );
220} 283}
221OPimMaintainer OTodo::maintainer()const { 284
285
286OPimMaintainer OTodo::maintainer() const
287{
222 if (!data->maintainer) return OPimMaintainer(); 288 if (!data->maintainer) return OPimMaintainer();
223 289
224 return (*data->maintainer); 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}
306
307
236void OTodo::setDescription(const QString &desc ) 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}
321
322
247void OTodo::setPriority(int prio ) 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}
388
389
293void OTodo::setProgress(ushort progress ) 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
396
397QString OTodo::toShortText() const
398{
299 return summary(); 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() )
414 {
312 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "" ); 415 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "" );
313 } 416 }
314 text += "</h3></b><br><hr><br>"; 417 text += "</h3></b><br><hr><br>";
315 418
316 // description 419 // description
317 if( !description().isEmpty() ){ 420 if ( !description().isEmpty() )
421 {
318 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>"; 422 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>";
319 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 423 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
320 } 424 }
321 425
322 // priority 426 // priority
323 int priorityval = priority(); 427 int priorityval = priority();
@@ -341,13 +445,14 @@ QString OTodo::toRichText() const
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() )
452 {
348 QDate dd = dueDate(); 453 QDate dd = dueDate();
349 int off = QDate::currentDate().daysTo( dd ); 454 int off = QDate::currentDate().daysTo( dd );
350 455
351 text += "<b>" + QObject::tr( "Deadline:" ) + " </b><font color=\""; 456 text += "<b>" + QObject::tr( "Deadline:" ) + " </b><font color=\"";
352 if ( off < 0 ) 457 if ( off < 0 )
353 text += "#FF0000"; 458 text += "#FF0000";
@@ -363,79 +468,114 @@ QString OTodo::toRichText() const
363 text += "<b>" + QObject::tr( "Category:") + "</b> "; 468 text += "<b>" + QObject::tr( "Category:") + "</b> ";
364 text += categoryNames( "Todo List" ).join(", "); 469 text += categoryNames( "Todo List" ).join(", ");
365 text += "<br>"; 470 text += "<br>";
366 471
367 return text; 472 return text;
368} 473}
369bool OTodo::hasNotifiers()const { 474
475
476bool OTodo::hasNotifiers() const
477{
370 if (!data->notifiers) return false; 478 if (!data->notifiers) return false;
371 return !data->notifiers->isEmpty(); 479 return !data->notifiers->isEmpty();
372} 480}
373OPimNotifyManager& OTodo::notifiers() { 481
482
483OPimNotifyManager& OTodo::notifiers()
484{
374 if (!data->notifiers ) 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
490
491const OPimNotifyManager& OTodo::notifiers() const
492{
379 if (!data->notifiers ) 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
500bool OTodo::operator<( const OTodo &toDoEvent ) const
501{
386 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 502 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
387 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 503 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
388 if( hasDueDate() && toDoEvent.hasDueDate() ){ 504 if ( hasDueDate() && toDoEvent.hasDueDate() )
389 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 505 {
506 if ( dueDate() == toDoEvent.dueDate() )
507 { // let's the priority decide
390 return priority() < toDoEvent.priority(); 508 return priority() < toDoEvent.priority();
391 }else{ 509 }
510 else
511 {
392 return dueDate() < toDoEvent.dueDate(); 512 return dueDate() < toDoEvent.dueDate();
393 } 513 }
394 } 514 }
395 return false; 515 return false;
396} 516}
517
518
397bool OTodo::operator<=(const OTodo &toDoEvent )const 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 {
525 if ( dueDate() == toDoEvent.dueDate() )
526 { // let's the priority decide
403 return priority() <= toDoEvent.priority(); 527 return priority() <= toDoEvent.priority();
404 }else{ 528 }
529 else
530 {
405 return dueDate() <= toDoEvent.dueDate(); 531 return dueDate() <= toDoEvent.dueDate();
406 } 532 }
407 } 533 }
408 return true; 534 return true;
409} 535}
536
537
410bool OTodo::operator>(const OTodo &toDoEvent )const 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 {
544 if ( dueDate() == toDoEvent.dueDate() )
545 { // let's the priority decide
416 return priority() > toDoEvent.priority(); 546 return priority() > toDoEvent.priority();
417 }else{ 547 }
548 else
549 {
418 return dueDate() > toDoEvent.dueDate(); 550 return dueDate() > toDoEvent.dueDate();
419 } 551 }
420 } 552 }
421 return false; 553 return false;
422} 554}
555
556
423bool OTodo::operator>=(const OTodo &toDoEvent )const 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 {
563 if ( dueDate() == toDoEvent.dueDate() )
564 { // let's the priority decide
429 return priority() > toDoEvent.priority(); 565 return priority() > toDoEvent.priority();
430 }else{ 566 }
567 else
568 {
431 return dueDate() > toDoEvent.dueDate(); 569 return dueDate() > toDoEvent.dueDate();
432 } 570 }
433 } 571 }
434 return true; 572 return true;
435} 573}
574
575
436bool OTodo::operator==(const OTodo &toDoEvent )const 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;
@@ -444,21 +584,27 @@ bool OTodo::operator==(const OTodo &toDoEvent )const
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() { 590
591
592void OTodo::deref()
593{
451 594
452// qWarning("deref in ToDoEvent"); 595// qWarning("deref in ToDoEvent");
453 if ( data->deref() ) { 596 if ( data->deref() )
597 {
454// qWarning("deleting"); 598// qWarning("deleting");
455 delete data; 599 delete data;
456 data= 0; 600 data= 0;
457 } 601 }
458} 602}
603
604
459OTodo &OTodo::operator=(const OTodo &item ) 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 ");
@@ -466,13 +612,15 @@ OTodo &OTodo::operator=(const OTodo &item )
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 ) );
@@ -489,32 +637,38 @@ QMap<int, QString> OTodo::toMap() const {
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{
651 if ( data->count != 1 )
652 {
502 qWarning("changeOrModify"); 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;
@@ -533,18 +687,26 @@ void OTodo::copy( OTodoData* src, OTodoData* dest ) {
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
694
695QString OTodo::type() const
696{
540 return QString::fromLatin1("OTodo"); 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
@@ -23,36 +23,38 @@
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
54{
53public: 55public:
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,
@@ -303,13 +305,16 @@ public:
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
312
313inline bool OTodo::operator!=( const OTodo &toDoEvent ) const
314{
310 return !(*this == toDoEvent); 315 return !(*this == toDoEvent);
311} 316}
312 317
313} 318}
314 319
315#endif 320#endif