Diffstat (limited to 'noncore/unsupported/libopie/pim/otodo.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/unsupported/libopie/pim/otodo.cpp | 519 |
1 files changed, 519 insertions, 0 deletions
diff --git a/noncore/unsupported/libopie/pim/otodo.cpp b/noncore/unsupported/libopie/pim/otodo.cpp new file mode 100644 index 0000000..b2c76f8 --- a/dev/null +++ b/noncore/unsupported/libopie/pim/otodo.cpp @@ -0,0 +1,519 @@ + +#include <qobject.h> +#include <qshared.h> + + + +#include <qpe/palmtopuidgen.h> +#include <qpe/palmtoprecord.h> +#include <qpe/categories.h> +#include <qpe/categoryselect.h> +#include <qpe/stringutil.h> + + +#include "opimstate.h" +#include "orecur.h" +#include "opimmaintainer.h" +#include "opimnotifymanager.h" +#include "opimresolver.h" + +#include "otodo.h" + + +struct OTodo::OTodoData : public QShared { + OTodoData() : QShared() { + recur = 0; + state = 0; + maintainer = 0; + notifiers = 0; + }; + ~OTodoData() { + delete recur; + delete maintainer; + delete notifiers; + } + + QDate date; + bool isCompleted:1; + bool hasDate:1; + int priority; + QString desc; + QString sum; + QMap<QString, QString> extra; + ushort prog; + OPimState *state; + ORecur *recur; + OPimMaintainer *maintainer; + QDate start; + QDate completed; + OPimNotifyManager *notifiers; +}; + +OTodo::OTodo(const OTodo &event ) + : OPimRecord( event ), data( event.data ) +{ + data->ref(); +// qWarning("ref up"); +} +OTodo::~OTodo() { + +// qWarning("~OTodo " ); + if ( data->deref() ) { +// qWarning("OTodo::dereffing"); + delete data; + data = 0l; + } +} +OTodo::OTodo(bool completed, int priority, + const QArray<int> &category, + const QString& summary, + const QString &description, + ushort progress, + bool hasDate, QDate date, int uid ) + : OPimRecord( uid ) +{ +// qWarning("OTodoData " + summary); + setCategories( category ); + + data = new OTodoData; + + data->date = date; + data->isCompleted = completed; + data->hasDate = hasDate; + data->priority = priority; + data->sum = summary; + data->prog = progress; + data->desc = Qtopia::simplifyMultiLineSpace(description ); +} +OTodo::OTodo(bool completed, int priority, + const QStringList &category, + const QString& summary, + const QString &description, + ushort progress, + bool hasDate, QDate date, int uid ) + : OPimRecord( uid ) +{ +// qWarning("OTodoData" + summary); + setCategories( idsFromString( category.join(";") ) ); + + data = new OTodoData; + + data->date = date; + data->isCompleted = completed; + data->hasDate = hasDate; + data->priority = priority; + data->sum = summary; + data->prog = progress; + data->desc = Qtopia::simplifyMultiLineSpace(description ); +} +bool OTodo::match( const QRegExp ®Exp )const +{ + if( QString::number( data->priority ).find( regExp ) != -1 ){ + setLastHitField( Priority ); + return true; + }else if( data->hasDate && data->date.toString().find( regExp) != -1 ){ + setLastHitField( HasDate ); + return true; + }else if(data->desc.find( regExp ) != -1 ){ + setLastHitField( Description ); + return true; + }else if(data->sum.find( regExp ) != -1 ) { + setLastHitField( Summary ); + return true; + } + return false; +} +bool OTodo::isCompleted() const +{ + return data->isCompleted; +} +bool OTodo::hasDueDate() const +{ + return data->hasDate; +} +bool OTodo::hasStartDate()const { + return data->start.isValid(); +} +bool OTodo::hasCompletedDate()const { + return data->completed.isValid(); +} +int OTodo::priority()const +{ + return data->priority; +} +QString OTodo::summary() const +{ + return data->sum; +} +ushort OTodo::progress() const +{ + return data->prog; +} +QDate OTodo::dueDate()const +{ + return data->date; +} +QDate OTodo::startDate()const { + return data->start; +} +QDate OTodo::completedDate()const { + return data->completed; +} +QString OTodo::description()const +{ + return data->desc; +} +bool OTodo::hasState() const{ + if (!data->state ) return false; + return ( data->state->state() != OPimState::Undefined ); +} +OPimState OTodo::state()const { + if (!data->state ) { + OPimState state; + return state; + } + + return (*data->state); +} +bool OTodo::hasRecurrence()const { + if (!data->recur) return false; + return data->recur->doesRecur(); +} +ORecur OTodo::recurrence()const { + if (!data->recur) return ORecur(); + + return (*data->recur); +} +bool OTodo::hasMaintainer()const { + if (!data->maintainer) return false; + + return (data->maintainer->mode() != OPimMaintainer::Undefined ); +} +OPimMaintainer OTodo::maintainer()const { + if (!data->maintainer) return OPimMaintainer(); + + return (*data->maintainer); +} +void OTodo::setCompleted( bool completed ) +{ + changeOrModify(); + data->isCompleted = completed; +} +void OTodo::setHasDueDate( bool hasDate ) +{ + changeOrModify(); + data->hasDate = hasDate; +} +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 ) +{ + changeOrModify(); + data->priority = prio; +} +void OTodo::setDueDate( const QDate& date ) +{ + changeOrModify(); + data->date = date; +} +void OTodo::setStartDate( const QDate& date ) { + changeOrModify(); + data->start = date; +} +void OTodo::setCompletedDate( const QDate& date ) { + changeOrModify(); + data->completed = date; +} +void OTodo::setState( const OPimState& state ) { + changeOrModify(); + if (data->state ) + (*data->state) = state; + else + data->state = new OPimState( state ); +} +void OTodo::setRecurrence( const ORecur& rec) { + changeOrModify(); + if (data->recur ) + (*data->recur) = rec; + else + data->recur = new ORecur( rec ); +} +void OTodo::setMaintainer( const OPimMaintainer& pim ) { + changeOrModify(); + + if (data->maintainer ) + (*data->maintainer) = pim; + else + data->maintainer = new OPimMaintainer( pim ); +} +bool OTodo::isOverdue( ) +{ + if( data->hasDate && !data->isCompleted) + return QDate::currentDate() > data->date; + return false; +} +void OTodo::setProgress(ushort progress ) +{ + changeOrModify(); + data->prog = progress; +} +QString OTodo::toShortText() const { + return summary(); +} +/*! + Returns a richt text string +*/ +QString OTodo::toRichText() const +{ + QString text; + QStringList catlist; + + // summary + text += "<b><h3><img src=\"todo/TodoList\"> "; + if ( !summary().isEmpty() ) { + text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "" ); + } + text += "</h3></b><br><hr><br>"; + + // description + if( !description().isEmpty() ){ + text += "<b>" + QObject::tr( "Description:" ) + "</b><br>"; + text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; + } + + // priority + int priorityval = priority(); + text += "<b>" + QObject::tr( "Priority:") +" </b><img src=\"todo/priority" + + QString::number( priorityval ) + "\"> "; + + switch ( priorityval ) + { + case 1 : text += QObject::tr( "Very high" ); + break; + case 2 : text += QObject::tr( "High" ); + break; + case 3 : text += QObject::tr( "Normal" ); + break; + case 4 : text += QObject::tr( "Low" ); + break; + case 5 : text += QObject::tr( "Very low" ); + break; + }; + text += "<br>"; + + // progress + text += "<b>" + QObject::tr( "Progress:") + " </b>" + + QString::number( progress() ) + " %<br>"; + + // due date + if (hasDueDate() ){ + QDate dd = dueDate(); + int off = QDate::currentDate().daysTo( dd ); + + text += "<b>" + QObject::tr( "Deadline:" ) + " </b><font color=\""; + if ( off < 0 ) + text += "#FF0000"; + else if ( off == 0 ) + text += "#FFFF00"; + else if ( off > 0 ) + text += "#00FF00"; + + text += "\">" + dd.toString() + "</font><br>"; + } + + // categories + text += "<b>" + QObject::tr( "Category:") + "</b> "; + text += categoryNames( "Todo List" ).join(", "); + text += "<br>"; + + return text; +} +bool OTodo::hasNotifiers()const { + if (!data->notifiers) return false; + return !data->notifiers->isEmpty(); +} +OPimNotifyManager& OTodo::notifiers() { + if (!data->notifiers ) + data->notifiers = new OPimNotifyManager; + return (*data->notifiers); +} +const OPimNotifyManager& OTodo::notifiers()const{ + if (!data->notifiers ) + data->notifiers = new OPimNotifyManager; + + return (*data->notifiers); +} + +bool OTodo::operator<( const OTodo &toDoEvent )const{ + if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; + if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; + if( hasDueDate() && toDoEvent.hasDueDate() ){ + if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide + return priority() < toDoEvent.priority(); + }else{ + return dueDate() < toDoEvent.dueDate(); + } + } + return false; +} +bool OTodo::operator<=(const OTodo &toDoEvent )const +{ + if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; + if( !hasDueDate() && toDoEvent.hasDueDate() ) return true; + if( hasDueDate() && toDoEvent.hasDueDate() ){ + if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide + return priority() <= toDoEvent.priority(); + }else{ + return dueDate() <= toDoEvent.dueDate(); + } + } + return true; +} +bool OTodo::operator>(const OTodo &toDoEvent )const +{ + if( !hasDueDate() && !toDoEvent.hasDueDate() ) return false; + if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; + if( hasDueDate() && toDoEvent.hasDueDate() ){ + if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide + return priority() > toDoEvent.priority(); + }else{ + return dueDate() > toDoEvent.dueDate(); + } + } + return false; +} +bool OTodo::operator>=(const OTodo &toDoEvent )const +{ + if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; + if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; + if( hasDueDate() && toDoEvent.hasDueDate() ){ + if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide + return priority() > toDoEvent.priority(); + }else{ + return dueDate() > toDoEvent.dueDate(); + } + } + return true; +} +bool OTodo::operator==(const OTodo &toDoEvent )const +{ + if ( data->priority != toDoEvent.data->priority ) return false; + if ( data->priority != toDoEvent.data->prog ) return false; + if ( data->isCompleted != toDoEvent.data->isCompleted ) return false; + if ( data->hasDate != toDoEvent.data->hasDate ) return false; + if ( data->date != toDoEvent.data->date ) return false; + if ( data->sum != toDoEvent.data->sum ) return false; + if ( data->desc != toDoEvent.data->desc ) return false; + if ( data->maintainer != toDoEvent.data->maintainer ) + return false; + + return OPimRecord::operator==( toDoEvent ); +} +void OTodo::deref() { + +// qWarning("deref in ToDoEvent"); + if ( data->deref() ) { +// qWarning("deleting"); + delete data; + data= 0; + } +} +OTodo &OTodo::operator=(const OTodo &item ) +{ + if ( this == &item ) return *this; + + OPimRecord::operator=( item ); + //qWarning("operator= ref "); + item.data->ref(); + deref(); + data = item.data; + + return *this; +} + +QMap<int, QString> OTodo::toMap() const { + QMap<int, QString> map; + + map.insert( Uid, QString::number( uid() ) ); + map.insert( Category, idsToString( categories() ) ); + map.insert( HasDate, QString::number( data->hasDate ) ); + map.insert( Completed, QString::number( data->isCompleted ) ); + map.insert( Description, data->desc ); + map.insert( Summary, data->sum ); + map.insert( Priority, QString::number( data->priority ) ); + map.insert( DateDay, QString::number( data->date.day() ) ); + map.insert( DateMonth, QString::number( data->date.month() ) ); + map.insert( DateYear, QString::number( data->date.year() ) ); + map.insert( Progress, QString::number( data->prog ) ); +// map.insert( CrossReference, crossToString() ); + /* FIXME!!! map.insert( State, ); + map.insert( Recurrence, ); + map.insert( Reminders, ); + map. + */ + return map; +} + +/** + * change or modify looks at the ref count and either + * creates a new QShared Object or it can modify it + * right in place + */ +void OTodo::changeOrModify() { + if ( data->count != 1 ) { + qWarning("changeOrModify"); + data->deref(); + OTodoData* d2 = new OTodoData(); + copy(data, d2 ); + data = d2; + } +} +// WATCHOUT +/* + * if you add something to the Data struct + * be sure to copy it here + */ +void OTodo::copy( OTodoData* src, OTodoData* dest ) { + dest->date = src->date; + dest->isCompleted = src->isCompleted; + dest->hasDate = src->hasDate; + dest->priority = src->priority; + dest->desc = src->desc; + dest->sum = src->sum; + dest->extra = src->extra; + dest->prog = src->prog; + + if (src->state ) + dest->state = new OPimState( *src->state ); + + if (src->recur ) + dest->recur = new ORecur( *src->recur ); + + if (src->maintainer ) + dest->maintainer = new OPimMaintainer( *src->maintainer ) + ; + dest->start = src->start; + dest->completed = src->completed; + + if (src->notifiers ) + dest->notifiers = new OPimNotifyManager( *src->notifiers ); +} +QString OTodo::type() const { + return QString::fromLatin1("OTodo"); +} +QString OTodo::recordField(int /*id*/ )const { + return QString::null; +} + +int OTodo::rtti(){ + return OPimResolver::TodoList; +} |