author | zecke <zecke> | 2004-11-18 21:46:17 (UTC) |
---|---|---|
committer | zecke <zecke> | 2004-11-18 21:46:17 (UTC) |
commit | 41fa1c196965f17f9748f835d90c307b7e594883 (patch) (side-by-side diff) | |
tree | 1ea8a2cfe5bfb71f5c9456c7216dc5ff035dd811 | |
parent | 7484344ff5be1f7c54e51715776d0e3cadeb1ed0 (diff) | |
download | opie-41fa1c196965f17f9748f835d90c307b7e594883.zip opie-41fa1c196965f17f9748f835d90c307b7e594883.tar.gz opie-41fa1c196965f17f9748f835d90c307b7e594883.tar.bz2 |
Add generic sorting implementation based on QVector
for Contact and Todo
-rw-r--r-- | libopie2/opiepim/private/opimcontactsortvector.cpp | 104 | ||||
-rw-r--r-- | libopie2/opiepim/private/opimcontactsortvector.h | 48 | ||||
-rw-r--r-- | libopie2/opiepim/private/opimoccurrence_p.h | 33 | ||||
-rw-r--r-- | libopie2/opiepim/private/opimsortvector.h | 138 | ||||
-rw-r--r-- | libopie2/opiepim/private/opimtodosortvector.cpp | 163 | ||||
-rw-r--r-- | libopie2/opiepim/private/opimtodosortvector.h | 48 | ||||
-rw-r--r-- | libopie2/opiepim/private/private.pro | 9 |
7 files changed, 543 insertions, 0 deletions
diff --git a/libopie2/opiepim/private/opimcontactsortvector.cpp b/libopie2/opiepim/private/opimcontactsortvector.cpp new file mode 100644 index 0000000..9e186fe --- a/dev/null +++ b/libopie2/opiepim/private/opimcontactsortvector.cpp @@ -0,0 +1,104 @@ +/* + This file is part of the Opie Project + Copyright (C) 2004 Holger Freyther <freyther@handhelds.org> + =. Copyright (C) The Opie Team <opie-devel@handhelds.org> + .=l. + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include "opimcontactsortvector.h" +#include <opie2/ocontactaccess.h> + +namespace Opie { +namespace Internal { +OPimContactSortVector::OPimContactSortVector( uint size, bool asc, int sort ) + : OPimSortVector<OPimContact>( size, asc, sort ) {} + +int OPimContactSortVector::compareItems( const OPimContact& left, + const OPimContact& right ) { + if ( left.uid() == right.uid() ) + return 0; + + bool soTitle, soSummary, soFirstName, soMiddleName, soSuffix, soEmail, + soNick, soAnni, soBirth, soGender; + soTitle = soSummary = soFirstName = soMiddleName = soSuffix = soEmail = + soNick = soAnni = soBirth = soGender = false; + int ret = 0; + bool asc = sortAscending(); + + switch( sortOrder() ) { + case OPimContactAccess::SortSummary: + ret = testString( left.fileAs(), right.fileAs() ); + soSummary = true; + break; + case OPimContactAccess::SortTitle: + ret = testString( left.title(), right.title() ); + soTitle = true; + break; + case OPimContactAccess::SortFirstName: + ret = testString( left.firstName(), right.firstName() ); + soFirstName = true; + break; + case OPimContactAccess::SortMiddleName: + ret = testString( left.middleName(), right.middleName() ); + soMiddleName = true; + break; + case OPimContactAccess::SortSuffix: + ret = testString( left.suffix(), right.suffix() ); + soSuffix = true; + break; + case OPimContactAccess::SortEmail: + ret = testString( left.defaultEmail(), right.defaultEmail() ); + soEmail = true; + break; + case OPimContactAccess::SortNickname: + ret = testString( left.nickname(), right.nickname() ); + soNick = true; + break; + case OPimContactAccess::SortAnniversary: + ret = testDate( left.anniversary(), right.anniversary() ); + soAnni = true; + break; + case OPimContactAccess::SortByDate: + case OPimContactAccess::SortBirthday: + ret = testDate( left.birthday(), right.birthday() ); + soBirth = true; + break; + case OPimContactAccess::SortGender: + ret = testString( left.gender(), right.gender() ); + soGender = true; + break; + } + + /* twist to honor ascending/descending setting as QVector only sorts ascending*/ + if ( !asc ) + ret *= -1; + + // Maybe differentiate as in OPimTodoSortVector ### FIXME + // if( ret ) + return ret; +} + +} +} diff --git a/libopie2/opiepim/private/opimcontactsortvector.h b/libopie2/opiepim/private/opimcontactsortvector.h new file mode 100644 index 0000000..3f40657 --- a/dev/null +++ b/libopie2/opiepim/private/opimcontactsortvector.h @@ -0,0 +1,48 @@ +/* + This file is part of the Opie Project + Copyright (C) 2004 Holger Freyther <freyther@handhelds.org> + =. Copyright (C) The Opie Team <opie-devel@handhelds.org> + .=l. + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef OPIM_CONTACT_SORT_VECTOR_H +#define OPIM_CONTACT_SORT_VECTOR_H + +#include <opie2/opimcontact.h> +#include <opie2/private/opimsortvector.h> + +namespace Opie { +namespace Internal { +class OPimContactSortVector : public OPimSortVector<OPimContact> { +public: + OPimContactSortVector( uint size, bool asc, int sort ); +private: + int compareItems( const OPimContact&, const OPimContact& ); +}; +} +} + + +#endif diff --git a/libopie2/opiepim/private/opimoccurrence_p.h b/libopie2/opiepim/private/opimoccurrence_p.h new file mode 100644 index 0000000..3ccd97e --- a/dev/null +++ b/libopie2/opiepim/private/opimoccurrence_p.h @@ -0,0 +1,33 @@ +// Private HEADER DON'T USE IT!!! WE MEAN IT!!! +// + +#ifndef OPIE_PRIVATE_INTERNAL_OCCURRENCE_PIM_H +#define OPIE_PRIVATE_INTERNAL_OCCURRENCE_PIM_H + +#include <qshared.h> + + +namespace Opie{ + +/* + * The Data is shared between Occurrences + * across multiple days. + */ +/** + * @internal + * + * DO NOT USE. IT IS NOT PART OF THE API + */ +struct OPimOccurrence::Data : public QShared { + Data() : uid( -1 ), backend( 0l ) {} + + QString summary; // The Summary of this Occurrence + QString location; // The location of this Occurrence + QString note; // The note of this Occurrence + UID uid; // The UID of the Record + mutable Opie::Core::OSharedPointer<OPimRecord> record; // The Guarded Record + OPimBase *backend; +}; +} + +#endif diff --git a/libopie2/opiepim/private/opimsortvector.h b/libopie2/opiepim/private/opimsortvector.h new file mode 100644 index 0000000..6c21339 --- a/dev/null +++ b/libopie2/opiepim/private/opimsortvector.h @@ -0,0 +1,138 @@ +/* + This file is part of the Opie Project + Copyright (C) 2004 Holger Freyther <freyther@handhelds.org> + =. Copyright (C) The Opie Team <opie-devel@handhelds.org> + .=l. + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef OPIE_PIM_SORT_VECTOR_H +#define OPIE_PIM_SORT_VECTOR_H + +#include <opie2/opimglobal.h> + +#include <qvector.h> + +namespace Opie { +namespace Internal { +template<class T> +struct OPimSortVectorContainer { + T item; +}; + +template<class T> +class OPimSortVector : public QVector<OPimSortVectorContainer<T> > { + typedef OPimSortVectorContainer<T> VectorItem; +public: + OPimSortVector( uint size, bool asc, int sort ); + int compareItems( QCollection::Item d1, QCollection::Item d2 ); + bool insert( uint, const T& t ); + UID uidAt( uint i )const; + +protected: + int testString( const QString&, const QString& )const; + int testDate( const QDate&, const QDate& )const; +protected: + bool sortAscending()const; + int sortOrder()const; + +private: + bool m_ascending : 1; + int m_sort; + virtual int compareItems( const T& item1, const T& item2 ) = 0; +}; + +template<class T> +OPimSortVector<T>::OPimSortVector( uint size, bool asc, int sort ) + : QVector<VectorItem>( size ), m_ascending( asc ), + m_sort( sort ) { + this->setAutoDelete( true ); +} + +/** + * Returns: + * 0 if item1 == item2 + * + * non-zero if item1 != item2 + * + * This function returns int rather than bool so that reimplementations + * can return one of three values and use it to sort by: + * + * 0 if item1 == item2 + * + * > 0 (positive integer) if item1 > item2 + * + * < 0 (negative integer) if item1 < item2 + * + */ +template<class T> +int OPimSortVector<T>::compareItems( QCollection::Item d1, QCollection::Item d2 ) { + return compareItems( ((VectorItem*)d1)->item, + ((VectorItem*)d2)->item ); +} + +template<class T> +bool OPimSortVector<T>::sortAscending()const { + return m_ascending; +} + +template<class T> +int OPimSortVector<T>::sortOrder()const { + return m_sort; +} + +template<class T> +bool OPimSortVector<T>::insert( uint i, const T& record ) { + VectorItem *item = new VectorItem; + item->item = record; + return QVector<VectorItem>::insert( i, item ); +} + +template<class T> +UID OPimSortVector<T>::uidAt( uint index )const { + return this->at( index )->item.uid(); +} + +template<class T> +inline int OPimSortVector<T>::testString( const QString& left, + const QString& right )const { + return QString::compare( left, right ); +} + +template<class T> +inline int OPimSortVector<T>::testDate( const QDate& left, + const QDate& right )const { + int ret = 0; + if ( !left .isValid() ) ret++; + if ( !right.isValid() ) ret--; + + if ( left.isValid() && right.isValid() ) + ret += left < right ? -1 : 1; + + return ret; +} +} +} + +#endif diff --git a/libopie2/opiepim/private/opimtodosortvector.cpp b/libopie2/opiepim/private/opimtodosortvector.cpp new file mode 100644 index 0000000..8d15710 --- a/dev/null +++ b/libopie2/opiepim/private/opimtodosortvector.cpp @@ -0,0 +1,163 @@ +/* + This file is part of the Opie Project + Copyright (C) 2004 Holger Freyther <freyther@handhelds.org> + =. Copyright (C) The Opie Team <opie-devel@handhelds.org> + .=l. + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include "opimtodosortvector.h" +#include <opie2/otodoaccess.h> + +namespace Opie { +namespace Internal { + +inline QString string( const OPimTodo& todo) { + return todo.summary().isEmpty() ? + todo.description().left(20 ) : + todo.summary(); +} + +inline int completed( const OPimTodo& todo1, const OPimTodo& todo2) { + int ret = 0; + if ( todo1.isCompleted() ) ret++; + if ( todo2.isCompleted() ) ret--; + return ret; +} + +inline int priority( const OPimTodo& t1, const OPimTodo& t2) { + return ( t1.priority() - t2.priority() ); +} + +inline int summary( const OPimTodo& t1, const OPimTodo& t2) { + return QString::compare( string(t1), string(t2) ); +} + +inline int deadline( const OPimTodo& t1, const OPimTodo& t2) { + int ret = 0; + if ( t1.hasDueDate() && + t2.hasDueDate() ) + ret = t2.dueDate().daysTo( t1.dueDate() ); + else if ( t1.hasDueDate() ) + ret = -1; + else if ( t2.hasDueDate() ) + ret = 1; + else + ret = 0; + + return ret; +} + + +OPimTodoSortVector::OPimTodoSortVector( uint size, bool asc, int sort ) + : OPimSortVector<OPimTodo>( size, asc, sort ) +{} + +int OPimTodoSortVector::compareItems( const OPimTodo& con1, const OPimTodo& con2 ) { + bool seComp, sePrio, seSum, seDeadline; + seComp = sePrio = seDeadline = seSum = false; + int ret =0; + bool asc = sortAscending(); + + /* same item */ + if ( con1.uid() == con2.uid() ) + return 0; + + switch ( sortOrder() ) { + case OPimTodoAccess::Completed: { + ret = completed( con1, con2 ); + seComp = TRUE; + break; + } + case OPimTodoAccess::Priority: { + ret = priority( con1, con2 ); + sePrio = TRUE; + break; + } + case OPimTodoAccess::SortSummary: { + ret = summary( con1, con2 ); + seSum = TRUE; + break; + } + case OPimTodoAccess::SortByDate: + case OPimTodoAccess::Deadline: { + ret = deadline( con1, con2 ); + seDeadline = TRUE; + break; + } + default: + ret = 0; + break; + }; + /* + * FIXME do better sorting if the first sort criteria + * ret equals 0 start with complete and so on... + */ + + /* twist it we're not ascending*/ + if (!asc) + ret = ret * -1; + + if ( ret ) + return ret; + + // default did not gave difference let's try it other way around + /* + * General try if already checked if not test + * and return + * 1.Completed + * 2.Priority + * 3.Description + * 4.DueDate + */ + if (!seComp ) { + if ( (ret = completed( con1, con2 ) ) ) { + if (!asc ) ret *= -1; + return ret; + } + } + if (!sePrio ) { + if ( (ret = priority( con1, con2 ) ) ) { + if (!asc ) ret *= -1; + return ret; + } + } + if (!seSum ) { + if ( (ret = summary(con1, con2 ) ) ) { + if (!asc) ret *= -1; + return ret; + } + } + if (!seDeadline) { + if ( (ret = deadline( con1, con2 ) ) ) { + if (!asc) ret *= -1; + return ret; + } + } + + return 0; +} + +} +} diff --git a/libopie2/opiepim/private/opimtodosortvector.h b/libopie2/opiepim/private/opimtodosortvector.h new file mode 100644 index 0000000..11745ac --- a/dev/null +++ b/libopie2/opiepim/private/opimtodosortvector.h @@ -0,0 +1,48 @@ +/* + This file is part of the Opie Project + Copyright (C) 2004 Holger Freyther <freyther@handhelds.org> + =. Copyright (C) The Opie Team <opie-devel@handhelds.org> + .=l. + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef OPIM_TODO_SORT_VECTOR_H +#define OPIM_TODO_SORT_VECTOR_H + +#include <opie2/opimtodo.h> +#include <opie2/private/opimsortvector.h> + +namespace Opie { +namespace Internal { +class OPimTodoSortVector : public OPimSortVector<OPimTodo> { +public: + OPimTodoSortVector( uint size, bool asc, int sort ); +private: + int compareItems( const OPimTodo&, const OPimTodo& ); +}; +} +} + + +#endif diff --git a/libopie2/opiepim/private/private.pro b/libopie2/opiepim/private/private.pro new file mode 100644 index 0000000..618c2d6 --- a/dev/null +++ b/libopie2/opiepim/private/private.pro @@ -0,0 +1,9 @@ +HEADERS += private/vobject_p.h \ + private/opimcontactsortvector.h \ + private/opimoccurrence_p.h \ + private/opimsortvector.h \ + private/opimtodosortvector.h + +SOURCES += private/opimcontactsortvector.cpp \ + private/opimtodosortvector.cpp + |