summaryrefslogtreecommitdiff
path: root/libopie2
authorzecke <zecke>2004-11-18 21:46:17 (UTC)
committer zecke <zecke>2004-11-18 21:46:17 (UTC)
commit41fa1c196965f17f9748f835d90c307b7e594883 (patch) (side-by-side diff)
tree1ea8a2cfe5bfb71f5c9456c7216dc5ff035dd811 /libopie2
parent7484344ff5be1f7c54e51715776d0e3cadeb1ed0 (diff)
downloadopie-41fa1c196965f17f9748f835d90c307b7e594883.zip
opie-41fa1c196965f17f9748f835d90c307b7e594883.tar.gz
opie-41fa1c196965f17f9748f835d90c307b7e594883.tar.bz2
Add generic sorting implementation based on QVector
for Contact and Todo
Diffstat (limited to 'libopie2') (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opiepim/private/opimcontactsortvector.cpp104
-rw-r--r--libopie2/opiepim/private/opimcontactsortvector.h48
-rw-r--r--libopie2/opiepim/private/opimoccurrence_p.h33
-rw-r--r--libopie2/opiepim/private/opimsortvector.h138
-rw-r--r--libopie2/opiepim/private/opimtodosortvector.cpp163
-rw-r--r--libopie2/opiepim/private/opimtodosortvector.h48
-rw-r--r--libopie2/opiepim/private/private.pro9
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
+