summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2005-08-17 18:03:56 (UTC)
committer zautrix <zautrix>2005-08-17 18:03:56 (UTC)
commit14f656fff72f1e7c2fedbb196fb97bbdd4fb1aac (patch) (unidiff)
tree9ccd2676090560a0471fd72f6102a01d7a2e889a
parentb3de38d3c4c3935a3fa428eeb4ad97fa8c60c43a (diff)
downloadkdepimpi-14f656fff72f1e7c2fedbb196fb97bbdd4fb1aac.zip
kdepimpi-14f656fff72f1e7c2fedbb196fb97bbdd4fb1aac.tar.gz
kdepimpi-14f656fff72f1e7c2fedbb196fb97bbdd4fb1aac.tar.bz2
fix fox
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/WhatsNew.txt1
-rw-r--r--korganizer/koeditorgeneraltodo.cpp12
-rw-r--r--libkcal/todo.cpp1
3 files changed, 7 insertions, 7 deletions
diff --git a/bin/kdepim/WhatsNew.txt b/bin/kdepim/WhatsNew.txt
index 18e94a7..15caf9e 100644
--- a/bin/kdepim/WhatsNew.txt
+++ b/bin/kdepim/WhatsNew.txt
@@ -1,28 +1,29 @@
1Info about the changes in new versions of KDE-Pim/Pi 1Info about the changes in new versions of KDE-Pim/Pi
2 2
3********** VERSION 2.2.1 ************ 3********** VERSION 2.2.1 ************
4 4
5KO/Pi: 5KO/Pi:
6Fixed a problem displaying very long allday events in agenda view in single day mode. 6Fixed a problem displaying very long allday events in agenda view in single day mode.
7Fixed a problem with the default settings for new todos.
7 8
8KA/Pi: 9KA/Pi:
9Added a config option to turn on asking before a contact is deleted. 10Added a config option to turn on asking before a contact is deleted.
10Fixed a problem with the default view and view selection at startup. 11Fixed a problem with the default view and view selection at startup.
11 12
12********** VERSION 2.2.0 ************ 13********** VERSION 2.2.0 ************
13 14
14New stable release! 15New stable release!
15Fixed some minor usability problems. 16Fixed some minor usability problems.
16Added writing of next alarm to a file for usage on pdaXrom. 17Added writing of next alarm to a file for usage on pdaXrom.
17 18
18 19
19************************************* 20*************************************
20 21
21You can find the complete changelog 22You can find the complete changelog
22from version 1.7.7 to 2.2.0 23from version 1.7.7 to 2.2.0
23in the source package or on 24in the source package or on
24 25
25http://www.pi-sync.net/html/changelog.html 26http://www.pi-sync.net/html/changelog.html
26 27
27 28
28 29
diff --git a/korganizer/koeditorgeneraltodo.cpp b/korganizer/koeditorgeneraltodo.cpp
index 10d9a8c..d32d5a5 100644
--- a/korganizer/koeditorgeneraltodo.cpp
+++ b/korganizer/koeditorgeneraltodo.cpp
@@ -1,507 +1,505 @@
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 <qtooltip.h> 24#include <qtooltip.h>
25#include <qfiledialog.h> 25#include <qfiledialog.h>
26#include <qlayout.h> 26#include <qlayout.h>
27#include <qvbox.h> 27#include <qvbox.h>
28#include <qbuttongroup.h> 28#include <qbuttongroup.h>
29#include <qvgroupbox.h> 29#include <qvgroupbox.h>
30#include <qwidgetstack.h> 30#include <qwidgetstack.h>
31#include <qdatetime.h> 31#include <qdatetime.h>
32#include <qapplication.h> 32#include <qapplication.h>
33 33
34#include <kglobal.h> 34#include <kglobal.h>
35#include <klocale.h> 35#include <klocale.h>
36#include <kiconloader.h> 36#include <kiconloader.h>
37#include <kmessagebox.h> 37#include <kmessagebox.h>
38#include <kdebug.h> 38#include <kdebug.h>
39#include <krestrictedline.h> 39#include <krestrictedline.h>
40#include <kstandarddirs.h> 40#include <kstandarddirs.h>
41#include <kfiledialog.h> 41#include <kfiledialog.h>
42#include <kdialog.h> 42#include <kdialog.h>
43 43
44#include <libkcal/todo.h> 44#include <libkcal/todo.h>
45 45
46#include <libkdepim/kdateedit.h> 46#include <libkdepim/kdateedit.h>
47 47
48#include "koprefs.h" 48#include "koprefs.h"
49#include "ktimeedit.h" 49#include "ktimeedit.h"
50 50
51#include "koeditorgeneraltodo.h" 51#include "koeditorgeneraltodo.h"
52#include "kolocationbox.h" 52#include "kolocationbox.h"
53 53
54KOEditorGeneralTodo::KOEditorGeneralTodo(QObject* parent, 54KOEditorGeneralTodo::KOEditorGeneralTodo(QObject* parent,
55 const char* name) 55 const char* name)
56 : KOEditorGeneral( parent, name) 56 : KOEditorGeneral( parent, name)
57{ 57{
58} 58}
59 59
60KOEditorGeneralTodo::~KOEditorGeneralTodo() 60KOEditorGeneralTodo::~KOEditorGeneralTodo()
61{ 61{
62} 62}
63 63
64void KOEditorGeneralTodo::finishSetup() 64void KOEditorGeneralTodo::finishSetup()
65{ 65{
66 66
67// QWidget::setTabOrder(mSummaryEdit, mLocationEdit); 67// QWidget::setTabOrder(mSummaryEdit, mLocationEdit);
68// QWidget::setTabOrder(mLocationEdit, mDueCheck); 68// QWidget::setTabOrder(mLocationEdit, mDueCheck);
69// QWidget::setTabOrder(mDueCheck, mDueDateEdit); 69// QWidget::setTabOrder(mDueCheck, mDueDateEdit);
70// QWidget::setTabOrder(mDueDateEdit, mDueTimeEdit); 70// QWidget::setTabOrder(mDueDateEdit, mDueTimeEdit);
71// QWidget::setTabOrder(mDueTimeEdit, mStartCheck); 71// QWidget::setTabOrder(mDueTimeEdit, mStartCheck);
72// QWidget::setTabOrder(mStartCheck, mStartDateEdit); 72// QWidget::setTabOrder(mStartCheck, mStartDateEdit);
73// QWidget::setTabOrder(mStartDateEdit, mStartTimeEdit); 73// QWidget::setTabOrder(mStartDateEdit, mStartTimeEdit);
74// QWidget::setTabOrder(mStartTimeEdit, mTimeButton); 74// QWidget::setTabOrder(mStartTimeEdit, mTimeButton);
75// QWidget::setTabOrder(mTimeButton, mCompletedCombo); 75// QWidget::setTabOrder(mTimeButton, mCompletedCombo);
76// QWidget::setTabOrder(mCompletedCombo, mPriorityCombo); 76// QWidget::setTabOrder(mCompletedCombo, mPriorityCombo);
77// QWidget::setTabOrder(mPriorityCombo, mAlarmButton); 77// QWidget::setTabOrder(mPriorityCombo, mAlarmButton);
78// QWidget::setTabOrder(mAlarmButton, mCategoriesButton); 78// QWidget::setTabOrder(mAlarmButton, mCategoriesButton);
79// QWidget::setTabOrder(mCategoriesButton, mSecrecyCombo); 79// QWidget::setTabOrder(mCategoriesButton, mSecrecyCombo);
80// QWidget::setTabOrder(mSecrecyCombo, mDescriptionEdit); 80// QWidget::setTabOrder(mSecrecyCombo, mDescriptionEdit);
81 mSummaryEdit->load(KOLocationBox::SUMMARYTODO); 81 mSummaryEdit->load(KOLocationBox::SUMMARYTODO);
82 mSummaryEdit->setFocus(); 82 mSummaryEdit->setFocus();
83} 83}
84 84
85void KOEditorGeneralTodo::initTime(QWidget *parent,QBoxLayout *topLayout) 85void KOEditorGeneralTodo::initTime(QWidget *parent,QBoxLayout *topLayout)
86{ 86{
87 QBoxLayout *timeLayout = new QVBoxLayout(topLayout); 87 QBoxLayout *timeLayout = new QVBoxLayout(topLayout);
88 88
89 QGroupBox *timeGroupBox = new QGroupBox(1,QGroupBox::Horizontal, 89 QGroupBox *timeGroupBox = new QGroupBox(1,QGroupBox::Horizontal,
90 i18n("Date && Time"),parent); 90 i18n("Date && Time"),parent);
91 timeLayout->addWidget(timeGroupBox); 91 timeLayout->addWidget(timeGroupBox);
92 timeGroupBox->layout()->setSpacing( KDialog::spacingHint()-2 ); 92 timeGroupBox->layout()->setSpacing( KDialog::spacingHint()-2 );
93 timeGroupBox->layout()->setMargin( KDialog::marginHint() ); 93 timeGroupBox->layout()->setMargin( KDialog::marginHint() );
94 QFrame *timeBoxFrame = new QFrame(timeGroupBox); 94 QFrame *timeBoxFrame = new QFrame(timeGroupBox);
95 95
96 QGridLayout *layoutTimeBox = new QGridLayout(timeBoxFrame,3,3); 96 QGridLayout *layoutTimeBox = new QGridLayout(timeBoxFrame,3,3);
97 layoutTimeBox->setSpacing(KDialog::spacingHintSmall()); 97 layoutTimeBox->setSpacing(KDialog::spacingHintSmall());
98 layoutTimeBox->setColStretch( 1, 1 ); 98 layoutTimeBox->setColStretch( 1, 1 );
99 99
100 mStartCheck = new QCheckBox(i18n("Start:"),timeBoxFrame); 100 mStartCheck = new QCheckBox(i18n("Start:"),timeBoxFrame);
101 layoutTimeBox->addWidget(mStartCheck,0,0); 101 layoutTimeBox->addWidget(mStartCheck,0,0);
102 connect(mStartCheck,SIGNAL(toggled(bool)),SLOT(enableStartEdit(bool))); 102 connect(mStartCheck,SIGNAL(toggled(bool)),SLOT(enableStartEdit(bool)));
103 103
104 mStartDateEdit = new KDateEdit(timeBoxFrame); 104 mStartDateEdit = new KDateEdit(timeBoxFrame);
105 layoutTimeBox->addWidget(mStartDateEdit,0,1); 105 layoutTimeBox->addWidget(mStartDateEdit,0,1);
106 106
107 mStartTimeEdit = new KOTimeEdit(timeBoxFrame); 107 mStartTimeEdit = new KOTimeEdit(timeBoxFrame);
108 layoutTimeBox->addWidget(mStartTimeEdit,0,2); 108 layoutTimeBox->addWidget(mStartTimeEdit,0,2);
109 109
110 mDueCheck = new QCheckBox(i18n("Due:"),timeBoxFrame); 110 mDueCheck = new QCheckBox(i18n("Due:"),timeBoxFrame);
111 layoutTimeBox->addWidget(mDueCheck,1,0); 111 layoutTimeBox->addWidget(mDueCheck,1,0);
112 connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(enableDueEdit(bool))); 112 connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(enableDueEdit(bool)));
113 connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(showAlarm())); 113 connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(showAlarm()));
114 114
115 115
116 mDueDateEdit = new KDateEdit(timeBoxFrame); 116 mDueDateEdit = new KDateEdit(timeBoxFrame);
117 layoutTimeBox->addWidget(mDueDateEdit,1,1); 117 layoutTimeBox->addWidget(mDueDateEdit,1,1);
118 118
119 mDueTimeEdit = new KOTimeEdit(timeBoxFrame); 119 mDueTimeEdit = new KOTimeEdit(timeBoxFrame);
120 layoutTimeBox->addWidget(mDueTimeEdit,1,2); 120 layoutTimeBox->addWidget(mDueTimeEdit,1,2);
121 121
122 122
123 mTimeButton = new QCheckBox(i18n("Time associated"),timeBoxFrame); 123 mTimeButton = new QCheckBox(i18n("Time associated"),timeBoxFrame);
124 layoutTimeBox->addMultiCellWidget(mTimeButton,2,2,0,1); 124 layoutTimeBox->addMultiCellWidget(mTimeButton,2,2,0,1);
125 125
126 connect(mTimeButton,SIGNAL(toggled(bool)),SLOT(enableTimeEdits(bool))); 126 connect(mTimeButton,SIGNAL(toggled(bool)),SLOT(enableTimeEdits(bool)));
127 connect(mDueDateEdit,SIGNAL(setTimeTo(QTime)),mDueTimeEdit,SLOT(setTime(QTime))); 127 connect(mDueDateEdit,SIGNAL(setTimeTo(QTime)),mDueTimeEdit,SLOT(setTime(QTime)));
128 connect(mStartDateEdit,SIGNAL(setTimeTo(QTime)),mStartTimeEdit,SLOT(setTime(QTime))); 128 connect(mStartDateEdit,SIGNAL(setTimeTo(QTime)),mStartTimeEdit,SLOT(setTime(QTime)));
129 connect(mStartDateEdit, SIGNAL(dateChanged(QDate)), 129 connect(mStartDateEdit, SIGNAL(dateChanged(QDate)),
130 this, SLOT(startDateChanged(QDate))); 130 this, SLOT(startDateChanged(QDate)));
131 // some more layouting 131 // some more layouting
132 //layoutTimeBox->setColStretch(3,1); 132 //layoutTimeBox->setColStretch(3,1);
133} 133}
134 134
135 135
136void KOEditorGeneralTodo::initCompletion(QWidget *parent, QBoxLayout *topLayout) 136void KOEditorGeneralTodo::initCompletion(QWidget *parent, QBoxLayout *topLayout)
137{ 137{
138 mCompletedCombo = new QComboBox(parent); 138 mCompletedCombo = new QComboBox(parent);
139 // xgettext:no-c-format 139 // xgettext:no-c-format
140 mCompletedCombo->insertItem(i18n(" 0 %")); 140 mCompletedCombo->insertItem(i18n(" 0 %"));
141 // xgettext:no-c-format 141 // xgettext:no-c-format
142 mCompletedCombo->insertItem(i18n(" 20 %")); 142 mCompletedCombo->insertItem(i18n(" 20 %"));
143 // xgettext:no-c-format 143 // xgettext:no-c-format
144 mCompletedCombo->insertItem(i18n(" 40 %")); 144 mCompletedCombo->insertItem(i18n(" 40 %"));
145 // xgettext:no-c-format 145 // xgettext:no-c-format
146 mCompletedCombo->insertItem(i18n(" 60 %")); 146 mCompletedCombo->insertItem(i18n(" 60 %"));
147 // xgettext:no-c-format 147 // xgettext:no-c-format
148 mCompletedCombo->insertItem(i18n(" 80 %")); 148 mCompletedCombo->insertItem(i18n(" 80 %"));
149 // xgettext:no-c-format 149 // xgettext:no-c-format
150 mCompletedCombo->insertItem(i18n("100 %")); 150 mCompletedCombo->insertItem(i18n("100 %"));
151 connect(mCompletedCombo,SIGNAL(activated(int)),SLOT(completedChanged(int))); 151 connect(mCompletedCombo,SIGNAL(activated(int)),SLOT(completedChanged(int)));
152 topLayout->addWidget(mCompletedCombo); 152 topLayout->addWidget(mCompletedCombo);
153 153
154 mCompletedLabel = new QLabel(i18n("completed"),parent); 154 mCompletedLabel = new QLabel(i18n("completed"),parent);
155 topLayout->addWidget(mCompletedLabel); 155 topLayout->addWidget(mCompletedLabel);
156 156
157 mCompleteDateEdit = new KDateEdit(parent); 157 mCompleteDateEdit = new KDateEdit(parent);
158 topLayout->addWidget(mCompleteDateEdit ); 158 topLayout->addWidget(mCompleteDateEdit );
159 159
160 mCompleteTimeEdit = new KOTimeEdit(parent); 160 mCompleteTimeEdit = new KOTimeEdit(parent);
161 topLayout->addWidget( mCompleteTimeEdit); 161 topLayout->addWidget( mCompleteTimeEdit);
162 162
163 mCompletedCombo->setSizePolicy( QSizePolicy( QSizePolicy::Preferred,QSizePolicy::Preferred) ); 163 mCompletedCombo->setSizePolicy( QSizePolicy( QSizePolicy::Preferred,QSizePolicy::Preferred) );
164 mCompletedLabel->setSizePolicy( QSizePolicy( QSizePolicy::Expanding,QSizePolicy::Preferred) ); 164 mCompletedLabel->setSizePolicy( QSizePolicy( QSizePolicy::Expanding,QSizePolicy::Preferred) );
165 connect(mCompleteDateEdit,SIGNAL(setTimeTo(QTime)),mCompleteTimeEdit,SLOT(setTime(QTime))); 165 connect(mCompleteDateEdit,SIGNAL(setTimeTo(QTime)),mCompleteTimeEdit,SLOT(setTime(QTime)));
166 166
167 if ( QApplication::desktop()->width() <= 480 ) { 167 if ( QApplication::desktop()->width() <= 480 ) {
168 if ( QApplication::desktop()->width() < 320 ) 168 if ( QApplication::desktop()->width() < 320 )
169 mCompleteDateEdit->setMaximumWidth( 85 ); 169 mCompleteDateEdit->setMaximumWidth( 85 );
170 else 170 else
171 mCompleteDateEdit->setMaximumWidth( 140 ); 171 mCompleteDateEdit->setMaximumWidth( 140 );
172 topLayout->setSpacing( 0 ); 172 topLayout->setSpacing( 0 );
173 } 173 }
174} 174}
175 175
176void KOEditorGeneralTodo::initPriority(QWidget *parent, QBoxLayout *topLayout) 176void KOEditorGeneralTodo::initPriority(QWidget *parent, QBoxLayout *topLayout)
177{ 177{
178 178
179 QHBox* h = new QHBox ( parent ); 179 QHBox* h = new QHBox ( parent );
180 topLayout->addWidget( h ); 180 topLayout->addWidget( h );
181 QLabel *priorityLabel = new QLabel(i18n("Priority:"), h); 181 QLabel *priorityLabel = new QLabel(i18n("Priority:"), h);
182 // topLayout->addWidget(priorityLabel); 182 // topLayout->addWidget(priorityLabel);
183 mPriorityCombo = new QComboBox( h ); 183 mPriorityCombo = new QComboBox( h );
184 mPriorityCombo->insertItem(i18n("1 (high)")); 184 mPriorityCombo->insertItem(i18n("1 (high)"));
185 mPriorityCombo->insertItem(i18n("2")); 185 mPriorityCombo->insertItem(i18n("2"));
186 mPriorityCombo->insertItem(i18n("3")); 186 mPriorityCombo->insertItem(i18n("3"));
187 mPriorityCombo->insertItem(i18n("4")); 187 mPriorityCombo->insertItem(i18n("4"));
188 mPriorityCombo->insertItem(i18n("5 (low)")); 188 mPriorityCombo->insertItem(i18n("5 (low)"));
189 //topLayout->addWidget(mPriorityCombo); 189 //topLayout->addWidget(mPriorityCombo);
190} 190}
191 191
192void KOEditorGeneralTodo::initStatus(QWidget *parent,QBoxLayout *topLayout) 192void KOEditorGeneralTodo::initStatus(QWidget *parent,QBoxLayout *topLayout)
193{ 193{
194 QBoxLayout *statusLayout = new QHBoxLayout(topLayout); 194 QBoxLayout *statusLayout = new QHBoxLayout(topLayout);
195 195
196 initCompletion( parent, statusLayout ); 196 initCompletion( parent, statusLayout );
197 197
198 statusLayout->addStretch( 1 ); 198 statusLayout->addStretch( 1 );
199 199
200 initPriority( parent, statusLayout ); 200 initPriority( parent, statusLayout );
201} 201}
202 202
203void KOEditorGeneralTodo::setDefaults(QDateTime due,bool allDay) 203void KOEditorGeneralTodo::setDefaults(QDateTime due,bool allDay)
204{ 204{
205 205
206 mSummaryEdit->load(KOLocationBox::SUMMARYTODO); 206 mSummaryEdit->load(KOLocationBox::SUMMARYTODO);
207 mLocationEdit->load(KOLocationBox::LOCATION); 207 mLocationEdit->load(KOLocationBox::LOCATION);
208 KOEditorGeneral::setDefaults(allDay); 208 KOEditorGeneral::setDefaults(allDay);
209 209
210 mTimeButton->setChecked( !allDay ); 210 mTimeButton->setChecked( !allDay );
211 if(mTimeButton->isChecked()) { 211 mTimeButton->setEnabled( !allDay );
212 mTimeButton->setEnabled(true);
213 }
214 else {
215 mTimeButton->setEnabled(false);
216 }
217 212
218 enableTimeEdits( !allDay ); 213 enableTimeEdits( !allDay );
219 if ( due.isValid() ) { 214 if ( due.isValid() ) {
220 mDueCheck->setChecked(true); 215 mDueCheck->setChecked(true);
221 enableDueEdit(true); 216 enableDueEdit(true);
222 alarmDisable(false); 217 alarmDisable(false);
223 } else { 218 } else {
224 mDueCheck->setChecked(false); 219 mDueCheck->setChecked(false);
225 enableDueEdit(false); 220 enableDueEdit(false);
226 due = QDateTime::currentDateTime().addDays(7); 221 due = QDateTime::currentDateTime().addDays(7);
227 alarmDisable(true); 222 alarmDisable(true);
228 } 223 }
229 224
230 225
231 mStartCheck->setChecked(false); 226 mStartCheck->setChecked(false);
232 enableStartEdit(false); 227 enableStartEdit(false);
233 228
234 mDueDateEdit->setDate(due.date()); 229 mDueDateEdit->setDate(due.date());
235 mDueTimeEdit->setTime(due.time()); 230 mDueTimeEdit->setTime(due.time());
236 due = due.addDays(-7); 231 due = due.addDays(-7);
237 mStartDateEdit->setDate(due.date()); 232 mStartDateEdit->setDate(due.date());
238 mStartTimeEdit->setTime(due.time()); 233 mStartTimeEdit->setTime(due.time());
239 234
240 mPriorityCombo->setCurrentItem(2); 235 mPriorityCombo->setCurrentItem(2);
241 mCompletedLabel->setText(i18n(" completed"));; 236 mCompletedLabel->setText(i18n(" completed"));;
242 mCompletedCombo->setCurrentItem(0); 237 mCompletedCombo->setCurrentItem(0);
243 mCompleteDateEdit->hide(); 238 mCompleteDateEdit->hide();
244 mCompleteTimeEdit->hide(); 239 mCompleteTimeEdit->hide();
245} 240}
246 241
247void KOEditorGeneralTodo::readTodo(Todo *todo) 242void KOEditorGeneralTodo::readTodo(Todo *todo)
248{ 243{
249 244
250 mSummaryEdit->load(KOLocationBox::SUMMARYTODO); 245 mSummaryEdit->load(KOLocationBox::SUMMARYTODO);
251 mLocationEdit->load(KOLocationBox::LOCATION); 246 mLocationEdit->load(KOLocationBox::LOCATION);
252 KOEditorGeneral::readIncidence(todo); 247 KOEditorGeneral::readIncidence(todo);
253 248
254 QDateTime dueDT; 249 QDateTime dueDT;
250 mTimeButton->setChecked( !todo->doesFloat() );
251 mTimeButton->setEnabled( !todo->doesFloat() );
255 252
256 if (todo->hasDueDate()) { 253 if (todo->hasDueDate()) {
257 enableAlarmEdit(true); 254 enableAlarmEdit(true);
258 dueDT = todo->dtDue(); 255 dueDT = todo->dtDue();
259 mDueDateEdit->setDate(todo->dtDue().date()); 256 mDueDateEdit->setDate(todo->dtDue().date());
260 mDueTimeEdit->setTime(todo->dtDue().time()); 257 mDueTimeEdit->setTime(todo->dtDue().time());
261 mDueCheck->setChecked(true); 258 mDueCheck->setChecked(true);
259 mTimeButton->setEnabled( true );
262 } else { 260 } else {
263 alarmDisable(true); 261 alarmDisable(true);
264 mDueDateEdit->setEnabled(false); 262 mDueDateEdit->setEnabled(false);
265 mDueTimeEdit->setEnabled(false); 263 mDueTimeEdit->setEnabled(false);
266 mDueDateEdit->setDate(QDate::currentDate()); 264 mDueDateEdit->setDate(QDate::currentDate());
267 mDueTimeEdit->setTime(QTime::currentTime()); 265 mDueTimeEdit->setTime(QTime::currentTime());
268 mDueCheck->setChecked(false); 266 mDueCheck->setChecked(false);
269 } 267 }
270 268
271 if (todo->hasStartDate()) { 269 if (todo->hasStartDate()) {
272 mStartDateEdit->setDate(todo->dtStart().date()); 270 mStartDateEdit->setDate(todo->dtStart().date());
273 mStartTimeEdit->setTime(todo->dtStart().time()); 271 mStartTimeEdit->setTime(todo->dtStart().time());
274 mStartCheck->setChecked(true); 272 mStartCheck->setChecked(true);
273 mTimeButton->setEnabled( true );
275 } else { 274 } else {
276 mStartDateEdit->setEnabled(false); 275 mStartDateEdit->setEnabled(false);
277 mStartTimeEdit->setEnabled(false); 276 mStartTimeEdit->setEnabled(false);
278 mStartDateEdit->setDate(QDate::currentDate()); 277 mStartDateEdit->setDate(QDate::currentDate());
279 mStartTimeEdit->setTime(QTime::currentTime()); 278 mStartTimeEdit->setTime(QTime::currentTime());
280 mStartCheck->setChecked(false); 279 mStartCheck->setChecked(false);
281 } 280 }
282 281
283 mTimeButton->setChecked( !todo->doesFloat() );
284 282
285 mCompletedCombo->setCurrentItem(todo->percentComplete() / 20); 283 mCompletedCombo->setCurrentItem(todo->percentComplete() / 20);
286 if (todo->isCompleted() && todo->hasCompletedDate()) { 284 if (todo->isCompleted() && todo->hasCompletedDate()) {
287 mCompleted = todo->completed(); 285 mCompleted = todo->completed();
288 } 286 }
289 setCompletedDate(); 287 setCompletedDate();
290 288
291 mPriorityCombo->setCurrentItem(todo->priority()-1); 289 mPriorityCombo->setCurrentItem(todo->priority()-1);
292} 290}
293 291
294void KOEditorGeneralTodo::writeTodo(Todo *todo) 292void KOEditorGeneralTodo::writeTodo(Todo *todo)
295{ 293{
296 KOEditorGeneral::writeIncidence(todo); 294 KOEditorGeneral::writeIncidence(todo);
297 295
298 // temp. until something better happens. 296 // temp. until something better happens.
299 QString tmpStr; 297 QString tmpStr;
300 298
301 todo->setHasDueDate(mDueCheck->isChecked()); 299 todo->setHasDueDate(mDueCheck->isChecked());
302 todo->setHasStartDate(mStartCheck->isChecked()); 300 todo->setHasStartDate(mStartCheck->isChecked());
303 301
304 QDate tmpDate; 302 QDate tmpDate;
305 QTime tmpTime; 303 QTime tmpTime;
306 QDateTime tmpDT; 304 QDateTime tmpDT;
307 if ( mTimeButton->isChecked() ) { 305 if ( mTimeButton->isChecked() ) {
308 todo->setFloats(false); 306 todo->setFloats(false);
309 307
310 // set due date/time 308 // set due date/time
311 tmpDate = mDueDateEdit->date(); 309 tmpDate = mDueDateEdit->date();
312 tmpTime = mDueTimeEdit->getTime(); 310 tmpTime = mDueTimeEdit->getTime();
313 tmpDT.setDate(tmpDate); 311 tmpDT.setDate(tmpDate);
314 tmpDT.setTime(tmpTime); 312 tmpDT.setTime(tmpTime);
315 todo->setDtDue(tmpDT); 313 todo->setDtDue(tmpDT);
316 314
317 // set start date/time 315 // set start date/time
318 tmpDate = mStartDateEdit->date(); 316 tmpDate = mStartDateEdit->date();
319 tmpTime = mStartTimeEdit->getTime(); 317 tmpTime = mStartTimeEdit->getTime();
320 tmpDT.setDate(tmpDate); 318 tmpDT.setDate(tmpDate);
321 tmpDT.setTime(tmpTime); 319 tmpDT.setTime(tmpTime);
322 todo->setDtStart(tmpDT); 320 todo->setDtStart(tmpDT);
323 } else { 321 } else {
324 todo->setFloats(true); 322 todo->setFloats(true);
325 323
326 // need to change this. 324 // need to change this.
327 tmpDate = mDueDateEdit->date(); 325 tmpDate = mDueDateEdit->date();
328 tmpTime.setHMS(0,0,0); 326 tmpTime.setHMS(0,0,0);
329 tmpDT.setDate(tmpDate); 327 tmpDT.setDate(tmpDate);
330 tmpDT.setTime(tmpTime); 328 tmpDT.setTime(tmpTime);
331 todo->setDtDue(tmpDT); 329 todo->setDtDue(tmpDT);
332 330
333 tmpDate = mStartDateEdit->date(); 331 tmpDate = mStartDateEdit->date();
334 tmpTime.setHMS(0,0,0); 332 tmpTime.setHMS(0,0,0);
335 tmpDT.setDate(tmpDate); 333 tmpDT.setDate(tmpDate);
336 tmpDT.setTime(tmpTime); 334 tmpDT.setTime(tmpTime);
337 todo->setDtStart(tmpDT); 335 todo->setDtStart(tmpDT);
338 } 336 }
339 todo->setPriority(mPriorityCombo->currentItem()+1); 337 todo->setPriority(mPriorityCombo->currentItem()+1);
340 338
341 // set completion state 339 // set completion state
342 if ( mCompletedCombo->currentItem() == 5 ) { 340 if ( mCompletedCombo->currentItem() == 5 ) {
343 QDateTime comp ( mCompleteDateEdit->date(), mCompleteTimeEdit->getTime() ); 341 QDateTime comp ( mCompleteDateEdit->date(), mCompleteTimeEdit->getTime() );
344 if ( comp.isValid () ) { 342 if ( comp.isValid () ) {
345 todo->setPercentComplete(100); 343 todo->setPercentComplete(100);
346 todo->setCompleted(comp); 344 todo->setCompleted(comp);
347 } else { 345 } else {
348 todo->setPercentComplete( 100 ); 346 todo->setPercentComplete( 100 );
349 if ( mCompleted.isValid() ) 347 if ( mCompleted.isValid() )
350 todo->setCompleted(mCompleted); 348 todo->setCompleted(mCompleted);
351 } 349 }
352 } else { 350 } else {
353 todo->setPercentComplete(mCompletedCombo->currentItem() * 20); 351 todo->setPercentComplete(mCompletedCombo->currentItem() * 20);
354 } 352 }
355 353
356 mSummaryEdit->save(KOLocationBox::SUMMARYTODO); 354 mSummaryEdit->save(KOLocationBox::SUMMARYTODO);
357} 355}
358 356
359void KOEditorGeneralTodo::enableDueEdit(bool enable) 357void KOEditorGeneralTodo::enableDueEdit(bool enable)
360{ 358{
361 mDueDateEdit->setEnabled( enable ); 359 mDueDateEdit->setEnabled( enable );
362 360
363 if(mDueCheck->isChecked() || mStartCheck->isChecked()) { 361 if(mDueCheck->isChecked() || mStartCheck->isChecked()) {
364 mTimeButton->setEnabled(true); 362 mTimeButton->setEnabled(true);
365 } 363 }
366 else { 364 else {
367 mTimeButton->setEnabled(false); 365 mTimeButton->setEnabled(false);
368 mTimeButton->setChecked(false); 366 mTimeButton->setChecked(false);
369 } 367 }
370 368
371 if (enable) { 369 if (enable) {
372 mDueTimeEdit->setEnabled( mTimeButton->isChecked() ); 370 mDueTimeEdit->setEnabled( mTimeButton->isChecked() );
373 } else { 371 } else {
374 mDueTimeEdit->setEnabled( false ); 372 mDueTimeEdit->setEnabled( false );
375 } 373 }
376 emit datesChecked(); 374 emit datesChecked();
377} 375}
378 376
379void KOEditorGeneralTodo::enableStartEdit( bool enable ) 377void KOEditorGeneralTodo::enableStartEdit( bool enable )
380{ 378{
381 mStartDateEdit->setEnabled( enable ); 379 mStartDateEdit->setEnabled( enable );
382 380
383 if(mDueCheck->isChecked() || mStartCheck->isChecked()) { 381 if(mDueCheck->isChecked() || mStartCheck->isChecked()) {
384 mTimeButton->setEnabled(true); 382 mTimeButton->setEnabled(true);
385 } 383 }
386 else { 384 else {
387 mTimeButton->setEnabled(false); 385 mTimeButton->setEnabled(false);
388 mTimeButton->setChecked(false); 386 mTimeButton->setChecked(false);
389 } 387 }
390 388
391 if (enable) { 389 if (enable) {
392 mStartTimeEdit->setEnabled( mTimeButton->isChecked() ); 390 mStartTimeEdit->setEnabled( mTimeButton->isChecked() );
393 } else { 391 } else {
394 mStartTimeEdit->setEnabled( false ); 392 mStartTimeEdit->setEnabled( false );
395 } 393 }
396 emit datesChecked(); 394 emit datesChecked();
397} 395}
398void KOEditorGeneralTodo::startDateChanged(QDate newdate) 396void KOEditorGeneralTodo::startDateChanged(QDate newdate)
399{ 397{
400 if ( mDueCheck->isChecked() ) 398 if ( mDueCheck->isChecked() )
401 emit dateTimesChanged(newdate,mDueDateEdit->date()); 399 emit dateTimesChanged(newdate,mDueDateEdit->date());
402} 400}
403void KOEditorGeneralTodo::enableTimeEdits(bool enable) 401void KOEditorGeneralTodo::enableTimeEdits(bool enable)
404{ 402{
405 if(mStartCheck->isChecked()) { 403 if(mStartCheck->isChecked()) {
406 mStartTimeEdit->setEnabled( enable ); 404 mStartTimeEdit->setEnabled( enable );
407 } 405 }
408 if(mDueCheck->isChecked()) { 406 if(mDueCheck->isChecked()) {
409 mDueTimeEdit->setEnabled( enable ); 407 mDueTimeEdit->setEnabled( enable );
410 } 408 }
411} 409}
412 410
413void KOEditorGeneralTodo::showAlarm() 411void KOEditorGeneralTodo::showAlarm()
414{ 412{
415 if ( mDueCheck->isChecked() ) { 413 if ( mDueCheck->isChecked() ) {
416 alarmDisable(false); 414 alarmDisable(false);
417 } 415 }
418 else { 416 else {
419 alarmDisable(true); 417 alarmDisable(true);
420 } 418 }
421} 419}
422 420
423bool KOEditorGeneralTodo::validateInput() 421bool KOEditorGeneralTodo::validateInput()
424{ 422{
425 if (mDueCheck->isChecked()) { 423 if (mDueCheck->isChecked()) {
426 if (!mDueDateEdit->inputIsValid()) { 424 if (!mDueDateEdit->inputIsValid()) {
427 KMessageBox::sorry(0,i18n("Please specify a valid due date.")); 425 KMessageBox::sorry(0,i18n("Please specify a valid due date."));
428 return false; 426 return false;
429 } 427 }
430 } 428 }
431 429
432 if (mStartCheck->isChecked()) { 430 if (mStartCheck->isChecked()) {
433 if (!mStartDateEdit->inputIsValid()) { 431 if (!mStartDateEdit->inputIsValid()) {
434 KMessageBox::sorry(0,i18n("Please specify a valid start date.")); 432 KMessageBox::sorry(0,i18n("Please specify a valid start date."));
435 return false; 433 return false;
436 } 434 }
437 } 435 }
438 436
439 if (mStartCheck->isChecked() && mDueCheck->isChecked()) { 437 if (mStartCheck->isChecked() && mDueCheck->isChecked()) {
440 QDateTime startDate; 438 QDateTime startDate;
441 QDateTime dueDate; 439 QDateTime dueDate;
442 startDate.setDate(mStartDateEdit->date()); 440 startDate.setDate(mStartDateEdit->date());
443 dueDate.setDate(mDueDateEdit->date()); 441 dueDate.setDate(mDueDateEdit->date());
444 if (mTimeButton->isChecked()) { 442 if (mTimeButton->isChecked()) {
445 startDate.setTime(mStartTimeEdit->getTime()); 443 startDate.setTime(mStartTimeEdit->getTime());
446 dueDate.setTime(mDueTimeEdit->getTime()); 444 dueDate.setTime(mDueTimeEdit->getTime());
447 } 445 }
448 if (startDate > dueDate) { 446 if (startDate > dueDate) {
449 KMessageBox::sorry(0, 447 KMessageBox::sorry(0,
450 i18n("The start date cannot be after the due date.")); 448 i18n("The start date cannot be after the due date."));
451 return false; 449 return false;
452 } 450 }
453 } 451 }
454 452
455 return KOEditorGeneral::validateInput(); 453 return KOEditorGeneral::validateInput();
456} 454}
457 455
458void KOEditorGeneralTodo::completedChanged(int index) 456void KOEditorGeneralTodo::completedChanged(int index)
459{ 457{
460 if (index == 5) { 458 if (index == 5) {
461 //get rid of milli sec 459 //get rid of milli sec
462 mCompleted = QDateTime::currentDateTime(); 460 mCompleted = QDateTime::currentDateTime();
463 } 461 }
464 setCompletedDate(); 462 setCompletedDate();
465} 463}
466 464
467void KOEditorGeneralTodo::setCompletedDate() 465void KOEditorGeneralTodo::setCompletedDate()
468{ 466{
469 if (mCompletedCombo->currentItem() == 5 && mCompleted.isValid()) { 467 if (mCompletedCombo->currentItem() == 5 && mCompleted.isValid()) {
470 if ( QApplication::desktop()->width() < 480 ) { 468 if ( QApplication::desktop()->width() < 480 ) {
471 mCompletedLabel->setText(i18n(" on")); 469 mCompletedLabel->setText(i18n(" on"));
472 } 470 }
473 else 471 else
474 mCompletedLabel->setText(i18n(" completed on ")); 472 mCompletedLabel->setText(i18n(" completed on "));
475 mCompleteDateEdit->show(); 473 mCompleteDateEdit->show();
476 mCompleteTimeEdit->show(); 474 mCompleteTimeEdit->show();
477 mCompleteTimeEdit->setTime( mCompleted.time() ); 475 mCompleteTimeEdit->setTime( mCompleted.time() );
478 mCompleteDateEdit->setDate( mCompleted.date() ); 476 mCompleteDateEdit->setDate( mCompleted.date() );
479 } else { 477 } else {
480 mCompletedLabel->setText(i18n(" completed")); 478 mCompletedLabel->setText(i18n(" completed"));
481 mCompleteDateEdit->hide(); 479 mCompleteDateEdit->hide();
482 mCompleteTimeEdit->hide(); 480 mCompleteTimeEdit->hide();
483 } 481 }
484} 482}
485 483
486void KOEditorGeneralTodo::modified (Todo* todo, int modification) 484void KOEditorGeneralTodo::modified (Todo* todo, int modification)
487{ 485{
488 switch (modification) { 486 switch (modification) {
489 case KOGlobals::PRIORITY_MODIFIED: 487 case KOGlobals::PRIORITY_MODIFIED:
490 mPriorityCombo->setCurrentItem(todo->priority()-1); 488 mPriorityCombo->setCurrentItem(todo->priority()-1);
491 break; 489 break;
492 case KOGlobals::COMPLETION_MODIFIED: 490 case KOGlobals::COMPLETION_MODIFIED:
493 mCompletedCombo->setCurrentItem(todo->percentComplete() / 20); 491 mCompletedCombo->setCurrentItem(todo->percentComplete() / 20);
494 if (todo->isCompleted() && todo->hasCompletedDate()) { 492 if (todo->isCompleted() && todo->hasCompletedDate()) {
495 mCompleted = todo->completed(); 493 mCompleted = todo->completed();
496 } 494 }
497 setCompletedDate(); 495 setCompletedDate();
498 break; 496 break;
499 case KOGlobals::CATEGORY_MODIFIED: 497 case KOGlobals::CATEGORY_MODIFIED:
500 setCategories (todo->categoriesStr ()); 498 setCategories (todo->categoriesStr ());
501 break; 499 break;
502 case KOGlobals::UNKNOWN_MODIFIED: // fall through 500 case KOGlobals::UNKNOWN_MODIFIED: // fall through
503 default: 501 default:
504 readTodo( todo ); 502 readTodo( todo );
505 break; 503 break;
506 } 504 }
507} 505}
diff --git a/libkcal/todo.cpp b/libkcal/todo.cpp
index e4508a0..48d37d5 100644
--- a/libkcal/todo.cpp
+++ b/libkcal/todo.cpp
@@ -1,428 +1,429 @@
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 setFloats( true );
45} 46}
46 47
47Todo::Todo(const Todo &t) : QObject(),Incidence(t) 48Todo::Todo(const Todo &t) : QObject(),Incidence(t)
48{ 49{
49 mDtDue = t.mDtDue; 50 mDtDue = t.mDtDue;
50 mHasDueDate = t.mHasDueDate; 51 mHasDueDate = t.mHasDueDate;
51 mCompleted = t.mCompleted; 52 mCompleted = t.mCompleted;
52 mHasCompletedDate = t.mHasCompletedDate; 53 mHasCompletedDate = t.mHasCompletedDate;
53 mPercentComplete = t.mPercentComplete; 54 mPercentComplete = t.mPercentComplete;
54 mRunning = false; 55 mRunning = false;
55 mRunSaveTimer = 0; 56 mRunSaveTimer = 0;
56} 57}
57 58
58Todo::~Todo() 59Todo::~Todo()
59{ 60{
60 setRunning( false ); 61 setRunning( false );
61 //qDebug("Todo::~Todo() "); 62 //qDebug("Todo::~Todo() ");
62} 63}
63 64
64void Todo::setRunningFalse( QString s ) 65void Todo::setRunningFalse( QString s )
65{ 66{
66 if ( ! mRunning ) 67 if ( ! mRunning )
67 return; 68 return;
68 mRunning = false; 69 mRunning = false;
69 if ( mRunSaveTimer ) 70 if ( mRunSaveTimer )
70 mRunSaveTimer->stop(); 71 mRunSaveTimer->stop();
71 saveRunningInfoToFile( s ); 72 saveRunningInfoToFile( s );
72} 73}
73void Todo::stopRunning() 74void Todo::stopRunning()
74{ 75{
75 if ( !mRunning ) 76 if ( !mRunning )
76 return; 77 return;
77 if ( mRunSaveTimer ) 78 if ( mRunSaveTimer )
78 mRunSaveTimer->stop(); 79 mRunSaveTimer->stop();
79 mRunning = false; 80 mRunning = false;
80} 81}
81void Todo::setRunning( bool run ) 82void Todo::setRunning( bool run )
82{ 83{
83 if ( run == mRunning ) 84 if ( run == mRunning )
84 return; 85 return;
85 //qDebug("Todo::setRunning %d ", run); 86 //qDebug("Todo::setRunning %d ", run);
86 if ( !mRunSaveTimer ) { 87 if ( !mRunSaveTimer ) {
87 mRunSaveTimer = new QTimer ( this ); 88 mRunSaveTimer = new QTimer ( this );
88 connect ( mRunSaveTimer, SIGNAL( timeout() ), this , SLOT ( saveRunningInfoToFile() ) ); 89 connect ( mRunSaveTimer, SIGNAL( timeout() ), this , SLOT ( saveRunningInfoToFile() ) );
89 } 90 }
90 mRunning = run; 91 mRunning = run;
91 if ( mRunning ) { 92 if ( mRunning ) {
92 mRunSaveTimer->start( 1000 * 60 * 5 ); // 5 min 93 mRunSaveTimer->start( 1000 * 60 * 5 ); // 5 min
93 mRunStart = QDateTime::currentDateTime(); 94 mRunStart = QDateTime::currentDateTime();
94 } else { 95 } else {
95 mRunSaveTimer->stop(); 96 mRunSaveTimer->stop();
96 saveRunningInfoToFile(); 97 saveRunningInfoToFile();
97 } 98 }
98} 99}
99void Todo::saveRunningInfo( QString comment, QDateTime start, QDateTime end ) 100void Todo::saveRunningInfo( QString comment, QDateTime start, QDateTime end )
100{ 101{
101 if ( !mRunning) return; 102 if ( !mRunning) return;
102 mRunning = false; 103 mRunning = false;
103 mRunStart = start; 104 mRunStart = start;
104 mRunEnd = end; 105 mRunEnd = end;
105 saveRunningInfoToFile( comment ); 106 saveRunningInfoToFile( comment );
106} 107}
107void Todo::saveRunningInfoToFile() 108void Todo::saveRunningInfoToFile()
108{ 109{
109 mRunEnd = QDateTime::currentDateTime(); 110 mRunEnd = QDateTime::currentDateTime();
110 saveRunningInfoToFile( QString::null ); 111 saveRunningInfoToFile( QString::null );
111} 112}
112void Todo::saveRunningInfoToFile( QString comment ) 113void Todo::saveRunningInfoToFile( QString comment )
113{ 114{
114 //qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1()); 115 //qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1());
115 if ( mRunStart.secsTo ( mRunEnd) < 15 ) { 116 if ( mRunStart.secsTo ( mRunEnd) < 15 ) {
116 qDebug("Running time < 15 seconds. Skipped. "); 117 qDebug("Running time < 15 seconds. Skipped. ");
117 return; 118 return;
118 } 119 }
119 QString dir = KGlobalSettings::timeTrackerDir(); 120 QString dir = KGlobalSettings::timeTrackerDir();
120 //qDebug("%s ", dir.latin1()); 121 //qDebug("%s ", dir.latin1());
121 QString file = "%1%2%3-%4%5%6-"; 122 QString file = "%1%2%3-%4%5%6-";
122 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 ); 123 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 );
123 file.replace ( QRegExp (" "), "0" ); 124 file.replace ( QRegExp (" "), "0" );
124 file += uid(); 125 file += uid();
125 //qDebug("File %s ",file.latin1() ); 126 //qDebug("File %s ",file.latin1() );
126 CalendarLocal cal; 127 CalendarLocal cal;
127 cal.setLocalTime(); 128 cal.setLocalTime();
128 Todo * to = (Todo*) clone(); 129 Todo * to = (Todo*) clone();
129 to->setFloats( false ); 130 to->setFloats( false );
130 to->setDtStart( mRunStart ); 131 to->setDtStart( mRunStart );
131 to->setHasStartDate( true ); 132 to->setHasStartDate( true );
132 to->setDtDue( mRunEnd ); 133 to->setDtDue( mRunEnd );
133 to->setHasDueDate( true ); 134 to->setHasDueDate( true );
134 to->setUid( file ); 135 to->setUid( file );
135 if ( !comment.isEmpty() ) { 136 if ( !comment.isEmpty() ) {
136 QString des = to->description(); 137 QString des = to->description();
137 if ( des.isEmpty () ) 138 if ( des.isEmpty () )
138 to->setDescription( "TT-Note: " + comment ); 139 to->setDescription( "TT-Note: " + comment );
139 else 140 else
140 to->setDescription( "TT-Note: " + comment +"\n" + des ); 141 to->setDescription( "TT-Note: " + comment +"\n" + des );
141 } 142 }
142 cal.addIncidence( to ); 143 cal.addIncidence( to );
143 ICalFormat format( false ); 144 ICalFormat format( false );
144 file = dir +"/" +file +".ics"; 145 file = dir +"/" +file +".ics";
145 format.save( &cal, file ); 146 format.save( &cal, file );
146 saveParents(); 147 saveParents();
147 148
148} 149}
149void Todo::saveParents() 150void Todo::saveParents()
150{ 151{
151 if (!relatedTo() ) 152 if (!relatedTo() )
152 return; 153 return;
153 Incidence * inc = relatedTo(); 154 Incidence * inc = relatedTo();
154 if ( inc->typeID() != todoID ) 155 if ( inc->typeID() != todoID )
155 return; 156 return;
156 Todo* to = (Todo*)inc; 157 Todo* to = (Todo*)inc;
157 bool saveTodo = false; 158 bool saveTodo = false;
158 QString file = KGlobalSettings::timeTrackerDir() + "/"+ to->uid() + ".ics"; 159 QString file = KGlobalSettings::timeTrackerDir() + "/"+ to->uid() + ".ics";
159 QFileInfo fi ( file ); 160 QFileInfo fi ( file );
160 if ( fi.exists() ) { 161 if ( fi.exists() ) {
161 if ( fi.lastModified () < to->lastModified ()) 162 if ( fi.lastModified () < to->lastModified ())
162 saveTodo = true; 163 saveTodo = true;
163 } else { 164 } else {
164 saveTodo = true; 165 saveTodo = true;
165 } 166 }
166 if ( saveTodo ) { 167 if ( saveTodo ) {
167 CalendarLocal cal; 168 CalendarLocal cal;
168 cal.setLocalTime(); 169 cal.setLocalTime();
169 Todo * par = (Todo *) to->clone(); 170 Todo * par = (Todo *) to->clone();
170 cal.addIncidence( par ); 171 cal.addIncidence( par );
171 ICalFormat format( false ); 172 ICalFormat format( false );
172 format.save( &cal, file ); 173 format.save( &cal, file );
173 } 174 }
174 to->saveParents(); 175 to->saveParents();
175} 176}
176 177
177int Todo::runTime() 178int Todo::runTime()
178{ 179{
179 if ( !mRunning ) 180 if ( !mRunning )
180 return 0; 181 return 0;
181 return mRunStart.secsTo( QDateTime::currentDateTime() ); 182 return mRunStart.secsTo( QDateTime::currentDateTime() );
182} 183}
183bool Todo::hasRunningSub() 184bool Todo::hasRunningSub()
184{ 185{
185 if ( mRunning ) 186 if ( mRunning )
186 return true; 187 return true;
187 Incidence *aTodo; 188 Incidence *aTodo;
188 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) { 189 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) {
189 if ( ((Todo*)aTodo)->hasRunningSub() ) 190 if ( ((Todo*)aTodo)->hasRunningSub() )
190 return true; 191 return true;
191 } 192 }
192 return false; 193 return false;
193} 194}
194Incidence *Todo::clone() 195Incidence *Todo::clone()
195{ 196{
196 return new Todo(*this); 197 return new Todo(*this);
197} 198}
198 199
199bool Todo::contains ( Todo* from ) 200bool Todo::contains ( Todo* from )
200{ 201{
201 202
202 if ( !from->summary().isEmpty() ) 203 if ( !from->summary().isEmpty() )
203 if ( !summary().startsWith( from->summary() )) 204 if ( !summary().startsWith( from->summary() ))
204 return false; 205 return false;
205 if ( from->hasStartDate() ) { 206 if ( from->hasStartDate() ) {
206 if ( !hasStartDate() ) 207 if ( !hasStartDate() )
207 return false; 208 return false;
208 if ( from->dtStart() != dtStart()) 209 if ( from->dtStart() != dtStart())
209 return false; 210 return false;
210 } 211 }
211 if ( from->hasDueDate() ){ 212 if ( from->hasDueDate() ){
212 if ( !hasDueDate() ) 213 if ( !hasDueDate() )
213 return false; 214 return false;
214 if ( from->dtDue() != dtDue()) 215 if ( from->dtDue() != dtDue())
215 return false; 216 return false;
216 } 217 }
217 if ( !from->location().isEmpty() ) 218 if ( !from->location().isEmpty() )
218 if ( !location().startsWith( from->location() ) ) 219 if ( !location().startsWith( from->location() ) )
219 return false; 220 return false;
220 if ( !from->description().isEmpty() ) 221 if ( !from->description().isEmpty() )
221 if ( !description().startsWith( from->description() )) 222 if ( !description().startsWith( from->description() ))
222 return false; 223 return false;
223 if ( from->alarms().count() ) { 224 if ( from->alarms().count() ) {
224 Alarm *a = from->alarms().first(); 225 Alarm *a = from->alarms().first();
225 if ( a->enabled() ){ 226 if ( a->enabled() ){
226 if ( !alarms().count() ) 227 if ( !alarms().count() )
227 return false; 228 return false;
228 Alarm *b = alarms().first(); 229 Alarm *b = alarms().first();
229 if( ! b->enabled() ) 230 if( ! b->enabled() )
230 return false; 231 return false;
231 if ( ! (a->offset() == b->offset() )) 232 if ( ! (a->offset() == b->offset() ))
232 return false; 233 return false;
233 } 234 }
234 } 235 }
235 236
236 QStringList cat = categories(); 237 QStringList cat = categories();
237 QStringList catFrom = from->categories(); 238 QStringList catFrom = from->categories();
238 QString nCat; 239 QString nCat;
239 unsigned int iii; 240 unsigned int iii;
240 for ( iii = 0; iii < catFrom.count();++iii ) { 241 for ( iii = 0; iii < catFrom.count();++iii ) {
241 nCat = catFrom[iii]; 242 nCat = catFrom[iii];
242 if ( !nCat.isEmpty() ) 243 if ( !nCat.isEmpty() )
243 if ( !cat.contains( nCat )) { 244 if ( !cat.contains( nCat )) {
244 return false; 245 return false;
245 } 246 }
246 } 247 }
247 if ( from->isCompleted() ) { 248 if ( from->isCompleted() ) {
248 if ( !isCompleted() ) 249 if ( !isCompleted() )
249 return false; 250 return false;
250 } 251 }
251 if( priority() != from->priority() ) 252 if( priority() != from->priority() )
252 return false; 253 return false;
253 254
254 255
255 return true; 256 return true;
256 257
257} 258}
258bool KCal::operator==( const Todo& t1, const Todo& t2 ) 259bool KCal::operator==( const Todo& t1, const Todo& t2 )
259{ 260{
260 261
261 bool ret = operator==( (const Incidence&)t1, (const Incidence&)t2 ); 262 bool ret = operator==( (const Incidence&)t1, (const Incidence&)t2 );
262 if ( ! ret ) 263 if ( ! ret )
263 return false; 264 return false;
264 if ( t1.hasDueDate() == t2.hasDueDate() ) { 265 if ( t1.hasDueDate() == t2.hasDueDate() ) {
265 if ( t1.hasDueDate() ) { 266 if ( t1.hasDueDate() ) {
266 if ( t1.doesFloat() == t2.doesFloat() ) { 267 if ( t1.doesFloat() == t2.doesFloat() ) {
267 if ( t1.doesFloat() ) { 268 if ( t1.doesFloat() ) {
268 if ( t1.dtDue().date() != t2.dtDue().date() ) 269 if ( t1.dtDue().date() != t2.dtDue().date() )
269 return false; 270 return false;
270 } else 271 } else
271 if ( t1.dtDue() != t2.dtDue() ) 272 if ( t1.dtDue() != t2.dtDue() )
272 return false; 273 return false;
273 } else 274 } else
274 return false;// float != 275 return false;// float !=
275 } 276 }
276 277
277 } else 278 } else
278 return false; 279 return false;
279 if ( t1.percentComplete() != t2.percentComplete() ) 280 if ( t1.percentComplete() != t2.percentComplete() )
280 return false; 281 return false;
281 if ( t1.isCompleted() ) { 282 if ( t1.isCompleted() ) {
282 if ( t1.hasCompletedDate() == t2.hasCompletedDate() ) { 283 if ( t1.hasCompletedDate() == t2.hasCompletedDate() ) {
283 if ( t1.hasCompletedDate() ) { 284 if ( t1.hasCompletedDate() ) {
284 if ( t1.completed() != t2.completed() ) 285 if ( t1.completed() != t2.completed() )
285 return false; 286 return false;
286 } 287 }
287 288
288 } else 289 } else
289 return false; 290 return false;
290 } 291 }
291 return true; 292 return true;
292 293
293} 294}
294 295
295void Todo::setDtDue(const QDateTime &dtDue) 296void Todo::setDtDue(const QDateTime &dtDue)
296{ 297{
297 //int diffsecs = mDtDue.secsTo(dtDue); 298 //int diffsecs = mDtDue.secsTo(dtDue);
298 299
299 /*if (mReadOnly) return; 300 /*if (mReadOnly) return;
300 const QPtrList<Alarm>& alarms = alarms(); 301 const QPtrList<Alarm>& alarms = alarms();
301 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) { 302 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) {
302 if (alarm->enabled()) { 303 if (alarm->enabled()) {
303 alarm->setTime(alarm->time().addSecs(diffsecs)); 304 alarm->setTime(alarm->time().addSecs(diffsecs));
304 } 305 }
305 }*/ 306 }*/
306 mDtDue = getEvenTime(dtDue); 307 mDtDue = getEvenTime(dtDue);
307 308
308 //kdDebug(5800) << "setDtDue says date is " << mDtDue.toString() << endl; 309 //kdDebug(5800) << "setDtDue says date is " << mDtDue.toString() << endl;
309 310
310 /*const QPtrList<Alarm>& alarms = alarms(); 311 /*const QPtrList<Alarm>& alarms = alarms();
311 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) 312 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next())
312 alarm->setAlarmStart(mDtDue);*/ 313 alarm->setAlarmStart(mDtDue);*/
313 updated(); 314 updated();
314} 315}
315 316
316QDateTime Todo::dtDue() const 317QDateTime Todo::dtDue() const
317{ 318{
318 return mDtDue; 319 return mDtDue;
319} 320}
320 321
321QString Todo::dtDueTimeStr() const 322QString Todo::dtDueTimeStr() const
322{ 323{
323 return KGlobal::locale()->formatTime(mDtDue.time()); 324 return KGlobal::locale()->formatTime(mDtDue.time());
324} 325}
325 326
326QString Todo::dtDueDateStr(bool shortfmt) const 327QString Todo::dtDueDateStr(bool shortfmt) const
327{ 328{
328 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt); 329 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt);
329} 330}
330 331
331QString Todo::dtDueStr(bool shortfmt) const 332QString Todo::dtDueStr(bool shortfmt) const
332{ 333{
333 if ( doesFloat() ) 334 if ( doesFloat() )
334 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt); 335 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt);
335 return KGlobal::locale()->formatDateTime(mDtDue, shortfmt); 336 return KGlobal::locale()->formatDateTime(mDtDue, shortfmt);
336} 337}
337// retval 0 : no found 338// retval 0 : no found
338// 1 : due for date found 339// 1 : due for date found
339// 2 : overdue for date found 340// 2 : overdue for date found
340int Todo::hasDueSubTodoForDate( const QDate & date, bool checkSubtodos ) 341int Todo::hasDueSubTodoForDate( const QDate & date, bool checkSubtodos )
341{ 342{
342 int retval = 0; 343 int retval = 0;
343 if ( isCompleted() ) 344 if ( isCompleted() )
344 return 0; 345 return 0;
345 if ( hasDueDate() ) { 346 if ( hasDueDate() ) {
346 if ( dtDue().date() < date ) 347 if ( dtDue().date() < date )
347 return 2; 348 return 2;
348 // we do not return, because we may find an overdue sub todo 349 // we do not return, because we may find an overdue sub todo
349 if ( dtDue().date() == date ) 350 if ( dtDue().date() == date )
350 retval = 1; 351 retval = 1;
351 } 352 }
352 if ( checkSubtodos ) { 353 if ( checkSubtodos ) {
353 Incidence *aTodo; 354 Incidence *aTodo;
354 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) { 355 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) {
355 int ret = ((Todo*)aTodo)->hasDueSubTodoForDate( date ,checkSubtodos ); 356 int ret = ((Todo*)aTodo)->hasDueSubTodoForDate( date ,checkSubtodos );
356 if ( ret == 2 ) 357 if ( ret == 2 )
357 return 2; 358 return 2;
358 if ( ret == 1) 359 if ( ret == 1)
359 retval = 1; 360 retval = 1;
360 } 361 }
361 } 362 }
362 return retval; 363 return retval;
363} 364}
364int Todo::hasDueSubTodo( bool checkSubtodos ) //= true 365int Todo::hasDueSubTodo( bool checkSubtodos ) //= true
365{ 366{
366 return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos ); 367 return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos );
367} 368}
368bool Todo::hasDueDate() const 369bool Todo::hasDueDate() const
369{ 370{
370 return mHasDueDate; 371 return mHasDueDate;
371} 372}
372 373
373void Todo::setHasDueDate(bool f) 374void Todo::setHasDueDate(bool f)
374{ 375{
375 if (mReadOnly) return; 376 if (mReadOnly) return;
376 mHasDueDate = f; 377 mHasDueDate = f;
377 updated(); 378 updated();
378} 379}
379 380
380 381
381#if 0 382#if 0
382void Todo::setStatus(const QString &statStr) 383void Todo::setStatus(const QString &statStr)
383{ 384{
384 if (mReadOnly) return; 385 if (mReadOnly) return;
385 QString ss(statStr.upper()); 386 QString ss(statStr.upper());
386 387
387 if (ss == "X-ACTION") 388 if (ss == "X-ACTION")
388 mStatus = NEEDS_ACTION; 389 mStatus = NEEDS_ACTION;
389 else if (ss == "NEEDS ACTION") 390 else if (ss == "NEEDS ACTION")
390 mStatus = NEEDS_ACTION; 391 mStatus = NEEDS_ACTION;
391 else if (ss == "ACCEPTED") 392 else if (ss == "ACCEPTED")
392 mStatus = ACCEPTED; 393 mStatus = ACCEPTED;
393 else if (ss == "SENT") 394 else if (ss == "SENT")
394 mStatus = SENT; 395 mStatus = SENT;
395 else if (ss == "TENTATIVE") 396 else if (ss == "TENTATIVE")
396 mStatus = TENTATIVE; 397 mStatus = TENTATIVE;
397 else if (ss == "CONFIRMED") 398 else if (ss == "CONFIRMED")
398 mStatus = CONFIRMED; 399 mStatus = CONFIRMED;
399 else if (ss == "DECLINED") 400 else if (ss == "DECLINED")
400 mStatus = DECLINED; 401 mStatus = DECLINED;
401 else if (ss == "COMPLETED") 402 else if (ss == "COMPLETED")
402 mStatus = COMPLETED; 403 mStatus = COMPLETED;
403 else if (ss == "DELEGATED") 404 else if (ss == "DELEGATED")
404 mStatus = DELEGATED; 405 mStatus = DELEGATED;
405 406
406 updated(); 407 updated();
407} 408}
408 409
409void Todo::setStatus(int status) 410void Todo::setStatus(int status)
410{ 411{
411 if (mReadOnly) return; 412 if (mReadOnly) return;
412 mStatus = status; 413 mStatus = status;
413 updated(); 414 updated();
414} 415}
415 416
416int Todo::status() const 417int Todo::status() const
417{ 418{
418 return mStatus; 419 return mStatus;
419} 420}
420 421
421QString Todo::statusStr() const 422QString Todo::statusStr() const
422{ 423{
423 switch(mStatus) { 424 switch(mStatus) {
424 case NEEDS_ACTION: 425 case NEEDS_ACTION:
425 return QString("NEEDS ACTION"); 426 return QString("NEEDS ACTION");
426 break; 427 break;
427 case ACCEPTED: 428 case ACCEPTED:
428 return QString("ACCEPTED"); 429 return QString("ACCEPTED");