summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--libopie/pim/orecordlist.h7
-rw-r--r--libopie/pim/otodo.cpp1
-rw-r--r--libopie/pim/otodoaccess.cpp8
-rw-r--r--libopie/pim/otodoaccess.h16
-rw-r--r--libopie/pim/otodoaccessbackend.h2
-rw-r--r--libopie/pim/otodoaccessxml.cpp145
-rw-r--r--libopie/pim/otodoaccessxml.h2
-rw-r--r--libopie2/opiepim/backend/otodoaccessbackend.h2
-rw-r--r--libopie2/opiepim/backend/otodoaccessxml.cpp145
-rw-r--r--libopie2/opiepim/backend/otodoaccessxml.h2
-rw-r--r--libopie2/opiepim/core/otodoaccess.cpp8
-rw-r--r--libopie2/opiepim/core/otodoaccess.h16
-rw-r--r--libopie2/opiepim/orecordlist.h7
-rw-r--r--libopie2/opiepim/otodo.cpp1
14 files changed, 356 insertions, 6 deletions
diff --git a/libopie/pim/orecordlist.h b/libopie/pim/orecordlist.h
index c63d813..1fd0741 100644
--- a/libopie/pim/orecordlist.h
+++ b/libopie/pim/orecordlist.h
@@ -107,6 +107,7 @@ public:
*/
uint count()const;
+ T operator[]( uint i );
// FIXME implemenent remove
/*
ConstIterator begin()const;
@@ -146,7 +147,7 @@ ORecordListIterator<T> &ORecordListIterator<T>::operator=( const ORecordListIter
m_current = it.m_current;
m_temp = it.m_temp;
m_end = it.m_end;
-// m_record = it.m_record;
+ m_record = it.m_record;
return *this;
}
@@ -252,4 +253,8 @@ template <class T>
uint ORecordList<T>::count()const {
return m_ids.count();
}
+template <class T>
+T ORecordList<T>::operator[]( uint i ) {
+ return m_acc->find( m_ids[i] );
+}
#endif
diff --git a/libopie/pim/otodo.cpp b/libopie/pim/otodo.cpp
index 6dd4c0e..eb9dad3 100644
--- a/libopie/pim/otodo.cpp
+++ b/libopie/pim/otodo.cpp
@@ -172,6 +172,7 @@ void OTodo::setSummary( const QString& sum )
}
void OTodo::setPriority(int prio )
{
+ qWarning("set priority %d", prio);
changeOrModify();
data->priority = prio;
}
diff --git a/libopie/pim/otodoaccess.cpp b/libopie/pim/otodoaccess.cpp
index 8ec09bc..f51da29 100644
--- a/libopie/pim/otodoaccess.cpp
+++ b/libopie/pim/otodoaccess.cpp
@@ -68,4 +68,10 @@ void OTodoAccess::delAlarm( int uid) {
"QPE/Application/todolist",
"alarm(QDateTime,int)", uid );
}
-
+/* sort order */
+OTodoAccess::List OTodoAccess::sorted( bool ascending, int sort,int filter, int cat ) {
+ QArray<int> ints = m_todoBackEnd->sorted( ascending, sort,
+ filter, cat );
+ OTodoAccess::List list( ints, this );
+ return list;
+}
diff --git a/libopie/pim/otodoaccess.h b/libopie/pim/otodoaccess.h
index c43efe9..12997aa 100644
--- a/libopie/pim/otodoaccess.h
+++ b/libopie/pim/otodoaccess.h
@@ -17,10 +17,17 @@
class OTodoAccess : public QObject, public OPimAccessTemplate<OTodo> {
Q_OBJECT
public:
+ enum SortOrder { Completed = 0,
+ Priority,
+ Description,
+ Deadline };
+ enum SortFilter{ ShowOverdue = 0,
+ Category =1,
+ OnlyOverDue= 2 };
/**
* if you use 0l
* the default resource will be
- * icked up
+ * picked up
*/
OTodoAccess( OTodoAccessBackend* = 0l);
~OTodoAccess();
@@ -48,6 +55,12 @@ public:
* return overdue OTodos
*/
List overDue();
+
+ /**
+ *
+ */
+ List sorted( bool ascending, int sortOrder, int sortFilter, int cat );
+
/**
* merge a list of OTodos into
* the resource
@@ -71,6 +84,7 @@ signals:
*/
void signalChanged( const OTodoAccess* );
private:
+ int m_cat;
OTodoAccessBackend* m_todoBackEnd;
class OTodoAccessPrivate;
OTodoAccessPrivate* d;
diff --git a/libopie/pim/otodoaccessbackend.h b/libopie/pim/otodoaccessbackend.h
index ebe2189..3bad6b7 100644
--- a/libopie/pim/otodoaccessbackend.h
+++ b/libopie/pim/otodoaccessbackend.h
@@ -12,6 +12,8 @@ public:
const QDate& end,
bool includeNoDates ) = 0;
virtual QArray<int> overDue() = 0;
+ virtual QArray<int> sorted( bool asc, int sortOrder, int sortFilter,
+ int cat ) = 0;
};
diff --git a/libopie/pim/otodoaccessxml.cpp b/libopie/pim/otodoaccessxml.cpp
index 5fe733c..692483e 100644
--- a/libopie/pim/otodoaccessxml.cpp
+++ b/libopie/pim/otodoaccessxml.cpp
@@ -1,4 +1,5 @@
#include <qfile.h>
+#include <qvector.h>
#include <qpe/global.h>
#include <qpe/stringutil.h>
@@ -256,6 +257,7 @@ OTodo OTodoAccessXML::todo( QAsciiDict<int>* dict, Opie::XMLElement* element)con
ev.setSummary( it.data() );
break;
case OTodo::Priority:
+ qWarning("ParsePriority " + it.data() );
ev.setPriority( it.data().toInt() );
break;
case OTodo::DateDay:
@@ -364,3 +366,146 @@ QString OTodoAccessXML::toString( const OTodo& ev )const {
QString OTodoAccessXML::toString( const QArray<int>& ints ) const {
return Qtopia::Record::idsToString( ints );
}
+
+/* internal class for sorting */
+
+struct OTodoXMLContainer {
+ OTodo todo;
+};
+ /*
+ * 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
+ *
+ */
+class OTodoXMLVector : public QVector<OTodoXMLContainer> {
+public:
+ OTodoXMLVector(int size, bool asc, int sort)
+ : QVector<OTodoXMLContainer>( size )
+ {
+ setAutoDelete( true );
+ m_asc = asc;
+ m_sort = sort;
+ }
+ /* return the summary/description */
+ QString string( const OTodo& todo) {
+ return todo.summary().isEmpty() ?
+ todo.description().left(20 ) :
+ todo.summary();
+ }
+ /**
+ * we take the sortorder( switch on it )
+ *
+ */
+ int compareItems( Item d1, Item d2 ) {
+ qWarning("compare items");
+ int ret =0;
+ OTodoXMLContainer* con1 = (OTodoXMLContainer*)d1;
+ OTodoXMLContainer* con2 = (OTodoXMLContainer*)d2;
+
+ /* same item */
+ if ( con1->todo.uid() == con2->todo.uid() )
+ return 0;
+ qWarning("m_sort %d", m_sort );
+
+ switch ( m_sort ) {
+ /* completed */
+ case 0: {
+ ret = 0;
+ if ( con1->todo.isCompleted() ) ret++;
+ if ( con2->todo.isCompleted() ) ret--;
+ break;
+ }
+ /* priority */
+ case 1: {
+ ret = con1->todo.priority() - con2->todo.priority();
+ qWarning(" priority %d %d %d", ret,
+ con1->todo.priority(),
+ con2->todo.priority()
+ );
+ break;
+ }
+ /* description */
+ case 2: {
+ QString str1 = string( con1->todo );
+ QString str2 = string( con2->todo );
+ ret = QString::compare( str1, str2 );
+ break;
+ }
+ /* deadline */
+ case 3: {
+ /* either bot got a dueDate
+ * or one of them got one
+ */
+ if ( con1->todo.hasDueDate() &&
+ con2->todo.hasDueDate() )
+ ret = con1->todo.dueDate().daysTo( con2->todo.dueDate() );
+ else if ( con1->todo.hasDueDate() )
+ ret = -1;
+ else if ( con2->todo.hasDueDate() )
+ ret = 0;
+ break;
+ }
+ default:
+ ret = 0;
+ break;
+ };
+
+ /* twist it we're not ascending*/
+ if (!m_asc)
+ ret = ret * -1;
+ return ret;
+ }
+ private:
+ bool m_asc;
+ int m_sort;
+
+};
+
+QArray<int> OTodoAccessXML::sorted( bool asc, int sortOrder,
+ int sortFilter, int cat ) {
+ OTodoXMLVector vector(m_events.count(), asc,sortOrder );
+ QMap<int, OTodo>::Iterator it;
+ int item = 0;
+
+ bool bCat = sortFilter & 1 ? true : false;
+ bool bOver = sortFilter & 0 ? true : false;
+ bool bOnly = split & 2 ? true : false;
+ for ( it = m_events.begin(); it != m_events.end(); ++it ) {
+
+ /* show category */
+ if ( bCat )
+ if (!(*it).categories().contains( cat ) )
+ continue;
+ /* isOverdue but we should not show overdue */
+ if ( (*it).isOverdue() && ( !bOver || !bOnly ) )
+ continue;
+ if ( !(*it).isOverdue() && bOnly )
+ continue;
+
+
+ OTodoXMLContainer* con = new OTodoXMLContainer();
+ con->todo = (*it);
+ vector.insert(item, con );
+ item++;
+ }
+ vector.resize( item );
+ /* sort it now */
+ vector.sort();
+ /* now get the uids */
+ QArray<int> array( vector.count() );
+ for (uint i= 0; i < vector.count(); i++ ) {
+ array[i] = ( vector.at(i) )->todo.uid();
+ }
+ return array;
+};
diff --git a/libopie/pim/otodoaccessxml.h b/libopie/pim/otodoaccessxml.h
index be9109d..6886bab 100644
--- a/libopie/pim/otodoaccessxml.h
+++ b/libopie/pim/otodoaccessxml.h
@@ -36,6 +36,8 @@ public:
const QDate& end,
bool includeNoDates );
QArray<int> overDue();
+ QArray<int> sorted( bool asc, int sortOrder,
+ int sortFilter, int cat );
private:
OTodo todo( QAsciiDict<int>*, Opie::XMLElement* )const;
QString toString( const OTodo& )const;
diff --git a/libopie2/opiepim/backend/otodoaccessbackend.h b/libopie2/opiepim/backend/otodoaccessbackend.h
index ebe2189..3bad6b7 100644
--- a/libopie2/opiepim/backend/otodoaccessbackend.h
+++ b/libopie2/opiepim/backend/otodoaccessbackend.h
@@ -12,6 +12,8 @@ public:
const QDate& end,
bool includeNoDates ) = 0;
virtual QArray<int> overDue() = 0;
+ virtual QArray<int> sorted( bool asc, int sortOrder, int sortFilter,
+ int cat ) = 0;
};
diff --git a/libopie2/opiepim/backend/otodoaccessxml.cpp b/libopie2/opiepim/backend/otodoaccessxml.cpp
index 5fe733c..692483e 100644
--- a/libopie2/opiepim/backend/otodoaccessxml.cpp
+++ b/libopie2/opiepim/backend/otodoaccessxml.cpp
@@ -1,4 +1,5 @@
#include <qfile.h>
+#include <qvector.h>
#include <qpe/global.h>
#include <qpe/stringutil.h>
@@ -256,6 +257,7 @@ OTodo OTodoAccessXML::todo( QAsciiDict<int>* dict, Opie::XMLElement* element)con
ev.setSummary( it.data() );
break;
case OTodo::Priority:
+ qWarning("ParsePriority " + it.data() );
ev.setPriority( it.data().toInt() );
break;
case OTodo::DateDay:
@@ -364,3 +366,146 @@ QString OTodoAccessXML::toString( const OTodo& ev )const {
QString OTodoAccessXML::toString( const QArray<int>& ints ) const {
return Qtopia::Record::idsToString( ints );
}
+
+/* internal class for sorting */
+
+struct OTodoXMLContainer {
+ OTodo todo;
+};
+ /*
+ * 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
+ *
+ */
+class OTodoXMLVector : public QVector<OTodoXMLContainer> {
+public:
+ OTodoXMLVector(int size, bool asc, int sort)
+ : QVector<OTodoXMLContainer>( size )
+ {
+ setAutoDelete( true );
+ m_asc = asc;
+ m_sort = sort;
+ }
+ /* return the summary/description */
+ QString string( const OTodo& todo) {
+ return todo.summary().isEmpty() ?
+ todo.description().left(20 ) :
+ todo.summary();
+ }
+ /**
+ * we take the sortorder( switch on it )
+ *
+ */
+ int compareItems( Item d1, Item d2 ) {
+ qWarning("compare items");
+ int ret =0;
+ OTodoXMLContainer* con1 = (OTodoXMLContainer*)d1;
+ OTodoXMLContainer* con2 = (OTodoXMLContainer*)d2;
+
+ /* same item */
+ if ( con1->todo.uid() == con2->todo.uid() )
+ return 0;
+ qWarning("m_sort %d", m_sort );
+
+ switch ( m_sort ) {
+ /* completed */
+ case 0: {
+ ret = 0;
+ if ( con1->todo.isCompleted() ) ret++;
+ if ( con2->todo.isCompleted() ) ret--;
+ break;
+ }
+ /* priority */
+ case 1: {
+ ret = con1->todo.priority() - con2->todo.priority();
+ qWarning(" priority %d %d %d", ret,
+ con1->todo.priority(),
+ con2->todo.priority()
+ );
+ break;
+ }
+ /* description */
+ case 2: {
+ QString str1 = string( con1->todo );
+ QString str2 = string( con2->todo );
+ ret = QString::compare( str1, str2 );
+ break;
+ }
+ /* deadline */
+ case 3: {
+ /* either bot got a dueDate
+ * or one of them got one
+ */
+ if ( con1->todo.hasDueDate() &&
+ con2->todo.hasDueDate() )
+ ret = con1->todo.dueDate().daysTo( con2->todo.dueDate() );
+ else if ( con1->todo.hasDueDate() )
+ ret = -1;
+ else if ( con2->todo.hasDueDate() )
+ ret = 0;
+ break;
+ }
+ default:
+ ret = 0;
+ break;
+ };
+
+ /* twist it we're not ascending*/
+ if (!m_asc)
+ ret = ret * -1;
+ return ret;
+ }
+ private:
+ bool m_asc;
+ int m_sort;
+
+};
+
+QArray<int> OTodoAccessXML::sorted( bool asc, int sortOrder,
+ int sortFilter, int cat ) {
+ OTodoXMLVector vector(m_events.count(), asc,sortOrder );
+ QMap<int, OTodo>::Iterator it;
+ int item = 0;
+
+ bool bCat = sortFilter & 1 ? true : false;
+ bool bOver = sortFilter & 0 ? true : false;
+ bool bOnly = split & 2 ? true : false;
+ for ( it = m_events.begin(); it != m_events.end(); ++it ) {
+
+ /* show category */
+ if ( bCat )
+ if (!(*it).categories().contains( cat ) )
+ continue;
+ /* isOverdue but we should not show overdue */
+ if ( (*it).isOverdue() && ( !bOver || !bOnly ) )
+ continue;
+ if ( !(*it).isOverdue() && bOnly )
+ continue;
+
+
+ OTodoXMLContainer* con = new OTodoXMLContainer();
+ con->todo = (*it);
+ vector.insert(item, con );
+ item++;
+ }
+ vector.resize( item );
+ /* sort it now */
+ vector.sort();
+ /* now get the uids */
+ QArray<int> array( vector.count() );
+ for (uint i= 0; i < vector.count(); i++ ) {
+ array[i] = ( vector.at(i) )->todo.uid();
+ }
+ return array;
+};
diff --git a/libopie2/opiepim/backend/otodoaccessxml.h b/libopie2/opiepim/backend/otodoaccessxml.h
index be9109d..6886bab 100644
--- a/libopie2/opiepim/backend/otodoaccessxml.h
+++ b/libopie2/opiepim/backend/otodoaccessxml.h
@@ -36,6 +36,8 @@ public:
const QDate& end,
bool includeNoDates );
QArray<int> overDue();
+ QArray<int> sorted( bool asc, int sortOrder,
+ int sortFilter, int cat );
private:
OTodo todo( QAsciiDict<int>*, Opie::XMLElement* )const;
QString toString( const OTodo& )const;
diff --git a/libopie2/opiepim/core/otodoaccess.cpp b/libopie2/opiepim/core/otodoaccess.cpp
index 8ec09bc..f51da29 100644
--- a/libopie2/opiepim/core/otodoaccess.cpp
+++ b/libopie2/opiepim/core/otodoaccess.cpp
@@ -68,4 +68,10 @@ void OTodoAccess::delAlarm( int uid) {
"QPE/Application/todolist",
"alarm(QDateTime,int)", uid );
}
-
+/* sort order */
+OTodoAccess::List OTodoAccess::sorted( bool ascending, int sort,int filter, int cat ) {
+ QArray<int> ints = m_todoBackEnd->sorted( ascending, sort,
+ filter, cat );
+ OTodoAccess::List list( ints, this );
+ return list;
+}
diff --git a/libopie2/opiepim/core/otodoaccess.h b/libopie2/opiepim/core/otodoaccess.h
index c43efe9..12997aa 100644
--- a/libopie2/opiepim/core/otodoaccess.h
+++ b/libopie2/opiepim/core/otodoaccess.h
@@ -17,10 +17,17 @@
class OTodoAccess : public QObject, public OPimAccessTemplate<OTodo> {
Q_OBJECT
public:
+ enum SortOrder { Completed = 0,
+ Priority,
+ Description,
+ Deadline };
+ enum SortFilter{ ShowOverdue = 0,
+ Category =1,
+ OnlyOverDue= 2 };
/**
* if you use 0l
* the default resource will be
- * icked up
+ * picked up
*/
OTodoAccess( OTodoAccessBackend* = 0l);
~OTodoAccess();
@@ -48,6 +55,12 @@ public:
* return overdue OTodos
*/
List overDue();
+
+ /**
+ *
+ */
+ List sorted( bool ascending, int sortOrder, int sortFilter, int cat );
+
/**
* merge a list of OTodos into
* the resource
@@ -71,6 +84,7 @@ signals:
*/
void signalChanged( const OTodoAccess* );
private:
+ int m_cat;
OTodoAccessBackend* m_todoBackEnd;
class OTodoAccessPrivate;
OTodoAccessPrivate* d;
diff --git a/libopie2/opiepim/orecordlist.h b/libopie2/opiepim/orecordlist.h
index c63d813..1fd0741 100644
--- a/libopie2/opiepim/orecordlist.h
+++ b/libopie2/opiepim/orecordlist.h
@@ -107,6 +107,7 @@ public:
*/
uint count()const;
+ T operator[]( uint i );
// FIXME implemenent remove
/*
ConstIterator begin()const;
@@ -146,7 +147,7 @@ ORecordListIterator<T> &ORecordListIterator<T>::operator=( const ORecordListIter
m_current = it.m_current;
m_temp = it.m_temp;
m_end = it.m_end;
-// m_record = it.m_record;
+ m_record = it.m_record;
return *this;
}
@@ -252,4 +253,8 @@ template <class T>
uint ORecordList<T>::count()const {
return m_ids.count();
}
+template <class T>
+T ORecordList<T>::operator[]( uint i ) {
+ return m_acc->find( m_ids[i] );
+}
#endif
diff --git a/libopie2/opiepim/otodo.cpp b/libopie2/opiepim/otodo.cpp
index 6dd4c0e..eb9dad3 100644
--- a/libopie2/opiepim/otodo.cpp
+++ b/libopie2/opiepim/otodo.cpp
@@ -172,6 +172,7 @@ void OTodo::setSummary( const QString& sum )
}
void OTodo::setPriority(int prio )
{
+ qWarning("set priority %d", prio);
changeOrModify();
data->priority = prio;
}