karm Library API Documentation

task.cpp

00001 #include <qcstring.h>
00002 #include <qdatetime.h>
00003 #include <qstring.h>
00004 #include <qtimer.h>
00005 
00006 #include <kiconloader.h>
00007 
00008 #include "kapplication.h"       // kapp
00009 #include "kdebug.h"
00010 
00011 #include "event.h"
00012 
00013 #include "karmutility.h"
00014 #include "task.h"
00015 #include "taskview.h"
00016 #include "preferences.h"
00017 
00018 
00019 const int gSecondsPerMinute = 60;
00020 
00021 
00022 QPtrVector<QPixmap> *Task::icons = 0;
00023 
00024 Task::Task( const QString& taskName, long minutes, long sessionTime,
00025             DesktopList desktops, TaskView *parent)
00026   : QObject(), QListViewItem(parent)
00027 {
00028   init(taskName, minutes, sessionTime, desktops, 0);
00029 }
00030 
00031 Task::Task( const QString& taskName, long minutes, long sessionTime,
00032             DesktopList desktops, Task *parent)
00033   : QObject(), QListViewItem(parent)
00034 {
00035   init(taskName, minutes, sessionTime, desktops, 0);
00036 }
00037 
00038 Task::Task( KCal::Todo* todo, TaskView* parent )
00039   : QObject(), QListViewItem( parent )
00040 {
00041   long minutes = 0;
00042   QString name;
00043   long sessionTime = 0;
00044   int percent_complete = 0;
00045   DesktopList desktops;
00046 
00047   parseIncidence(todo, minutes, sessionTime, name, desktops, percent_complete);
00048   init(name, minutes, sessionTime, desktops, percent_complete);
00049 }
00050 
00051 void Task::init( const QString& taskName, long minutes, long sessionTime,
00052                  DesktopList desktops, int percent_complete)
00053 {
00054   // If our parent is the taskview then connect our totalTimesChanged
00055   // signal to its receiver
00056   if ( ! parent() )
00057     connect( this, SIGNAL( totalTimesChanged ( long, long ) ),
00058              listView(), SLOT( taskTotalTimesChanged( long, long) ));
00059 
00060   connect( this, SIGNAL( deletingTask( Task* ) ),
00061            listView(), SLOT( deletingTask( Task* ) ));
00062 
00063   if (icons == 0) {
00064     icons = new QPtrVector<QPixmap>(8);
00065     for (int i=0; i<8; i++)
00066     {
00067       QPixmap *icon = new QPixmap();
00068       QString name;
00069       name.sprintf("watch-%d.xpm",i);
00070       *icon = UserIcon(name);
00071       icons->insert(i,icon);
00072     }
00073   }
00074 
00075   //kdDebug(5970) << "Task::init(" << taskName << ", " << minutes << ", "
00076   //  << sessionTime << ", desktops)" << endl;
00077 
00078   _removing = false;
00079   _name = taskName.stripWhiteSpace();
00080   _lastStart = QDateTime::currentDateTime();
00081   _totalTime = _time = minutes;
00082   _totalSessionTime = _sessionTime = sessionTime;
00083   _timer = new QTimer(this);
00084   _desktops = desktops;
00085   connect(_timer, SIGNAL(timeout()), this, SLOT(updateActiveIcon()));
00086   setPixmap(1, UserIcon(QString::fromLatin1("empty-watch.xpm")));
00087   _currentPic = 0;
00088   _percentcomplete = percent_complete;
00089 
00090   update();
00091   changeParentTotalTimes( _sessionTime, _time);
00092 }
00093 
00094 Task::~Task() {
00095   emit deletingTask(this);
00096   delete _timer;
00097 }
00098 
00099 void Task::setRunning( bool on, KarmStorage* storage )
00100 {
00101   if ( on ) {
00102     if (!_timer->isActive()) {
00103       _timer->start(1000);
00104       storage->startTimer(this);
00105       _currentPic=7;
00106       _lastStart = QDateTime::currentDateTime();
00107       updateActiveIcon();
00108     }
00109   }
00110   else {
00111     if (_timer->isActive()) {
00112       _timer->stop();
00113       if ( ! _removing ) {
00114       storage->stopTimer(this);
00115       setPixmap(1, UserIcon(QString::fromLatin1("empty-watch.xpm")));
00116     }
00117   }
00118   }
00119 }
00120 
00121 void Task::setUid(QString uid) {
00122   _uid = uid;
00123 }
00124 
00125 bool Task::isRunning() const
00126 {
00127   return _timer->isActive();
00128 }
00129 
00130 void Task::setName( const QString& name, KarmStorage* storage )
00131 {
00132   kdDebug(5970) << "Task:setName: " << name << endl;
00133 
00134   QString oldname = _name;
00135   if ( oldname != name ) {
00136     _name = name;
00137     storage->setName(this, oldname);
00138     update();
00139   }
00140 }
00141 
00142 void Task::setPercentComplete(const int percent, KarmStorage *storage)
00143 {
00144   kdDebug(5970) << "Task::setPercentComplete(" << percent << ", storage): "
00145     << _uid << endl;
00146 
00147   if (isRunning()) setRunning(false, storage);
00148 
00149   setEnabled(false);
00150   setOpen(false);
00151 
00152   if (!percent)
00153     _percentcomplete = 0;
00154   else if (percent > 100)
00155     _percentcomplete = 100;
00156   else if (percent < 0)
00157     _percentcomplete = 0;
00158   else
00159     _percentcomplete = percent;
00160 
00161   // When parent marked as complete, mark all children as complete as well.
00162   // Complete tasks are not displayed in the task view, so if a parent is
00163   // marked as complete and some of the children are not, then we get an error
00164   // message.  KArm actually keep chugging along in this case and displays the
00165   // child tasks just fine, so an alternative solution is to remove that error
00166   // message (from KarmStorage::load).  But I think it makes more sense that
00167   // if you mark a parent task as complete, then all children should be
00168   // complete as well.
00169   //
00170   // This behavior is consistent with KOrganizer (as of 2003-09-24).
00171   if (_percentcomplete == 100)
00172   {
00173     for (Task* child= this->firstChild(); child; child = child->nextSibling())
00174       child->setPercentComplete(_percentcomplete, storage);
00175   }
00176 }
00177 
00178 bool Task::isComplete() { return _percentcomplete == 100; }
00179 
00180 void Task::removeFromView()
00181 {
00182   for (Task* child= this->firstChild(); child; child= child->nextSibling())
00183     child->removeFromView();
00184   delete this;
00185 }
00186 
00187 void Task::setDesktopList ( DesktopList desktopList )
00188 {
00189   _desktops = desktopList;
00190 }
00191 
00192 void Task::changeTime( long minutes, KarmStorage* storage )
00193 {
00194   changeTimes( minutes, minutes, storage); 
00195 }
00196 
00197 void Task::changeTimes( long minutesSession, long minutes, KarmStorage* storage)
00198 {
00199   if( minutesSession != 0 || minutes != 0) 
00200   {
00201     _sessionTime += minutesSession;
00202     _time += minutes;
00203     if ( storage ) storage->changeTime(this, minutes * gSecondsPerMinute);
00204     changeTotalTimes( minutesSession, minutes );
00205   }
00206 }
00207 
00208 void Task::changeTotalTimes( long minutesSession, long minutes )
00209 {
00210   //kdDebug(5970)
00211   //  << "Task::changeTotalTimes(" << minutesSession << ", "
00212   //  << minutes << ") for " << name() << endl;
00213 
00214   _totalSessionTime += minutesSession;
00215   _totalTime += minutes;
00216   update();
00217   changeParentTotalTimes( minutesSession, minutes );
00218 }
00219 
00220 void Task::resetTimes()
00221 {
00222   _totalSessionTime -= _sessionTime;
00223   _totalTime -= _time;
00224   changeParentTotalTimes( -_sessionTime, -_time);
00225   _sessionTime = 0;
00226   _time = 0;
00227   update();
00228 }
00229 
00230 void Task::changeParentTotalTimes( long minutesSession, long minutes )
00231 {
00232   //kdDebug(5970)
00233   //  << "Task::changeParentTotalTimes(" << minutesSession << ", "
00234   //  << minutes << ") for " << name() << endl;
00235 
00236   if ( isRoot() )
00237     emit totalTimesChanged( minutesSession, minutes );
00238   else
00239     parent()->changeTotalTimes( minutesSession, minutes );
00240 }
00241 
00242 bool Task::remove( QPtrList<Task>& activeTasks, KarmStorage* storage)
00243 {
00244   kdDebug(5970) << "Task::remove: " << _name << endl;
00245 
00246   bool ok = true;
00247 
00248   _removing = true;
00249   storage->removeTask(this);
00250   if( isRunning() ) setRunning( false, storage );
00251 
00252   for (Task* child = this->firstChild(); child; child = child->nextSibling())
00253   {
00254     if (child->isRunning())
00255       child->setRunning(false, storage);
00256     child->remove(activeTasks, storage);
00257   }
00258 
00259   changeParentTotalTimes( -_sessionTime, -_time);
00260 
00261   _removing = false;
00262 
00263   return ok;
00264 }
00265 
00266 void Task::updateActiveIcon()
00267 {
00268   _currentPic = (_currentPic+1) % 8;
00269   setPixmap(1, *(*icons)[_currentPic]);
00270 }
00271 
00272 QString Task::fullName() const
00273 {
00274   if (isRoot())
00275     return name();
00276   else
00277     return parent()->fullName() + QString::fromLatin1("/") + name();
00278 }
00279 
00280 KCal::Todo* Task::asTodo(KCal::Todo* todo) const
00281 {
00282 
00283   todo->setSummary( name() );
00284 
00285   // Note: if the date start is empty, the KOrganizer GUI will have the
00286   // checkbox blank, but will prefill the todo's starting datetime to the
00287   // time the file is opened.
00288   // todo->setDtStart( current );
00289 
00290   todo->setCustomProperty( kapp->instanceName(),
00291       QCString( "totalTaskTime" ), QString::number( _time ) );
00292   todo->setCustomProperty( kapp->instanceName(),
00293       QCString( "totalSessionTime" ), QString::number( _sessionTime) );
00294 
00295   if (getDesktopStr().isEmpty())
00296     todo->removeCustomProperty(kapp->instanceName(), QCString("desktopList"));
00297   else
00298     todo->setCustomProperty( kapp->instanceName(),
00299         QCString( "desktopList" ), getDesktopStr() );
00300 
00301   todo->setOrganizer( Preferences::instance()->userRealName() );
00302 
00303   todo->setPercentComplete(_percentcomplete);
00304 
00305   return todo;
00306 }
00307 
00308 bool Task::parseIncidence( KCal::Incidence* incident, long& minutes,
00309     long& sessionMinutes, QString& name, DesktopList& desktops,
00310     int& percent_complete )
00311 {
00312   bool ok;
00313 
00314   name = incident->summary();
00315   _uid = incident->uid();
00316 
00317   _comment = incident->description();
00318 
00319   ok = false;
00320   minutes = incident->customProperty( kapp->instanceName(),
00321       QCString( "totalTaskTime" )).toInt( &ok );
00322   if ( !ok )
00323     minutes = 0;
00324 
00325   ok = false;
00326   sessionMinutes = incident->customProperty( kapp->instanceName(),
00327       QCString( "totalSessionTime" )).toInt( &ok );
00328   if ( !ok )
00329     sessionMinutes = 0;
00330 
00331   QString desktopList = incident->customProperty( kapp->instanceName(),
00332       QCString( "desktopList" ) );
00333   QStringList desktopStrList = QStringList::split( QString::fromLatin1(","),
00334       desktopList );
00335   desktops.clear();
00336 
00337   for ( QStringList::iterator iter = desktopStrList.begin();
00338         iter != desktopStrList.end();
00339         ++iter ) {
00340     int desktopInt = (*iter).toInt( &ok );
00341     if ( ok ) {
00342       desktops.push_back( desktopInt );
00343     }
00344   }
00345 
00346   percent_complete = static_cast<KCal::Todo*>(incident)->percentComplete();
00347 
00348   //kdDebug(5970) << "Task::parseIncidence: "
00349   //  << name << ", Minutes: " << minutes
00350   //  <<  ", desktop: " << desktopList << endl;
00351 
00352   return true;
00353 }
00354 
00355 QString Task::getDesktopStr() const
00356 {
00357   if ( _desktops.empty() )
00358     return QString();
00359 
00360   QString desktopstr;
00361   for ( DesktopList::const_iterator iter = _desktops.begin();
00362         iter != _desktops.end();
00363         ++iter ) {
00364     desktopstr += QString::number( *iter ) + QString::fromLatin1( "," );
00365   }
00366   desktopstr.remove( desktopstr.length() - 1, 1 );
00367   return desktopstr;
00368 }
00369 
00370 void Task::cut()
00371 {
00372   //kdDebug(5970) << "Task::cut - " << name() << endl;
00373   changeParentTotalTimes( -_totalSessionTime, -_totalTime);
00374   if ( ! parent())
00375     listView()->takeItem(this);
00376   else
00377     parent()->takeItem(this);
00378 }
00379 
00380 void Task::move(Task* destination)
00381 {
00382   cut();
00383   paste(destination);
00384 }
00385 
00386 void Task::paste(Task* destination)
00387 {
00388   destination->insertItem(this);
00389   changeParentTotalTimes( _totalSessionTime, _totalTime);
00390 }
00391 
00392 void Task::update()
00393 {
00394   setText(0, _name);
00395   setText(1, formatTime(_sessionTime));
00396   setText(2, formatTime(_time));
00397   setText(3, formatTime(_totalSessionTime));
00398   setText(4, formatTime(_totalTime));
00399 }
00400 
00401 void Task::addComment( QString comment, KarmStorage* storage )
00402 {
00403   _comment = _comment + QString::fromLatin1("\n") + comment;
00404   storage->addComment(this, comment);
00405 }
00406 
00407 QString Task::comment() const
00408 {
00409   return _comment;
00410 }
00411 
00412 int Task::compare ( QListViewItem * i, int col, bool ascending ) const
00413 {
00414   long thistime = 0;
00415   long thattime = 0;
00416   Task *task = static_cast<Task*>(i);
00417 
00418   switch ( col )
00419   {
00420     case 1: 
00421       thistime = _sessionTime;
00422       thattime = task->sessionTime();
00423       break;
00424     case 2:
00425       thistime = _time;
00426       thattime = task->time();
00427       break;
00428     case 3:
00429       thistime = _totalSessionTime;
00430       thattime = task->totalSessionTime();
00431       break;
00432     case 4:
00433       thistime = _totalTime;
00434       thattime = task->totalTime();
00435       break;
00436     default:
00437       return key(col, ascending).localeAwareCompare( i->key(col, ascending) );
00438   }
00439 
00440   if ( thistime < thattime ) return -1;
00441   if ( thistime > thattime ) return 1;
00442   return 0;
00443 
00444 }
00445 
00446 #include "task.moc"
KDE Logo
This file is part of the documentation for karm Library Version 3.3.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Oct 4 14:41:29 2007 by doxygen 1.4.2 written by Dimitri van Heesch, © 1997-2003