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"
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
00055
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
00076
00077
00078 _name = taskName.stripWhiteSpace();
00079 _lastStart = QDateTime::currentDateTime();
00080 _totalTime = _time = minutes;
00081 _totalSessionTime = _sessionTime = sessionTime;
00082 noNegativeTimes();
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 storage->
stopTimer(
this);
00114 setPixmap(1, UserIcon(QString::fromLatin1(
"empty-watch.xpm")));
00115 }
00116 }
00117 }
00118
00119 void Task::setUid(QString uid) {
00120 _uid = uid;
00121 }
00122
00123 bool Task::isRunning()
const
00124
{
00125
return _timer->isActive();
00126 }
00127
00128 void Task::setName(
const QString& name,
KarmStorage* storage )
00129 {
00130 kdDebug() <<
"Task:setName: " << name << endl;
00131
00132 QString oldname = _name;
00133
if ( oldname != name ) {
00134 _name = name;
00135 storage->
setName(
this, oldname);
00136
update();
00137 }
00138 }
00139
00140 void Task::setPercentComplete(
const int percent,
KarmStorage *storage)
00141 {
00142 kdDebug() <<
"Task::setPercentComplete(" << percent <<
", storage): "
00143 << _uid << endl;
00144
00145
if (
isRunning())
setRunning(
false, storage);
00146
00147 setEnabled(
false);
00148 setOpen(
false);
00149
00150
if (!percent)
00151 _percentcomplete = 0;
00152
else if (percent > 100)
00153 _percentcomplete = 100;
00154
else if (percent < 0)
00155 _percentcomplete = 0;
00156
else
00157 _percentcomplete = percent;
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
if (_percentcomplete == 100)
00170 {
00171
for (
Task* child= this->
firstChild(); child; child = child->
nextSibling())
00172 child->
setPercentComplete(_percentcomplete, storage);
00173 }
00174 }
00175
00176 bool Task::isComplete() {
return _percentcomplete == 100; }
00177
00178 void Task::removeFromView()
00179 {
00180
for (
Task* child= this->
firstChild(); child; child= child->
nextSibling())
00181 child->
removeFromView();
00182
delete this;
00183 }
00184
00185 void Task::setDesktopList ( DesktopList desktopList )
00186 {
00187 _desktops = desktopList;
00188 }
00189
00190 void Task::changeTimes(
long minutesSession,
long minutes,
bool do_logging,
00191
KarmStorage* storage)
00192 {
00193
if( minutesSession != 0 || minutes != 0) {
00194 _sessionTime += minutesSession;
00195
00196
00197
00198
00199
00200 _time += minutes;
00201
if ( do_logging )
00202 storage->
changeTime(
this, minutes * gSecondsPerMinute);
00203
00204
00205 noNegativeTimes();
00206
changeTotalTimes( minutesSession, minutes );
00207 }
00208 }
00209
00210 void Task::changeTotalTimes(
long minutesSession,
long minutes )
00211 {
00212
00213
00214
00215
00216 _totalSessionTime += minutesSession;
00217 _totalTime += minutes;
00218 noNegativeTimes();
00219
update();
00220 changeParentTotalTimes( minutesSession, minutes );
00221 }
00222
00223 void Task::resetTimes()
00224 {
00225 _totalSessionTime -= _sessionTime;
00226 _totalTime -= _time;
00227 changeParentTotalTimes( -_sessionTime, -_time);
00228 _sessionTime = 0;
00229 _time = 0;
00230
update();
00231 }
00232
00233
void Task::changeParentTotalTimes(
long minutesSession,
long minutes )
00234 {
00235
00236
00237
00238
00239
if (
isRoot() )
00240 emit totalTimesChanged( minutesSession, minutes );
00241
else
00242 parent()->
changeTotalTimes( minutesSession, minutes );
00243 }
00244
00245 bool Task::remove( QPtrList<Task>& activeTasks,
KarmStorage* storage)
00246 {
00247 kdDebug() <<
"Task::remove: " << _name << endl;
00248
00249
bool ok =
true;
00250
00251 storage->
removeTask(
this);
00252
00253
if(
isRunning() )
setRunning(
false, storage );
00254
00255
for (
Task* child = this->
firstChild(); child; child = child->
nextSibling())
00256 {
00257
if (child->
isRunning())
00258 child->
setRunning(
false, storage);
00259 child->
remove(activeTasks, storage);
00260 }
00261
00262 changeParentTotalTimes( -_sessionTime, -_time);
00263
00264
return ok;
00265 }
00266
00267 void Task::updateActiveIcon()
00268 {
00269 _currentPic = (_currentPic+1) % 8;
00270 setPixmap(1, *(*icons)[_currentPic]);
00271 }
00272
00273
void Task::noNegativeTimes()
00274 {
00275
if ( _time < 0 )
00276 _time = 0;
00277
if ( _sessionTime < 0 )
00278 _sessionTime = 0;
00279 }
00280
00281 QString
Task::fullName()
const
00282
{
00283
if (
isRoot())
00284
return name();
00285
else
00286
return parent()->
fullName() + QString::fromLatin1(
"/") +
name();
00287 }
00288
00289 KCal::Todo*
Task::asTodo(KCal::Todo* todo)
const
00290
{
00291
00292 todo->setSummary(
name() );
00293
00294
00295
00296
00297
00298
00299 todo->setCustomProperty( kapp->instanceName(),
00300 QCString(
"totalTaskTime" ), QString::number( _time ) );
00301 todo->setCustomProperty( kapp->instanceName(),
00302 QCString(
"totalSessionTime" ), QString::number( _sessionTime) );
00303
00304
if (getDesktopStr().isEmpty())
00305 todo->removeCustomProperty(kapp->instanceName(), QCString(
"desktopList"));
00306
else
00307 todo->setCustomProperty( kapp->instanceName(),
00308 QCString(
"desktopList" ), getDesktopStr() );
00309
00310 todo->setOrganizer( Preferences::instance()->userRealName() );
00311
00312 todo->setPercentComplete(_percentcomplete);
00313
00314
return todo;
00315 }
00316
00317
bool Task::parseIncidence( KCal::Incidence* incident,
long& minutes,
00318
long& sessionMinutes, QString& name, DesktopList& desktops,
00319
int& percent_complete )
00320 {
00321
bool ok;
00322
00323 name = incident->summary();
00324 _uid = incident->uid();
00325
00326 _comment = incident->description();
00327
00328 ok =
false;
00329 minutes = incident->customProperty( kapp->instanceName(),
00330 QCString(
"totalTaskTime" )).toInt( &ok );
00331
if ( !ok )
00332 minutes = 0;
00333
00334 ok =
false;
00335 sessionMinutes = incident->customProperty( kapp->instanceName(),
00336 QCString(
"totalSessionTime" )).toInt( &ok );
00337
if ( !ok )
00338 sessionMinutes = 0;
00339
00340 QString desktopList = incident->customProperty( kapp->instanceName(),
00341 QCString(
"desktopList" ) );
00342 QStringList desktopStrList = QStringList::split(QString::fromLatin1(
"\\,"),
00343 desktopList );
00344 desktops.clear();
00345
00346
for ( QStringList::iterator iter = desktopStrList.begin();
00347 iter != desktopStrList.end();
00348 ++iter ) {
00349
int desktopInt = (*iter).toInt( &ok );
00350
if ( ok ) {
00351 desktops.push_back( desktopInt );
00352 }
00353 }
00354
00355 percent_complete = static_cast<KCal::Todo*>(incident)->percentComplete();
00356
00357
00358
00359
00360
00361
return true;
00362 }
00363
00364 QString Task::getDesktopStr()
const
00365
{
00366
if ( _desktops.empty() )
00367
return QString();
00368
00369 QString desktopstr;
00370
for ( DesktopList::const_iterator iter = _desktops.begin();
00371 iter != _desktops.end();
00372 ++iter ) {
00373 desktopstr += QString::number( *iter ) + QString::fromLatin1(
"," );
00374 }
00375 desktopstr.remove( desktopstr.length() - 1, 1 );
00376
return desktopstr;
00377 }
00378
00379 void Task::cut()
00380 {
00381
00382 changeParentTotalTimes( -_totalSessionTime, -_totalTime);
00383
if ( ! parent())
00384 listView()->takeItem(
this);
00385
else
00386 parent()->takeItem(
this);
00387 }
00388
00389 void Task::move(
Task* destination)
00390 {
00391
cut();
00392
paste(destination);
00393 }
00394
00395 void Task::paste(
Task* destination)
00396 {
00397 destination->insertItem(
this);
00398 changeParentTotalTimes( _totalSessionTime, _totalTime);
00399 }
00400
00401 void Task::update()
00402 {
00403 setText(0, _name);
00404 setText(1, formatTime(_sessionTime));
00405 setText(2, formatTime(_time));
00406 setText(3, formatTime(_totalSessionTime));
00407 setText(4, formatTime(_totalTime));
00408 }
00409
00410 void Task::addComment( QString comment,
KarmStorage* storage )
00411 {
00412 _comment = _comment + QString::fromLatin1(
"\n") + comment;
00413 storage->
addComment(
this, comment);
00414 }
00415
00416 QString
Task::comment()
const
00417
{
00418
return _comment;
00419 }
00420
00421
#include "task.moc"