-rw-r--r-- | libopie2/opiepim/ChangeLog | 3 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend.cpp | 5 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend.h | 3 | ||||
-rw-r--r-- | libopie2/opiepim/backend/odatebookaccessbackend.cpp | 58 | ||||
-rw-r--r-- | libopie2/opiepim/core/odatebookaccess.h | 25 | ||||
-rw-r--r-- | libopie2/opiepim/private/opimeventsortvector.cpp | 134 | ||||
-rw-r--r-- | libopie2/opiepim/private/opimeventsortvector.h | 48 | ||||
-rw-r--r-- | libopie2/opiepim/private/opimsortvector.h | 34 | ||||
-rw-r--r-- | libopie2/opiepim/private/opimtodosortvector.cpp | 2 | ||||
-rw-r--r-- | libopie2/opiepim/private/private.pro | 2 |
10 files changed, 308 insertions, 6 deletions
diff --git a/libopie2/opiepim/ChangeLog b/libopie2/opiepim/ChangeLog index 320b189..e94fa59 100644 --- a/libopie2/opiepim/ChangeLog +++ b/libopie2/opiepim/ChangeLog | |||
@@ -1,26 +1,29 @@ | |||
1 | 2005-01-16 Stefan Eilers <stefan@eilers-online.net> | ||
2 | * Added new OPimEventSortVector class, improved OPimSortVector | ||
3 | * OPimAccessBackend now supports generic sorting. | ||
1 | 2005-01-03 Stefan Eilers <stefan@eilers-online.net> | 4 | 2005-01-03 Stefan Eilers <stefan@eilers-online.net> |
2 | * Fixing bug in API documentation | 5 | * Fixing bug in API documentation |
3 | * Moving hasQuerySettings() and querySettings() to OPimAccessTemplate to be available for all frontends | 6 | * Moving hasQuerySettings() and querySettings() to OPimAccessTemplate to be available for all frontends |
4 | 2004-12-28 Stefan Eilers <stefan@eilers-online.net> | 7 | 2004-12-28 Stefan Eilers <stefan@eilers-online.net> |
5 | * Make improved query by example accessable via frontend | 8 | * Make improved query by example accessable via frontend |
6 | * Some API documentation improvement | 9 | * Some API documentation improvement |
7 | * Cleanup of backend api.. | 10 | * Cleanup of backend api.. |
8 | * Fixing bug #1501 | 11 | * Fixing bug #1501 |
9 | 2004-11-23 Stefan Eilers <stefan@eilers-online.net> | 12 | 2004-11-23 Stefan Eilers <stefan@eilers-online.net> |
10 | * Implement fast and full featured version of sorted() for addressbook | 13 | * Implement fast and full featured version of sorted() for addressbook |
11 | * Implement generic queryByExample for all Addressboook backends. It allows incremental search. | 14 | * Implement generic queryByExample for all Addressboook backends. It allows incremental search. |
12 | * Update of API Documentation | 15 | * Update of API Documentation |
13 | 2004-11-18 Holger Freyther <freyther@handhelds.org> | 16 | 2004-11-18 Holger Freyther <freyther@handhelds.org> |
14 | * Every Access can give a set of Occurrences for a period or a datetime | 17 | * Every Access can give a set of Occurrences for a period or a datetime |
15 | * QueryByExample, Find, Sort can be generically accessed by OPimBase | 18 | * QueryByExample, Find, Sort can be generically accessed by OPimBase |
16 | pointer interface | 19 | pointer interface |
17 | * OPimBackendOccurrence gets split up to OPimOccurrences by | 20 | * OPimBackendOccurrence gets split up to OPimOccurrences by |
18 | OPimTemplateBase | 21 | OPimTemplateBase |
19 | * Add safeCast to various OPimRecords | 22 | * Add safeCast to various OPimRecords |
20 | * Kill memleak in OPimTodo | 23 | * Kill memleak in OPimTodo |
21 | * Add SortVector implementations for OPimTodo and OPimContact | 24 | * Add SortVector implementations for OPimTodo and OPimContact |
22 | 25 | ||
23 | 2004-??-??The Opie Team <opie@handhelds.org> | 26 | 2004-??-??The Opie Team <opie@handhelds.org> |
24 | * Implemented some important modifications to allow to use OPimRecords as it is, without | 27 | * Implemented some important modifications to allow to use OPimRecords as it is, without |
25 | have to cast them. This makes it possible to write applications which handling pim | 28 | have to cast them. This makes it possible to write applications which handling pim |
26 | data in a generic manner (see opimconvertion tool) (eilers) \ No newline at end of file | 29 | data in a generic manner (see opimconvertion tool) (eilers) \ No newline at end of file |
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend.cpp b/libopie2/opiepim/backend/ocontactaccessbackend.cpp index b4fdd46..c09427c 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend.cpp | |||
@@ -1,35 +1,36 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) 2004 Holger Freyther <freyther@handhelds.org> | 3 | Copyright (C) Holger Freyther <freyther@handhelds.org> |
4 | Copyright (C) Stefan Eilers <stefan@eilers-online.net> | ||
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 5 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 6 | .=l. |
6 | .>+-= | 7 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 8 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 9 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 10 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 11 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 12 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 13 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 14 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 15 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 16 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 17 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 18 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 19 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 20 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 21 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 22 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 23 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 24 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 25 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 26 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 27 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 28 | Boston, MA 02111-1307, USA. |
28 | */ | 29 | */ |
29 | 30 | ||
30 | #include "ocontactaccessbackend.h" | 31 | #include "ocontactaccessbackend.h" |
31 | #include <opie2/private/opimcontactsortvector.h> | 32 | #include <opie2/private/opimcontactsortvector.h> |
32 | #include <opie2/ocontactaccess.h> | 33 | #include <opie2/ocontactaccess.h> |
33 | 34 | ||
34 | #include <opie2/odebug.h> | 35 | #include <opie2/odebug.h> |
35 | 36 | ||
@@ -208,65 +209,65 @@ bool OPimContactAccessBackend::hasQuerySettings (uint querySettings) const | |||
208 | ) ) != querySettings ) | 209 | ) ) != querySettings ) |
209 | return false; | 210 | return false; |
210 | 211 | ||
211 | // Step 2: Check whether the given combinations are ok.. | 212 | // Step 2: Check whether the given combinations are ok.. |
212 | 213 | ||
213 | // IngoreCase alone is invalid | 214 | // IngoreCase alone is invalid |
214 | if ( querySettings == OPimContactAccess::IgnoreCase ) | 215 | if ( querySettings == OPimContactAccess::IgnoreCase ) |
215 | return false; | 216 | return false; |
216 | 217 | ||
217 | // WildCards, RegExp and ExactMatch should never used at the same time | 218 | // WildCards, RegExp and ExactMatch should never used at the same time |
218 | switch ( querySettings & ~( OPimContactAccess::IgnoreCase | 219 | switch ( querySettings & ~( OPimContactAccess::IgnoreCase |
219 | | OPimContactAccess::DateDiff | 220 | | OPimContactAccess::DateDiff |
220 | | OPimContactAccess::DateYear | 221 | | OPimContactAccess::DateYear |
221 | | OPimContactAccess::DateMonth | 222 | | OPimContactAccess::DateMonth |
222 | | OPimContactAccess::DateDay | 223 | | OPimContactAccess::DateDay |
223 | ) | 224 | ) |
224 | ){ | 225 | ){ |
225 | case OPimContactAccess::RegExp: | 226 | case OPimContactAccess::RegExp: |
226 | return ( true ); | 227 | return ( true ); |
227 | case OPimContactAccess::WildCards: | 228 | case OPimContactAccess::WildCards: |
228 | return ( true ); | 229 | return ( true ); |
229 | case OPimContactAccess::ExactMatch: | 230 | case OPimContactAccess::ExactMatch: |
230 | return ( true ); | 231 | return ( true ); |
231 | case 0: // one of the upper removed bits were set.. | 232 | case 0: // one of the upper removed bits were set.. |
232 | return ( true ); | 233 | return ( true ); |
233 | default: | 234 | default: |
234 | return ( false ); | 235 | return ( false ); |
235 | } | 236 | } |
236 | } | 237 | } |
237 | 238 | ||
238 | 239 | ||
239 | UIDArray OPimContactAccessBackend::sorted( const UIDArray& ar, bool asc, int sortOrder, | 240 | UIDArray OPimContactAccessBackend::sorted( const UIDArray& ar, bool asc, int sortOrder, |
240 | int filter, const QArray<int>& categories)const { | 241 | int filter, const QArray<int>& categories )const { |
241 | odebug << "Using Unaccelerated OPimContactAccessBackend sorted Implementation" << oendl; | 242 | odebug << "Using Unaccelerated OPimContactAccessBackend sorted Implementation" << oendl; |
242 | 243 | ||
243 | Internal::OPimContactSortVector vector(ar.count(), asc, sortOrder ); | 244 | Internal::OPimContactSortVector vector(ar.count(), asc, sortOrder ); |
244 | 245 | ||
245 | int item = 0; | 246 | int item = 0; |
246 | uint cat_count = categories.count(); | 247 | uint cat_count = categories.count(); |
247 | uint eve_count = ar.count(); | 248 | uint eve_count = ar.count(); |
248 | bool bCat = filter & OPimContactAccess::FilterCategory ? true : false; | 249 | bool bCat = filter & OPimContactAccess::FilterCategory ? true : false; |
249 | bool catPassed = false; | 250 | bool catPassed = false; |
250 | int cat; | 251 | int cat; |
251 | 252 | ||
252 | for ( uint i = 0; i < eve_count; ++i ) { | 253 | for ( uint i = 0; i < eve_count; ++i ) { |
253 | OPimContact contact = find( ar[i], ar, i, Frontend::Forward ); | 254 | OPimContact contact = find( ar[i], ar, i, Frontend::Forward ); |
254 | if ( contact.isEmpty() ) | 255 | if ( contact.isEmpty() ) |
255 | continue; | 256 | continue; |
256 | 257 | ||
257 | /* show category */ | 258 | /* show category */ |
258 | /* -1 == unfiled */ | 259 | /* -1 == unfiled */ |
259 | catPassed = false; | 260 | catPassed = false; |
260 | for ( uint cat_nu = 0; cat_nu < cat_count; ++cat_nu ) { | 261 | for ( uint cat_nu = 0; cat_nu < cat_count; ++cat_nu ) { |
261 | cat = categories[cat_nu]; | 262 | cat = categories[cat_nu]; |
262 | if ( bCat && cat == -1 ) { | 263 | if ( bCat && cat == -1 ) { |
263 | if(!contact.categories().isEmpty() ) | 264 | if(!contact.categories().isEmpty() ) |
264 | continue; | 265 | continue; |
265 | } else if ( bCat && cat != 0) | 266 | } else if ( bCat && cat != 0) |
266 | if (!contact.categories().contains( cat ) ) | 267 | if (!contact.categories().contains( cat ) ) |
267 | continue; | 268 | continue; |
268 | catPassed = true; | 269 | catPassed = true; |
269 | break; | 270 | break; |
270 | } | 271 | } |
271 | 272 | ||
272 | /* | 273 | /* |
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend.h b/libopie2/opiepim/backend/ocontactaccessbackend.h index 27d70ab..d5c463b 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend.h +++ b/libopie2/opiepim/backend/ocontactaccessbackend.h | |||
@@ -1,35 +1,36 @@ | |||
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) Holger Freyther <freyther@handhelds.org> |
4 | Copyright (C) Stefan Eilers <stefan@eilers-online.net> | ||
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 5 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 6 | .=l. |
6 | .>+-= | 7 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 8 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 9 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 10 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 11 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 12 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 13 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 14 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 15 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 16 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 17 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 18 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 19 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 20 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 21 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 22 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 23 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 24 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 25 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 26 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 27 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 28 | Boston, MA 02111-1307, USA. |
28 | */ | 29 | */ |
29 | /** | 30 | /** |
30 | * The class responsible for managing a backend. | 31 | * The class responsible for managing a backend. |
31 | * The implementation of this abstract class contains | 32 | * The implementation of this abstract class contains |
32 | * the complete database handling. | 33 | * the complete database handling. |
33 | * | 34 | * |
34 | * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) | 35 | * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) |
35 | * Copyright (c) 2002 by Holger Freyther (zecke@handhelds.org) | 36 | * Copyright (c) 2002 by Holger Freyther (zecke@handhelds.org) |
diff --git a/libopie2/opiepim/backend/odatebookaccessbackend.cpp b/libopie2/opiepim/backend/odatebookaccessbackend.cpp index e44912a..6da0170 100644 --- a/libopie2/opiepim/backend/odatebookaccessbackend.cpp +++ b/libopie2/opiepim/backend/odatebookaccessbackend.cpp | |||
@@ -1,65 +1,67 @@ | |||
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 |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | #include <qtl.h> | 29 | #include <qtl.h> |
30 | 30 | ||
31 | #include <opie2/odebug.h> | ||
31 | #include <opie2/opimrecurrence.h> | 32 | #include <opie2/opimrecurrence.h> |
32 | 33 | #include <opie2/odatebookaccess.h> | |
33 | #include <opie2/odatebookaccessbackend.h> | 34 | #include <opie2/odatebookaccessbackend.h> |
35 | #include <opie2/private/opimeventsortvector.h> | ||
34 | 36 | ||
35 | using namespace Opie; | 37 | using namespace Opie; |
36 | 38 | ||
37 | namespace { | 39 | namespace { |
38 | /* a small helper to get all NonRepeating events for a range of time */ | 40 | /* a small helper to get all NonRepeating events for a range of time */ |
39 | void events( OPimBackendOccurrence::List& tmpList, | 41 | void events( OPimBackendOccurrence::List& tmpList, |
40 | const OPimEvent::ValueList& events, | 42 | const OPimEvent::ValueList& events, |
41 | const QDate& from, const QDate& to ) { | 43 | const QDate& from, const QDate& to ) { |
42 | QDateTime dtStart, dtEnd; | 44 | QDateTime dtStart, dtEnd; |
43 | 45 | ||
44 | for ( OPimEvent::ValueList::ConstIterator it = events.begin(); it != events.end(); ++it ) { | 46 | for ( OPimEvent::ValueList::ConstIterator it = events.begin(); it != events.end(); ++it ) { |
45 | dtStart = (*it).startDateTime(); | 47 | dtStart = (*it).startDateTime(); |
46 | dtEnd = (*it).endDateTime(); | 48 | dtEnd = (*it).endDateTime(); |
47 | 49 | ||
48 | /* | 50 | /* |
49 | * If in range | 51 | * If in range |
50 | */ | 52 | */ |
51 | if (dtStart.date() >= from && dtEnd.date() <= to ) { | 53 | if (dtStart.date() >= from && dtEnd.date() <= to ) { |
52 | OPimBackendOccurrence eff( dtStart, dtEnd, (*it).uid() );; | 54 | OPimBackendOccurrence eff( dtStart, dtEnd, (*it).uid() );; |
53 | tmpList.append( eff ); | 55 | tmpList.append( eff ); |
54 | } | 56 | } |
55 | } | 57 | } |
56 | } | 58 | } |
57 | 59 | ||
58 | void repeat( OPimBackendOccurrence::List& tmpList, const OPimEvent::ValueList& list, | 60 | void repeat( OPimBackendOccurrence::List& tmpList, const OPimEvent::ValueList& list, |
59 | const QDate& from, const QDate& to ) { | 61 | const QDate& from, const QDate& to ) { |
60 | QDate repeat; | 62 | QDate repeat; |
61 | for ( OPimEvent::ValueList::ConstIterator it = list.begin(); it != list.end(); ++it ) { | 63 | for ( OPimEvent::ValueList::ConstIterator it = list.begin(); it != list.end(); ++it ) { |
62 | int dur = (*it).startDateTime().date().daysTo( (*it).endDateTime().date() ); | 64 | int dur = (*it).startDateTime().date().daysTo( (*it).endDateTime().date() ); |
63 | QDate itDate = from.addDays(-dur ); | 65 | QDate itDate = from.addDays(-dur ); |
64 | OPimRecurrence rec = (*it).recurrence(); | 66 | OPimRecurrence rec = (*it).recurrence(); |
65 | if ( !rec.hasEndDate() || rec.endDate() > to ) { | 67 | if ( !rec.hasEndDate() || rec.endDate() > to ) { |
@@ -115,66 +117,116 @@ OPimBackendOccurrence::List ODateBookAccessBackend::effectiveNonRepeatingEvents( | |||
115 | OPimEvent::ValueList list = directNonRepeats(); | 117 | OPimEvent::ValueList list = directNonRepeats(); |
116 | 118 | ||
117 | events( tmpList, list, from, to ); | 119 | events( tmpList, list, from, to ); |
118 | 120 | ||
119 | return tmpList; | 121 | return tmpList; |
120 | } | 122 | } |
121 | 123 | ||
122 | OPimBackendOccurrence::List ODateBookAccessBackend::effectiveNonRepeatingEvents( const QDateTime& dt )const | 124 | OPimBackendOccurrence::List ODateBookAccessBackend::effectiveNonRepeatingEvents( const QDateTime& dt )const |
123 | { | 125 | { |
124 | OPimBackendOccurrence::List day = effectiveNonRepeatingEvents( dt.date(), dt.date() ); | 126 | OPimBackendOccurrence::List day = effectiveNonRepeatingEvents( dt.date(), dt.date() ); |
125 | return filterOccurrences( day,dt ); | 127 | return filterOccurrences( day,dt ); |
126 | } | 128 | } |
127 | 129 | ||
128 | const uint ODateBookAccessBackend::querySettings() const | 130 | const uint ODateBookAccessBackend::querySettings() const |
129 | { | 131 | { |
130 | return 0; | 132 | return 0; |
131 | } | 133 | } |
132 | 134 | ||
133 | bool ODateBookAccessBackend::hasQuerySettings (uint querySettings) const | 135 | bool ODateBookAccessBackend::hasQuerySettings (uint querySettings) const |
134 | { | 136 | { |
135 | return false; | 137 | return false; |
136 | } | 138 | } |
137 | 139 | ||
138 | 140 | ||
139 | 141 | ||
140 | UIDArray ODateBookAccessBackend::queryByExample( const UIDArray& uidlist, const OPimEvent&, int settings, | 142 | UIDArray ODateBookAccessBackend::queryByExample( const UIDArray& uidlist, const OPimEvent&, int settings, |
141 | const QDateTime& d )const | 143 | const QDateTime& d )const |
142 | { | 144 | { |
143 | qDebug( "Accessing ODateBookAccessBackend::queryByExample() which is not implemented!" ); | 145 | qDebug( "Accessing ODateBookAccessBackend::queryByExample() which is not implemented!" ); |
144 | return UIDArray(); | 146 | return UIDArray(); |
145 | } | 147 | } |
146 | 148 | ||
147 | UIDArray ODateBookAccessBackend::sorted( const UIDArray&, bool asc, int, int, const QArray<int>& )const { | 149 | UIDArray ODateBookAccessBackend::sorted( const UIDArray& ar, bool asc, int sortOrder, int filter, const QArray<int>& categories )const { |
148 | return UIDArray(); | 150 | odebug << "Using Unaccelerated ODateBookAccessBackend sorted Implementation" << oendl; |
151 | |||
152 | Internal::OPimEventSortVector vector( ar.count(), asc, sortOrder ); | ||
153 | int item = 0; | ||
154 | |||
155 | for ( uint i = 0; i < ar.count(); ++i ){ | ||
156 | OPimEvent event = find( ar[i], ar, i, Frontend::Forward ); | ||
157 | if ( event.isEmpty() ) | ||
158 | continue; | ||
159 | |||
160 | bool catPassed = true; | ||
161 | if ( filter & ODateBookAccess::FilterCategory ){ | ||
162 | catPassed = false; | ||
163 | // Filter Categories | ||
164 | for ( uint cat_idx = 0; cat_idx < categories.count(); ++cat_idx ){ | ||
165 | int cat = categories[cat_idx]; | ||
166 | if ( cat == -1 || cat == 0 ){ | ||
167 | // Unfiled. Check next category if list is not empty. | ||
168 | // Else: take it as we will not filter unfiled events.. | ||
169 | if ( !event.categories().isEmpty() ) | ||
170 | continue; | ||
171 | else | ||
172 | catPassed = true; | ||
173 | } else { | ||
174 | if ( !event.categories().contains( cat ) ) | ||
175 | continue; | ||
176 | else{ | ||
177 | catPassed = true; | ||
178 | break; | ||
179 | } | ||
180 | } | ||
181 | } | ||
182 | } | ||
183 | |||
184 | // Continue to next event if the category filter removed this item | ||
185 | if ( !catPassed ) | ||
186 | continue; | ||
187 | |||
188 | vector.insert( item++, event ); | ||
189 | } | ||
190 | |||
191 | // Now sort the vector and return the list of UID's | ||
192 | vector.resize( item ); | ||
193 | vector.sort(); | ||
194 | |||
195 | UIDArray array( vector.count() ); | ||
196 | for ( uint i= 0; i < vector.count(); i++ ) | ||
197 | array[i] = vector.uidAt( i ); | ||
198 | |||
199 | return array; | ||
200 | |||
149 | } | 201 | } |
150 | 202 | ||
151 | OPimBackendOccurrence::List ODateBookAccessBackend::filterOccurrences( const OPimBackendOccurrence::List dayList, | 203 | OPimBackendOccurrence::List ODateBookAccessBackend::filterOccurrences( const OPimBackendOccurrence::List dayList, |
152 | const QDateTime& dt ) { | 204 | const QDateTime& dt ) { |
153 | OPimBackendOccurrence::List tmpList; | 205 | OPimBackendOccurrence::List tmpList; |
154 | OPimBackendOccurrence::List::ConstIterator it; | 206 | OPimBackendOccurrence::List::ConstIterator it; |
155 | 207 | ||
156 | for ( it = dayList.begin(); it != dayList.end(); ++it ) { | 208 | for ( it = dayList.begin(); it != dayList.end(); ++it ) { |
157 | OPimBackendOccurrence occ = *it; | 209 | OPimBackendOccurrence occ = *it; |
158 | 210 | ||
159 | /* | 211 | /* |
160 | * Let us find occurrences that are 'now'! | 212 | * Let us find occurrences that are 'now'! |
161 | * If the dt.date() is on the same day as start or end of the Occurrence | 213 | * If the dt.date() is on the same day as start or end of the Occurrence |
162 | * check how near start/end are. | 214 | * check how near start/end are. |
163 | * If it is in the middle of a multiday occurrence list it. | 215 | * If it is in the middle of a multiday occurrence list it. |
164 | * | 216 | * |
165 | * We might want to 'lose' the sixty second offset and list | 217 | * We might want to 'lose' the sixty second offset and list |
166 | * all Events which are active at that time. | 218 | * all Events which are active at that time. |
167 | */ | 219 | */ |
168 | if ( dt.date() == occ.startDateTime().date() ) { | 220 | if ( dt.date() == occ.startDateTime().date() ) { |
169 | if ( QABS( dt.time().secsTo( occ.startDateTime().time() ) ) < 60 ) | 221 | if ( QABS( dt.time().secsTo( occ.startDateTime().time() ) ) < 60 ) |
170 | tmpList.append( occ ); | 222 | tmpList.append( occ ); |
171 | }else if ( dt.date() == occ.endDateTime().date() ) { | 223 | }else if ( dt.date() == occ.endDateTime().date() ) { |
172 | if ( QABS( dt.time().secsTo( occ.endDateTime().time() ) ) < 60 ) | 224 | if ( QABS( dt.time().secsTo( occ.endDateTime().time() ) ) < 60 ) |
173 | tmpList.append( occ ); | 225 | tmpList.append( occ ); |
174 | }else if ( dt.date() >= occ.startDateTime().date() && | 226 | }else if ( dt.date() >= occ.startDateTime().date() && |
175 | dt.date() >= occ.endDateTime().date() ) | 227 | dt.date() >= occ.endDateTime().date() ) |
176 | tmpList.append( occ ); | 228 | tmpList.append( occ ); |
177 | } | 229 | } |
178 | 230 | ||
179 | return tmpList; | 231 | return tmpList; |
180 | } | 232 | } |
diff --git a/libopie2/opiepim/core/odatebookaccess.h b/libopie2/opiepim/core/odatebookaccess.h index 0be8606..d2e3925 100644 --- a/libopie2/opiepim/core/odatebookaccess.h +++ b/libopie2/opiepim/core/odatebookaccess.h | |||
@@ -17,60 +17,85 @@ | |||
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | #ifndef OPIE_DATE_BOOK_ACCESS_H | 29 | #ifndef OPIE_DATE_BOOK_ACCESS_H |
30 | #define OPIE_DATE_BOOK_ACCESS_H | 30 | #define OPIE_DATE_BOOK_ACCESS_H |
31 | 31 | ||
32 | #include "odatebookaccessbackend.h" | 32 | #include "odatebookaccessbackend.h" |
33 | #include "opimaccesstemplate.h" | 33 | #include "opimaccesstemplate.h" |
34 | 34 | ||
35 | #include <opie2/opimevent.h> | 35 | #include <opie2/opimevent.h> |
36 | 36 | ||
37 | namespace Opie { | 37 | namespace Opie { |
38 | /** | 38 | /** |
39 | * This is the object orientated datebook database. It'll use OBackendFactory | 39 | * This is the object orientated datebook database. It'll use OBackendFactory |
40 | * to query for a backend. | 40 | * to query for a backend. |
41 | * All access to the datebook should be done via this class. | 41 | * All access to the datebook should be done via this class. |
42 | * Make sure to load and save the datebook this is not part of | 42 | * Make sure to load and save the datebook this is not part of |
43 | * destructing and creating the object | 43 | * destructing and creating the object |
44 | * | 44 | * |
45 | * @author Holger Freyther, Stefan Eilers | 45 | * @author Holger Freyther, Stefan Eilers |
46 | */ | 46 | */ |
47 | class ODateBookAccess : public OPimAccessTemplate<OPimEvent> { | 47 | class ODateBookAccess : public OPimAccessTemplate<OPimEvent> { |
48 | public: | 48 | public: |
49 | /** | ||
50 | * Filter for sorted() | ||
51 | * @see SortFilterBase in OPimBase | ||
52 | */ | ||
53 | enum SortFilter { | ||
54 | |||
55 | }; | ||
56 | |||
57 | /** | ||
58 | * Sort order for sorted() | ||
59 | * @see SortOrderBase in OPimBase | ||
60 | */ | ||
61 | enum SortOrder { | ||
62 | SortDescription = SortCustom, | ||
63 | SortLocation, | ||
64 | SortNote, | ||
65 | SortStartTime, | ||
66 | SortEndTime, | ||
67 | SortStartDate, | ||
68 | SortEndDate, | ||
69 | SortStartDateTime, | ||
70 | SortEndDateTime, | ||
71 | SortAlarmDateTime, | ||
72 | }; | ||
73 | |||
49 | ODateBookAccess( ODateBookAccessBackend* = 0l, enum Access acc = Random ); | 74 | ODateBookAccess( ODateBookAccessBackend* = 0l, enum Access acc = Random ); |
50 | ~ODateBookAccess(); | 75 | ~ODateBookAccess(); |
51 | 76 | ||
52 | /* return repeating events */ | 77 | /* return repeating events */ |
53 | List rawRepeats()const; | 78 | List rawRepeats()const; |
54 | 79 | ||
55 | /* return non repeating events */ | 80 | /* return non repeating events */ |
56 | List nonRepeats()const; | 81 | List nonRepeats()const; |
57 | 82 | ||
58 | /* return non repeating events (from,to) */ | 83 | /* return non repeating events (from,to) */ |
59 | OPimOccurrence::List effectiveNonRepeatingEvents( const QDate& from, const QDate& to ) const; | 84 | OPimOccurrence::List effectiveNonRepeatingEvents( const QDate& from, const QDate& to ) const; |
60 | OPimOccurrence::List effectiveNonRepeatingEvents( const QDateTime& start ) const; | 85 | OPimOccurrence::List effectiveNonRepeatingEvents( const QDateTime& start ) const; |
61 | 86 | ||
62 | /** | 87 | /** |
63 | * Return identification of used records | 88 | * Return identification of used records |
64 | */ | 89 | */ |
65 | int rtti() const; | 90 | int rtti() const; |
66 | 91 | ||
67 | 92 | ||
68 | private: | 93 | private: |
69 | ODateBookAccessBackend* m_backEnd; | 94 | ODateBookAccessBackend* m_backEnd; |
70 | class Private; | 95 | class Private; |
71 | Private* d; | 96 | Private* d; |
72 | }; | 97 | }; |
73 | 98 | ||
74 | } | 99 | } |
75 | 100 | ||
76 | #endif | 101 | #endif |
diff --git a/libopie2/opiepim/private/opimeventsortvector.cpp b/libopie2/opiepim/private/opimeventsortvector.cpp new file mode 100644 index 0000000..4220c63 --- a/dev/null +++ b/libopie2/opiepim/private/opimeventsortvector.cpp | |||
@@ -0,0 +1,134 @@ | |||
1 | /* | ||
2 | This file is part of the Opie Project | ||
3 | Copyright (C) 2004 Stefan Eilers <stefan@eilers-online.net> | ||
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | ||
5 | .=l. | ||
6 | .>+-= | ||
7 | _;:, .> :=|. This program is free software; you can | ||
8 | .> <`_, > . <= redistribute it and/or modify it under | ||
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | ||
10 | .="- .-=="i, .._ License as published by the Free Software | ||
11 | - . .-<_> .<> Foundation; either version 2 of the License, | ||
12 | ._= =} : or (at your option) any later version. | ||
13 | .%`+i> _;_. | ||
14 | .i_,=:_. -<s. This program is distributed in the hope that | ||
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | ||
16 | : .. .:, . . . without even the implied warranty of | ||
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | ||
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | ||
19 | ..}^=.= = ; Library General Public License for more | ||
20 | ++= -. .` .: details. | ||
21 | : = ...= . :.=- | ||
22 | -. .:....=;==+<; You should have received a copy of the GNU | ||
23 | -_. . . )=. = Library General Public License along with | ||
24 | -- :-=` this library; see the file COPYING.LIB. | ||
25 | If not, write to the Free Software Foundation, | ||
26 | Inc., 59 Temple Place - Suite 330, | ||
27 | Boston, MA 02111-1307, USA. | ||
28 | */ | ||
29 | |||
30 | #include "opimeventsortvector.h" | ||
31 | #include <opie2/ocontactaccess.h> | ||
32 | #include <opie2/opimnotifymanager.h> | ||
33 | #include <opie2/odatebookaccess.h> | ||
34 | |||
35 | #include <qvaluelist.h> | ||
36 | |||
37 | namespace Opie { | ||
38 | namespace Internal { | ||
39 | |||
40 | namespace{ | ||
41 | |||
42 | inline int testAlarmNotifiers( const OPimNotifyManager& leftnotifiers, const OPimNotifyManager& rightnotifiers ){ | ||
43 | OPimNotifyManager::Alarms left_alarms = leftnotifiers.alarms(); | ||
44 | OPimNotifyManager::Alarms right_alarms = rightnotifiers.alarms(); | ||
45 | |||
46 | // Well.. How could we compare two lists of alarms? I think we should find the most early datetimes | ||
47 | // and compare them.. (se) | ||
48 | // Find the first alarm of the left list | ||
49 | OPimNotifyManager::Alarms::Iterator it; | ||
50 | QDateTime left_earliest; // This datetime is initialized as invalid!! | ||
51 | for ( it = left_alarms.begin(); it != left_alarms.end(); ++it ){ | ||
52 | if ( !left_earliest.isValid() || left_earliest > (*it).dateTime() ){ | ||
53 | left_earliest = (*it).dateTime(); | ||
54 | } | ||
55 | } | ||
56 | QDateTime right_earliest; // This datetime is initialized as invalid!! | ||
57 | for ( it = right_alarms.begin(); it != right_alarms.end(); ++it ){ | ||
58 | if ( !right_earliest.isValid() || right_earliest > (*it).dateTime() ){ | ||
59 | right_earliest = (*it).dateTime(); | ||
60 | } | ||
61 | } | ||
62 | |||
63 | int ret; | ||
64 | |||
65 | // Now compare this found alarms | ||
66 | if ( !left_earliest .isValid() ) ret++; | ||
67 | if ( !right_earliest.isValid() ) ret--; | ||
68 | |||
69 | if ( left_earliest.isValid() && right_earliest.isValid() ){ | ||
70 | ret += left_earliest < right_earliest ? -1 : 1; | ||
71 | } | ||
72 | |||
73 | return ret; | ||
74 | |||
75 | } | ||
76 | } | ||
77 | |||
78 | OPimEventSortVector::OPimEventSortVector( uint size, bool asc, int sort ) | ||
79 | : OPimSortVector<OPimEvent>( size, asc, sort ) {} | ||
80 | |||
81 | int OPimEventSortVector::compareItems( const OPimEvent& left, | ||
82 | const OPimEvent& right ) { | ||
83 | if ( left.uid() == right.uid() ) | ||
84 | return 0; | ||
85 | |||
86 | int ret = 0; | ||
87 | bool asc = sortAscending(); | ||
88 | |||
89 | switch( sortOrder() ) { | ||
90 | case ODateBookAccess::SortDescription: | ||
91 | ret = testString( left.description(), right.description() ); | ||
92 | break; | ||
93 | case ODateBookAccess::SortLocation: | ||
94 | ret = testString( left.location(), right.location() ); | ||
95 | break; | ||
96 | case ODateBookAccess::SortNote: | ||
97 | ret = testString( left.note(),right.note() ); | ||
98 | break; | ||
99 | case ODateBookAccess::SortStartTime: | ||
100 | ret = testTime( left.startDateTime().time(), right.startDateTime().time() ); | ||
101 | break; | ||
102 | case ODateBookAccess::SortEndTime: | ||
103 | ret = testTime( left.endDateTime().time(), right.endDateTime().time() ); | ||
104 | break; | ||
105 | case ODateBookAccess::SortStartDate: | ||
106 | ret = testDate( left.startDateTime().date(), right.startDateTime().date() ); | ||
107 | break; | ||
108 | case ODateBookAccess::SortEndDate: | ||
109 | ret = testDate( left.endDateTime().date(), right.endDateTime().date() ); | ||
110 | break; | ||
111 | case ODateBookAccess::SortStartDateTime: | ||
112 | ret = testDateTime( left.startDateTime(), right.startDateTime() ); | ||
113 | break; | ||
114 | case ODateBookAccess::SortEndDateTime: | ||
115 | ret = testDateTime( left.endDateTime(), right.endDateTime() ); | ||
116 | break; | ||
117 | case ODateBookAccess::SortAlarmDateTime: | ||
118 | ret = testAlarmNotifiers( left.notifiers(), right.notifiers() ); | ||
119 | break; | ||
120 | default: | ||
121 | odebug << "OpimEventSortVector: Unknown sortOrder: " << sortOrder() << oendl; | ||
122 | } | ||
123 | |||
124 | /* twist to honor ascending/descending setting as QVector only sorts ascending */ | ||
125 | if ( !asc ) | ||
126 | ret *= -1; | ||
127 | |||
128 | // Maybe differentiate as in OPimTodoSortVector ### FIXME | ||
129 | // if( ret ) | ||
130 | return ret; | ||
131 | } | ||
132 | |||
133 | } | ||
134 | } | ||
diff --git a/libopie2/opiepim/private/opimeventsortvector.h b/libopie2/opiepim/private/opimeventsortvector.h new file mode 100644 index 0000000..dde26df --- a/dev/null +++ b/libopie2/opiepim/private/opimeventsortvector.h | |||
@@ -0,0 +1,48 @@ | |||
1 | /* | ||
2 | This file is part of the Opie Project | ||
3 | Copyright (C) 2004 Stefan Eilers <stefan@eilers-online.net> | ||
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | ||
5 | .=l. | ||
6 | .>+-= | ||
7 | _;:, .> :=|. This program is free software; you can | ||
8 | .> <`_, > . <= redistribute it and/or modify it under | ||
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | ||
10 | .="- .-=="i, .._ License as published by the Free Software | ||
11 | - . .-<_> .<> Foundation; either version 2 of the License, | ||
12 | ._= =} : or (at your option) any later version. | ||
13 | .%`+i> _;_. | ||
14 | .i_,=:_. -<s. This program is distributed in the hope that | ||
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | ||
16 | : .. .:, . . . without even the implied warranty of | ||
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | ||
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | ||
19 | ..}^=.= = ; Library General Public License for more | ||
20 | ++= -. .` .: details. | ||
21 | : = ...= . :.=- | ||
22 | -. .:....=;==+<; You should have received a copy of the GNU | ||
23 | -_. . . )=. = Library General Public License along with | ||
24 | -- :-=` this library; see the file COPYING.LIB. | ||
25 | If not, write to the Free Software Foundation, | ||
26 | Inc., 59 Temple Place - Suite 330, | ||
27 | Boston, MA 02111-1307, USA. | ||
28 | */ | ||
29 | |||
30 | #ifndef OPIM_CONTACT_SORT_VECTOR_H | ||
31 | #define OPIM_CONTACT_SORT_VECTOR_H | ||
32 | |||
33 | #include <opie2/opimevent.h> | ||
34 | #include <opie2/private/opimsortvector.h> | ||
35 | |||
36 | namespace Opie { | ||
37 | namespace Internal { | ||
38 | class OPimEventSortVector : public OPimSortVector<OPimEvent> { | ||
39 | public: | ||
40 | OPimEventSortVector( uint size, bool asc, int sort ); | ||
41 | private: | ||
42 | int compareItems( const OPimEvent&, const OPimEvent& ); | ||
43 | }; | ||
44 | } | ||
45 | } | ||
46 | |||
47 | |||
48 | #endif | ||
diff --git a/libopie2/opiepim/private/opimsortvector.h b/libopie2/opiepim/private/opimsortvector.h index 6c21339..11a40ac 100644 --- a/libopie2/opiepim/private/opimsortvector.h +++ b/libopie2/opiepim/private/opimsortvector.h | |||
@@ -24,64 +24,67 @@ | |||
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_PIM_SORT_VECTOR_H | 30 | #ifndef OPIE_PIM_SORT_VECTOR_H |
31 | #define OPIE_PIM_SORT_VECTOR_H | 31 | #define OPIE_PIM_SORT_VECTOR_H |
32 | 32 | ||
33 | #include <opie2/opimglobal.h> | 33 | #include <opie2/opimglobal.h> |
34 | 34 | ||
35 | #include <qvector.h> | 35 | #include <qvector.h> |
36 | 36 | ||
37 | namespace Opie { | 37 | namespace Opie { |
38 | namespace Internal { | 38 | namespace Internal { |
39 | template<class T> | 39 | template<class T> |
40 | struct OPimSortVectorContainer { | 40 | struct OPimSortVectorContainer { |
41 | T item; | 41 | T item; |
42 | }; | 42 | }; |
43 | 43 | ||
44 | template<class T> | 44 | template<class T> |
45 | class OPimSortVector : public QVector<OPimSortVectorContainer<T> > { | 45 | class OPimSortVector : public QVector<OPimSortVectorContainer<T> > { |
46 | typedef OPimSortVectorContainer<T> VectorItem; | 46 | typedef OPimSortVectorContainer<T> VectorItem; |
47 | public: | 47 | public: |
48 | OPimSortVector( uint size, bool asc, int sort ); | 48 | OPimSortVector( uint size, bool asc, int sort ); |
49 | int compareItems( QCollection::Item d1, QCollection::Item d2 ); | 49 | int compareItems( QCollection::Item d1, QCollection::Item d2 ); |
50 | bool insert( uint, const T& t ); | 50 | bool insert( uint, const T& t ); |
51 | UID uidAt( uint i )const; | 51 | UID uidAt( uint i )const; |
52 | 52 | ||
53 | protected: | 53 | protected: |
54 | int testString( const QString&, const QString& )const; | 54 | int testString( const QString&, const QString& )const; |
55 | int testDate( const QDate&, const QDate& )const; | 55 | int testDate( const QDate&, const QDate& )const; |
56 | int testTime( const QTime&, const QTime& )const; | ||
57 | int testDateTime( const QDateTime& left, | ||
58 | const QDateTime& right )const; | ||
56 | protected: | 59 | protected: |
57 | bool sortAscending()const; | 60 | bool sortAscending()const; |
58 | int sortOrder()const; | 61 | int sortOrder()const; |
59 | 62 | ||
60 | private: | 63 | private: |
61 | bool m_ascending : 1; | 64 | bool m_ascending : 1; |
62 | int m_sort; | 65 | int m_sort; |
63 | virtual int compareItems( const T& item1, const T& item2 ) = 0; | 66 | virtual int compareItems( const T& item1, const T& item2 ) = 0; |
64 | }; | 67 | }; |
65 | 68 | ||
66 | template<class T> | 69 | template<class T> |
67 | OPimSortVector<T>::OPimSortVector( uint size, bool asc, int sort ) | 70 | OPimSortVector<T>::OPimSortVector( uint size, bool asc, int sort ) |
68 | : QVector<VectorItem>( size ), m_ascending( asc ), | 71 | : QVector<VectorItem>( size ), m_ascending( asc ), |
69 | m_sort( sort ) { | 72 | m_sort( sort ) { |
70 | this->setAutoDelete( true ); | 73 | this->setAutoDelete( true ); |
71 | } | 74 | } |
72 | 75 | ||
73 | /** | 76 | /** |
74 | * Returns: | 77 | * Returns: |
75 | * 0 if item1 == item2 | 78 | * 0 if item1 == item2 |
76 | * | 79 | * |
77 | * non-zero if item1 != item2 | 80 | * non-zero if item1 != item2 |
78 | * | 81 | * |
79 | * This function returns int rather than bool so that reimplementations | 82 | * This function returns int rather than bool so that reimplementations |
80 | * can return one of three values and use it to sort by: | 83 | * can return one of three values and use it to sort by: |
81 | * | 84 | * |
82 | * 0 if item1 == item2 | 85 | * 0 if item1 == item2 |
83 | * | 86 | * |
84 | * > 0 (positive integer) if item1 > item2 | 87 | * > 0 (positive integer) if item1 > item2 |
85 | * | 88 | * |
86 | * < 0 (negative integer) if item1 < item2 | 89 | * < 0 (negative integer) if item1 < item2 |
87 | * | 90 | * |
@@ -91,48 +94,79 @@ int OPimSortVector<T>::compareItems( QCollection::Item d1, QCollection::Item d2 | |||
91 | return compareItems( ((VectorItem*)d1)->item, | 94 | return compareItems( ((VectorItem*)d1)->item, |
92 | ((VectorItem*)d2)->item ); | 95 | ((VectorItem*)d2)->item ); |
93 | } | 96 | } |
94 | 97 | ||
95 | template<class T> | 98 | template<class T> |
96 | bool OPimSortVector<T>::sortAscending()const { | 99 | bool OPimSortVector<T>::sortAscending()const { |
97 | return m_ascending; | 100 | return m_ascending; |
98 | } | 101 | } |
99 | 102 | ||
100 | template<class T> | 103 | template<class T> |
101 | int OPimSortVector<T>::sortOrder()const { | 104 | int OPimSortVector<T>::sortOrder()const { |
102 | return m_sort; | 105 | return m_sort; |
103 | } | 106 | } |
104 | 107 | ||
105 | template<class T> | 108 | template<class T> |
106 | bool OPimSortVector<T>::insert( uint i, const T& record ) { | 109 | bool OPimSortVector<T>::insert( uint i, const T& record ) { |
107 | VectorItem *item = new VectorItem; | 110 | VectorItem *item = new VectorItem; |
108 | item->item = record; | 111 | item->item = record; |
109 | return QVector<VectorItem>::insert( i, item ); | 112 | return QVector<VectorItem>::insert( i, item ); |
110 | } | 113 | } |
111 | 114 | ||
112 | template<class T> | 115 | template<class T> |
113 | UID OPimSortVector<T>::uidAt( uint index )const { | 116 | UID OPimSortVector<T>::uidAt( uint index )const { |
114 | return this->at( index )->item.uid(); | 117 | return this->at( index )->item.uid(); |
115 | } | 118 | } |
116 | 119 | ||
117 | template<class T> | 120 | template<class T> |
118 | inline int OPimSortVector<T>::testString( const QString& left, | 121 | inline int OPimSortVector<T>::testString( const QString& left, |
119 | const QString& right )const { | 122 | const QString& right )const { |
120 | return QString::compare( left, right ); | 123 | return QString::compare( left, right ); |
121 | } | 124 | } |
122 | 125 | ||
126 | |||
123 | template<class T> | 127 | template<class T> |
124 | inline int OPimSortVector<T>::testDate( const QDate& left, | 128 | inline int OPimSortVector<T>::testDate( const QDate& left, |
125 | const QDate& right )const { | 129 | const QDate& right )const { |
126 | int ret = 0; | 130 | int ret = 0; |
127 | if ( !left .isValid() ) ret++; | 131 | if ( !left .isValid() ) ret++; |
128 | if ( !right.isValid() ) ret--; | 132 | if ( !right.isValid() ) ret--; |
129 | 133 | ||
130 | if ( left.isValid() && right.isValid() ) | 134 | if ( left.isValid() && right.isValid() ) |
131 | ret += left < right ? -1 : 1; | 135 | ret += left < right ? -1 : 1; |
132 | 136 | ||
133 | return ret; | 137 | return ret; |
134 | } | 138 | } |
139 | |||
140 | template<class T> | ||
141 | inline int OPimSortVector<T>::testTime( const QTime& left, | ||
142 | const QTime& right )const { | ||
143 | int ret = 0; | ||
144 | if ( !left .isValid() ) ret++; | ||
145 | if ( !right.isValid() ) ret--; | ||
146 | |||
147 | if ( left.isValid() && right.isValid() ){ | ||
148 | ret += left < right ? -1 : 1; | ||
149 | } | ||
150 | |||
151 | return ret; | ||
152 | } | ||
153 | |||
154 | template<class T> | ||
155 | inline int OPimSortVector<T>::testDateTime( const QDateTime& left, | ||
156 | const QDateTime& right )const { | ||
157 | int ret = 0; | ||
158 | if ( !left .isValid() ) ret++; | ||
159 | if ( !right.isValid() ) ret--; | ||
160 | |||
161 | if ( left.isValid() && right.isValid() ){ | ||
162 | ret += left < right ? -1 : 1; | ||
163 | } | ||
164 | |||
165 | return ret; | ||
166 | |||
167 | } | ||
168 | |||
135 | } | 169 | } |
136 | } | 170 | } |
137 | 171 | ||
138 | #endif | 172 | #endif |
diff --git a/libopie2/opiepim/private/opimtodosortvector.cpp b/libopie2/opiepim/private/opimtodosortvector.cpp index 8d15710..1db20df 100644 --- a/libopie2/opiepim/private/opimtodosortvector.cpp +++ b/libopie2/opiepim/private/opimtodosortvector.cpp | |||
@@ -4,100 +4,102 @@ | |||
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include "opimtodosortvector.h" | 30 | #include "opimtodosortvector.h" |
31 | #include <opie2/otodoaccess.h> | 31 | #include <opie2/otodoaccess.h> |
32 | 32 | ||
33 | namespace Opie { | 33 | namespace Opie { |
34 | namespace Internal { | 34 | namespace Internal { |
35 | 35 | ||
36 | namespace{ | ||
36 | inline QString string( const OPimTodo& todo) { | 37 | inline QString string( const OPimTodo& todo) { |
37 | return todo.summary().isEmpty() ? | 38 | return todo.summary().isEmpty() ? |
38 | todo.description().left(20 ) : | 39 | todo.description().left(20 ) : |
39 | todo.summary(); | 40 | todo.summary(); |
40 | } | 41 | } |
41 | 42 | ||
42 | inline int completed( const OPimTodo& todo1, const OPimTodo& todo2) { | 43 | inline int completed( const OPimTodo& todo1, const OPimTodo& todo2) { |
43 | int ret = 0; | 44 | int ret = 0; |
44 | if ( todo1.isCompleted() ) ret++; | 45 | if ( todo1.isCompleted() ) ret++; |
45 | if ( todo2.isCompleted() ) ret--; | 46 | if ( todo2.isCompleted() ) ret--; |
46 | return ret; | 47 | return ret; |
47 | } | 48 | } |
48 | 49 | ||
49 | inline int priority( const OPimTodo& t1, const OPimTodo& t2) { | 50 | inline int priority( const OPimTodo& t1, const OPimTodo& t2) { |
50 | return ( t1.priority() - t2.priority() ); | 51 | return ( t1.priority() - t2.priority() ); |
51 | } | 52 | } |
52 | 53 | ||
53 | inline int summary( const OPimTodo& t1, const OPimTodo& t2) { | 54 | inline int summary( const OPimTodo& t1, const OPimTodo& t2) { |
54 | return QString::compare( string(t1), string(t2) ); | 55 | return QString::compare( string(t1), string(t2) ); |
55 | } | 56 | } |
56 | 57 | ||
57 | inline int deadline( const OPimTodo& t1, const OPimTodo& t2) { | 58 | inline int deadline( const OPimTodo& t1, const OPimTodo& t2) { |
58 | int ret = 0; | 59 | int ret = 0; |
59 | if ( t1.hasDueDate() && | 60 | if ( t1.hasDueDate() && |
60 | t2.hasDueDate() ) | 61 | t2.hasDueDate() ) |
61 | ret = t2.dueDate().daysTo( t1.dueDate() ); | 62 | ret = t2.dueDate().daysTo( t1.dueDate() ); |
62 | else if ( t1.hasDueDate() ) | 63 | else if ( t1.hasDueDate() ) |
63 | ret = -1; | 64 | ret = -1; |
64 | else if ( t2.hasDueDate() ) | 65 | else if ( t2.hasDueDate() ) |
65 | ret = 1; | 66 | ret = 1; |
66 | else | 67 | else |
67 | ret = 0; | 68 | ret = 0; |
68 | 69 | ||
69 | return ret; | 70 | return ret; |
70 | } | 71 | } |
71 | 72 | ||
73 | } | ||
72 | 74 | ||
73 | OPimTodoSortVector::OPimTodoSortVector( uint size, bool asc, int sort ) | 75 | OPimTodoSortVector::OPimTodoSortVector( uint size, bool asc, int sort ) |
74 | : OPimSortVector<OPimTodo>( size, asc, sort ) | 76 | : OPimSortVector<OPimTodo>( size, asc, sort ) |
75 | {} | 77 | {} |
76 | 78 | ||
77 | int OPimTodoSortVector::compareItems( const OPimTodo& con1, const OPimTodo& con2 ) { | 79 | int OPimTodoSortVector::compareItems( const OPimTodo& con1, const OPimTodo& con2 ) { |
78 | bool seComp, sePrio, seSum, seDeadline; | 80 | bool seComp, sePrio, seSum, seDeadline; |
79 | seComp = sePrio = seDeadline = seSum = false; | 81 | seComp = sePrio = seDeadline = seSum = false; |
80 | int ret =0; | 82 | int ret =0; |
81 | bool asc = sortAscending(); | 83 | bool asc = sortAscending(); |
82 | 84 | ||
83 | /* same item */ | 85 | /* same item */ |
84 | if ( con1.uid() == con2.uid() ) | 86 | if ( con1.uid() == con2.uid() ) |
85 | return 0; | 87 | return 0; |
86 | 88 | ||
87 | switch ( sortOrder() ) { | 89 | switch ( sortOrder() ) { |
88 | case OPimTodoAccess::Completed: { | 90 | case OPimTodoAccess::Completed: { |
89 | ret = completed( con1, con2 ); | 91 | ret = completed( con1, con2 ); |
90 | seComp = TRUE; | 92 | seComp = TRUE; |
91 | break; | 93 | break; |
92 | } | 94 | } |
93 | case OPimTodoAccess::Priority: { | 95 | case OPimTodoAccess::Priority: { |
94 | ret = priority( con1, con2 ); | 96 | ret = priority( con1, con2 ); |
95 | sePrio = TRUE; | 97 | sePrio = TRUE; |
96 | break; | 98 | break; |
97 | } | 99 | } |
98 | case OPimTodoAccess::SortSummary: { | 100 | case OPimTodoAccess::SortSummary: { |
99 | ret = summary( con1, con2 ); | 101 | ret = summary( con1, con2 ); |
100 | seSum = TRUE; | 102 | seSum = TRUE; |
101 | break; | 103 | break; |
102 | } | 104 | } |
103 | case OPimTodoAccess::SortByDate: | 105 | case OPimTodoAccess::SortByDate: |
diff --git a/libopie2/opiepim/private/private.pro b/libopie2/opiepim/private/private.pro index 618c2d6..92c24cb 100644 --- a/libopie2/opiepim/private/private.pro +++ b/libopie2/opiepim/private/private.pro | |||
@@ -1,9 +1,11 @@ | |||
1 | HEADERS += private/vobject_p.h \ | 1 | HEADERS += private/vobject_p.h \ |
2 | private/opimcontactsortvector.h \ | 2 | private/opimcontactsortvector.h \ |
3 | private/opimeventsortvector.h \ | ||
3 | private/opimoccurrence_p.h \ | 4 | private/opimoccurrence_p.h \ |
4 | private/opimsortvector.h \ | 5 | private/opimsortvector.h \ |
5 | private/opimtodosortvector.h | 6 | private/opimtodosortvector.h |
6 | 7 | ||
7 | SOURCES += private/opimcontactsortvector.cpp \ | 8 | SOURCES += private/opimcontactsortvector.cpp \ |
9 | private/opimeventsortvector.cpp \ | ||
8 | private/opimtodosortvector.cpp | 10 | private/opimtodosortvector.cpp |
9 | 11 | ||