-rw-r--r-- | libopie2/opiepim/backend/otodoaccessbackend.h | 2 | ||||
-rw-r--r-- | libopie2/opiepim/backend/otodoaccessxml.cpp | 145 | ||||
-rw-r--r-- | libopie2/opiepim/backend/otodoaccessxml.h | 2 | ||||
-rw-r--r-- | libopie2/opiepim/core/otodoaccess.cpp | 8 | ||||
-rw-r--r-- | libopie2/opiepim/core/otodoaccess.h | 16 | ||||
-rw-r--r-- | libopie2/opiepim/orecordlist.h | 7 | ||||
-rw-r--r-- | libopie2/opiepim/otodo.cpp | 1 |
7 files changed, 178 insertions, 3 deletions
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 @@ -3,16 +3,18 @@ #include "otodo.h" #include "opimaccessbackend.h" class OTodoAccessBackend : public OPimAccessBackend<OTodo> { public: OTodoAccessBackend(); ~OTodoAccessBackend(); virtual QArray<int> effectiveToDos( const QDate& start, const QDate& end, bool includeNoDates ) = 0; virtual QArray<int> overDue() = 0; + virtual QArray<int> sorted( bool asc, int sortOrder, int sortFilter, + int cat ) = 0; }; #endif 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,13 +1,14 @@ #include <qfile.h> +#include <qvector.h> #include <qpe/global.h> #include <qpe/stringutil.h> #include <qpe/timeconversion.h> #include <opie/xmltree.h> #include "otodoaccessxml.h" OTodoAccessXML::OTodoAccessXML( const QString& appName, const QString& fileName ) : OTodoAccessBackend(), m_app( appName ), m_opened( false ), m_changed( false ) @@ -247,24 +248,25 @@ OTodo OTodoAccessXML::todo( QAsciiDict<int>* dict, Opie::XMLElement* element)con ev.setHasDueDate( it.data().toInt() ); break; case OTodo::Completed: ev.setCompleted( it.data().toInt() ); break; case OTodo::Description: ev.setDescription( it.data() ); break; case OTodo::Summary: ev.setSummary( it.data() ); break; case OTodo::Priority: + qWarning("ParsePriority " + it.data() ); ev.setPriority( it.data().toInt() ); break; case OTodo::DateDay: day = it.data().toInt(); break; case OTodo::DateMonth: month = it.data().toInt(); break; case OTodo::DateYear: year = it.data().toInt(); break; case OTodo::Progress: @@ -355,12 +357,155 @@ QString OTodoAccessXML::toString( const OTodo& ev )const { if ( added ) str = str.remove( str.length()-1, 1 ); str += "\" "; str += "AlarmDateTime=\"" + TimeConversion::toISO8601( ev.alarmDateTime() ) + "\" "; return str; } 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 @@ -27,24 +27,26 @@ public: QArray<int> queryByExample( const OTodo&, int sort ); OTodo find( int uid )const; void clear(); bool add( const OTodo& ); bool remove( int uid ); bool replace( const OTodo& ); /* our functions */ QArray<int> effectiveToDos( const QDate& start, 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; QString toString( const QArray<int>& ints ) const; QMap<int, OTodo> m_events; QString m_file; QString m_app; bool m_opened : 1; bool m_changed : 1; class OTodoAccessXMLPrivate; OTodoAccessXMLPrivate* d; 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 @@ -59,13 +59,19 @@ void OTodoAccess::delAlarm( int uid) { QDateTime schedule; // Create null DateTime // I hope this will remove all scheduled alarms // with the given uid !? // If not: I have to rethink how to remove already // scheduled events... (se) // it should be fine -zecke // qWarning("Removing alarm for event with uid %d", uid ); AlarmServer::deleteAlarm( schedule , "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 @@ -8,28 +8,35 @@ #include "otodoaccessbackend.h" #include "opimaccesstemplate.h" /** * OTodoAccess * the class to get access to * the todolist */ 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(); /* our functions here */ /** * include todos from start to end * includeNoDates whether or not to include * events with no dates */ List effectiveToDos( const QDate& start, @@ -39,41 +46,48 @@ public: /** * start * end date taken from the currentDate() */ List effectiveToDos( const QDate& start, bool includeNoDates = true ); /** * return overdue OTodos */ List overDue(); + + /** + * + */ + List sorted( bool ascending, int sortOrder, int sortFilter, int cat ); + /** * merge a list of OTodos into * the resource */ void mergeWith( const QValueList<OTodo>& ); /** * add an Alarm to the AlarmServer */ void addAlarm( const OTodo& ); /** * delete an alarm with the uid from * the alarm server */ void delAlarm( int uid ); signals: /** * if the OTodoAccess was changed */ void signalChanged( const OTodoAccess* ); private: + int m_cat; OTodoAccessBackend* m_todoBackEnd; class OTodoAccessPrivate; OTodoAccessPrivate* d; }; #endif 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 @@ -98,24 +98,25 @@ public: Iterator begin(); /** * the end */ Iterator end(); /** * the number of items in the list */ uint count()const; + T operator[]( uint i ); // FIXME implemenent remove /* ConstIterator begin()const; ConstIterator end()const; */ private: QArray<int> m_ids; const Base* m_acc; }; /* ok now implement it */ template <class T> @@ -137,25 +138,25 @@ ORecordListIterator<T>::ORecordListIterator( const ORecordListIterator<T>& it) { m_current = it.m_current; m_temp = it.m_temp; m_end = it.m_end; m_record = it.m_record; } template <class T> ORecordListIterator<T> &ORecordListIterator<T>::operator=( const ORecordListIterator<T>& it) { m_uids = it.m_uids; 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; } template <class T> T ORecordListIterator<T>::operator*() { // qWarning("operator* %d %d", m_current, m_uids[m_current] ); if (!m_end ) /* FIXME * until the cache is in place * we do the uid match uid check */ @@ -243,13 +244,17 @@ ORecordList<T>::Iterator ORecordList<T>::begin() { template <class T> ORecordList<T>::Iterator ORecordList<T>::end() { Iterator it( m_ids, m_acc ); it.m_end = true; it.m_current = m_ids.count(); return it; } 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 @@ -163,24 +163,25 @@ void OTodo::setDescription(const QString &desc ) { // qWarning( "desc " + desc ); changeOrModify(); data->desc = Qtopia::simplifyMultiLineSpace(desc ); } void OTodo::setSummary( const QString& sum ) { changeOrModify(); data->sum = sum; } void OTodo::setPriority(int prio ) { + qWarning("set priority %d", prio); changeOrModify(); data->priority = prio; } void OTodo::setDueDate( QDate date ) { changeOrModify(); data->date = date; } void OTodo::setAlarmDateTime( const QDateTime& alarm ) { changeOrModify(); data->alarmDateTime = alarm; |