summaryrefslogtreecommitdiffabout
path: root/korganizer
Unidiff
Diffstat (limited to 'korganizer') (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/koeditorgeneraltodo.cpp20
-rw-r--r--korganizer/kolistview.cpp53
-rw-r--r--korganizer/kotodoeditor.cpp53
-rw-r--r--korganizer/kotodoview.cpp11
4 files changed, 73 insertions, 64 deletions
diff --git a/korganizer/koeditorgeneraltodo.cpp b/korganizer/koeditorgeneraltodo.cpp
index 4a1576a..e86b4d0 100644
--- a/korganizer/koeditorgeneraltodo.cpp
+++ b/korganizer/koeditorgeneraltodo.cpp
@@ -1,503 +1,503 @@
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 43
43#include <libkcal/todo.h> 44#include <libkcal/todo.h>
44 45
45#include <libkdepim/kdateedit.h> 46#include <libkdepim/kdateedit.h>
46 47
47#include "koprefs.h" 48#include "koprefs.h"
48#include "ktimeedit.h" 49#include "ktimeedit.h"
49 50
50#include "koeditorgeneraltodo.h" 51#include "koeditorgeneraltodo.h"
51#include "kolocationbox.h" 52#include "kolocationbox.h"
52 53
53KOEditorGeneralTodo::KOEditorGeneralTodo(QObject* parent, 54KOEditorGeneralTodo::KOEditorGeneralTodo(QObject* parent,
54 const char* name) 55 const char* name)
55 : KOEditorGeneral( parent, name) 56 : KOEditorGeneral( parent, name)
56{ 57{
57} 58}
58 59
59KOEditorGeneralTodo::~KOEditorGeneralTodo() 60KOEditorGeneralTodo::~KOEditorGeneralTodo()
60{ 61{
61} 62}
62 63
63void KOEditorGeneralTodo::finishSetup() 64void KOEditorGeneralTodo::finishSetup()
64{ 65{
65 66
66// QWidget::setTabOrder(mSummaryEdit, mLocationEdit); 67// QWidget::setTabOrder(mSummaryEdit, mLocationEdit);
67// QWidget::setTabOrder(mLocationEdit, mDueCheck); 68// QWidget::setTabOrder(mLocationEdit, mDueCheck);
68// QWidget::setTabOrder(mDueCheck, mDueDateEdit); 69// QWidget::setTabOrder(mDueCheck, mDueDateEdit);
69// QWidget::setTabOrder(mDueDateEdit, mDueTimeEdit); 70// QWidget::setTabOrder(mDueDateEdit, mDueTimeEdit);
70// QWidget::setTabOrder(mDueTimeEdit, mStartCheck); 71// QWidget::setTabOrder(mDueTimeEdit, mStartCheck);
71// QWidget::setTabOrder(mStartCheck, mStartDateEdit); 72// QWidget::setTabOrder(mStartCheck, mStartDateEdit);
72// QWidget::setTabOrder(mStartDateEdit, mStartTimeEdit); 73// QWidget::setTabOrder(mStartDateEdit, mStartTimeEdit);
73// QWidget::setTabOrder(mStartTimeEdit, mTimeButton); 74// QWidget::setTabOrder(mStartTimeEdit, mTimeButton);
74// QWidget::setTabOrder(mTimeButton, mCompletedCombo); 75// QWidget::setTabOrder(mTimeButton, mCompletedCombo);
75// QWidget::setTabOrder(mCompletedCombo, mPriorityCombo); 76// QWidget::setTabOrder(mCompletedCombo, mPriorityCombo);
76// QWidget::setTabOrder(mPriorityCombo, mAlarmButton); 77// QWidget::setTabOrder(mPriorityCombo, mAlarmButton);
77// QWidget::setTabOrder(mAlarmButton, mCategoriesButton); 78// QWidget::setTabOrder(mAlarmButton, mCategoriesButton);
78// QWidget::setTabOrder(mCategoriesButton, mSecrecyCombo); 79// QWidget::setTabOrder(mCategoriesButton, mSecrecyCombo);
79// QWidget::setTabOrder(mSecrecyCombo, mDescriptionEdit); 80// QWidget::setTabOrder(mSecrecyCombo, mDescriptionEdit);
80 mSummaryEdit->load(KOLocationBox::SUMMARYTODO); 81 mSummaryEdit->load(KOLocationBox::SUMMARYTODO);
81 mSummaryEdit->setFocus(); 82 mSummaryEdit->setFocus();
82} 83}
83 84
84void KOEditorGeneralTodo::initTime(QWidget *parent,QBoxLayout *topLayout) 85void KOEditorGeneralTodo::initTime(QWidget *parent,QBoxLayout *topLayout)
85{ 86{
86 QBoxLayout *timeLayout = new QVBoxLayout(topLayout); 87 QBoxLayout *timeLayout = new QVBoxLayout(topLayout);
87 88
88 QGroupBox *timeGroupBox = new QGroupBox(1,QGroupBox::Horizontal, 89 QGroupBox *timeGroupBox = new QGroupBox(1,QGroupBox::Horizontal,
89 i18n("Date && Time"),parent); 90 i18n("Date && Time"),parent);
90 timeLayout->addWidget(timeGroupBox); 91 timeLayout->addWidget(timeGroupBox);
91 timeGroupBox->layout()->setSpacing( 0 ); 92 timeGroupBox->layout()->setSpacing( KDialog::spacingHintSmall() );
92 timeGroupBox->layout()->setMargin( 5 ); 93 timeGroupBox->layout()->setMargin( KDialog::marginHint() );
93 QFrame *timeBoxFrame = new QFrame(timeGroupBox); 94 QFrame *timeBoxFrame = new QFrame(timeGroupBox);
94 95
95 QGridLayout *layoutTimeBox = new QGridLayout(timeBoxFrame,3,3); 96 QGridLayout *layoutTimeBox = new QGridLayout(timeBoxFrame,3,3);
96 layoutTimeBox->setSpacing(topLayout->spacing()); 97 layoutTimeBox->setSpacing(KDialog::spacingHintSmall());
97 layoutTimeBox->setColStretch( 1, 1 ); 98 layoutTimeBox->setColStretch( 1, 1 );
98 99
99 mDueCheck = new QCheckBox(i18n("Due:"),timeBoxFrame); 100 mDueCheck = new QCheckBox(i18n("Due:"),timeBoxFrame);
100 layoutTimeBox->addWidget(mDueCheck,0,0); 101 layoutTimeBox->addWidget(mDueCheck,1,0);
101 connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(enableDueEdit(bool))); 102 connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(enableDueEdit(bool)));
102 connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(showAlarm())); 103 connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(showAlarm()));
103 104
104 105
105 mDueDateEdit = new KDateEdit(timeBoxFrame); 106 mDueDateEdit = new KDateEdit(timeBoxFrame);
106 layoutTimeBox->addWidget(mDueDateEdit,0,1); 107 layoutTimeBox->addWidget(mDueDateEdit,1,1);
107 108
108 mDueTimeEdit = new KOTimeEdit(timeBoxFrame); 109 mDueTimeEdit = new KOTimeEdit(timeBoxFrame);
109 layoutTimeBox->addWidget(mDueTimeEdit,0,2); 110 layoutTimeBox->addWidget(mDueTimeEdit,1,2);
110 111
111 112
112 mStartCheck = new QCheckBox(i18n("Start:"),timeBoxFrame); 113 mStartCheck = new QCheckBox(i18n("Start:"),timeBoxFrame);
113 layoutTimeBox->addWidget(mStartCheck,1,0); 114 layoutTimeBox->addWidget(mStartCheck,0,0);
114 connect(mStartCheck,SIGNAL(toggled(bool)),SLOT(enableStartEdit(bool))); 115 connect(mStartCheck,SIGNAL(toggled(bool)),SLOT(enableStartEdit(bool)));
115 116
116 mStartDateEdit = new KDateEdit(timeBoxFrame); 117 mStartDateEdit = new KDateEdit(timeBoxFrame);
117 layoutTimeBox->addWidget(mStartDateEdit,1,1); 118 layoutTimeBox->addWidget(mStartDateEdit,0,1);
118 119
119 mStartTimeEdit = new KOTimeEdit(timeBoxFrame); 120 mStartTimeEdit = new KOTimeEdit(timeBoxFrame);
120 layoutTimeBox->addWidget(mStartTimeEdit,1,2); 121 layoutTimeBox->addWidget(mStartTimeEdit,0,2);
121 122
122 123
123 mTimeButton = new QCheckBox(i18n("Time associated"),timeBoxFrame); 124 mTimeButton = new QCheckBox(i18n("Time associated"),timeBoxFrame);
124 layoutTimeBox->addMultiCellWidget(mTimeButton,2,2,0,1); 125 layoutTimeBox->addMultiCellWidget(mTimeButton,2,2,0,1);
125 126
126 connect(mTimeButton,SIGNAL(toggled(bool)),SLOT(enableTimeEdits(bool))); 127 connect(mTimeButton,SIGNAL(toggled(bool)),SLOT(enableTimeEdits(bool)));
127 connect(mDueDateEdit,SIGNAL(setTimeTo(QTime)),mDueTimeEdit,SLOT(setTime(QTime))); 128 connect(mDueDateEdit,SIGNAL(setTimeTo(QTime)),mDueTimeEdit,SLOT(setTime(QTime)));
128 connect(mStartDateEdit,SIGNAL(setTimeTo(QTime)),mStartTimeEdit,SLOT(setTime(QTime))); 129 connect(mStartDateEdit,SIGNAL(setTimeTo(QTime)),mStartTimeEdit,SLOT(setTime(QTime)));
129 130
130 // some more layouting 131 // some more layouting
131 //layoutTimeBox->setColStretch(3,1); 132 //layoutTimeBox->setColStretch(3,1);
132} 133}
133 134
134 135
135void KOEditorGeneralTodo::initCompletion(QWidget *parent, QBoxLayout *topLayout) 136void KOEditorGeneralTodo::initCompletion(QWidget *parent, QBoxLayout *topLayout)
136{ 137{
137 mCompletedCombo = new QComboBox(parent); 138 mCompletedCombo = new QComboBox(parent);
138 // xgettext:no-c-format 139 // xgettext:no-c-format
139 mCompletedCombo->insertItem(i18n(" 0 %")); 140 mCompletedCombo->insertItem(i18n(" 0 %"));
140 // xgettext:no-c-format 141 // xgettext:no-c-format
141 mCompletedCombo->insertItem(i18n(" 20 %")); 142 mCompletedCombo->insertItem(i18n(" 20 %"));
142 // xgettext:no-c-format 143 // xgettext:no-c-format
143 mCompletedCombo->insertItem(i18n(" 40 %")); 144 mCompletedCombo->insertItem(i18n(" 40 %"));
144 // xgettext:no-c-format 145 // xgettext:no-c-format
145 mCompletedCombo->insertItem(i18n(" 60 %")); 146 mCompletedCombo->insertItem(i18n(" 60 %"));
146 // xgettext:no-c-format 147 // xgettext:no-c-format
147 mCompletedCombo->insertItem(i18n(" 80 %")); 148 mCompletedCombo->insertItem(i18n(" 80 %"));
148 // xgettext:no-c-format 149 // xgettext:no-c-format
149 mCompletedCombo->insertItem(i18n("100 %")); 150 mCompletedCombo->insertItem(i18n("100 %"));
150 connect(mCompletedCombo,SIGNAL(activated(int)),SLOT(completedChanged(int))); 151 connect(mCompletedCombo,SIGNAL(activated(int)),SLOT(completedChanged(int)));
151 topLayout->addWidget(mCompletedCombo); 152 topLayout->addWidget(mCompletedCombo);
152 153
153 mCompletedLabel = new QLabel(i18n("completed"),parent); 154 mCompletedLabel = new QLabel(i18n("completed"),parent);
154 topLayout->addWidget(mCompletedLabel); 155 topLayout->addWidget(mCompletedLabel);
155 156
156 mCompleteDateEdit = new KDateEdit(parent); 157 mCompleteDateEdit = new KDateEdit(parent);
157 topLayout->addWidget(mCompleteDateEdit ); 158 topLayout->addWidget(mCompleteDateEdit );
158 159
159 mCompleteTimeEdit = new KOTimeEdit(parent); 160 mCompleteTimeEdit = new KOTimeEdit(parent);
160 topLayout->addWidget( mCompleteTimeEdit); 161 topLayout->addWidget( mCompleteTimeEdit);
161 162
162 mCompletedCombo->setSizePolicy( QSizePolicy( QSizePolicy::Preferred,QSizePolicy::Preferred) ); 163 mCompletedCombo->setSizePolicy( QSizePolicy( QSizePolicy::Preferred,QSizePolicy::Preferred) );
163 mCompletedLabel->setSizePolicy( QSizePolicy( QSizePolicy::Expanding,QSizePolicy::Preferred) ); 164 mCompletedLabel->setSizePolicy( QSizePolicy( QSizePolicy::Expanding,QSizePolicy::Preferred) );
164 connect(mCompleteDateEdit,SIGNAL(setTimeTo(QTime)),mCompleteTimeEdit,SLOT(setTime(QTime))); 165 connect(mCompleteDateEdit,SIGNAL(setTimeTo(QTime)),mCompleteTimeEdit,SLOT(setTime(QTime)));
165 166
166 if ( QApplication::desktop()->width() <= 480 ) { 167 if ( QApplication::desktop()->width() <= 480 ) {
167 if ( QApplication::desktop()->width() < 320 ) 168 if ( QApplication::desktop()->width() < 320 )
168 mCompleteDateEdit->setMaximumWidth( 85 ); 169 mCompleteDateEdit->setMaximumWidth( 85 );
169 else 170 else
170 mCompleteDateEdit->setMaximumWidth( 140 ); 171 mCompleteDateEdit->setMaximumWidth( 140 );
171 topLayout->setSpacing( 0 ); 172 topLayout->setSpacing( 0 );
172 } 173 }
173} 174}
174 175
175void KOEditorGeneralTodo::initPriority(QWidget *parent, QBoxLayout *topLayout) 176void KOEditorGeneralTodo::initPriority(QWidget *parent, QBoxLayout *topLayout)
176{ 177{
177 178
178 QHBox* h = new QHBox ( parent ); 179 QHBox* h = new QHBox ( parent );
179 topLayout->addWidget( h ); 180 topLayout->addWidget( h );
180 QLabel *priorityLabel = new QLabel(i18n("Priority:"), h); 181 QLabel *priorityLabel = new QLabel(i18n("Priority:"), h);
181 // topLayout->addWidget(priorityLabel); 182 // topLayout->addWidget(priorityLabel);
182 mPriorityCombo = new QComboBox( h ); 183 mPriorityCombo = new QComboBox( h );
183 mPriorityCombo->insertItem(i18n("1 (high)")); 184 mPriorityCombo->insertItem(i18n("1 (high)"));
184 mPriorityCombo->insertItem(i18n("2")); 185 mPriorityCombo->insertItem(i18n("2"));
185 mPriorityCombo->insertItem(i18n("3")); 186 mPriorityCombo->insertItem(i18n("3"));
186 mPriorityCombo->insertItem(i18n("4")); 187 mPriorityCombo->insertItem(i18n("4"));
187 mPriorityCombo->insertItem(i18n("5 (low)")); 188 mPriorityCombo->insertItem(i18n("5 (low)"));
188 //topLayout->addWidget(mPriorityCombo); 189 //topLayout->addWidget(mPriorityCombo);
189} 190}
190 191
191void KOEditorGeneralTodo::initStatus(QWidget *parent,QBoxLayout *topLayout) 192void KOEditorGeneralTodo::initStatus(QWidget *parent,QBoxLayout *topLayout)
192{ 193{
193 QBoxLayout *statusLayout = new QHBoxLayout(topLayout); 194 QBoxLayout *statusLayout = new QHBoxLayout(topLayout);
194 195
195 initCompletion( parent, statusLayout ); 196 initCompletion( parent, statusLayout );
196 197
197 statusLayout->addStretch( 1 ); 198 statusLayout->addStretch( 1 );
198 199
199 initPriority( parent, statusLayout ); 200 initPriority( parent, statusLayout );
200} 201}
201 202
202void KOEditorGeneralTodo::setDefaults(QDateTime due,bool allDay) 203void KOEditorGeneralTodo::setDefaults(QDateTime due,bool allDay)
203{ 204{
204 205
205 mSummaryEdit->load(KOLocationBox::SUMMARYTODO); 206 mSummaryEdit->load(KOLocationBox::SUMMARYTODO);
206 mLocationEdit->load(KOLocationBox::LOCATION); 207 mLocationEdit->load(KOLocationBox::LOCATION);
207 KOEditorGeneral::setDefaults(allDay); 208 KOEditorGeneral::setDefaults(allDay);
208 209
209 mTimeButton->setChecked( !allDay ); 210 mTimeButton->setChecked( !allDay );
210 if(mTimeButton->isChecked()) { 211 if(mTimeButton->isChecked()) {
211 mTimeButton->setEnabled(true); 212 mTimeButton->setEnabled(true);
212 } 213 }
213 else { 214 else {
214 mTimeButton->setEnabled(false); 215 mTimeButton->setEnabled(false);
215 } 216 }
216 217
217 enableTimeEdits( !allDay ); 218 enableTimeEdits( !allDay );
218 if ( due.isValid() ) { 219 if ( due.isValid() ) {
219 mDueCheck->setChecked(true); 220 mDueCheck->setChecked(true);
220 enableDueEdit(true); 221 enableDueEdit(true);
221 alarmDisable(false); 222 alarmDisable(false);
222 } else { 223 } else {
223 mDueCheck->setChecked(false); 224 mDueCheck->setChecked(false);
224 enableDueEdit(false); 225 enableDueEdit(false);
225 due = QDateTime::currentDateTime().addDays(7); 226 due = QDateTime::currentDateTime().addDays(7);
226 alarmDisable(true); 227 alarmDisable(true);
227 } 228 }
228 229
229 230
230 mStartCheck->setChecked(false); 231 mStartCheck->setChecked(false);
231 enableStartEdit(false); 232 enableStartEdit(false);
232 233
233 mDueDateEdit->setDate(due.date()); 234 mDueDateEdit->setDate(due.date());
234 mDueTimeEdit->setTime(due.time()); 235 mDueTimeEdit->setTime(due.time());
235 due = due.addDays(-7); 236 due = due.addDays(-7);
236 mStartDateEdit->setDate(due.date()); 237 mStartDateEdit->setDate(due.date());
237 mStartTimeEdit->setTime(due.time()); 238 mStartTimeEdit->setTime(due.time());
238 239
239 mPriorityCombo->setCurrentItem(2); 240 mPriorityCombo->setCurrentItem(2);
240 mCompletedLabel->setText(i18n(" completed"));; 241 mCompletedLabel->setText(i18n(" completed"));;
241 mCompletedCombo->setCurrentItem(0); 242 mCompletedCombo->setCurrentItem(0);
242 mCompleteDateEdit->hide(); 243 mCompleteDateEdit->hide();
243 mCompleteTimeEdit->hide(); 244 mCompleteTimeEdit->hide();
244} 245}
245 246
246void KOEditorGeneralTodo::readTodo(Todo *todo) 247void KOEditorGeneralTodo::readTodo(Todo *todo)
247{ 248{
248 249
249 mSummaryEdit->load(KOLocationBox::SUMMARYTODO); 250 mSummaryEdit->load(KOLocationBox::SUMMARYTODO);
250 mLocationEdit->load(KOLocationBox::LOCATION); 251 mLocationEdit->load(KOLocationBox::LOCATION);
251 KOEditorGeneral::readIncidence(todo); 252 KOEditorGeneral::readIncidence(todo);
252 253
253 QDateTime dueDT; 254 QDateTime dueDT;
254 255
255 if (todo->hasDueDate()) { 256 if (todo->hasDueDate()) {
256 enableAlarmEdit(true); 257 enableAlarmEdit(true);
257 dueDT = todo->dtDue(); 258 dueDT = todo->dtDue();
258 mDueDateEdit->setDate(todo->dtDue().date()); 259 mDueDateEdit->setDate(todo->dtDue().date());
259 mDueTimeEdit->setTime(todo->dtDue().time()); 260 mDueTimeEdit->setTime(todo->dtDue().time());
260 mDueCheck->setChecked(true); 261 mDueCheck->setChecked(true);
261 } else { 262 } else {
262 alarmDisable(true); 263 alarmDisable(true);
263 mDueDateEdit->setEnabled(false); 264 mDueDateEdit->setEnabled(false);
264 mDueTimeEdit->setEnabled(false); 265 mDueTimeEdit->setEnabled(false);
265 mDueDateEdit->setDate(QDate::currentDate()); 266 mDueDateEdit->setDate(QDate::currentDate());
266 mDueTimeEdit->setTime(QTime::currentTime()); 267 mDueTimeEdit->setTime(QTime::currentTime());
267 mDueCheck->setChecked(false); 268 mDueCheck->setChecked(false);
268 } 269 }
269 270
270 if (todo->hasStartDate()) { 271 if (todo->hasStartDate()) {
271 mStartDateEdit->setDate(todo->dtStart().date()); 272 mStartDateEdit->setDate(todo->dtStart().date());
272 mStartTimeEdit->setTime(todo->dtStart().time()); 273 mStartTimeEdit->setTime(todo->dtStart().time());
273 mStartCheck->setChecked(true); 274 mStartCheck->setChecked(true);
274 } else { 275 } else {
275 mStartDateEdit->setEnabled(false); 276 mStartDateEdit->setEnabled(false);
276 mStartTimeEdit->setEnabled(false); 277 mStartTimeEdit->setEnabled(false);
277 mStartDateEdit->setDate(QDate::currentDate()); 278 mStartDateEdit->setDate(QDate::currentDate());
278 mStartTimeEdit->setTime(QTime::currentTime()); 279 mStartTimeEdit->setTime(QTime::currentTime());
279 mStartCheck->setChecked(false); 280 mStartCheck->setChecked(false);
280 } 281 }
281 282
282 mTimeButton->setChecked( !todo->doesFloat() ); 283 mTimeButton->setChecked( !todo->doesFloat() );
283 284
284 mCompletedCombo->setCurrentItem(todo->percentComplete() / 20); 285 mCompletedCombo->setCurrentItem(todo->percentComplete() / 20);
285 if (todo->isCompleted() && todo->hasCompletedDate()) { 286 if (todo->isCompleted() && todo->hasCompletedDate()) {
286 mCompleted = todo->completed(); 287 mCompleted = todo->completed();
287 } 288 }
288 setCompletedDate(); 289 setCompletedDate();
289 290
290 mPriorityCombo->setCurrentItem(todo->priority()-1); 291 mPriorityCombo->setCurrentItem(todo->priority()-1);
291} 292}
292 293
293void KOEditorGeneralTodo::writeTodo(Todo *todo) 294void KOEditorGeneralTodo::writeTodo(Todo *todo)
294{ 295{
295 KOEditorGeneral::writeIncidence(todo); 296 KOEditorGeneral::writeIncidence(todo);
296 297
297 // temp. until something better happens. 298 // temp. until something better happens.
298 QString tmpStr; 299 QString tmpStr;
299 300
300 todo->setHasDueDate(mDueCheck->isChecked()); 301 todo->setHasDueDate(mDueCheck->isChecked());
301 todo->setHasStartDate(mStartCheck->isChecked()); 302 todo->setHasStartDate(mStartCheck->isChecked());
302 303
303 QDate tmpDate; 304 QDate tmpDate;
304 QTime tmpTime; 305 QTime tmpTime;
305 QDateTime tmpDT; 306 QDateTime tmpDT;
306 if ( mTimeButton->isChecked() ) { 307 if ( mTimeButton->isChecked() ) {
307 todo->setFloats(false); 308 todo->setFloats(false);
308 309
309 // set due date/time 310 // set due date/time
310 tmpDate = mDueDateEdit->date(); 311 tmpDate = mDueDateEdit->date();
311 tmpTime = mDueTimeEdit->getTime(); 312 tmpTime = mDueTimeEdit->getTime();
312 tmpDT.setDate(tmpDate); 313 tmpDT.setDate(tmpDate);
313 tmpDT.setTime(tmpTime); 314 tmpDT.setTime(tmpTime);
314 todo->setDtDue(tmpDT); 315 todo->setDtDue(tmpDT);
315 316
316 // set start date/time 317 // set start date/time
317 tmpDate = mStartDateEdit->date(); 318 tmpDate = mStartDateEdit->date();
318 tmpTime = mStartTimeEdit->getTime(); 319 tmpTime = mStartTimeEdit->getTime();
319 tmpDT.setDate(tmpDate); 320 tmpDT.setDate(tmpDate);
320 tmpDT.setTime(tmpTime); 321 tmpDT.setTime(tmpTime);
321 todo->setDtStart(tmpDT); 322 todo->setDtStart(tmpDT);
322 } else { 323 } else {
323 todo->setFloats(true); 324 todo->setFloats(true);
324 325
325 // need to change this. 326 // need to change this.
326 tmpDate = mDueDateEdit->date(); 327 tmpDate = mDueDateEdit->date();
327 tmpTime.setHMS(0,0,0); 328 tmpTime.setHMS(0,0,0);
328 tmpDT.setDate(tmpDate); 329 tmpDT.setDate(tmpDate);
329 tmpDT.setTime(tmpTime); 330 tmpDT.setTime(tmpTime);
330 todo->setDtDue(tmpDT); 331 todo->setDtDue(tmpDT);
331 332
332 tmpDate = mStartDateEdit->date(); 333 tmpDate = mStartDateEdit->date();
333 tmpTime.setHMS(0,0,0); 334 tmpTime.setHMS(0,0,0);
334 tmpDT.setDate(tmpDate); 335 tmpDT.setDate(tmpDate);
335 tmpDT.setTime(tmpTime); 336 tmpDT.setTime(tmpTime);
336 todo->setDtStart(tmpDT); 337 todo->setDtStart(tmpDT);
337 } 338 }
338 todo->setPriority(mPriorityCombo->currentItem()+1); 339 todo->setPriority(mPriorityCombo->currentItem()+1);
339 340
340 // set completion state 341 // set completion state
341 if ( mCompletedCombo->currentItem() == 5 ) { 342 if ( mCompletedCombo->currentItem() == 5 ) {
342 QDateTime comp ( mCompleteDateEdit->date(), mCompleteTimeEdit->getTime() ); 343 QDateTime comp ( mCompleteDateEdit->date(), mCompleteTimeEdit->getTime() );
343 if ( comp.isValid () ) { 344 if ( comp.isValid () ) {
344 todo->setPercentComplete(0);
345 todo->setPercentComplete(100); 345 todo->setPercentComplete(100);
346 todo->setCompleted(comp); 346 todo->setCompleted(comp);
347 } else { 347 } else {
348 todo->setPercentComplete( 100 ); 348 todo->setPercentComplete( 100 );
349 if ( mCompleted.isValid() ) 349 if ( mCompleted.isValid() )
350 todo->setCompleted(mCompleted); 350 todo->setCompleted(mCompleted);
351 } 351 }
352 } else { 352 } else {
353 todo->setPercentComplete(mCompletedCombo->currentItem() * 20); 353 todo->setPercentComplete(mCompletedCombo->currentItem() * 20);
354 } 354 }
355 355
356 mSummaryEdit->save(KOLocationBox::SUMMARYTODO); 356 mSummaryEdit->save(KOLocationBox::SUMMARYTODO);
357} 357}
358 358
359void KOEditorGeneralTodo::enableDueEdit(bool enable) 359void KOEditorGeneralTodo::enableDueEdit(bool enable)
360{ 360{
361 mDueDateEdit->setEnabled( enable ); 361 mDueDateEdit->setEnabled( enable );
362 362
363 if(mDueCheck->isChecked() || mStartCheck->isChecked()) { 363 if(mDueCheck->isChecked() || mStartCheck->isChecked()) {
364 mTimeButton->setEnabled(true); 364 mTimeButton->setEnabled(true);
365 } 365 }
366 else { 366 else {
367 mTimeButton->setEnabled(false); 367 mTimeButton->setEnabled(false);
368 mTimeButton->setChecked(false); 368 mTimeButton->setChecked(false);
369 } 369 }
370 370
371 if (enable) { 371 if (enable) {
372 mDueTimeEdit->setEnabled( mTimeButton->isChecked() ); 372 mDueTimeEdit->setEnabled( mTimeButton->isChecked() );
373 } else { 373 } else {
374 mDueTimeEdit->setEnabled( false ); 374 mDueTimeEdit->setEnabled( false );
375 } 375 }
376 emit datesChecked(); 376 emit datesChecked();
377} 377}
378 378
379void KOEditorGeneralTodo::enableStartEdit( bool enable ) 379void KOEditorGeneralTodo::enableStartEdit( bool enable )
380{ 380{
381 mStartDateEdit->setEnabled( enable ); 381 mStartDateEdit->setEnabled( enable );
382 382
383 if(mDueCheck->isChecked() || mStartCheck->isChecked()) { 383 if(mDueCheck->isChecked() || mStartCheck->isChecked()) {
384 mTimeButton->setEnabled(true); 384 mTimeButton->setEnabled(true);
385 } 385 }
386 else { 386 else {
387 mTimeButton->setEnabled(false); 387 mTimeButton->setEnabled(false);
388 mTimeButton->setChecked(false); 388 mTimeButton->setChecked(false);
389 } 389 }
390 390
391 if (enable) { 391 if (enable) {
392 mStartTimeEdit->setEnabled( mTimeButton->isChecked() ); 392 mStartTimeEdit->setEnabled( mTimeButton->isChecked() );
393 } else { 393 } else {
394 mStartTimeEdit->setEnabled( false ); 394 mStartTimeEdit->setEnabled( false );
395 } 395 }
396 emit datesChecked(); 396 emit datesChecked();
397} 397}
398 398
399void KOEditorGeneralTodo::enableTimeEdits(bool enable) 399void KOEditorGeneralTodo::enableTimeEdits(bool enable)
400{ 400{
401 if(mStartCheck->isChecked()) { 401 if(mStartCheck->isChecked()) {
402 mStartTimeEdit->setEnabled( enable ); 402 mStartTimeEdit->setEnabled( enable );
403 } 403 }
404 if(mDueCheck->isChecked()) { 404 if(mDueCheck->isChecked()) {
405 mDueTimeEdit->setEnabled( enable ); 405 mDueTimeEdit->setEnabled( enable );
406 } 406 }
407} 407}
408 408
409void KOEditorGeneralTodo::showAlarm() 409void KOEditorGeneralTodo::showAlarm()
410{ 410{
411 if ( mDueCheck->isChecked() ) { 411 if ( mDueCheck->isChecked() ) {
412 alarmDisable(false); 412 alarmDisable(false);
413 } 413 }
414 else { 414 else {
415 alarmDisable(true); 415 alarmDisable(true);
416 } 416 }
417} 417}
418 418
419bool KOEditorGeneralTodo::validateInput() 419bool KOEditorGeneralTodo::validateInput()
420{ 420{
421 if (mDueCheck->isChecked()) { 421 if (mDueCheck->isChecked()) {
422 if (!mDueDateEdit->inputIsValid()) { 422 if (!mDueDateEdit->inputIsValid()) {
423 KMessageBox::sorry(0,i18n("Please specify a valid due date.")); 423 KMessageBox::sorry(0,i18n("Please specify a valid due date."));
424 return false; 424 return false;
425 } 425 }
426 } 426 }
427 427
428 if (mStartCheck->isChecked()) { 428 if (mStartCheck->isChecked()) {
429 if (!mStartDateEdit->inputIsValid()) { 429 if (!mStartDateEdit->inputIsValid()) {
430 KMessageBox::sorry(0,i18n("Please specify a valid start date.")); 430 KMessageBox::sorry(0,i18n("Please specify a valid start date."));
431 return false; 431 return false;
432 } 432 }
433 } 433 }
434 434
435 if (mStartCheck->isChecked() && mDueCheck->isChecked()) { 435 if (mStartCheck->isChecked() && mDueCheck->isChecked()) {
436 QDateTime startDate; 436 QDateTime startDate;
437 QDateTime dueDate; 437 QDateTime dueDate;
438 startDate.setDate(mStartDateEdit->date()); 438 startDate.setDate(mStartDateEdit->date());
439 dueDate.setDate(mDueDateEdit->date()); 439 dueDate.setDate(mDueDateEdit->date());
440 if (mTimeButton->isChecked()) { 440 if (mTimeButton->isChecked()) {
441 startDate.setTime(mStartTimeEdit->getTime()); 441 startDate.setTime(mStartTimeEdit->getTime());
442 dueDate.setTime(mDueTimeEdit->getTime()); 442 dueDate.setTime(mDueTimeEdit->getTime());
443 } 443 }
444 if (startDate > dueDate) { 444 if (startDate > dueDate) {
445 KMessageBox::sorry(0, 445 KMessageBox::sorry(0,
446 i18n("The start date cannot be after the due date.")); 446 i18n("The start date cannot be after the due date."));
447 return false; 447 return false;
448 } 448 }
449 } 449 }
450 450
451 return KOEditorGeneral::validateInput(); 451 return KOEditorGeneral::validateInput();
452} 452}
453 453
454void KOEditorGeneralTodo::completedChanged(int index) 454void KOEditorGeneralTodo::completedChanged(int index)
455{ 455{
456 if (index == 5) { 456 if (index == 5) {
457 //get rid of milli sec 457 //get rid of milli sec
458 mCompleted = QDateTime::currentDateTime(); 458 mCompleted = QDateTime::currentDateTime();
459 } 459 }
460 setCompletedDate(); 460 setCompletedDate();
461} 461}
462 462
463void KOEditorGeneralTodo::setCompletedDate() 463void KOEditorGeneralTodo::setCompletedDate()
464{ 464{
465 if (mCompletedCombo->currentItem() == 5 && mCompleted.isValid()) { 465 if (mCompletedCombo->currentItem() == 5 && mCompleted.isValid()) {
466 if ( QApplication::desktop()->width() < 480 ) { 466 if ( QApplication::desktop()->width() < 480 ) {
467 mCompletedLabel->setText(i18n(" on")); 467 mCompletedLabel->setText(i18n(" on"));
468 } 468 }
469 else 469 else
470 mCompletedLabel->setText(i18n(" completed on ")); 470 mCompletedLabel->setText(i18n(" completed on "));
471 mCompleteDateEdit->show(); 471 mCompleteDateEdit->show();
472 mCompleteTimeEdit->show(); 472 mCompleteTimeEdit->show();
473 mCompleteTimeEdit->setTime( mCompleted.time() ); 473 mCompleteTimeEdit->setTime( mCompleted.time() );
474 mCompleteDateEdit->setDate( mCompleted.date() ); 474 mCompleteDateEdit->setDate( mCompleted.date() );
475 } else { 475 } else {
476 mCompletedLabel->setText(i18n(" completed")); 476 mCompletedLabel->setText(i18n(" completed"));
477 mCompleteDateEdit->hide(); 477 mCompleteDateEdit->hide();
478 mCompleteTimeEdit->hide(); 478 mCompleteTimeEdit->hide();
479 } 479 }
480} 480}
481 481
482void KOEditorGeneralTodo::modified (Todo* todo, int modification) 482void KOEditorGeneralTodo::modified (Todo* todo, int modification)
483{ 483{
484 switch (modification) { 484 switch (modification) {
485 case KOGlobals::PRIORITY_MODIFIED: 485 case KOGlobals::PRIORITY_MODIFIED:
486 mPriorityCombo->setCurrentItem(todo->priority()-1); 486 mPriorityCombo->setCurrentItem(todo->priority()-1);
487 break; 487 break;
488 case KOGlobals::COMPLETION_MODIFIED: 488 case KOGlobals::COMPLETION_MODIFIED:
489 mCompletedCombo->setCurrentItem(todo->percentComplete() / 20); 489 mCompletedCombo->setCurrentItem(todo->percentComplete() / 20);
490 if (todo->isCompleted() && todo->hasCompletedDate()) { 490 if (todo->isCompleted() && todo->hasCompletedDate()) {
491 mCompleted = todo->completed(); 491 mCompleted = todo->completed();
492 } 492 }
493 setCompletedDate(); 493 setCompletedDate();
494 break; 494 break;
495 case KOGlobals::CATEGORY_MODIFIED: 495 case KOGlobals::CATEGORY_MODIFIED:
496 setCategories (todo->categoriesStr ()); 496 setCategories (todo->categoriesStr ());
497 break; 497 break;
498 case KOGlobals::UNKNOWN_MODIFIED: // fall through 498 case KOGlobals::UNKNOWN_MODIFIED: // fall through
499 default: 499 default:
500 readTodo( todo ); 500 readTodo( todo );
501 break; 501 break;
502 } 502 }
503} 503}
diff --git a/korganizer/kolistview.cpp b/korganizer/kolistview.cpp
index bbf83d9..fd86095 100644
--- a/korganizer/kolistview.cpp
+++ b/korganizer/kolistview.cpp
@@ -1,1266 +1,1267 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 1999 Preston Brown 3 Copyright (c) 1999 Preston Brown
4 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This program is free software; you can redistribute it and/or modify 6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by 7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or 8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version. 9 (at your option) any later version.
10 10
11 This program is distributed in the hope that it will be useful, 11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details. 14 GNU General Public License for more details.
15 15
16 You should have received a copy of the GNU General Public License 16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software 17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 19
20 As a special exception, permission is given to link this program 20 As a special exception, permission is given to link this program
21 with any edition of Qt, and distribute the resulting executable, 21 with any edition of Qt, and distribute the resulting executable,
22 without including the source code for Qt in the source distribution. 22 without including the source code for Qt in the source distribution.
23*/ 23*/
24 24
25#include <qlistview.h> 25#include <qlistview.h>
26#include <qlayout.h> 26#include <qlayout.h>
27#include <qlabel.h> 27#include <qlabel.h>
28#include <qpopupmenu.h> 28#include <qpopupmenu.h>
29#include <qprogressbar.h> 29#include <qprogressbar.h>
30#include <qfileinfo.h> 30#include <qfileinfo.h>
31#include <qmessagebox.h> 31#include <qmessagebox.h>
32#include <qdialog.h> 32#include <qdialog.h>
33#include <qtextstream.h> 33#include <qtextstream.h>
34#include <qdir.h> 34#include <qdir.h>
35#include <qwhatsthis.h> 35#include <qwhatsthis.h>
36#include <qregexp.h> 36#include <qregexp.h>
37 37
38#include <klocale.h> 38#include <klocale.h>
39#include <kdebug.h> 39#include <kdebug.h>
40#include <kiconloader.h> 40#include <kiconloader.h>
41#include <kglobal.h> 41#include <kglobal.h>
42 42
43#include <libkdepim/kpimglobalprefs.h> 43#include <libkdepim/kpimglobalprefs.h>
44#include <libkcal/calendar.h> 44#include <libkcal/calendar.h>
45#include <libkcal/calendarlocal.h> 45#include <libkcal/calendarlocal.h>
46#include <libkcal/icalformat.h> 46#include <libkcal/icalformat.h>
47#include <libkcal/vcalformat.h> 47#include <libkcal/vcalformat.h>
48#include <libkcal/recurrence.h> 48#include <libkcal/recurrence.h>
49#include <libkcal/filestorage.h> 49#include <libkcal/filestorage.h>
50#include <libkdepim/categoryselectdialog.h> 50#include <libkdepim/categoryselectdialog.h>
51#include <libkcal/kincidenceformatter.h> 51#include <libkcal/kincidenceformatter.h>
52#ifndef DESKTOP_VERSION 52#ifndef DESKTOP_VERSION
53#include <qpe/qpeapplication.h> 53#include <qpe/qpeapplication.h>
54#else 54#else
55#include <qapplication.h> 55#include <qapplication.h>
56#endif 56#endif
57 57
58#ifndef KORG_NOPRINTER 58#ifndef KORG_NOPRINTER
59#include "calprinter.h" 59#include "calprinter.h"
60#endif 60#endif
61#include "koglobals.h" 61#include "koglobals.h"
62#include "koprefs.h" 62#include "koprefs.h"
63#include "kfiledialog.h" 63#include "kfiledialog.h"
64 64
65#include "kolistview.h" 65#include "kolistview.h"
66 66
67 67
68 68
69 69
70class KOListViewWhatsThis :public QWhatsThis 70class KOListViewWhatsThis :public QWhatsThis
71{ 71{
72public: 72public:
73 KOListViewWhatsThis( QWidget *wid, KOListView* view ) : QWhatsThis( wid ), _wid(wid),_view (view) { }; 73 KOListViewWhatsThis( QWidget *wid, KOListView* view ) : QWhatsThis( wid ), _wid(wid),_view (view) { };
74 74
75protected: 75protected:
76 virtual QString text( const QPoint& p) 76 virtual QString text( const QPoint& p)
77 { 77 {
78 return _view->getWhatsThisText(p) ; 78 return _view->getWhatsThisText(p) ;
79 } 79 }
80private: 80private:
81 QWidget* _wid; 81 QWidget* _wid;
82 KOListView * _view; 82 KOListView * _view;
83}; 83};
84 84
85 85
86ListItemVisitor::ListItemVisitor(KOListViewItem *item, QDate date ) 86ListItemVisitor::ListItemVisitor(KOListViewItem *item, QDate date )
87{ 87{
88 mItem = item; 88 mItem = item;
89 mDate = date; 89 mDate = date;
90} 90}
91 91
92ListItemVisitor::~ListItemVisitor() 92ListItemVisitor::~ListItemVisitor()
93{ 93{
94} 94}
95 95
96bool ListItemVisitor::visit(Event *e) 96bool ListItemVisitor::visit(Event *e)
97{ 97{
98 bool ok = false; 98 bool ok = false;
99 QString start, end; 99 QString start, end;
100 QDate ds, de; 100 QDate ds, de;
101 if ( e->doesRecur() ) { 101 if ( e->doesRecur() ) {
102 ds = e->getNextOccurence( QDateTime( mDate, QTime(0,0,0)), &ok ).date(); 102 ds = e->getNextOccurence( QDateTime( mDate, QTime(0,0,0)), &ok ).date();
103 if ( ok ) { 103 if ( ok ) {
104 int days = e->dtStart().date().daysTo(e->dtEnd().date() ); 104 int days = e->dtStart().date().daysTo(e->dtEnd().date() );
105 start = KGlobal::locale()->formatDate(ds,true); 105 start = KGlobal::locale()->formatDate(ds,true);
106 de = ds.addDays( days); 106 de = ds.addDays( days);
107 end = KGlobal::locale()->formatDate(de,true); 107 end = KGlobal::locale()->formatDate(de,true);
108 } 108 }
109 109
110 } 110 }
111 if ( ! ok ) { 111 if ( ! ok ) {
112 start =e->dtStartDateStr(); 112 start =e->dtStartDateStr();
113 end = e->dtEndDateStr(); 113 end = e->dtEndDateStr();
114 ds = e->dtStart().date(); 114 ds = e->dtStart().date();
115 de = e->dtEnd().date(); 115 de = e->dtEnd().date();
116 } 116 }
117 mItem->setText(0,e->summary()); 117 mItem->setText(0,e->summary());
118 mItem->setText(1,start); 118 mItem->setText(1,start);
119 if ( e->doesFloat() ) 119 if ( e->doesFloat() )
120 mItem->setText(2,"---"); 120 mItem->setText(2,"---");
121 else 121 else
122 mItem->setText(2,e->dtStartTimeStr()); 122 mItem->setText(2,e->dtStartTimeStr());
123 mItem->setText(3,end); 123 mItem->setText(3,end);
124 if ( e->doesFloat() ) 124 if ( e->doesFloat() )
125 mItem->setText(4,"---"); 125 mItem->setText(4,"---");
126 else 126 else
127 mItem->setText(4,e->dtEndTimeStr()); 127 mItem->setText(4,e->dtEndTimeStr());
128 if ( e->isAlarmEnabled() ) { 128 if ( e->isAlarmEnabled() ) {
129 mItem->setText(5,e->alarms().first()->offsetText() ); 129 mItem->setText(5,e->alarms().first()->offsetText() );
130 } else { 130 } else {
131 mItem->setText(5, i18n("No")); 131 mItem->setText(5, i18n("No"));
132 } 132 }
133 mItem->setText(6, e->recurrence()->recurrenceText()); 133 mItem->setText(6, e->recurrence()->recurrenceText());
134 if( ! e->doesRecur() ) 134 if( ! e->doesRecur() )
135 mItem->setSortKey( 6, "-" ); 135 mItem->setSortKey( 6, "-" );
136 mItem->setText(7,"---"); 136 mItem->setText(7,"---");
137 mItem->setText(8,"---"); 137 mItem->setText(8,"---");
138 mItem->setText(9, e->cancelled() ? i18n("Yes") : i18n("No")); 138 mItem->setText(9, e->cancelled() ? i18n("Yes") : i18n("No"));
139 mItem->setText(10,e->categoriesStr()); 139 mItem->setText(10,e->categoriesStr());
140 140
141 QString key; 141 QString key;
142 QTime t = e->doesFloat() ? QTime(0,0) : e->dtStart().time(); 142 QTime t = e->doesFloat() ? QTime(0,0) : e->dtStart().time();
143 key.sprintf("%04d%02d%02d%02d%02d",ds.year(),ds.month(),ds.day(),t.hour(),t.minute()); 143 key.sprintf("%04d%02d%02d%02d%02d",ds.year(),ds.month(),ds.day(),t.hour(),t.minute());
144 mItem->setSortKey(1,key); 144 mItem->setSortKey(1,key);
145 145
146 t = e->doesFloat() ? QTime(0,0) : e->dtEnd().time(); 146 t = e->doesFloat() ? QTime(0,0) : e->dtEnd().time();
147 key.sprintf("%04d%02d%02d%02d%02d",de.year(),de.month(),de.day(),t.hour(),t.minute()); 147 key.sprintf("%04d%02d%02d%02d%02d",de.year(),de.month(),de.day(),t.hour(),t.minute());
148 mItem->setSortKey(3,key); 148 mItem->setSortKey(3,key);
149 return true; 149 return true;
150} 150}
151 151
152bool ListItemVisitor::visit(Todo *t) 152bool ListItemVisitor::visit(Todo *t)
153{ 153{
154 mItem->setText(0,i18n("Todo: %1").arg(t->summary())); 154 mItem->setText(0,i18n("Todo: %1").arg(t->summary()));
155 if (t->hasStartDate()) { 155 if (t->hasStartDate()) {
156 mItem->setText(1,t->dtStartDateStr()); 156 mItem->setText(1,t->dtStartDateStr());
157 if (t->doesFloat()) { 157 if (t->doesFloat()) {
158 mItem->setText(2,"---"); 158 mItem->setText(2,"---");
159 } else { 159 } else {
160 mItem->setText(2,t->dtStartTimeStr()); 160 mItem->setText(2,t->dtStartTimeStr());
161 } 161 }
162 } else { 162 } else {
163 mItem->setText(1,"---"); 163 mItem->setText(1,"---");
164 mItem->setText(2,"---"); 164 mItem->setText(2,"---");
165 } 165 }
166 mItem->setText(3,"---"); 166 mItem->setText(3,"---");
167 mItem->setText(4,"---"); 167 mItem->setText(4,"---");
168 if ( t->isAlarmEnabled() ) { 168 if ( t->isAlarmEnabled() ) {
169 mItem->setText(5,t->alarms().first()->offsetText() ); 169 mItem->setText(5,t->alarms().first()->offsetText() );
170 } else { 170 } else {
171 mItem->setText(5, i18n("No")); 171 mItem->setText(5, i18n("No"));
172 } 172 }
173 mItem->setText(6, t->recurrence()->recurrenceText()); 173 mItem->setText(6, t->recurrence()->recurrenceText());
174 if( ! t->doesRecur() ) 174 if( ! t->doesRecur() )
175 mItem->setSortKey( 6, "-" ); 175 mItem->setSortKey( 6, "-" );
176 if (t->hasDueDate()) { 176 if (t->hasDueDate()) {
177 mItem->setText(7,t->dtDueDateStr()); 177 mItem->setText(7,t->dtDueDateStr());
178 if (t->doesFloat()) { 178 if (t->doesFloat()) {
179 mItem->setText(8,"---"); 179 mItem->setText(8,"---");
180 } else { 180 } else {
181 mItem->setText(8,t->dtDueTimeStr()); 181 mItem->setText(8,t->dtDueTimeStr());
182 } 182 }
183 } else { 183 } else {
184 mItem->setText(7,"---"); 184 mItem->setText(7,"---");
185 mItem->setText(8,"---"); 185 mItem->setText(8,"---");
186 } 186 }
187 mItem->setText(9, t->cancelled() ? i18n("Yes") : i18n("No")); 187 mItem->setText(9, t->cancelled() ? i18n("Yes") : i18n("No"));
188 mItem->setText(10,t->categoriesStr()); 188 mItem->setText(10,t->categoriesStr());
189 189
190 QString key; 190 QString key;
191 QDate d; 191 QDate d;
192 if (t->hasDueDate()) { 192 if (t->hasDueDate()) {
193 d = t->dtDue().date(); 193 d = t->dtDue().date();
194 QTime tm = t->doesFloat() ? QTime(0,0) : t->dtDue().time(); 194 QTime tm = t->doesFloat() ? QTime(0,0) : t->dtDue().time();
195 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute()); 195 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute());
196 mItem->setSortKey(7,key); 196 mItem->setSortKey(7,key);
197 } 197 }
198 if ( t->hasStartDate() ) { 198 if ( t->hasStartDate() ) {
199 d = t->dtStart().date(); 199 d = t->dtStart().date();
200 QTime tm = t->doesFloat() ? QTime(0,0) : t->dtStart().time(); 200 QTime tm = t->doesFloat() ? QTime(0,0) : t->dtStart().time();
201 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute()); 201 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute());
202 mItem->setSortKey(1,key); 202 mItem->setSortKey(1,key);
203 } 203 }
204 return true; 204 return true;
205} 205}
206 206
207bool ListItemVisitor::visit(Journal * j) 207bool ListItemVisitor::visit(Journal * j)
208{ 208{
209 QString des = j->description().left(30); 209 QString des = j->description().left(30);
210 des = des.simplifyWhiteSpace (); 210 des = des.simplifyWhiteSpace ();
211 des.replace (QRegExp ("\\n"),"" ); 211 des.replace (QRegExp ("\\n"),"" );
212 des.replace (QRegExp ("\\r"),"" ); 212 des.replace (QRegExp ("\\r"),"" );
213 mItem->setText(0,i18n("Journal: ")+des.left(25)); 213 mItem->setText(0,i18n("Journal: ")+des.left(25));
214 mItem->setText(1,j->dtStartDateStr()); 214 mItem->setText(1,j->dtStartDateStr());
215 mItem->setText(2,"---"); 215 mItem->setText(2,"---");
216 mItem->setText(3,"---"); 216 mItem->setText(3,"---");
217 mItem->setText(4,"---"); 217 mItem->setText(4,"---");
218 mItem->setText(5,"---"); 218 mItem->setText(5,"---");
219 mItem->setText(6,"---"); 219 mItem->setText(6,"---");
220 mItem->setText(7,j->dtStartDateStr()); 220 mItem->setText(7,j->dtStartDateStr());
221 mItem->setText(8,"---"); 221 mItem->setText(8,"---");
222 mItem->setText(9,"---"); 222 mItem->setText(9,"---");
223 mItem->setText(10,i18n("Last Modified: ")+ KGlobal::locale()->formatDateTime( j->lastModified() , true) ); 223 mItem->setText(10,i18n("Last Modified: ")+ KGlobal::locale()->formatDateTime( j->lastModified() , true) );
224 224
225 QString key; 225 QString key;
226 QDate d = j->dtStart().date(); 226 QDate d = j->dtStart().date();
227 key.sprintf("%04d%02d%02d",d.year(),d.month(),d.day()); 227 key.sprintf("%04d%02d%02d",d.year(),d.month(),d.day());
228 mItem->setSortKey(1,key); 228 mItem->setSortKey(1,key);
229 mItem->setSortKey(7,key); 229 mItem->setSortKey(7,key);
230 230
231 return true; 231 return true;
232} 232}
233 233
234KOListView::KOListView(Calendar *calendar, QWidget *parent, 234KOListView::KOListView(Calendar *calendar, QWidget *parent,
235 const char *name) 235 const char *name)
236 : KOEventView(calendar, parent, name) 236 : KOEventView(calendar, parent, name)
237{ 237{
238 mActiveItem = 0; 238 mActiveItem = 0;
239 mListView = new KOListViewListView(this); 239 mListView = new KOListViewListView(this);
240 mListView->addColumn(i18n("Summary")); 240 mListView->addColumn(i18n("Summary"));
241 mListView->addColumn(i18n("Start Date")); 241 mListView->addColumn(i18n("Start Date"));
242 mListView->addColumn(i18n("Start Time")); 242 mListView->addColumn(i18n("Start Time"));
243 mListView->addColumn(i18n("End Date")); 243 mListView->addColumn(i18n("End Date"));
244 mListView->addColumn(i18n("End Time")); 244 mListView->addColumn(i18n("End Time"));
245 mListView->addColumn(i18n("Alarm")); // alarm set? 245 mListView->addColumn(i18n("Alarm")); // alarm set?
246 mListView->addColumn(i18n("Recurs")); // recurs? 246 mListView->addColumn(i18n("Recurs")); // recurs?
247 mListView->addColumn(i18n("Due Date")); 247 mListView->addColumn(i18n("Due Date"));
248 mListView->addColumn(i18n("Due Time")); 248 mListView->addColumn(i18n("Due Time"));
249 mListView->addColumn(i18n("Cancelled")); 249 mListView->addColumn(i18n("Cancelled"));
250 mListView->addColumn(i18n("Categories")); 250 mListView->addColumn(i18n("Categories"));
251 251
252 mListView->setColumnAlignment(0,AlignLeft); 252 mListView->setColumnAlignment(0,AlignLeft);
253 mListView->setColumnAlignment(1,AlignLeft); 253 mListView->setColumnAlignment(1,AlignLeft);
254 mListView->setColumnAlignment(2,AlignHCenter); 254 mListView->setColumnAlignment(2,AlignHCenter);
255 mListView->setColumnAlignment(3,AlignLeft); 255 mListView->setColumnAlignment(3,AlignLeft);
256 mListView->setColumnAlignment(4,AlignHCenter); 256 mListView->setColumnAlignment(4,AlignHCenter);
257 mListView->setColumnAlignment(5,AlignLeft); 257 mListView->setColumnAlignment(5,AlignLeft);
258 mListView->setColumnAlignment(6,AlignLeft); 258 mListView->setColumnAlignment(6,AlignLeft);
259 mListView->setColumnAlignment(7,AlignLeft); 259 mListView->setColumnAlignment(7,AlignLeft);
260 mListView->setColumnAlignment(8,AlignLeft); 260 mListView->setColumnAlignment(8,AlignLeft);
261 mListView->setColumnAlignment(9,AlignLeft); 261 mListView->setColumnAlignment(9,AlignLeft);
262 mListView->setColumnAlignment(10,AlignLeft); 262 mListView->setColumnAlignment(10,AlignLeft);
263 mListView->setColumnWidthMode(10, QListView::Manual); 263 mListView->setColumnWidthMode(10, QListView::Manual);
264 new KOListViewWhatsThis(mListView->viewport(),this); 264 new KOListViewWhatsThis(mListView->viewport(),this);
265 265
266 int iii = 0; 266 int iii = 0;
267 for ( iii = 0; iii< 10 ; ++iii ) 267 for ( iii = 0; iii< 10 ; ++iii )
268 mListView->setColumnWidthMode( iii, QListView::Manual ); 268 mListView->setColumnWidthMode( iii, QListView::Manual );
269 269
270 QBoxLayout *layoutTop = new QVBoxLayout(this); 270 QBoxLayout *layoutTop = new QVBoxLayout(this);
271 layoutTop->addWidget(mListView); 271 layoutTop->addWidget(mListView);
272 mListView->setFont ( KOPrefs::instance()->mListViewFont ); 272 mListView->setFont ( KOPrefs::instance()->mListViewFont );
273 mPopupMenu = eventPopup(); 273 mPopupMenu = eventPopup();
274 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 274 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
275 i18n("Select all"),this, 275 i18n("Select all"),this,
276 SLOT(allSelection()),true); 276 SLOT(allSelection()),true);
277 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 277 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
278 i18n("Deselect all"),this, 278 i18n("Deselect all"),this,
279 SLOT(clearSelection()),true); 279 SLOT(clearSelection()),true);
280 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 280 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
281 i18n("Delete all selected"),this, 281 i18n("Delete all selected"),this,
282 SLOT(deleteAll()),true); 282 SLOT(deleteAll()),true);
283 mPopupMenu->insertSeparator(); 283 mPopupMenu->insertSeparator();
284 QPopupMenu * exportPO = new QPopupMenu ( this ); 284 QPopupMenu * exportPO = new QPopupMenu ( this );
285 mPopupMenu->insertItem( i18n("Export selected"), exportPO ); 285 mPopupMenu->insertItem( i18n("Export selected"), exportPO );
286 exportPO->insertItem( i18n("As iCal (ics) file..."),this, 286 exportPO->insertItem( i18n("As iCal (ics) file..."),this,
287 SLOT(saveToFile())); 287 SLOT(saveToFile()));
288 exportPO->insertItem( i18n("As vCal (vcs) file..."),this, 288 exportPO->insertItem( i18n("As vCal (vcs) file..."),this,
289 SLOT(saveToFileVCS())); 289 SLOT(saveToFileVCS()));
290 exportPO->insertItem( i18n("Journal/Details..."),this, 290 exportPO->insertItem( i18n("Journal/Details..."),this,
291 SLOT(saveDescriptionToFile())); 291 SLOT(saveDescriptionToFile()));
292 // mPopupMenu->insertSeparator(); 292 // mPopupMenu->insertSeparator();
293 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 293 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
294 i18n("Add Categ. to selected..."),this, 294 i18n("Add Categ. to selected..."),this,
295 SLOT(addCat()),true); 295 SLOT(addCat()),true);
296 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 296 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
297 i18n("Set Categ. for selected..."),this, 297 i18n("Set Categ. for selected..."),this,
298 SLOT(setCat()),true); 298 SLOT(setCat()),true);
299 //mPopupMenu->insertSeparator(); 299 //mPopupMenu->insertSeparator();
300 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 300 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
301 i18n("Set alarm for selected..."),this, 301 i18n("Set alarm for selected..."),this,
302 SLOT(setAlarm()),true); 302 SLOT(setAlarm()),true);
303 303
304 304
305#ifndef DESKTOP_VERSION 305#ifndef DESKTOP_VERSION
306 mPopupMenu->insertSeparator(); 306 mPopupMenu->insertSeparator();
307 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 307 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
308 i18n("Beam selected via IR"),this, 308 i18n("Beam selected via IR"),this,
309 SLOT(beamSelected()),true); 309 SLOT(beamSelected()),true);
310#endif 310#endif
311 /* 311 /*
312 mPopupMenu = new QPopupMenu; 312 mPopupMenu = new QPopupMenu;
313 mPopupMenu->insertItem(i18n("Edit Event"), this, 313 mPopupMenu->insertItem(i18n("Edit Event"), this,
314 SLOT (editEvent())); 314 SLOT (editEvent()));
315 mPopupMenu->insertItem(SmallIcon("delete"), i18n("Delete Event"), this, 315 mPopupMenu->insertItem(SmallIcon("delete"), i18n("Delete Event"), this,
316 SLOT (deleteEvent())); 316 SLOT (deleteEvent()));
317 mPopupMenu->insertSeparator(); 317 mPopupMenu->insertSeparator();
318 mPopupMenu->insertItem(i18n("Show Dates"), this, 318 mPopupMenu->insertItem(i18n("Show Dates"), this,
319 SLOT(showDates())); 319 SLOT(showDates()));
320 mPopupMenu->insertItem(i18n("Hide Dates"), this, 320 mPopupMenu->insertItem(i18n("Hide Dates"), this,
321 SLOT(hideDates())); 321 SLOT(hideDates()));
322 */ 322 */
323 QObject::connect(mListView,SIGNAL( newEvent()), 323 QObject::connect(mListView,SIGNAL( newEvent()),
324 this,SIGNAL(signalNewEvent())); 324 this,SIGNAL(signalNewEvent()));
325 QObject::connect(mListView,SIGNAL(doubleClicked(QListViewItem *)), 325 QObject::connect(mListView,SIGNAL(doubleClicked(QListViewItem *)),
326 this,SLOT(defaultItemAction(QListViewItem *))); 326 this,SLOT(defaultItemAction(QListViewItem *)));
327 QObject::connect(mListView,SIGNAL(rightButtonPressed( QListViewItem *, 327 QObject::connect(mListView,SIGNAL(rightButtonPressed( QListViewItem *,
328 const QPoint &, int )), 328 const QPoint &, int )),
329 this,SLOT(popupMenu(QListViewItem *,const QPoint &,int))); 329 this,SLOT(popupMenu(QListViewItem *,const QPoint &,int)));
330 QObject::connect(mListView,SIGNAL(currentChanged(QListViewItem *)), 330 QObject::connect(mListView,SIGNAL(currentChanged(QListViewItem *)),
331 SLOT(processSelectionChange(QListViewItem *))); 331 SLOT(processSelectionChange(QListViewItem *)));
332 QObject::connect(mListView,SIGNAL(showIncidence(Incidence *)), 332 QObject::connect(mListView,SIGNAL(showIncidence(Incidence *)),
333 SIGNAL(showIncidenceSignal(Incidence *)) ); 333 SIGNAL(showIncidenceSignal(Incidence *)) );
334 334
335 readSettings(KOGlobals::config(),"KOListView Layout"); 335 readSettings(KOGlobals::config(),"KOListView Layout");
336} 336}
337 337
338KOListView::~KOListView() 338KOListView::~KOListView()
339{ 339{
340 delete mPopupMenu; 340 delete mPopupMenu;
341} 341}
342 342
343QString KOListView::getWhatsThisText(QPoint p) 343QString KOListView::getWhatsThisText(QPoint p)
344{ 344{
345 KOListViewItem* item = ( KOListViewItem* ) mListView->itemAt( p ); 345 KOListViewItem* item = ( KOListViewItem* ) mListView->itemAt( p );
346 if ( item ) 346 if ( item )
347 return KIncidenceFormatter::instance()->getFormattedText( item->data(), 347 return KIncidenceFormatter::instance()->getFormattedText( item->data(),
348 KOPrefs::instance()->mWTshowDetails, 348 KOPrefs::instance()->mWTshowDetails,
349 KOPrefs::instance()->mWTshowCreated, 349 KOPrefs::instance()->mWTshowCreated,
350 KOPrefs::instance()->mWTshowChanged); 350 KOPrefs::instance()->mWTshowChanged);
351 return i18n("That is the list view" ); 351 return i18n("That is the list view" );
352 352
353} 353}
354 354
355void KOListView::updateList() 355void KOListView::updateList()
356{ 356{
357 // qDebug(" KOListView::updateList() "); 357 // qDebug(" KOListView::updateList() ");
358 358
359} 359}
360 360
361void KOListView::addCat( ) 361void KOListView::addCat( )
362{ 362{
363 setCategories( false ); 363 setCategories( false );
364} 364}
365void KOListView::setCat() 365void KOListView::setCat()
366{ 366{
367 setCategories( true ); 367 setCategories( true );
368} 368}
369void KOListView::setAlarm() 369void KOListView::setAlarm()
370{ 370{
371 KOAlarmPrefs kap( this); 371 KOAlarmPrefs kap( this);
372 if ( !kap.exec() ) 372 if ( !kap.exec() )
373 return; 373 return;
374
375
376 QStringList itemList; 374 QStringList itemList;
377 QPtrList<KOListViewItem> sel ; 375 QPtrList<KOListViewItem> sel ;
378 QListViewItem *qitem = mListView->firstChild (); 376 QListViewItem *qitem = mListView->firstChild ();
379 while ( qitem ) { 377 while ( qitem ) {
380 if ( qitem->isSelected() ) { 378 if ( qitem->isSelected() ) {
381 Incidence* inc = ((KOListViewItem *) qitem)->data(); 379 Incidence* inc = ((KOListViewItem *) qitem)->data();
382 if ( inc->type() != "Journal" ) { 380 if ( inc->type() != "Journal" ) {
383 if ( inc->type() == "Todo" ) { 381 if ( inc->type() == "Todo" ) {
384 if ( ((Todo*)inc)->hasDueDate() ) 382 if ( ((Todo*)inc)->hasDueDate() )
385 sel.append(((KOListViewItem *)qitem)); 383 sel.append(((KOListViewItem *)qitem));
386 } else 384 } else
387 sel.append(((KOListViewItem *)qitem)); 385 sel.append(((KOListViewItem *)qitem));
388 } 386 }
389 } 387 }
390 qitem = qitem->nextSibling(); 388 qitem = qitem->nextSibling();
391 } 389 }
392 int count = 0; 390 int count = 0;
393 KOListViewItem * item, *temp; 391 KOListViewItem * item, *temp;
394 item = sel.first(); 392 item = sel.first();
395 Incidence* inc; 393 Incidence* inc;
396 while ( item ) { 394 while ( item ) {
397 inc = item->data(); 395 inc = item->data();
398 ++count; 396 ++count;
399 if (kap.mAlarmButton->isChecked()) { 397 if (kap.mAlarmButton->isChecked()) {
400 if (inc->alarms().count() == 0) 398 if (inc->alarms().count() == 0)
401 inc->newAlarm(); 399 inc->newAlarm();
402 QPtrList<Alarm> alarms = inc->alarms(); 400 QPtrList<Alarm> alarms = inc->alarms();
403 Alarm *alarm; 401 Alarm *alarm;
404 for (alarm = alarms.first(); alarm; alarm = alarms.next() ) { 402 for (alarm = alarms.first(); alarm; alarm = alarms.next() ) {
405 alarm->setEnabled(true); 403 alarm->setEnabled(true);
406 int j = kap.mAlarmTimeEdit->value()* -60; 404 int j = kap.mAlarmTimeEdit->value()* -60;
407 if (kap.mAlarmIncrCombo->currentItem() == 1) 405 if (kap.mAlarmIncrCombo->currentItem() == 1)
408 j = j * 60; 406 j = j * 60;
409 else if (kap.mAlarmIncrCombo->currentItem() == 2) 407 else if (kap.mAlarmIncrCombo->currentItem() == 2)
410 j = j * (60 * 24); 408 j = j * (60 * 24);
411 alarm->setStartOffset( j ); 409 alarm->setStartOffset( j );
412 410
413 if (!kap.mAlarmProgram.isEmpty() && kap.mAlarmProgramButton->isOn()) { 411 if (!kap.mAlarmProgram.isEmpty() && kap.mAlarmProgramButton->isOn()) {
414 alarm->setProcedureAlarm(kap.mAlarmProgram); 412 alarm->setProcedureAlarm(kap.mAlarmProgram);
415 } 413 }
416 else if (!kap.mAlarmSound.isEmpty() && kap.mAlarmSoundButton->isOn()) 414 else if (!kap.mAlarmSound.isEmpty() && kap.mAlarmSoundButton->isOn())
417 alarm->setAudioAlarm(kap.mAlarmSound); 415 alarm->setAudioAlarm(kap.mAlarmSound);
418 else 416 else
419 alarm->setType(Alarm::Invalid); 417 alarm->setType(Alarm::Invalid);
420 //alarm->setAudioAlarm("default"); 418 //alarm->setAudioAlarm("default");
421 // TODO: Deal with multiple alarms 419 // TODO: Deal with multiple alarms
422 break; // For now, stop after the first alarm 420 break; // For now, stop after the first alarm
423 } 421 }
424 } else { 422 } else {
425 Alarm* alarm = inc->alarms().first(); 423 Alarm* alarm = inc->alarms().first();
426 if ( alarm ) { 424 if ( alarm ) {
427 alarm->setEnabled(false); 425 alarm->setEnabled(false);
428 alarm->setType(Alarm::Invalid); 426 alarm->setType(Alarm::Invalid);
429 } 427 }
430 } 428 }
431 temp = item; 429 ListItemVisitor v(item, mStartDate );
432 item = sel.next(); 430 inc->accept(v);
433 mUidDict.remove( inc->uid() ); 431 item = sel.next();
434 delete temp;;
435 addIncidence( inc );
436 } 432 }
437 topLevelWidget()->setCaption( i18n("Canged alarm for %1 items").arg( count ) ); 433 topLevelWidget()->setCaption( i18n("Canged alarm for %1 items").arg( count ) );
438 qDebug("KO: Set alarm for %d items", count); 434 qDebug("KO: Set alarm for %d items", count);
439 calendar()->reInitAlarmSettings(); 435 calendar()->reInitAlarmSettings();
440 QTimer::singleShot( 1, this, SLOT ( resetFocus() ) ); 436 QTimer::singleShot( 1, this, SLOT ( resetFocus() ) );
441} 437}
442void KOListView::setCategories( bool removeOld ) 438void KOListView::setCategories( bool removeOld )
443{ 439{
444 440
445 KPIM::CategorySelectDialog* csd = new KPIM::CategorySelectDialog( KOPrefs::instance(), 0 ); 441 KPIM::CategorySelectDialog* csd = new KPIM::CategorySelectDialog( KOPrefs::instance(), 0 );
442 csd->setColorEnabled();
446 if (! csd->exec()) { 443 if (! csd->exec()) {
447 delete csd; 444 delete csd;
448 return; 445 return;
449 } 446 }
450 QStringList catList = csd->selectedCategories(); 447 QStringList catList = csd->selectedCategories();
451 delete csd; 448 delete csd;
452 // if ( catList.count() == 0 ) 449 // if ( catList.count() == 0 )
453 // return; 450 // return;
454 catList.sort(); 451 //catList.sort();
455 QString categoriesStr = catList.join(","); 452 QString categoriesStr = catList.join(",");
456 int i; 453 int i;
457 QStringList itemList; 454 QStringList itemList;
458 QPtrList<KOListViewItem> sel ; 455 QPtrList<KOListViewItem> sel ;
459 QListViewItem *qitem = mListView->firstChild (); 456 QListViewItem *qitem = mListView->firstChild ();
460 while ( qitem ) { 457 while ( qitem ) {
461 if ( qitem->isSelected() ) { 458 if ( qitem->isSelected() ) {
462 sel.append(((KOListViewItem *)qitem)); 459 sel.append(((KOListViewItem *)qitem));
463 } 460 }
464 qitem = qitem->nextSibling(); 461 qitem = qitem->nextSibling();
465 } 462 }
466 KOListViewItem * item, *temp; 463 KOListViewItem * item, *temp;
467 item = sel.first(); 464 item = sel.first();
468 Incidence* inc; 465 if( item ) {
469 while ( item ) { 466 Incidence* inc = item->data() ;
470 inc = item->data(); 467 bool setSub = false;
471 if ( removeOld ) { 468 if( inc->type() == "Todo" && sel.count() == 1 && inc->relations().count() > 0 ) {
472 inc->setCategories( categoriesStr ); 469 int result = KMessageBox::warningYesNoCancel(this,
473 } else { 470 i18n("The todo\n%1\nhas subtodos!\nDo you want to set\nthe categories for\nall subtodos as well?").arg( inc->summary().left ( 25 ) ),
474 itemList = QStringList::split (",", inc->categoriesStr() ); 471 i18n("Todo has subtodos"),
475 for( i = 0; i< catList.count(); ++i ) { 472 i18n("Yes"),
476 if ( !itemList.contains (catList[i])) 473 i18n("No"));
477 itemList.append( catList[i] ); 474 if (result == KMessageBox::Cancel) item = 0;
478 } 475 if (result == KMessageBox::Yes) setSub = true;
479 itemList.sort(); 476 }
480 inc->setCategories( itemList.join(",") ); 477 while ( item ) {
478 inc = item->data();
479 if ( removeOld ) {
480 inc->setCategories( catList, setSub );
481 } else {
482 inc->addCategories( catList, setSub );
483 }
484 ListItemVisitor v(item, mStartDate );
485 inc->accept(v);
486 item = sel.next();
481 } 487 }
482 temp = item;
483 item = sel.next();
484 mUidDict.remove( inc->uid() );
485 delete temp;;
486 addIncidence( inc );
487 } 488 }
488 QTimer::singleShot( 1, this, SLOT ( resetFocus() ) ); 489 QTimer::singleShot( 1, this, SLOT ( resetFocus() ) );
489} 490}
490 491
491void KOListView::beamSelected() 492void KOListView::beamSelected()
492{ 493{
493 int icount = 0; 494 int icount = 0;
494 QPtrList<Incidence> delSel ; 495 QPtrList<Incidence> delSel ;
495 QListViewItem *item = mListView->firstChild (); 496 QListViewItem *item = mListView->firstChild ();
496 while ( item ) { 497 while ( item ) {
497 if ( item->isSelected() ) { 498 if ( item->isSelected() ) {
498 delSel.append(((KOListViewItem *)item)->data()); 499 delSel.append(((KOListViewItem *)item)->data());
499 ++icount; 500 ++icount;
500 } 501 }
501 502
502 item = item->nextSibling(); 503 item = item->nextSibling();
503 } 504 }
504 if ( icount ) { 505 if ( icount ) {
505 emit beamIncidenceList( delSel ); 506 emit beamIncidenceList( delSel );
506 return; 507 return;
507 QString fn ; 508 QString fn ;
508 fn = QDir::homeDirPath()+"/kopitempbeamfile.vcs"; 509 fn = QDir::homeDirPath()+"/kopitempbeamfile.vcs";
509 QString mes; 510 QString mes;
510 bool createbup = true; 511 bool createbup = true;
511 if ( createbup ) { 512 if ( createbup ) {
512 QString description = "\n"; 513 QString description = "\n";
513 CalendarLocal* cal = new CalendarLocal(); 514 CalendarLocal* cal = new CalendarLocal();
514 cal->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId); 515 cal->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId);
515 Incidence *incidence = delSel.first(); 516 Incidence *incidence = delSel.first();
516 while ( incidence ) { 517 while ( incidence ) {
517 Incidence *in = incidence->clone(); 518 Incidence *in = incidence->clone();
518 description += in->summary() + "\n"; 519 description += in->summary() + "\n";
519 cal->addIncidence( in ); 520 cal->addIncidence( in );
520 incidence = delSel.next(); 521 incidence = delSel.next();
521 } 522 }
522 FileStorage storage( cal, fn, new VCalFormat ); 523 FileStorage storage( cal, fn, new VCalFormat );
523 storage.save(); 524 storage.save();
524 delete cal; 525 delete cal;
525 mes = i18n("KO/Pi: Ready for beaming"); 526 mes = i18n("KO/Pi: Ready for beaming");
526 topLevelWidget()->setCaption(mes); 527 topLevelWidget()->setCaption(mes);
527 528
528#ifndef DESKTOP_VERSION 529#ifndef DESKTOP_VERSION
529 Ir *ir = new Ir( this ); 530 Ir *ir = new Ir( this );
530 connect( ir, SIGNAL( done( Ir * ) ), this, SLOT( beamDone( Ir * ) ) ); 531 connect( ir, SIGNAL( done( Ir * ) ), this, SLOT( beamDone( Ir * ) ) );
531 ir->send( fn, description, "text/x-vCalendar" ); 532 ir->send( fn, description, "text/x-vCalendar" );
532#endif 533#endif
533 } 534 }
534 } 535 }
535} 536}
536void KOListView::beamDone( Ir *ir ) 537void KOListView::beamDone( Ir *ir )
537{ 538{
538#ifndef DESKTOP_VERSION 539#ifndef DESKTOP_VERSION
539 delete ir; 540 delete ir;
540#endif 541#endif
541 topLevelWidget()->setCaption(i18n("KO/Pi:Beaming done")); 542 topLevelWidget()->setCaption(i18n("KO/Pi:Beaming done"));
542} 543}
543 544
544void KOListView::saveDescriptionToFile() 545void KOListView::saveDescriptionToFile()
545{ 546{
546 547
547 int result = QMessageBox::warning( this, i18n("KO/Pi: Information!"), 548 int result = QMessageBox::warning( this, i18n("KO/Pi: Information!"),
548 i18n("This saves the text/details of selected\nJournals and Events/Todos\nto a text file."), 549 i18n("This saves the text/details of selected\nJournals and Events/Todos\nto a text file."),
549 i18n("Continue"), i18n("Cancel"), 0, 550 i18n("Continue"), i18n("Cancel"), 0,
550 0, 1 ); 551 0, 1 );
551 if ( result != 0 ) { 552 if ( result != 0 ) {
552 return; 553 return;
553 } 554 }
554 int icount = 0; 555 int icount = 0;
555 QPtrList<Incidence> delSel ; 556 QPtrList<Incidence> delSel ;
556 QListViewItem *item = mListView->firstChild (); 557 QListViewItem *item = mListView->firstChild ();
557 while ( item ) { 558 while ( item ) {
558 if ( item->isSelected() ) { 559 if ( item->isSelected() ) {
559 delSel.append(((KOListViewItem *)item)->data()); 560 delSel.append(((KOListViewItem *)item)->data());
560 ++icount; 561 ++icount;
561 } 562 }
562 563
563 item = item->nextSibling(); 564 item = item->nextSibling();
564 } 565 }
565 if ( icount ) { 566 if ( icount ) {
566 QString fn = KOPrefs::instance()->mLastSaveFile; 567 QString fn = KOPrefs::instance()->mLastSaveFile;
567 fn = KFileDialog::getSaveFileName( fn, i18n("Save filename"), this ); 568 fn = KFileDialog::getSaveFileName( fn, i18n("Save filename"), this );
568 569
569 if ( fn == "" ) 570 if ( fn == "" )
570 return; 571 return;
571 QFileInfo info; 572 QFileInfo info;
572 info.setFile( fn ); 573 info.setFile( fn );
573 QString mes; 574 QString mes;
574 bool createbup = true; 575 bool createbup = true;
575 if ( info. exists() ) { 576 if ( info. exists() ) {
576 mes = i18n("File already exists!\nOld file from:\n%1\nOverwrite?\n").arg (KGlobal::locale()->formatDateTime(info.lastModified (), true, false ) ); 577 mes = i18n("File already exists!\nOld file from:\n%1\nOverwrite?\n").arg (KGlobal::locale()->formatDateTime(info.lastModified (), true, false ) );
577 int result = QMessageBox::warning( this, i18n("KO/Pi: Warning!"),mes, 578 int result = QMessageBox::warning( this, i18n("KO/Pi: Warning!"),mes,
578 i18n("Overwrite!"), i18n("Cancel"), 0, 579 i18n("Overwrite!"), i18n("Cancel"), 0,
579 0, 1 ); 580 0, 1 );
580 if ( result != 0 ) { 581 if ( result != 0 ) {
581 createbup = false; 582 createbup = false;
582 } 583 }
583 } 584 }
584 if ( createbup ) { 585 if ( createbup ) {
585 QString text = i18n("KO/Pi Description/Journal save file.\nSave date: ") + 586 QString text = i18n("KO/Pi Description/Journal save file.\nSave date: ") +
586 KGlobal::locale()->formatDateTime(QDateTime::currentDateTime(), false); 587 KGlobal::locale()->formatDateTime(QDateTime::currentDateTime(), false);
587 Incidence *incidence = delSel.first(); 588 Incidence *incidence = delSel.first();
588 icount = 0; 589 icount = 0;
589 while ( incidence ) { 590 while ( incidence ) {
590 if ( incidence->type() == "Journal" ) { 591 if ( incidence->type() == "Journal" ) {
591 text += "\n************************************\n"; 592 text += "\n************************************\n";
592 text += i18n("Journal from: ") +incidence->dtStartDateStr( false ); 593 text += i18n("Journal from: ") +incidence->dtStartDateStr( false );
593 text +="\n" + i18n("Last modified: ") +KGlobal::locale()->formatDateTime(incidence->lastModified(), false); 594 text +="\n" + i18n("Last modified: ") +KGlobal::locale()->formatDateTime(incidence->lastModified(), false);
594 text +="\n" + i18n("Description: ") + "\n"+ incidence->description(); 595 text +="\n" + i18n("Description: ") + "\n"+ incidence->description();
595 ++icount; 596 ++icount;
596 597
597 } else { 598 } else {
598 if ( !incidence->description().isEmpty() ) { 599 if ( !incidence->description().isEmpty() ) {
599 text += "\n************************************\n"; 600 text += "\n************************************\n";
600 if ( incidence->type() == "Todo" ) 601 if ( incidence->type() == "Todo" )
601 text += i18n("To-Do: "); 602 text += i18n("To-Do: ");
602 text += incidence->summary(); 603 text += incidence->summary();
603 if ( incidence->hasStartDate() ) 604 if ( incidence->hasStartDate() )
604 text +="\n"+ i18n("Start Date: ") + incidence->dtStartStr( false ); 605 text +="\n"+ i18n("Start Date: ") + incidence->dtStartStr( false );
605 text +="\n"+ i18n("Last modified: ") +KGlobal::locale()->formatDateTime(incidence->lastModified(), false); 606 text +="\n"+ i18n("Last modified: ") +KGlobal::locale()->formatDateTime(incidence->lastModified(), false);
606 if ( !incidence->location().isEmpty() ) 607 if ( !incidence->location().isEmpty() )
607 text += "\n" +i18n("Location: ") + incidence->location(); 608 text += "\n" +i18n("Location: ") + incidence->location();
608 text += "\n" + i18n("Description: ") + "\n" + incidence->description(); 609 text += "\n" + i18n("Description: ") + "\n" + incidence->description();
609 ++icount; 610 ++icount;
610 611
611 } 612 }
612 } 613 }
613 incidence = delSel.next(); 614 incidence = delSel.next();
614 } 615 }
615 QFile file( fn ); 616 QFile file( fn );
616 if (!file.open( IO_WriteOnly ) ) { 617 if (!file.open( IO_WriteOnly ) ) {
617 topLevelWidget()->setCaption(i18n("File open error - nothing saved!") ); 618 topLevelWidget()->setCaption(i18n("File open error - nothing saved!") );
618 return; 619 return;
619 } 620 }
620 QTextStream ts( &file ); 621 QTextStream ts( &file );
621 ts << text; 622 ts << text;
622 file.close(); 623 file.close();
623 //qDebug("%s ", text.latin1()); 624 //qDebug("%s ", text.latin1());
624 mes = i18n("KO/Pi:Saved %1 descriptions/journals").arg(icount ); 625 mes = i18n("KO/Pi:Saved %1 descriptions/journals").arg(icount );
625 KOPrefs::instance()->mLastSaveFile = fn; 626 KOPrefs::instance()->mLastSaveFile = fn;
626 topLevelWidget()->setCaption(mes); 627 topLevelWidget()->setCaption(mes);
627 } 628 }
628 } 629 }
629} 630}
630void KOListView::saveToFileVCS() 631void KOListView::saveToFileVCS()
631{ 632{
632 writeToFile( false ); 633 writeToFile( false );
633} 634}
634void KOListView::saveToFile() 635void KOListView::saveToFile()
635{ 636{
636 writeToFile( true ); 637 writeToFile( true );
637} 638}
638void KOListView::writeToFile( bool iCal ) 639void KOListView::writeToFile( bool iCal )
639{ 640{
640 641
641 int icount = 0; 642 int icount = 0;
642 QPtrList<Incidence> delSel ; 643 QPtrList<Incidence> delSel ;
643 QListViewItem *item = mListView->firstChild (); 644 QListViewItem *item = mListView->firstChild ();
644 bool journal = iCal; // warn only for vCal 645 bool journal = iCal; // warn only for vCal
645 while ( item ) { 646 while ( item ) {
646 if ( item->isSelected() ) { 647 if ( item->isSelected() ) {
647 if ( !journal ) 648 if ( !journal )
648 if ( ((KOListViewItem *)item)->data()->type() == "Journal") 649 if ( ((KOListViewItem *)item)->data()->type() == "Journal")
649 journal = true; 650 journal = true;
650 delSel.append(((KOListViewItem *)item)->data()); 651 delSel.append(((KOListViewItem *)item)->data());
651 ++icount; 652 ++icount;
652 } 653 }
653 654
654 item = item->nextSibling(); 655 item = item->nextSibling();
655 } 656 }
656 if ( !iCal && journal ) { 657 if ( !iCal && journal ) {
657 int result = KMessageBox::warningContinueCancel(this, 658 int result = KMessageBox::warningContinueCancel(this,
658 i18n("The journal entries can not be\nexported to a vCalendar file."), 659 i18n("The journal entries can not be\nexported to a vCalendar file."),
659 i18n("Data Loss Warning"),i18n("Proceed"),i18n("Cancel"), 660 i18n("Data Loss Warning"),i18n("Proceed"),i18n("Cancel"),
660 true); 661 true);
661 if (result != KMessageBox::Continue) return; 662 if (result != KMessageBox::Continue) return;
662 } 663 }
663 if ( icount ) { 664 if ( icount ) {
664 QString fn = KOPrefs::instance()->mLastSaveFile; 665 QString fn = KOPrefs::instance()->mLastSaveFile;
665 QString extension; 666 QString extension;
666 if ( iCal ) { 667 if ( iCal ) {
667 if ( fn.right( 4 ).lower() == ".vcs" ) { 668 if ( fn.right( 4 ).lower() == ".vcs" ) {
668 fn = fn.left( fn.length() -3) + "ics"; 669 fn = fn.left( fn.length() -3) + "ics";
669 } 670 }
670 } else { 671 } else {
671 if ( fn.right( 4 ).lower() == ".ics" ) { 672 if ( fn.right( 4 ).lower() == ".ics" ) {
672 fn = fn.left( fn.length() -3) + "vcs"; 673 fn = fn.left( fn.length() -3) + "vcs";
673 } 674 }
674 } 675 }
675 fn = KFileDialog::getSaveFileName( fn, i18n("Save filename"), this ); 676 fn = KFileDialog::getSaveFileName( fn, i18n("Save filename"), this );
676 677
677 if ( fn == "" ) 678 if ( fn == "" )
678 return; 679 return;
679 QFileInfo info; 680 QFileInfo info;
680 info.setFile( fn ); 681 info.setFile( fn );
681 QString mes; 682 QString mes;
682 bool createbup = true; 683 bool createbup = true;
683 if ( info. exists() ) { 684 if ( info. exists() ) {
684 mes = i18n("File already exists!\nOld file from:\n%1\nOverwrite?\n").arg (KGlobal::locale()->formatDateTime(info.lastModified (), true, false ) ); 685 mes = i18n("File already exists!\nOld file from:\n%1\nOverwrite?\n").arg (KGlobal::locale()->formatDateTime(info.lastModified (), true, false ) );
685 int result = QMessageBox::warning( this, i18n("KO/Pi: Warning!"),mes, 686 int result = QMessageBox::warning( this, i18n("KO/Pi: Warning!"),mes,
686 i18n("Overwrite!"), i18n("Cancel"), 0, 687 i18n("Overwrite!"), i18n("Cancel"), 0,
687 0, 1 ); 688 0, 1 );
688 if ( result != 0 ) { 689 if ( result != 0 ) {
689 createbup = false; 690 createbup = false;
690 } 691 }
691 } 692 }
692 if ( createbup ) { 693 if ( createbup ) {
693 CalendarLocal cal; 694 CalendarLocal cal;
694 cal.setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId); 695 cal.setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId);
695 Incidence *incidence = delSel.first(); 696 Incidence *incidence = delSel.first();
696 while ( incidence ) { 697 while ( incidence ) {
697 cal.addIncidence( incidence->clone() ); 698 cal.addIncidence( incidence->clone() );
698 incidence = delSel.next(); 699 incidence = delSel.next();
699 } 700 }
700 if ( iCal ) { 701 if ( iCal ) {
701 ICalFormat format; 702 ICalFormat format;
702 format.save( &cal, fn ); 703 format.save( &cal, fn );
703 } else { 704 } else {
704 705
705 VCalFormat format; 706 VCalFormat format;
706 format.save( &cal, fn ); 707 format.save( &cal, fn );
707 } 708 }
708 mes = i18n("KO/Pi:Saved %1").arg(fn ); 709 mes = i18n("KO/Pi:Saved %1").arg(fn );
709 KOPrefs::instance()->mLastSaveFile = fn; 710 KOPrefs::instance()->mLastSaveFile = fn;
710 topLevelWidget()->setCaption(mes); 711 topLevelWidget()->setCaption(mes);
711 } 712 }
712 } 713 }
713 QTimer::singleShot( 1, this, SLOT ( resetFocus() ) ); 714 QTimer::singleShot( 1, this, SLOT ( resetFocus() ) );
714} 715}
715void KOListView::deleteAll() 716void KOListView::deleteAll()
716{ 717{
717 int icount = 0; 718 int icount = 0;
718 QPtrList<Incidence> delSel ; 719 QPtrList<Incidence> delSel ;
719 QListViewItem *item = mListView->firstChild (); 720 QListViewItem *item = mListView->firstChild ();
720 while ( item ) { 721 while ( item ) {
721 if ( item->isSelected() ) { 722 if ( item->isSelected() ) {
722 delSel.append(((KOListViewItem *)item)->data()); 723 delSel.append(((KOListViewItem *)item)->data());
723 ++icount; 724 ++icount;
724 } 725 }
725 726
726 item = item->nextSibling(); 727 item = item->nextSibling();
727 } 728 }
728 if ( icount ) { 729 if ( icount ) {
729 Incidence *incidence = delSel.first(); 730 Incidence *incidence = delSel.first();
730 Incidence *toDelete; 731 Incidence *toDelete;
731 KOPrefs *p = KOPrefs::instance(); 732 KOPrefs *p = KOPrefs::instance();
732 bool confirm = p->mConfirm; 733 bool confirm = p->mConfirm;
733 QString mess; 734 QString mess;
734 mess = mess.sprintf( i18n("You have %d item(s) selected.\n"), icount ); 735 mess = mess.sprintf( i18n("You have %d item(s) selected.\n"), icount );
735 if ( KMessageBox::Continue == KMessageBox::warningContinueCancel(this, mess + i18n("All selected items will be\npermanently deleted.\n(Deleting items will take\nsome time on a PDA)\n"), i18n("KO/Pi Confirmation"),i18n("Delete")) ) { 736 if ( KMessageBox::Continue == KMessageBox::warningContinueCancel(this, mess + i18n("All selected items will be\npermanently deleted.\n(Deleting items will take\nsome time on a PDA)\n"), i18n("KO/Pi Confirmation"),i18n("Delete")) ) {
736 p->mConfirm = false; 737 p->mConfirm = false;
737 int delCounter = 0; 738 int delCounter = 0;
738 QDialog dia ( this, "p-dialog", true ); 739 QDialog dia ( this, "p-dialog", true );
739 QLabel lab (i18n("Close dialog to abort deletion!"), &dia ); 740 QLabel lab (i18n("Close dialog to abort deletion!"), &dia );
740 QVBoxLayout lay( &dia ); 741 QVBoxLayout lay( &dia );
741 lay.setMargin(7); 742 lay.setMargin(7);
742 lay.setSpacing(7); 743 lay.setSpacing(7);
743 lay.addWidget( &lab); 744 lay.addWidget( &lab);
744 QProgressBar bar( icount, &dia ); 745 QProgressBar bar( icount, &dia );
745 lay.addWidget( &bar); 746 lay.addWidget( &bar);
746 int w = 220; 747 int w = 220;
747 int h = 50; 748 int h = 50;
748 int dw = QApplication::desktop()->width(); 749 int dw = QApplication::desktop()->width();
749 int dh = QApplication::desktop()->height(); 750 int dh = QApplication::desktop()->height();
750 dia.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 751 dia.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
751 //dia.resize( 240,50 ); 752 //dia.resize( 240,50 );
752 dia.show(); 753 dia.show();
753 754
754 while ( incidence ) { 755 while ( incidence ) {
755 bar.setProgress( delCounter ); 756 bar.setProgress( delCounter );
756 mess = mess.sprintf( i18n("Deleting item %d ..."), ++delCounter ); 757 mess = mess.sprintf( i18n("Deleting item %d ..."), ++delCounter );
757 dia.setCaption( mess ); 758 dia.setCaption( mess );
758 qApp->processEvents(); 759 qApp->processEvents();
759 toDelete = (incidence); 760 toDelete = (incidence);
760 incidence = delSel.next(); 761 incidence = delSel.next();
761 emit deleteIncidenceSignal(toDelete ); 762 emit deleteIncidenceSignal(toDelete );
762 if ( dia.result() != 0 ) 763 if ( dia.result() != 0 )
763 break; 764 break;
764 765
765 } 766 }
766 mess = mess.sprintf( i18n("%d items remaining in list."), count() ); 767 mess = mess.sprintf( i18n("%d items remaining in list."), count() );
767 topLevelWidget ()->setCaption( mess ); 768 topLevelWidget ()->setCaption( mess );
768 p->mConfirm = confirm; 769 p->mConfirm = confirm;
769 } 770 }
770 } 771 }
771 772
772 773
773} 774}
774int KOListView::maxDatesHint() 775int KOListView::maxDatesHint()
775{ 776{
776 return 0; 777 return 0;
777} 778}
778 779
779int KOListView::currentDateCount() 780int KOListView::currentDateCount()
780{ 781{
781 return 0; 782 return 0;
782} 783}
783 784
784QPtrList<Incidence> KOListView::selectedIncidences() 785QPtrList<Incidence> KOListView::selectedIncidences()
785{ 786{
786 QPtrList<Incidence> eventList; 787 QPtrList<Incidence> eventList;
787 QListViewItem *item = mListView->firstChild (); 788 QListViewItem *item = mListView->firstChild ();
788 while ( item ) { 789 while ( item ) {
789 if ( item->isSelected() ) { 790 if ( item->isSelected() ) {
790 eventList.append(((KOListViewItem *)item)->data()); 791 eventList.append(((KOListViewItem *)item)->data());
791 } 792 }
792 793
793 item = item->nextSibling(); 794 item = item->nextSibling();
794 } 795 }
795 796
796 // // QListViewItem *item = mListView->selectedItem(); 797 // // QListViewItem *item = mListView->selectedItem();
797 //if (item) eventList.append(((KOListViewItem *)item)->data()); 798 //if (item) eventList.append(((KOListViewItem *)item)->data());
798 799
799 return eventList; 800 return eventList;
800} 801}
801 802
802DateList KOListView::selectedDates() 803DateList KOListView::selectedDates()
803{ 804{
804 DateList eventList; 805 DateList eventList;
805 return eventList; 806 return eventList;
806} 807}
807 808
808void KOListView::showDates(bool show) 809void KOListView::showDates(bool show)
809{ 810{
810 // Shouldn't we set it to a value greater 0? When showDates is called with 811 // Shouldn't we set it to a value greater 0? When showDates is called with
811 // show == true at first, then the columnwidths are set to zero. 812 // show == true at first, then the columnwidths are set to zero.
812 static int oldColWidth1 = 0; 813 static int oldColWidth1 = 0;
813 static int oldColWidth3 = 0; 814 static int oldColWidth3 = 0;
814 815
815 if (!show) { 816 if (!show) {
816 oldColWidth1 = mListView->columnWidth(1); 817 oldColWidth1 = mListView->columnWidth(1);
817 oldColWidth3 = mListView->columnWidth(3); 818 oldColWidth3 = mListView->columnWidth(3);
818 mListView->setColumnWidth(1, 0); 819 mListView->setColumnWidth(1, 0);
819 mListView->setColumnWidth(3, 0); 820 mListView->setColumnWidth(3, 0);
820 } else { 821 } else {
821 mListView->setColumnWidth(1, oldColWidth1); 822 mListView->setColumnWidth(1, oldColWidth1);
822 mListView->setColumnWidth(3, oldColWidth3); 823 mListView->setColumnWidth(3, oldColWidth3);
823 } 824 }
824 mListView->repaint(); 825 mListView->repaint();
825} 826}
826 827
827void KOListView::printPreview(CalPrinter *calPrinter, const QDate &fd, 828void KOListView::printPreview(CalPrinter *calPrinter, const QDate &fd,
828 const QDate &td) 829 const QDate &td)
829{ 830{
830#ifndef KORG_NOPRINTER 831#ifndef KORG_NOPRINTER
831 calPrinter->preview(CalPrinter::Day, fd, td); 832 calPrinter->preview(CalPrinter::Day, fd, td);
832#endif 833#endif
833} 834}
834 835
835void KOListView::showDates() 836void KOListView::showDates()
836{ 837{
837 showDates(true); 838 showDates(true);
838} 839}
839 840
840void KOListView::hideDates() 841void KOListView::hideDates()
841{ 842{
842 showDates(false); 843 showDates(false);
843} 844}
844 845
845void KOListView::resetFocus() 846void KOListView::resetFocus()
846{ 847{
847 topLevelWidget()->setActiveWindow(); 848 topLevelWidget()->setActiveWindow();
848 topLevelWidget()->raise(); 849 topLevelWidget()->raise();
849 mListView->setFocus(); 850 mListView->setFocus();
850} 851}
851void KOListView::updateView() 852void KOListView::updateView()
852{ 853{
853 mListView->setFocus(); 854 mListView->setFocus();
854 if ( mListView->firstChild () ) 855 if ( mListView->firstChild () )
855 mListView->setCurrentItem( mListView->firstChild () ); 856 mListView->setCurrentItem( mListView->firstChild () );
856} 857}
857void KOListView::updateConfig() 858void KOListView::updateConfig()
858{ 859{
859 860
860 mListView->setFont ( KOPrefs::instance()->mListViewFont ); 861 mListView->setFont ( KOPrefs::instance()->mListViewFont );
861 updateView(); 862 updateView();
862 863
863} 864}
864void KOListView::setStartDate(const QDate &start) 865void KOListView::setStartDate(const QDate &start)
865{ 866{
866 mStartDate = start; 867 mStartDate = start;
867} 868}
868 869
869void KOListView::showDates(const QDate &start, const QDate &end) 870void KOListView::showDates(const QDate &start, const QDate &end)
870{ 871{
871 clear(); 872 clear();
872 mStartDate = start; 873 mStartDate = start;
873 QDate date = start; 874 QDate date = start;
874 QPtrList<Journal> j_list; 875 QPtrList<Journal> j_list;
875 while( date <= end ) { 876 while( date <= end ) {
876 addEvents(calendar()->events(date)); 877 addEvents(calendar()->events(date));
877 addTodos(calendar()->todos(date)); 878 addTodos(calendar()->todos(date));
878 Journal* jo = calendar()->journal(date); 879 Journal* jo = calendar()->journal(date);
879 if ( jo ) 880 if ( jo )
880 j_list.append( jo ); 881 j_list.append( jo );
881 date = date.addDays( 1 ); 882 date = date.addDays( 1 );
882 } 883 }
883 addJournals(j_list); 884 addJournals(j_list);
884 emit incidenceSelected( 0 ); 885 emit incidenceSelected( 0 );
885 updateView(); 886 updateView();
886 887
887} 888}
888 889
889void KOListView::addEvents(QPtrList<Event> eventList) 890void KOListView::addEvents(QPtrList<Event> eventList)
890{ 891{
891 892
892 Event *ev; 893 Event *ev;
893 for(ev = eventList.first(); ev; ev = eventList.next()) { 894 for(ev = eventList.first(); ev; ev = eventList.next()) {
894 addIncidence(ev); 895 addIncidence(ev);
895 } 896 }
896 if ( !mListView->currentItem() ){ 897 if ( !mListView->currentItem() ){
897 updateView(); 898 updateView();
898 } 899 }
899} 900}
900 901
901void KOListView::addTodos(QPtrList<Todo> eventList) 902void KOListView::addTodos(QPtrList<Todo> eventList)
902{ 903{
903 Todo *ev; 904 Todo *ev;
904 for(ev = eventList.first(); ev; ev = eventList.next()) { 905 for(ev = eventList.first(); ev; ev = eventList.next()) {
905 addIncidence(ev); 906 addIncidence(ev);
906 } 907 }
907 if ( !mListView->currentItem() ){ 908 if ( !mListView->currentItem() ){
908 updateView(); 909 updateView();
909 } 910 }
910} 911}
911void KOListView::addJournals(QPtrList<Journal> eventList) 912void KOListView::addJournals(QPtrList<Journal> eventList)
912{ 913{
913 Journal *ev; 914 Journal *ev;
914 for(ev = eventList.first(); ev; ev = eventList.next()) { 915 for(ev = eventList.first(); ev; ev = eventList.next()) {
915 addIncidence(ev); 916 addIncidence(ev);
916 } 917 }
917 if ( !mListView->currentItem() ){ 918 if ( !mListView->currentItem() ){
918 updateView(); 919 updateView();
919 } 920 }
920} 921}
921 922
922void KOListView::addIncidence(Incidence *incidence) 923void KOListView::addIncidence(Incidence *incidence)
923{ 924{
924 if ( mUidDict.find( incidence->uid() ) ) return; 925 if ( mUidDict.find( incidence->uid() ) ) return;
925 926
926 // mListView->setFont ( KOPrefs::instance()->mListViewFont ); 927 // mListView->setFont ( KOPrefs::instance()->mListViewFont );
927 mUidDict.insert( incidence->uid(), incidence ); 928 mUidDict.insert( incidence->uid(), incidence );
928 KOListViewItem *item = new KOListViewItem( incidence, mListView ); 929 KOListViewItem *item = new KOListViewItem( incidence, mListView );
929 ListItemVisitor v(item, mStartDate ); 930 ListItemVisitor v(item, mStartDate );
930 if (incidence->accept(v)) { 931 if (incidence->accept(v)) {
931 return; 932 return;
932 } 933 }
933 else delete item; 934 else delete item;
934} 935}
935 936
936void KOListView::showEvents(QPtrList<Event> eventList) 937void KOListView::showEvents(QPtrList<Event> eventList)
937{ 938{
938 clear(); 939 clear();
939 940
940 addEvents(eventList); 941 addEvents(eventList);
941 942
942 // After new creation of list view no events are selected. 943 // After new creation of list view no events are selected.
943 emit incidenceSelected( 0 ); 944 emit incidenceSelected( 0 );
944} 945}
945int KOListView::count() 946int KOListView::count()
946{ 947{
947 return mListView->childCount(); 948 return mListView->childCount();
948} 949}
949 950
950void KOListView::changeEventDisplay(Event *event, int action) 951void KOListView::changeEventDisplay(Event *event, int action)
951{ 952{
952 KOListViewItem *item; 953 KOListViewItem *item;
953 954
954 switch(action) { 955 switch(action) {
955 case KOGlobals::EVENTADDED: 956 case KOGlobals::EVENTADDED:
956 addIncidence( event ); 957 addIncidence( event );
957 break; 958 break;
958 case KOGlobals::EVENTEDITED: 959 case KOGlobals::EVENTEDITED:
959 item = getItemForEvent(event); 960 item = getItemForEvent(event);
960 if (item) { 961 if (item) {
961 mUidDict.remove( event->uid() ); 962 mUidDict.remove( event->uid() );
962 delete item; 963 delete item;
963 addIncidence( event ); 964 addIncidence( event );
964 } 965 }
965 break; 966 break;
966 case KOGlobals::EVENTDELETED: 967 case KOGlobals::EVENTDELETED:
967 item = getItemForEvent(event); 968 item = getItemForEvent(event);
968 if (item) { 969 if (item) {
969 mUidDict.remove( event->uid() ); 970 mUidDict.remove( event->uid() );
970 delete item; 971 delete item;
971 } 972 }
972 break; 973 break;
973 default: 974 default:
974 ; 975 ;
975 } 976 }
976} 977}
977 978
978KOListViewItem *KOListView::getItemForEvent(Event *event) 979KOListViewItem *KOListView::getItemForEvent(Event *event)
979{ 980{
980 KOListViewItem *item = (KOListViewItem *)mListView->firstChild(); 981 KOListViewItem *item = (KOListViewItem *)mListView->firstChild();
981 while (item) { 982 while (item) {
982 if (item->data() == event) return item; 983 if (item->data() == event) return item;
983 item = (KOListViewItem *)item->nextSibling(); 984 item = (KOListViewItem *)item->nextSibling();
984 } 985 }
985 return 0; 986 return 0;
986} 987}
987 988
988void KOListView::defaultItemAction(QListViewItem *i) 989void KOListView::defaultItemAction(QListViewItem *i)
989{ 990{
990 KOListViewItem *item = static_cast<KOListViewItem *>( i ); 991 KOListViewItem *item = static_cast<KOListViewItem *>( i );
991 if ( item ) defaultAction( item->data() ); 992 if ( item ) defaultAction( item->data() );
992 993
993} 994}
994 995
995void KOListView::popupMenu(QListViewItem *item,const QPoint &,int) 996void KOListView::popupMenu(QListViewItem *item,const QPoint &,int)
996{ 997{
997 mActiveItem = (KOListViewItem *)item; 998 mActiveItem = (KOListViewItem *)item;
998 if (mActiveItem) { 999 if (mActiveItem) {
999 Incidence *incidence = mActiveItem->data(); 1000 Incidence *incidence = mActiveItem->data();
1000 mPopupMenu->showIncidencePopup(incidence); 1001 mPopupMenu->showIncidencePopup(incidence);
1001 1002
1002 /* 1003 /*
1003 if ( incidence && incidence->type() == "Event" ) { 1004 if ( incidence && incidence->type() == "Event" ) {
1004 Event *event = static_cast<Event *>( incidence ); 1005 Event *event = static_cast<Event *>( incidence );
1005 mPopupMenu->showEventPopup(event); 1006 mPopupMenu->showEventPopup(event);
1006 } 1007 }
1007 */ 1008 */
1008 } 1009 }
1009} 1010}
1010 1011
1011void KOListView::readSettings(KConfig *config, QString setting) 1012void KOListView::readSettings(KConfig *config, QString setting)
1012{ 1013{
1013 // qDebug("KOListView::readSettings "); 1014 // qDebug("KOListView::readSettings ");
1014 mListView->restoreLayout(config,setting); 1015 mListView->restoreLayout(config,setting);
1015} 1016}
1016 1017
1017void KOListView::writeSettings(KConfig *config, QString setting) 1018void KOListView::writeSettings(KConfig *config, QString setting)
1018{ 1019{
1019 // qDebug("KOListView::writeSettings "); 1020 // qDebug("KOListView::writeSettings ");
1020 mListView->saveLayout(config, setting); 1021 mListView->saveLayout(config, setting);
1021} 1022}
1022 1023
1023void KOListView::processSelectionChange(QListViewItem *) 1024void KOListView::processSelectionChange(QListViewItem *)
1024{ 1025{
1025 1026
1026 KOListViewItem *item = 1027 KOListViewItem *item =
1027 static_cast<KOListViewItem *>( mListView->currentItem() ); 1028 static_cast<KOListViewItem *>( mListView->currentItem() );
1028 1029
1029 if ( !item ) { 1030 if ( !item ) {
1030 emit incidenceSelected( 0 ); 1031 emit incidenceSelected( 0 );
1031 } else { 1032 } else {
1032 emit incidenceSelected( item->data() ); 1033 emit incidenceSelected( item->data() );
1033 } 1034 }
1034} 1035}
1035 1036
1036void KOListView::clearSelection() 1037void KOListView::clearSelection()
1037{ 1038{
1038 mListView->selectAll( false ); 1039 mListView->selectAll( false );
1039} 1040}
1040void KOListView::allSelection() 1041void KOListView::allSelection()
1041{ 1042{
1042 mListView->selectAll( true ); 1043 mListView->selectAll( true );
1043} 1044}
1044 1045
1045void KOListView::clear() 1046void KOListView::clear()
1046{ 1047{
1047 mListView->clear(); 1048 mListView->clear();
1048 mUidDict.clear(); 1049 mUidDict.clear();
1049} 1050}
1050 1051
1051Incidence* KOListView::currentItem() 1052Incidence* KOListView::currentItem()
1052{ 1053{
1053 if ( mListView->currentItem() ) 1054 if ( mListView->currentItem() )
1054 return ((KOListViewItem*) mListView->currentItem())->data(); 1055 return ((KOListViewItem*) mListView->currentItem())->data();
1055 return 0; 1056 return 0;
1056} 1057}
1057void KOListView::keyPressEvent ( QKeyEvent *e) 1058void KOListView::keyPressEvent ( QKeyEvent *e)
1058{ 1059{
1059 1060
1060 if ( e->key() == Qt::Key_Delete || e->key() == Qt::Key_Backspace ) { 1061 if ( e->key() == Qt::Key_Delete || e->key() == Qt::Key_Backspace ) {
1061 deleteAll(); 1062 deleteAll();
1062 return; 1063 return;
1063 } 1064 }
1064 1065
1065 e->ignore(); 1066 e->ignore();
1066} 1067}
1067void KOListViewListView::keyPressEvent ( QKeyEvent *e) 1068void KOListViewListView::keyPressEvent ( QKeyEvent *e)
1068{ 1069{
1069 1070
1070 switch ( e->key() ) { 1071 switch ( e->key() ) {
1071 case Qt::Key_Down: 1072 case Qt::Key_Down:
1072 if ( e->state() == ShiftButton ) { 1073 if ( e->state() == ShiftButton ) {
1073 QListViewItem* cn = currentItem(); 1074 QListViewItem* cn = currentItem();
1074 if ( !cn ) 1075 if ( !cn )
1075 cn = firstChild(); 1076 cn = firstChild();
1076 if ( !cn ) 1077 if ( !cn )
1077 return; 1078 return;
1078 while ( cn->nextSibling() ) 1079 while ( cn->nextSibling() )
1079 cn = cn->nextSibling(); 1080 cn = cn->nextSibling();
1080 setCurrentItem ( cn ); 1081 setCurrentItem ( cn );
1081 ensureItemVisible ( cn ); 1082 ensureItemVisible ( cn );
1082 1083
1083 e->accept(); 1084 e->accept();
1084 return; 1085 return;
1085 } 1086 }
1086 if ( e->state() == ControlButton ) { 1087 if ( e->state() == ControlButton ) {
1087 int count = childCount (); 1088 int count = childCount ();
1088 int jump = count / 5; 1089 int jump = count / 5;
1089 QListViewItem* cn; 1090 QListViewItem* cn;
1090 cn = currentItem(); 1091 cn = currentItem();
1091 if ( ! cn ) 1092 if ( ! cn )
1092 return; 1093 return;
1093 if ( jump == 0 ) 1094 if ( jump == 0 )
1094 jump = 1; 1095 jump = 1;
1095 while ( jump && cn->nextSibling() ) { 1096 while ( jump && cn->nextSibling() ) {
1096 cn = cn->nextSibling(); 1097 cn = cn->nextSibling();
1097 --jump; 1098 --jump;
1098 } 1099 }
1099 setCurrentItem ( cn ); 1100 setCurrentItem ( cn );
1100 ensureItemVisible ( cn ); 1101 ensureItemVisible ( cn );
1101 1102
1102 } else 1103 } else
1103 QListView::keyPressEvent ( e ) ; 1104 QListView::keyPressEvent ( e ) ;
1104 e->accept(); 1105 e->accept();
1105 break; 1106 break;
1106 1107
1107 case Qt::Key_Up: 1108 case Qt::Key_Up:
1108 if ( e->state() == ShiftButton ) { 1109 if ( e->state() == ShiftButton ) {
1109 QListViewItem* cn = firstChild(); 1110 QListViewItem* cn = firstChild();
1110 if ( cn ) { 1111 if ( cn ) {
1111 setCurrentItem ( cn ); 1112 setCurrentItem ( cn );
1112 ensureItemVisible ( cn ); 1113 ensureItemVisible ( cn );
1113 } 1114 }
1114 e->accept(); 1115 e->accept();
1115 return; 1116 return;
1116 } 1117 }
1117 if ( e->state() == ControlButton ) { 1118 if ( e->state() == ControlButton ) {
1118 int count = childCount (); 1119 int count = childCount ();
1119 int jump = count / 5; 1120 int jump = count / 5;
1120 QListViewItem* cn; 1121 QListViewItem* cn;
1121 cn = currentItem(); 1122 cn = currentItem();
1122 if ( ! cn ) 1123 if ( ! cn )
1123 return; 1124 return;
1124 if ( jump == 0 ) 1125 if ( jump == 0 )
1125 jump = 1; 1126 jump = 1;
1126 while ( jump && cn->itemAbove ()) { 1127 while ( jump && cn->itemAbove ()) {
1127 cn = cn->itemAbove (); 1128 cn = cn->itemAbove ();
1128 --jump; 1129 --jump;
1129 } 1130 }
1130 setCurrentItem ( cn ); 1131 setCurrentItem ( cn );
1131 ensureItemVisible ( cn ); 1132 ensureItemVisible ( cn );
1132 } else 1133 } else
1133 QListView::keyPressEvent ( e ) ; 1134 QListView::keyPressEvent ( e ) ;
1134 e->accept(); 1135 e->accept();
1135 break; 1136 break;
1136 case Qt::Key_I: { 1137 case Qt::Key_I: {
1137 QListViewItem* cn; 1138 QListViewItem* cn;
1138 cn = currentItem(); 1139 cn = currentItem();
1139 if ( cn ) { 1140 if ( cn ) {
1140 KOListViewItem* ci = (KOListViewItem*)( cn ); 1141 KOListViewItem* ci = (KOListViewItem*)( cn );
1141 if ( ci ){ 1142 if ( ci ){
1142 //emit showIncidence( ci->data()); 1143 //emit showIncidence( ci->data());
1143 cn = cn->nextSibling(); 1144 cn = cn->nextSibling();
1144 if ( cn ) { 1145 if ( cn ) {
1145 setCurrentItem ( cn ); 1146 setCurrentItem ( cn );
1146 ensureItemVisible ( cn ); 1147 ensureItemVisible ( cn );
1147 } 1148 }
1148 emit showIncidence( ci->data()); 1149 emit showIncidence( ci->data());
1149 } 1150 }
1150 } 1151 }
1151 e->accept(); 1152 e->accept();
1152 } 1153 }
1153 break; 1154 break;
1154 case Qt::Key_Return: 1155 case Qt::Key_Return:
1155 case Qt::Key_Enter: 1156 case Qt::Key_Enter:
1156 { 1157 {
1157 QListViewItem* cn; 1158 QListViewItem* cn;
1158 cn = currentItem(); 1159 cn = currentItem();
1159 if ( cn ) { 1160 if ( cn ) {
1160 KOListViewItem* ci = (KOListViewItem*)( cn ); 1161 KOListViewItem* ci = (KOListViewItem*)( cn );
1161 if ( ci ){ 1162 if ( ci ){
1162 if ( e->state() == ShiftButton ) 1163 if ( e->state() == ShiftButton )
1163 ci->setSelected( false ); 1164 ci->setSelected( false );
1164 else 1165 else
1165 ci->setSelected( true ); 1166 ci->setSelected( true );
1166 cn = cn->nextSibling(); 1167 cn = cn->nextSibling();
1167 if ( cn ) { 1168 if ( cn ) {
1168 setCurrentItem ( cn ); 1169 setCurrentItem ( cn );
1169 ensureItemVisible ( cn ); 1170 ensureItemVisible ( cn );
1170 } 1171 }
1171 } 1172 }
1172 } 1173 }
1173 e->accept(); 1174 e->accept();
1174 } 1175 }
1175 break; 1176 break;
1176 default: 1177 default:
1177 e->ignore(); 1178 e->ignore();
1178 } 1179 }
1179} 1180}
1180KOListViewListView::KOListViewListView(KOListView * lv ) 1181KOListViewListView::KOListViewListView(KOListView * lv )
1181 : KListView( lv, "kolistlistview", false ) 1182 : KListView( lv, "kolistlistview", false )
1182{ 1183{
1183 mPopupTimer = new QTimer(this); 1184 mPopupTimer = new QTimer(this);
1184 connect(mPopupTimer , SIGNAL(timeout()), this, SLOT(popupMenu())); 1185 connect(mPopupTimer , SIGNAL(timeout()), this, SLOT(popupMenu()));
1185#ifndef DESKTOP_VERSION 1186#ifndef DESKTOP_VERSION
1186 //QPEApplication::setStylusOperation(viewport(), QPEApplication::RightOnHold ); 1187 //QPEApplication::setStylusOperation(viewport(), QPEApplication::RightOnHold );
1187#endif 1188#endif
1188 setSelectionMode( QListView::Multi ); 1189 setSelectionMode( QListView::Multi );
1189 setMultiSelection( true); 1190 setMultiSelection( true);
1190} 1191}
1191void KOListViewListView::contentsMouseDoubleClickEvent(QMouseEvent *e) 1192void KOListViewListView::contentsMouseDoubleClickEvent(QMouseEvent *e)
1192{ 1193{
1193 if (!e) return; 1194 if (!e) return;
1194 QPoint vp = contentsToViewport(e->pos()); 1195 QPoint vp = contentsToViewport(e->pos());
1195 QListViewItem *item = itemAt(vp); 1196 QListViewItem *item = itemAt(vp);
1196 if (!item) { 1197 if (!item) {
1197 emit newEvent(); 1198 emit newEvent();
1198 return; 1199 return;
1199 } 1200 }
1200 KListView::contentsMouseDoubleClickEvent(e); 1201 KListView::contentsMouseDoubleClickEvent(e);
1201} 1202}
1202#if 0 1203#if 0
1203void KOListViewListView::contentsMousePressEvent(QMouseEvent *e) 1204void KOListViewListView::contentsMousePressEvent(QMouseEvent *e)
1204{ 1205{
1205 //qDebug("contentsMousePressEvent++++ "); 1206 //qDebug("contentsMousePressEvent++++ ");
1206 KListView::contentsMousePressEvent( e ); 1207 KListView::contentsMousePressEvent( e );
1207 if ( e->button() == RightButton ) { 1208 if ( e->button() == RightButton ) {
1208 QListViewItem* ci = currentItem(); 1209 QListViewItem* ci = currentItem();
1209 clearSelection () ; 1210 clearSelection () ;
1210 if ( ci ) 1211 if ( ci )
1211 ci->setSelected( true ); 1212 ci->setSelected( true );
1212 } 1213 }
1213} 1214}
1214void KOListViewListView::contentsMouseReleaseEvent(QMouseEvent *e) 1215void KOListViewListView::contentsMouseReleaseEvent(QMouseEvent *e)
1215{ 1216{
1216 KListView::contentsMouseReleaseEvent(e); 1217 KListView::contentsMouseReleaseEvent(e);
1217} 1218}
1218void KOListViewListView::contentsMouseMoveEvent(QMouseEvent *e) 1219void KOListViewListView::contentsMouseMoveEvent(QMouseEvent *e)
1219{ 1220{
1220 KListView::contentsMouseMoveEvent(e); 1221 KListView::contentsMouseMoveEvent(e);
1221} 1222}
1222#endif 1223#endif
1223void KOListViewListView::popupMenu() 1224void KOListViewListView::popupMenu()
1224{ 1225{
1225 mPopupTimer->stop(); 1226 mPopupTimer->stop();
1226 QMouseEvent* e = new QMouseEvent( QEvent::MouseButtonPress, mEventPos ,mEventGlobalPos, RightButton , RightButton ); 1227 QMouseEvent* e = new QMouseEvent( QEvent::MouseButtonPress, mEventPos ,mEventGlobalPos, RightButton , RightButton );
1227 QApplication::postEvent( this->viewport(), e ); 1228 QApplication::postEvent( this->viewport(), e );
1228 1229
1229} 1230}
1230void KOListViewListView::contentsMousePressEvent(QMouseEvent *e) 1231void KOListViewListView::contentsMousePressEvent(QMouseEvent *e)
1231{ 1232{
1232 //qDebug("contentsMousePressEvent++++ %d %d", e->pos().y(), e->globalPos().y()); 1233 //qDebug("contentsMousePressEvent++++ %d %d", e->pos().y(), e->globalPos().y());
1233 mYMousePos = mapToGlobal( (e->pos())).y(); 1234 mYMousePos = mapToGlobal( (e->pos())).y();
1234 if ( e->button() == LeftButton ) { 1235 if ( e->button() == LeftButton ) {
1235 mPopupTimer->start( 600 ); 1236 mPopupTimer->start( 600 );
1236 mEventPos = contentsToViewport(e->pos()); 1237 mEventPos = contentsToViewport(e->pos());
1237 mEventGlobalPos = e->globalPos(); 1238 mEventGlobalPos = e->globalPos();
1238 } 1239 }
1239 KListView::contentsMousePressEvent( e ); 1240 KListView::contentsMousePressEvent( e );
1240 if ( e->button() == RightButton ) { 1241 if ( e->button() == RightButton ) {
1241 QListViewItem* ci = currentItem(); 1242 QListViewItem* ci = currentItem();
1242 //clearSelection(); 1243 //clearSelection();
1243 if ( ci ) 1244 if ( ci )
1244 ci->setSelected( true ); 1245 ci->setSelected( true );
1245 } 1246 }
1246} 1247}
1247void KOListViewListView::contentsMouseReleaseEvent(QMouseEvent *e) 1248void KOListViewListView::contentsMouseReleaseEvent(QMouseEvent *e)
1248{ 1249{
1249 mPopupTimer->stop(); 1250 mPopupTimer->stop();
1250 KListView::contentsMouseReleaseEvent(e); 1251 KListView::contentsMouseReleaseEvent(e);
1251} 1252}
1252void KOListViewListView::contentsMouseMoveEvent(QMouseEvent *e) 1253void KOListViewListView::contentsMouseMoveEvent(QMouseEvent *e)
1253{ 1254{
1254 // qDebug("contentsMouseMoveEv....... "); 1255 // qDebug("contentsMouseMoveEv....... ");
1255 // qDebug("start: %d current %d ",mYMousePos , mapToGlobal( (e->pos())).y() ); 1256 // qDebug("start: %d current %d ",mYMousePos , mapToGlobal( (e->pos())).y() );
1256 int diff = mYMousePos - mapToGlobal( (e->pos())).y(); 1257 int diff = mYMousePos - mapToGlobal( (e->pos())).y();
1257 if ( diff < 0 ) diff = -diff; 1258 if ( diff < 0 ) diff = -diff;
1258 if ( diff > 15 ) 1259 if ( diff > 15 )
1259 mPopupTimer->stop(); 1260 mPopupTimer->stop();
1260 else { 1261 else {
1261 mEventPos = contentsToViewport(e->pos()); 1262 mEventPos = contentsToViewport(e->pos());
1262 mEventGlobalPos = e->globalPos(); 1263 mEventGlobalPos = e->globalPos();
1263 } 1264 }
1264 KListView::contentsMouseMoveEvent(e); 1265 KListView::contentsMouseMoveEvent(e);
1265} 1266}
1266 1267
diff --git a/korganizer/kotodoeditor.cpp b/korganizer/kotodoeditor.cpp
index 6a05cc8..5513e8b 100644
--- a/korganizer/kotodoeditor.cpp
+++ b/korganizer/kotodoeditor.cpp
@@ -1,437 +1,444 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 1997, 1998 Preston Brown 3 Copyright (c) 1997, 1998 Preston Brown
4 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This program is free software; you can redistribute it and/or modify 6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by 7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or 8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version. 9 (at your option) any later version.
10 10
11 This program is distributed in the hope that it will be useful, 11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details. 14 GNU General Public License for more details.
15 15
16 You should have received a copy of the GNU General Public License 16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software 17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 19
20 As a special exception, permission is given to link this program 20 As a special exception, permission is given to link this program
21 with any edition of Qt, and distribute the resulting executable, 21 with any edition of Qt, and distribute the resulting executable,
22 without including the source code for Qt in the source distribution. 22 without including the source code for Qt in the source distribution.
23*/ 23*/
24 24
25#include <qtooltip.h> 25#include <qtooltip.h>
26#include <qframe.h> 26#include <qframe.h>
27#include <qpixmap.h> 27#include <qpixmap.h>
28#include <qlayout.h> 28#include <qlayout.h>
29#include <qhbox.h> 29#include <qhbox.h>
30#include <qdir.h> 30#include <qdir.h>
31#include <qdatetime.h> 31#include <qdatetime.h>
32#include <qapplication.h> 32#include <qapplication.h>
33#include <qtabwidget.h> 33#include <qtabwidget.h>
34 34
35#include <kiconloader.h> 35#include <kiconloader.h>
36#include <klocale.h> 36#include <klocale.h>
37#include <kfiledialog.h> 37#include <kfiledialog.h>
38#include <kstandarddirs.h> 38#include <kstandarddirs.h>
39#include <kmessagebox.h> 39#include <kmessagebox.h>
40 40
41#include <libkdepim/categoryselectdialog.h> 41#include <libkdepim/categoryselectdialog.h>
42#include <libkcal/calendarlocal.h> 42#include <libkcal/calendarlocal.h>
43#include <libkcal/calendarresources.h> 43#include <libkcal/calendarresources.h>
44#include <libkcal/resourcecalendar.h> 44#include <libkcal/resourcecalendar.h>
45#include <libkcal/icalformat.h> 45#include <libkcal/icalformat.h>
46#include <kresources/resourceselectdialog.h> 46#include <kresources/resourceselectdialog.h>
47#include <libkdepim/kdateedit.h> 47#include <libkdepim/kdateedit.h>
48 48
49#include "koprefs.h" 49#include "koprefs.h"
50#include "kolocationbox.h" 50#include "kolocationbox.h"
51 51
52#include "kotodoeditor.h" 52#include "kotodoeditor.h"
53extern int globalFlagBlockAgenda; 53extern int globalFlagBlockAgenda;
54 54
55KOTodoEditor::KOTodoEditor( Calendar *calendar, QWidget *parent ) : 55KOTodoEditor::KOTodoEditor( Calendar *calendar, QWidget *parent ) :
56 KOIncidenceEditor( i18n("Edit To-Do"), calendar, parent ) 56 KOIncidenceEditor( i18n("Edit To-Do"), calendar, parent )
57{ 57{
58 mTodo = 0; 58 mTodo = 0;
59 mRelatedTodo = 0; 59 mRelatedTodo = 0;
60 findButton(User1)->hide(); 60 findButton(User1)->hide();
61 init(); 61 init();
62} 62}
63 63
64KOTodoEditor::~KOTodoEditor() 64KOTodoEditor::~KOTodoEditor()
65{ 65{
66 emit dialogClose( mTodo ); 66 emit dialogClose( mTodo );
67} 67}
68 68
69void KOTodoEditor::init() 69void KOTodoEditor::init()
70{ 70{
71 setupGeneral(); 71 setupGeneral();
72 setupAttendeesTab(); 72 setupAttendeesTab();
73 setupRecurrence(); 73 setupRecurrence();
74 connect(mGeneral,SIGNAL(datesChecked()),this ,SLOT(checkRecurrence())); 74 connect(mGeneral,SIGNAL(datesChecked()),this ,SLOT(checkRecurrence()));
75 mRecurrence->setDateTimeStr( i18n("<i>The recurrence is computed from the start datetime!</i>") ); 75 mRecurrence->setDateTimeStr( i18n("<i>The recurrence is computed from the start datetime!</i>") );
76} 76}
77void KOTodoEditor::setupRecurrence() 77void KOTodoEditor::setupRecurrence()
78{ 78{
79 QFrame *topFrame = addPage( i18n("Recurrence") ); 79 QFrame *topFrame = addPage( i18n("Recurrence") );
80 QBoxLayout *topLayout = new QVBoxLayout( topFrame ); 80 QBoxLayout *topLayout = new QVBoxLayout( topFrame );
81 81
82 mRecurrence = new KOEditorRecurrence( topFrame ); 82 mRecurrence = new KOEditorRecurrence( topFrame );
83 topLayout->addWidget( mRecurrence ); 83 topLayout->addWidget( mRecurrence );
84} 84}
85 85
86void KOTodoEditor::setCategories( QString s ) 86void KOTodoEditor::setCategories( QString s )
87{ 87{
88 mGeneral->setCategories(s); 88 mGeneral->setCategories(s);
89} 89}
90void KOTodoEditor::setSecrecy( int sec ) 90void KOTodoEditor::setSecrecy( int sec )
91{ 91{
92 mGeneral->setSecrecy( sec ); 92 mGeneral->setSecrecy( sec );
93} 93}
94void KOTodoEditor::reload() 94void KOTodoEditor::reload()
95{ 95{
96 if ( mTodo ) readTodo( mTodo ); 96 if ( mTodo ) readTodo( mTodo );
97} 97}
98 98
99void KOTodoEditor::setupGeneral() 99void KOTodoEditor::setupGeneral()
100{ 100{
101 mGeneral = new KOEditorGeneralTodo(this); 101 mGeneral = new KOEditorGeneralTodo(this);
102 connect ( mGeneral, SIGNAL ( allAccepted() ), this, SLOT ( slotOk () ) ); 102 connect ( mGeneral, SIGNAL ( allAccepted() ), this, SLOT ( slotOk () ) );
103 103
104 // connect(mGeneral,SIGNAL(openCategoryDialog()),mCategoryDialog,SLOT(show())); 104 // connect(mGeneral,SIGNAL(openCategoryDialog()),mCategoryDialog,SLOT(show()));
105 //connect(mCategoryDialog, SIGNAL(categoriesSelected(const QString &)), 105 //connect(mCategoryDialog, SIGNAL(categoriesSelected(const QString &)),
106 // mGeneral,SLOT(setCategories(const QString &))); 106 // mGeneral,SLOT(setCategories(const QString &)));
107 107
108 if (KOPrefs::instance()->mCompactDialogs) { 108 if (KOPrefs::instance()->mCompactDialogs) {
109 QFrame *topFrame = addPage(i18n("General")); 109 QFrame *topFrame = addPage(i18n("General"));
110 110
111 QBoxLayout *topLayout = new QVBoxLayout(topFrame); 111 QBoxLayout *topLayout = new QVBoxLayout(topFrame);
112 if ( QApplication::desktop()->width() < 480 ) { 112 if ( QApplication::desktop()->width() < 480 ) {
113 topLayout->setMargin(1); 113 topLayout->setMargin(marginHintSmall());
114 topLayout->setSpacing(1); 114 topLayout->setSpacing(spacingHintSmall());
115 } else { 115 } else {
116 topLayout->setMargin(marginHint()-1); 116 topLayout->setMargin(marginHint());
117 topLayout->setSpacing(spacingHint()-1); 117 topLayout->setSpacing(spacingHint());
118 } 118 }
119 mGeneral->initHeader(topFrame,topLayout); 119 mGeneral->initHeader(topFrame,topLayout);
120 mGeneral->initTime(topFrame,topLayout); 120 mGeneral->initTime(topFrame,topLayout);
121 mGeneral->initAlarm(topFrame,topLayout); 121 mGeneral->initAlarm(topFrame,topLayout);
122 mGeneral->enableAlarm( false ); 122 mGeneral->enableAlarm( false );
123 123
124 124
125 QBoxLayout *priorityLayout; 125 QBoxLayout *priorityLayout;
126 if ( QApplication::desktop()->width() < 500 ) 126 if ( QApplication::desktop()->width() < 500 )
127 priorityLayout = new QVBoxLayout( topLayout ); 127 priorityLayout = new QVBoxLayout( topLayout );
128 else 128 else
129 priorityLayout = new QHBoxLayout( topLayout ); 129 priorityLayout = new QHBoxLayout( topLayout );
130 QWidget* prioWidget = new QWidget (topFrame); 130 QWidget* prioWidget = new QWidget (topFrame);
131 priorityLayout->addWidget( prioWidget ); 131 priorityLayout->addWidget( prioWidget );
132 QHBoxLayout* priorityLayout2 = new QHBoxLayout( prioWidget); 132 QHBoxLayout* priorityLayout2 = new QHBoxLayout( prioWidget);
133 133
134 134
135 QIconSet icon; 135 QIconSet icon;
136 if ( QApplication::desktop()->width() < 321 ) 136 if ( QApplication::desktop()->width() < 321 )
137 icon = SmallIcon("fileimport16"); 137 icon = SmallIcon("fileimport16");
138 else 138 else
139 icon = SmallIcon("fileimport"); 139 icon = SmallIcon("fileimport");
140 QPushButton * loadTemplate = new QPushButton( prioWidget); 140 QPushButton * loadTemplate = new QPushButton( prioWidget);
141 loadTemplate->setIconSet (icon ) ; 141 loadTemplate->setIconSet (icon ) ;
142 int size = loadTemplate->sizeHint().height(); 142 int size = loadTemplate->sizeHint().height();
143 loadTemplate->setFixedSize( size, size ); 143 loadTemplate->setFixedSize( size, size );
144 if ( QApplication::desktop()->width() < 321 ) 144 if ( QApplication::desktop()->width() < 321 )
145 icon = SmallIcon("fileexport16"); 145 icon = SmallIcon("fileexport16");
146 else 146 else
147 icon = SmallIcon("fileexport"); 147 icon = SmallIcon("fileexport");
148 QPushButton * saveTemplate = new QPushButton( prioWidget); 148 QPushButton * saveTemplate = new QPushButton( prioWidget);
149 saveTemplate->setIconSet (icon ) ; 149 saveTemplate->setIconSet (icon ) ;
150 saveTemplate->setFixedSize( size, size ); 150 saveTemplate->setFixedSize( size, size );
151 151
152 priorityLayout2->addWidget(loadTemplate); 152 priorityLayout2->addWidget(loadTemplate);
153 priorityLayout2->addWidget(saveTemplate); 153 priorityLayout2->addWidget(saveTemplate);
154 mGeneral->initPriority(prioWidget,priorityLayout2); 154 mGeneral->initPriority(prioWidget,priorityLayout2);
155 mGeneral->initCategories( topFrame, priorityLayout ); 155 mGeneral->initCategories( topFrame, priorityLayout );
156 topLayout->addStretch(1); 156 topLayout->addStretch(1);
157 157
158 QFrame *topFrame2 = addPage(i18n("Details")); 158 QFrame *topFrame2 = addPage(i18n("Details"));
159 159
160 QBoxLayout *topLayout2 = new QVBoxLayout(topFrame2); 160 QBoxLayout *topLayout2 = new QVBoxLayout(topFrame2);
161 topLayout2->setMargin(marginHint()); 161 topLayout2->setMargin(marginHint());
162 topLayout2->setSpacing(spacingHint()); 162 topLayout2->setSpacing(spacingHint());
163 163
164 QHBoxLayout *completionLayout = new QHBoxLayout( topLayout2 ); 164 QHBoxLayout *completionLayout = new QHBoxLayout( topLayout2 );
165 mGeneral->initCompletion(topFrame2,completionLayout); 165 mGeneral->initCompletion(topFrame2,completionLayout);
166 166
167 167
168 mGeneral->initSecrecy( topFrame2, topLayout2 ); 168 mGeneral->initSecrecy( topFrame2, topLayout2 );
169 mGeneral->initDescription(topFrame2,topLayout2); 169 mGeneral->initDescription(topFrame2,topLayout2);
170 170
171 // QHBox * hb = new QHBox ( topFrame2 ); 171 // QHBox * hb = new QHBox ( topFrame2 );
172 // topLayout2->addWidget(hb); 172 // topLayout2->addWidget(hb);
173 // hb->setSpacing( 3 ); 173 // hb->setSpacing( 3 );
174 174
175 connect( saveTemplate, SIGNAL( clicked() ), this , SLOT( slotSaveTemplate() ) ); 175 connect( saveTemplate, SIGNAL( clicked() ), this , SLOT( slotSaveTemplate() ) );
176 connect( loadTemplate, SIGNAL( clicked() ), this , SLOT( slotLoadTemplate() ) ); 176 connect( loadTemplate, SIGNAL( clicked() ), this , SLOT( slotLoadTemplate() ) );
177 177
178 } else { 178 } else {
179 QFrame *topFrame = addPage(i18n("General")); 179 QFrame *topFrame = addPage(i18n("General"));
180 180
181 QBoxLayout *topLayout = new QVBoxLayout(topFrame); 181 QBoxLayout *topLayout = new QVBoxLayout(topFrame);
182 topLayout->setSpacing(spacingHint()); 182 topLayout->setSpacing(spacingHint());
183 183
184 mGeneral->initHeader(topFrame,topLayout); 184 mGeneral->initHeader(topFrame,topLayout);
185 mGeneral->initTime(topFrame,topLayout); 185 mGeneral->initTime(topFrame,topLayout);
186 mGeneral->initStatus(topFrame,topLayout); 186 mGeneral->initStatus(topFrame,topLayout);
187 QBoxLayout *alarmLineLayout = new QHBoxLayout(topLayout); 187 QBoxLayout *alarmLineLayout = new QHBoxLayout(topLayout);
188 mGeneral->initAlarm(topFrame,alarmLineLayout); 188 mGeneral->initAlarm(topFrame,alarmLineLayout);
189 mGeneral->initDescription(topFrame,topLayout); 189 mGeneral->initDescription(topFrame,topLayout);
190 QBoxLayout *detailsLayout = new QHBoxLayout(topLayout); 190 QBoxLayout *detailsLayout = new QHBoxLayout(topLayout);
191 mGeneral->initCategories( topFrame, detailsLayout ); 191 mGeneral->initCategories( topFrame, detailsLayout );
192 mGeneral->initSecrecy( topFrame, detailsLayout ); 192 mGeneral->initSecrecy( topFrame, detailsLayout );
193 } 193 }
194 mGeneral->finishSetup(); 194 mGeneral->finishSetup();
195 195
196} 196}
197 197
198void KOTodoEditor::editTodo(Todo *todo, bool editDescription) 198void KOTodoEditor::editTodo(Todo *todo, bool editDescription)
199{ 199{
200 //init(); 200 //init();
201 201
202 mTodo = todo; 202 mTodo = todo;
203 readTodo(mTodo); 203 readTodo(mTodo);
204 if ( editDescription ) { 204 if ( editDescription ) {
205 showPage( 1 ); 205 showPage( 1 );
206 mGeneral->setFocusOn( 1 ); 206 mGeneral->setFocusOn( 1 );
207 } else { 207 } else {
208 showPage( 0 ); 208 showPage( 0 );
209 mGeneral->setFocusOn( 2 ); 209 mGeneral->setFocusOn( 2 );
210 } 210 }
211 checkRecurrence(); 211 checkRecurrence();
212} 212}
213 213
214void KOTodoEditor::newTodo(QDateTime due,Todo *relatedTodo,bool allDay) 214void KOTodoEditor::newTodo(QDateTime due,Todo *relatedTodo,bool allDay)
215{ 215{
216 //init(); 216 //init();
217 217
218 mTodo = 0; 218 mTodo = 0;
219 setDefaults(due,relatedTodo,allDay); 219 setDefaults(due,relatedTodo,allDay);
220} 220}
221 221
222void KOTodoEditor::loadDefaults() 222void KOTodoEditor::loadDefaults()
223{ 223{
224 setDefaults(QDateTime::currentDateTime().addDays(7),0,false); 224 setDefaults(QDateTime::currentDateTime().addDays(7),0,false);
225} 225}
226 226
227bool KOTodoEditor::processInput( bool emitTime ) 227bool KOTodoEditor::processInput( bool emitTime )
228{ 228{
229 if (!validateInput()) return false; 229 if (!validateInput()) return false;
230 230
231 Todo *todo = 0; 231 Todo *todo = 0;
232 232
233 if (mTodo) todo = mTodo; 233 if (mTodo) todo = mTodo;
234 else { 234 else {
235 todo = new Todo; 235 todo = new Todo;
236 todo->setOrganizer(KOPrefs::instance()->email()); 236 todo->setOrganizer(KOPrefs::instance()->email());
237 } 237 }
238 238
239 writeTodo(todo); 239 writeTodo(todo);
240 if ( emitTime ) { 240 if ( emitTime ) {
241 globalFlagBlockAgenda = 1; 241 globalFlagBlockAgenda = 1;
242 emit showAgendaView( false ); 242 emit showAgendaView( false );
243 if ( todo->hasDueDate() ) 243 if ( todo->hasDueDate() )
244 emit jumpToTime( todo->dtDue().date() ); 244 emit jumpToTime( todo->dtDue().date() );
245 globalFlagBlockAgenda = 2; 245 globalFlagBlockAgenda = 2;
246 } 246 }
247 if (mTodo) { 247 if (mTodo) {
248 todo->setRevision(todo->revision()+1); 248 todo->setRevision(todo->revision()+1);
249 emit todoChanged(todo); 249 emit todoChanged(todo);
250 } else { 250 } else {
251 mCalendar->addTodo(todo); 251 mCalendar->addTodo(todo);
252 mTodo = todo; 252 mTodo = todo;
253 emit todoAdded(todo); 253 emit todoAdded(todo);
254 } 254 }
255 255
256 return true; 256 return true;
257} 257}
258 258
259void KOTodoEditor::deleteTodo() 259void KOTodoEditor::deleteTodo()
260{ 260{
261 if (mTodo) { 261 if (mTodo) {
262 if (KOPrefs::instance()->mConfirm) { 262 if (KOPrefs::instance()->mConfirm) {
263 switch (msgItemDelete()) { 263 switch (msgItemDelete()) {
264 case KMessageBox::Continue: // OK 264 case KMessageBox::Continue: // OK
265 emit todoToBeDeleted(mTodo); 265 emit todoToBeDeleted(mTodo);
266 emit dialogClose(mTodo); 266 emit dialogClose(mTodo);
267 mCalendar->deleteTodo(mTodo); 267 mCalendar->deleteTodo(mTodo);
268 emit todoDeleted(); 268 emit todoDeleted();
269 reject(); 269 reject();
270 break; 270 break;
271 } 271 }
272 } 272 }
273 else { 273 else {
274 emit todoToBeDeleted(mTodo); 274 emit todoToBeDeleted(mTodo);
275 emit dialogClose(mTodo); 275 emit dialogClose(mTodo);
276 mCalendar->deleteTodo(mTodo); 276 mCalendar->deleteTodo(mTodo);
277 emit todoDeleted(); 277 emit todoDeleted();
278 reject(); 278 reject();
279 } 279 }
280 } else { 280 } else {
281 reject(); 281 reject();
282 } 282 }
283} 283}
284 284
285void KOTodoEditor::setDefaults(QDateTime due,Todo *relatedEvent,bool allDay) 285void KOTodoEditor::setDefaults(QDateTime due,Todo *relatedEvent,bool allDay)
286{ 286{
287 mRelatedTodo = relatedEvent; 287 mRelatedTodo = relatedEvent;
288 288
289 mGeneral->setDefaults(due,allDay); 289 mGeneral->setDefaults(due,allDay);
290 mDetails->setDefaults(); 290 mDetails->setDefaults();
291 showPage( 0 ); 291 showPage( 0 );
292 if ( mRelatedTodo ) { 292 if ( mRelatedTodo ) {
293 mGeneral->setCategories (mRelatedTodo->categoriesStr ()); 293 mGeneral->setCategories (mRelatedTodo->categoriesStr ());
294 mGeneral->setSecrecy (mRelatedTodo->secrecy ()); 294 mGeneral->setSecrecy (mRelatedTodo->secrecy ());
295 if ( mRelatedTodo->priority() < 3 ) 295 if ( mRelatedTodo->priority() < 3 )
296 mGeneral->mPriorityCombo->setCurrentItem(mRelatedTodo->priority()-1); 296 mGeneral->mPriorityCombo->setCurrentItem(mRelatedTodo->priority()-1);
297 mGeneral->mSummaryEdit->lineEdit()->setText(mRelatedTodo->summary()+": "); 297 mGeneral->mSummaryEdit->lineEdit()->setText(mRelatedTodo->summary()+": ");
298 int len = mRelatedTodo->summary().length(); 298 int len = mRelatedTodo->summary().length();
299 mGeneral->mSummaryEdit->lineEdit()->setFocus(); 299 mGeneral->mSummaryEdit->lineEdit()->setFocus();
300 mGeneral->mSummaryEdit->lineEdit()->setCursorPosition ( len+2 ); 300 mGeneral->mSummaryEdit->lineEdit()->setCursorPosition ( len+2 );
301 mGeneral->mSummaryEdit->lineEdit()->setSelection ( 0, len+2 ); 301 mGeneral->mSummaryEdit->lineEdit()->setSelection ( 0, len+2 );
302 302
303 } else 303 } else
304 mGeneral->setFocusOn( 2 ); 304 mGeneral->setFocusOn( 2 );
305 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), false ); 305 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), false );
306 mRecurrence->setDefaults(QDateTime::currentDateTime(),QDateTime::currentDateTime().addSecs( 3600 ),true); 306 mRecurrence->setDefaults(QDateTime::currentDateTime(),QDateTime::currentDateTime().addSecs( 3600 ),true);
307} 307}
308void KOTodoEditor::checkRecurrence() 308void KOTodoEditor::checkRecurrence()
309{ 309{
310 if ( mGeneral->mDueCheck->isChecked() && mGeneral->mStartCheck->isChecked()) { 310 if ( mGeneral->mDueCheck->isChecked() && mGeneral->mStartCheck->isChecked()) {
311 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), true ); 311 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), true );
312 312
313 if ( mTodo ) 313 if ( mTodo )
314 mRecurrence->readEvent( mTodo ); 314 mRecurrence->readEvent( mTodo );
315 else { 315 else {
316 bool time = mGeneral->mTimeButton->isChecked(); 316 bool time = mGeneral->mTimeButton->isChecked();
317 QDateTime from,to; 317 QDateTime from,to;
318 if ( time ) { 318 if ( time ) {
319 to = QDateTime( mGeneral->mDueDateEdit->date(), mGeneral->mDueTimeEdit->getTime() ) ; 319 to = QDateTime( mGeneral->mDueDateEdit->date(), mGeneral->mDueTimeEdit->getTime() ) ;
320 from = QDateTime( mGeneral->mStartDateEdit->date(),mGeneral->mStartTimeEdit->getTime( )) ; 320 from = QDateTime( mGeneral->mStartDateEdit->date(),mGeneral->mStartTimeEdit->getTime( )) ;
321 } else { 321 } else {
322 to = QDateTime( mGeneral->mDueDateEdit->date(), QTime( 0,0,0) ) ; 322 to = QDateTime( mGeneral->mDueDateEdit->date(), QTime( 0,0,0) ) ;
323 from = QDateTime( mGeneral->mStartDateEdit->date(),QTime( 0,0,0) ) ; 323 from = QDateTime( mGeneral->mStartDateEdit->date(),QTime( 0,0,0) ) ;
324 } 324 }
325 if ( to < from ) 325 if ( to < from )
326 to = from; 326 to = from;
327 mRecurrence->setDefaults(from,to,!time); 327 mRecurrence->setDefaults(from,to,!time);
328 } 328 }
329 } else { 329 } else {
330 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), false ); 330 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), false );
331 mRecurrence->setDefaults(QDateTime::currentDateTime(),QDateTime::currentDateTime().addSecs( 3600 ),true); 331 mRecurrence->setDefaults(QDateTime::currentDateTime(),QDateTime::currentDateTime().addSecs( 3600 ),true);
332 } 332 }
333} 333}
334void KOTodoEditor::readTodo(Todo *todo) 334void KOTodoEditor::readTodo(Todo *todo)
335{ 335{
336 mGeneral->readTodo(todo); 336 mGeneral->readTodo(todo);
337 mDetails->readEvent(todo); 337 mDetails->readEvent(todo);
338 mRelatedTodo = 0;//todo->relatedTo(); 338 mRelatedTodo = 0;//todo->relatedTo();
339 // categories 339 // categories
340 // mCategoryDialog->setSelected(todo->categories()); 340 // mCategoryDialog->setSelected(todo->categories());
341 341
342 // We should handle read-only events here. 342 // We should handle read-only events here.
343} 343}
344 344
345void KOTodoEditor::writeTodo(Todo *event) 345void KOTodoEditor::writeTodo(Todo *event)
346{ 346{
347 mGeneral->writeTodo(event); 347 bool maybeComputeRecurrenceTime = false;
348 mDetails->writeEvent(event); 348 if( event->hasRecurrenceID() && event->percentComplete() < 100)
349 349 maybeComputeRecurrenceTime = true;
350 // set related event, i.e. parent to-do in this case. 350 event->setHasRecurrenceID( false );
351 if (mRelatedTodo) { 351 mGeneral->writeTodo(event);
352 event->setRelatedTo(mRelatedTodo); 352 mDetails->writeEvent(event);
353 } 353
354 if ( mGeneral->mDueCheck->isChecked() && mGeneral->mStartCheck->isChecked()) { 354 // set related event, i.e. parent to-do in this case.
355 mRecurrence->writeEvent(event); 355 if (mRelatedTodo) {
356 if ( event->doesRecur() ) { 356 event->setRelatedTo(mRelatedTodo);
357 event->setRecurrenceID( event->dtStart().addSecs(-1) ); 357 }
358 event->setRecurDates(); 358 if ( mGeneral->mDueCheck->isChecked() && mGeneral->mStartCheck->isChecked()) {
359 } else { 359 mRecurrence->writeEvent(event);
360 event->setHasRecurrenceID( false ); 360 if ( event->doesRecur() ) {
361 } 361 int addSec = -1 ;
362 } else { 362 if ( maybeComputeRecurrenceTime && event->percentComplete() == 100 )
363 event->setHasRecurrenceID( false ); 363 addSec = 1;
364 event->recurrence()->unsetRecurs(); 364 event->setRecurrenceID( event->dtStart().addSecs( addSec ) );
365 } 365 event->setRecurDates();
366 } else {
367 event->setHasRecurrenceID( false );
368 }
369 } else {
370 event->setHasRecurrenceID( false );
371 event->recurrence()->unsetRecurs();
372 }
366} 373}
367 374
368bool KOTodoEditor::validateInput() 375bool KOTodoEditor::validateInput()
369{ 376{
370 if (!mGeneral->validateInput()) return false; 377 if (!mGeneral->validateInput()) return false;
371 if (!mDetails->validateInput()) return false; 378 if (!mDetails->validateInput()) return false;
372 return true; 379 return true;
373} 380}
374 381
375int KOTodoEditor::msgItemDelete() 382int KOTodoEditor::msgItemDelete()
376{ 383{
377 return KMessageBox::warningContinueCancel(this, 384 return KMessageBox::warningContinueCancel(this,
378 i18n("This item will be permanently deleted."), 385 i18n("This item will be permanently deleted."),
379 i18n("KOrganizer Confirmation"),i18n("Delete")); 386 i18n("KOrganizer Confirmation"),i18n("Delete"));
380} 387}
381 388
382void KOTodoEditor::modified (int modification) 389void KOTodoEditor::modified (int modification)
383{ 390{
384 if (modification == KOGlobals::CATEGORY_MODIFIED || 391 if (modification == KOGlobals::CATEGORY_MODIFIED ||
385 KOGlobals::UNKNOWN_MODIFIED == modification ) 392 KOGlobals::UNKNOWN_MODIFIED == modification )
386 // mCategoryDialog->setSelected (mTodo->categories ()); 393 // mCategoryDialog->setSelected (mTodo->categories ());
387 mGeneral->modified (mTodo, modification); 394 mGeneral->modified (mTodo, modification);
388 395
389} 396}
390 397
391void KOTodoEditor::slotLoadTemplate() 398void KOTodoEditor::slotLoadTemplate()
392{ 399{
393 400
394 QString fileName =locateLocal( "templates", "todos" ); 401 QString fileName =locateLocal( "templates", "todos" );
395 QDir t_dir; 402 QDir t_dir;
396 if ( !t_dir.exists(fileName) ) 403 if ( !t_dir.exists(fileName) )
397 t_dir.mkdir ( fileName ); 404 t_dir.mkdir ( fileName );
398 fileName += "/todo"; 405 fileName += "/todo";
399 fileName = KFileDialog::getSaveFileName( fileName , "Load Todo template", this ); 406 fileName = KFileDialog::getSaveFileName( fileName , "Load Todo template", this );
400 if ( fileName.length() == 0 ) 407 if ( fileName.length() == 0 )
401 return; 408 return;
402 CalendarLocal cal; 409 CalendarLocal cal;
403 ICalFormat format; 410 ICalFormat format;
404 if ( !format.load( &cal, fileName ) ) { 411 if ( !format.load( &cal, fileName ) ) {
405 KMessageBox::error( this, i18n("Error loading template file\n '%1'.") 412 KMessageBox::error( this, i18n("Error loading template file\n '%1'.")
406 .arg( fileName ) ); 413 .arg( fileName ) );
407 return ; 414 return ;
408 } 415 }
409 QPtrList<Todo> todos = cal.todos(); 416 QPtrList<Todo> todos = cal.todos();
410 Todo * todo = todos.first(); 417 Todo * todo = todos.first();
411 if ( !todo ) { 418 if ( !todo ) {
412 KMessageBox::error( this, 419 KMessageBox::error( this,
413 i18n("Template does not\ncontain a valid Todo.")); 420 i18n("Template does not\ncontain a valid Todo."));
414 } else { 421 } else {
415 readTodo( todo ); 422 readTodo( todo );
416 } 423 }
417 424
418} 425}
419 426
420void KOTodoEditor::slotSaveTemplate() 427void KOTodoEditor::slotSaveTemplate()
421{ 428{
422 QString fileName =locateLocal( "templates", "todos" ); 429 QString fileName =locateLocal( "templates", "todos" );
423 QDir t_dir; 430 QDir t_dir;
424 if ( !t_dir.exists(fileName) ) 431 if ( !t_dir.exists(fileName) )
425 t_dir.mkdir ( fileName ); 432 t_dir.mkdir ( fileName );
426 fileName += "/todo"; 433 fileName += "/todo";
427 fileName = KFileDialog::getSaveFileName( fileName , "Save as Todo template", this ); 434 fileName = KFileDialog::getSaveFileName( fileName , "Save as Todo template", this );
428 if ( fileName.length() > 0 ) 435 if ( fileName.length() > 0 )
429 saveTemplate( fileName ); 436 saveTemplate( fileName );
430} 437}
431 438
432void KOTodoEditor::saveTemplate( const QString &templateName ) 439void KOTodoEditor::saveTemplate( const QString &templateName )
433{ 440{
434 Todo *todo = new Todo; 441 Todo *todo = new Todo;
435 writeTodo( todo ); 442 writeTodo( todo );
436 saveAsTemplate( todo, templateName ); 443 saveAsTemplate( todo, templateName );
437} 444}
diff --git a/korganizer/kotodoview.cpp b/korganizer/kotodoview.cpp
index 25be63a..f26d16d 100644
--- a/korganizer/kotodoview.cpp
+++ b/korganizer/kotodoview.cpp
@@ -1,1444 +1,1445 @@
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 28
29#include <qvbox.h> 29#include <qvbox.h>
30#include <kdebug.h> 30#include <kdebug.h>
31#include "koprefs.h" 31#include "koprefs.h"
32#include <klocale.h> 32#include <klocale.h>
33#include <kglobal.h> 33#include <kglobal.h>
34#include <kiconloader.h> 34#include <kiconloader.h>
35#include <kmessagebox.h> 35#include <kmessagebox.h>
36 36
37#include <libkcal/icaldrag.h> 37#include <libkcal/icaldrag.h>
38#include <libkcal/vcaldrag.h> 38#include <libkcal/vcaldrag.h>
39#include <libkcal/calfilter.h> 39#include <libkcal/calfilter.h>
40#include <libkcal/dndfactory.h> 40#include <libkcal/dndfactory.h>
41#include <libkcal/calendarresources.h> 41#include <libkcal/calendarresources.h>
42#include <libkcal/resourcecalendar.h> 42#include <libkcal/resourcecalendar.h>
43#include <kresources/resourceselectdialog.h> 43#include <kresources/resourceselectdialog.h>
44#include <libkcal/kincidenceformatter.h> 44#include <libkcal/kincidenceformatter.h>
45#ifndef DESKTOP_VERSION 45#ifndef DESKTOP_VERSION
46#include <qpe/qpeapplication.h> 46#include <qpe/qpeapplication.h>
47#else 47#else
48#include <qapplication.h> 48#include <qapplication.h>
49#endif 49#endif
50#ifndef KORG_NOPRINTER 50#ifndef KORG_NOPRINTER
51#include "calprinter.h" 51#include "calprinter.h"
52#endif 52#endif
53#include "docprefs.h" 53#include "docprefs.h"
54 54
55#include "kotodoview.h" 55#include "kotodoview.h"
56using namespace KOrg; 56using namespace KOrg;
57 57
58 58
59class KOTodoViewWhatsThis :public QWhatsThis 59class KOTodoViewWhatsThis :public QWhatsThis
60{ 60{
61public: 61public:
62 KOTodoViewWhatsThis( QWidget *wid, KOTodoView* view ) : QWhatsThis( wid ), _wid(wid),_view (view) { }; 62 KOTodoViewWhatsThis( QWidget *wid, KOTodoView* view ) : QWhatsThis( wid ), _wid(wid),_view (view) { };
63 63
64protected: 64protected:
65 virtual QString text( const QPoint& p) 65 virtual QString text( const QPoint& p)
66 { 66 {
67 return _view->getWhatsThisText(p) ; 67 return _view->getWhatsThisText(p) ;
68 } 68 }
69private: 69private:
70 QWidget* _wid; 70 QWidget* _wid;
71 KOTodoView * _view; 71 KOTodoView * _view;
72}; 72};
73 73
74KOTodoListView::KOTodoListView(Calendar *calendar,QWidget *parent, 74KOTodoListView::KOTodoListView(Calendar *calendar,QWidget *parent,
75 const char *name) : 75 const char *name) :
76 KListView(parent,name) 76 KListView(parent,name)
77{ 77{
78 mName = QString ( name ); 78 mName = QString ( name );
79 mCalendar = calendar; 79 mCalendar = calendar;
80#ifndef DESKTOP_VERSION 80#ifndef DESKTOP_VERSION
81 QPEApplication::setStylusOperation(viewport(), QPEApplication::RightOnHold ); 81 QPEApplication::setStylusOperation(viewport(), QPEApplication::RightOnHold );
82#endif 82#endif
83 mOldCurrent = 0; 83 mOldCurrent = 0;
84 mMousePressed = false; 84 mMousePressed = false;
85 85
86 setAcceptDrops(true); 86 setAcceptDrops(true);
87 viewport()->setAcceptDrops(true); 87 viewport()->setAcceptDrops(true);
88 int size = 16; 88 int size = 16;
89 if (qApp->desktop()->width() < 300 ) 89 if (qApp->desktop()->width() < 300 )
90 size = 12; 90 size = 12;
91 setTreeStepSize( size + 6 ); 91 setTreeStepSize( size + 6 );
92 92
93} 93}
94 94
95void KOTodoListView::contentsDragEnterEvent(QDragEnterEvent *e) 95void KOTodoListView::contentsDragEnterEvent(QDragEnterEvent *e)
96{ 96{
97#ifndef KORG_NODND 97#ifndef KORG_NODND
98// kdDebug() << "KOTodoListView::contentsDragEnterEvent" << endl; 98// kdDebug() << "KOTodoListView::contentsDragEnterEvent" << endl;
99 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) && 99 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) &&
100 !QTextDrag::canDecode( e ) ) { 100 !QTextDrag::canDecode( e ) ) {
101 e->ignore(); 101 e->ignore();
102 return; 102 return;
103 } 103 }
104 104
105 mOldCurrent = currentItem(); 105 mOldCurrent = currentItem();
106#endif 106#endif
107} 107}
108 108
109 109
110void KOTodoListView::contentsDragMoveEvent(QDragMoveEvent *e) 110void KOTodoListView::contentsDragMoveEvent(QDragMoveEvent *e)
111{ 111{
112#ifndef KORG_NODND 112#ifndef KORG_NODND
113// kdDebug() << "KOTodoListView::contentsDragMoveEvent" << endl; 113// kdDebug() << "KOTodoListView::contentsDragMoveEvent" << endl;
114 114
115 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) && 115 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) &&
116 !QTextDrag::canDecode( e ) ) { 116 !QTextDrag::canDecode( e ) ) {
117 e->ignore(); 117 e->ignore();
118 return; 118 return;
119 } 119 }
120 120
121 e->accept(); 121 e->accept();
122#endif 122#endif
123} 123}
124 124
125void KOTodoListView::contentsDragLeaveEvent(QDragLeaveEvent *) 125void KOTodoListView::contentsDragLeaveEvent(QDragLeaveEvent *)
126{ 126{
127#ifndef KORG_NODND 127#ifndef KORG_NODND
128// kdDebug() << "KOTodoListView::contentsDragLeaveEvent" << endl; 128// kdDebug() << "KOTodoListView::contentsDragLeaveEvent" << endl;
129 129
130 setCurrentItem(mOldCurrent); 130 setCurrentItem(mOldCurrent);
131 setSelected(mOldCurrent,true); 131 setSelected(mOldCurrent,true);
132#endif 132#endif
133} 133}
134 134
135void KOTodoListView::contentsDropEvent(QDropEvent *e) 135void KOTodoListView::contentsDropEvent(QDropEvent *e)
136{ 136{
137#ifndef KORG_NODND 137#ifndef KORG_NODND
138// kdDebug() << "KOTodoListView::contentsDropEvent" << endl; 138// kdDebug() << "KOTodoListView::contentsDropEvent" << endl;
139 139
140 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) && 140 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) &&
141 !QTextDrag::canDecode( e ) ) { 141 !QTextDrag::canDecode( e ) ) {
142 e->ignore(); 142 e->ignore();
143 return; 143 return;
144 } 144 }
145 145
146 DndFactory factory( mCalendar ); 146 DndFactory factory( mCalendar );
147 Todo *todo = factory.createDropTodo(e); 147 Todo *todo = factory.createDropTodo(e);
148 148
149 if (todo) { 149 if (todo) {
150 e->acceptAction(); 150 e->acceptAction();
151 151
152 KOTodoViewItem *destination = 152 KOTodoViewItem *destination =
153 (KOTodoViewItem *)itemAt(contentsToViewport(e->pos())); 153 (KOTodoViewItem *)itemAt(contentsToViewport(e->pos()));
154 Todo *destinationEvent = 0; 154 Todo *destinationEvent = 0;
155 if (destination) destinationEvent = destination->todo(); 155 if (destination) destinationEvent = destination->todo();
156 156
157 Todo *existingTodo = mCalendar->todo(todo->uid()); 157 Todo *existingTodo = mCalendar->todo(todo->uid());
158 158
159 if(existingTodo) { 159 if(existingTodo) {
160 Incidence *to = destinationEvent; 160 Incidence *to = destinationEvent;
161 while(to) { 161 while(to) {
162 if (to->uid() == todo->uid()) { 162 if (to->uid() == todo->uid()) {
163 KMessageBox::sorry(this, 163 KMessageBox::sorry(this,
164 i18n("Cannot move Todo to itself\nor a child of itself"), 164 i18n("Cannot move Todo to itself\nor a child of itself"),
165 i18n("Drop Todo")); 165 i18n("Drop Todo"));
166 delete todo; 166 delete todo;
167 return; 167 return;
168 } 168 }
169 to = to->relatedTo(); 169 to = to->relatedTo();
170 } 170 }
171 internalDrop = true; 171 internalDrop = true;
172 if ( destinationEvent ) 172 if ( destinationEvent )
173 reparentTodoSignal( destinationEvent, existingTodo ); 173 reparentTodoSignal( destinationEvent, existingTodo );
174 else 174 else
175 unparentTodoSignal(existingTodo); 175 unparentTodoSignal(existingTodo);
176 delete todo; 176 delete todo;
177 } else { 177 } else {
178 mCalendar->addTodo(todo); 178 mCalendar->addTodo(todo);
179 emit todoDropped(todo, KOGlobals::EVENTADDED); 179 emit todoDropped(todo, KOGlobals::EVENTADDED);
180 if ( destinationEvent ) 180 if ( destinationEvent )
181 reparentTodoSignal( destinationEvent, todo ); 181 reparentTodoSignal( destinationEvent, todo );
182 } 182 }
183 } 183 }
184 else { 184 else {
185 QString text; 185 QString text;
186 if (QTextDrag::decode(e,text)) { 186 if (QTextDrag::decode(e,text)) {
187 //QListViewItem *qlvi = itemAt( contentsToViewport(e->pos()) ); 187 //QListViewItem *qlvi = itemAt( contentsToViewport(e->pos()) );
188 KOTodoViewItem *todoi = static_cast<KOTodoViewItem *>(itemAt( contentsToViewport(e->pos()) )); 188 KOTodoViewItem *todoi = static_cast<KOTodoViewItem *>(itemAt( contentsToViewport(e->pos()) ));
189 qDebug("Dropped : " + text); 189 qDebug("Dropped : " + text);
190 QStringList emails = QStringList::split(",",text); 190 QStringList emails = QStringList::split(",",text);
191 for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) { 191 for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) {
192 int pos = (*it).find("<"); 192 int pos = (*it).find("<");
193 QString name = (*it).left(pos); 193 QString name = (*it).left(pos);
194 QString email = (*it).mid(pos); 194 QString email = (*it).mid(pos);
195 if (!email.isEmpty() && todoi) { 195 if (!email.isEmpty() && todoi) {
196 todoi->todo()->addAttendee(new Attendee(name,email)); 196 todoi->todo()->addAttendee(new Attendee(name,email));
197 } 197 }
198 } 198 }
199 } 199 }
200 else { 200 else {
201 qDebug("KOTodoListView::contentsDropEvent(): Todo from drop not decodable "); 201 qDebug("KOTodoListView::contentsDropEvent(): Todo from drop not decodable ");
202 e->ignore(); 202 e->ignore();
203 } 203 }
204 } 204 }
205#endif 205#endif
206} 206}
207void KOTodoListView::wheelEvent (QWheelEvent *e) 207void KOTodoListView::wheelEvent (QWheelEvent *e)
208{ 208{
209 QListView::wheelEvent (e); 209 QListView::wheelEvent (e);
210} 210}
211 211
212void KOTodoListView::contentsMousePressEvent(QMouseEvent* e) 212void KOTodoListView::contentsMousePressEvent(QMouseEvent* e)
213{ 213{
214 214
215 QPoint p(contentsToViewport(e->pos())); 215 QPoint p(contentsToViewport(e->pos()));
216 QListViewItem *i = itemAt(p); 216 QListViewItem *i = itemAt(p);
217 bool rootClicked = true; 217 bool rootClicked = true;
218 if (i) { 218 if (i) {
219 // if the user clicked into the root decoration of the item, don't 219 // if the user clicked into the root decoration of the item, don't
220 // try to start a drag! 220 // try to start a drag!
221 int X = p.x(); 221 int X = p.x();
222 //qDebug("%d %d %d", X, header()->sectionPos(0), treeStepSize() ); 222 //qDebug("%d %d %d", X, header()->sectionPos(0), treeStepSize() );
223 if (X > header()->sectionPos(0) + 223 if (X > header()->sectionPos(0) +
224 treeStepSize() * (i->depth() + (rootIsDecorated() ? 1 : 0)) + 224 treeStepSize() * (i->depth() + (rootIsDecorated() ? 1 : 0)) +
225 itemMargin() +i->height()|| 225 itemMargin() +i->height()||
226 X < header()->sectionPos(0)) { 226 X < header()->sectionPos(0)) {
227 rootClicked = false; 227 rootClicked = false;
228 } 228 }
229 } else { 229 } else {
230 rootClicked = false; 230 rootClicked = false;
231 } 231 }
232#ifndef KORG_NODND 232#ifndef KORG_NODND
233 mMousePressed = false; 233 mMousePressed = false;
234 if (! rootClicked && !( e->button() == RightButton) ) { 234 if (! rootClicked && !( e->button() == RightButton) ) {
235 mPressPos = e->pos(); 235 mPressPos = e->pos();
236 mMousePressed = true; 236 mMousePressed = true;
237 } else { 237 } else {
238 mMousePressed = false; 238 mMousePressed = false;
239 } 239 }
240#endif 240#endif
241 //qDebug("KOTodoListView::contentsMousePressEvent %d", rootClicked); 241 //qDebug("KOTodoListView::contentsMousePressEvent %d", rootClicked);
242#ifndef DESKTOP_VERSION 242#ifndef DESKTOP_VERSION
243 if (!( e->button() == RightButton && rootClicked) ) 243 if (!( e->button() == RightButton && rootClicked) )
244 QListView::contentsMousePressEvent(e); 244 QListView::contentsMousePressEvent(e);
245#else 245#else
246 QListView::contentsMousePressEvent(e); 246 QListView::contentsMousePressEvent(e);
247#endif 247#endif
248} 248}
249void KOTodoListView::paintEvent(QPaintEvent* e) 249void KOTodoListView::paintEvent(QPaintEvent* e)
250{ 250{
251 emit paintNeeded(); 251 emit paintNeeded();
252 QListView::paintEvent( e); 252 QListView::paintEvent( e);
253} 253}
254void KOTodoListView::contentsMouseMoveEvent(QMouseEvent* e) 254void KOTodoListView::contentsMouseMoveEvent(QMouseEvent* e)
255{ 255{
256 256
257#ifndef KORG_NODND 257#ifndef KORG_NODND
258 //QListView::contentsMouseMoveEvent(e); 258 //QListView::contentsMouseMoveEvent(e);
259 if (mMousePressed && (mPressPos - e->pos()).manhattanLength() > 259 if (mMousePressed && (mPressPos - e->pos()).manhattanLength() >
260 QApplication::startDragDistance()*3) { 260 QApplication::startDragDistance()*3) {
261 mMousePressed = false; 261 mMousePressed = false;
262 QListViewItem *item = itemAt(contentsToViewport(mPressPos)); 262 QListViewItem *item = itemAt(contentsToViewport(mPressPos));
263 if (item) { 263 if (item) {
264 DndFactory factory( mCalendar ); 264 DndFactory factory( mCalendar );
265 ICalDrag *vd = factory.createDrag( 265 ICalDrag *vd = factory.createDrag(
266 ((KOTodoViewItem *)item)->todo(),viewport()); 266 ((KOTodoViewItem *)item)->todo(),viewport());
267 internalDrop = false; 267 internalDrop = false;
268 // we cannot do any senseful here, because the DnD is still broken in Qt 268 // we cannot do any senseful here, because the DnD is still broken in Qt
269 if (vd->drag()) { 269 if (vd->drag()) {
270 if ( !internalDrop ) { 270 if ( !internalDrop ) {
271 //emit deleteTodo( ((KOTodoViewItem *)item)->todo() ); 271 //emit deleteTodo( ((KOTodoViewItem *)item)->todo() );
272 qDebug("Dnd: External move: Delete drag source "); 272 qDebug("Dnd: External move: Delete drag source ");
273 } else 273 } else
274 qDebug("Dnd: Internal move "); 274 qDebug("Dnd: Internal move ");
275 275
276 } else { 276 } else {
277 if ( !internalDrop ) { 277 if ( !internalDrop ) {
278 qDebug("Dnd: External Copy"); 278 qDebug("Dnd: External Copy");
279 } else 279 } else
280 qDebug("DnD: Internal copy: Copy pending"); 280 qDebug("DnD: Internal copy: Copy pending");
281 } 281 }
282 } 282 }
283 } 283 }
284#endif 284#endif
285} 285}
286void KOTodoListView::keyReleaseEvent ( QKeyEvent *e ) 286void KOTodoListView::keyReleaseEvent ( QKeyEvent *e )
287{ 287{
288 if ( !e->isAutoRepeat() ) { 288 if ( !e->isAutoRepeat() ) {
289 mFlagKeyPressed = false; 289 mFlagKeyPressed = false;
290 } 290 }
291} 291}
292 292
293 293
294void KOTodoListView::keyPressEvent ( QKeyEvent * e ) 294void KOTodoListView::keyPressEvent ( QKeyEvent * e )
295{ 295{
296 qApp->processEvents(); 296 qApp->processEvents();
297 if ( e->isAutoRepeat() && !mFlagKeyPressed ) { 297 if ( e->isAutoRepeat() && !mFlagKeyPressed ) {
298 e->ignore(); 298 e->ignore();
299 // qDebug(" ignore %d",e->isAutoRepeat() ); 299 // qDebug(" ignore %d",e->isAutoRepeat() );
300 return; 300 return;
301 } 301 }
302 if (! e->isAutoRepeat() ) 302 if (! e->isAutoRepeat() )
303 mFlagKeyPressed = true; 303 mFlagKeyPressed = true;
304 QListViewItem* cn; 304 QListViewItem* cn;
305 if ( e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter ) { 305 if ( e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter ) {
306 cn = currentItem(); 306 cn = currentItem();
307 if ( cn ) { 307 if ( cn ) {
308 KOTodoViewItem* ci = (KOTodoViewItem*)( cn ); 308 KOTodoViewItem* ci = (KOTodoViewItem*)( cn );
309 if ( ci ){ 309 if ( ci ){
310 if ( e->state() == ShiftButton ) 310 if ( e->state() == ShiftButton )
311 ci->setOn( false ); 311 ci->setOn( false );
312 else 312 else
313 ci->setOn( true ); 313 ci->setOn( true );
314 cn = cn->itemBelow(); 314 cn = cn->itemBelow();
315 if ( cn ) { 315 if ( cn ) {
316 setCurrentItem ( cn ); 316 setCurrentItem ( cn );
317 ensureItemVisible ( cn ); 317 ensureItemVisible ( cn );
318 } 318 }
319 319
320 } 320 }
321 } 321 }
322 322
323 return; 323 return;
324 } 324 }
325 325
326 if ( e->state() == Qt::ControlButton || e->state() == Qt::ShiftButton || mName != "todolistsmall" ) { 326 if ( e->state() == Qt::ControlButton || e->state() == Qt::ShiftButton || mName != "todolistsmall" ) {
327 switch ( e->key() ) { 327 switch ( e->key() ) {
328 case Qt::Key_Down: 328 case Qt::Key_Down:
329 case Qt::Key_Up: 329 case Qt::Key_Up:
330 QListView::keyPressEvent ( e ); 330 QListView::keyPressEvent ( e );
331 break; 331 break;
332 case Qt::Key_Left: 332 case Qt::Key_Left:
333 case Qt::Key_Right: 333 case Qt::Key_Right:
334 QListView::keyPressEvent ( e ); 334 QListView::keyPressEvent ( e );
335 e->accept(); 335 e->accept();
336 return; 336 return;
337 break; 337 break;
338 default: 338 default:
339 e->ignore(); 339 e->ignore();
340 break; 340 break;
341 } 341 }
342 return; 342 return;
343 } 343 }
344 e->ignore(); 344 e->ignore();
345} 345}
346void KOTodoListView::contentsMouseReleaseEvent(QMouseEvent *e) 346void KOTodoListView::contentsMouseReleaseEvent(QMouseEvent *e)
347{ 347{
348 QListView::contentsMouseReleaseEvent(e); 348 QListView::contentsMouseReleaseEvent(e);
349 mMousePressed = false; 349 mMousePressed = false;
350} 350}
351 351
352void KOTodoListView::contentsMouseDoubleClickEvent(QMouseEvent *e) 352void KOTodoListView::contentsMouseDoubleClickEvent(QMouseEvent *e)
353{ 353{
354 if (!e) return; 354 if (!e) return;
355 355
356 QPoint vp = contentsToViewport(e->pos()); 356 QPoint vp = contentsToViewport(e->pos());
357 357
358 QListViewItem *item = itemAt(vp); 358 QListViewItem *item = itemAt(vp);
359 359
360 emit double_Clicked(item); 360 emit double_Clicked(item);
361 if (!item) return; 361 if (!item) return;
362 362
363 emit doubleClicked(item,vp,0); 363 emit doubleClicked(item,vp,0);
364} 364}
365 365
366///////////////////////////////////////////////////////////////////////////// 366/////////////////////////////////////////////////////////////////////////////
367 367
368KOQuickTodo::KOQuickTodo(QWidget *parent) : 368KOQuickTodo::KOQuickTodo(QWidget *parent) :
369 QLineEdit(parent) 369 QLineEdit(parent)
370{ 370{
371 setText(i18n("Click to add a new Todo")); 371 setText(i18n("Click to add a new Todo"));
372} 372}
373 373
374void KOQuickTodo::focusInEvent(QFocusEvent *ev) 374void KOQuickTodo::focusInEvent(QFocusEvent *ev)
375{ 375{
376 if ( text()==i18n("Click to add a new Todo") ) 376 if ( text()==i18n("Click to add a new Todo") )
377 setText(""); 377 setText("");
378 QLineEdit::focusInEvent(ev); 378 QLineEdit::focusInEvent(ev);
379} 379}
380 380
381void KOQuickTodo::focusOutEvent(QFocusEvent *ev) 381void KOQuickTodo::focusOutEvent(QFocusEvent *ev)
382{ 382{
383 setText(i18n("Click to add a new Todo")); 383 setText(i18n("Click to add a new Todo"));
384 QLineEdit::focusOutEvent(ev); 384 QLineEdit::focusOutEvent(ev);
385} 385}
386 386
387///////////////////////////////////////////////////////////////////////////// 387/////////////////////////////////////////////////////////////////////////////
388 388
389KOTodoView::KOTodoView(Calendar *calendar,QWidget* parent,const char* name) : 389KOTodoView::KOTodoView(Calendar *calendar,QWidget* parent,const char* name) :
390 KOrg::BaseView(calendar,parent,name) 390 KOrg::BaseView(calendar,parent,name)
391{ 391{
392 mPendingUpdateBeforeRepaint = false; 392 mPendingUpdateBeforeRepaint = false;
393 isFlatDisplay = false; 393 isFlatDisplay = false;
394 mNavigator = 0; 394 mNavigator = 0;
395 QBoxLayout *topLayout = new QVBoxLayout(this); 395 QBoxLayout *topLayout = new QVBoxLayout(this);
396 mName = QString ( name ); 396 mName = QString ( name );
397 mBlockUpdate = false; 397 mBlockUpdate = false;
398 mQuickAdd = new KOQuickTodo(this); 398 mQuickAdd = new KOQuickTodo(this);
399 topLayout->addWidget(mQuickAdd); 399 topLayout->addWidget(mQuickAdd);
400 400
401 if ( !KOPrefs::instance()->mEnableQuickTodo ) mQuickAdd->hide(); 401 if ( !KOPrefs::instance()->mEnableQuickTodo ) mQuickAdd->hide();
402 402
403 mTodoListView = new KOTodoListView(calendar,this, name ); 403 mTodoListView = new KOTodoListView(calendar,this, name );
404 topLayout->addWidget(mTodoListView); 404 topLayout->addWidget(mTodoListView);
405 //mTodoListView->header()->setMaximumHeight(30); 405 //mTodoListView->header()->setMaximumHeight(30);
406 mTodoListView->setRootIsDecorated(true); 406 mTodoListView->setRootIsDecorated(true);
407 mTodoListView->setAllColumnsShowFocus(true); 407 mTodoListView->setAllColumnsShowFocus(true);
408 408
409 mTodoListView->setShowSortIndicator(true); 409 mTodoListView->setShowSortIndicator(true);
410 410
411 mTodoListView->addColumn(i18n("Todo")); 411 mTodoListView->addColumn(i18n("Todo"));
412 mTodoListView->addColumn(i18n("Prio")); 412 mTodoListView->addColumn(i18n("Prio"));
413 mTodoListView->setColumnAlignment(1,AlignHCenter); 413 mTodoListView->setColumnAlignment(1,AlignHCenter);
414 mTodoListView->addColumn(i18n("Complete")); 414 mTodoListView->addColumn(i18n("Complete"));
415 mTodoListView->setColumnAlignment(2,AlignCenter); 415 mTodoListView->setColumnAlignment(2,AlignCenter);
416 416
417 mTodoListView->addColumn(i18n("Due Date")); 417 mTodoListView->addColumn(i18n("Due Date"));
418 mTodoListView->setColumnAlignment(3,AlignLeft); 418 mTodoListView->setColumnAlignment(3,AlignLeft);
419 mTodoListView->addColumn(i18n("Due Time")); 419 mTodoListView->addColumn(i18n("Due Time"));
420 mTodoListView->setColumnAlignment(4,AlignHCenter); 420 mTodoListView->setColumnAlignment(4,AlignHCenter);
421 421
422 mTodoListView->addColumn(i18n("Start Date")); 422 mTodoListView->addColumn(i18n("Start Date"));
423 mTodoListView->setColumnAlignment(5,AlignLeft); 423 mTodoListView->setColumnAlignment(5,AlignLeft);
424 mTodoListView->addColumn(i18n("Start Time")); 424 mTodoListView->addColumn(i18n("Start Time"));
425 mTodoListView->setColumnAlignment(6,AlignHCenter); 425 mTodoListView->setColumnAlignment(6,AlignHCenter);
426 426
427 mTodoListView->addColumn(i18n("Cancelled")); 427 mTodoListView->addColumn(i18n("Cancelled"));
428 mTodoListView->addColumn(i18n("Categories")); 428 mTodoListView->addColumn(i18n("Categories"));
429#if 0 429#if 0
430 mTodoListView->addColumn(i18n("Sort Id")); 430 mTodoListView->addColumn(i18n("Sort Id"));
431 mTodoListView->setColumnAlignment(4,AlignHCenter); 431 mTodoListView->setColumnAlignment(4,AlignHCenter);
432#endif 432#endif
433 433
434 mTodoListView->setMinimumHeight( 60 ); 434 mTodoListView->setMinimumHeight( 60 );
435 mTodoListView->setItemsRenameable( true ); 435 mTodoListView->setItemsRenameable( true );
436 mTodoListView->setRenameable( 0 ); 436 mTodoListView->setRenameable( 0 );
437 mTodoListView->setColumnWidth( 0, 120 ); 437 mTodoListView->setColumnWidth( 0, 120 );
438 mTodoListView->setColumnWidthMode(0, QListView::Manual); 438 mTodoListView->setColumnWidthMode(0, QListView::Manual);
439 mTodoListView->setColumnWidthMode(1, QListView::Manual); 439 mTodoListView->setColumnWidthMode(1, QListView::Manual);
440 mTodoListView->setColumnWidthMode(2, QListView::Manual); 440 mTodoListView->setColumnWidthMode(2, QListView::Manual);
441 mTodoListView->setColumnWidthMode(3, QListView::Manual); 441 mTodoListView->setColumnWidthMode(3, QListView::Manual);
442 mTodoListView->setColumnWidthMode(4, QListView::Manual); 442 mTodoListView->setColumnWidthMode(4, QListView::Manual);
443 mTodoListView->setColumnWidthMode(5, QListView::Manual); 443 mTodoListView->setColumnWidthMode(5, QListView::Manual);
444 mTodoListView->setColumnWidthMode(6, QListView::Manual); 444 mTodoListView->setColumnWidthMode(6, QListView::Manual);
445 mTodoListView->setColumnWidthMode(7, QListView::Manual); 445 mTodoListView->setColumnWidthMode(7, QListView::Manual);
446 mTodoListView->setColumnWidthMode(8, QListView::Manual); 446 mTodoListView->setColumnWidthMode(8, QListView::Manual);
447 447
448 448
449 mKOTodoViewWhatsThis = new KOTodoViewWhatsThis(mTodoListView->viewport(),this); 449 mKOTodoViewWhatsThis = new KOTodoViewWhatsThis(mTodoListView->viewport(),this);
450 450
451 mPriorityPopupMenu = new QPopupMenu(this); 451 mPriorityPopupMenu = new QPopupMenu(this);
452 for (int i = 1; i <= 5; i++) { 452 for (int i = 1; i <= 5; i++) {
453 QString label = QString ("%1").arg (i); 453 QString label = QString ("%1").arg (i);
454 mPriority[mPriorityPopupMenu->insertItem (label)] = i; 454 mPriority[mPriorityPopupMenu->insertItem (label)] = i;
455 } 455 }
456 connect (mPriorityPopupMenu, SIGNAL(activated (int)), SLOT (setNewPriority(int))); 456 connect (mPriorityPopupMenu, SIGNAL(activated (int)), SLOT (setNewPriority(int)));
457 457
458 mPercentageCompletedPopupMenu = new QPopupMenu(this); 458 mPercentageCompletedPopupMenu = new QPopupMenu(this);
459 for (int i = 0; i <= 100; i+=20) { 459 for (int i = 0; i <= 100; i+=20) {
460 QString label = QString ("%1 %").arg (i); 460 QString label = QString ("%1 %").arg (i);
461 mPercentage[mPercentageCompletedPopupMenu->insertItem (label)] = i; 461 mPercentage[mPercentageCompletedPopupMenu->insertItem (label)] = i;
462 } 462 }
463 connect (mPercentageCompletedPopupMenu, SIGNAL (activated (int)), SLOT (setNewPercentage (int))); 463 connect (mPercentageCompletedPopupMenu, SIGNAL (activated (int)), SLOT (setNewPercentage (int)));
464 464
465 465
466 466
467 mItemPopupMenu = new QPopupMenu(this); 467 mItemPopupMenu = new QPopupMenu(this);
468 mItemPopupMenu->insertItem( i18n("Start/Stop todo..."), this,
469 SLOT (toggleRunningItem()));
470 mItemPopupMenu->insertSeparator();
471 mItemPopupMenu->insertItem(i18n("Show..."), this, 468 mItemPopupMenu->insertItem(i18n("Show..."), this,
472 SLOT (showTodo())); 469 SLOT (showTodo()));
473 mItemPopupMenu->insertItem(i18n("Edit..."), this, 470 mItemPopupMenu->insertItem(i18n("Edit..."), this,
474 SLOT (editTodo())); 471 SLOT (editTodo()));
475 mItemPopupMenu->insertItem( i18n("Delete"), this, 472 mItemPopupMenu->insertItem( i18n("Delete"), this,
476 SLOT (deleteTodo())); 473 SLOT (deleteTodo()));
477 mItemPopupMenu->insertItem( i18n("Clone..."), this, 474 mItemPopupMenu->insertItem( i18n("Clone..."), this,
478 SLOT (cloneTodo())); 475 SLOT (cloneTodo()));
479 mItemPopupMenu->insertItem( i18n("Move..."), this, 476 mItemPopupMenu->insertItem( i18n("Move..."), this,
480 SLOT (moveTodo())); 477 SLOT (moveTodo()));
481 mItemPopupMenu->insertItem( i18n("Beam..."), this, 478 mItemPopupMenu->insertItem( i18n("Beam..."), this,
482 SLOT (beamTodo())); 479 SLOT (beamTodo()));
483 mItemPopupMenu->insertItem( i18n("Toggle Cancel"), this, 480 mItemPopupMenu->insertItem( i18n("Toggle Cancel"), this,
484 SLOT (cancelTodo())); 481 SLOT (cancelTodo()));
485 mItemPopupMenu->insertSeparator(); 482 mItemPopupMenu->insertSeparator();
483 mItemPopupMenu->insertItem( i18n("Start/Stop todo..."), this,
484 SLOT (toggleRunningItem()));
485 mItemPopupMenu->insertSeparator();
486 /* 486 /*
487 mItemPopupMenu->insertItem( i18n("New Todo..."), this, 487 mItemPopupMenu->insertItem( i18n("New Todo..."), this,
488 SLOT (newTodo())); 488 SLOT (newTodo()));
489 */ 489 */
490 mItemPopupMenu->insertItem(i18n("New Sub-Todo..."), this, 490 mItemPopupMenu->insertItem(i18n("New Sub-Todo..."), this,
491 SLOT (newSubTodo())); 491 SLOT (newSubTodo()));
492 mItemPopupMenu->insertItem(i18n("Unparent Todo"), this, 492 mItemPopupMenu->insertItem(i18n("Unparent Todo"), this,
493 SLOT (unparentTodo()),0,21); 493 SLOT (unparentTodo()),0,21);
494 mItemPopupMenu->insertItem(i18n("Reparent Todo"), this, 494 mItemPopupMenu->insertItem(i18n("Reparent Todo"), this,
495 SLOT (reparentTodo()),0,22); 495 SLOT (reparentTodo()),0,22);
496 mItemPopupMenu->insertSeparator(); 496 mItemPopupMenu->insertSeparator();
497#if 0 497#if 0
498 mItemPopupMenu->insertItem(i18n("Delete completed To-Dos","Purge Completed"), 498 mItemPopupMenu->insertItem(i18n("Delete completed To-Dos","Purge Completed"),
499 this, SLOT( purgeCompleted() ) ); 499 this, SLOT( purgeCompleted() ) );
500 mItemPopupMenu->insertItem(i18n("toggle completed To-Dos","Show Completed"), 500 mItemPopupMenu->insertItem(i18n("toggle completed To-Dos","Show Completed"),
501 this, SLOT( toggleCompleted() ),0, 33 ); 501 this, SLOT( toggleCompleted() ),0, 33 );
502 mItemPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"), 502 mItemPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"),
503 this, SLOT( toggleQuickTodo() ),0, 34 ); 503 this, SLOT( toggleQuickTodo() ),0, 34 );
504 mItemPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"), 504 mItemPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"),
505 this, SLOT( toggleRunning() ),0, 35 ); 505 this, SLOT( toggleRunning() ),0, 35 );
506 506
507#endif 507#endif
508 mPopupMenu = new QPopupMenu(this); 508 mPopupMenu = new QPopupMenu(this);
509 mPopupMenu->insertItem(SmallIconSet("todo"), i18n("New Todo..."), this, 509 mPopupMenu->insertItem(SmallIconSet("todo"), i18n("New Todo..."), this,
510 SLOT (newTodo()),0,1); 510 SLOT (newTodo()),0,1);
511 mPopupMenu->insertItem(i18n("delete completed To-Dos","Purge Completed"), 511 mPopupMenu->insertItem(i18n("delete completed To-Dos","Purge Completed"),
512 this, SLOT(purgeCompleted()),0,2); 512 this, SLOT(purgeCompleted()),0,2);
513 mPopupMenu->insertItem(i18n("Show Completed"), 513 mPopupMenu->insertItem(i18n("Show Completed"),
514 this, SLOT( toggleCompleted() ),0,3 ); 514 this, SLOT( toggleCompleted() ),0,3 );
515 mPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"),
516 this, SLOT( toggleQuickTodo() ),0,4 );
517 mPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"), 515 mPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"),
518 this, SLOT( toggleRunning() ),0,5 ); 516 this, SLOT( toggleRunning() ),0,5 );
519 mPopupMenu->insertItem(i18n(" set all open","Display all opened"), 517 mPopupMenu->insertItem(i18n(" set all open","Display all opened"),
520 this, SLOT( setAllOpen() ),0,6 ); 518 this, SLOT( setAllOpen() ),0,6 );
521 mPopupMenu->insertItem(i18n(" set all close","Display all closed"), 519 mPopupMenu->insertItem(i18n(" set all close","Display all closed"),
522 this, SLOT( setAllClose() ),0,7 ); 520 this, SLOT( setAllClose() ),0,7 );
523 mPopupMenu->insertItem(i18n(" set all flat","Display all flat"), 521 mPopupMenu->insertItem(i18n(" set all flat","Display all flat"),
524 this, SLOT( setAllFlat() ),0,8 ); 522 this, SLOT( setAllFlat() ),0,8 );
523 mPopupMenu->insertSeparator();
524 mPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"),
525 this, SLOT( toggleQuickTodo() ),0,4 );
525 mDocPrefs = new DocPrefs( name ); 526 mDocPrefs = new DocPrefs( name );
526 527
527 mItemPopupMenu->insertItem(i18n("Todo View"),mPopupMenu ); 528 mItemPopupMenu->insertItem(i18n("Todo View"),mPopupMenu );
528 mPopupMenu->setCheckable( true ); 529 mPopupMenu->setCheckable( true );
529 mItemPopupMenu->setCheckable( true ); 530 mItemPopupMenu->setCheckable( true );
530 531
531 532
532 mPopupMenu->setItemChecked( 3,KOPrefs::instance()->mShowCompletedTodo ); 533 mPopupMenu->setItemChecked( 3,KOPrefs::instance()->mShowCompletedTodo );
533 mItemPopupMenu->setItemChecked( 33 , KOPrefs::instance()->mShowCompletedTodo ); 534 mItemPopupMenu->setItemChecked( 33 , KOPrefs::instance()->mShowCompletedTodo );
534 535
535 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo); 536 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo);
536 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo ); 537 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo );
537 538
538 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos); 539 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos);
539 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos ); 540 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos );
540 541
541 542
542 // Double clicking conflicts with opening/closing the subtree 543 // Double clicking conflicts with opening/closing the subtree
543 connect( mTodoListView, SIGNAL( doubleClicked( QListViewItem *) ), 544 connect( mTodoListView, SIGNAL( doubleClicked( QListViewItem *) ),
544 SLOT( editItem( QListViewItem *) ) ); 545 SLOT( editItem( QListViewItem *) ) );
545 /* 546 /*
546 connect( mTodoListView, SIGNAL( rightButtonClicked ( QListViewItem *, 547 connect( mTodoListView, SIGNAL( rightButtonClicked ( QListViewItem *,
547 const QPoint &,int ) ), 548 const QPoint &,int ) ),
548 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) ); 549 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) );
549 */ 550 */
550 connect( mTodoListView, SIGNAL( contextRequest ( QListViewItem *, 551 connect( mTodoListView, SIGNAL( contextRequest ( QListViewItem *,
551 const QPoint &,int ) ), 552 const QPoint &,int ) ),
552 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) ); 553 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) );
553 connect( mTodoListView, SIGNAL( clicked( QListViewItem * ) ), 554 connect( mTodoListView, SIGNAL( clicked( QListViewItem * ) ),
554 SLOT( itemClicked( QListViewItem * ) ) ); 555 SLOT( itemClicked( QListViewItem * ) ) );
555 connect( mTodoListView, SIGNAL( double_Clicked( QListViewItem * ) ), 556 connect( mTodoListView, SIGNAL( double_Clicked( QListViewItem * ) ),
556 SLOT( itemDoubleClicked( QListViewItem * ) ) ); 557 SLOT( itemDoubleClicked( QListViewItem * ) ) );
557 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ), 558 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ),
558 SLOT( updateView() ) ); 559 SLOT( updateView() ) );
559 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ), 560 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ),
560 SLOT( todoModified(Todo *, int) ) ); 561 SLOT( todoModified(Todo *, int) ) );
561 connect( mTodoListView, SIGNAL( expanded( QListViewItem * ) ), 562 connect( mTodoListView, SIGNAL( expanded( QListViewItem * ) ),
562 SLOT( itemStateChanged( QListViewItem * ) ) ); 563 SLOT( itemStateChanged( QListViewItem * ) ) );
563 connect( mTodoListView, SIGNAL( collapsed( QListViewItem * ) ), 564 connect( mTodoListView, SIGNAL( collapsed( QListViewItem * ) ),
564 SLOT( itemStateChanged( QListViewItem * ) ) ); 565 SLOT( itemStateChanged( QListViewItem * ) ) );
565 connect( mTodoListView, SIGNAL( paintNeeded() ), 566 connect( mTodoListView, SIGNAL( paintNeeded() ),
566 SLOT( paintNeeded()) ); 567 SLOT( paintNeeded()) );
567 568
568#if 0 569#if 0
569 connect(mTodoListView,SIGNAL(selectionChanged(QListViewItem *)), 570 connect(mTodoListView,SIGNAL(selectionChanged(QListViewItem *)),
570 SLOT(selectionChanged(QListViewItem *))); 571 SLOT(selectionChanged(QListViewItem *)));
571 connect(mTodoListView,SIGNAL(clicked(QListViewItem *)), 572 connect(mTodoListView,SIGNAL(clicked(QListViewItem *)),
572 SLOT(selectionChanged(QListViewItem *))); 573 SLOT(selectionChanged(QListViewItem *)));
573 connect(mTodoListView,SIGNAL(pressed(QListViewItem *)), 574 connect(mTodoListView,SIGNAL(pressed(QListViewItem *)),
574 SLOT(selectionChanged(QListViewItem *))); 575 SLOT(selectionChanged(QListViewItem *)));
575#endif 576#endif
576 577
577 connect( mTodoListView, SIGNAL(reparentTodoSignal( Todo *,Todo * ) ), SIGNAL(reparentTodoSignal( Todo *,Todo * ) )); 578 connect( mTodoListView, SIGNAL(reparentTodoSignal( Todo *,Todo * ) ), SIGNAL(reparentTodoSignal( Todo *,Todo * ) ));
578 connect( mTodoListView, SIGNAL(unparentTodoSignal(Todo *) ), SIGNAL(unparentTodoSignal(Todo *) )); 579 connect( mTodoListView, SIGNAL(unparentTodoSignal(Todo *) ), SIGNAL(unparentTodoSignal(Todo *) ));
579 connect( mTodoListView, SIGNAL( deleteTodo(Todo *) ), SIGNAL(deleteTodoSignal(Todo *) )); 580 connect( mTodoListView, SIGNAL( deleteTodo(Todo *) ), SIGNAL(deleteTodoSignal(Todo *) ));
580 581
581 connect( mTodoListView, SIGNAL(selectionChanged() ), 582 connect( mTodoListView, SIGNAL(selectionChanged() ),
582 SLOT( processSelectionChange() ) ); 583 SLOT( processSelectionChange() ) );
583 connect( mQuickAdd, SIGNAL( returnPressed () ), 584 connect( mQuickAdd, SIGNAL( returnPressed () ),
584 SLOT( addQuickTodo() ) ); 585 SLOT( addQuickTodo() ) );
585 586
586} 587}
587 588
588KOTodoView::~KOTodoView() 589KOTodoView::~KOTodoView()
589{ 590{
590 // delete mKOTodoViewWhatsThis; 591 // delete mKOTodoViewWhatsThis;
591 delete mDocPrefs; 592 delete mDocPrefs;
592} 593}
593QString KOTodoView::getWhatsThisText(QPoint p) 594QString KOTodoView::getWhatsThisText(QPoint p)
594{ 595{
595 KOTodoViewItem* item = ( KOTodoViewItem* ) mTodoListView->itemAt( p ); 596 KOTodoViewItem* item = ( KOTodoViewItem* ) mTodoListView->itemAt( p );
596 if ( item ) 597 if ( item )
597 return KIncidenceFormatter::instance()->getFormattedText( item->todo(), 598 return KIncidenceFormatter::instance()->getFormattedText( item->todo(),
598 KOPrefs::instance()->mWTshowDetails, 599 KOPrefs::instance()->mWTshowDetails,
599 KOPrefs::instance()->mWTshowCreated, 600 KOPrefs::instance()->mWTshowCreated,
600 KOPrefs::instance()->mWTshowChanged); 601 KOPrefs::instance()->mWTshowChanged);
601 return i18n("That is the todo view" ); 602 return i18n("That is the todo view" );
602 603
603} 604}
604 605
605void KOTodoView::jumpToDate () 606void KOTodoView::jumpToDate ()
606{ 607{
607 // if (mActiveItem) { 608 // if (mActiveItem) {
608// mActiveItem->todo()); 609// mActiveItem->todo());
609// if ( mActiveItem->todo()->hasDueDate() ) 610// if ( mActiveItem->todo()->hasDueDate() )
610// emit mActiveItem->todo()jumpToTime( mTodo->dtDue().date() ); 611// emit mActiveItem->todo()jumpToTime( mTodo->dtDue().date() );
611} 612}
612void KOTodoView::paintNeeded() 613void KOTodoView::paintNeeded()
613{ 614{
614 if ( mPendingUpdateBeforeRepaint ) { 615 if ( mPendingUpdateBeforeRepaint ) {
615 updateView(); 616 updateView();
616 mPendingUpdateBeforeRepaint = false; 617 mPendingUpdateBeforeRepaint = false;
617 } 618 }
618} 619}
619void KOTodoView::paintEvent(QPaintEvent * pevent) 620void KOTodoView::paintEvent(QPaintEvent * pevent)
620{ 621{
621 if ( mPendingUpdateBeforeRepaint ) { 622 if ( mPendingUpdateBeforeRepaint ) {
622 updateView(); 623 updateView();
623 mPendingUpdateBeforeRepaint = false; 624 mPendingUpdateBeforeRepaint = false;
624 } 625 }
625 KOrg::BaseView::paintEvent( pevent); 626 KOrg::BaseView::paintEvent( pevent);
626} 627}
627 628
628void KOTodoView::updateView() 629void KOTodoView::updateView()
629{ 630{
630 pendingSubtodo = 0; 631 pendingSubtodo = 0;
631 if ( mBlockUpdate ) { 632 if ( mBlockUpdate ) {
632 return; 633 return;
633 } 634 }
634 if ( !isVisible() ) { 635 if ( !isVisible() ) {
635 mPendingUpdateBeforeRepaint = true; 636 mPendingUpdateBeforeRepaint = true;
636 return; 637 return;
637 } 638 }
638 storeCurrentItem(); 639 storeCurrentItem();
639 //qDebug("KOTodoView::updateView() %x", this); 640 //qDebug("KOTodoView::updateView() %x", this);
640 if ( isFlatDisplay ) { 641 if ( isFlatDisplay ) {
641 displayAllFlat(); 642 displayAllFlat();
642 resetCurrentItem(); 643 resetCurrentItem();
643 return; 644 return;
644 } 645 }
645 //qDebug("update "); 646 //qDebug("update ");
646// kdDebug() << "KOTodoView::updateView()" << endl; 647// kdDebug() << "KOTodoView::updateView()" << endl;
647 QFont fo = KOPrefs::instance()->mTodoViewFont; 648 QFont fo = KOPrefs::instance()->mTodoViewFont;
648 649
649 650
650 mTodoListView->clear(); 651 mTodoListView->clear();
651 if ( mName == "todolistsmall" ) { 652 if ( mName == "todolistsmall" ) {
652 if ( KOPrefs::instance()->mTodoViewUsesSmallFont ) { 653 if ( KOPrefs::instance()->mTodoViewUsesSmallFont ) {
653 int ps = fo.pointSize() -2; 654 int ps = fo.pointSize() -2;
654 if ( ps > 12 ) 655 if ( ps > 12 )
655 ps -= 2; 656 ps -= 2;
656 fo.setPointSize( ps ); 657 fo.setPointSize( ps );
657 } 658 }
658 } 659 }
659 660
660 mTodoListView->setFont( fo ); 661 mTodoListView->setFont( fo );
661 // QFontMetrics fm ( KOPrefs::instance()->mTodoViewFont ); 662 // QFontMetrics fm ( KOPrefs::instance()->mTodoViewFont );
662 //mTodoListView->header()->setMaximumHeight(fm.height()); 663 //mTodoListView->header()->setMaximumHeight(fm.height());
663 QPtrList<Todo> todoList = calendar()->todos(); 664 QPtrList<Todo> todoList = calendar()->todos();
664 665
665/* 666/*
666 kdDebug() << "KOTodoView::updateView(): Todo List:" << endl; 667 kdDebug() << "KOTodoView::updateView(): Todo List:" << endl;
667 Event *t; 668 Event *t;
668 for(t = todoList.first(); t; t = todoList.next()) { 669 for(t = todoList.first(); t; t = todoList.next()) {
669 kdDebug() << " " << t->getSummary() << endl; 670 kdDebug() << " " << t->getSummary() << endl;
670 671
671 if (t->getRelatedTo()) { 672 if (t->getRelatedTo()) {
672 kdDebug() << " (related to " << t->getRelatedTo()->getSummary() << ")" << endl; 673 kdDebug() << " (related to " << t->getRelatedTo()->getSummary() << ")" << endl;
673 } 674 }
674 675
675 QPtrList<Event> l = t->getRelations(); 676 QPtrList<Event> l = t->getRelations();
676 Event *c; 677 Event *c;
677 for(c=l.first();c;c=l.next()) { 678 for(c=l.first();c;c=l.next()) {
678 kdDebug() << " - relation: " << c->getSummary() << endl; 679 kdDebug() << " - relation: " << c->getSummary() << endl;
679 } 680 }
680 } 681 }
681*/ 682*/
682 683
683 // Put for each Event a KOTodoViewItem in the list view. Don't rely on a 684 // Put for each Event a KOTodoViewItem in the list view. Don't rely on a
684 // specific order of events. That means that we have to generate parent items 685 // specific order of events. That means that we have to generate parent items
685 // recursively for proper hierarchical display of Todos. 686 // recursively for proper hierarchical display of Todos.
686 mTodoMap.clear(); 687 mTodoMap.clear();
687 Todo *todo; 688 Todo *todo;
688 todo = todoList.first();// todo; todo = todoList.next()) { 689 todo = todoList.first();// todo; todo = todoList.next()) {
689 while ( todo ) { 690 while ( todo ) {
690 bool next = true; 691 bool next = true;
691 // qDebug("todo %s ", todo->summary().latin1()); 692 // qDebug("todo %s ", todo->summary().latin1());
692 Incidence *incidence = todo->relatedTo(); 693 Incidence *incidence = todo->relatedTo();
693 while ( incidence ) { 694 while ( incidence ) {
694 if ( incidence->type() == "Todo") { 695 if ( incidence->type() == "Todo") {
695 //qDebug("related %s ",incidence->summary().latin1() ); 696 //qDebug("related %s ",incidence->summary().latin1() );
696 if ( !(todoList.contains ( ((Todo* )incidence ) ) )) { 697 if ( !(todoList.contains ( ((Todo* )incidence ) ) )) {
697 //qDebug("related not found "); 698 //qDebug("related not found ");
698 todoList.remove( ); 699 todoList.remove( );
699 todo = todoList.current(); 700 todo = todoList.current();
700 next = false; 701 next = false;
701 incidence = 0; 702 incidence = 0;
702 703
703 } else { 704 } else {
704 //qDebug("related found "); 705 //qDebug("related found ");
705 incidence = incidence->relatedTo(); 706 incidence = incidence->relatedTo();
706 } 707 }
707 } else 708 } else
708 incidence = 0; 709 incidence = 0;
709 } 710 }
710 if ( next ) 711 if ( next )
711 todo = todoList.next(); 712 todo = todoList.next();
712 } 713 }
713 714
714 for(todo = todoList.first(); todo; todo = todoList.next()) { 715 for(todo = todoList.first(); todo; todo = todoList.next()) {
715 if (!mTodoMap.contains(todo) && checkTodo( todo ) ) 716 if (!mTodoMap.contains(todo) && checkTodo( todo ) )
716 { 717 {
717 insertTodoItem(todo); 718 insertTodoItem(todo);
718 } 719 }
719 } 720 }
720 // Restore opened/closed state 721 // Restore opened/closed state
721 mTodoListView->blockSignals( true ); 722 mTodoListView->blockSignals( true );
722 if( mDocPrefs ) restoreItemState( mTodoListView->firstChild() ); 723 if( mDocPrefs ) restoreItemState( mTodoListView->firstChild() );
723 mTodoListView->blockSignals( false ); 724 mTodoListView->blockSignals( false );
724 resetCurrentItem(); 725 resetCurrentItem();
725 processSelectionChange(); 726 processSelectionChange();
726} 727}
727 728
728void KOTodoView::storeCurrentItem() 729void KOTodoView::storeCurrentItem()
729{ 730{
730 mCurItem = 0; 731 mCurItem = 0;
731 mCurItemRootParent = 0; 732 mCurItemRootParent = 0;
732 mCurItemParent = 0; 733 mCurItemParent = 0;
733 mCurItemAbove = 0; 734 mCurItemAbove = 0;
734 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem(); 735 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem();
735 if (mActiveItem) { 736 if (mActiveItem) {
736 mCurItem = mActiveItem->todo(); 737 mCurItem = mActiveItem->todo();
737 KOTodoViewItem* activeItemAbove = (KOTodoViewItem*)mActiveItem->itemAbove (); 738 KOTodoViewItem* activeItemAbove = (KOTodoViewItem*)mActiveItem->itemAbove ();
738 if ( activeItemAbove ) 739 if ( activeItemAbove )
739 mCurItemAbove = activeItemAbove->todo(); 740 mCurItemAbove = activeItemAbove->todo();
740 mCurItemRootParent = mCurItem; 741 mCurItemRootParent = mCurItem;
741 mCurItemParent = mCurItemRootParent->relatedTo(); 742 mCurItemParent = mCurItemRootParent->relatedTo();
742 while ( mCurItemRootParent->relatedTo() != 0 ) 743 while ( mCurItemRootParent->relatedTo() != 0 )
743 mCurItemRootParent = mCurItemRootParent->relatedTo(); 744 mCurItemRootParent = mCurItemRootParent->relatedTo();
744 } 745 }
745 mActiveItem = 0; 746 mActiveItem = 0;
746} 747}
747 748
748void KOTodoView::resetCurrentItem() 749void KOTodoView::resetCurrentItem()
749{ 750{
750 mTodoListView->setFocus(); 751 mTodoListView->setFocus();
751 KOTodoViewItem* foundItem = 0; 752 KOTodoViewItem* foundItem = 0;
752 KOTodoViewItem* foundItemRoot = 0; 753 KOTodoViewItem* foundItemRoot = 0;
753 KOTodoViewItem* foundItemParent = 0; 754 KOTodoViewItem* foundItemParent = 0;
754 KOTodoViewItem* foundItemAbove = 0; 755 KOTodoViewItem* foundItemAbove = 0;
755 if ( mTodoListView->firstChild () ) { 756 if ( mTodoListView->firstChild () ) {
756 if ( mCurItem ) { 757 if ( mCurItem ) {
757 KOTodoViewItem* item = (KOTodoViewItem*)mTodoListView->firstChild (); 758 KOTodoViewItem* item = (KOTodoViewItem*)mTodoListView->firstChild ();
758 while ( item ) { 759 while ( item ) {
759 if ( item->todo() == mCurItem ) { 760 if ( item->todo() == mCurItem ) {
760 foundItem = item; 761 foundItem = item;
761 break; 762 break;
762 } else if ( item->todo() == mCurItemAbove ) { 763 } else if ( item->todo() == mCurItemAbove ) {
763 foundItemAbove = item; 764 foundItemAbove = item;
764 765
765 } 766 }
766 if ( item->todo() == mCurItemRootParent ) { 767 if ( item->todo() == mCurItemRootParent ) {
767 foundItemRoot = item; 768 foundItemRoot = item;
768 } 769 }
769 if ( item->todo() == mCurItemParent ) { 770 if ( item->todo() == mCurItemParent ) {
770 foundItemParent = item; 771 foundItemParent = item;
771 } 772 }
772 item = (KOTodoViewItem*)item->itemBelow(); 773 item = (KOTodoViewItem*)item->itemBelow();
773 } 774 }
774 if ( ! foundItem ) { 775 if ( ! foundItem ) {
775 if ( foundItemParent ) { 776 if ( foundItemParent ) {
776 foundItem = foundItemParent; 777 foundItem = foundItemParent;
777 } else { 778 } else {
778 if ( foundItemRoot ) 779 if ( foundItemRoot )
779 foundItem = foundItemRoot; 780 foundItem = foundItemRoot;
780 else 781 else
781 foundItem = foundItemAbove; 782 foundItem = foundItemAbove;
782 } 783 }
783 } 784 }
784 } 785 }
785 if ( foundItem ) { 786 if ( foundItem ) {
786 mTodoListView->setCurrentItem( foundItem ); 787 mTodoListView->setCurrentItem( foundItem );
787 mTodoListView->ensureItemVisible( foundItem ); 788 mTodoListView->ensureItemVisible( foundItem );
788 } else { 789 } else {
789 mTodoListView->setCurrentItem( mTodoListView->firstChild () ); 790 mTodoListView->setCurrentItem( mTodoListView->firstChild () );
790 } 791 }
791 } 792 }
792 mTodoListView->setFocus(); 793 mTodoListView->setFocus();
793} 794}
794//Incidence * mCurItem, *mCurItemRootParent,*mCurItemAbove; 795//Incidence * mCurItem, *mCurItemRootParent,*mCurItemAbove;
795bool KOTodoView::checkTodo( Todo * todo ) 796bool KOTodoView::checkTodo( Todo * todo )
796{ 797{
797 798
798 if ( !KOPrefs::instance()->mShowCompletedTodo && todo->isCompleted() ) 799 if ( !KOPrefs::instance()->mShowCompletedTodo && todo->isCompleted() )
799 return false; 800 return false;
800 if ( !todo->isCompleted() ) { 801 if ( !todo->isCompleted() ) {
801 if ( todo->hasDueDate() && todo->dtDue().date() <= QDate::currentDate() ) 802 if ( todo->hasDueDate() && todo->dtDue().date() <= QDate::currentDate() )
802 return true; 803 return true;
803 } 804 }
804 if ( KOPrefs::instance()->mHideNonStartedTodos && mNavigator ) { 805 if ( KOPrefs::instance()->mHideNonStartedTodos && mNavigator ) {
805 if ( todo->hasStartDate() ) 806 if ( todo->hasStartDate() )
806 if ( mNavigator->selectedDates().last() < todo->dtStart().date() ) 807 if ( mNavigator->selectedDates().last() < todo->dtStart().date() )
807 return false; 808 return false;
808 if ( todo->hasDueDate() ) 809 if ( todo->hasDueDate() )
809 if ( mNavigator->selectedDates().first() > todo->dtDue().date() ) 810 if ( mNavigator->selectedDates().first() > todo->dtDue().date() )
810 return false; 811 return false;
811 } 812 }
812 return true; 813 return true;
813} 814}
814 815
815void KOTodoView::restoreItemState( QListViewItem *item ) 816void KOTodoView::restoreItemState( QListViewItem *item )
816{ 817{
817 pendingSubtodo = 0; 818 pendingSubtodo = 0;
818 while( item ) { 819 while( item ) {
819 KOTodoViewItem *todoItem = (KOTodoViewItem *)item; 820 KOTodoViewItem *todoItem = (KOTodoViewItem *)item;
820 todoItem->setOpen( mDocPrefs->readBoolEntry( todoItem->todo()->uid() ) ); 821 todoItem->setOpen( mDocPrefs->readBoolEntry( todoItem->todo()->uid() ) );
821 if( item->childCount() > 0 ) restoreItemState( item->firstChild() ); 822 if( item->childCount() > 0 ) restoreItemState( item->firstChild() );
822 item = item->nextSibling(); 823 item = item->nextSibling();
823 } 824 }
824} 825}
825 826
826 827
827QMap<Todo *,KOTodoViewItem *>::ConstIterator 828QMap<Todo *,KOTodoViewItem *>::ConstIterator
828 KOTodoView::insertTodoItem(Todo *todo) 829 KOTodoView::insertTodoItem(Todo *todo)
829{ 830{
830 831
831// kdDebug() << "KOTodoView::insertTodoItem(): " << todo->getSummary() << endl; 832// kdDebug() << "KOTodoView::insertTodoItem(): " << todo->getSummary() << endl;
832 // TODO: Check, if dynmaic cast is necessary 833 // TODO: Check, if dynmaic cast is necessary
833 834
834 pendingSubtodo = 0; 835 pendingSubtodo = 0;
835 Incidence *incidence = todo->relatedTo(); 836 Incidence *incidence = todo->relatedTo();
836 if (incidence && incidence->type() == "Todo") { 837 if (incidence && incidence->type() == "Todo") {
837 Todo *relatedTodo = static_cast<Todo *>(incidence); 838 Todo *relatedTodo = static_cast<Todo *>(incidence);
838 839
839// kdDebug() << " has Related" << endl; 840// kdDebug() << " has Related" << endl;
840 QMap<Todo *,KOTodoViewItem *>::ConstIterator itemIterator; 841 QMap<Todo *,KOTodoViewItem *>::ConstIterator itemIterator;
841 itemIterator = mTodoMap.find(relatedTodo); 842 itemIterator = mTodoMap.find(relatedTodo);
842 if (itemIterator == mTodoMap.end()) { 843 if (itemIterator == mTodoMap.end()) {
843// kdDebug() << " related not yet in list" << endl; 844// kdDebug() << " related not yet in list" << endl;
844 itemIterator = insertTodoItem (relatedTodo); 845 itemIterator = insertTodoItem (relatedTodo);
845 } 846 }
846 // isn't this pretty stupid? We give one Todo to the KOTodoViewItem 847 // isn't this pretty stupid? We give one Todo to the KOTodoViewItem
847 // and one into the map. Sure finding is more easy but why? -zecke 848 // and one into the map. Sure finding is more easy but why? -zecke
848 KOTodoViewItem *todoItem = new KOTodoViewItem(*itemIterator,todo,this); 849 KOTodoViewItem *todoItem = new KOTodoViewItem(*itemIterator,todo,this);
849 return mTodoMap.insert(todo,todoItem); 850 return mTodoMap.insert(todo,todoItem);
850 } else { 851 } else {
851// kdDebug() << " no Related" << endl; 852// kdDebug() << " no Related" << endl;
852 // see above -zecke 853 // see above -zecke
853 KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this); 854 KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this);
854 return mTodoMap.insert(todo,todoItem); 855 return mTodoMap.insert(todo,todoItem);
855 } 856 }
856} 857}
857 858
858 859
859void KOTodoView::updateConfig() 860void KOTodoView::updateConfig()
860{ 861{
861 updateView(); 862 updateView();
862 mTodoListView->repaintContents(); 863 mTodoListView->repaintContents();
863} 864}
864 865
865QPtrList<Incidence> KOTodoView::selectedIncidences() 866QPtrList<Incidence> KOTodoView::selectedIncidences()
866{ 867{
867 QPtrList<Incidence> selected; 868 QPtrList<Incidence> selected;
868 869
869 KOTodoViewItem *item = (KOTodoViewItem *)(mTodoListView->selectedItem()); 870 KOTodoViewItem *item = (KOTodoViewItem *)(mTodoListView->selectedItem());
870// if (!item) item = mActiveItem; 871// if (!item) item = mActiveItem;
871 if (item) selected.append(item->todo()); 872 if (item) selected.append(item->todo());
872 873
873 return selected; 874 return selected;
874} 875}
875 876
876QPtrList<Todo> KOTodoView::selectedTodos() 877QPtrList<Todo> KOTodoView::selectedTodos()
877{ 878{
878 QPtrList<Todo> selected; 879 QPtrList<Todo> selected;
879 880
880 KOTodoViewItem *item = (KOTodoViewItem *)(mTodoListView->selectedItem()); 881 KOTodoViewItem *item = (KOTodoViewItem *)(mTodoListView->selectedItem());
881// if (!item) item = mActiveItem; 882// if (!item) item = mActiveItem;
882 if (item) selected.append(item->todo()); 883 if (item) selected.append(item->todo());
883 884
884 return selected; 885 return selected;
885} 886}
886 887
887void KOTodoView::changeEventDisplay(Event *, int) 888void KOTodoView::changeEventDisplay(Event *, int)
888{ 889{
889 updateView(); 890 updateView();
890} 891}
891 892
892void KOTodoView::showDates(const QDate &, const QDate &) 893void KOTodoView::showDates(const QDate &, const QDate &)
893{ 894{
894} 895}
895 896
896void KOTodoView::showEvents(QPtrList<Event>) 897void KOTodoView::showEvents(QPtrList<Event>)
897{ 898{
898 kdDebug() << "KOTodoView::selectEvents(): not yet implemented" << endl; 899 kdDebug() << "KOTodoView::selectEvents(): not yet implemented" << endl;
899} 900}
900 901
901void KOTodoView::printPreview(CalPrinter *calPrinter, const QDate &fd, 902void KOTodoView::printPreview(CalPrinter *calPrinter, const QDate &fd,
902 const QDate &td) 903 const QDate &td)
903{ 904{
904#ifndef KORG_NOPRINTER 905#ifndef KORG_NOPRINTER
905 calPrinter->preview(CalPrinter::Todolist, fd, td); 906 calPrinter->preview(CalPrinter::Todolist, fd, td);
906#endif 907#endif
907} 908}
908 909
909void KOTodoView::editItem(QListViewItem *item ) 910void KOTodoView::editItem(QListViewItem *item )
910{ 911{
911 emit editTodoSignal(((KOTodoViewItem *)item)->todo()); 912 emit editTodoSignal(((KOTodoViewItem *)item)->todo());
912} 913}
913 914
914void KOTodoView::showItem(QListViewItem *item,const QPoint &,int) 915void KOTodoView::showItem(QListViewItem *item,const QPoint &,int)
915{ 916{
916 emit showTodoSignal(((KOTodoViewItem *)item)->todo()); 917 emit showTodoSignal(((KOTodoViewItem *)item)->todo());
917} 918}
918 919
919void KOTodoView::popupMenu(QListViewItem *item,const QPoint &p,int column) 920void KOTodoView::popupMenu(QListViewItem *item,const QPoint &p,int column)
920{ 921{
921 pendingSubtodo = 0; 922 pendingSubtodo = 0;
922 mActiveItem = (KOTodoViewItem *)item; 923 mActiveItem = (KOTodoViewItem *)item;
923 if (item) { 924 if (item) {
924 switch (column){ 925 switch (column){
925 case 1: 926 case 1:
926 mPriorityPopupMenu->popup(QCursor::pos ()); break; 927 mPriorityPopupMenu->popup(QCursor::pos ()); break;
927 case 2: 928 case 2:
928 mPercentageCompletedPopupMenu->popup(QCursor::pos ()); break; 929 mPercentageCompletedPopupMenu->popup(QCursor::pos ()); break;
929 case 3: 930 case 3:
930 moveTodo(); 931 moveTodo();
931 break; 932 break;
932 case 8: 933 case 8:
933 getCategoryPopupMenu((KOTodoViewItem *)item)->popup(QCursor::pos ()); break; 934 getCategoryPopupMenu((KOTodoViewItem *)item)->popup(QCursor::pos ()); break;
934 default: 935 default:
935 mItemPopupMenu->popup(QCursor::pos()); 936 mItemPopupMenu->popup(QCursor::pos());
936 } 937 }
937 } else mPopupMenu->popup(QCursor::pos()); 938 } else mPopupMenu->popup(QCursor::pos());
938} 939}
939void KOTodoView::newTodo() 940void KOTodoView::newTodo()
940{ 941{
941 emit newTodoSignal(); 942 emit newTodoSignal();
942} 943}
943 944
944void KOTodoView::newSubTodo() 945void KOTodoView::newSubTodo()
945{ 946{
946 if (mActiveItem) { 947 if (mActiveItem) {
947 emit newSubTodoSignal(mActiveItem->todo()); 948 emit newSubTodoSignal(mActiveItem->todo());
948 } 949 }
949} 950}
950void KOTodoView::unparentTodo() 951void KOTodoView::unparentTodo()
951{ 952{
952 if (mActiveItem) { 953 if (mActiveItem) {
953 emit unparentTodoSignal(mActiveItem->todo()); 954 emit unparentTodoSignal(mActiveItem->todo());
954 } 955 }
955} 956}
956 957
957void KOTodoView::reparentTodo() 958void KOTodoView::reparentTodo()
958{ 959{
959 if (mActiveItem) { 960 if (mActiveItem) {
960 topLevelWidget()->setCaption(i18n("Click on new parent item")); 961 topLevelWidget()->setCaption(i18n("Click on new parent item"));
961 pendingSubtodo = mActiveItem; 962 pendingSubtodo = mActiveItem;
962 } 963 }
963} 964}
964void KOTodoView::editTodo() 965void KOTodoView::editTodo()
965{ 966{
966 if (mActiveItem) { 967 if (mActiveItem) {
967 emit editTodoSignal(mActiveItem->todo()); 968 emit editTodoSignal(mActiveItem->todo());
968 } 969 }
969} 970}
970void KOTodoView::cloneTodo() 971void KOTodoView::cloneTodo()
971{ 972{
972 if (mActiveItem) { 973 if (mActiveItem) {
973 emit cloneTodoSignal((Incidence*)mActiveItem->todo()); 974 emit cloneTodoSignal((Incidence*)mActiveItem->todo());
974 } 975 }
975} 976}
976void KOTodoView::cancelTodo() 977void KOTodoView::cancelTodo()
977{ 978{
978 if (mActiveItem) { 979 if (mActiveItem) {
979 emit cancelTodoSignal((Incidence*)mActiveItem->todo()); 980 emit cancelTodoSignal((Incidence*)mActiveItem->todo());
980 } 981 }
981} 982}
982void KOTodoView::moveTodo() 983void KOTodoView::moveTodo()
983{ 984{
984 if (mActiveItem) { 985 if (mActiveItem) {
985 emit moveTodoSignal((Incidence*)mActiveItem->todo()); 986 emit moveTodoSignal((Incidence*)mActiveItem->todo());
986 } 987 }
987} 988}
988void KOTodoView::beamTodo() 989void KOTodoView::beamTodo()
989{ 990{
990 if (mActiveItem) { 991 if (mActiveItem) {
991 emit beamTodoSignal((Incidence*)mActiveItem->todo()); 992 emit beamTodoSignal((Incidence*)mActiveItem->todo());
992 } 993 }
993} 994}
994 995
995 996
996void KOTodoView::showTodo() 997void KOTodoView::showTodo()
997{ 998{
998 if (mActiveItem) { 999 if (mActiveItem) {
999 emit showTodoSignal(mActiveItem->todo()); 1000 emit showTodoSignal(mActiveItem->todo());
1000 } 1001 }
1001} 1002}
1002 1003
1003void KOTodoView::deleteTodo() 1004void KOTodoView::deleteTodo()
1004{ 1005{
1005 if (mActiveItem) { 1006 if (mActiveItem) {
1006 emit deleteTodoSignal(mActiveItem->todo()); 1007 emit deleteTodoSignal(mActiveItem->todo());
1007 } 1008 }
1008} 1009}
1009 1010
1010void KOTodoView::setNewPriority(int index) 1011void KOTodoView::setNewPriority(int index)
1011{ 1012{
1012 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) { 1013 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) {
1013 mActiveItem->todo()->setPriority(mPriority[index]); 1014 mActiveItem->todo()->setPriority(mPriority[index]);
1014 mActiveItem->construct(); 1015 mActiveItem->construct();
1015 todoModified (mActiveItem->todo(), KOGlobals::PRIORITY_MODIFIED); 1016 todoModified (mActiveItem->todo(), KOGlobals::PRIORITY_MODIFIED);
1016 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 ); 1017 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 );
1017 } 1018 }
1018} 1019}
1019 1020
1020void KOTodoView::setNewPercentage(int index) 1021void KOTodoView::setNewPercentage(int index)
1021{ 1022{
1022 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) { 1023 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) {
1023 1024
1024 if ( mPercentage[index] == 100 && !mActiveItem->isOn() ) { 1025 if ( mPercentage[index] == 100 && !mActiveItem->isOn() ) {
1025 mActiveItem->setOn( true ); 1026 mActiveItem->setOn( true );
1026 return; 1027 return;
1027 } else if ( mPercentage[index] != 100 && mActiveItem->isOn() ) { 1028 } else if ( mPercentage[index] != 100 && mActiveItem->isOn() ) {
1028 KOTodoViewItem* par = (static_cast<KOTodoViewItem*>(mActiveItem->parent())); 1029 KOTodoViewItem* par = (static_cast<KOTodoViewItem*>(mActiveItem->parent()));
1029 if ( par && par->isOn() ) 1030 if ( par && par->isOn() )
1030 par->setOn( false ); 1031 par->setOn( false );
1031 } 1032 }
1032 if (mPercentage[index] == 100) { 1033 if (mPercentage[index] == 100) {
1033 mActiveItem->todo()->setCompleted(QDateTime::currentDateTime()); 1034 mActiveItem->todo()->setCompleted(QDateTime::currentDateTime());
1034 } else { 1035 } else {
1035 mActiveItem->todo()->setCompleted(false); 1036 mActiveItem->todo()->setCompleted(false);
1036 } 1037 }
1037 mActiveItem->todo()->setPercentComplete(mPercentage[index]); 1038 mActiveItem->todo()->setPercentComplete(mPercentage[index]);
1038 mActiveItem->construct(); 1039 mActiveItem->construct();
1039 todoModified (mActiveItem->todo (), KOGlobals::COMPLETION_MODIFIED); 1040 todoModified (mActiveItem->todo (), KOGlobals::COMPLETION_MODIFIED);
1040 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 ); 1041 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 );
1041 } 1042 }
1042} 1043}
1043 1044
1044 1045
1045QPopupMenu * KOTodoView::getCategoryPopupMenu (KOTodoViewItem *todoItem) 1046QPopupMenu * KOTodoView::getCategoryPopupMenu (KOTodoViewItem *todoItem)
1046{ 1047{
1047 QPopupMenu* tempMenu = new QPopupMenu (this); 1048 QPopupMenu* tempMenu = new QPopupMenu (this);
1048 QStringList checkedCategories = todoItem->todo()->categories (); 1049 QStringList checkedCategories = todoItem->todo()->categories ();
1049 1050
1050 tempMenu->setCheckable (true); 1051 tempMenu->setCheckable (true);
1051 for (QStringList::Iterator it = KOPrefs::instance()->mCustomCategories.begin (); 1052 for (QStringList::Iterator it = KOPrefs::instance()->mCustomCategories.begin ();
1052 it != KOPrefs::instance()->mCustomCategories.end (); 1053 it != KOPrefs::instance()->mCustomCategories.end ();
1053 ++it) { 1054 ++it) {
1054 int index = tempMenu->insertItem (*it); 1055 int index = tempMenu->insertItem (*it);
1055 mCategory[index] = *it; 1056 mCategory[index] = *it;
1056 if (checkedCategories.find (*it) != checkedCategories.end ()) tempMenu->setItemChecked (index, true); 1057 if (checkedCategories.find (*it) != checkedCategories.end ()) tempMenu->setItemChecked (index, true);
1057 } 1058 }
1058 1059
1059 connect (tempMenu, SIGNAL (activated (int)), SLOT (changedCategories (int))); 1060 connect (tempMenu, SIGNAL (activated (int)), SLOT (changedCategories (int)));
1060 return tempMenu; 1061 return tempMenu;
1061 1062
1062 1063
1063} 1064}
1064void KOTodoView::changedCategories(int index) 1065void KOTodoView::changedCategories(int index)
1065{ 1066{
1066 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) { 1067 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) {
1067 QStringList categories = mActiveItem->todo()->categories (); 1068 QStringList categories = mActiveItem->todo()->categories ();
1068 QString colcat = categories.first(); 1069 QString colcat = categories.first();
1069 if (categories.find (mCategory[index]) != categories.end ()) 1070 if (categories.find (mCategory[index]) != categories.end ())
1070 categories.remove (mCategory[index]); 1071 categories.remove (mCategory[index]);
1071 else 1072 else
1072 categories.insert (categories.end(), mCategory[index]); 1073 categories.insert (categories.end(), mCategory[index]);
1073 categories.sort (); 1074 categories.sort ();
1074 if ( !colcat.isEmpty() ) { 1075 if ( !colcat.isEmpty() ) {
1075 if ( categories.find ( colcat ) != categories.end () ) { 1076 if ( categories.find ( colcat ) != categories.end () ) {
1076 categories.remove( colcat ); 1077 categories.remove( colcat );
1077 categories.prepend( colcat ); 1078 categories.prepend( colcat );
1078 } 1079 }
1079 } 1080 }
1080 mActiveItem->todo()->setCategories (categories); 1081 mActiveItem->todo()->setCategories (categories);
1081 mActiveItem->construct(); 1082 mActiveItem->construct();
1082 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 ); 1083 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 );
1083 todoModified (mActiveItem->todo (), KOGlobals::CATEGORY_MODIFIED); 1084 todoModified (mActiveItem->todo (), KOGlobals::CATEGORY_MODIFIED);
1084 } 1085 }
1085} 1086}
1086void KOTodoView::itemDoubleClicked(QListViewItem *item) 1087void KOTodoView::itemDoubleClicked(QListViewItem *item)
1087{ 1088{
1088 if ( pendingSubtodo != 0 ) { 1089 if ( pendingSubtodo != 0 ) {
1089 topLevelWidget()->setCaption(i18n("Reparenting aborted!")); 1090 topLevelWidget()->setCaption(i18n("Reparenting aborted!"));
1090 } 1091 }
1091 pendingSubtodo = 0; 1092 pendingSubtodo = 0;
1092 //int row = mTodoListView->header()->sectionAt ( mTodoListView->header()->mapFromGlobal( QCursor::pos()).x() ); 1093 //int row = mTodoListView->header()->sectionAt ( mTodoListView->header()->mapFromGlobal( QCursor::pos()).x() );
1093 int row = mTodoListView->header()->sectionAt ( mTodoListView->viewportToContents(mTodoListView->viewport()->mapFromGlobal( QCursor::pos())) .x() ); 1094 int row = mTodoListView->header()->sectionAt ( mTodoListView->viewportToContents(mTodoListView->viewport()->mapFromGlobal( QCursor::pos())) .x() );
1094 //qDebug("ROW %d ", row); 1095 //qDebug("ROW %d ", row);
1095 if (!item) { 1096 if (!item) {
1096 newTodo(); 1097 newTodo();
1097 return; 1098 return;
1098 } else { 1099 } else {
1099 if ( row == 2 || row == 1 ) { 1100 if ( row == 2 || row == 1 ) {
1100 mActiveItem = (KOTodoViewItem *) item; 1101 mActiveItem = (KOTodoViewItem *) item;
1101 newSubTodo(); 1102 newSubTodo();
1102 return; 1103 return;
1103 } 1104 }
1104 if ( row == 5 || row == 6 ) { 1105 if ( row == 5 || row == 6 ) {
1105 mActiveItem = (KOTodoViewItem *) item; 1106 mActiveItem = (KOTodoViewItem *) item;
1106 toggleRunningItem(); 1107 toggleRunningItem();
1107 return; 1108 return;
1108 } 1109 }
1109 } 1110 }
1110 if ( KOPrefs::instance()->mEditOnDoubleClick ) 1111 if ( KOPrefs::instance()->mEditOnDoubleClick )
1111 editItem( item ); 1112 editItem( item );
1112 else 1113 else
1113 showItem( item , QPoint(), 0 ); 1114 showItem( item , QPoint(), 0 );
1114} 1115}
1115void KOTodoView::toggleRunningItem() 1116void KOTodoView::toggleRunningItem()
1116{ 1117{
1117 // qDebug("KOTodoView::toggleRunning() "); 1118 // qDebug("KOTodoView::toggleRunning() ");
1118 if ( ! mActiveItem ) 1119 if ( ! mActiveItem )
1119 return; 1120 return;
1120 Todo * t = mActiveItem->todo(); 1121 Todo * t = mActiveItem->todo();
1121 if ( t->isRunning() ) { 1122 if ( t->isRunning() ) {
1122 int result = KMessageBox::warningContinueCancel(this, 1123 int result = KMessageBox::warningContinueCancel(this,
1123 i18n("The todo\n%1\nis started.\nDo you want to set\nthe state to stopped?").arg(mActiveItem->text(0).left( 25 ) ),i18n("Todo is started"),i18n("Stop todo"),i18n("Cancel"), true); 1124 i18n("The todo\n%1\nis started.\nDo you want to set\nthe state to stopped?").arg(mActiveItem->text(0).left( 25 ) ),i18n("Todo is started"),i18n("Stop todo"),i18n("Cancel"), true);
1124 if (result != KMessageBox::Continue) return; 1125 if (result != KMessageBox::Continue) return;
1125 t->setRunning( false ); 1126 t->setRunning( false );
1126 mActiveItem->construct(); 1127 mActiveItem->construct();
1127 } else { 1128 } else {
1128 int result = KMessageBox::warningContinueCancel(this, 1129 int result = KMessageBox::warningContinueCancel(this,
1129 i18n("The todo\n%1\nis stopped.\nDo you want to set\nthe state to started?").arg(mActiveItem->text(0).left( 25 ) ),i18n("Todo is stopped"),i18n("Start todo"),i18n("Cancel"), true); 1130 i18n("The todo\n%1\nis stopped.\nDo you want to set\nthe state to started?").arg(mActiveItem->text(0).left( 25 ) ),i18n("Todo is stopped"),i18n("Start todo"),i18n("Cancel"), true);
1130 if (result != KMessageBox::Continue) return; 1131 if (result != KMessageBox::Continue) return;
1131 t->setRunning( true ); 1132 t->setRunning( true );
1132 mActiveItem->construct(); 1133 mActiveItem->construct();
1133 } 1134 }
1134} 1135}
1135 1136
1136void KOTodoView::itemClicked(QListViewItem *item) 1137void KOTodoView::itemClicked(QListViewItem *item)
1137{ 1138{
1138 //qDebug("KOTodoView::itemClicked %d", item); 1139 //qDebug("KOTodoView::itemClicked %d", item);
1139 if (!item) { 1140 if (!item) {
1140 if ( pendingSubtodo != 0 ) { 1141 if ( pendingSubtodo != 0 ) {
1141 topLevelWidget()->setCaption(i18n("Reparenting aborted!")); 1142 topLevelWidget()->setCaption(i18n("Reparenting aborted!"));
1142 } 1143 }
1143 pendingSubtodo = 0; 1144 pendingSubtodo = 0;
1144 return; 1145 return;
1145 } 1146 }
1146 KOTodoViewItem *todoItem = (KOTodoViewItem *)item; 1147 KOTodoViewItem *todoItem = (KOTodoViewItem *)item;
1147 if ( pendingSubtodo != 0 ) { 1148 if ( pendingSubtodo != 0 ) {
1148 bool allowReparent = true; 1149 bool allowReparent = true;
1149 QListViewItem *par = item; 1150 QListViewItem *par = item;
1150 while ( par ) { 1151 while ( par ) {
1151 if ( par == pendingSubtodo ) { 1152 if ( par == pendingSubtodo ) {
1152 allowReparent = false; 1153 allowReparent = false;
1153 break; 1154 break;
1154 } 1155 }
1155 par = par->parent(); 1156 par = par->parent();
1156 } 1157 }
1157 if ( !allowReparent ) { 1158 if ( !allowReparent ) {
1158 topLevelWidget()->setCaption(i18n("Recursive reparenting not possible!")); 1159 topLevelWidget()->setCaption(i18n("Recursive reparenting not possible!"));
1159 pendingSubtodo = 0; 1160 pendingSubtodo = 0;
1160 } else { 1161 } else {
1161 Todo* newParent = todoItem->todo(); 1162 Todo* newParent = todoItem->todo();
1162 Todo* newSub = pendingSubtodo->todo(); 1163 Todo* newSub = pendingSubtodo->todo();
1163 pendingSubtodo = 0; 1164 pendingSubtodo = 0;
1164 emit reparentTodoSignal( newParent,newSub ); 1165 emit reparentTodoSignal( newParent,newSub );
1165 return; 1166 return;
1166 } 1167 }
1167 } 1168 }
1168 1169
1169} 1170}
1170 1171
1171void KOTodoView::setDocumentId( const QString &id ) 1172void KOTodoView::setDocumentId( const QString &id )
1172{ 1173{
1173 1174
1174 mDocPrefs->setDoc( id ); 1175 mDocPrefs->setDoc( id );
1175} 1176}
1176 1177
1177void KOTodoView::itemStateChanged( QListViewItem *item ) 1178void KOTodoView::itemStateChanged( QListViewItem *item )
1178{ 1179{
1179 if (!item) return; 1180 if (!item) return;
1180 1181
1181 KOTodoViewItem *todoItem = (KOTodoViewItem *)item; 1182 KOTodoViewItem *todoItem = (KOTodoViewItem *)item;
1182 1183
1183// kdDebug() << "KOTodoView::itemStateChanged(): " << todoItem->todo()->summary() << endl; 1184// kdDebug() << "KOTodoView::itemStateChanged(): " << todoItem->todo()->summary() << endl;
1184 1185
1185 if( mDocPrefs ) mDocPrefs->writeEntry( todoItem->todo()->uid(), todoItem->isOpen() ); 1186 if( mDocPrefs ) mDocPrefs->writeEntry( todoItem->todo()->uid(), todoItem->isOpen() );
1186} 1187}
1187 1188
1188void KOTodoView::saveLayout(KConfig *config, const QString &group) const 1189void KOTodoView::saveLayout(KConfig *config, const QString &group) const
1189{ 1190{
1190 mTodoListView->saveLayout(config,group); 1191 mTodoListView->saveLayout(config,group);
1191} 1192}
1192 1193
1193void KOTodoView::restoreLayout(KConfig *config, const QString &group) 1194void KOTodoView::restoreLayout(KConfig *config, const QString &group)
1194{ 1195{
1195 mTodoListView->restoreLayout(config,group); 1196 mTodoListView->restoreLayout(config,group);
1196} 1197}
1197 1198
1198void KOTodoView::processSelectionChange() 1199void KOTodoView::processSelectionChange()
1199{ 1200{
1200// kdDebug() << "KOTodoView::processSelectionChange()" << endl; 1201// kdDebug() << "KOTodoView::processSelectionChange()" << endl;
1201 1202
1202 KOTodoViewItem *item = 1203 KOTodoViewItem *item =
1203 static_cast<KOTodoViewItem *>( mTodoListView->selectedItem() ); 1204 static_cast<KOTodoViewItem *>( mTodoListView->selectedItem() );
1204 1205
1205 if ( !item ) { 1206 if ( !item ) {
1206 emit incidenceSelected( 0 ); 1207 emit incidenceSelected( 0 );
1207 } else { 1208 } else {
1208 emit incidenceSelected( item->todo() ); 1209 emit incidenceSelected( item->todo() );
1209 } 1210 }
1210} 1211}
1211 1212
1212void KOTodoView::modified(bool b) 1213void KOTodoView::modified(bool b)
1213{ 1214{
1214 emit isModified(b); 1215 emit isModified(b);
1215} 1216}
1216void KOTodoView::setTodoModified( Todo* todo ) 1217void KOTodoView::setTodoModified( Todo* todo )
1217{ 1218{
1218 todoModified( todo, KOGlobals::UNKNOWN_MODIFIED ); 1219 todoModified( todo, KOGlobals::UNKNOWN_MODIFIED );
1219} 1220}
1220void KOTodoView::clearSelection() 1221void KOTodoView::clearSelection()
1221{ 1222{
1222 mTodoListView->selectAll( false ); 1223 mTodoListView->selectAll( false );
1223} 1224}
1224void KOTodoView::setAllOpen() 1225void KOTodoView::setAllOpen()
1225{ 1226{
1226 if ( isFlatDisplay ) { 1227 if ( isFlatDisplay ) {
1227 isFlatDisplay = false; 1228 isFlatDisplay = false;
1228 mPopupMenu->setItemChecked( 8,false ); 1229 mPopupMenu->setItemChecked( 8,false );
1229 updateView(); 1230 updateView();
1230 } else { 1231 } else {
1231 storeCurrentItem(); 1232 storeCurrentItem();
1232 } 1233 }
1233 setOpen(mTodoListView->firstChild(), true); 1234 setOpen(mTodoListView->firstChild(), true);
1234 resetCurrentItem(); 1235 resetCurrentItem();
1235} 1236}
1236void KOTodoView::setAllClose() 1237void KOTodoView::setAllClose()
1237{ 1238{
1238 if ( isFlatDisplay ) { 1239 if ( isFlatDisplay ) {
1239 isFlatDisplay = false; 1240 isFlatDisplay = false;
1240 mPopupMenu->setItemChecked( 8,false ); 1241 mPopupMenu->setItemChecked( 8,false );
1241 updateView(); 1242 updateView();
1242 } else { 1243 } else {
1243 storeCurrentItem(); 1244 storeCurrentItem();
1244 } 1245 }
1245 setOpen(mTodoListView->firstChild(), false); 1246 setOpen(mTodoListView->firstChild(), false);
1246 resetCurrentItem(); 1247 resetCurrentItem();
1247} 1248}
1248void KOTodoView::setOpen( QListViewItem* item, bool setOpenI) 1249void KOTodoView::setOpen( QListViewItem* item, bool setOpenI)
1249{ 1250{
1250 1251
1251 while ( item ) { 1252 while ( item ) {
1252 setOpen( item->firstChild(), setOpenI ); 1253 setOpen( item->firstChild(), setOpenI );
1253 item->setOpen( setOpenI ); 1254 item->setOpen( setOpenI );
1254 item = item->nextSibling(); 1255 item = item->nextSibling();
1255 } 1256 }
1256} 1257}
1257 1258
1258void KOTodoView::displayAllFlat() 1259void KOTodoView::displayAllFlat()
1259{ 1260{
1260 pendingSubtodo = 0; 1261 pendingSubtodo = 0;
1261 if ( mBlockUpdate ) { 1262 if ( mBlockUpdate ) {
1262 return; 1263 return;
1263 } 1264 }
1264 mPopupMenu->setItemChecked( 8,true ); 1265 mPopupMenu->setItemChecked( 8,true );
1265 isFlatDisplay = true; 1266 isFlatDisplay = true;
1266 QPtrList<Todo> todoList = calendar()->todos(); 1267 QPtrList<Todo> todoList = calendar()->todos();
1267 mTodoMap.clear(); 1268 mTodoMap.clear();
1268 mTodoListView->clear(); 1269 mTodoListView->clear();
1269 Todo *todo; 1270 Todo *todo;
1270 for(todo = todoList.first(); todo; todo = todoList.next()) { 1271 for(todo = todoList.first(); todo; todo = todoList.next()) {
1271 KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this); 1272 KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this);
1272 mTodoMap.insert(todo,todoItem); 1273 mTodoMap.insert(todo,todoItem);
1273 } 1274 }
1274 mTodoListView->setFocus(); 1275 mTodoListView->setFocus();
1275 processSelectionChange(); 1276 processSelectionChange();
1276} 1277}
1277 1278
1278void KOTodoView::setAllFlat() 1279void KOTodoView::setAllFlat()
1279{ 1280{
1280 if ( isFlatDisplay ) { 1281 if ( isFlatDisplay ) {
1281 isFlatDisplay = false; 1282 isFlatDisplay = false;
1282 mPopupMenu->setItemChecked( 8,false ); 1283 mPopupMenu->setItemChecked( 8,false );
1283 updateView(); 1284 updateView();
1284 return; 1285 return;
1285 } 1286 }
1286 storeCurrentItem(); 1287 storeCurrentItem();
1287 displayAllFlat(); 1288 displayAllFlat();
1288 resetCurrentItem(); 1289 resetCurrentItem();
1289} 1290}
1290 1291
1291void KOTodoView::purgeCompleted() 1292void KOTodoView::purgeCompleted()
1292{ 1293{
1293 emit purgeCompletedSignal(); 1294 emit purgeCompletedSignal();
1294 1295
1295} 1296}
1296void KOTodoView::toggleQuickTodo() 1297void KOTodoView::toggleQuickTodo()
1297{ 1298{
1298 if ( mQuickAdd->isVisible() ) { 1299 if ( mQuickAdd->isVisible() ) {
1299 mQuickAdd->hide(); 1300 mQuickAdd->hide();
1300 KOPrefs::instance()->mEnableQuickTodo = false; 1301 KOPrefs::instance()->mEnableQuickTodo = false;
1301 } 1302 }
1302 else { 1303 else {
1303 mQuickAdd->show(); 1304 mQuickAdd->show();
1304 KOPrefs::instance()->mEnableQuickTodo = true; 1305 KOPrefs::instance()->mEnableQuickTodo = true;
1305 } 1306 }
1306 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo); 1307 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo);
1307 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo ); 1308 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo );
1308} 1309}
1309 1310
1310void KOTodoView::toggleRunning() 1311void KOTodoView::toggleRunning()
1311{ 1312{
1312 KOPrefs::instance()->mHideNonStartedTodos = !KOPrefs::instance()->mHideNonStartedTodos; 1313 KOPrefs::instance()->mHideNonStartedTodos = !KOPrefs::instance()->mHideNonStartedTodos;
1313 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos); 1314 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos);
1314 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos ); 1315 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos );
1315 updateView(); 1316 updateView();
1316} 1317}
1317 1318
1318void KOTodoView::toggleCompleted() 1319void KOTodoView::toggleCompleted()
1319{ 1320{
1320 KOPrefs::instance()->mShowCompletedTodo = !KOPrefs::instance()->mShowCompletedTodo; 1321 KOPrefs::instance()->mShowCompletedTodo = !KOPrefs::instance()->mShowCompletedTodo;
1321 mPopupMenu->setItemChecked( 3,KOPrefs::instance()->mShowCompletedTodo ); 1322 mPopupMenu->setItemChecked( 3,KOPrefs::instance()->mShowCompletedTodo );
1322 mItemPopupMenu->setItemChecked( 33 , KOPrefs::instance()->mShowCompletedTodo ); 1323 mItemPopupMenu->setItemChecked( 33 , KOPrefs::instance()->mShowCompletedTodo );
1323 updateView(); 1324 updateView();
1324} 1325}
1325 1326
1326void KOTodoView::addQuickTodo() 1327void KOTodoView::addQuickTodo()
1327{ 1328{
1328 Todo *todo = new Todo(); 1329 Todo *todo = new Todo();
1329 todo->setSummary(mQuickAdd->text()); 1330 todo->setSummary(mQuickAdd->text());
1330 todo->setOrganizer(KOPrefs::instance()->email()); 1331 todo->setOrganizer(KOPrefs::instance()->email());
1331 CalFilter * cf = mCalendar->filter(); 1332 CalFilter * cf = mCalendar->filter();
1332 if ( cf ) { 1333 if ( cf ) {
1333 if ( cf->isEnabled()&& cf->showCategories()) { 1334 if ( cf->isEnabled()&& cf->showCategories()) {
1334 todo->setCategories(cf->categoryList()); 1335 todo->setCategories(cf->categoryList());
1335 } 1336 }
1336 if ( cf->isEnabled() ) 1337 if ( cf->isEnabled() )
1337 todo->setSecrecy( cf->getSecrecy()); 1338 todo->setSecrecy( cf->getSecrecy());
1338 } 1339 }
1339 mCalendar->addTodo(todo); 1340 mCalendar->addTodo(todo);
1340 mQuickAdd->setText(""); 1341 mQuickAdd->setText("");
1341 todoModified (todo, KOGlobals::EVENTADDED ); 1342 todoModified (todo, KOGlobals::EVENTADDED );
1342 updateView(); 1343 updateView();
1343} 1344}
1344 1345
1345void KOTodoView::keyPressEvent ( QKeyEvent * e ) 1346void KOTodoView::keyPressEvent ( QKeyEvent * e )
1346{ 1347{
1347 // e->ignore(); 1348 // e->ignore();
1348 //return; 1349 //return;
1349 //qDebug("KOTodoView::keyPressEvent "); 1350 //qDebug("KOTodoView::keyPressEvent ");
1350 switch ( e->key() ) { 1351 switch ( e->key() ) {
1351 case Qt::Key_Down: 1352 case Qt::Key_Down:
1352 case Qt::Key_Up: 1353 case Qt::Key_Up:
1353 QWidget::keyPressEvent ( e ); 1354 QWidget::keyPressEvent ( e );
1354 break; 1355 break;
1355 1356
1356 case Qt::Key_Q: 1357 case Qt::Key_Q:
1357 toggleQuickTodo(); 1358 toggleQuickTodo();
1358 break; 1359 break;
1359 case Qt::Key_U: 1360 case Qt::Key_U:
1360 if ( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton ) { 1361 if ( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton ) {
1361 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem(); 1362 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem();
1362 unparentTodo(); 1363 unparentTodo();
1363 e->accept(); 1364 e->accept();
1364 } else 1365 } else
1365 e->ignore(); 1366 e->ignore();
1366 break; 1367 break;
1367 case Qt::Key_S: 1368 case Qt::Key_S:
1368 if ( e->state() == Qt::ControlButton ) { 1369 if ( e->state() == Qt::ControlButton ) {
1369 e->ignore(); 1370 e->ignore();
1370 break; 1371 break;
1371 } 1372 }
1372 if ( e->state() == Qt::ShiftButton ) { 1373 if ( e->state() == Qt::ShiftButton ) {
1373 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem(); 1374 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem();
1374 reparentTodo(); 1375 reparentTodo();
1375 e->accept(); 1376 e->accept();
1376 } else 1377 } else
1377 e->ignore(); 1378 e->ignore();
1378 break; 1379 break;
1379 case Qt::Key_P: 1380 case Qt::Key_P:
1380 if ( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton ) { 1381 if ( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton ) {
1381 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem(); 1382 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem();
1382 if ( pendingSubtodo ) 1383 if ( pendingSubtodo )
1383 itemClicked(mActiveItem); 1384 itemClicked(mActiveItem);
1384 e->accept(); 1385 e->accept();
1385 } else 1386 } else
1386 e->ignore(); 1387 e->ignore();
1387 break; 1388 break;
1388 case Qt::Key_Escape: 1389 case Qt::Key_Escape:
1389 if ( pendingSubtodo ) { 1390 if ( pendingSubtodo ) {
1390 itemClicked(0); 1391 itemClicked(0);
1391 e->accept(); 1392 e->accept();
1392 } else 1393 } else
1393 e->ignore(); 1394 e->ignore();
1394 break; 1395 break;
1395 default: 1396 default:
1396 e->ignore(); 1397 e->ignore();
1397 } 1398 }
1398 1399
1399 if ( true ) { 1400 if ( true ) {
1400 if ( e->key() == Qt::Key_I ) { 1401 if ( e->key() == Qt::Key_I ) {
1401 KOTodoViewItem*cn = (KOTodoViewItem*)mTodoListView->currentItem(); 1402 KOTodoViewItem*cn = (KOTodoViewItem*)mTodoListView->currentItem();
1402 if ( cn ) { 1403 if ( cn ) {
1403 mActiveItem = cn; 1404 mActiveItem = cn;
1404 KOTodoViewItem* ci = (KOTodoViewItem*)( cn ); 1405 KOTodoViewItem* ci = (KOTodoViewItem*)( cn );
1405 if ( ci ){ 1406 if ( ci ){
1406 showTodo(); 1407 showTodo();
1407 cn = (KOTodoViewItem*)cn->itemBelow(); 1408 cn = (KOTodoViewItem*)cn->itemBelow();
1408 if ( cn ) { 1409 if ( cn ) {
1409 mTodoListView->setCurrentItem ( cn ); 1410 mTodoListView->setCurrentItem ( cn );
1410 mTodoListView->ensureItemVisible ( cn ); 1411 mTodoListView->ensureItemVisible ( cn );
1411 } 1412 }
1412 1413
1413 } 1414 }
1414 } 1415 }
1415 e->accept(); 1416 e->accept();
1416 1417
1417 } 1418 }
1418 1419
1419 } 1420 }
1420 1421
1421} 1422}
1422void KOTodoView::updateTodo( Todo * t, int type ) 1423void KOTodoView::updateTodo( Todo * t, int type )
1423{ 1424{
1424 if ( mBlockUpdate) 1425 if ( mBlockUpdate)
1425 return; 1426 return;
1426 1427
1427 QMap<Todo *,KOTodoViewItem *>::ConstIterator itemIterator; 1428 QMap<Todo *,KOTodoViewItem *>::ConstIterator itemIterator;
1428 itemIterator = mTodoMap.find(t); 1429 itemIterator = mTodoMap.find(t);
1429 if (itemIterator != mTodoMap.end()) { 1430 if (itemIterator != mTodoMap.end()) {
1430 (*itemIterator)->construct(); 1431 (*itemIterator)->construct();
1431 } else { 1432 } else {
1432 if ( type == KOGlobals::EVENTADDED ) { 1433 if ( type == KOGlobals::EVENTADDED ) {
1433 insertTodoItem( t ); 1434 insertTodoItem( t );
1434 } 1435 }
1435 } 1436 }
1436 1437
1437} 1438}
1438 1439
1439void KOTodoView::todoModified(Todo * t , int p ) 1440void KOTodoView::todoModified(Todo * t , int p )
1440{ 1441{
1441 mBlockUpdate = true; 1442 mBlockUpdate = true;
1442 emit todoModifiedSignal ( t, p ); 1443 emit todoModifiedSignal ( t, p );
1443 mBlockUpdate = false; 1444 mBlockUpdate = false;
1444} 1445}