-rw-r--r-- | include/opie/tododb.h | 40 | ||||
-rw-r--r-- | include/opie/todoevent.h | 52 | ||||
-rw-r--r-- | libopie/libopie.pro | 2 | ||||
-rw-r--r-- | libopie/tododb.cpp | 196 | ||||
-rw-r--r-- | libopie/tododb.h | 40 | ||||
-rw-r--r-- | libopie/todoevent.cpp | 150 | ||||
-rw-r--r-- | libopie/todoevent.h | 52 |
7 files changed, 531 insertions, 1 deletions
diff --git a/include/opie/tododb.h b/include/opie/tododb.h new file mode 100644 index 0000000..6478363 --- a/dev/null +++ b/include/opie/tododb.h @@ -0,0 +1,40 @@ + +#ifndef tododb_h +#define tododb_h + +#include <qvaluelist.h> + +#include <opie/todoevent.h> + +class ToDoDB +{ + public: + // if no argument is supplied pick the default book + ToDoDB(const QString &fileName = QString::null ); + ~ToDoDB(); + QValueList<ToDoEvent> effectiveToDos(const QDate &from, + const QDate &to, + bool includeNoDates = true); + QValueList<ToDoEvent> effectiveToDos(const QDate &start, bool includeNoDates = true ); + QValueList<ToDoEvent> rawToDos(); // all events + QValueList<ToDoEvent> overDue(); + + void addEvent(const ToDoEvent &event ); + void editEvent(const ToDoEvent &editEvent ); + void removeEvent(const ToDoEvent &event); + + void reload(); + void setFileName(const QString & ); + QString fileName()const; + bool save(); + + private: + class ToDoDBPrivate; + ToDoDBPrivate *d; + QString m_fileName; + QValueList<ToDoEvent> m_todos; + void load(); +}; + + +#endif diff --git a/include/opie/todoevent.h b/include/opie/todoevent.h new file mode 100644 index 0000000..dd8c0c9 --- a/dev/null +++ b/include/opie/todoevent.h @@ -0,0 +1,52 @@ + +#ifndef todoevent_h +#define todoevent_h + +#include <qdatetime.h> + +class ToDoEvent { + friend class ToDoDB; + public: + enum Priority { VERYHIGH=1, HIGH, NORMAL, LOW, VERYLOW }; + ToDoEvent( bool completed = false, int priority = NORMAL, + const QString &category = QString::null, + const QString &description = QString::null , + bool hasDate = false, QDate date = QDate::currentDate(), int uid = -1 ); + bool isCompleted() const; + bool hasDate() const; + int priority()const ; + QString category()const; + QDate date()const; + QString description()const; + + int uid()const { return m_uid;}; + void setCompleted(bool completed ); + void setHasDate( bool hasDate ); + // if the category doesn't exist we will create it + void setCategory( const QString &category ); + void setPriority(int priority ); + void setDate( QDate date ); + void setDescription(const QString& ); + bool isOverdue(); + + bool operator<(const ToDoEvent &toDoEvent )const; + bool operator<=(const ToDoEvent &toDoEvent )const; + bool operator!=(const ToDoEvent &toDoEvent )const { return !(*this == toDoEvent); }; + bool operator>(const ToDoEvent &toDoEvent )const; + bool operator>=(const ToDoEvent &toDoEvent)const; + bool operator==(const ToDoEvent &toDoEvent )const; + ToDoEvent &operator=(const ToDoEvent &toDoEvent ); + private: + class ToDoEventPrivate; + ToDoEventPrivate *d; + QDate m_date; + bool m_isCompleted:1; + bool m_hasDate:1; + int m_priority; + QString m_category; + QString m_desc; + int m_uid; +}; + + +#endif diff --git a/libopie/libopie.pro b/libopie/libopie.pro index 95ec145..fb00422 100644 --- a/libopie/libopie.pro +++ b/libopie/libopie.pro @@ -2,5 +2,5 @@ TEMPLATE = lib CONFIG += qte warn_on release HEADERS = $(OPIEDIR)/include/opie/xmltree.h -SOURCES = xmltree.cc +SOURCES = xmltree.cc tododb.cpp todoevent.cpp TARGET = opie INCLUDEPATH += $(OPIEDIR)/include diff --git a/libopie/tododb.cpp b/libopie/tododb.cpp new file mode 100644 index 0000000..eb17674 --- a/dev/null +++ b/libopie/tododb.cpp @@ -0,0 +1,196 @@ + +#include <qdir.h> +#include <opie/tododb.h> +#include <opie/xmltree.h> +#include <qpe/palmtoprecord.h> +#include <qpe/global.h> + +ToDoDB::ToDoDB(const QString &fileName = QString::null ){ + m_fileName = fileName; + if( fileName.isEmpty() ){ + m_fileName = Global::applicationFileName("todolist","todolist.xml");; + qWarning("%s", m_fileName.latin1() ); + } + + load(); +} +ToDoDB::~ToDoDB() +{ + +} +QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from, const QDate &to, + bool all ) +{ + QValueList<ToDoEvent> events; + for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){ + if( (*it).hasDate() ){ + if( (*it).date() >= from && (*it).date() <= to ) + events.append( (*it) ); + }else if( all ){ + events.append( (*it) ); + } + } + return events; +} +QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from, + bool all) +{ + return effectiveToDos( from, QDate::currentDate(), all ); +} +QValueList<ToDoEvent> ToDoDB::overDue() +{ + QValueList<ToDoEvent> events; + for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){ + if( (*it).isOverdue() ) + events.append((*it) ); + } + return events; +} +QValueList<ToDoEvent> ToDoDB::rawToDos() +{ + return m_todos; +} +void ToDoDB::addEvent( const ToDoEvent &event ) +{ + m_todos.append( event ); +} +void ToDoDB::editEvent( const ToDoEvent &event ) +{ + m_todos.remove( event ); + m_todos.append( event ); +} +void ToDoDB::removeEvent( const ToDoEvent &event ) +{ + m_todos.remove( event ); +} +void ToDoDB::reload() +{ + load(); +} +void ToDoDB::setFileName(const QString &file ) +{ + m_fileName =file; +} +QString ToDoDB::fileName()const +{ + return m_fileName; +} +void ToDoDB::load() +{ + qWarning("loading tododb" ); + m_todos.clear(); + XMLElement *root = XMLElement::load( m_fileName ); + if(root != 0l ){ // start parsing + qWarning("ToDoDB::load tagName(): %s", root->tagName().latin1() ); + //if( root->tagName() == QString::fromLatin1("Tasks" ) ){// Start + XMLElement *element = root->firstChild(); + element = element->firstChild(); + while( element ){ + qWarning("ToDoDB::load element tagName() : %s", element->tagName().latin1() ); + QString dummy; + ToDoEvent event; + bool ok; + int dumInt; + // completed + dummy = element->attribute("Completed" ); + dumInt = dummy.toInt(&ok ); + if(ok ) event.setCompleted( dumInt == 0 ? false : true ); + // hasDate + dummy = element->attribute("HasDate" ); + dumInt = dummy.toInt(&ok ); + if(ok ) event.setHasDate( dumInt == 0 ? false: true ); + // set the date + bool hasDa = dumInt; + if ( hasDa ) { //parse the date + int year, day, month = 0; + year = day = month; + // year + dummy = element->attribute("DateYear" ); + dumInt = dummy.toInt(&ok ); + if( ok ) year = dumInt; + // month + dummy = element->attribute("DateMonth" ); + dumInt = dummy.toInt(&ok ); + if(ok ) month = dumInt; + dummy = element->attribute("DateDay" ); + dumInt = dummy.toInt(&ok ); + if(ok ) day = dumInt; + // set the date + QDate date( year, month, day ); + event.setDate( date); + } + dummy = element->attribute("Priority" ); + dumInt = dummy.toInt(&ok ); + if(!ok ) dumInt = ToDoEvent::NORMAL; + event.setPriority( dumInt ); + //description + dummy = element->attribute("Description" ); + event.setDescription( dummy ); + // category + dummy = element->attribute("Categories" ); + dumInt = dummy.toInt(&ok ); + if(ok ) { + QArray<int> arrat(1); + arrat[0] = dumInt; + event.setCategory( Qtopia::Record::idsToString( arrat ) ); + } + //uid + dummy = element->attribute("Uid" ); + dumInt = dummy.toInt(&ok ); + if(ok ) event.m_uid = dumInt; + m_todos.append( event ); + element = element->nextChild(); // next element + } + //} + }else { + qWarning("could not load" ); + } + delete root; +} +bool ToDoDB::save() +{ +// prepare the XML + XMLElement *tasks = new XMLElement( ); + tasks->setTagName("Tasks" ); + for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it != m_todos.end(); ++it ){ + XMLElement::AttributeMap map; + XMLElement *task = new XMLElement(); + map.insert( "Completed", QString::number((int)(*it).isCompleted() ) ); + map.insert( "HasDate", QString::number((int)(*it).hasDate() ) ); + map.insert( "Priority", QString::number( (*it).priority() ) ); + if(!(*it).category().isEmpty() ){ + QArray<int> arrat(1); + arrat = Qtopia::Record::idsFromString( (*it).category() ); + map.insert( "Categories", QString::number( arrat[0] ) ); + }else + map.insert( "Categories", QString::null ); + map.insert( "Description", (*it).description() ); + if( (*it).hasDate() ){ + map.insert("DateYear", QString::number( (*it).date().year() ) ); + map.insert("DateMonth", QString::number( (*it).date().month() ) ); + map.insert("DateDay", QString::number( (*it).date().day() ) ); + } + map.insert("Uid", QString::number( (*it).uid() ) ); + task->setTagName("Task" ); + task->setAttributes( map ); + tasks->appendChild(task); + } + QFile file( m_fileName); + if( file.open(IO_WriteOnly ) ){ + QTextStream stream(&file ); + stream << "<!DOCTYPE Tasks>" << endl; + tasks->save(stream ); + delete tasks; + file.close(); + return true; + } + return false; +} + + + + + + + + diff --git a/libopie/tododb.h b/libopie/tododb.h new file mode 100644 index 0000000..6478363 --- a/dev/null +++ b/libopie/tododb.h @@ -0,0 +1,40 @@ + +#ifndef tododb_h +#define tododb_h + +#include <qvaluelist.h> + +#include <opie/todoevent.h> + +class ToDoDB +{ + public: + // if no argument is supplied pick the default book + ToDoDB(const QString &fileName = QString::null ); + ~ToDoDB(); + QValueList<ToDoEvent> effectiveToDos(const QDate &from, + const QDate &to, + bool includeNoDates = true); + QValueList<ToDoEvent> effectiveToDos(const QDate &start, bool includeNoDates = true ); + QValueList<ToDoEvent> rawToDos(); // all events + QValueList<ToDoEvent> overDue(); + + void addEvent(const ToDoEvent &event ); + void editEvent(const ToDoEvent &editEvent ); + void removeEvent(const ToDoEvent &event); + + void reload(); + void setFileName(const QString & ); + QString fileName()const; + bool save(); + + private: + class ToDoDBPrivate; + ToDoDBPrivate *d; + QString m_fileName; + QValueList<ToDoEvent> m_todos; + void load(); +}; + + +#endif diff --git a/libopie/todoevent.cpp b/libopie/todoevent.cpp new file mode 100644 index 0000000..4cfe1c0 --- a/dev/null +++ b/libopie/todoevent.cpp @@ -0,0 +1,150 @@ + +#include <opie/todoevent.h> +#include <qpe/palmtopuidgen.h> + +ToDoEvent::ToDoEvent(bool completed, int priority, const QString &category, + const QString &description, bool hasDate, QDate date, int uid ) +{ + qWarning("todoEvent c'tor" ); + m_date = date; + m_isCompleted = completed; + m_hasDate = hasDate; + m_priority = priority; + m_category = category; + m_desc = description; + if (uid == -1 ) { + Qtopia::UidGen *uidgen = new Qtopia::UidGen(); + uid = uidgen->generate(); + delete uidgen; + }// generate the ids + m_uid = uid; +} +bool ToDoEvent::isCompleted() const +{ + return m_isCompleted; +} +bool ToDoEvent::hasDate() const +{ + return m_hasDate; +} +int ToDoEvent::priority()const +{ + return m_priority; +} +QString ToDoEvent::category()const +{ + return m_category; +} +QDate ToDoEvent::date()const +{ + return m_date; +} +QString ToDoEvent::description()const +{ + return m_desc; +} +void ToDoEvent::setCompleted( bool completed ) +{ + m_isCompleted = completed; +} +void ToDoEvent::setHasDate( bool hasDate ) +{ + m_hasDate = hasDate; +} +void ToDoEvent::setDescription(const QString &desc ) +{ + m_desc = desc; +} +void ToDoEvent::setCategory( const QString &cat ) +{ + m_category = cat; +} +void ToDoEvent::setPriority(int prio ) +{ + m_priority = prio; +} +void ToDoEvent::setDate( QDate date ) +{ + m_date = date; +} +bool ToDoEvent::isOverdue( ) +{ + if( m_hasDate ) + return QDate::currentDate() > m_date; + return false; +} +bool ToDoEvent::operator<( const ToDoEvent &toDoEvent )const{ + if( !hasDate() && !toDoEvent.hasDate() ) return true; + if( !hasDate() && toDoEvent.hasDate() ) return true; + if( hasDate() && toDoEvent.hasDate() ){ + if( date() == toDoEvent.date() ){ // let's the priority decide + return priority() < toDoEvent.priority(); + }else{ + return date() < toDoEvent.date(); + } + } + return false; +} +bool ToDoEvent::operator<=(const ToDoEvent &toDoEvent )const +{ + if( !hasDate() && !toDoEvent.hasDate() ) return true; + if( !hasDate() && toDoEvent.hasDate() ) return true; + if( hasDate() && toDoEvent.hasDate() ){ + if( date() == toDoEvent.date() ){ // let's the priority decide + return priority() <= toDoEvent.priority(); + }else{ + return date() <= toDoEvent.date(); + } + } + return true; +} +bool ToDoEvent::operator>(const ToDoEvent &toDoEvent )const +{ + if( !hasDate() && !toDoEvent.hasDate() ) return false; + if( !hasDate() && toDoEvent.hasDate() ) return false; + if( hasDate() && toDoEvent.hasDate() ){ + if( date() == toDoEvent.date() ){ // let's the priority decide + return priority() > toDoEvent.priority(); + }else{ + return date() > toDoEvent.date(); + } + } + return false; +} +bool ToDoEvent::operator>=(const ToDoEvent &toDoEvent )const +{ + if( !hasDate() && !toDoEvent.hasDate() ) return true; + if( !hasDate() && toDoEvent.hasDate() ) return false; + if( hasDate() && toDoEvent.hasDate() ){ + if( date() == toDoEvent.date() ){ // let's the priority decide + return priority() > toDoEvent.priority(); + }else{ + return date() > toDoEvent.date(); + } + } + return true; +} +bool ToDoEvent::operator==(const ToDoEvent &toDoEvent )const +{ + if( m_date == toDoEvent.m_date && m_isCompleted == toDoEvent.m_isCompleted && m_hasDate == toDoEvent.m_hasDate && m_priority == toDoEvent.m_priority && m_category == toDoEvent.m_category && m_desc == toDoEvent.m_category ) + return true; + return false; +} +ToDoEvent &ToDoEvent::operator=(const ToDoEvent &item ) +{ + m_date = item.m_date; + m_isCompleted = item.m_isCompleted; + m_hasDate = item.m_hasDate; + m_priority = item.m_priority; + m_category = item.m_category; + m_desc = item.m_desc; + return *this; +} + + + + + + + + diff --git a/libopie/todoevent.h b/libopie/todoevent.h new file mode 100644 index 0000000..dd8c0c9 --- a/dev/null +++ b/libopie/todoevent.h @@ -0,0 +1,52 @@ + +#ifndef todoevent_h +#define todoevent_h + +#include <qdatetime.h> + +class ToDoEvent { + friend class ToDoDB; + public: + enum Priority { VERYHIGH=1, HIGH, NORMAL, LOW, VERYLOW }; + ToDoEvent( bool completed = false, int priority = NORMAL, + const QString &category = QString::null, + const QString &description = QString::null , + bool hasDate = false, QDate date = QDate::currentDate(), int uid = -1 ); + bool isCompleted() const; + bool hasDate() const; + int priority()const ; + QString category()const; + QDate date()const; + QString description()const; + + int uid()const { return m_uid;}; + void setCompleted(bool completed ); + void setHasDate( bool hasDate ); + // if the category doesn't exist we will create it + void setCategory( const QString &category ); + void setPriority(int priority ); + void setDate( QDate date ); + void setDescription(const QString& ); + bool isOverdue(); + + bool operator<(const ToDoEvent &toDoEvent )const; + bool operator<=(const ToDoEvent &toDoEvent )const; + bool operator!=(const ToDoEvent &toDoEvent )const { return !(*this == toDoEvent); }; + bool operator>(const ToDoEvent &toDoEvent )const; + bool operator>=(const ToDoEvent &toDoEvent)const; + bool operator==(const ToDoEvent &toDoEvent )const; + ToDoEvent &operator=(const ToDoEvent &toDoEvent ); + private: + class ToDoEventPrivate; + ToDoEventPrivate *d; + QDate m_date; + bool m_isCompleted:1; + bool m_hasDate:1; + int m_priority; + QString m_category; + QString m_desc; + int m_uid; +}; + + +#endif |