From 37f290f048eeade1036cd1dc2239d2a98412c54b Mon Sep 17 00:00:00 2001 From: eilers Date: Sun, 16 Jan 2005 19:54:28 +0000 Subject: Added new generic sorted for the databook backends. Needed an sortedvector to do this job, which is now added to private classes.. --- diff --git a/libopie2/opiepim/ChangeLog b/libopie2/opiepim/ChangeLog index 320b189..e94fa59 100644 --- a/libopie2/opiepim/ChangeLog +++ b/libopie2/opiepim/ChangeLog @@ -1,3 +1,6 @@ +2005-01-16 Stefan Eilers + * Added new OPimEventSortVector class, improved OPimSortVector + * OPimAccessBackend now supports generic sorting. 2005-01-03 Stefan Eilers * Fixing bug in API documentation * Moving hasQuerySettings() and querySettings() to OPimAccessTemplate to be available for all frontends 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,6 +1,7 @@ /* This file is part of the Opie Project - Copyright (C) 2004 Holger Freyther + Copyright (C) Holger Freyther + Copyright (C) Stefan Eilers =. Copyright (C) The Opie Team .=l. .>+-= @@ -237,7 +238,7 @@ bool OPimContactAccessBackend::hasQuerySettings (uint querySettings) const UIDArray OPimContactAccessBackend::sorted( const UIDArray& ar, bool asc, int sortOrder, - int filter, const QArray& categories)const { + int filter, const QArray& categories )const { odebug << "Using Unaccelerated OPimContactAccessBackend sorted Implementation" << oendl; Internal::OPimContactSortVector vector(ar.count(), asc, sortOrder ); 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,6 +1,7 @@ /* This file is part of the Opie Project - Copyright (C) The Main Author + Copyright (C) Holger Freyther + Copyright (C) Stefan Eilers =. Copyright (C) The Opie Team .=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 @@ -28,9 +28,11 @@ */ #include +#include #include - +#include #include +#include using namespace Opie; @@ -144,8 +146,58 @@ UIDArray ODateBookAccessBackend::queryByExample( const UIDArray& uidlist, const return UIDArray(); } -UIDArray ODateBookAccessBackend::sorted( const UIDArray&, bool asc, int, int, const QArray& )const { - return UIDArray(); +UIDArray ODateBookAccessBackend::sorted( const UIDArray& ar, bool asc, int sortOrder, int filter, const QArray& categories )const { + odebug << "Using Unaccelerated ODateBookAccessBackend sorted Implementation" << oendl; + + Internal::OPimEventSortVector vector( ar.count(), asc, sortOrder ); + int item = 0; + + for ( uint i = 0; i < ar.count(); ++i ){ + OPimEvent event = find( ar[i], ar, i, Frontend::Forward ); + if ( event.isEmpty() ) + continue; + + bool catPassed = true; + if ( filter & ODateBookAccess::FilterCategory ){ + catPassed = false; + // Filter Categories + for ( uint cat_idx = 0; cat_idx < categories.count(); ++cat_idx ){ + int cat = categories[cat_idx]; + if ( cat == -1 || cat == 0 ){ + // Unfiled. Check next category if list is not empty. + // Else: take it as we will not filter unfiled events.. + if ( !event.categories().isEmpty() ) + continue; + else + catPassed = true; + } else { + if ( !event.categories().contains( cat ) ) + continue; + else{ + catPassed = true; + break; + } + } + } + } + + // Continue to next event if the category filter removed this item + if ( !catPassed ) + continue; + + vector.insert( item++, event ); + } + + // Now sort the vector and return the list of UID's + vector.resize( item ); + vector.sort(); + + UIDArray array( vector.count() ); + for ( uint i= 0; i < vector.count(); i++ ) + array[i] = vector.uidAt( i ); + + return array; + } OPimBackendOccurrence::List ODateBookAccessBackend::filterOccurrences( const OPimBackendOccurrence::List dayList, 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 @@ -46,6 +46,31 @@ namespace Opie { */ class ODateBookAccess : public OPimAccessTemplate { public: + /** + * Filter for sorted() + * @see SortFilterBase in OPimBase + */ + enum SortFilter { + + }; + + /** + * Sort order for sorted() + * @see SortOrderBase in OPimBase + */ + enum SortOrder { + SortDescription = SortCustom, + SortLocation, + SortNote, + SortStartTime, + SortEndTime, + SortStartDate, + SortEndDate, + SortStartDateTime, + SortEndDateTime, + SortAlarmDateTime, + }; + ODateBookAccess( ODateBookAccessBackend* = 0l, enum Access acc = Random ); ~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 @@ +/* + This file is part of the Opie Project + Copyright (C) 2004 Stefan Eilers + =. Copyright (C) The Opie Team + .=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_,=:_. -`: 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 +#include +#include + +#include + +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( 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 + =. Copyright (C) The Opie Team + .=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_,=:_. -`: 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 +#include + +namespace Opie { +namespace Internal { +class OPimEventSortVector : public OPimSortVector { +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 @@ -53,6 +53,9 @@ public: 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; @@ -120,6 +123,7 @@ inline int OPimSortVector::testString( const QString& left, return QString::compare( left, right ); } + template inline int OPimSortVector::testDate( const QDate& left, const QDate& right )const { @@ -132,6 +136,36 @@ inline int OPimSortVector::testDate( const QDate& left, return ret; } + +template +inline int OPimSortVector::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 +inline int OPimSortVector::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; + +} + } } 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 @@ -33,6 +33,7 @@ namespace Opie { namespace Internal { +namespace{ inline QString string( const OPimTodo& todo) { return todo.summary().isEmpty() ? todo.description().left(20 ) : @@ -69,6 +70,7 @@ inline int deadline( const OPimTodo& t1, const OPimTodo& t2) { return ret; } +} OPimTodoSortVector::OPimTodoSortVector( uint size, bool asc, int sort ) : OPimSortVector( size, asc, 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,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 -- cgit v0.9.0.2