author | eilers <eilers> | 2005-01-16 19:54:28 (UTC) |
---|---|---|
committer | eilers <eilers> | 2005-01-16 19:54:28 (UTC) |
commit | 37f290f048eeade1036cd1dc2239d2a98412c54b (patch) (side-by-side diff) | |
tree | 04dea39ccf2725f4992d5b8bdbf12807e9a67ae2 /libopie2/opiepim/private | |
parent | 07a4cf7e277aee7097c4da286a2559b717054362 (diff) | |
download | opie-37f290f048eeade1036cd1dc2239d2a98412c54b.zip opie-37f290f048eeade1036cd1dc2239d2a98412c54b.tar.gz opie-37f290f048eeade1036cd1dc2239d2a98412c54b.tar.bz2 |
Added new generic sorted for the databook backends. Needed an sortedvector
to do this job, which is now added to private classes..
-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 |
5 files changed, 220 insertions, 0 deletions
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 @@ +/* + This file is part of the Opie Project + Copyright (C) 2004 Stefan Eilers <stefan@eilers-online.net> + =. 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 "opimeventsortvector.h" +#include <opie2/ocontactaccess.h> +#include <opie2/opimnotifymanager.h> +#include <opie2/odatebookaccess.h> + +#include <qvaluelist.h> + +namespace Opie { +namespace Internal { + +namespace{ + +inline int testAlarmNotifiers( const OPimNotifyManager& leftnotifiers, const OPimNotifyManager& rightnotifiers ){ + OPimNotifyManager::Alarms left_alarms = leftnotifiers.alarms(); + OPimNotifyManager::Alarms right_alarms = rightnotifiers.alarms(); + + // Well.. How could we compare two lists of alarms? I think we should find the most early datetimes + // and compare them.. (se) + // Find the first alarm of the left list + OPimNotifyManager::Alarms::Iterator it; + QDateTime left_earliest; // This datetime is initialized as invalid!! + for ( it = left_alarms.begin(); it != left_alarms.end(); ++it ){ + if ( !left_earliest.isValid() || left_earliest > (*it).dateTime() ){ + left_earliest = (*it).dateTime(); + } + } + QDateTime right_earliest; // This datetime is initialized as invalid!! + for ( it = right_alarms.begin(); it != right_alarms.end(); ++it ){ + if ( !right_earliest.isValid() || right_earliest > (*it).dateTime() ){ + right_earliest = (*it).dateTime(); + } + } + + int ret; + + // Now compare this found alarms + if ( !left_earliest .isValid() ) ret++; + if ( !right_earliest.isValid() ) ret--; + + if ( left_earliest.isValid() && right_earliest.isValid() ){ + ret += left_earliest < right_earliest ? -1 : 1; + } + + return ret; + +} +} + +OPimEventSortVector::OPimEventSortVector( uint size, bool asc, int sort ) + : OPimSortVector<OPimEvent>( size, asc, sort ) {} + +int OPimEventSortVector::compareItems( const OPimEvent& left, + const OPimEvent& right ) { + if ( left.uid() == right.uid() ) + return 0; + + int ret = 0; + bool asc = sortAscending(); + + switch( sortOrder() ) { + case ODateBookAccess::SortDescription: + ret = testString( left.description(), right.description() ); + break; + case ODateBookAccess::SortLocation: + ret = testString( left.location(), right.location() ); + break; + case ODateBookAccess::SortNote: + ret = testString( left.note(),right.note() ); + break; + case ODateBookAccess::SortStartTime: + ret = testTime( left.startDateTime().time(), right.startDateTime().time() ); + break; + case ODateBookAccess::SortEndTime: + ret = testTime( left.endDateTime().time(), right.endDateTime().time() ); + break; + case ODateBookAccess::SortStartDate: + ret = testDate( left.startDateTime().date(), right.startDateTime().date() ); + break; + case ODateBookAccess::SortEndDate: + ret = testDate( left.endDateTime().date(), right.endDateTime().date() ); + break; + case ODateBookAccess::SortStartDateTime: + ret = testDateTime( left.startDateTime(), right.startDateTime() ); + break; + case ODateBookAccess::SortEndDateTime: + ret = testDateTime( left.endDateTime(), right.endDateTime() ); + break; + case ODateBookAccess::SortAlarmDateTime: + ret = testAlarmNotifiers( left.notifiers(), right.notifiers() ); + break; + default: + odebug << "OpimEventSortVector: Unknown sortOrder: " << sortOrder() << oendl; + } + + /* 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/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 @@ +/* + This file is part of the Opie Project + Copyright (C) 2004 Stefan Eilers <stefan@eilers-online.net> + =. 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/opimevent.h> +#include <opie2/private/opimsortvector.h> + +namespace Opie { +namespace Internal { +class OPimEventSortVector : public OPimSortVector<OPimEvent> { +public: + OPimEventSortVector( uint size, bool asc, int sort ); +private: + int compareItems( const OPimEvent&, const OPimEvent& ); +}; +} +} + + +#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 @@ -8,131 +8,165 @@ .> <`_, > . <= 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; + int testTime( const QTime&, const QTime& )const; + int testDateTime( const QDateTime& left, + const QDateTime& right )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; } + +template<class T> +inline int OPimSortVector<T>::testTime( const QTime& left, + const QTime& 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; +} + +template<class T> +inline int OPimSortVector<T>::testDateTime( const QDateTime& left, + const QDateTime& 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 index 8d15710..1db20df 100644 --- a/libopie2/opiepim/private/opimtodosortvector.cpp +++ b/libopie2/opiepim/private/opimtodosortvector.cpp @@ -1,119 +1,121 @@ /* 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 { +namespace{ 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) 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 @@ HEADERS += private/vobject_p.h \ private/opimcontactsortvector.h \ + private/opimeventsortvector.h \ private/opimoccurrence_p.h \ private/opimsortvector.h \ private/opimtodosortvector.h SOURCES += private/opimcontactsortvector.cpp \ + private/opimeventsortvector.cpp \ private/opimtodosortvector.cpp |