-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,2 +1,5 @@ | |||
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 |
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,5 +1,6 @@ | |||
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. |
@@ -238,5 +239,5 @@ bool OPimContactAccessBackend::hasQuerySettings (uint querySettings) const | |||
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 | ||
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,5 +1,6 @@ | |||
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. |
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 | |||
@@ -29,7 +29,9 @@ | |||
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; |
@@ -145,6 +147,56 @@ UIDArray ODateBookAccessBackend::queryByExample( const UIDArray& uidlist, const | |||
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 | ||
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 | |||
@@ -47,4 +47,29 @@ namespace Opie { | |||
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(); |
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 | |||
@@ -54,4 +54,7 @@ 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; |
@@ -121,4 +124,5 @@ inline int OPimSortVector<T>::testString( const QString& left, | |||
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, |
@@ -133,4 +137,34 @@ inline int OPimSortVector<T>::testDate( const QDate& left, | |||
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 | } |
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 | |||
@@ -34,4 +34,5 @@ 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() ? |
@@ -70,4 +71,5 @@ inline int deadline( const OPimTodo& t1, const OPimTodo& t2) { | |||
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 ) |
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,4 +1,5 @@ | |||
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 \ |
@@ -6,4 +7,5 @@ HEADERS += private/vobject_p.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 | ||