author | paule <paule> | 2007-01-13 09:00:15 (UTC) |
---|---|---|
committer | paule <paule> | 2007-01-13 09:00:15 (UTC) |
commit | 5c03ec2b2d0d6b10f7581b8b447cbcb1935e7e67 (patch) (unidiff) | |
tree | 0ae38a54d489376ce3ac7df2441046075fb8cf14 | |
parent | a1360b0af73518d97ebe63ad3cd156cd8b57c8b5 (diff) | |
download | opie-5c03ec2b2d0d6b10f7581b8b447cbcb1935e7e67.zip opie-5c03ec2b2d0d6b10f7581b8b447cbcb1935e7e67.tar.gz opie-5c03ec2b2d0d6b10f7581b8b447cbcb1935e7e67.tar.bz2 |
Implement default sort functions for contact last name and birthday/anniversary. The latter is required for sorting birthdays/anniversaries correctly on the today screen.
Fixes bug #1760.
-rw-r--r-- | libopie2/opiepim/private/opimcontactsortvector.cpp | 14 | ||||
-rw-r--r-- | libopie2/opiepim/private/opimsortvector.h | 24 |
2 files changed, 38 insertions, 0 deletions
diff --git a/libopie2/opiepim/private/opimcontactsortvector.cpp b/libopie2/opiepim/private/opimcontactsortvector.cpp index 8c7d5ca..c8de4d1 100644 --- a/libopie2/opiepim/private/opimcontactsortvector.cpp +++ b/libopie2/opiepim/private/opimcontactsortvector.cpp | |||
@@ -19,90 +19,104 @@ | |||
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 "opimcontactsortvector.h" | 30 | #include "opimcontactsortvector.h" |
31 | #include <opie2/ocontactaccess.h> | 31 | #include <opie2/ocontactaccess.h> |
32 | 32 | ||
33 | namespace Opie { | 33 | namespace Opie { |
34 | namespace Internal { | 34 | namespace Internal { |
35 | OPimContactSortVector::OPimContactSortVector( uint size, bool asc, int sort ) | 35 | OPimContactSortVector::OPimContactSortVector( uint size, bool asc, int sort ) |
36 | : OPimSortVector<OPimContact>( size, asc, sort ) {} | 36 | : OPimSortVector<OPimContact>( size, asc, sort ) {} |
37 | 37 | ||
38 | int OPimContactSortVector::compareItems( const OPimContact& left, | 38 | int OPimContactSortVector::compareItems( const OPimContact& left, |
39 | const OPimContact& right ) { | 39 | const OPimContact& right ) { |
40 | if ( left.uid() == right.uid() ) | 40 | if ( left.uid() == right.uid() ) |
41 | return 0; | 41 | return 0; |
42 | 42 | ||
43 | bool soTitle, soSummary, soFirstName, soMiddleName, soSuffix, soEmail, | 43 | bool soTitle, soSummary, soFirstName, soMiddleName, soSuffix, soEmail, |
44 | soNick, soFileAs, soAnni, soBirth, soGender; | 44 | soNick, soFileAs, soAnni, soBirth, soGender; |
45 | soTitle = soSummary = soFirstName = soMiddleName = soSuffix = soEmail = | 45 | soTitle = soSummary = soFirstName = soMiddleName = soSuffix = soEmail = |
46 | soNick = soFileAs = soAnni = soBirth = soGender = false; | 46 | soNick = soFileAs = soAnni = soBirth = soGender = false; |
47 | int ret = 0; | 47 | int ret = 0; |
48 | bool asc = sortAscending(); | 48 | bool asc = sortAscending(); |
49 | 49 | ||
50 | switch( sortOrder() ) { | 50 | switch( sortOrder() ) { |
51 | case OPimContactAccess::SortSummary: | 51 | case OPimContactAccess::SortSummary: |
52 | ret = testString( left.fileAs(), right.fileAs() ); | 52 | ret = testString( left.fileAs(), right.fileAs() ); |
53 | soSummary = true; | 53 | soSummary = true; |
54 | break; | 54 | break; |
55 | case OPimContactAccess::SortTitle: | 55 | case OPimContactAccess::SortTitle: |
56 | ret = testString( left.title(), right.title() ); | 56 | ret = testString( left.title(), right.title() ); |
57 | soTitle = true; | 57 | soTitle = true; |
58 | break; | 58 | break; |
59 | case OPimContactAccess::SortFirstName: | 59 | case OPimContactAccess::SortFirstName: |
60 | ret = testString( left.firstName(), right.firstName() ); | 60 | ret = testString( left.firstName(), right.firstName() ); |
61 | soFirstName = true; | 61 | soFirstName = true; |
62 | break; | 62 | break; |
63 | case OPimContactAccess::SortMiddleName: | 63 | case OPimContactAccess::SortMiddleName: |
64 | ret = testString( left.middleName(), right.middleName() ); | 64 | ret = testString( left.middleName(), right.middleName() ); |
65 | soMiddleName = true; | 65 | soMiddleName = true; |
66 | break; | 66 | break; |
67 | case OPimContactAccess::SortLastName: | ||
68 | ret = testString( left.lastName(), right.lastName() ); | ||
69 | break; | ||
67 | case OPimContactAccess::SortSuffix: | 70 | case OPimContactAccess::SortSuffix: |
68 | ret = testString( left.suffix(), right.suffix() ); | 71 | ret = testString( left.suffix(), right.suffix() ); |
69 | soSuffix = true; | 72 | soSuffix = true; |
70 | break; | 73 | break; |
71 | case OPimContactAccess::SortEmail: | 74 | case OPimContactAccess::SortEmail: |
72 | ret = testString( left.defaultEmail(), right.defaultEmail() ); | 75 | ret = testString( left.defaultEmail(), right.defaultEmail() ); |
73 | soEmail = true; | 76 | soEmail = true; |
74 | break; | 77 | break; |
75 | case OPimContactAccess::SortNickname: | 78 | case OPimContactAccess::SortNickname: |
76 | ret = testString( left.nickname(), right.nickname() ); | 79 | ret = testString( left.nickname(), right.nickname() ); |
77 | soNick = true; | 80 | soNick = true; |
78 | break; | 81 | break; |
79 | case OPimContactAccess::SortFileAsName: | 82 | case OPimContactAccess::SortFileAsName: |
80 | ret = testString( left.fileAs(), right.fileAs() ); | 83 | ret = testString( left.fileAs(), right.fileAs() ); |
81 | soFileAs = true; | 84 | soFileAs = true; |
82 | break; | 85 | break; |
83 | case OPimContactAccess::SortAnniversary: | 86 | case OPimContactAccess::SortAnniversary: |
84 | ret = testDate( left.anniversary(), right.anniversary() ); | 87 | ret = testDate( left.anniversary(), right.anniversary() ); |
85 | soAnni = true; | 88 | soAnni = true; |
86 | break; | 89 | break; |
87 | case OPimContactAccess::SortByDate: | 90 | case OPimContactAccess::SortByDate: |
88 | case OPimContactAccess::SortBirthday: | 91 | case OPimContactAccess::SortBirthday: |
89 | ret = testDate( left.birthday(), right.birthday() ); | 92 | ret = testDate( left.birthday(), right.birthday() ); |
90 | soBirth = true; | 93 | soBirth = true; |
91 | break; | 94 | break; |
92 | case OPimContactAccess::SortGender: | 95 | case OPimContactAccess::SortGender: |
93 | ret = testString( left.gender(), right.gender() ); | 96 | ret = testString( left.gender(), right.gender() ); |
94 | soGender = true; | 97 | soGender = true; |
95 | break; | 98 | break; |
99 | case OPimContactAccess::SortBirthdayWithoutYear: | ||
100 | // This doesn't actually just sort by the date without year, | ||
101 | // it actually works out the days until the next occurrence, | ||
102 | // which is more useful since it will work correctly when | ||
103 | // crossing year boundaries. - Paul Eggleton Dec 2006 | ||
104 | ret = testDaysUntilNextDate( left.birthday(), right.birthday() ); | ||
105 | break; | ||
106 | case OPimContactAccess::SortAnniversaryWithoutYear: | ||
107 | // (as above) | ||
108 | ret = testDaysUntilNextDate( left.anniversary(), right.anniversary() ); | ||
109 | break; | ||
96 | } | 110 | } |
97 | 111 | ||
98 | /* twist to honor ascending/descending setting as QVector only sorts ascending*/ | 112 | /* twist to honor ascending/descending setting as QVector only sorts ascending*/ |
99 | if ( !asc ) | 113 | if ( !asc ) |
100 | ret *= -1; | 114 | ret *= -1; |
101 | 115 | ||
102 | // Maybe differentiate as in OPimTodoSortVector ### FIXME | 116 | // Maybe differentiate as in OPimTodoSortVector ### FIXME |
103 | // if( ret ) | 117 | // if( ret ) |
104 | return ret; | 118 | return ret; |
105 | } | 119 | } |
106 | 120 | ||
107 | } | 121 | } |
108 | } | 122 | } |
diff --git a/libopie2/opiepim/private/opimsortvector.h b/libopie2/opiepim/private/opimsortvector.h index 11a40ac..9684ca1 100644 --- a/libopie2/opiepim/private/opimsortvector.h +++ b/libopie2/opiepim/private/opimsortvector.h | |||
@@ -11,96 +11,98 @@ | |||
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 | #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; | 56 | int testTime( const QTime&, const QTime& )const; |
57 | int testDateTime( const QDateTime& left, | 57 | int testDateTime( const QDateTime& left, |
58 | const QDateTime& right )const; | 58 | const QDateTime& right )const; |
59 | int testDaysUntilNextDate( const QDate& left, | ||
60 | const QDate& right )const; | ||
59 | protected: | 61 | protected: |
60 | bool sortAscending()const; | 62 | bool sortAscending()const; |
61 | int sortOrder()const; | 63 | int sortOrder()const; |
62 | 64 | ||
63 | private: | 65 | private: |
64 | bool m_ascending : 1; | 66 | bool m_ascending : 1; |
65 | int m_sort; | 67 | int m_sort; |
66 | virtual int compareItems( const T& item1, const T& item2 ) = 0; | 68 | virtual int compareItems( const T& item1, const T& item2 ) = 0; |
67 | }; | 69 | }; |
68 | 70 | ||
69 | template<class T> | 71 | template<class T> |
70 | OPimSortVector<T>::OPimSortVector( uint size, bool asc, int sort ) | 72 | OPimSortVector<T>::OPimSortVector( uint size, bool asc, int sort ) |
71 | : QVector<VectorItem>( size ), m_ascending( asc ), | 73 | : QVector<VectorItem>( size ), m_ascending( asc ), |
72 | m_sort( sort ) { | 74 | m_sort( sort ) { |
73 | this->setAutoDelete( true ); | 75 | this->setAutoDelete( true ); |
74 | } | 76 | } |
75 | 77 | ||
76 | /** | 78 | /** |
77 | * Returns: | 79 | * Returns: |
78 | * 0 if item1 == item2 | 80 | * 0 if item1 == item2 |
79 | * | 81 | * |
80 | * non-zero if item1 != item2 | 82 | * non-zero if item1 != item2 |
81 | * | 83 | * |
82 | * This function returns int rather than bool so that reimplementations | 84 | * This function returns int rather than bool so that reimplementations |
83 | * can return one of three values and use it to sort by: | 85 | * can return one of three values and use it to sort by: |
84 | * | 86 | * |
85 | * 0 if item1 == item2 | 87 | * 0 if item1 == item2 |
86 | * | 88 | * |
87 | * > 0 (positive integer) if item1 > item2 | 89 | * > 0 (positive integer) if item1 > item2 |
88 | * | 90 | * |
89 | * < 0 (negative integer) if item1 < item2 | 91 | * < 0 (negative integer) if item1 < item2 |
90 | * | 92 | * |
91 | */ | 93 | */ |
92 | template<class T> | 94 | template<class T> |
93 | int OPimSortVector<T>::compareItems( QCollection::Item d1, QCollection::Item d2 ) { | 95 | int OPimSortVector<T>::compareItems( QCollection::Item d1, QCollection::Item d2 ) { |
94 | return compareItems( ((VectorItem*)d1)->item, | 96 | return compareItems( ((VectorItem*)d1)->item, |
95 | ((VectorItem*)d2)->item ); | 97 | ((VectorItem*)d2)->item ); |
96 | } | 98 | } |
97 | 99 | ||
98 | template<class T> | 100 | template<class T> |
99 | bool OPimSortVector<T>::sortAscending()const { | 101 | bool OPimSortVector<T>::sortAscending()const { |
100 | return m_ascending; | 102 | return m_ascending; |
101 | } | 103 | } |
102 | 104 | ||
103 | template<class T> | 105 | template<class T> |
104 | int OPimSortVector<T>::sortOrder()const { | 106 | int OPimSortVector<T>::sortOrder()const { |
105 | return m_sort; | 107 | return m_sort; |
106 | } | 108 | } |
@@ -121,52 +123,74 @@ template<class T> | |||
121 | inline int OPimSortVector<T>::testString( const QString& left, | 123 | inline int OPimSortVector<T>::testString( const QString& left, |
122 | const QString& right )const { | 124 | const QString& right )const { |
123 | return QString::compare( left, right ); | 125 | return QString::compare( left, right ); |
124 | } | 126 | } |
125 | 127 | ||
126 | 128 | ||
127 | template<class T> | 129 | template<class T> |
128 | inline int OPimSortVector<T>::testDate( const QDate& left, | 130 | inline int OPimSortVector<T>::testDate( const QDate& left, |
129 | const QDate& right )const { | 131 | const QDate& right )const { |
130 | int ret = 0; | 132 | int ret = 0; |
131 | if ( !left .isValid() ) ret++; | 133 | if ( !left .isValid() ) ret++; |
132 | if ( !right.isValid() ) ret--; | 134 | if ( !right.isValid() ) ret--; |
133 | 135 | ||
134 | if ( left.isValid() && right.isValid() ) | 136 | if ( left.isValid() && right.isValid() ) |
135 | ret += left < right ? -1 : 1; | 137 | ret += left < right ? -1 : 1; |
136 | 138 | ||
137 | return ret; | 139 | return ret; |
138 | } | 140 | } |
139 | 141 | ||
140 | template<class T> | 142 | template<class T> |
141 | inline int OPimSortVector<T>::testTime( const QTime& left, | 143 | inline int OPimSortVector<T>::testTime( const QTime& left, |
142 | const QTime& right )const { | 144 | const QTime& right )const { |
143 | int ret = 0; | 145 | int ret = 0; |
144 | if ( !left .isValid() ) ret++; | 146 | if ( !left .isValid() ) ret++; |
145 | if ( !right.isValid() ) ret--; | 147 | if ( !right.isValid() ) ret--; |
146 | 148 | ||
147 | if ( left.isValid() && right.isValid() ){ | 149 | if ( left.isValid() && right.isValid() ){ |
148 | ret += left < right ? -1 : 1; | 150 | ret += left < right ? -1 : 1; |
149 | } | 151 | } |
150 | 152 | ||
151 | return ret; | 153 | return ret; |
152 | } | 154 | } |
153 | 155 | ||
154 | template<class T> | 156 | template<class T> |
155 | inline int OPimSortVector<T>::testDateTime( const QDateTime& left, | 157 | inline int OPimSortVector<T>::testDateTime( const QDateTime& left, |
156 | const QDateTime& right )const { | 158 | const QDateTime& right )const { |
157 | int ret = 0; | 159 | int ret = 0; |
158 | if ( !left .isValid() ) ret++; | 160 | if ( !left .isValid() ) ret++; |
159 | if ( !right.isValid() ) ret--; | 161 | if ( !right.isValid() ) ret--; |
160 | 162 | ||
161 | if ( left.isValid() && right.isValid() ){ | 163 | if ( left.isValid() && right.isValid() ){ |
162 | ret += left < right ? -1 : 1; | 164 | ret += left < right ? -1 : 1; |
163 | } | 165 | } |
164 | 166 | ||
165 | return ret; | 167 | return ret; |
166 | 168 | ||
167 | } | 169 | } |
168 | 170 | ||
171 | template<class T> | ||
172 | inline int OPimSortVector<T>::testDaysUntilNextDate( const QDate& left, | ||
173 | const QDate& right )const { | ||
174 | int ret = 0; | ||
175 | if ( !left .isValid() ) ret++; | ||
176 | if ( !right.isValid() ) ret--; | ||
177 | |||
178 | if ( left.isValid() && right.isValid() ){ | ||
179 | int currentYear = QDate::currentDate().year(); | ||
180 | QDate nextLeft( currentYear, left.month(), left.day() ); | ||
181 | if ( QDate::currentDate().daysTo(nextLeft) < 0 ) | ||
182 | nextLeft.setYMD( currentYear+1, left.month(), left.day() ); | ||
183 | QDate nextRight( currentYear, right.month(), right.day() ); | ||
184 | if ( QDate::currentDate().daysTo(nextRight) < 0 ) | ||
185 | nextRight.setYMD( currentYear+1, right.month(), right.day() ); | ||
186 | |||
187 | ret += QDate::currentDate().daysTo(nextLeft) < QDate::currentDate().daysTo(nextRight) ? -1 : 1; | ||
188 | } | ||
189 | |||
190 | return ret; | ||
191 | } | ||
192 | |||
169 | } | 193 | } |
170 | } | 194 | } |
171 | 195 | ||
172 | #endif | 196 | #endif |