summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/kotodoview.cpp9
-rw-r--r--libkcal/todo.cpp10
-rw-r--r--libkcal/todo.h2
3 files changed, 18 insertions, 3 deletions
diff --git a/korganizer/kotodoview.cpp b/korganizer/kotodoview.cpp
index 99e6a3a..c5fae17 100644
--- a/korganizer/kotodoview.cpp
+++ b/korganizer/kotodoview.cpp
@@ -1,607 +1,614 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24#include <qlayout.h> 24#include <qlayout.h>
25#include <qheader.h> 25#include <qheader.h>
26#include <qcursor.h> 26#include <qcursor.h>
27#include <qwhatsthis.h> 27#include <qwhatsthis.h>
28#include <qdialog.h> 28#include <qdialog.h>
29#include <qlabel.h> 29#include <qlabel.h>
30#include <qpushbutton.h> 30#include <qpushbutton.h>
31 31
32#include <qinputdialog.h> 32#include <qinputdialog.h>
33 33
34#include <qvbox.h> 34#include <qvbox.h>
35#include <kdebug.h> 35#include <kdebug.h>
36#include "koprefs.h" 36#include "koprefs.h"
37#include <klocale.h> 37#include <klocale.h>
38#include <kglobal.h> 38#include <kglobal.h>
39#include <kiconloader.h> 39#include <kiconloader.h>
40#include <kmessagebox.h> 40#include <kmessagebox.h>
41 41
42#include <libkcal/icaldrag.h> 42#include <libkcal/icaldrag.h>
43#include <libkcal/vcaldrag.h> 43#include <libkcal/vcaldrag.h>
44#include <libkcal/calfilter.h> 44#include <libkcal/calfilter.h>
45#include <libkcal/dndfactory.h> 45#include <libkcal/dndfactory.h>
46#include <libkcal/calendarresources.h> 46#include <libkcal/calendarresources.h>
47#include <libkcal/resourcecalendar.h> 47#include <libkcal/resourcecalendar.h>
48#include <kresources/resourceselectdialog.h> 48#include <kresources/resourceselectdialog.h>
49#include <libkcal/kincidenceformatter.h> 49#include <libkcal/kincidenceformatter.h>
50#ifndef DESKTOP_VERSION 50#ifndef DESKTOP_VERSION
51#include <qpe/qpeapplication.h> 51#include <qpe/qpeapplication.h>
52#else 52#else
53#include <qapplication.h> 53#include <qapplication.h>
54#endif 54#endif
55#ifndef KORG_NOPRINTER 55#ifndef KORG_NOPRINTER
56#include "calprinter.h" 56#include "calprinter.h"
57#endif 57#endif
58#include "docprefs.h" 58#include "docprefs.h"
59 59
60#include "kotodoview.h" 60#include "kotodoview.h"
61using namespace KOrg; 61using namespace KOrg;
62 62
63 63
64KOStopTodoPrefs::KOStopTodoPrefs( Todo* todo, QWidget *parent, const char *name ) : 64KOStopTodoPrefs::KOStopTodoPrefs( Todo* todo, QWidget *parent, const char *name ) :
65 QDialog( parent, name, true ) 65 QDialog( parent, name, true )
66{ 66{
67 mTodo = todo; 67 mTodo = todo;
68 setCaption( i18n("Stop todo") ); 68 setCaption( i18n("Stop todo") );
69 QVBoxLayout* lay = new QVBoxLayout( this ); 69 QVBoxLayout* lay = new QVBoxLayout( this );
70 lay->setSpacing( 3 ); 70 lay->setSpacing( 3 );
71 lay->setMargin( 3 ); 71 lay->setMargin( 3 );
72 QLabel * lab = new QLabel( i18n("%1\nis running!").arg( todo->summary() ), this ); 72 QLabel * lab = new QLabel( i18n("%1\nis running!").arg( todo->summary() ), this );
73 lay->addWidget( lab ); 73 lay->addWidget( lab );
74 lab->setAlignment( AlignHCenter ); 74 lab->setAlignment( AlignHCenter );
75 75
76 QPushButton * ok = new QPushButton( i18n("Stop and save"), this ); 76 QPushButton * ok = new QPushButton( i18n("Stop and save"), this );
77 lay->addWidget( ok ); 77 lay->addWidget( ok );
78 QPushButton * cancel = new QPushButton( i18n("Continue running"), this ); 78 QPushButton * cancel = new QPushButton( i18n("Continue running"), this );
79 lay->addWidget( cancel ); 79 lay->addWidget( cancel );
80 connect ( ok,SIGNAL(clicked() ),this , SLOT ( accept() ) ); 80 connect ( ok,SIGNAL(clicked() ),this , SLOT ( accept() ) );
81 connect (cancel, SIGNAL(clicked() ), this, SLOT ( reject()) ); 81 connect (cancel, SIGNAL(clicked() ), this, SLOT ( reject()) );
82 ok = new QPushButton( i18n("Stop - do not save"), this ); 82 ok = new QPushButton( i18n("Stop - do not save"), this );
83 connect ( ok,SIGNAL(clicked() ),this , SLOT ( doNotSave() ) ); 83 connect ( ok,SIGNAL(clicked() ),this , SLOT ( doNotSave() ) );
84 lay->addWidget( ok ); 84 lay->addWidget( ok );
85 resize( 200, 200 ); 85 resize( 200, 200 );
86} 86}
87 87
88void KOStopTodoPrefs::accept() 88void KOStopTodoPrefs::accept()
89{ 89{
90 qDebug("KOStopTodoPrefs::accept() "); 90 qDebug("KOStopTodoPrefs::accept() ");
91
92
93#if 0
94 t->setRunningFalse( comment );
95
96 t->setRunning( false );
97#endif
98
91 QDialog::accept(); 99 QDialog::accept();
92} 100}
93void KOStopTodoPrefs::doNotSave() 101void KOStopTodoPrefs::doNotSave()
94{ 102{
95
96 int result = KMessageBox::warningContinueCancel(this, 103 int result = KMessageBox::warningContinueCancel(this,
97 i18n("Do you really want to set\nthe state to stopped\nwithout saving the data?"),mTodo->summary() ); 104 i18n("Do you really want to set\nthe state to stopped\nwithout saving the data?"),mTodo->summary() );
98 if (result != KMessageBox::Continue) return; 105 if (result != KMessageBox::Continue) return;
99 mTodo->stopRunning(); 106 mTodo->stopRunning();
100 QDialog::accept(); 107 QDialog::accept();
101} 108}
102 109
103 110
104class KOTodoViewWhatsThis :public QWhatsThis 111class KOTodoViewWhatsThis :public QWhatsThis
105{ 112{
106public: 113public:
107 KOTodoViewWhatsThis( QWidget *wid, KOTodoView* view ) : QWhatsThis( wid ), _wid(wid),_view (view) { }; 114 KOTodoViewWhatsThis( QWidget *wid, KOTodoView* view ) : QWhatsThis( wid ), _wid(wid),_view (view) { };
108 115
109protected: 116protected:
110 virtual QString text( const QPoint& p) 117 virtual QString text( const QPoint& p)
111 { 118 {
112 return _view->getWhatsThisText(p) ; 119 return _view->getWhatsThisText(p) ;
113 } 120 }
114private: 121private:
115 QWidget* _wid; 122 QWidget* _wid;
116 KOTodoView * _view; 123 KOTodoView * _view;
117}; 124};
118 125
119KOTodoListView::KOTodoListView(Calendar *calendar,QWidget *parent, 126KOTodoListView::KOTodoListView(Calendar *calendar,QWidget *parent,
120 const char *name) : 127 const char *name) :
121 KListView(parent,name) 128 KListView(parent,name)
122{ 129{
123 mName = QString ( name ); 130 mName = QString ( name );
124 mCalendar = calendar; 131 mCalendar = calendar;
125#ifndef DESKTOP_VERSION 132#ifndef DESKTOP_VERSION
126 QPEApplication::setStylusOperation(viewport(), QPEApplication::RightOnHold ); 133 QPEApplication::setStylusOperation(viewport(), QPEApplication::RightOnHold );
127#endif 134#endif
128 mOldCurrent = 0; 135 mOldCurrent = 0;
129 mMousePressed = false; 136 mMousePressed = false;
130 137
131 setAcceptDrops(true); 138 setAcceptDrops(true);
132 viewport()->setAcceptDrops(true); 139 viewport()->setAcceptDrops(true);
133 int size = 16; 140 int size = 16;
134 if (qApp->desktop()->width() < 300 ) 141 if (qApp->desktop()->width() < 300 )
135 size = 12; 142 size = 12;
136 setTreeStepSize( size + 6 ); 143 setTreeStepSize( size + 6 );
137 144
138} 145}
139 146
140void KOTodoListView::contentsDragEnterEvent(QDragEnterEvent *e) 147void KOTodoListView::contentsDragEnterEvent(QDragEnterEvent *e)
141{ 148{
142#ifndef KORG_NODND 149#ifndef KORG_NODND
143// kdDebug() << "KOTodoListView::contentsDragEnterEvent" << endl; 150// kdDebug() << "KOTodoListView::contentsDragEnterEvent" << endl;
144 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) && 151 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) &&
145 !QTextDrag::canDecode( e ) ) { 152 !QTextDrag::canDecode( e ) ) {
146 e->ignore(); 153 e->ignore();
147 return; 154 return;
148 } 155 }
149 156
150 mOldCurrent = currentItem(); 157 mOldCurrent = currentItem();
151#endif 158#endif
152} 159}
153 160
154 161
155void KOTodoListView::contentsDragMoveEvent(QDragMoveEvent *e) 162void KOTodoListView::contentsDragMoveEvent(QDragMoveEvent *e)
156{ 163{
157#ifndef KORG_NODND 164#ifndef KORG_NODND
158// kdDebug() << "KOTodoListView::contentsDragMoveEvent" << endl; 165// kdDebug() << "KOTodoListView::contentsDragMoveEvent" << endl;
159 166
160 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) && 167 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) &&
161 !QTextDrag::canDecode( e ) ) { 168 !QTextDrag::canDecode( e ) ) {
162 e->ignore(); 169 e->ignore();
163 return; 170 return;
164 } 171 }
165 172
166 e->accept(); 173 e->accept();
167#endif 174#endif
168} 175}
169 176
170void KOTodoListView::contentsDragLeaveEvent(QDragLeaveEvent *) 177void KOTodoListView::contentsDragLeaveEvent(QDragLeaveEvent *)
171{ 178{
172#ifndef KORG_NODND 179#ifndef KORG_NODND
173// kdDebug() << "KOTodoListView::contentsDragLeaveEvent" << endl; 180// kdDebug() << "KOTodoListView::contentsDragLeaveEvent" << endl;
174 181
175 setCurrentItem(mOldCurrent); 182 setCurrentItem(mOldCurrent);
176 setSelected(mOldCurrent,true); 183 setSelected(mOldCurrent,true);
177#endif 184#endif
178} 185}
179 186
180void KOTodoListView::contentsDropEvent(QDropEvent *e) 187void KOTodoListView::contentsDropEvent(QDropEvent *e)
181{ 188{
182#ifndef KORG_NODND 189#ifndef KORG_NODND
183// kdDebug() << "KOTodoListView::contentsDropEvent" << endl; 190// kdDebug() << "KOTodoListView::contentsDropEvent" << endl;
184 191
185 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) && 192 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) &&
186 !QTextDrag::canDecode( e ) ) { 193 !QTextDrag::canDecode( e ) ) {
187 e->ignore(); 194 e->ignore();
188 return; 195 return;
189 } 196 }
190 197
191 DndFactory factory( mCalendar ); 198 DndFactory factory( mCalendar );
192 Todo *todo = factory.createDropTodo(e); 199 Todo *todo = factory.createDropTodo(e);
193 200
194 if (todo) { 201 if (todo) {
195 e->acceptAction(); 202 e->acceptAction();
196 203
197 KOTodoViewItem *destination = 204 KOTodoViewItem *destination =
198 (KOTodoViewItem *)itemAt(contentsToViewport(e->pos())); 205 (KOTodoViewItem *)itemAt(contentsToViewport(e->pos()));
199 Todo *destinationEvent = 0; 206 Todo *destinationEvent = 0;
200 if (destination) destinationEvent = destination->todo(); 207 if (destination) destinationEvent = destination->todo();
201 208
202 Todo *existingTodo = mCalendar->todo(todo->uid()); 209 Todo *existingTodo = mCalendar->todo(todo->uid());
203 210
204 if(existingTodo) { 211 if(existingTodo) {
205 Incidence *to = destinationEvent; 212 Incidence *to = destinationEvent;
206 while(to) { 213 while(to) {
207 if (to->uid() == todo->uid()) { 214 if (to->uid() == todo->uid()) {
208 KMessageBox::sorry(this, 215 KMessageBox::sorry(this,
209 i18n("Cannot move Todo to itself\nor a child of itself"), 216 i18n("Cannot move Todo to itself\nor a child of itself"),
210 i18n("Drop Todo")); 217 i18n("Drop Todo"));
211 delete todo; 218 delete todo;
212 return; 219 return;
213 } 220 }
214 to = to->relatedTo(); 221 to = to->relatedTo();
215 } 222 }
216 internalDrop = true; 223 internalDrop = true;
217 if ( destinationEvent ) 224 if ( destinationEvent )
218 reparentTodoSignal( destinationEvent, existingTodo ); 225 reparentTodoSignal( destinationEvent, existingTodo );
219 else 226 else
220 unparentTodoSignal(existingTodo); 227 unparentTodoSignal(existingTodo);
221 delete todo; 228 delete todo;
222 } else { 229 } else {
223 mCalendar->addTodo(todo); 230 mCalendar->addTodo(todo);
224 emit todoDropped(todo, KOGlobals::EVENTADDED); 231 emit todoDropped(todo, KOGlobals::EVENTADDED);
225 if ( destinationEvent ) 232 if ( destinationEvent )
226 reparentTodoSignal( destinationEvent, todo ); 233 reparentTodoSignal( destinationEvent, todo );
227 } 234 }
228 } 235 }
229 else { 236 else {
230 QString text; 237 QString text;
231 if (QTextDrag::decode(e,text)) { 238 if (QTextDrag::decode(e,text)) {
232 //QListViewItem *qlvi = itemAt( contentsToViewport(e->pos()) ); 239 //QListViewItem *qlvi = itemAt( contentsToViewport(e->pos()) );
233 KOTodoViewItem *todoi = static_cast<KOTodoViewItem *>(itemAt( contentsToViewport(e->pos()) )); 240 KOTodoViewItem *todoi = static_cast<KOTodoViewItem *>(itemAt( contentsToViewport(e->pos()) ));
234 qDebug("Dropped : " + text); 241 qDebug("Dropped : " + text);
235 QStringList emails = QStringList::split(",",text); 242 QStringList emails = QStringList::split(",",text);
236 for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) { 243 for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) {
237 int pos = (*it).find("<"); 244 int pos = (*it).find("<");
238 QString name = (*it).left(pos); 245 QString name = (*it).left(pos);
239 QString email = (*it).mid(pos); 246 QString email = (*it).mid(pos);
240 if (!email.isEmpty() && todoi) { 247 if (!email.isEmpty() && todoi) {
241 todoi->todo()->addAttendee(new Attendee(name,email)); 248 todoi->todo()->addAttendee(new Attendee(name,email));
242 } 249 }
243 } 250 }
244 } 251 }
245 else { 252 else {
246 qDebug("KOTodoListView::contentsDropEvent(): Todo from drop not decodable "); 253 qDebug("KOTodoListView::contentsDropEvent(): Todo from drop not decodable ");
247 e->ignore(); 254 e->ignore();
248 } 255 }
249 } 256 }
250#endif 257#endif
251} 258}
252void KOTodoListView::wheelEvent (QWheelEvent *e) 259void KOTodoListView::wheelEvent (QWheelEvent *e)
253{ 260{
254 QListView::wheelEvent (e); 261 QListView::wheelEvent (e);
255} 262}
256 263
257void KOTodoListView::contentsMousePressEvent(QMouseEvent* e) 264void KOTodoListView::contentsMousePressEvent(QMouseEvent* e)
258{ 265{
259 266
260 QPoint p(contentsToViewport(e->pos())); 267 QPoint p(contentsToViewport(e->pos()));
261 QListViewItem *i = itemAt(p); 268 QListViewItem *i = itemAt(p);
262 bool rootClicked = true; 269 bool rootClicked = true;
263 if (i) { 270 if (i) {
264 // if the user clicked into the root decoration of the item, don't 271 // if the user clicked into the root decoration of the item, don't
265 // try to start a drag! 272 // try to start a drag!
266 int X = p.x(); 273 int X = p.x();
267 //qDebug("%d %d %d", X, header()->sectionPos(0), treeStepSize() ); 274 //qDebug("%d %d %d", X, header()->sectionPos(0), treeStepSize() );
268 if (X > header()->sectionPos(0) + 275 if (X > header()->sectionPos(0) +
269 treeStepSize() * (i->depth() + (rootIsDecorated() ? 1 : 0)) + 276 treeStepSize() * (i->depth() + (rootIsDecorated() ? 1 : 0)) +
270 itemMargin() +i->height()|| 277 itemMargin() +i->height()||
271 X < header()->sectionPos(0)) { 278 X < header()->sectionPos(0)) {
272 rootClicked = false; 279 rootClicked = false;
273 } 280 }
274 } else { 281 } else {
275 rootClicked = false; 282 rootClicked = false;
276 } 283 }
277#ifndef KORG_NODND 284#ifndef KORG_NODND
278 mMousePressed = false; 285 mMousePressed = false;
279 if (! rootClicked && !( e->button() == RightButton) ) { 286 if (! rootClicked && !( e->button() == RightButton) ) {
280 mPressPos = e->pos(); 287 mPressPos = e->pos();
281 mMousePressed = true; 288 mMousePressed = true;
282 } else { 289 } else {
283 mMousePressed = false; 290 mMousePressed = false;
284 } 291 }
285#endif 292#endif
286 //qDebug("KOTodoListView::contentsMousePressEvent %d", rootClicked); 293 //qDebug("KOTodoListView::contentsMousePressEvent %d", rootClicked);
287#ifndef DESKTOP_VERSION 294#ifndef DESKTOP_VERSION
288 if (!( e->button() == RightButton && rootClicked) ) 295 if (!( e->button() == RightButton && rootClicked) )
289 QListView::contentsMousePressEvent(e); 296 QListView::contentsMousePressEvent(e);
290#else 297#else
291 QListView::contentsMousePressEvent(e); 298 QListView::contentsMousePressEvent(e);
292#endif 299#endif
293} 300}
294void KOTodoListView::paintEvent(QPaintEvent* e) 301void KOTodoListView::paintEvent(QPaintEvent* e)
295{ 302{
296 emit paintNeeded(); 303 emit paintNeeded();
297 QListView::paintEvent( e); 304 QListView::paintEvent( e);
298} 305}
299void KOTodoListView::contentsMouseMoveEvent(QMouseEvent* e) 306void KOTodoListView::contentsMouseMoveEvent(QMouseEvent* e)
300{ 307{
301 308
302#ifndef KORG_NODND 309#ifndef KORG_NODND
303 //QListView::contentsMouseMoveEvent(e); 310 //QListView::contentsMouseMoveEvent(e);
304 if (mMousePressed && (mPressPos - e->pos()).manhattanLength() > 311 if (mMousePressed && (mPressPos - e->pos()).manhattanLength() >
305 QApplication::startDragDistance()*3) { 312 QApplication::startDragDistance()*3) {
306 mMousePressed = false; 313 mMousePressed = false;
307 QListViewItem *item = itemAt(contentsToViewport(mPressPos)); 314 QListViewItem *item = itemAt(contentsToViewport(mPressPos));
308 if (item) { 315 if (item) {
309 DndFactory factory( mCalendar ); 316 DndFactory factory( mCalendar );
310 ICalDrag *vd = factory.createDrag( 317 ICalDrag *vd = factory.createDrag(
311 ((KOTodoViewItem *)item)->todo(),viewport()); 318 ((KOTodoViewItem *)item)->todo(),viewport());
312 internalDrop = false; 319 internalDrop = false;
313 // we cannot do any senseful here, because the DnD is still broken in Qt 320 // we cannot do any senseful here, because the DnD is still broken in Qt
314 if (vd->drag()) { 321 if (vd->drag()) {
315 if ( !internalDrop ) { 322 if ( !internalDrop ) {
316 //emit deleteTodo( ((KOTodoViewItem *)item)->todo() ); 323 //emit deleteTodo( ((KOTodoViewItem *)item)->todo() );
317 qDebug("Dnd: External move: Delete drag source "); 324 qDebug("Dnd: External move: Delete drag source ");
318 } else 325 } else
319 qDebug("Dnd: Internal move "); 326 qDebug("Dnd: Internal move ");
320 327
321 } else { 328 } else {
322 if ( !internalDrop ) { 329 if ( !internalDrop ) {
323 qDebug("Dnd: External Copy"); 330 qDebug("Dnd: External Copy");
324 } else 331 } else
325 qDebug("DnD: Internal copy: Copy pending"); 332 qDebug("DnD: Internal copy: Copy pending");
326 } 333 }
327 } 334 }
328 } 335 }
329#endif 336#endif
330} 337}
331void KOTodoListView::keyReleaseEvent ( QKeyEvent *e ) 338void KOTodoListView::keyReleaseEvent ( QKeyEvent *e )
332{ 339{
333 if ( !e->isAutoRepeat() ) { 340 if ( !e->isAutoRepeat() ) {
334 mFlagKeyPressed = false; 341 mFlagKeyPressed = false;
335 } 342 }
336} 343}
337 344
338 345
339void KOTodoListView::keyPressEvent ( QKeyEvent * e ) 346void KOTodoListView::keyPressEvent ( QKeyEvent * e )
340{ 347{
341 qApp->processEvents(); 348 qApp->processEvents();
342 if ( e->isAutoRepeat() && !mFlagKeyPressed ) { 349 if ( e->isAutoRepeat() && !mFlagKeyPressed ) {
343 e->ignore(); 350 e->ignore();
344 // qDebug(" ignore %d",e->isAutoRepeat() ); 351 // qDebug(" ignore %d",e->isAutoRepeat() );
345 return; 352 return;
346 } 353 }
347 if (! e->isAutoRepeat() ) 354 if (! e->isAutoRepeat() )
348 mFlagKeyPressed = true; 355 mFlagKeyPressed = true;
349 QListViewItem* cn; 356 QListViewItem* cn;
350 if ( e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter ) { 357 if ( e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter ) {
351 cn = currentItem(); 358 cn = currentItem();
352 if ( cn ) { 359 if ( cn ) {
353 KOTodoViewItem* ci = (KOTodoViewItem*)( cn ); 360 KOTodoViewItem* ci = (KOTodoViewItem*)( cn );
354 if ( ci ){ 361 if ( ci ){
355 if ( e->state() == ShiftButton ) 362 if ( e->state() == ShiftButton )
356 ci->setOn( false ); 363 ci->setOn( false );
357 else 364 else
358 ci->setOn( true ); 365 ci->setOn( true );
359 cn = cn->itemBelow(); 366 cn = cn->itemBelow();
360 if ( cn ) { 367 if ( cn ) {
361 setCurrentItem ( cn ); 368 setCurrentItem ( cn );
362 ensureItemVisible ( cn ); 369 ensureItemVisible ( cn );
363 } 370 }
364 371
365 } 372 }
366 } 373 }
367 374
368 return; 375 return;
369 } 376 }
370 377
371 if ( e->state() == Qt::ControlButton || e->state() == Qt::ShiftButton || mName != "todolistsmall" ) { 378 if ( e->state() == Qt::ControlButton || e->state() == Qt::ShiftButton || mName != "todolistsmall" ) {
372 switch ( e->key() ) { 379 switch ( e->key() ) {
373 case Qt::Key_Down: 380 case Qt::Key_Down:
374 case Qt::Key_Up: 381 case Qt::Key_Up:
375 QListView::keyPressEvent ( e ); 382 QListView::keyPressEvent ( e );
376 break; 383 break;
377 case Qt::Key_Left: 384 case Qt::Key_Left:
378 case Qt::Key_Right: 385 case Qt::Key_Right:
379 QListView::keyPressEvent ( e ); 386 QListView::keyPressEvent ( e );
380 e->accept(); 387 e->accept();
381 return; 388 return;
382 break; 389 break;
383 default: 390 default:
384 e->ignore(); 391 e->ignore();
385 break; 392 break;
386 } 393 }
387 return; 394 return;
388 } 395 }
389 e->ignore(); 396 e->ignore();
390} 397}
391void KOTodoListView::contentsMouseReleaseEvent(QMouseEvent *e) 398void KOTodoListView::contentsMouseReleaseEvent(QMouseEvent *e)
392{ 399{
393 QListView::contentsMouseReleaseEvent(e); 400 QListView::contentsMouseReleaseEvent(e);
394 mMousePressed = false; 401 mMousePressed = false;
395} 402}
396 403
397void KOTodoListView::contentsMouseDoubleClickEvent(QMouseEvent *e) 404void KOTodoListView::contentsMouseDoubleClickEvent(QMouseEvent *e)
398{ 405{
399 if (!e) return; 406 if (!e) return;
400 407
401 QPoint vp = contentsToViewport(e->pos()); 408 QPoint vp = contentsToViewport(e->pos());
402 409
403 QListViewItem *item = itemAt(vp); 410 QListViewItem *item = itemAt(vp);
404 411
405 emit double_Clicked(item); 412 emit double_Clicked(item);
406 if (!item) return; 413 if (!item) return;
407 414
408 emit doubleClicked(item,vp,0); 415 emit doubleClicked(item,vp,0);
409} 416}
410 417
411///////////////////////////////////////////////////////////////////////////// 418/////////////////////////////////////////////////////////////////////////////
412 419
413KOQuickTodo::KOQuickTodo(QWidget *parent) : 420KOQuickTodo::KOQuickTodo(QWidget *parent) :
414 QLineEdit(parent) 421 QLineEdit(parent)
415{ 422{
416 setText(i18n("Click to add a new Todo")); 423 setText(i18n("Click to add a new Todo"));
417} 424}
418 425
419void KOQuickTodo::focusInEvent(QFocusEvent *ev) 426void KOQuickTodo::focusInEvent(QFocusEvent *ev)
420{ 427{
421 if ( text()==i18n("Click to add a new Todo") ) 428 if ( text()==i18n("Click to add a new Todo") )
422 setText(""); 429 setText("");
423 QLineEdit::focusInEvent(ev); 430 QLineEdit::focusInEvent(ev);
424} 431}
425 432
426void KOQuickTodo::focusOutEvent(QFocusEvent *ev) 433void KOQuickTodo::focusOutEvent(QFocusEvent *ev)
427{ 434{
428 setText(i18n("Click to add a new Todo")); 435 setText(i18n("Click to add a new Todo"));
429 QLineEdit::focusOutEvent(ev); 436 QLineEdit::focusOutEvent(ev);
430} 437}
431 438
432///////////////////////////////////////////////////////////////////////////// 439/////////////////////////////////////////////////////////////////////////////
433 440
434KOTodoView::KOTodoView(Calendar *calendar,QWidget* parent,const char* name) : 441KOTodoView::KOTodoView(Calendar *calendar,QWidget* parent,const char* name) :
435 KOrg::BaseView(calendar,parent,name) 442 KOrg::BaseView(calendar,parent,name)
436{ 443{
437 mPendingUpdateBeforeRepaint = false; 444 mPendingUpdateBeforeRepaint = false;
438 isFlatDisplay = false; 445 isFlatDisplay = false;
439 mNavigator = 0; 446 mNavigator = 0;
440 QBoxLayout *topLayout = new QVBoxLayout(this); 447 QBoxLayout *topLayout = new QVBoxLayout(this);
441 mName = QString ( name ); 448 mName = QString ( name );
442 mBlockUpdate = false; 449 mBlockUpdate = false;
443 mQuickAdd = new KOQuickTodo(this); 450 mQuickAdd = new KOQuickTodo(this);
444 topLayout->addWidget(mQuickAdd); 451 topLayout->addWidget(mQuickAdd);
445 452
446 if ( !KOPrefs::instance()->mEnableQuickTodo ) mQuickAdd->hide(); 453 if ( !KOPrefs::instance()->mEnableQuickTodo ) mQuickAdd->hide();
447 454
448 mTodoListView = new KOTodoListView(calendar,this, name ); 455 mTodoListView = new KOTodoListView(calendar,this, name );
449 topLayout->addWidget(mTodoListView); 456 topLayout->addWidget(mTodoListView);
450 //mTodoListView->header()->setMaximumHeight(30); 457 //mTodoListView->header()->setMaximumHeight(30);
451 mTodoListView->setRootIsDecorated(true); 458 mTodoListView->setRootIsDecorated(true);
452 mTodoListView->setAllColumnsShowFocus(true); 459 mTodoListView->setAllColumnsShowFocus(true);
453 460
454 mTodoListView->setShowSortIndicator(true); 461 mTodoListView->setShowSortIndicator(true);
455 462
456 mTodoListView->addColumn(i18n("Todo")); 463 mTodoListView->addColumn(i18n("Todo"));
457 mTodoListView->addColumn(i18n("Prio")); 464 mTodoListView->addColumn(i18n("Prio"));
458 mTodoListView->setColumnAlignment(1,AlignHCenter); 465 mTodoListView->setColumnAlignment(1,AlignHCenter);
459 mTodoListView->addColumn(i18n("Complete")); 466 mTodoListView->addColumn(i18n("Complete"));
460 mTodoListView->setColumnAlignment(2,AlignCenter); 467 mTodoListView->setColumnAlignment(2,AlignCenter);
461 468
462 mTodoListView->addColumn(i18n("Due Date")); 469 mTodoListView->addColumn(i18n("Due Date"));
463 mTodoListView->setColumnAlignment(3,AlignLeft); 470 mTodoListView->setColumnAlignment(3,AlignLeft);
464 mTodoListView->addColumn(i18n("Due Time")); 471 mTodoListView->addColumn(i18n("Due Time"));
465 mTodoListView->setColumnAlignment(4,AlignHCenter); 472 mTodoListView->setColumnAlignment(4,AlignHCenter);
466 473
467 mTodoListView->addColumn(i18n("Start Date")); 474 mTodoListView->addColumn(i18n("Start Date"));
468 mTodoListView->setColumnAlignment(5,AlignLeft); 475 mTodoListView->setColumnAlignment(5,AlignLeft);
469 mTodoListView->addColumn(i18n("Start Time")); 476 mTodoListView->addColumn(i18n("Start Time"));
470 mTodoListView->setColumnAlignment(6,AlignHCenter); 477 mTodoListView->setColumnAlignment(6,AlignHCenter);
471 478
472 mTodoListView->addColumn(i18n("Cancelled")); 479 mTodoListView->addColumn(i18n("Cancelled"));
473 mTodoListView->addColumn(i18n("Categories")); 480 mTodoListView->addColumn(i18n("Categories"));
474 mTodoListView->addColumn(i18n("Calendar")); 481 mTodoListView->addColumn(i18n("Calendar"));
475#if 0 482#if 0
476 mTodoListView->addColumn(i18n("Sort Id")); 483 mTodoListView->addColumn(i18n("Sort Id"));
477 mTodoListView->setColumnAlignment(4,AlignHCenter); 484 mTodoListView->setColumnAlignment(4,AlignHCenter);
478#endif 485#endif
479 486
480 mTodoListView->setMinimumHeight( 60 ); 487 mTodoListView->setMinimumHeight( 60 );
481 mTodoListView->setItemsRenameable( true ); 488 mTodoListView->setItemsRenameable( true );
482 mTodoListView->setRenameable( 0 ); 489 mTodoListView->setRenameable( 0 );
483 mTodoListView->setColumnWidth( 0, 120 ); 490 mTodoListView->setColumnWidth( 0, 120 );
484 int iii = 0; 491 int iii = 0;
485 for ( iii = 0; iii< 10 ; ++iii ) 492 for ( iii = 0; iii< 10 ; ++iii )
486 mTodoListView->setColumnWidthMode( iii, QListView::Manual ); 493 mTodoListView->setColumnWidthMode( iii, QListView::Manual );
487 494
488 495
489 mKOTodoViewWhatsThis = new KOTodoViewWhatsThis(mTodoListView->viewport(),this); 496 mKOTodoViewWhatsThis = new KOTodoViewWhatsThis(mTodoListView->viewport(),this);
490 497
491 mPriorityPopupMenu = new QPopupMenu(this); 498 mPriorityPopupMenu = new QPopupMenu(this);
492 for (int i = 1; i <= 5; i++) { 499 for (int i = 1; i <= 5; i++) {
493 QString label = QString ("%1").arg (i); 500 QString label = QString ("%1").arg (i);
494 mPriority[mPriorityPopupMenu->insertItem (label)] = i; 501 mPriority[mPriorityPopupMenu->insertItem (label)] = i;
495 } 502 }
496 connect (mPriorityPopupMenu, SIGNAL(activated (int)), SLOT (setNewPriority(int))); 503 connect (mPriorityPopupMenu, SIGNAL(activated (int)), SLOT (setNewPriority(int)));
497 504
498 mPercentageCompletedPopupMenu = new QPopupMenu(this); 505 mPercentageCompletedPopupMenu = new QPopupMenu(this);
499 for (int i = 0; i <= 100; i+=20) { 506 for (int i = 0; i <= 100; i+=20) {
500 QString label = QString ("%1 %").arg (i); 507 QString label = QString ("%1 %").arg (i);
501 mPercentage[mPercentageCompletedPopupMenu->insertItem (label)] = i; 508 mPercentage[mPercentageCompletedPopupMenu->insertItem (label)] = i;
502 } 509 }
503 connect (mPercentageCompletedPopupMenu, SIGNAL (activated (int)), SLOT (setNewPercentage (int))); 510 connect (mPercentageCompletedPopupMenu, SIGNAL (activated (int)), SLOT (setNewPercentage (int)));
504 511
505 512
506 513
507 mItemPopupMenu = new QPopupMenu(this); 514 mItemPopupMenu = new QPopupMenu(this);
508 mItemPopupMenu->insertItem(i18n("Show..."), this, 515 mItemPopupMenu->insertItem(i18n("Show..."), this,
509 SLOT (showTodo())); 516 SLOT (showTodo()));
510 mItemPopupMenu->insertItem(i18n("Edit..."), this, 517 mItemPopupMenu->insertItem(i18n("Edit..."), this,
511 SLOT (editTodo())); 518 SLOT (editTodo()));
512 mItemPopupMenu->insertItem( i18n("Delete"), this, 519 mItemPopupMenu->insertItem( i18n("Delete"), this,
513 SLOT (deleteTodo())); 520 SLOT (deleteTodo()));
514 mItemPopupMenu->insertItem( i18n("Clone..."), this, 521 mItemPopupMenu->insertItem( i18n("Clone..."), this,
515 SLOT (cloneTodo())); 522 SLOT (cloneTodo()));
516 mItemPopupMenu->insertItem( i18n("Move..."), this, 523 mItemPopupMenu->insertItem( i18n("Move..."), this,
517 SLOT (moveTodo())); 524 SLOT (moveTodo()));
518#ifndef DESKTOP_VERSION 525#ifndef DESKTOP_VERSION
519 mItemPopupMenu->insertItem( i18n("Beam..."), this, 526 mItemPopupMenu->insertItem( i18n("Beam..."), this,
520 SLOT (beamTodo())); 527 SLOT (beamTodo()));
521#endif 528#endif
522 mItemPopupMenu->insertItem( i18n("Toggle Cancel"), this, 529 mItemPopupMenu->insertItem( i18n("Toggle Cancel"), this,
523 SLOT (cancelTodo())); 530 SLOT (cancelTodo()));
524 mItemPopupMenu->insertSeparator(); 531 mItemPopupMenu->insertSeparator();
525 mItemPopupMenu->insertItem( i18n("Start/Stop todo..."), this, 532 mItemPopupMenu->insertItem( i18n("Start/Stop todo..."), this,
526 SLOT (toggleRunningItem())); 533 SLOT (toggleRunningItem()));
527 mItemPopupMenu->insertSeparator(); 534 mItemPopupMenu->insertSeparator();
528 /* 535 /*
529 mItemPopupMenu->insertItem( i18n("New Todo..."), this, 536 mItemPopupMenu->insertItem( i18n("New Todo..."), this,
530 SLOT (newTodo())); 537 SLOT (newTodo()));
531 */ 538 */
532 mItemPopupMenu->insertItem(i18n("New Sub-Todo..."), this, 539 mItemPopupMenu->insertItem(i18n("New Sub-Todo..."), this,
533 SLOT (newSubTodo())); 540 SLOT (newSubTodo()));
534 mItemPopupMenu->insertItem(i18n("Unparent Todo"), this, 541 mItemPopupMenu->insertItem(i18n("Unparent Todo"), this,
535 SLOT (unparentTodo()),0,21); 542 SLOT (unparentTodo()),0,21);
536 mItemPopupMenu->insertItem(i18n("Reparent Todo"), this, 543 mItemPopupMenu->insertItem(i18n("Reparent Todo"), this,
537 SLOT (reparentTodo()),0,22); 544 SLOT (reparentTodo()),0,22);
538 mItemPopupMenu->insertSeparator(); 545 mItemPopupMenu->insertSeparator();
539#if 0 546#if 0
540 mItemPopupMenu->insertItem(i18n("Delete completed To-Dos","Purge Completed"), 547 mItemPopupMenu->insertItem(i18n("Delete completed To-Dos","Purge Completed"),
541 this, SLOT( purgeCompleted() ) ); 548 this, SLOT( purgeCompleted() ) );
542 mItemPopupMenu->insertItem(i18n("toggle completed To-Dos","Show Completed"), 549 mItemPopupMenu->insertItem(i18n("toggle completed To-Dos","Show Completed"),
543 this, SLOT( toggleCompleted() ),0, 33 ); 550 this, SLOT( toggleCompleted() ),0, 33 );
544 mItemPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"), 551 mItemPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"),
545 this, SLOT( toggleQuickTodo() ),0, 34 ); 552 this, SLOT( toggleQuickTodo() ),0, 34 );
546 mItemPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"), 553 mItemPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"),
547 this, SLOT( toggleRunning() ),0, 35 ); 554 this, SLOT( toggleRunning() ),0, 35 );
548 555
549#endif 556#endif
550 mPopupMenu = new QPopupMenu(this); 557 mPopupMenu = new QPopupMenu(this);
551 mPopupMenu->insertItem(SmallIconSet("todo"), i18n("New Todo..."), this, 558 mPopupMenu->insertItem(SmallIconSet("todo"), i18n("New Todo..."), this,
552 SLOT (newTodo()),0,1); 559 SLOT (newTodo()),0,1);
553 mPopupMenu->insertItem(i18n("delete completed To-Dos","Purge Completed"), 560 mPopupMenu->insertItem(i18n("delete completed To-Dos","Purge Completed"),
554 this, SLOT(purgeCompleted()),0,2); 561 this, SLOT(purgeCompleted()),0,2);
555 mPopupMenu->insertItem(i18n("Show Completed"), 562 mPopupMenu->insertItem(i18n("Show Completed"),
556 this, SLOT( toggleCompleted() ),0,3 ); 563 this, SLOT( toggleCompleted() ),0,3 );
557 mPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"), 564 mPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"),
558 this, SLOT( toggleRunning() ),0,5 ); 565 this, SLOT( toggleRunning() ),0,5 );
559 mPopupMenu->insertItem(i18n(" set all open","Display all opened"), 566 mPopupMenu->insertItem(i18n(" set all open","Display all opened"),
560 this, SLOT( setAllOpen() ),0,6 ); 567 this, SLOT( setAllOpen() ),0,6 );
561 mPopupMenu->insertItem(i18n(" set all close","Display all closed"), 568 mPopupMenu->insertItem(i18n(" set all close","Display all closed"),
562 this, SLOT( setAllClose() ),0,7 ); 569 this, SLOT( setAllClose() ),0,7 );
563 mPopupMenu->insertItem(i18n(" set all flat","Display all flat"), 570 mPopupMenu->insertItem(i18n(" set all flat","Display all flat"),
564 this, SLOT( setAllFlat() ),0,8 ); 571 this, SLOT( setAllFlat() ),0,8 );
565 mPopupMenu->insertSeparator(); 572 mPopupMenu->insertSeparator();
566 mPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"), 573 mPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"),
567 this, SLOT( toggleQuickTodo() ),0,4 ); 574 this, SLOT( toggleQuickTodo() ),0,4 );
568 mDocPrefs = new DocPrefs( name ); 575 mDocPrefs = new DocPrefs( name );
569 576
570 mItemPopupMenu->insertItem(i18n("Todo View"),mPopupMenu ); 577 mItemPopupMenu->insertItem(i18n("Todo View"),mPopupMenu );
571 mPopupMenu->setCheckable( true ); 578 mPopupMenu->setCheckable( true );
572 mItemPopupMenu->setCheckable( true ); 579 mItemPopupMenu->setCheckable( true );
573 580
574 581
575 mPopupMenu->setItemChecked( 3,KOPrefs::instance()->mShowCompletedTodo ); 582 mPopupMenu->setItemChecked( 3,KOPrefs::instance()->mShowCompletedTodo );
576 mItemPopupMenu->setItemChecked( 33 , KOPrefs::instance()->mShowCompletedTodo ); 583 mItemPopupMenu->setItemChecked( 33 , KOPrefs::instance()->mShowCompletedTodo );
577 584
578 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo); 585 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo);
579 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo ); 586 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo );
580 587
581 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos); 588 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos);
582 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos ); 589 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos );
583 590
584 591
585 // Double clicking conflicts with opening/closing the subtree 592 // Double clicking conflicts with opening/closing the subtree
586 connect( mTodoListView, SIGNAL( doubleClicked( QListViewItem *) ), 593 connect( mTodoListView, SIGNAL( doubleClicked( QListViewItem *) ),
587 SLOT( editItem( QListViewItem *) ) ); 594 SLOT( editItem( QListViewItem *) ) );
588 /* 595 /*
589 connect( mTodoListView, SIGNAL( rightButtonClicked ( QListViewItem *, 596 connect( mTodoListView, SIGNAL( rightButtonClicked ( QListViewItem *,
590 const QPoint &,int ) ), 597 const QPoint &,int ) ),
591 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) ); 598 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) );
592 */ 599 */
593 connect( mTodoListView, SIGNAL( contextRequest ( QListViewItem *, 600 connect( mTodoListView, SIGNAL( contextRequest ( QListViewItem *,
594 const QPoint &,int ) ), 601 const QPoint &,int ) ),
595 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) ); 602 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) );
596 connect( mTodoListView, SIGNAL( clicked( QListViewItem * ) ), 603 connect( mTodoListView, SIGNAL( clicked( QListViewItem * ) ),
597 SLOT( itemClicked( QListViewItem * ) ) ); 604 SLOT( itemClicked( QListViewItem * ) ) );
598 connect( mTodoListView, SIGNAL( double_Clicked( QListViewItem * ) ), 605 connect( mTodoListView, SIGNAL( double_Clicked( QListViewItem * ) ),
599 SLOT( itemDoubleClicked( QListViewItem * ) ) ); 606 SLOT( itemDoubleClicked( QListViewItem * ) ) );
600 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ), 607 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ),
601 SLOT( updateView() ) ); 608 SLOT( updateView() ) );
602 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ), 609 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ),
603 SLOT( todoModified(Todo *, int) ) ); 610 SLOT( todoModified(Todo *, int) ) );
604 connect( mTodoListView, SIGNAL( expanded( QListViewItem * ) ), 611 connect( mTodoListView, SIGNAL( expanded( QListViewItem * ) ),
605 SLOT( itemStateChanged( QListViewItem * ) ) ); 612 SLOT( itemStateChanged( QListViewItem * ) ) );
606 connect( mTodoListView, SIGNAL( collapsed( QListViewItem * ) ), 613 connect( mTodoListView, SIGNAL( collapsed( QListViewItem * ) ),
607 SLOT( itemStateChanged( QListViewItem * ) ) ); 614 SLOT( itemStateChanged( QListViewItem * ) ) );
diff --git a/libkcal/todo.cpp b/libkcal/todo.cpp
index d062492..62b74f1 100644
--- a/libkcal/todo.cpp
+++ b/libkcal/todo.cpp
@@ -1,593 +1,599 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <kglobal.h> 21#include <kglobal.h>
22#include <kglobalsettings.h> 22#include <kglobalsettings.h>
23#include <klocale.h> 23#include <klocale.h>
24#include <kdebug.h> 24#include <kdebug.h>
25#include <qregexp.h> 25#include <qregexp.h>
26#include <qfileinfo.h> 26#include <qfileinfo.h>
27 27
28#include "calendarlocal.h" 28#include "calendarlocal.h"
29#include "icalformat.h" 29#include "icalformat.h"
30#include "todo.h" 30#include "todo.h"
31 31
32using namespace KCal; 32using namespace KCal;
33 33
34Todo::Todo(): QObject(), Incidence() 34Todo::Todo(): QObject(), Incidence()
35{ 35{
36// mStatus = TENTATIVE; 36// mStatus = TENTATIVE;
37 37
38 mHasDueDate = false; 38 mHasDueDate = false;
39 setHasStartDate( false ); 39 setHasStartDate( false );
40 mCompleted = getEvenTime(QDateTime::currentDateTime()); 40 mCompleted = getEvenTime(QDateTime::currentDateTime());
41 mHasCompletedDate = false; 41 mHasCompletedDate = false;
42 mPercentComplete = 0; 42 mPercentComplete = 0;
43 mRunning = false; 43 mRunning = false;
44 mRunSaveTimer = 0; 44 mRunSaveTimer = 0;
45} 45}
46 46
47Todo::Todo(const Todo &t) : QObject(),Incidence(t) 47Todo::Todo(const Todo &t) : QObject(),Incidence(t)
48{ 48{
49 mDtDue = t.mDtDue; 49 mDtDue = t.mDtDue;
50 mHasDueDate = t.mHasDueDate; 50 mHasDueDate = t.mHasDueDate;
51 mCompleted = t.mCompleted; 51 mCompleted = t.mCompleted;
52 mHasCompletedDate = t.mHasCompletedDate; 52 mHasCompletedDate = t.mHasCompletedDate;
53 mPercentComplete = t.mPercentComplete; 53 mPercentComplete = t.mPercentComplete;
54 mRunning = false; 54 mRunning = false;
55 mRunSaveTimer = 0; 55 mRunSaveTimer = 0;
56} 56}
57 57
58Todo::~Todo() 58Todo::~Todo()
59{ 59{
60 setRunning( false ); 60 setRunning( false );
61 //qDebug("Todo::~Todo() "); 61 //qDebug("Todo::~Todo() ");
62} 62}
63 63
64void Todo::setRunningFalse( QString s ) 64void Todo::setRunningFalse( QString s )
65{ 65{
66 if ( ! mRunning ) 66 if ( ! mRunning )
67 return; 67 return;
68 mRunning = false; 68 mRunning = false;
69 mRunSaveTimer->stop(); 69 mRunSaveTimer->stop();
70 saveRunningInfoToFile( s ); 70 saveRunningInfoToFile( s );
71} 71}
72void Todo::stopRunning() 72void Todo::stopRunning()
73{ 73{
74 if ( !mRunning ) 74 if ( !mRunning )
75 return; 75 return;
76 if ( mRunSaveTimer ) 76 if ( mRunSaveTimer )
77 mRunSaveTimer->stop(); 77 mRunSaveTimer->stop();
78 mRunning = false; 78 mRunning = false;
79} 79}
80void Todo::setRunning( bool run ) 80void Todo::setRunning( bool run )
81{ 81{
82 if ( run == mRunning ) 82 if ( run == mRunning )
83 return; 83 return;
84 //qDebug("Todo::setRunning %d ", run); 84 //qDebug("Todo::setRunning %d ", run);
85 if ( !mRunSaveTimer ) { 85 if ( !mRunSaveTimer ) {
86 mRunSaveTimer = new QTimer ( this ); 86 mRunSaveTimer = new QTimer ( this );
87 connect ( mRunSaveTimer, SIGNAL( timeout() ), this , SLOT ( saveRunningInfoToFile() ) ); 87 connect ( mRunSaveTimer, SIGNAL( timeout() ), this , SLOT ( saveRunningInfoToFile() ) );
88 } 88 }
89 mRunning = run; 89 mRunning = run;
90 if ( mRunning ) { 90 if ( mRunning ) {
91 mRunSaveTimer->start( 1000 * 60 * 5 ); // 5 min 91 mRunSaveTimer->start( 1000 * 60 * 5 ); // 5 min
92 mRunStart = QDateTime::currentDateTime(); 92 mRunStart = QDateTime::currentDateTime();
93 } else { 93 } else {
94 mRunSaveTimer->stop(); 94 mRunSaveTimer->stop();
95 saveRunningInfoToFile(); 95 saveRunningInfoToFile();
96 } 96 }
97} 97}
98 98void Todo::saveRunningInfo( QString comment, QDateTime start, QDateTime end )
99{
100 mRunStart = start;
101 mRunEnd = end;
102 saveRunningInfoToFile( comment );
103}
99void Todo::saveRunningInfoToFile() 104void Todo::saveRunningInfoToFile()
100{ 105{
106 mRunEnd = QDateTime::currentDateTime();
101 saveRunningInfoToFile( QString::null ); 107 saveRunningInfoToFile( QString::null );
102} 108}
103void Todo::saveRunningInfoToFile( QString comment ) 109void Todo::saveRunningInfoToFile( QString comment )
104{ 110{
105 //qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1()); 111 //qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1());
106 if ( mRunStart.secsTo ( QDateTime::currentDateTime() ) < 10 ) { 112 if ( mRunStart.secsTo ( QDateTime::currentDateTime() ) < 10 ) {
107 qDebug("Running time < 30 seconds. Skipped. "); 113 qDebug("Running time < 30 seconds. Skipped. ");
108 return; 114 return;
109 } 115 }
110 QString dir = KGlobalSettings::timeTrackerDir(); 116 QString dir = KGlobalSettings::timeTrackerDir();
111 //qDebug("%s ", dir.latin1()); 117 //qDebug("%s ", dir.latin1());
112 QString file = "%1%2%3-%4%5%6-"; 118 QString file = "%1%2%3-%4%5%6-";
113 file = file.arg( mRunStart.date().year(), 4).arg( mRunStart.date().month(),2 ).arg( mRunStart.date().day(), 2 ).arg( mRunStart.time().hour(),2 ).arg( mRunStart.time().minute(),2 ).arg( mRunStart.time().second(),2 ); 119 file = file.arg( mRunStart.date().year(), 4).arg( mRunStart.date().month(),2 ).arg( mRunStart.date().day(), 2 ).arg( mRunStart.time().hour(),2 ).arg( mRunStart.time().minute(),2 ).arg( mRunStart.time().second(),2 );
114 file.replace ( QRegExp (" "), "0" ); 120 file.replace ( QRegExp (" "), "0" );
115 file += uid(); 121 file += uid();
116 //qDebug("File %s ",file.latin1() ); 122 //qDebug("File %s ",file.latin1() );
117 CalendarLocal cal; 123 CalendarLocal cal;
118 cal.setLocalTime(); 124 cal.setLocalTime();
119 Todo * to = (Todo*) clone(); 125 Todo * to = (Todo*) clone();
120 to->setFloats( false ); 126 to->setFloats( false );
121 to->setDtStart( mRunStart ); 127 to->setDtStart( mRunStart );
122 to->setHasStartDate( true ); 128 to->setHasStartDate( true );
123 to->setDtDue( QDateTime::currentDateTime() ); 129 to->setDtDue( mRunEnd );
124 to->setHasDueDate( true ); 130 to->setHasDueDate( true );
125 to->setUid( file ); 131 to->setUid( file );
126 if ( !comment.isEmpty() ) { 132 if ( !comment.isEmpty() ) {
127 QString des = to->description(); 133 QString des = to->description();
128 if ( des.isEmpty () ) 134 if ( des.isEmpty () )
129 to->setDescription( "TT-Note: " + comment ); 135 to->setDescription( "TT-Note: " + comment );
130 else 136 else
131 to->setDescription( "TT-Note: " + comment +"\n" + des ); 137 to->setDescription( "TT-Note: " + comment +"\n" + des );
132 } 138 }
133 cal.addIncidence( to ); 139 cal.addIncidence( to );
134 ICalFormat format; 140 ICalFormat format;
135 file = dir +"/" +file +".ics"; 141 file = dir +"/" +file +".ics";
136 format.save( &cal, file ); 142 format.save( &cal, file );
137 saveParents(); 143 saveParents();
138 144
139} 145}
140void Todo::saveParents() 146void Todo::saveParents()
141{ 147{
142 if (!relatedTo() ) 148 if (!relatedTo() )
143 return; 149 return;
144 Incidence * inc = relatedTo(); 150 Incidence * inc = relatedTo();
145 if ( inc->typeID() != todoID ) 151 if ( inc->typeID() != todoID )
146 return; 152 return;
147 Todo* to = (Todo*)inc; 153 Todo* to = (Todo*)inc;
148 bool saveTodo = false; 154 bool saveTodo = false;
149 QString file = KGlobalSettings::timeTrackerDir() + "/"+ to->uid() + ".ics"; 155 QString file = KGlobalSettings::timeTrackerDir() + "/"+ to->uid() + ".ics";
150 QFileInfo fi ( file ); 156 QFileInfo fi ( file );
151 if ( fi.exists() ) { 157 if ( fi.exists() ) {
152 if ( fi.lastModified () < to->lastModified ()) 158 if ( fi.lastModified () < to->lastModified ())
153 saveTodo = true; 159 saveTodo = true;
154 } else { 160 } else {
155 saveTodo = true; 161 saveTodo = true;
156 } 162 }
157 if ( saveTodo ) { 163 if ( saveTodo ) {
158 CalendarLocal cal; 164 CalendarLocal cal;
159 cal.setLocalTime(); 165 cal.setLocalTime();
160 Todo * par = (Todo *) to->clone(); 166 Todo * par = (Todo *) to->clone();
161 cal.addIncidence( par ); 167 cal.addIncidence( par );
162 ICalFormat format; 168 ICalFormat format;
163 format.save( &cal, file ); 169 format.save( &cal, file );
164 } 170 }
165 to->saveParents(); 171 to->saveParents();
166} 172}
167 173
168int Todo::runTime() 174int Todo::runTime()
169{ 175{
170 if ( !mRunning ) 176 if ( !mRunning )
171 return 0; 177 return 0;
172 return mRunStart.secsTo( QDateTime::currentDateTime() ); 178 return mRunStart.secsTo( QDateTime::currentDateTime() );
173} 179}
174bool Todo::hasRunningSub() 180bool Todo::hasRunningSub()
175{ 181{
176 if ( mRunning ) 182 if ( mRunning )
177 return true; 183 return true;
178 Incidence *aTodo; 184 Incidence *aTodo;
179 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) { 185 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) {
180 if ( ((Todo*)aTodo)->hasRunningSub() ) 186 if ( ((Todo*)aTodo)->hasRunningSub() )
181 return true; 187 return true;
182 } 188 }
183 return false; 189 return false;
184} 190}
185Incidence *Todo::clone() 191Incidence *Todo::clone()
186{ 192{
187 return new Todo(*this); 193 return new Todo(*this);
188} 194}
189 195
190bool Todo::contains ( Todo* from ) 196bool Todo::contains ( Todo* from )
191{ 197{
192 198
193 if ( !from->summary().isEmpty() ) 199 if ( !from->summary().isEmpty() )
194 if ( !summary().startsWith( from->summary() )) 200 if ( !summary().startsWith( from->summary() ))
195 return false; 201 return false;
196 if ( from->hasStartDate() ) { 202 if ( from->hasStartDate() ) {
197 if ( !hasStartDate() ) 203 if ( !hasStartDate() )
198 return false; 204 return false;
199 if ( from->dtStart() != dtStart()) 205 if ( from->dtStart() != dtStart())
200 return false; 206 return false;
201 } 207 }
202 if ( from->hasDueDate() ){ 208 if ( from->hasDueDate() ){
203 if ( !hasDueDate() ) 209 if ( !hasDueDate() )
204 return false; 210 return false;
205 if ( from->dtDue() != dtDue()) 211 if ( from->dtDue() != dtDue())
206 return false; 212 return false;
207 } 213 }
208 if ( !from->location().isEmpty() ) 214 if ( !from->location().isEmpty() )
209 if ( !location().startsWith( from->location() ) ) 215 if ( !location().startsWith( from->location() ) )
210 return false; 216 return false;
211 if ( !from->description().isEmpty() ) 217 if ( !from->description().isEmpty() )
212 if ( !description().startsWith( from->description() )) 218 if ( !description().startsWith( from->description() ))
213 return false; 219 return false;
214 if ( from->alarms().count() ) { 220 if ( from->alarms().count() ) {
215 Alarm *a = from->alarms().first(); 221 Alarm *a = from->alarms().first();
216 if ( a->enabled() ){ 222 if ( a->enabled() ){
217 if ( !alarms().count() ) 223 if ( !alarms().count() )
218 return false; 224 return false;
219 Alarm *b = alarms().first(); 225 Alarm *b = alarms().first();
220 if( ! b->enabled() ) 226 if( ! b->enabled() )
221 return false; 227 return false;
222 if ( ! (a->offset() == b->offset() )) 228 if ( ! (a->offset() == b->offset() ))
223 return false; 229 return false;
224 } 230 }
225 } 231 }
226 232
227 QStringList cat = categories(); 233 QStringList cat = categories();
228 QStringList catFrom = from->categories(); 234 QStringList catFrom = from->categories();
229 QString nCat; 235 QString nCat;
230 unsigned int iii; 236 unsigned int iii;
231 for ( iii = 0; iii < catFrom.count();++iii ) { 237 for ( iii = 0; iii < catFrom.count();++iii ) {
232 nCat = catFrom[iii]; 238 nCat = catFrom[iii];
233 if ( !nCat.isEmpty() ) 239 if ( !nCat.isEmpty() )
234 if ( !cat.contains( nCat )) { 240 if ( !cat.contains( nCat )) {
235 return false; 241 return false;
236 } 242 }
237 } 243 }
238 if ( from->isCompleted() ) { 244 if ( from->isCompleted() ) {
239 if ( !isCompleted() ) 245 if ( !isCompleted() )
240 return false; 246 return false;
241 } 247 }
242 if( priority() != from->priority() ) 248 if( priority() != from->priority() )
243 return false; 249 return false;
244 250
245 251
246 return true; 252 return true;
247 253
248} 254}
249bool KCal::operator==( const Todo& t1, const Todo& t2 ) 255bool KCal::operator==( const Todo& t1, const Todo& t2 )
250{ 256{
251 257
252 bool ret = operator==( (const Incidence&)t1, (const Incidence&)t2 ); 258 bool ret = operator==( (const Incidence&)t1, (const Incidence&)t2 );
253 if ( ! ret ) 259 if ( ! ret )
254 return false; 260 return false;
255 if ( t1.hasDueDate() == t2.hasDueDate() ) { 261 if ( t1.hasDueDate() == t2.hasDueDate() ) {
256 if ( t1.hasDueDate() ) { 262 if ( t1.hasDueDate() ) {
257 if ( t1.doesFloat() == t2.doesFloat() ) { 263 if ( t1.doesFloat() == t2.doesFloat() ) {
258 if ( t1.doesFloat() ) { 264 if ( t1.doesFloat() ) {
259 if ( t1.dtDue().date() != t2.dtDue().date() ) 265 if ( t1.dtDue().date() != t2.dtDue().date() )
260 return false; 266 return false;
261 } else 267 } else
262 if ( t1.dtDue() != t2.dtDue() ) 268 if ( t1.dtDue() != t2.dtDue() )
263 return false; 269 return false;
264 } else 270 } else
265 return false;// float != 271 return false;// float !=
266 } 272 }
267 273
268 } else 274 } else
269 return false; 275 return false;
270 if ( t1.percentComplete() != t2.percentComplete() ) 276 if ( t1.percentComplete() != t2.percentComplete() )
271 return false; 277 return false;
272 if ( t1.isCompleted() ) { 278 if ( t1.isCompleted() ) {
273 if ( t1.hasCompletedDate() == t2.hasCompletedDate() ) { 279 if ( t1.hasCompletedDate() == t2.hasCompletedDate() ) {
274 if ( t1.hasCompletedDate() ) { 280 if ( t1.hasCompletedDate() ) {
275 if ( t1.completed() != t2.completed() ) 281 if ( t1.completed() != t2.completed() )
276 return false; 282 return false;
277 } 283 }
278 284
279 } else 285 } else
280 return false; 286 return false;
281 } 287 }
282 return true; 288 return true;
283 289
284} 290}
285 291
286void Todo::setDtDue(const QDateTime &dtDue) 292void Todo::setDtDue(const QDateTime &dtDue)
287{ 293{
288 //int diffsecs = mDtDue.secsTo(dtDue); 294 //int diffsecs = mDtDue.secsTo(dtDue);
289 295
290 /*if (mReadOnly) return; 296 /*if (mReadOnly) return;
291 const QPtrList<Alarm>& alarms = alarms(); 297 const QPtrList<Alarm>& alarms = alarms();
292 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) { 298 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) {
293 if (alarm->enabled()) { 299 if (alarm->enabled()) {
294 alarm->setTime(alarm->time().addSecs(diffsecs)); 300 alarm->setTime(alarm->time().addSecs(diffsecs));
295 } 301 }
296 }*/ 302 }*/
297 mDtDue = getEvenTime(dtDue); 303 mDtDue = getEvenTime(dtDue);
298 304
299 //kdDebug(5800) << "setDtDue says date is " << mDtDue.toString() << endl; 305 //kdDebug(5800) << "setDtDue says date is " << mDtDue.toString() << endl;
300 306
301 /*const QPtrList<Alarm>& alarms = alarms(); 307 /*const QPtrList<Alarm>& alarms = alarms();
302 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) 308 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next())
303 alarm->setAlarmStart(mDtDue);*/ 309 alarm->setAlarmStart(mDtDue);*/
304 updated(); 310 updated();
305} 311}
306 312
307QDateTime Todo::dtDue() const 313QDateTime Todo::dtDue() const
308{ 314{
309 return mDtDue; 315 return mDtDue;
310} 316}
311 317
312QString Todo::dtDueTimeStr() const 318QString Todo::dtDueTimeStr() const
313{ 319{
314 return KGlobal::locale()->formatTime(mDtDue.time()); 320 return KGlobal::locale()->formatTime(mDtDue.time());
315} 321}
316 322
317QString Todo::dtDueDateStr(bool shortfmt) const 323QString Todo::dtDueDateStr(bool shortfmt) const
318{ 324{
319 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt); 325 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt);
320} 326}
321 327
322QString Todo::dtDueStr(bool shortfmt) const 328QString Todo::dtDueStr(bool shortfmt) const
323{ 329{
324 if ( doesFloat() ) 330 if ( doesFloat() )
325 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt); 331 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt);
326 return KGlobal::locale()->formatDateTime(mDtDue, shortfmt); 332 return KGlobal::locale()->formatDateTime(mDtDue, shortfmt);
327} 333}
328// retval 0 : no found 334// retval 0 : no found
329// 1 : due for date found 335// 1 : due for date found
330// 2 : overdue for date found 336// 2 : overdue for date found
331int Todo::hasDueSubTodoForDate( const QDate & date, bool checkSubtodos ) 337int Todo::hasDueSubTodoForDate( const QDate & date, bool checkSubtodos )
332{ 338{
333 int retval = 0; 339 int retval = 0;
334 if ( isCompleted() ) 340 if ( isCompleted() )
335 return 0; 341 return 0;
336 if ( hasDueDate() ) { 342 if ( hasDueDate() ) {
337 if ( dtDue().date() < date ) 343 if ( dtDue().date() < date )
338 return 2; 344 return 2;
339 // we do not return, because we may find an overdue sub todo 345 // we do not return, because we may find an overdue sub todo
340 if ( dtDue().date() == date ) 346 if ( dtDue().date() == date )
341 retval = 1; 347 retval = 1;
342 } 348 }
343 if ( checkSubtodos ) { 349 if ( checkSubtodos ) {
344 Incidence *aTodo; 350 Incidence *aTodo;
345 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) { 351 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) {
346 int ret = ((Todo*)aTodo)->hasDueSubTodoForDate( date ,checkSubtodos ); 352 int ret = ((Todo*)aTodo)->hasDueSubTodoForDate( date ,checkSubtodos );
347 if ( ret == 2 ) 353 if ( ret == 2 )
348 return 2; 354 return 2;
349 if ( ret == 1) 355 if ( ret == 1)
350 retval = 1; 356 retval = 1;
351 } 357 }
352 } 358 }
353 return retval; 359 return retval;
354} 360}
355int Todo::hasDueSubTodo( bool checkSubtodos ) //= true 361int Todo::hasDueSubTodo( bool checkSubtodos ) //= true
356{ 362{
357 return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos ); 363 return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos );
358} 364}
359bool Todo::hasDueDate() const 365bool Todo::hasDueDate() const
360{ 366{
361 return mHasDueDate; 367 return mHasDueDate;
362} 368}
363 369
364void Todo::setHasDueDate(bool f) 370void Todo::setHasDueDate(bool f)
365{ 371{
366 if (mReadOnly) return; 372 if (mReadOnly) return;
367 mHasDueDate = f; 373 mHasDueDate = f;
368 updated(); 374 updated();
369} 375}
370 376
371 377
372#if 0 378#if 0
373void Todo::setStatus(const QString &statStr) 379void Todo::setStatus(const QString &statStr)
374{ 380{
375 if (mReadOnly) return; 381 if (mReadOnly) return;
376 QString ss(statStr.upper()); 382 QString ss(statStr.upper());
377 383
378 if (ss == "X-ACTION") 384 if (ss == "X-ACTION")
379 mStatus = NEEDS_ACTION; 385 mStatus = NEEDS_ACTION;
380 else if (ss == "NEEDS ACTION") 386 else if (ss == "NEEDS ACTION")
381 mStatus = NEEDS_ACTION; 387 mStatus = NEEDS_ACTION;
382 else if (ss == "ACCEPTED") 388 else if (ss == "ACCEPTED")
383 mStatus = ACCEPTED; 389 mStatus = ACCEPTED;
384 else if (ss == "SENT") 390 else if (ss == "SENT")
385 mStatus = SENT; 391 mStatus = SENT;
386 else if (ss == "TENTATIVE") 392 else if (ss == "TENTATIVE")
387 mStatus = TENTATIVE; 393 mStatus = TENTATIVE;
388 else if (ss == "CONFIRMED") 394 else if (ss == "CONFIRMED")
389 mStatus = CONFIRMED; 395 mStatus = CONFIRMED;
390 else if (ss == "DECLINED") 396 else if (ss == "DECLINED")
391 mStatus = DECLINED; 397 mStatus = DECLINED;
392 else if (ss == "COMPLETED") 398 else if (ss == "COMPLETED")
393 mStatus = COMPLETED; 399 mStatus = COMPLETED;
394 else if (ss == "DELEGATED") 400 else if (ss == "DELEGATED")
395 mStatus = DELEGATED; 401 mStatus = DELEGATED;
396 402
397 updated(); 403 updated();
398} 404}
399 405
400void Todo::setStatus(int status) 406void Todo::setStatus(int status)
401{ 407{
402 if (mReadOnly) return; 408 if (mReadOnly) return;
403 mStatus = status; 409 mStatus = status;
404 updated(); 410 updated();
405} 411}
406 412
407int Todo::status() const 413int Todo::status() const
408{ 414{
409 return mStatus; 415 return mStatus;
410} 416}
411 417
412QString Todo::statusStr() const 418QString Todo::statusStr() const
413{ 419{
414 switch(mStatus) { 420 switch(mStatus) {
415 case NEEDS_ACTION: 421 case NEEDS_ACTION:
416 return QString("NEEDS ACTION"); 422 return QString("NEEDS ACTION");
417 break; 423 break;
418 case ACCEPTED: 424 case ACCEPTED:
419 return QString("ACCEPTED"); 425 return QString("ACCEPTED");
420 break; 426 break;
421 case SENT: 427 case SENT:
422 return QString("SENT"); 428 return QString("SENT");
423 break; 429 break;
424 case TENTATIVE: 430 case TENTATIVE:
425 return QString("TENTATIVE"); 431 return QString("TENTATIVE");
426 break; 432 break;
427 case CONFIRMED: 433 case CONFIRMED:
428 return QString("CONFIRMED"); 434 return QString("CONFIRMED");
429 break; 435 break;
430 case DECLINED: 436 case DECLINED:
431 return QString("DECLINED"); 437 return QString("DECLINED");
432 break; 438 break;
433 case COMPLETED: 439 case COMPLETED:
434 return QString("COMPLETED"); 440 return QString("COMPLETED");
435 break; 441 break;
436 case DELEGATED: 442 case DELEGATED:
437 return QString("DELEGATED"); 443 return QString("DELEGATED");
438 break; 444 break;
439 } 445 }
440 return QString(""); 446 return QString("");
441} 447}
442#endif 448#endif
443 449
444bool Todo::isCompleted() const 450bool Todo::isCompleted() const
445{ 451{
446 if (mPercentComplete == 100) { 452 if (mPercentComplete == 100) {
447 return true; 453 return true;
448 } 454 }
449 else return false; 455 else return false;
450} 456}
451 457
452void Todo::setCompleted(bool completed) 458void Todo::setCompleted(bool completed)
453{ 459{
454 if ( mHasRecurrenceID && completed && mPercentComplete != 100 ) { 460 if ( mHasRecurrenceID && completed && mPercentComplete != 100 ) {
455 if ( !setRecurDates() ) 461 if ( !setRecurDates() )
456 completed = false; 462 completed = false;
457 } 463 }
458 if (completed) mPercentComplete = 100; 464 if (completed) mPercentComplete = 100;
459 else { 465 else {
460 mPercentComplete = 0; 466 mPercentComplete = 0;
461 mHasCompletedDate = false; 467 mHasCompletedDate = false;
462 } 468 }
463 updated(); 469 updated();
464} 470}
465 471
466QDateTime Todo::completed() const 472QDateTime Todo::completed() const
467{ 473{
468 return mCompleted; 474 return mCompleted;
469} 475}
470 476
471QString Todo::completedStr( bool shortF ) const 477QString Todo::completedStr( bool shortF ) const
472{ 478{
473 return KGlobal::locale()->formatDateTime(mCompleted, shortF); 479 return KGlobal::locale()->formatDateTime(mCompleted, shortF);
474} 480}
475 481
476void Todo::setCompleted(const QDateTime &completed) 482void Todo::setCompleted(const QDateTime &completed)
477{ 483{
478 //qDebug("Todo::setCompleted "); 484 //qDebug("Todo::setCompleted ");
479 if ( mHasCompletedDate ) { 485 if ( mHasCompletedDate ) {
480 // qDebug("has completed data - return "); 486 // qDebug("has completed data - return ");
481 return; 487 return;
482 } 488 }
483 mHasCompletedDate = true; 489 mHasCompletedDate = true;
484 mPercentComplete = 100; 490 mPercentComplete = 100;
485 mCompleted = getEvenTime(completed); 491 mCompleted = getEvenTime(completed);
486 updated(); 492 updated();
487} 493}
488 494
489bool Todo::hasCompletedDate() const 495bool Todo::hasCompletedDate() const
490{ 496{
491 return mHasCompletedDate; 497 return mHasCompletedDate;
492} 498}
493 499
494int Todo::percentComplete() const 500int Todo::percentComplete() const
495{ 501{
496 return mPercentComplete; 502 return mPercentComplete;
497} 503}
498bool Todo::setRecurDates() 504bool Todo::setRecurDates()
499{ 505{
500 if ( !mHasRecurrenceID ) 506 if ( !mHasRecurrenceID )
501 return true; 507 return true;
502 int secs = mDtStart.secsTo( dtDue() ); 508 int secs = mDtStart.secsTo( dtDue() );
503 bool ok; 509 bool ok;
504 qDebug("T:setRecurDates() "); 510 qDebug("T:setRecurDates() ");
505 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() ); 511 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
506 QDateTime next = getNextOccurence( mRecurrenceID, &ok ); 512 QDateTime next = getNextOccurence( mRecurrenceID, &ok );
507 if ( ok ) { 513 if ( ok ) {
508 mRecurrenceID = next; 514 mRecurrenceID = next;
509 mDtStart = next; 515 mDtStart = next;
510 setDtDue( next.addSecs( secs ) ); 516 setDtDue( next.addSecs( secs ) );
511 if ( QDateTime::currentDateTime() > next) 517 if ( QDateTime::currentDateTime() > next)
512 return false; 518 return false;
513 } else { 519 } else {
514 setHasRecurrenceID( false ); 520 setHasRecurrenceID( false );
515 recurrence()->unsetRecurs(); 521 recurrence()->unsetRecurs();
516 } 522 }
517 return true; 523 return true;
518} 524}
519void Todo::setPercentComplete(int v) 525void Todo::setPercentComplete(int v)
520{ 526{
521 if ( mHasRecurrenceID && v == 100 && mPercentComplete != 100 ) { 527 if ( mHasRecurrenceID && v == 100 && mPercentComplete != 100 ) {
522 if ( !setRecurDates() ) 528 if ( !setRecurDates() )
523 v = 0; 529 v = 0;
524 } 530 }
525 mPercentComplete = v; 531 mPercentComplete = v;
526 if ( v != 100 ) 532 if ( v != 100 )
527 mHasCompletedDate = false; 533 mHasCompletedDate = false;
528 updated(); 534 updated();
529} 535}
530QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const 536QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const
531{ 537{
532 if ( isCompleted() || ! hasDueDate() || cancelled() || !alarmEnabled() ) { 538 if ( isCompleted() || ! hasDueDate() || cancelled() || !alarmEnabled() ) {
533 *ok = false; 539 *ok = false;
534 return QDateTime (); 540 return QDateTime ();
535 } 541 }
536 QDateTime incidenceStart; 542 QDateTime incidenceStart;
537 incidenceStart = dtDue(); 543 incidenceStart = dtDue();
538 bool enabled = false; 544 bool enabled = false;
539 Alarm* alarm; 545 Alarm* alarm;
540 int off = 0; 546 int off = 0;
541 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );; 547 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );;
542 // if ( QDateTime::currentDateTime() > incidenceStart ){ 548 // if ( QDateTime::currentDateTime() > incidenceStart ){
543// *ok = false; 549// *ok = false;
544// return incidenceStart; 550// return incidenceStart;
545// } 551// }
546 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) { 552 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) {
547 if (alarm->enabled()) { 553 if (alarm->enabled()) {
548 if ( alarm->hasTime () ) { 554 if ( alarm->hasTime () ) {
549 if ( alarm->time() < alarmStart ) { 555 if ( alarm->time() < alarmStart ) {
550 alarmStart = alarm->time(); 556 alarmStart = alarm->time();
551 enabled = true; 557 enabled = true;
552 off = alarmStart.secsTo( incidenceStart ); 558 off = alarmStart.secsTo( incidenceStart );
553 } 559 }
554 560
555 } else { 561 } else {
556 int secs = alarm->startOffset().asSeconds(); 562 int secs = alarm->startOffset().asSeconds();
557 if ( incidenceStart.addSecs( secs ) < alarmStart ) { 563 if ( incidenceStart.addSecs( secs ) < alarmStart ) {
558 alarmStart = incidenceStart.addSecs( secs ); 564 alarmStart = incidenceStart.addSecs( secs );
559 enabled = true; 565 enabled = true;
560 off = -secs; 566 off = -secs;
561 } 567 }
562 } 568 }
563 } 569 }
564 } 570 }
565 if ( enabled ) { 571 if ( enabled ) {
566 if ( alarmStart > start_dt ) { 572 if ( alarmStart > start_dt ) {
567 *ok = true; 573 *ok = true;
568 * offset = off; 574 * offset = off;
569 return alarmStart; 575 return alarmStart;
570 } 576 }
571 } 577 }
572 *ok = false; 578 *ok = false;
573 return QDateTime (); 579 return QDateTime ();
574 580
575} 581}
576 582
577void Todo::checkSetCompletedFalse() 583void Todo::checkSetCompletedFalse()
578{ 584{
579 if ( !mHasRecurrenceID ) { 585 if ( !mHasRecurrenceID ) {
580 qDebug("ERROR 1 in Todo::checkSetCompletedFalse"); 586 qDebug("ERROR 1 in Todo::checkSetCompletedFalse");
581 return; 587 return;
582 } 588 }
583 // qDebug("Todo::checkSetCompletedFalse()"); 589 // qDebug("Todo::checkSetCompletedFalse()");
584 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() ); 590 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
585 if ( mPercentComplete == 100 ) { 591 if ( mPercentComplete == 100 ) {
586 QDateTime dt = QDateTime::currentDateTime(); 592 QDateTime dt = QDateTime::currentDateTime();
587 if ( dt > mDtStart && dt > mRecurrenceID ) { 593 if ( dt > mDtStart && dt > mRecurrenceID ) {
588 qDebug("start: %s --due: %s --recID: %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() ); 594 qDebug("start: %s --due: %s --recID: %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
589 setCompleted( false ); 595 setCompleted( false );
590 qDebug("Todo::checkSetCompletedFalse "); 596 qDebug("Todo::checkSetCompletedFalse ");
591 } 597 }
592 } 598 }
593} 599}
diff --git a/libkcal/todo.h b/libkcal/todo.h
index 42db025..11f848e 100644
--- a/libkcal/todo.h
+++ b/libkcal/todo.h
@@ -1,153 +1,155 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20#ifndef TODO_H 20#ifndef TODO_H
21#define TODO_H 21#define TODO_H
22// 22//
23// Todo component, representing a VTODO object 23// Todo component, representing a VTODO object
24// 24//
25 25
26#include "incidence.h" 26#include "incidence.h"
27 27
28#include <qtimer.h> 28#include <qtimer.h>
29 29
30namespace KCal { 30namespace KCal {
31 31
32/** 32/**
33 This class provides a Todo in the sense of RFC2445. 33 This class provides a Todo in the sense of RFC2445.
34*/ 34*/
35 class Todo : public QObject,public Incidence 35 class Todo : public QObject,public Incidence
36{ 36{
37 Q_OBJECT 37 Q_OBJECT
38 public: 38 public:
39 Todo(); 39 Todo();
40 Todo(const Todo &); 40 Todo(const Todo &);
41 ~Todo(); 41 ~Todo();
42 typedef ListBase<Todo> List; 42 typedef ListBase<Todo> List;
43 QCString type() const { return "Todo"; } 43 QCString type() const { return "Todo"; }
44 IncTypeID typeID() const { return todoID; } 44 IncTypeID typeID() const { return todoID; }
45 void saveRunningInfo( QString comment, QDateTime start, QDateTime end );
45 46
46 /** Return an exact copy of this todo. */ 47 /** Return an exact copy of this todo. */
47 Incidence *clone(); 48 Incidence *clone();
48 QDateTime getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const; 49 QDateTime getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const;
49 50
50 /** for setting the todo's due date/time with a QDateTime. */ 51 /** for setting the todo's due date/time with a QDateTime. */
51 void setDtDue(const QDateTime &dtDue); 52 void setDtDue(const QDateTime &dtDue);
52 /** returns an event's Due date/time as a QDateTime. */ 53 /** returns an event's Due date/time as a QDateTime. */
53 QDateTime dtDue() const; 54 QDateTime dtDue() const;
54 /** returns an event's due time as a string formatted according to the 55 /** returns an event's due time as a string formatted according to the
55 users locale settings */ 56 users locale settings */
56 QString dtDueTimeStr() const; 57 QString dtDueTimeStr() const;
57 /** returns an event's due date as a string formatted according to the 58 /** returns an event's due date as a string formatted according to the
58 users locale settings */ 59 users locale settings */
59 QString dtDueDateStr(bool shortfmt=true) const; 60 QString dtDueDateStr(bool shortfmt=true) const;
60 /** returns an event's due date and time as a string formatted according 61 /** returns an event's due date and time as a string formatted according
61 to the users locale settings */ 62 to the users locale settings */
62 QString dtDueStr(bool shortfmt=true) const; 63 QString dtDueStr(bool shortfmt=true) const;
63 64
64 /** returns TRUE or FALSE depending on whether the todo has a due date */ 65 /** returns TRUE or FALSE depending on whether the todo has a due date */
65 bool hasDueDate() const; 66 bool hasDueDate() const;
66 /** sets the event's hasDueDate value. */ 67 /** sets the event's hasDueDate value. */
67 void setHasDueDate(bool f); 68 void setHasDueDate(bool f);
68 69
69 /* 70 /*
70 Looks for a subtodo (including itself ) which is not complete and is 71 Looks for a subtodo (including itself ) which is not complete and is
71 - overdue, or 72 - overdue, or
72 - due today. 73 - due today.
73 It returns 0 for nothing found, 74 It returns 0 for nothing found,
74 1 for found a todo which is due today and no overdue found 75 1 for found a todo which is due today and no overdue found
75 2 for found a overdue todo 76 2 for found a overdue todo
76 */ 77 */
77 int hasDueSubTodo( bool checkSubtodos = true ); 78 int hasDueSubTodo( bool checkSubtodos = true );
78 /* same as above, but a specific date can be specified*/ 79 /* same as above, but a specific date can be specified*/
79 int hasDueSubTodoForDate( const QDate & date, bool checkSubtodos ); 80 int hasDueSubTodoForDate( const QDate & date, bool checkSubtodos );
80 81
81 82
82 /** sets the event's status to the string specified. The string 83 /** sets the event's status to the string specified. The string
83 * must be a recognized value for the status field, i.e. a string 84 * must be a recognized value for the status field, i.e. a string
84 * equivalent of the possible status enumerations previously described. */ 85 * equivalent of the possible status enumerations previously described. */
85// void setStatus(const QString &statStr); 86// void setStatus(const QString &statStr);
86 /** sets the event's status to the value specified. See the enumeration 87 /** sets the event's status to the value specified. See the enumeration
87 * above for possible values. */ 88 * above for possible values. */
88// void setStatus(int); 89// void setStatus(int);
89 /** return the event's status. */ 90 /** return the event's status. */
90// int status() const; 91// int status() const;
91 /** return the event's status in string format. */ 92 /** return the event's status in string format. */
92// QString statusStr() const; 93// QString statusStr() const;
93 94
94 /** return, if this todo is completed */ 95 /** return, if this todo is completed */
95 bool isCompleted() const; 96 bool isCompleted() const;
96 /** set completed state of this todo */ 97 /** set completed state of this todo */
97 void setCompleted(bool); 98 void setCompleted(bool);
98 99
99 /** 100 /**
100 Return how many percent of the task are completed. Returns a value 101 Return how many percent of the task are completed. Returns a value
101 between 0 and 100. 102 between 0 and 100.
102 */ 103 */
103 int percentComplete() const; 104 int percentComplete() const;
104 /** 105 /**
105 Set how many percent of the task are completed. Valid values are in the 106 Set how many percent of the task are completed. Valid values are in the
106 range from 0 to 100. 107 range from 0 to 100.
107 */ 108 */
108 void setPercentComplete(int); 109 void setPercentComplete(int);
109 110
110 /** return date and time when todo was completed */ 111 /** return date and time when todo was completed */
111 QDateTime completed() const; 112 QDateTime completed() const;
112 QString completedStr(bool shortF = true) const; 113 QString completedStr(bool shortF = true) const;
113 /** set date and time of completion */ 114 /** set date and time of completion */
114 void setCompleted(const QDateTime &completed); 115 void setCompleted(const QDateTime &completed);
115 116
116 /** Return true, if todo has a date associated with completion */ 117 /** Return true, if todo has a date associated with completion */
117 bool hasCompletedDate() const; 118 bool hasCompletedDate() const;
118 bool contains ( Todo*); 119 bool contains ( Todo*);
119 void checkSetCompletedFalse(); 120 void checkSetCompletedFalse();
120 bool setRecurDates(); 121 bool setRecurDates();
121 bool isRunning() {return mRunning;} 122 bool isRunning() {return mRunning;}
122 bool hasRunningSub(); 123 bool hasRunningSub();
123 void setRunning( bool ); 124 void setRunning( bool );
124 void setRunningFalse( QString ); 125 void setRunningFalse( QString );
125 void stopRunning(); 126 void stopRunning();
126 int runTime(); 127 int runTime();
127 QDateTime runStart () const { return mRunStart;} 128 QDateTime runStart () const { return mRunStart;}
128 public slots: 129 public slots:
129 void saveRunningInfoToFile( QString st ); 130 void saveRunningInfoToFile( QString st );
130 void saveRunningInfoToFile( ); 131 void saveRunningInfoToFile( );
131 void saveParents(); 132 void saveParents();
132 private: 133 private:
133 bool mRunning; 134 bool mRunning;
134 QTimer * mRunSaveTimer; 135 QTimer * mRunSaveTimer;
135 QDateTime mRunStart; 136 QDateTime mRunStart;
137 QDateTime mRunEnd;
136 bool accept(Visitor &v) { return v.visit(this); } 138 bool accept(Visitor &v) { return v.visit(this); }
137 139
138 QDateTime mDtDue; // due date of todo 140 QDateTime mDtDue; // due date of todo
139 141
140 bool mHasDueDate; // if todo has associated due date 142 bool mHasDueDate; // if todo has associated due date
141 143
142// int mStatus; // confirmed/delegated/tentative/etc 144// int mStatus; // confirmed/delegated/tentative/etc
143 145
144 QDateTime mCompleted; 146 QDateTime mCompleted;
145 bool mHasCompletedDate; 147 bool mHasCompletedDate;
146 148
147 int mPercentComplete; 149 int mPercentComplete;
148}; 150};
149 151
150 bool operator==( const Todo&, const Todo& ); 152 bool operator==( const Todo&, const Todo& );
151} 153}
152 154
153#endif 155#endif