summaryrefslogtreecommitdiffabout
path: root/korganizer
authorzautrix <zautrix>2005-04-17 16:49:25 (UTC)
committer zautrix <zautrix>2005-04-17 16:49:25 (UTC)
commit70b45fe97813c4fd336b7ca8fdedab13f9c2e039 (patch) (unidiff)
tree37e89cf6cc411af8c646003fcfb0d5975f38272c /korganizer
parent02dc5d8173393d2069951a5f847db5bdf69137f6 (diff)
downloadkdepimpi-70b45fe97813c4fd336b7ca8fdedab13f9c2e039.zip
kdepimpi-70b45fe97813c4fd336b7ca8fdedab13f9c2e039.tar.gz
kdepimpi-70b45fe97813c4fd336b7ca8fdedab13f9c2e039.tar.bz2
fixes
Diffstat (limited to 'korganizer') (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/koeventviewer.cpp112
-rw-r--r--korganizer/kotodoview.cpp10
2 files changed, 68 insertions, 54 deletions
diff --git a/korganizer/koeventviewer.cpp b/korganizer/koeventviewer.cpp
index f39b5e1..c8c2f28 100644
--- a/korganizer/koeventviewer.cpp
+++ b/korganizer/koeventviewer.cpp
@@ -1,785 +1,797 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 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 19
20#include <qcstring.h> 20#include <qcstring.h>
21#include <qwhatsthis.h> 21#include <qwhatsthis.h>
22#include <qdialog.h> 22#include <qdialog.h>
23#include <qapplication.h> 23#include <qapplication.h>
24#include <qlabel.h> 24#include <qlabel.h>
25#include <qlayout.h> 25#include <qlayout.h>
26 26
27#include <klocale.h> 27#include <klocale.h>
28#include <kapplication.h> 28#include <kapplication.h>
29#include <libkcal/event.h> 29#include <libkcal/event.h>
30#include <libkcal/todo.h> 30#include <libkcal/todo.h>
31#include <kdebug.h> 31#include <kdebug.h>
32#include <kiconloader.h> 32#include <kiconloader.h>
33#include <krun.h> 33#include <krun.h>
34#include <kglobal.h> 34#include <kglobal.h>
35#include <kprocess.h> 35#include <kprocess.h>
36#include "koprefs.h" 36#include "koprefs.h"
37 37
38#include <kabc/stdaddressbook.h> 38#include <kabc/stdaddressbook.h>
39 39
40#ifndef KORG_NODCOP 40#ifndef KORG_NODCOP
41#include <dcopclient.h> 41#include <dcopclient.h>
42#include "korganizer.h" 42#include "korganizer.h"
43#include "koprefs.h" 43#include "koprefs.h"
44#include "actionmanager.h" 44#include "actionmanager.h"
45#endif 45#endif
46 46
47#include "koeventviewer.h" 47#include "koeventviewer.h"
48//#ifndef KORG_NOKABC 48//#ifndef KORG_NOKABC
49//#include <kabc/stdaddressbook.h> 49//#include <kabc/stdaddressbook.h>
50//#define size count 50//#define size count
51//#endif 51//#endif
52 52
53#ifdef DESKTOP_VERSION 53#ifdef DESKTOP_VERSION
54#include <kabc/addresseedialog.h> 54#include <kabc/addresseedialog.h>
55#include <kabc/addresseeview.h> 55#include <kabc/addresseeview.h>
56#include <qprinter.h> 56#include <qprinter.h>
57#include <qpainter.h> 57#include <qpainter.h>
58#include <qpaintdevicemetrics.h> 58#include <qpaintdevicemetrics.h>
59#else //DESKTOP_VERSION 59#else //DESKTOP_VERSION
60#include <externalapphandler.h> 60#include <externalapphandler.h>
61#include <qtopia/qcopenvelope_qws.h> 61#include <qtopia/qcopenvelope_qws.h>
62#endif //DESKTOP_VERSION 62#endif //DESKTOP_VERSION
63 63
64KOEventViewer::KOEventViewer(QWidget *parent,const char *name) 64KOEventViewer::KOEventViewer(QWidget *parent,const char *name)
65 : QTextBrowser(parent,name) 65 : QTextBrowser(parent,name)
66{ 66{
67 mSyncMode = false; 67 mSyncMode = false;
68 mColorMode = 0; 68 mColorMode = 0;
69} 69}
70 70
71KOEventViewer::~KOEventViewer() 71KOEventViewer::~KOEventViewer()
72{ 72{
73} 73}
74 74
75void KOEventViewer::printMe() 75void KOEventViewer::printMe()
76{ 76{
77#ifdef DESKTOP_VERSION 77#ifdef DESKTOP_VERSION
78 78
79 KOPrintPrefs pp ( this ); 79 KOPrintPrefs pp ( this );
80 if (!pp.exec() ) 80 if (!pp.exec() )
81 return; 81 return;
82 int scaleval = pp.printMode() ; 82 int scaleval = pp.printMode() ;
83 83
84 QPrinter printer; 84 QPrinter printer;
85 if (!printer.setup() ) 85 if (!printer.setup() )
86 return; 86 return;
87 QPainter p; 87 QPainter p;
88 p.begin ( &printer ); 88 p.begin ( &printer );
89 QPaintDeviceMetrics m = QPaintDeviceMetrics ( &printer ); 89 QPaintDeviceMetrics m = QPaintDeviceMetrics ( &printer );
90 float dx, dy; 90 float dx, dy;
91 int wid = (m.width() * 9)/10; 91 int wid = (m.width() * 9)/10;
92 dx = (float) wid/(float)contentsWidth (); 92 dx = (float) wid/(float)contentsWidth ();
93 dy = (float)(m.height()) / (float)contentsHeight (); 93 dy = (float)(m.height()) / (float)contentsHeight ();
94 float scale; 94 float scale;
95 // scale to fit the width or height of the paper 95 // scale to fit the width or height of the paper
96 if ( dx < dy ) 96 if ( dx < dy )
97 scale = dx; 97 scale = dx;
98 else 98 else
99 scale = dy; 99 scale = dy;
100 100
101 p.translate( m.width()/10,0 ); 101 p.translate( m.width()/10,0 );
102 if ( scaleval == 2 || scaleval == 1 && scale < 1.0 ) { 102 if ( scaleval == 2 || scaleval == 1 && scale < 1.0 ) {
103 p.scale( scale, scale ); 103 p.scale( scale, scale );
104 } 104 }
105 drawContents ( &p, 0,0, contentsWidth (), contentsHeight () ); 105 drawContents ( &p, 0,0, contentsWidth (), contentsHeight () );
106 p.end(); 106 p.end();
107#endif 107#endif
108 108
109} 109}
110void KOEventViewer::setSource(const QString& n) 110void KOEventViewer::setSource(const QString& n)
111{ 111{
112 112
113 if ( n.left(3) == "uid" ) 113 if ( n.left(3) == "uid" )
114#ifdef DESKTOP_VERSION 114#ifdef DESKTOP_VERSION
115 { 115 {
116 KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true ); 116 KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true );
117 KABC::AddressBook::Iterator it; 117 KABC::AddressBook::Iterator it;
118 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) { 118 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) {
119 // LR I do not understand, why the uid string is different on zaurus and desktop 119 // LR I do not understand, why the uid string is different on zaurus and desktop
120 QString uid = "uid://"+(*it).uid(); 120 QString uid = "uid://"+(*it).uid();
121 121
122 //qDebug("for *%s* +%s+ ", n.latin1(), uid.latin1()); 122 //qDebug("for *%s* +%s+ ", n.latin1(), uid.latin1());
123 if (n == uid ) { 123 if (n == uid ) {
124 //qDebug("found %s ",(*it).mobileHomePhone().latin1() ); 124 //qDebug("found %s ",(*it).mobileHomePhone().latin1() );
125 QDialog dia( this,"dia123", true ); 125 QDialog dia( this,"dia123", true );
126 dia.setCaption( i18n("Details of attendee") ); 126 dia.setCaption( i18n("Details of attendee") );
127 QVBoxLayout lay ( &dia ); 127 QVBoxLayout lay ( &dia );
128 KABC::AddresseeView av ( &dia ); 128 KABC::AddresseeView av ( &dia );
129 av.setAddressee( (*it) ); 129 av.setAddressee( (*it) );
130 lay.addWidget( &av ); 130 lay.addWidget( &av );
131 if ( QApplication::desktop()->width() < 480 ) 131 if ( QApplication::desktop()->width() < 480 )
132 dia.resize( 220, 240); 132 dia.resize( 220, 240);
133 else { 133 else {
134 dia.resize( 400,400); 134 dia.resize( 400,400);
135 } 135 }
136 dia.exec(); 136 dia.exec();
137 break; 137 break;
138 } 138 }
139 } 139 }
140 return; 140 return;
141 } 141 }
142#else 142#else
143 { 143 {
144 if ( "uid:organizer" == n ) { 144 if ( "uid:organizer" == n ) {
145 ExternalAppHandler::instance()->requestDetailsFromKAPI("", mCurrentIncidence->organizer(),""); 145 ExternalAppHandler::instance()->requestDetailsFromKAPI("", mCurrentIncidence->organizer(),"");
146 return; 146 return;
147 } 147 }
148 QPtrList<Attendee> attendees = mCurrentIncidence->attendees(); 148 QPtrList<Attendee> attendees = mCurrentIncidence->attendees();
149 if (attendees.count()) { 149 if (attendees.count()) {
150 Attendee *a; 150 Attendee *a;
151 for(a=attendees.first();a;a=attendees.next()) { 151 for(a=attendees.first();a;a=attendees.next()) {
152 if ( "uid:"+a->uid() == n ) { 152 if ( "uid:"+a->uid() == n ) {
153 bool res = ExternalAppHandler::instance()->requestDetailsFromKAPI(a->name(), a->email(), a->uid()); 153 bool res = ExternalAppHandler::instance()->requestDetailsFromKAPI(a->name(), a->email(), a->uid());
154 return; 154 return;
155 } 155 }
156 } 156 }
157 } 157 }
158 return; 158 return;
159 } 159 }
160 //requestNameEmailUidListFromKAPI("QPE/Application/kopi", this->name() /* name is here the unique uid*/); 160 //requestNameEmailUidListFromKAPI("QPE/Application/kopi", this->name() /* name is here the unique uid*/);
161 // the result should now arrive through method insertAttendees 161 // the result should now arrive through method insertAttendees
162 //QString uid = "uid:"+(*it).uid(); 162 //QString uid = "uid:"+(*it).uid();
163#endif 163#endif
164 if ( n.left(6) == "mailto" ) { 164 if ( n.left(6) == "mailto" ) {
165 // qDebug("KOEventViewer::setSource %s ", n.mid(7).latin1()); 165 // qDebug("KOEventViewer::setSource %s ", n.mid(7).latin1());
166#ifndef DESKTOP_VERSION 166#ifndef DESKTOP_VERSION
167 if ( n.mid(7,3) == "ALL" ) { 167 if ( n.mid(7,3) == "ALL" ) {
168 mailToAttendees( true ); 168 mailToAttendees( true );
169 } else if ( n.mid(7,4) == "RSVP" ) { 169 } else if ( n.mid(7,4) == "RSVP" ) {
170 mailToAttendees( false ); 170 mailToAttendees( false );
171 } else { 171 } else {
172 QCopEnvelope e("QPE/Application/ompi", "newMail(QString)" ); 172 QCopEnvelope e("QPE/Application/ompi", "newMail(QString)" );
173 e << n.mid(7); 173 e << n.mid(7);
174 } 174 }
175#endif 175#endif
176 176
177 } 177 }
178 178
179 179
180#ifndef KORG_NODCOP 180#ifndef KORG_NODCOP
181 kdDebug() << "KOEventViewer::setSource(): " << n << endl; 181 kdDebug() << "KOEventViewer::setSource(): " << n << endl;
182 QString tmpStr; 182 QString tmpStr;
183 if (n.startsWith("mailto:")) { 183 if (n.startsWith("mailto:")) {
184 KApplication::kApplication()->invokeMailer(n.mid(7),QString::null); 184 KApplication::kApplication()->invokeMailer(n.mid(7),QString::null);
185 //emit showIncidence(n); 185 //emit showIncidence(n);
186 return; 186 return;
187 } else if (n.startsWith("uid:")) { 187 } else if (n.startsWith("uid:")) {
188 DCOPClient *client = KApplication::kApplication()->dcopClient(); 188 DCOPClient *client = KApplication::kApplication()->dcopClient();
189 const QByteArray noParamData; 189 const QByteArray noParamData;
190 const QByteArray paramData; 190 const QByteArray paramData;
191 QByteArray replyData; 191 QByteArray replyData;
192 QCString replyTypeStr; 192 QCString replyTypeStr;
193#define PING_ABBROWSER (client->call("kaddressbook", "KAddressBookIface", "interfaces()", noParamData, replyTypeStr, replyData)) 193#define PING_ABBROWSER (client->call("kaddressbook", "KAddressBookIface", "interfaces()", noParamData, replyTypeStr, replyData))
194 bool foundAbbrowser = PING_ABBROWSER; 194 bool foundAbbrowser = PING_ABBROWSER;
195 195
196 if (foundAbbrowser) { 196 if (foundAbbrowser) {
197 //KAddressbook is already running, so just DCOP to it to bring up the contact editor 197 //KAddressbook is already running, so just DCOP to it to bring up the contact editor
198 //client->send("kaddressbook","KAddressBookIface", 198 //client->send("kaddressbook","KAddressBookIface",
199 QDataStream arg(paramData, IO_WriteOnly); 199 QDataStream arg(paramData, IO_WriteOnly);
200 arg << n.mid(6); 200 arg << n.mid(6);
201 client->send("kaddressbook", "KAddressBookIface", "showContactEditor( QString )", paramData); 201 client->send("kaddressbook", "KAddressBookIface", "showContactEditor( QString )", paramData);
202 return; 202 return;
203 } else { 203 } else {
204 /* 204 /*
205 KaddressBook is not already running. Pass it the UID of the contact via the command line while starting it - its neater. 205 KaddressBook is not already running. Pass it the UID of the contact via the command line while starting it - its neater.
206 We start it without its main interface 206 We start it without its main interface
207 */ 207 */
208 KIconLoader* iconLoader = new KIconLoader(); 208 KIconLoader* iconLoader = new KIconLoader();
209 QString iconPath = iconLoader->iconPath("go",KIcon::Small); 209 QString iconPath = iconLoader->iconPath("go",KIcon::Small);
210 ActionManager::setStartedKAddressBook(true); 210 ActionManager::setStartedKAddressBook(true);
211 tmpStr = "kaddressbook --editor-only --uid "; 211 tmpStr = "kaddressbook --editor-only --uid ";
212 tmpStr += KProcess::quote(n.mid(6)); 212 tmpStr += KProcess::quote(n.mid(6));
213 KRun::runCommand(tmpStr,"KAddressBook",iconPath); 213 KRun::runCommand(tmpStr,"KAddressBook",iconPath);
214 return; 214 return;
215 } 215 }
216 } else { 216 } else {
217 //QTextBrowser::setSource(n); 217 //QTextBrowser::setSource(n);
218 } 218 }
219#endif 219#endif
220} 220}
221void KOEventViewer::mailToAttendees( bool all ) 221void KOEventViewer::mailToAttendees( bool all )
222{ 222{
223 QPtrList<Attendee> attendees = mCurrentIncidence->attendees(); 223 QPtrList<Attendee> attendees = mCurrentIncidence->attendees();
224 if (attendees.count() == 0) return; 224 if (attendees.count() == 0) return;
225 QStringList nameList; 225 QStringList nameList;
226 QStringList emailList; 226 QStringList emailList;
227 QStringList uidList; 227 QStringList uidList;
228 Attendee* a; 228 Attendee* a;
229 for(a=attendees.first();a;a=attendees.next()) { 229 for(a=attendees.first();a;a=attendees.next()) {
230 if ( !all && !a->RSVP() ) continue; 230 if ( !all && !a->RSVP() ) continue;
231 if (!a->email().isEmpty()) { 231 if (!a->email().isEmpty()) {
232 nameList.append (a->name() ); 232 nameList.append (a->name() );
233 emailList.append (a->email() ); 233 emailList.append (a->email() );
234 uidList.append (a->uid() ); 234 uidList.append (a->uid() );
235 } 235 }
236 } 236 }
237 QString uid = "ComposeMailUIpick2"+mMailSubject; 237 QString uid = "ComposeMailUIpick2"+mMailSubject;
238#ifndef DESKTOP_VERSION 238#ifndef DESKTOP_VERSION
239 bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI("QPE/Application/ompi", uid, nameList, emailList, uidList); 239 bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI("QPE/Application/ompi", uid, nameList, emailList, uidList);
240#endif 240#endif
241 241
242} 242}
243void KOEventViewer::addTag(const QString & tag,const QString & text) 243void KOEventViewer::addTag(const QString & tag,const QString & text)
244{ 244{
245 int number=text.contains("\n"); 245 int number=text.contains("\n");
246 QString str = "<" + tag + ">"; 246 QString str = "<" + tag + ">";
247 QString tmpText=text; 247 QString tmpText=text;
248 QString tmpStr=str; 248 QString tmpStr=str;
249 if(number !=-1) 249 if(number !=-1)
250 { 250 {
251 if (number > 0) { 251 if (number > 0) {
252 int pos=0; 252 int pos=0;
253 QString tmp; 253 QString tmp;
254 for(int i=0;i<=number;i++) { 254 for(int i=0;i<=number;i++) {
255 pos=tmpText.find("\n"); 255 pos=tmpText.find("\n");
256 tmp=tmpText.left(pos); 256 tmp=tmpText.left(pos);
257 tmpText=tmpText.right(tmpText.length()-pos-1); 257 tmpText=tmpText.right(tmpText.length()-pos-1);
258 tmpStr+=tmp+"<br>"; 258 tmpStr+=tmp+"<br>";
259 } 259 }
260 } 260 }
261 else tmpStr += tmpText; 261 else tmpStr += tmpText;
262 tmpStr+="</" + tag + ">"; 262 tmpStr+="</" + tag + ">";
263 mText.append(tmpStr); 263 mText.append(tmpStr);
264 } 264 }
265 else 265 else
266 { 266 {
267 str += text + "</" + tag + ">"; 267 str += text + "</" + tag + ">";
268 mText.append(str); 268 mText.append(str);
269 } 269 }
270} 270}
271 271
272void KOEventViewer::setColorMode( int m ) 272void KOEventViewer::setColorMode( int m )
273{ 273{
274 mColorMode = m; 274 mColorMode = m;
275} 275}
276void KOEventViewer::appendEvent(Event *event, int mode ) 276void KOEventViewer::appendEvent(Event *event, int mode )
277{ 277{
278 mMailSubject = ""; 278 mMailSubject = "";
279 mCurrentIncidence = event; 279 mCurrentIncidence = event;
280 bool shortDate = KOPrefs::instance()->mShortDateInViewer; 280 bool shortDate = KOPrefs::instance()->mShortDateInViewer;
281 bool wideScreen = ( QApplication::desktop()->width() >= 640 );
281 topLevelWidget()->setCaption(i18n("Event Viewer")); 282 topLevelWidget()->setCaption(i18n("Event Viewer"));
282 if ( mode == 0 ) { 283 if ( mode == 0 ) {
283 addTag("h2",deTag(event->summary())); 284 addTag("h2",deTag(event->summary()));
284 } 285 }
285 else { 286 else {
286 if ( mColorMode == 1 ) { 287 if ( mColorMode == 1 ) {
287 mText +="<font color=\"#00A000\">"; 288 mText +="<font color=\"#00A000\">";
288 } 289 }
289 if ( mColorMode == 2 ) { 290 if ( mColorMode == 2 ) {
290 mText +="<font color=\"#C00000\">"; 291 mText +="<font color=\"#C00000\">";
291 } 292 }
292 // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>"; 293 // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>";
293 if ( mode == 1 ) { 294 if ( mode == 1 ) {
294 addTag("h2",i18n( "Local: " ) +deTag(event->summary())); 295 addTag("h2",i18n( "Local: " ) +deTag(event->summary()));
295 } else { 296 } else {
296 addTag("h2",i18n( "Remote: " ) +deTag(event->summary())); 297 addTag("h2",i18n( "Remote: " ) +deTag(event->summary()));
297 } 298 }
298 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); 299 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) );
299 if ( mColorMode ) 300 if ( mColorMode )
300 mText += "</font>"; 301 mText += "</font>";
301 } 302 }
302 mMailSubject += i18n( "Meeting " )+ event->summary(); 303 mMailSubject += i18n( "Meeting " )+ event->summary();
303 if (event->cancelled ()) { 304 if (event->cancelled ()) {
304 mText +="<font color=\"#B00000\">"; 305 mText +="<font color=\"#B00000\">";
305 addTag("i",i18n("This event has been cancelled!")); 306 addTag("i",i18n("This event has been cancelled!"));
306 mText.append("<br>"); 307 mText.append("<br>");
307 mText += "</font>"; 308 mText += "</font>";
308 mMailSubject += i18n("(cancelled)"); 309 mMailSubject += i18n("(cancelled)");
309 } 310 }
310 311
311 if (event->doesFloat()) { 312 if (event->doesFloat()) {
312 if (event->isMultiDay()) { 313 if (event->isMultiDay()) {
313 mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>") 314 mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>")
314 .arg(event->dtStartDateStr(shortDate)) 315 .arg(event->dtStartDateStr(shortDate))
315 .arg(event->dtEndDateStr(shortDate))); 316 .arg(event->dtEndDateStr(shortDate)));
316 } else { 317 } else {
317 mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate ))); 318 mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate )));
318 } 319 }
319 } else { 320 } else {
320 if (event->isMultiDay()) { 321 if (event->isMultiDay()) {
321 mText.append(i18n("<p><b>From:</b> %1</p> ") 322 mText.append(i18n("<p><b>From:</b> %1</p> ")
322 .arg(event->dtStartStr( shortDate))); 323 .arg(event->dtStartStr( shortDate)));
323 mText.append(i18n("<p><b>To:</b> %1</p>") 324 mText.append(i18n("<p><b>To:</b> %1</p>")
324 .arg(event->dtEndStr(shortDate))); 325 .arg(event->dtEndStr(shortDate)));
325 } else { 326 } else {
326 mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>") 327 mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>")
327 .arg(event->dtStartTimeStr()) 328 .arg(event->dtStartTimeStr())
328 .arg(event->dtEndTimeStr())); 329 .arg(event->dtEndTimeStr()));
329 mText.append(i18n("<p><b>On:</b> %1</p> ") 330 mText.append(i18n("<p><b>On:</b> %1</p> ")
330 .arg(event->dtStartDateStr( shortDate ))); 331 .arg(event->dtStartDateStr( shortDate )));
331 } 332 }
332 } 333 }
333 if (!event->location().isEmpty()) { 334 if (!event->location().isEmpty()) {
334 addTag("b",i18n("Location: ")); 335 addTag("p","<b>"+i18n("Location: ")+"</b>"+ deTag(event->location() ) );
335 mText.append(deTag(event->location())+"<br>");
336 mMailSubject += i18n(" at ") + event->location(); 336 mMailSubject += i18n(" at ") + event->location();
337 } 337 }
338 if (event->recurrence()->doesRecur()) { 338 if (event->recurrence()->doesRecur()) {
339 339
340 QString recurText = event->recurrence()->recurrenceText(); 340 QString recurText = event->recurrence()->recurrenceText();
341 addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>"); 341 addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>");
342 bool ok; 342 bool ok;
343 QDate start = QDate::currentDate(); 343 QDate start = QDate::currentDate();
344 QDateTime next; 344 QDateTime next;
345 next = event->getNextOccurence( QDateTime::currentDateTime() , &ok ); 345 next = event->getNextOccurence( QDateTime::currentDateTime() , &ok );
346 if ( ok ) { 346 if ( ok ) {
347 addTag("p",i18n("<b>Next recurrence is on:</b>") ); 347 if ( wideScreen ){
348 addTag("p", KGlobal::locale()->formatDate( next.date(), shortDate )); 348 addTag("p",i18n("<b>Next recurrence is on:</b>") +" " + KGlobal::locale()->formatDate( next.date(), shortDate ) );
349 } else {
350 addTag("p",i18n("<b>Next recurrence is on:</b>") );
351 addTag("p", KGlobal::locale()->formatDate( next.date(), shortDate ));
352 }
349 mMailSubject += i18n(" - " )+ KGlobal::locale()->formatDateTime( next, true ); 353 mMailSubject += i18n(" - " )+ KGlobal::locale()->formatDateTime( next, true );
350 354
351 } else { 355 } else {
352 bool last; 356 bool last;
353 QDate nextd; 357 QDate nextd;
354 nextd = event->recurrence()->getPreviousDate( QDate::currentDate() , &last ); 358 nextd = event->recurrence()->getPreviousDate( QDate::currentDate() , &last );
355 if ( last ) { 359 if ( last ) {
356 addTag("p",i18n("<b>Last recurrence was on:</b>") ); 360 if ( wideScreen ){
357 addTag("p", KGlobal::locale()->formatDate( nextd, shortDate )); 361 addTag("p",i18n("<b>Last recurrence was on:</b>") +" " + KGlobal::locale()->formatDate( nextd, shortDate ));
362 } else{
363 addTag("p",i18n("<b>Last recurrence was on:</b>") );
364 addTag("p", KGlobal::locale()->formatDate( nextd, shortDate ));
365 }
358 } 366 }
359 } 367 }
360 } else { 368 } else {
361 mMailSubject += i18n(" - " )+event->dtStartStr( true ); 369 mMailSubject += i18n(" - " )+event->dtStartStr( true );
362 370
363 } 371 }
364 372
365 373
366 if (event->isAlarmEnabled()) { 374 if (event->isAlarmEnabled()) {
367 Alarm *alarm =event->alarms().first() ; 375 Alarm *alarm =event->alarms().first() ;
368 QDateTime t = alarm->time(); 376 QDateTime t = alarm->time();
369 QString s =i18n("( %1 before )").arg( alarm->offsetText() ); 377 QString s =i18n("( %1 before )").arg( alarm->offsetText() );
370 addTag("p",i18n("<b>Alarm on: ") + s +" </b>"); 378 if(wideScreen ){
371 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate )); 379 addTag("p",i18n("<b>Alarm on: ") + s +" </b>"+ KGlobal::locale()->formatDateTime( t, shortDate ));
380 }else{
381 addTag("p",i18n("<b>Alarm on: ") + s +" </b>");
382 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate ));
383 }
372 //addTag("p",s); 384 //addTag("p",s);
373 } 385 }
374 386
375 addTag("b",i18n("Access: ")); 387 addTag("p","<b>"+i18n("Access: ") + "</b>" + event->secrecyStr());
376 mText.append(event->secrecyStr()+"<br>");
377 388
378
379
380 formatCategories(event); 389 formatCategories(event);
381 390
382 formatReadOnly(event); 391 formatReadOnly(event);
383 formatAttendees(event); 392 formatAttendees(event);
384 393
385 if ( KOPrefs::instance()->mEVshowCreated ) { 394 if ( KOPrefs::instance()->mEVshowCreated ) {
386#ifdef DESKTOP_VERSION 395 if(wideScreen ){
387 addTag("p",i18n("<b>Created: ") +" </b>"+KGlobal::locale()->formatDateTime( event->created(), shortDate )); 396 addTag("p",i18n("<b>Created: ") +" </b>"+KGlobal::locale()->formatDateTime( event->created(), shortDate ));
388#else 397 }else{
389 addTag("p",i18n("<b>Created: ") +" </b>"); 398 addTag("p",i18n("<b>Created: ") +" </b>");
390 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate )); 399 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate ));
391#endif 400 }
401
392 402
393 } 403 }
394 if ( KOPrefs::instance()->mEVshowChanged ) { 404 if ( KOPrefs::instance()->mEVshowChanged ) {
395#ifdef DESKTOP_VERSION 405 if(wideScreen ){
396 addTag("p",i18n("<b>Last modified: ") +" </b>" + KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ) ); 406 addTag("p",i18n("<b>Last modified: ") +" </b>" + KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ) );
397#else 407 }else{
398 addTag("p",i18n("<b>Last modified: ") +" </b>"); 408 addTag("p",i18n("<b>Last modified: ") +" </b>");
399 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate )); 409 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ));
400#endif 410 }
401 411
402 } 412 }
403 if ( KOPrefs::instance()->mEVshowDetails ) { 413 if ( KOPrefs::instance()->mEVshowDetails ) {
404 if (!event->description().isEmpty()) { 414 if (!event->description().isEmpty()) {
405 addTag("p",i18n("<b>Details: </b>")); 415 addTag("p",i18n("<b>Details: </b>"));
406 addTag("p",deTag(event->description())); 416 addTag("p",deTag(event->description()));
407 } 417 }
408 } 418 }
409 setText(mText); 419 setText(mText);
410 //QWhatsThis::add(this,mText); 420 //QWhatsThis::add(this,mText);
411 421
412} 422}
413 423
414void KOEventViewer::appendTodo(Todo *event, int mode ) 424void KOEventViewer::appendTodo(Todo *event, int mode )
415{ 425{
416 mMailSubject = ""; 426 mMailSubject = "";
417 mCurrentIncidence = event; 427 mCurrentIncidence = event;
418 topLevelWidget()->setCaption(i18n("Todo Viewer")); 428 topLevelWidget()->setCaption(i18n("Todo Viewer"));
419 bool shortDate = KOPrefs::instance()->mShortDateInViewer; 429 bool shortDate = KOPrefs::instance()->mShortDateInViewer;
430 bool wideScreen = ( QApplication::desktop()->width() >= 640 );
420 if (mode == 0 ) 431 if (mode == 0 )
421 addTag("h2",deTag(event->summary())); 432 addTag("h2",deTag(event->summary()));
422 else { 433 else {
423 if ( mColorMode == 1 ) { 434 if ( mColorMode == 1 ) {
424 mText +="<font color=\"#00A000\">"; 435 mText +="<font color=\"#00A000\">";
425 } 436 }
426 if ( mColorMode == 2 ) { 437 if ( mColorMode == 2 ) {
427 mText +="<font color=\"#B00000\">"; 438 mText +="<font color=\"#B00000\">";
428 } 439 }
429 if ( mode == 1 ) { 440 if ( mode == 1 ) {
430 addTag("h2",i18n( "Local: " ) +deTag(event->summary())); 441 addTag("h2",i18n( "Local: " ) +deTag(event->summary()));
431 } else { 442 } else {
432 addTag("h2",i18n( "Remote: " ) +deTag(event->summary())); 443 addTag("h2",i18n( "Remote: " ) +deTag(event->summary()));
433 } 444 }
434 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); 445 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) );
435 if ( mColorMode ) 446 if ( mColorMode )
436 mText += "</font>"; 447 mText += "</font>";
437 } 448 }
438 mMailSubject += i18n( "Todo " )+ event->summary(); 449 mMailSubject += i18n( "Todo " )+ event->summary();
439 450
440 if ( event->percentComplete() == 100 && event->hasCompletedDate() ) { 451 if ( event->percentComplete() == 100 && event->hasCompletedDate() ) {
441 mText +="<font color=\"#B00000\">"; 452 mText +="<font color=\"#B00000\">";
442 addTag("i", i18n("<p><i>Completed on %1</i></p>").arg( event->completedStr(KOPrefs::instance()->mShortDateInViewer) ) ); 453 addTag("i", i18n("<p><i>Completed on %1</i></p>").arg( event->completedStr(KOPrefs::instance()->mShortDateInViewer) ) );
443 mText += "</font>"; 454 mText += "</font>";
444 } else { 455 } else {
445 mText.append(i18n("<p><i>%1 % completed</i></p>") 456 mText.append(i18n("<p><i>%1 % completed</i></p>")
446 .arg(event->percentComplete())); 457 .arg(event->percentComplete()));
447 } 458 }
448 459
449 if (event->cancelled ()) { 460 if (event->cancelled ()) {
450 mText +="<font color=\"#B00000\">"; 461 mText +="<font color=\"#B00000\">";
451 addTag("i",i18n("This todo has been cancelled!")); 462 addTag("i",i18n("This todo has been cancelled!"));
452 mText.append("<br>"); 463 mText.append("<br>");
453 mText += "</font>"; 464 mText += "</font>";
454 mMailSubject += i18n("(cancelled)"); 465 mMailSubject += i18n("(cancelled)");
455 } 466 }
456 467
457 468
458 469
459 if (event->recurrence()->doesRecur()) { 470 if (event->recurrence()->doesRecur()) {
460 471
461 QString recurText = event->recurrence()->recurrenceText(); 472 QString recurText = event->recurrence()->recurrenceText();
462 addTag("p","<em>" + i18n("This is a %1 recurring todo.").arg(recurText ) + "</em>"); 473 addTag("p","<em>" + i18n("This is a %1 recurring todo.").arg(recurText ) + "</em>");
463 474
464 } 475 }
465 if (event->hasStartDate()) { 476 if (event->hasStartDate()) {
466 mText.append(i18n("<p><b>Start on:</b> %1</p>").arg(event->dtStartStr(KOPrefs::instance()->mShortDateInViewer))); 477 mText.append(i18n("<p><b>Start on:</b> %1</p>").arg(event->dtStartStr(KOPrefs::instance()->mShortDateInViewer)));
467 } 478 }
468 if (event->hasDueDate()) { 479 if (event->hasDueDate()) {
469 mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(KOPrefs::instance()->mShortDateInViewer))); 480 mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(KOPrefs::instance()->mShortDateInViewer)));
470 mMailSubject += i18n(" - " )+event->dtDueStr( true ); 481 mMailSubject += i18n(" - " )+event->dtDueStr( true );
471 } 482 }
472 if (!event->location().isEmpty()) { 483 if (!event->location().isEmpty()) {
473 addTag("b",i18n("Location: ")); 484 addTag("p","<b>"+i18n("Location: ")+"</b>"+ deTag(event->location() ) );
474 mText.append(deTag(event->location())+"<br>");
475 mMailSubject += i18n(" at ") + event->location(); 485 mMailSubject += i18n(" at ") + event->location();
476 } 486 }
477 mText.append(i18n("<p><b>Priority:</b> %2</p>") 487 mText.append(i18n("<p><b>Priority:</b> %2</p>")
478 .arg(QString::number(event->priority()))); 488 .arg(QString::number(event->priority())));
479 489
480 if (event->isAlarmEnabled()) { 490 if (event->isAlarmEnabled()) {
481 Alarm *alarm =event->alarms().first() ; 491 Alarm *alarm =event->alarms().first() ;
482 QDateTime t = alarm->time(); 492 QDateTime t = alarm->time();
483 QString s =i18n("( %1 before )").arg( alarm->offsetText() ); 493 QString s =i18n("( %1 before )").arg( alarm->offsetText() );
484 addTag("p",i18n("<b>Alarm on: ") + s +" </b>"); 494 if ( wideScreen ) {
485 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate )); 495 addTag("p",i18n("<b>Alarm on: ") + s +" </b>"+ KGlobal::locale()->formatDateTime( t, shortDate ));
486 //addTag("p",s); 496 } else {
497 addTag("p",i18n("<b>Alarm on: ") + s +" </b>");
498 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate ));
499 }
487 } 500 }
488 501
489 addTag("b",i18n("Access: ")); 502 addTag("p","<b>"+i18n("Access: ") + "</b>" + event->secrecyStr());
490 mText.append(event->secrecyStr()+"<br>");
491 503
492 formatCategories(event); 504 formatCategories(event);
493 505
494 formatReadOnly(event); 506 formatReadOnly(event);
495 formatAttendees(event); 507 formatAttendees(event);
496 508
497 if ( KOPrefs::instance()->mEVshowCreated ) { 509 if ( KOPrefs::instance()->mEVshowCreated ) {
498#ifdef DESKTOP_VERSION 510 if(wideScreen ){
499 addTag("p",i18n("<b>Created: ") +" </b>"+KGlobal::locale()->formatDateTime( event->created(), shortDate )); 511
500#else 512 addTag("p",i18n("<b>Created: ") +" </b>"+KGlobal::locale()->formatDateTime( event->created(), shortDate ));
501 addTag("p",i18n("<b>Created: ") +" </b>"); 513
502 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate )); 514 } else {
503#endif 515 addTag("p",i18n("<b>Created: ") +" </b>");
504 516 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate ));
517 }
505 } 518 }
506 if ( KOPrefs::instance()->mEVshowChanged ) { 519 if ( KOPrefs::instance()->mEVshowChanged ) {
507#ifdef DESKTOP_VERSION 520 if(wideScreen ){
508 addTag("p",i18n("<b>Last modified: ") +" </b>" +KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ) ); 521 addTag("p",i18n("<b>Last modified: ") +" </b>" +KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ) );
509#else 522
510 addTag("p",i18n("<b>Last modified: ") +" </b>"); 523 } else {
511 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate )); 524 addTag("p",i18n("<b>Last modified: ") +" </b>");
512#endif 525 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ));
513 526 }
514 } 527 }
515 if ( event->relatedTo() ) { 528 if ( event->relatedTo() ) {
516 addTag("b",i18n("Parent todo:<br>")); 529 addTag("b",i18n("Parent todo:<br>"));
517 mText.append(deTag(event->relatedTo()->summary())+" [" +QString::number(event->relatedTo()->priority()) + "/" + QString::number(((Todo*)event->relatedTo())->percentComplete())+"%] <br>"); 530 mText.append(deTag(event->relatedTo()->summary())+" [" +QString::number(event->relatedTo()->priority()) + "/" + QString::number(((Todo*)event->relatedTo())->percentComplete())+"%] <br>");
518 } 531 }
519 QPtrList<Incidence> Relations = event->relations(); 532 QPtrList<Incidence> Relations = event->relations();
520 Incidence *to; 533 Incidence *to;
521 if ( Relations.first() ) 534 if ( Relations.first() )
522 addTag("b",i18n("Sub todos:<br>")); 535 addTag("b",i18n("Sub todos:<br>"));
523 for (to=Relations.first();to;to=Relations.next()) { 536 for (to=Relations.first();to;to=Relations.next()) {
524 mText.append( deTag(to->summary())+" [" +QString::number(to->priority()) + "/" + QString::number(((Todo*)to)->percentComplete())+"%]<br>"); 537 mText.append( deTag(to->summary())+" [" +QString::number(to->priority()) + "/" + QString::number(((Todo*)to)->percentComplete())+"%]<br>");
525 538
526 } 539 }
527 540
528 if ( KOPrefs::instance()->mEVshowDetails ) { 541 if ( KOPrefs::instance()->mEVshowDetails ) {
529 if (!event->description().isEmpty()) { 542 if (!event->description().isEmpty()) {
530 addTag("p",i18n("<b>Details: </b>")); 543 addTag("p",i18n("<b>Details: </b>"));
531 addTag("p",deTag(event->description())); 544 addTag("p",deTag(event->description()));
532 } 545 }
533 } 546 }
534 setText(mText); 547 setText(mText);
535} 548}
536 549
537void KOEventViewer::formatCategories(Incidence *event) 550void KOEventViewer::formatCategories(Incidence *event)
538{ 551{
539 if (!event->categoriesStr().isEmpty()) { 552 if (!event->categoriesStr().isEmpty()) {
540 if (event->categories().count() == 1) { 553 if (event->categories().count() == 1) {
541 addTag("h3",i18n("Category")); 554 addTag("p","<b>"+i18n("Category") + ":</b> " + event->categoriesStrWithSpace());
542 } else { 555 } else {
543 addTag("h3",i18n("Categories")); 556 addTag("p","<b>"+i18n("Categories")+":</b> " + event->categoriesStrWithSpace() ) ;
544 } 557 }
545 addTag("p",event->categoriesStr());
546 } 558 }
547} 559}
548void KOEventViewer::formatAttendees(Incidence *event) 560void KOEventViewer::formatAttendees(Incidence *event)
549{ 561{
550 QPtrList<Attendee> attendees = event->attendees(); 562 QPtrList<Attendee> attendees = event->attendees();
551 if (attendees.count()) { 563 if (attendees.count()) {
552 564
553 565
554 QString iconPath = KGlobal::iconLoader()->iconPath("mailappt",KIcon::Small); 566 QString iconPath = KGlobal::iconLoader()->iconPath("mailappt",KIcon::Small);
555 QString NOiconPath = KGlobal::iconLoader()->iconPath("nomailappt",KIcon::Small); 567 QString NOiconPath = KGlobal::iconLoader()->iconPath("nomailappt",KIcon::Small);
556 addTag("h3",i18n("Organizer")); 568 addTag("h3",i18n("Organizer"));
557 mText.append("<ul><li>"); 569 mText.append("<ul><li>");
558#ifndef KORG_NOKABC 570#ifndef KORG_NOKABC
559 571
560#ifdef DESKTOP_VERSION 572#ifdef DESKTOP_VERSION
561 KABC::AddressBook *add_book = KABC::StdAddressBook::self(); 573 KABC::AddressBook *add_book = KABC::StdAddressBook::self();
562 KABC::Addressee::List addressList; 574 KABC::Addressee::List addressList;
563 addressList = add_book->findByEmail(event->organizer()); 575 addressList = add_book->findByEmail(event->organizer());
564 KABC::Addressee o = addressList.first(); 576 KABC::Addressee o = addressList.first();
565 if (!o.isEmpty() && addressList.size()<2) { 577 if (!o.isEmpty() && addressList.size()<2) {
566 mText += "<a href=\"uid:" + o.uid() + "\">"; 578 mText += "<a href=\"uid:" + o.uid() + "\">";
567 mText += o.formattedName(); 579 mText += o.formattedName();
568 mText += "</a>\n"; 580 mText += "</a>\n";
569 } else { 581 } else {
570 mText.append(event->organizer()); 582 mText.append(event->organizer());
571 } 583 }
572#else //DESKTOP_VERSION 584#else //DESKTOP_VERSION
573 mText += "<a href=\"uid:organizer\">"; 585 mText += "<a href=\"uid:organizer\">";
574 mText += event->organizer(); 586 mText += event->organizer();
575 mText += "</a>\n"; 587 mText += "</a>\n";
576#endif //DESKTOP_VERSION 588#endif //DESKTOP_VERSION
577 589
578 590
579#else 591#else
580 mText.append(event->organizer()); 592 mText.append(event->organizer());
581#endif 593#endif
582 594
583 if (iconPath) { 595 if (iconPath) {
584 mText += " <a href=\"mailto:" + event->organizer() + "\">"; 596 mText += " <a href=\"mailto:" + event->organizer() + "\">";
585 mText += "<IMG src=\"" + iconPath + "\">"; 597 mText += "<IMG src=\"" + iconPath + "\">";
586 mText += "</a>\n"; 598 mText += "</a>\n";
587 } 599 }
588 mText.append("</li></ul>"); 600 mText.append("</li></ul>");
589 601
590 addTag("h3",i18n("Attendees")); 602 addTag("h3",i18n("Attendees"));
591 Attendee *a; 603 Attendee *a;
592 mText.append("<ul>"); 604 mText.append("<ul>");
593 int a_count = 0; 605 int a_count = 0;
594 int a_count_nr = 0; 606 int a_count_nr = 0;
595 607
596 for(a=attendees.first();a;a=attendees.next()) { 608 for(a=attendees.first();a;a=attendees.next()) {
597#ifndef KORG_NOKABC 609#ifndef KORG_NOKABC
598#ifdef DESKTOP_VERSION 610#ifdef DESKTOP_VERSION
599 if (a->name().isEmpty()) { 611 if (a->name().isEmpty()) {
600 addressList = add_book->findByEmail(a->email()); 612 addressList = add_book->findByEmail(a->email());
601 KABC::Addressee o = addressList.first(); 613 KABC::Addressee o = addressList.first();
602 if (!o.isEmpty() && addressList.size()<2) { 614 if (!o.isEmpty() && addressList.size()<2) {
603 mText += "<a href=\"uid:" + o.uid() + "\">"; 615 mText += "<a href=\"uid:" + o.uid() + "\">";
604 mText += o.formattedName(); 616 mText += o.formattedName();
605 mText += "</a>\n"; 617 mText += "</a>\n";
606 } else { 618 } else {
607 mText += "<li>"; 619 mText += "<li>";
608 mText.append(a->email()); 620 mText.append(a->email());
609 mText += "\n"; 621 mText += "\n";
610 } 622 }
611 } else { 623 } else {
612 mText += "<li><a href=\"uid:" + a->uid() + "\">"; 624 mText += "<li><a href=\"uid:" + a->uid() + "\">";
613 if (!a->name().isEmpty()) mText += a->name(); 625 if (!a->name().isEmpty()) mText += a->name();
614 else mText += a->email(); 626 else mText += a->email();
615 mText += "</a>\n"; 627 mText += "</a>\n";
616 } 628 }
617#else //DESKTOP_VERSION 629#else //DESKTOP_VERSION
618 mText += "<li><a href=\"uid:" + a->uid() + "\">"; 630 mText += "<li><a href=\"uid:" + a->uid() + "\">";
619 if (!a->name().isEmpty()) mText += a->name(); 631 if (!a->name().isEmpty()) mText += a->name();
620 else mText += a->email(); 632 else mText += a->email();
621 mText += "</a>\n"; 633 mText += "</a>\n";
622#endif //DESKTOP_VERSION 634#endif //DESKTOP_VERSION
623#else 635#else
624 //qDebug("nokabc "); 636 //qDebug("nokabc ");
625 mText += "<li><a href=\"uid:" + a->uid() + "\">"; 637 mText += "<li><a href=\"uid:" + a->uid() + "\">";
626 if (!a->name().isEmpty()) mText += a->name(); 638 if (!a->name().isEmpty()) mText += a->name();
627 else mText += a->email(); 639 else mText += a->email();
628 mText += "</a>\n"; 640 mText += "</a>\n";
629#endif 641#endif
630 642
631 643
632 if (!a->email().isEmpty()) { 644 if (!a->email().isEmpty()) {
633 if (iconPath) { 645 if (iconPath) {
634 mText += "<a href=\"mailto:" + a->name() +" <" + a->email() + ">:" + mMailSubject + "\">"; 646 mText += "<a href=\"mailto:" + a->name() +" <" + a->email() + ">:" + mMailSubject + "\">";
635 if ( a->RSVP() ) { 647 if ( a->RSVP() ) {
636 ++a_count_nr; 648 ++a_count_nr;
637 mText += "<IMG src=\"" + iconPath + "\">"; 649 mText += "<IMG src=\"" + iconPath + "\">";
638 } 650 }
639 else { 651 else {
640 ++a_count; 652 ++a_count;
641 mText += "<IMG src=\"" + NOiconPath + "\">"; 653 mText += "<IMG src=\"" + NOiconPath + "\">";
642 } 654 }
643 mText += "</a>\n"; 655 mText += "</a>\n";
644 } 656 }
645 } 657 }
646 if (a->status() != Attendee::NeedsAction ) 658 if (a->status() != Attendee::NeedsAction )
647 mText +="[" + a->statusStr() + "] "; 659 mText +="[" + a->statusStr() + "] ";
648 if (a->role() == Attendee::Chair ) 660 if (a->role() == Attendee::Chair )
649 mText +="(" + a->roleStr().left(1) + ".)"; 661 mText +="(" + a->roleStr().left(1) + ".)";
650 } 662 }
651 mText.append("</li></ul>"); 663 mText.append("</li></ul>");
652 if ( (a_count+a_count_nr) > 1 ) { 664 if ( (a_count+a_count_nr) > 1 ) {
653 mText += "<a href=\"mailto:ALL\">"; 665 mText += "<a href=\"mailto:ALL\">";
654 mText += i18n( "Mail to all" ); 666 mText += i18n( "Mail to all" );
655 mText += "</a> ( "; 667 mText += "</a> ( ";
656 mText += "<IMG src=\"" + iconPath + "\">"; 668 mText += "<IMG src=\"" + iconPath + "\">";
657 mText += i18n( " and " ); 669 mText += i18n( " and " );
658 mText += "<IMG src=\"" + NOiconPath + "\"> )"; 670 mText += "<IMG src=\"" + NOiconPath + "\"> )";
659 mText += "<br>\n"; 671 mText += "<br>\n";
660 672
661 673
662 } 674 }
663 if ( a_count_nr > 1 ) { 675 if ( a_count_nr > 1 ) {
664 mText += "<a href=\"mailto:RSVP\">"; 676 mText += "<a href=\"mailto:RSVP\">";
665 mText += i18n( "Mail to selected" ); 677 mText += i18n( "Mail to selected" );
666 mText += "</a> ( "; 678 mText += "</a> ( ";
667 mText += i18n( "<IMG src=\"%1\"> only )").arg ( iconPath ); 679 mText += i18n( "<IMG src=\"%1\"> only )").arg ( iconPath );
668 mText += "<br>\n"; 680 mText += "<br>\n";
669 } 681 }
670 } 682 }
671 683
672} 684}
673void KOEventViewer::appendJournal(Journal *jour, int mode ) 685void KOEventViewer::appendJournal(Journal *jour, int mode )
674{ 686{
675 bool shortDate = KOPrefs::instance()->mShortDateInViewer; 687 bool shortDate = KOPrefs::instance()->mShortDateInViewer;
676 if (mode == 0 ) { 688 if (mode == 0 ) {
677 addTag("h2",i18n("Journal from: ")); 689 addTag("h2",i18n("Journal from: "));
678 } 690 }
679 else { 691 else {
680 if ( mode == 1 ) { 692 if ( mode == 1 ) {
681 addTag("h2",i18n( "Local: " ) +i18n("Journal from: ")); 693 addTag("h2",i18n( "Local: " ) +i18n("Journal from: "));
682 } else { 694 } else {
683 addTag("h2",i18n( "Remote: " ) +i18n("Journal from: ")); 695 addTag("h2",i18n( "Remote: " ) +i18n("Journal from: "));
684 } 696 }
685 } 697 }
686 topLevelWidget()->setCaption("Journal Viewer"); 698 topLevelWidget()->setCaption("Journal Viewer");
687 mText.append(i18n("<h3> %1 </h3> ").arg(jour->dtStartDateStr(KOPrefs::instance()->mShortDateInViewer))); 699 mText.append(i18n("<h3> %1 </h3> ").arg(jour->dtStartDateStr(KOPrefs::instance()->mShortDateInViewer)));
688 addTag("b",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(jour->lastModified(),shortDate ) ); 700 addTag("b",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(jour->lastModified(),shortDate ) );
689 if (!jour->description().isEmpty()) { 701 if (!jour->description().isEmpty()) {
690 addTag("p",deTag(jour->description())); 702 addTag("p",deTag(jour->description()));
691 } 703 }
692 setText(mText); 704 setText(mText);
693} 705}
694 706
695void KOEventViewer::formatReadOnly(Incidence *event) 707void KOEventViewer::formatReadOnly(Incidence *event)
696{ 708{
697 if (event->isReadOnly()) { 709 if (event->isReadOnly()) {
698 addTag("p","<em>(" + i18n("read-only") + ")</em>"); 710 addTag("p","<em>(" + i18n("read-only") + ")</em>");
699 } 711 }
700} 712}
701void KOEventViewer::setSyncMode( bool b ) 713void KOEventViewer::setSyncMode( bool b )
702{ 714{
703 mSyncMode = b; 715 mSyncMode = b;
704} 716}
705 717
706void KOEventViewer::setTodo(Todo *event, bool clearV ) 718void KOEventViewer::setTodo(Todo *event, bool clearV )
707{ 719{
708 if ( clearV ) 720 if ( clearV )
709 clearEvents(); 721 clearEvents();
710 if ( mSyncMode ) { 722 if ( mSyncMode ) {
711 if ( clearV ) 723 if ( clearV )
712 appendTodo(event,1 ); 724 appendTodo(event,1 );
713 else 725 else
714 appendTodo(event,2); 726 appendTodo(event,2);
715 } else 727 } else
716 appendTodo(event); 728 appendTodo(event);
717} 729}
718void KOEventViewer::setJournal(Journal *event, bool clearV ) 730void KOEventViewer::setJournal(Journal *event, bool clearV )
719{ 731{
720 if ( clearV ) 732 if ( clearV )
721 clearEvents(); 733 clearEvents();
722 if ( mSyncMode ) { 734 if ( mSyncMode ) {
723 if ( clearV ) 735 if ( clearV )
724 appendJournal(event, 1); 736 appendJournal(event, 1);
725 else 737 else
726 appendJournal(event, 2); 738 appendJournal(event, 2);
727 } else 739 } else
728 appendJournal(event); 740 appendJournal(event);
729} 741}
730 742
731void KOEventViewer::setEvent(Event *event) 743void KOEventViewer::setEvent(Event *event)
732{ 744{
733 clearEvents(); 745 clearEvents();
734 if ( mSyncMode ) 746 if ( mSyncMode )
735 appendEvent(event, 1); 747 appendEvent(event, 1);
736 else 748 else
737 appendEvent(event); 749 appendEvent(event);
738} 750}
739 751
740void KOEventViewer::addEvent(Event *event) 752void KOEventViewer::addEvent(Event *event)
741{ 753{
742 if ( mSyncMode ) 754 if ( mSyncMode )
743 appendEvent(event, 2); 755 appendEvent(event, 2);
744 else 756 else
745 appendEvent(event); 757 appendEvent(event);
746} 758}
747 759
748void KOEventViewer::clearEvents(bool now) 760void KOEventViewer::clearEvents(bool now)
749{ 761{
750 mText = ""; 762 mText = "";
751 if (now) setText(mText); 763 if (now) setText(mText);
752} 764}
753 765
754void KOEventViewer::addText(QString text) 766void KOEventViewer::addText(QString text)
755{ 767{
756 mText.append(text); 768 mText.append(text);
757 setText(mText); 769 setText(mText);
758} 770}
759QString KOEventViewer::deTag(QString text) 771QString KOEventViewer::deTag(QString text)
760{ 772{
761#if QT_VERSION >= 0x030000 773#if QT_VERSION >= 0x030000
762 text.replace( '<' , "&lt;" ); 774 text.replace( '<' , "&lt;" );
763 text.replace( '>' , "&gt;" ); 775 text.replace( '>' , "&gt;" );
764#else 776#else
765 if ( text.find ('<') >= 0 ) { 777 if ( text.find ('<') >= 0 ) {
766 text.replace( QRegExp("<") , "&lt;" ); 778 text.replace( QRegExp("<") , "&lt;" );
767 } 779 }
768 if ( text.find ('>') >= 0 ) { 780 if ( text.find ('>') >= 0 ) {
769 text.replace( QRegExp(">") , "&gt;" ); 781 text.replace( QRegExp(">") , "&gt;" );
770 } 782 }
771#endif 783#endif
772 return text; 784 return text;
773} 785}
774void KOEventViewer::keyPressEvent ( QKeyEvent * e ) 786void KOEventViewer::keyPressEvent ( QKeyEvent * e )
775{ 787{
776 switch ( e->key() ) { 788 switch ( e->key() ) {
777 case Qt::Key_Return: 789 case Qt::Key_Return:
778 case Qt::Key_Enter : 790 case Qt::Key_Enter :
779 e->ignore(); 791 e->ignore();
780 break; 792 break;
781 default: 793 default:
782 QTextBrowser::keyPressEvent ( e ); 794 QTextBrowser::keyPressEvent ( e );
783 break; 795 break;
784 } 796 }
785} 797}
diff --git a/korganizer/kotodoview.cpp b/korganizer/kotodoview.cpp
index 0a608dc..25be63a 100644
--- a/korganizer/kotodoview.cpp
+++ b/korganizer/kotodoview.cpp
@@ -1,1442 +1,1444 @@
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();
468 mItemPopupMenu->insertItem(i18n("Show..."), this, 471 mItemPopupMenu->insertItem(i18n("Show..."), this,
469 SLOT (showTodo())); 472 SLOT (showTodo()));
470 mItemPopupMenu->insertItem(i18n("Edit..."), this, 473 mItemPopupMenu->insertItem(i18n("Edit..."), this,
471 SLOT (editTodo())); 474 SLOT (editTodo()));
472 mItemPopupMenu->insertItem( i18n("Delete"), this, 475 mItemPopupMenu->insertItem( i18n("Delete"), this,
473 SLOT (deleteTodo())); 476 SLOT (deleteTodo()));
474 mItemPopupMenu->insertItem( i18n("Clone..."), this, 477 mItemPopupMenu->insertItem( i18n("Clone..."), this,
475 SLOT (cloneTodo())); 478 SLOT (cloneTodo()));
476 mItemPopupMenu->insertItem( i18n("Move..."), this, 479 mItemPopupMenu->insertItem( i18n("Move..."), this,
477 SLOT (moveTodo())); 480 SLOT (moveTodo()));
478 mItemPopupMenu->insertItem( i18n("Beam..."), this, 481 mItemPopupMenu->insertItem( i18n("Beam..."), this,
479 SLOT (beamTodo())); 482 SLOT (beamTodo()));
480 mItemPopupMenu->insertItem( i18n("Toggle Cancel"), this, 483 mItemPopupMenu->insertItem( i18n("Toggle Cancel"), this,
481 SLOT (cancelTodo())); 484 SLOT (cancelTodo()));
482 mItemPopupMenu->insertSeparator(); 485 mItemPopupMenu->insertSeparator();
483 486 /*
484 mItemPopupMenu->insertItem( i18n("Start/Stop todo..."), this,
485 SLOT (toggleRunningItem()));
486 mItemPopupMenu->insertItem( i18n("New Todo..."), this, 487 mItemPopupMenu->insertItem( i18n("New Todo..."), this,
487 SLOT (newTodo())); 488 SLOT (newTodo()));
489 */
488 mItemPopupMenu->insertItem(i18n("New Sub-Todo..."), this, 490 mItemPopupMenu->insertItem(i18n("New Sub-Todo..."), this,
489 SLOT (newSubTodo())); 491 SLOT (newSubTodo()));
490 mItemPopupMenu->insertItem(i18n("Unparent Todo"), this, 492 mItemPopupMenu->insertItem(i18n("Unparent Todo"), this,
491 SLOT (unparentTodo()),0,21); 493 SLOT (unparentTodo()),0,21);
492 mItemPopupMenu->insertItem(i18n("Reparent Todo"), this, 494 mItemPopupMenu->insertItem(i18n("Reparent Todo"), this,
493 SLOT (reparentTodo()),0,22); 495 SLOT (reparentTodo()),0,22);
494 mItemPopupMenu->insertSeparator(); 496 mItemPopupMenu->insertSeparator();
495#if 0 497#if 0
496 mItemPopupMenu->insertItem(i18n("Delete completed To-Dos","Purge Completed"), 498 mItemPopupMenu->insertItem(i18n("Delete completed To-Dos","Purge Completed"),
497 this, SLOT( purgeCompleted() ) ); 499 this, SLOT( purgeCompleted() ) );
498 mItemPopupMenu->insertItem(i18n("toggle completed To-Dos","Show Completed"), 500 mItemPopupMenu->insertItem(i18n("toggle completed To-Dos","Show Completed"),
499 this, SLOT( toggleCompleted() ),0, 33 ); 501 this, SLOT( toggleCompleted() ),0, 33 );
500 mItemPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"), 502 mItemPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"),
501 this, SLOT( toggleQuickTodo() ),0, 34 ); 503 this, SLOT( toggleQuickTodo() ),0, 34 );
502 mItemPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"), 504 mItemPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"),
503 this, SLOT( toggleRunning() ),0, 35 ); 505 this, SLOT( toggleRunning() ),0, 35 );
504 506
505#endif 507#endif
506 mPopupMenu = new QPopupMenu(this); 508 mPopupMenu = new QPopupMenu(this);
507 mPopupMenu->insertItem(SmallIconSet("todo"), i18n("New Todo..."), this, 509 mPopupMenu->insertItem(SmallIconSet("todo"), i18n("New Todo..."), this,
508 SLOT (newTodo()),0,1); 510 SLOT (newTodo()),0,1);
509 mPopupMenu->insertItem(i18n("delete completed To-Dos","Purge Completed"), 511 mPopupMenu->insertItem(i18n("delete completed To-Dos","Purge Completed"),
510 this, SLOT(purgeCompleted()),0,2); 512 this, SLOT(purgeCompleted()),0,2);
511 mPopupMenu->insertItem(i18n("Show Completed"), 513 mPopupMenu->insertItem(i18n("Show Completed"),
512 this, SLOT( toggleCompleted() ),0,3 ); 514 this, SLOT( toggleCompleted() ),0,3 );
513 mPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"), 515 mPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"),
514 this, SLOT( toggleQuickTodo() ),0,4 ); 516 this, SLOT( toggleQuickTodo() ),0,4 );
515 mPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"), 517 mPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"),
516 this, SLOT( toggleRunning() ),0,5 ); 518 this, SLOT( toggleRunning() ),0,5 );
517 mPopupMenu->insertItem(i18n(" set all open","Display all opened"), 519 mPopupMenu->insertItem(i18n(" set all open","Display all opened"),
518 this, SLOT( setAllOpen() ),0,6 ); 520 this, SLOT( setAllOpen() ),0,6 );
519 mPopupMenu->insertItem(i18n(" set all close","Display all closed"), 521 mPopupMenu->insertItem(i18n(" set all close","Display all closed"),
520 this, SLOT( setAllClose() ),0,7 ); 522 this, SLOT( setAllClose() ),0,7 );
521 mPopupMenu->insertItem(i18n(" set all flat","Display all flat"), 523 mPopupMenu->insertItem(i18n(" set all flat","Display all flat"),
522 this, SLOT( setAllFlat() ),0,8 ); 524 this, SLOT( setAllFlat() ),0,8 );
523 mDocPrefs = new DocPrefs( name ); 525 mDocPrefs = new DocPrefs( name );
524 526
525 mItemPopupMenu->insertItem(i18n("Todo View"),mPopupMenu ); 527 mItemPopupMenu->insertItem(i18n("Todo View"),mPopupMenu );
526 mPopupMenu->setCheckable( true ); 528 mPopupMenu->setCheckable( true );
527 mItemPopupMenu->setCheckable( true ); 529 mItemPopupMenu->setCheckable( true );
528 530
529 531
530 mPopupMenu->setItemChecked( 3,KOPrefs::instance()->mShowCompletedTodo ); 532 mPopupMenu->setItemChecked( 3,KOPrefs::instance()->mShowCompletedTodo );
531 mItemPopupMenu->setItemChecked( 33 , KOPrefs::instance()->mShowCompletedTodo ); 533 mItemPopupMenu->setItemChecked( 33 , KOPrefs::instance()->mShowCompletedTodo );
532 534
533 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo); 535 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo);
534 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo ); 536 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo );
535 537
536 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos); 538 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos);
537 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos ); 539 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos );
538 540
539 541
540 // Double clicking conflicts with opening/closing the subtree 542 // Double clicking conflicts with opening/closing the subtree
541 connect( mTodoListView, SIGNAL( doubleClicked( QListViewItem *) ), 543 connect( mTodoListView, SIGNAL( doubleClicked( QListViewItem *) ),
542 SLOT( editItem( QListViewItem *) ) ); 544 SLOT( editItem( QListViewItem *) ) );
543 /* 545 /*
544 connect( mTodoListView, SIGNAL( rightButtonClicked ( QListViewItem *, 546 connect( mTodoListView, SIGNAL( rightButtonClicked ( QListViewItem *,
545 const QPoint &,int ) ), 547 const QPoint &,int ) ),
546 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) ); 548 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) );
547 */ 549 */
548 connect( mTodoListView, SIGNAL( contextRequest ( QListViewItem *, 550 connect( mTodoListView, SIGNAL( contextRequest ( QListViewItem *,
549 const QPoint &,int ) ), 551 const QPoint &,int ) ),
550 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) ); 552 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) );
551 connect( mTodoListView, SIGNAL( clicked( QListViewItem * ) ), 553 connect( mTodoListView, SIGNAL( clicked( QListViewItem * ) ),
552 SLOT( itemClicked( QListViewItem * ) ) ); 554 SLOT( itemClicked( QListViewItem * ) ) );
553 connect( mTodoListView, SIGNAL( double_Clicked( QListViewItem * ) ), 555 connect( mTodoListView, SIGNAL( double_Clicked( QListViewItem * ) ),
554 SLOT( itemDoubleClicked( QListViewItem * ) ) ); 556 SLOT( itemDoubleClicked( QListViewItem * ) ) );
555 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ), 557 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ),
556 SLOT( updateView() ) ); 558 SLOT( updateView() ) );
557 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ), 559 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ),
558 SLOT( todoModified(Todo *, int) ) ); 560 SLOT( todoModified(Todo *, int) ) );
559 connect( mTodoListView, SIGNAL( expanded( QListViewItem * ) ), 561 connect( mTodoListView, SIGNAL( expanded( QListViewItem * ) ),
560 SLOT( itemStateChanged( QListViewItem * ) ) ); 562 SLOT( itemStateChanged( QListViewItem * ) ) );
561 connect( mTodoListView, SIGNAL( collapsed( QListViewItem * ) ), 563 connect( mTodoListView, SIGNAL( collapsed( QListViewItem * ) ),
562 SLOT( itemStateChanged( QListViewItem * ) ) ); 564 SLOT( itemStateChanged( QListViewItem * ) ) );
563 connect( mTodoListView, SIGNAL( paintNeeded() ), 565 connect( mTodoListView, SIGNAL( paintNeeded() ),
564 SLOT( paintNeeded()) ); 566 SLOT( paintNeeded()) );
565 567
566#if 0 568#if 0
567 connect(mTodoListView,SIGNAL(selectionChanged(QListViewItem *)), 569 connect(mTodoListView,SIGNAL(selectionChanged(QListViewItem *)),
568 SLOT(selectionChanged(QListViewItem *))); 570 SLOT(selectionChanged(QListViewItem *)));
569 connect(mTodoListView,SIGNAL(clicked(QListViewItem *)), 571 connect(mTodoListView,SIGNAL(clicked(QListViewItem *)),
570 SLOT(selectionChanged(QListViewItem *))); 572 SLOT(selectionChanged(QListViewItem *)));
571 connect(mTodoListView,SIGNAL(pressed(QListViewItem *)), 573 connect(mTodoListView,SIGNAL(pressed(QListViewItem *)),
572 SLOT(selectionChanged(QListViewItem *))); 574 SLOT(selectionChanged(QListViewItem *)));
573#endif 575#endif
574 576
575 connect( mTodoListView, SIGNAL(reparentTodoSignal( Todo *,Todo * ) ), SIGNAL(reparentTodoSignal( Todo *,Todo * ) )); 577 connect( mTodoListView, SIGNAL(reparentTodoSignal( Todo *,Todo * ) ), SIGNAL(reparentTodoSignal( Todo *,Todo * ) ));
576 connect( mTodoListView, SIGNAL(unparentTodoSignal(Todo *) ), SIGNAL(unparentTodoSignal(Todo *) )); 578 connect( mTodoListView, SIGNAL(unparentTodoSignal(Todo *) ), SIGNAL(unparentTodoSignal(Todo *) ));
577 connect( mTodoListView, SIGNAL( deleteTodo(Todo *) ), SIGNAL(deleteTodoSignal(Todo *) )); 579 connect( mTodoListView, SIGNAL( deleteTodo(Todo *) ), SIGNAL(deleteTodoSignal(Todo *) ));
578 580
579 connect( mTodoListView, SIGNAL(selectionChanged() ), 581 connect( mTodoListView, SIGNAL(selectionChanged() ),
580 SLOT( processSelectionChange() ) ); 582 SLOT( processSelectionChange() ) );
581 connect( mQuickAdd, SIGNAL( returnPressed () ), 583 connect( mQuickAdd, SIGNAL( returnPressed () ),
582 SLOT( addQuickTodo() ) ); 584 SLOT( addQuickTodo() ) );
583 585
584} 586}
585 587
586KOTodoView::~KOTodoView() 588KOTodoView::~KOTodoView()
587{ 589{
588 // delete mKOTodoViewWhatsThis; 590 // delete mKOTodoViewWhatsThis;
589 delete mDocPrefs; 591 delete mDocPrefs;
590} 592}
591QString KOTodoView::getWhatsThisText(QPoint p) 593QString KOTodoView::getWhatsThisText(QPoint p)
592{ 594{
593 KOTodoViewItem* item = ( KOTodoViewItem* ) mTodoListView->itemAt( p ); 595 KOTodoViewItem* item = ( KOTodoViewItem* ) mTodoListView->itemAt( p );
594 if ( item ) 596 if ( item )
595 return KIncidenceFormatter::instance()->getFormattedText( item->todo(), 597 return KIncidenceFormatter::instance()->getFormattedText( item->todo(),
596 KOPrefs::instance()->mWTshowDetails, 598 KOPrefs::instance()->mWTshowDetails,
597 KOPrefs::instance()->mWTshowCreated, 599 KOPrefs::instance()->mWTshowCreated,
598 KOPrefs::instance()->mWTshowChanged); 600 KOPrefs::instance()->mWTshowChanged);
599 return i18n("That is the todo view" ); 601 return i18n("That is the todo view" );
600 602
601} 603}
602 604
603void KOTodoView::jumpToDate () 605void KOTodoView::jumpToDate ()
604{ 606{
605 // if (mActiveItem) { 607 // if (mActiveItem) {
606// mActiveItem->todo()); 608// mActiveItem->todo());
607// if ( mActiveItem->todo()->hasDueDate() ) 609// if ( mActiveItem->todo()->hasDueDate() )
608// emit mActiveItem->todo()jumpToTime( mTodo->dtDue().date() ); 610// emit mActiveItem->todo()jumpToTime( mTodo->dtDue().date() );
609} 611}
610void KOTodoView::paintNeeded() 612void KOTodoView::paintNeeded()
611{ 613{
612 if ( mPendingUpdateBeforeRepaint ) { 614 if ( mPendingUpdateBeforeRepaint ) {
613 updateView(); 615 updateView();
614 mPendingUpdateBeforeRepaint = false; 616 mPendingUpdateBeforeRepaint = false;
615 } 617 }
616} 618}
617void KOTodoView::paintEvent(QPaintEvent * pevent) 619void KOTodoView::paintEvent(QPaintEvent * pevent)
618{ 620{
619 if ( mPendingUpdateBeforeRepaint ) { 621 if ( mPendingUpdateBeforeRepaint ) {
620 updateView(); 622 updateView();
621 mPendingUpdateBeforeRepaint = false; 623 mPendingUpdateBeforeRepaint = false;
622 } 624 }
623 KOrg::BaseView::paintEvent( pevent); 625 KOrg::BaseView::paintEvent( pevent);
624} 626}
625 627
626void KOTodoView::updateView() 628void KOTodoView::updateView()
627{ 629{
628 pendingSubtodo = 0; 630 pendingSubtodo = 0;
629 if ( mBlockUpdate ) { 631 if ( mBlockUpdate ) {
630 return; 632 return;
631 } 633 }
632 if ( !isVisible() ) { 634 if ( !isVisible() ) {
633 mPendingUpdateBeforeRepaint = true; 635 mPendingUpdateBeforeRepaint = true;
634 return; 636 return;
635 } 637 }
636 storeCurrentItem(); 638 storeCurrentItem();
637 //qDebug("KOTodoView::updateView() %x", this); 639 //qDebug("KOTodoView::updateView() %x", this);
638 if ( isFlatDisplay ) { 640 if ( isFlatDisplay ) {
639 displayAllFlat(); 641 displayAllFlat();
640 resetCurrentItem(); 642 resetCurrentItem();
641 return; 643 return;
642 } 644 }
643 //qDebug("update "); 645 //qDebug("update ");
644// kdDebug() << "KOTodoView::updateView()" << endl; 646// kdDebug() << "KOTodoView::updateView()" << endl;
645 QFont fo = KOPrefs::instance()->mTodoViewFont; 647 QFont fo = KOPrefs::instance()->mTodoViewFont;
646 648
647 649
648 mTodoListView->clear(); 650 mTodoListView->clear();
649 if ( mName == "todolistsmall" ) { 651 if ( mName == "todolistsmall" ) {
650 if ( KOPrefs::instance()->mTodoViewUsesSmallFont ) { 652 if ( KOPrefs::instance()->mTodoViewUsesSmallFont ) {
651 int ps = fo.pointSize() -2; 653 int ps = fo.pointSize() -2;
652 if ( ps > 12 ) 654 if ( ps > 12 )
653 ps -= 2; 655 ps -= 2;
654 fo.setPointSize( ps ); 656 fo.setPointSize( ps );
655 } 657 }
656 } 658 }
657 659
658 mTodoListView->setFont( fo ); 660 mTodoListView->setFont( fo );
659 // QFontMetrics fm ( KOPrefs::instance()->mTodoViewFont ); 661 // QFontMetrics fm ( KOPrefs::instance()->mTodoViewFont );
660 //mTodoListView->header()->setMaximumHeight(fm.height()); 662 //mTodoListView->header()->setMaximumHeight(fm.height());
661 QPtrList<Todo> todoList = calendar()->todos(); 663 QPtrList<Todo> todoList = calendar()->todos();
662 664
663/* 665/*
664 kdDebug() << "KOTodoView::updateView(): Todo List:" << endl; 666 kdDebug() << "KOTodoView::updateView(): Todo List:" << endl;
665 Event *t; 667 Event *t;
666 for(t = todoList.first(); t; t = todoList.next()) { 668 for(t = todoList.first(); t; t = todoList.next()) {
667 kdDebug() << " " << t->getSummary() << endl; 669 kdDebug() << " " << t->getSummary() << endl;
668 670
669 if (t->getRelatedTo()) { 671 if (t->getRelatedTo()) {
670 kdDebug() << " (related to " << t->getRelatedTo()->getSummary() << ")" << endl; 672 kdDebug() << " (related to " << t->getRelatedTo()->getSummary() << ")" << endl;
671 } 673 }
672 674
673 QPtrList<Event> l = t->getRelations(); 675 QPtrList<Event> l = t->getRelations();
674 Event *c; 676 Event *c;
675 for(c=l.first();c;c=l.next()) { 677 for(c=l.first();c;c=l.next()) {
676 kdDebug() << " - relation: " << c->getSummary() << endl; 678 kdDebug() << " - relation: " << c->getSummary() << endl;
677 } 679 }
678 } 680 }
679*/ 681*/
680 682
681 // Put for each Event a KOTodoViewItem in the list view. Don't rely on a 683 // Put for each Event a KOTodoViewItem in the list view. Don't rely on a
682 // specific order of events. That means that we have to generate parent items 684 // specific order of events. That means that we have to generate parent items
683 // recursively for proper hierarchical display of Todos. 685 // recursively for proper hierarchical display of Todos.
684 mTodoMap.clear(); 686 mTodoMap.clear();
685 Todo *todo; 687 Todo *todo;
686 todo = todoList.first();// todo; todo = todoList.next()) { 688 todo = todoList.first();// todo; todo = todoList.next()) {
687 while ( todo ) { 689 while ( todo ) {
688 bool next = true; 690 bool next = true;
689 // qDebug("todo %s ", todo->summary().latin1()); 691 // qDebug("todo %s ", todo->summary().latin1());
690 Incidence *incidence = todo->relatedTo(); 692 Incidence *incidence = todo->relatedTo();
691 while ( incidence ) { 693 while ( incidence ) {
692 if ( incidence->type() == "Todo") { 694 if ( incidence->type() == "Todo") {
693 //qDebug("related %s ",incidence->summary().latin1() ); 695 //qDebug("related %s ",incidence->summary().latin1() );
694 if ( !(todoList.contains ( ((Todo* )incidence ) ) )) { 696 if ( !(todoList.contains ( ((Todo* )incidence ) ) )) {
695 //qDebug("related not found "); 697 //qDebug("related not found ");
696 todoList.remove( ); 698 todoList.remove( );
697 todo = todoList.current(); 699 todo = todoList.current();
698 next = false; 700 next = false;
699 incidence = 0; 701 incidence = 0;
700 702
701 } else { 703 } else {
702 //qDebug("related found "); 704 //qDebug("related found ");
703 incidence = incidence->relatedTo(); 705 incidence = incidence->relatedTo();
704 } 706 }
705 } else 707 } else
706 incidence = 0; 708 incidence = 0;
707 } 709 }
708 if ( next ) 710 if ( next )
709 todo = todoList.next(); 711 todo = todoList.next();
710 } 712 }
711 713
712 for(todo = todoList.first(); todo; todo = todoList.next()) { 714 for(todo = todoList.first(); todo; todo = todoList.next()) {
713 if (!mTodoMap.contains(todo) && checkTodo( todo ) ) 715 if (!mTodoMap.contains(todo) && checkTodo( todo ) )
714 { 716 {
715 insertTodoItem(todo); 717 insertTodoItem(todo);
716 } 718 }
717 } 719 }
718 // Restore opened/closed state 720 // Restore opened/closed state
719 mTodoListView->blockSignals( true ); 721 mTodoListView->blockSignals( true );
720 if( mDocPrefs ) restoreItemState( mTodoListView->firstChild() ); 722 if( mDocPrefs ) restoreItemState( mTodoListView->firstChild() );
721 mTodoListView->blockSignals( false ); 723 mTodoListView->blockSignals( false );
722 resetCurrentItem(); 724 resetCurrentItem();
723 processSelectionChange(); 725 processSelectionChange();
724} 726}
725 727
726void KOTodoView::storeCurrentItem() 728void KOTodoView::storeCurrentItem()
727{ 729{
728 mCurItem = 0; 730 mCurItem = 0;
729 mCurItemRootParent = 0; 731 mCurItemRootParent = 0;
730 mCurItemParent = 0; 732 mCurItemParent = 0;
731 mCurItemAbove = 0; 733 mCurItemAbove = 0;
732 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem(); 734 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem();
733 if (mActiveItem) { 735 if (mActiveItem) {
734 mCurItem = mActiveItem->todo(); 736 mCurItem = mActiveItem->todo();
735 KOTodoViewItem* activeItemAbove = (KOTodoViewItem*)mActiveItem->itemAbove (); 737 KOTodoViewItem* activeItemAbove = (KOTodoViewItem*)mActiveItem->itemAbove ();
736 if ( activeItemAbove ) 738 if ( activeItemAbove )
737 mCurItemAbove = activeItemAbove->todo(); 739 mCurItemAbove = activeItemAbove->todo();
738 mCurItemRootParent = mCurItem; 740 mCurItemRootParent = mCurItem;
739 mCurItemParent = mCurItemRootParent->relatedTo(); 741 mCurItemParent = mCurItemRootParent->relatedTo();
740 while ( mCurItemRootParent->relatedTo() != 0 ) 742 while ( mCurItemRootParent->relatedTo() != 0 )
741 mCurItemRootParent = mCurItemRootParent->relatedTo(); 743 mCurItemRootParent = mCurItemRootParent->relatedTo();
742 } 744 }
743 mActiveItem = 0; 745 mActiveItem = 0;
744} 746}
745 747
746void KOTodoView::resetCurrentItem() 748void KOTodoView::resetCurrentItem()
747{ 749{
748 mTodoListView->setFocus(); 750 mTodoListView->setFocus();
749 KOTodoViewItem* foundItem = 0; 751 KOTodoViewItem* foundItem = 0;
750 KOTodoViewItem* foundItemRoot = 0; 752 KOTodoViewItem* foundItemRoot = 0;
751 KOTodoViewItem* foundItemParent = 0; 753 KOTodoViewItem* foundItemParent = 0;
752 KOTodoViewItem* foundItemAbove = 0; 754 KOTodoViewItem* foundItemAbove = 0;
753 if ( mTodoListView->firstChild () ) { 755 if ( mTodoListView->firstChild () ) {
754 if ( mCurItem ) { 756 if ( mCurItem ) {
755 KOTodoViewItem* item = (KOTodoViewItem*)mTodoListView->firstChild (); 757 KOTodoViewItem* item = (KOTodoViewItem*)mTodoListView->firstChild ();
756 while ( item ) { 758 while ( item ) {
757 if ( item->todo() == mCurItem ) { 759 if ( item->todo() == mCurItem ) {
758 foundItem = item; 760 foundItem = item;
759 break; 761 break;
760 } else if ( item->todo() == mCurItemAbove ) { 762 } else if ( item->todo() == mCurItemAbove ) {
761 foundItemAbove = item; 763 foundItemAbove = item;
762 764
763 } 765 }
764 if ( item->todo() == mCurItemRootParent ) { 766 if ( item->todo() == mCurItemRootParent ) {
765 foundItemRoot = item; 767 foundItemRoot = item;
766 } 768 }
767 if ( item->todo() == mCurItemParent ) { 769 if ( item->todo() == mCurItemParent ) {
768 foundItemParent = item; 770 foundItemParent = item;
769 } 771 }
770 item = (KOTodoViewItem*)item->itemBelow(); 772 item = (KOTodoViewItem*)item->itemBelow();
771 } 773 }
772 if ( ! foundItem ) { 774 if ( ! foundItem ) {
773 if ( foundItemParent ) { 775 if ( foundItemParent ) {
774 foundItem = foundItemParent; 776 foundItem = foundItemParent;
775 } else { 777 } else {
776 if ( foundItemRoot ) 778 if ( foundItemRoot )
777 foundItem = foundItemRoot; 779 foundItem = foundItemRoot;
778 else 780 else
779 foundItem = foundItemAbove; 781 foundItem = foundItemAbove;
780 } 782 }
781 } 783 }
782 } 784 }
783 if ( foundItem ) { 785 if ( foundItem ) {
784 mTodoListView->setCurrentItem( foundItem ); 786 mTodoListView->setCurrentItem( foundItem );
785 mTodoListView->ensureItemVisible( foundItem ); 787 mTodoListView->ensureItemVisible( foundItem );
786 } else { 788 } else {
787 mTodoListView->setCurrentItem( mTodoListView->firstChild () ); 789 mTodoListView->setCurrentItem( mTodoListView->firstChild () );
788 } 790 }
789 } 791 }
790 mTodoListView->setFocus(); 792 mTodoListView->setFocus();
791} 793}
792//Incidence * mCurItem, *mCurItemRootParent,*mCurItemAbove; 794//Incidence * mCurItem, *mCurItemRootParent,*mCurItemAbove;
793bool KOTodoView::checkTodo( Todo * todo ) 795bool KOTodoView::checkTodo( Todo * todo )
794{ 796{
795 797
796 if ( !KOPrefs::instance()->mShowCompletedTodo && todo->isCompleted() ) 798 if ( !KOPrefs::instance()->mShowCompletedTodo && todo->isCompleted() )
797 return false; 799 return false;
798 if ( !todo->isCompleted() ) { 800 if ( !todo->isCompleted() ) {
799 if ( todo->hasDueDate() && todo->dtDue().date() <= QDate::currentDate() ) 801 if ( todo->hasDueDate() && todo->dtDue().date() <= QDate::currentDate() )
800 return true; 802 return true;
801 } 803 }
802 if ( KOPrefs::instance()->mHideNonStartedTodos && mNavigator ) { 804 if ( KOPrefs::instance()->mHideNonStartedTodos && mNavigator ) {
803 if ( todo->hasStartDate() ) 805 if ( todo->hasStartDate() )
804 if ( mNavigator->selectedDates().last() < todo->dtStart().date() ) 806 if ( mNavigator->selectedDates().last() < todo->dtStart().date() )
805 return false; 807 return false;
806 if ( todo->hasDueDate() ) 808 if ( todo->hasDueDate() )
807 if ( mNavigator->selectedDates().first() > todo->dtDue().date() ) 809 if ( mNavigator->selectedDates().first() > todo->dtDue().date() )
808 return false; 810 return false;
809 } 811 }
810 return true; 812 return true;
811} 813}
812 814
813void KOTodoView::restoreItemState( QListViewItem *item ) 815void KOTodoView::restoreItemState( QListViewItem *item )
814{ 816{
815 pendingSubtodo = 0; 817 pendingSubtodo = 0;
816 while( item ) { 818 while( item ) {
817 KOTodoViewItem *todoItem = (KOTodoViewItem *)item; 819 KOTodoViewItem *todoItem = (KOTodoViewItem *)item;
818 todoItem->setOpen( mDocPrefs->readBoolEntry( todoItem->todo()->uid() ) ); 820 todoItem->setOpen( mDocPrefs->readBoolEntry( todoItem->todo()->uid() ) );
819 if( item->childCount() > 0 ) restoreItemState( item->firstChild() ); 821 if( item->childCount() > 0 ) restoreItemState( item->firstChild() );
820 item = item->nextSibling(); 822 item = item->nextSibling();
821 } 823 }
822} 824}
823 825
824 826
825QMap<Todo *,KOTodoViewItem *>::ConstIterator 827QMap<Todo *,KOTodoViewItem *>::ConstIterator
826 KOTodoView::insertTodoItem(Todo *todo) 828 KOTodoView::insertTodoItem(Todo *todo)
827{ 829{
828 830
829// kdDebug() << "KOTodoView::insertTodoItem(): " << todo->getSummary() << endl; 831// kdDebug() << "KOTodoView::insertTodoItem(): " << todo->getSummary() << endl;
830 // TODO: Check, if dynmaic cast is necessary 832 // TODO: Check, if dynmaic cast is necessary
831 833
832 pendingSubtodo = 0; 834 pendingSubtodo = 0;
833 Incidence *incidence = todo->relatedTo(); 835 Incidence *incidence = todo->relatedTo();
834 if (incidence && incidence->type() == "Todo") { 836 if (incidence && incidence->type() == "Todo") {
835 Todo *relatedTodo = static_cast<Todo *>(incidence); 837 Todo *relatedTodo = static_cast<Todo *>(incidence);
836 838
837// kdDebug() << " has Related" << endl; 839// kdDebug() << " has Related" << endl;
838 QMap<Todo *,KOTodoViewItem *>::ConstIterator itemIterator; 840 QMap<Todo *,KOTodoViewItem *>::ConstIterator itemIterator;
839 itemIterator = mTodoMap.find(relatedTodo); 841 itemIterator = mTodoMap.find(relatedTodo);
840 if (itemIterator == mTodoMap.end()) { 842 if (itemIterator == mTodoMap.end()) {
841// kdDebug() << " related not yet in list" << endl; 843// kdDebug() << " related not yet in list" << endl;
842 itemIterator = insertTodoItem (relatedTodo); 844 itemIterator = insertTodoItem (relatedTodo);
843 } 845 }
844 // isn't this pretty stupid? We give one Todo to the KOTodoViewItem 846 // isn't this pretty stupid? We give one Todo to the KOTodoViewItem
845 // and one into the map. Sure finding is more easy but why? -zecke 847 // and one into the map. Sure finding is more easy but why? -zecke
846 KOTodoViewItem *todoItem = new KOTodoViewItem(*itemIterator,todo,this); 848 KOTodoViewItem *todoItem = new KOTodoViewItem(*itemIterator,todo,this);
847 return mTodoMap.insert(todo,todoItem); 849 return mTodoMap.insert(todo,todoItem);
848 } else { 850 } else {
849// kdDebug() << " no Related" << endl; 851// kdDebug() << " no Related" << endl;
850 // see above -zecke 852 // see above -zecke
851 KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this); 853 KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this);
852 return mTodoMap.insert(todo,todoItem); 854 return mTodoMap.insert(todo,todoItem);
853 } 855 }
854} 856}
855 857
856 858
857void KOTodoView::updateConfig() 859void KOTodoView::updateConfig()
858{ 860{
859 updateView(); 861 updateView();
860 mTodoListView->repaintContents(); 862 mTodoListView->repaintContents();
861} 863}
862 864
863QPtrList<Incidence> KOTodoView::selectedIncidences() 865QPtrList<Incidence> KOTodoView::selectedIncidences()
864{ 866{
865 QPtrList<Incidence> selected; 867 QPtrList<Incidence> selected;
866 868
867 KOTodoViewItem *item = (KOTodoViewItem *)(mTodoListView->selectedItem()); 869 KOTodoViewItem *item = (KOTodoViewItem *)(mTodoListView->selectedItem());
868// if (!item) item = mActiveItem; 870// if (!item) item = mActiveItem;
869 if (item) selected.append(item->todo()); 871 if (item) selected.append(item->todo());
870 872
871 return selected; 873 return selected;
872} 874}
873 875
874QPtrList<Todo> KOTodoView::selectedTodos() 876QPtrList<Todo> KOTodoView::selectedTodos()
875{ 877{
876 QPtrList<Todo> selected; 878 QPtrList<Todo> selected;
877 879
878 KOTodoViewItem *item = (KOTodoViewItem *)(mTodoListView->selectedItem()); 880 KOTodoViewItem *item = (KOTodoViewItem *)(mTodoListView->selectedItem());
879// if (!item) item = mActiveItem; 881// if (!item) item = mActiveItem;
880 if (item) selected.append(item->todo()); 882 if (item) selected.append(item->todo());
881 883
882 return selected; 884 return selected;
883} 885}
884 886
885void KOTodoView::changeEventDisplay(Event *, int) 887void KOTodoView::changeEventDisplay(Event *, int)
886{ 888{
887 updateView(); 889 updateView();
888} 890}
889 891
890void KOTodoView::showDates(const QDate &, const QDate &) 892void KOTodoView::showDates(const QDate &, const QDate &)
891{ 893{
892} 894}
893 895
894void KOTodoView::showEvents(QPtrList<Event>) 896void KOTodoView::showEvents(QPtrList<Event>)
895{ 897{
896 kdDebug() << "KOTodoView::selectEvents(): not yet implemented" << endl; 898 kdDebug() << "KOTodoView::selectEvents(): not yet implemented" << endl;
897} 899}
898 900
899void KOTodoView::printPreview(CalPrinter *calPrinter, const QDate &fd, 901void KOTodoView::printPreview(CalPrinter *calPrinter, const QDate &fd,
900 const QDate &td) 902 const QDate &td)
901{ 903{
902#ifndef KORG_NOPRINTER 904#ifndef KORG_NOPRINTER
903 calPrinter->preview(CalPrinter::Todolist, fd, td); 905 calPrinter->preview(CalPrinter::Todolist, fd, td);
904#endif 906#endif
905} 907}
906 908
907void KOTodoView::editItem(QListViewItem *item ) 909void KOTodoView::editItem(QListViewItem *item )
908{ 910{
909 emit editTodoSignal(((KOTodoViewItem *)item)->todo()); 911 emit editTodoSignal(((KOTodoViewItem *)item)->todo());
910} 912}
911 913
912void KOTodoView::showItem(QListViewItem *item,const QPoint &,int) 914void KOTodoView::showItem(QListViewItem *item,const QPoint &,int)
913{ 915{
914 emit showTodoSignal(((KOTodoViewItem *)item)->todo()); 916 emit showTodoSignal(((KOTodoViewItem *)item)->todo());
915} 917}
916 918
917void KOTodoView::popupMenu(QListViewItem *item,const QPoint &p,int column) 919void KOTodoView::popupMenu(QListViewItem *item,const QPoint &p,int column)
918{ 920{
919 pendingSubtodo = 0; 921 pendingSubtodo = 0;
920 mActiveItem = (KOTodoViewItem *)item; 922 mActiveItem = (KOTodoViewItem *)item;
921 if (item) { 923 if (item) {
922 switch (column){ 924 switch (column){
923 case 1: 925 case 1:
924 mPriorityPopupMenu->popup(QCursor::pos ()); break; 926 mPriorityPopupMenu->popup(QCursor::pos ()); break;
925 case 2: 927 case 2:
926 mPercentageCompletedPopupMenu->popup(QCursor::pos ()); break; 928 mPercentageCompletedPopupMenu->popup(QCursor::pos ()); break;
927 case 3: 929 case 3:
928 moveTodo(); 930 moveTodo();
929 break; 931 break;
930 case 8: 932 case 8:
931 getCategoryPopupMenu((KOTodoViewItem *)item)->popup(QCursor::pos ()); break; 933 getCategoryPopupMenu((KOTodoViewItem *)item)->popup(QCursor::pos ()); break;
932 default: 934 default:
933 mItemPopupMenu->popup(QCursor::pos()); 935 mItemPopupMenu->popup(QCursor::pos());
934 } 936 }
935 } else mPopupMenu->popup(QCursor::pos()); 937 } else mPopupMenu->popup(QCursor::pos());
936} 938}
937void KOTodoView::newTodo() 939void KOTodoView::newTodo()
938{ 940{
939 emit newTodoSignal(); 941 emit newTodoSignal();
940} 942}
941 943
942void KOTodoView::newSubTodo() 944void KOTodoView::newSubTodo()
943{ 945{
944 if (mActiveItem) { 946 if (mActiveItem) {
945 emit newSubTodoSignal(mActiveItem->todo()); 947 emit newSubTodoSignal(mActiveItem->todo());
946 } 948 }
947} 949}
948void KOTodoView::unparentTodo() 950void KOTodoView::unparentTodo()
949{ 951{
950 if (mActiveItem) { 952 if (mActiveItem) {
951 emit unparentTodoSignal(mActiveItem->todo()); 953 emit unparentTodoSignal(mActiveItem->todo());
952 } 954 }
953} 955}
954 956
955void KOTodoView::reparentTodo() 957void KOTodoView::reparentTodo()
956{ 958{
957 if (mActiveItem) { 959 if (mActiveItem) {
958 topLevelWidget()->setCaption(i18n("Click on new parent item")); 960 topLevelWidget()->setCaption(i18n("Click on new parent item"));
959 pendingSubtodo = mActiveItem; 961 pendingSubtodo = mActiveItem;
960 } 962 }
961} 963}
962void KOTodoView::editTodo() 964void KOTodoView::editTodo()
963{ 965{
964 if (mActiveItem) { 966 if (mActiveItem) {
965 emit editTodoSignal(mActiveItem->todo()); 967 emit editTodoSignal(mActiveItem->todo());
966 } 968 }
967} 969}
968void KOTodoView::cloneTodo() 970void KOTodoView::cloneTodo()
969{ 971{
970 if (mActiveItem) { 972 if (mActiveItem) {
971 emit cloneTodoSignal((Incidence*)mActiveItem->todo()); 973 emit cloneTodoSignal((Incidence*)mActiveItem->todo());
972 } 974 }
973} 975}
974void KOTodoView::cancelTodo() 976void KOTodoView::cancelTodo()
975{ 977{
976 if (mActiveItem) { 978 if (mActiveItem) {
977 emit cancelTodoSignal((Incidence*)mActiveItem->todo()); 979 emit cancelTodoSignal((Incidence*)mActiveItem->todo());
978 } 980 }
979} 981}
980void KOTodoView::moveTodo() 982void KOTodoView::moveTodo()
981{ 983{
982 if (mActiveItem) { 984 if (mActiveItem) {
983 emit moveTodoSignal((Incidence*)mActiveItem->todo()); 985 emit moveTodoSignal((Incidence*)mActiveItem->todo());
984 } 986 }
985} 987}
986void KOTodoView::beamTodo() 988void KOTodoView::beamTodo()
987{ 989{
988 if (mActiveItem) { 990 if (mActiveItem) {
989 emit beamTodoSignal((Incidence*)mActiveItem->todo()); 991 emit beamTodoSignal((Incidence*)mActiveItem->todo());
990 } 992 }
991} 993}
992 994
993 995
994void KOTodoView::showTodo() 996void KOTodoView::showTodo()
995{ 997{
996 if (mActiveItem) { 998 if (mActiveItem) {
997 emit showTodoSignal(mActiveItem->todo()); 999 emit showTodoSignal(mActiveItem->todo());
998 } 1000 }
999} 1001}
1000 1002
1001void KOTodoView::deleteTodo() 1003void KOTodoView::deleteTodo()
1002{ 1004{
1003 if (mActiveItem) { 1005 if (mActiveItem) {
1004 emit deleteTodoSignal(mActiveItem->todo()); 1006 emit deleteTodoSignal(mActiveItem->todo());
1005 } 1007 }
1006} 1008}
1007 1009
1008void KOTodoView::setNewPriority(int index) 1010void KOTodoView::setNewPriority(int index)
1009{ 1011{
1010 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) { 1012 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) {
1011 mActiveItem->todo()->setPriority(mPriority[index]); 1013 mActiveItem->todo()->setPriority(mPriority[index]);
1012 mActiveItem->construct(); 1014 mActiveItem->construct();
1013 todoModified (mActiveItem->todo(), KOGlobals::PRIORITY_MODIFIED); 1015 todoModified (mActiveItem->todo(), KOGlobals::PRIORITY_MODIFIED);
1014 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 ); 1016 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 );
1015 } 1017 }
1016} 1018}
1017 1019
1018void KOTodoView::setNewPercentage(int index) 1020void KOTodoView::setNewPercentage(int index)
1019{ 1021{
1020 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) { 1022 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) {
1021 1023
1022 if ( mPercentage[index] == 100 && !mActiveItem->isOn() ) { 1024 if ( mPercentage[index] == 100 && !mActiveItem->isOn() ) {
1023 mActiveItem->setOn( true ); 1025 mActiveItem->setOn( true );
1024 return; 1026 return;
1025 } else if ( mPercentage[index] != 100 && mActiveItem->isOn() ) { 1027 } else if ( mPercentage[index] != 100 && mActiveItem->isOn() ) {
1026 KOTodoViewItem* par = (static_cast<KOTodoViewItem*>(mActiveItem->parent())); 1028 KOTodoViewItem* par = (static_cast<KOTodoViewItem*>(mActiveItem->parent()));
1027 if ( par && par->isOn() ) 1029 if ( par && par->isOn() )
1028 par->setOn( false ); 1030 par->setOn( false );
1029 } 1031 }
1030 if (mPercentage[index] == 100) { 1032 if (mPercentage[index] == 100) {
1031 mActiveItem->todo()->setCompleted(QDateTime::currentDateTime()); 1033 mActiveItem->todo()->setCompleted(QDateTime::currentDateTime());
1032 } else { 1034 } else {
1033 mActiveItem->todo()->setCompleted(false); 1035 mActiveItem->todo()->setCompleted(false);
1034 } 1036 }
1035 mActiveItem->todo()->setPercentComplete(mPercentage[index]); 1037 mActiveItem->todo()->setPercentComplete(mPercentage[index]);
1036 mActiveItem->construct(); 1038 mActiveItem->construct();
1037 todoModified (mActiveItem->todo (), KOGlobals::COMPLETION_MODIFIED); 1039 todoModified (mActiveItem->todo (), KOGlobals::COMPLETION_MODIFIED);
1038 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 ); 1040 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 );
1039 } 1041 }
1040} 1042}
1041 1043
1042 1044
1043QPopupMenu * KOTodoView::getCategoryPopupMenu (KOTodoViewItem *todoItem) 1045QPopupMenu * KOTodoView::getCategoryPopupMenu (KOTodoViewItem *todoItem)
1044{ 1046{
1045 QPopupMenu* tempMenu = new QPopupMenu (this); 1047 QPopupMenu* tempMenu = new QPopupMenu (this);
1046 QStringList checkedCategories = todoItem->todo()->categories (); 1048 QStringList checkedCategories = todoItem->todo()->categories ();
1047 1049
1048 tempMenu->setCheckable (true); 1050 tempMenu->setCheckable (true);
1049 for (QStringList::Iterator it = KOPrefs::instance()->mCustomCategories.begin (); 1051 for (QStringList::Iterator it = KOPrefs::instance()->mCustomCategories.begin ();
1050 it != KOPrefs::instance()->mCustomCategories.end (); 1052 it != KOPrefs::instance()->mCustomCategories.end ();
1051 ++it) { 1053 ++it) {
1052 int index = tempMenu->insertItem (*it); 1054 int index = tempMenu->insertItem (*it);
1053 mCategory[index] = *it; 1055 mCategory[index] = *it;
1054 if (checkedCategories.find (*it) != checkedCategories.end ()) tempMenu->setItemChecked (index, true); 1056 if (checkedCategories.find (*it) != checkedCategories.end ()) tempMenu->setItemChecked (index, true);
1055 } 1057 }
1056 1058
1057 connect (tempMenu, SIGNAL (activated (int)), SLOT (changedCategories (int))); 1059 connect (tempMenu, SIGNAL (activated (int)), SLOT (changedCategories (int)));
1058 return tempMenu; 1060 return tempMenu;
1059 1061
1060 1062
1061} 1063}
1062void KOTodoView::changedCategories(int index) 1064void KOTodoView::changedCategories(int index)
1063{ 1065{
1064 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) { 1066 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) {
1065 QStringList categories = mActiveItem->todo()->categories (); 1067 QStringList categories = mActiveItem->todo()->categories ();
1066 QString colcat = categories.first(); 1068 QString colcat = categories.first();
1067 if (categories.find (mCategory[index]) != categories.end ()) 1069 if (categories.find (mCategory[index]) != categories.end ())
1068 categories.remove (mCategory[index]); 1070 categories.remove (mCategory[index]);
1069 else 1071 else
1070 categories.insert (categories.end(), mCategory[index]); 1072 categories.insert (categories.end(), mCategory[index]);
1071 categories.sort (); 1073 categories.sort ();
1072 if ( !colcat.isEmpty() ) { 1074 if ( !colcat.isEmpty() ) {
1073 if ( categories.find ( colcat ) != categories.end () ) { 1075 if ( categories.find ( colcat ) != categories.end () ) {
1074 categories.remove( colcat ); 1076 categories.remove( colcat );
1075 categories.prepend( colcat ); 1077 categories.prepend( colcat );
1076 } 1078 }
1077 } 1079 }
1078 mActiveItem->todo()->setCategories (categories); 1080 mActiveItem->todo()->setCategories (categories);
1079 mActiveItem->construct(); 1081 mActiveItem->construct();
1080 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 ); 1082 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 );
1081 todoModified (mActiveItem->todo (), KOGlobals::CATEGORY_MODIFIED); 1083 todoModified (mActiveItem->todo (), KOGlobals::CATEGORY_MODIFIED);
1082 } 1084 }
1083} 1085}
1084void KOTodoView::itemDoubleClicked(QListViewItem *item) 1086void KOTodoView::itemDoubleClicked(QListViewItem *item)
1085{ 1087{
1086 if ( pendingSubtodo != 0 ) { 1088 if ( pendingSubtodo != 0 ) {
1087 topLevelWidget()->setCaption(i18n("Reparenting aborted!")); 1089 topLevelWidget()->setCaption(i18n("Reparenting aborted!"));
1088 } 1090 }
1089 pendingSubtodo = 0; 1091 pendingSubtodo = 0;
1090 //int row = mTodoListView->header()->sectionAt ( mTodoListView->header()->mapFromGlobal( QCursor::pos()).x() ); 1092 //int row = mTodoListView->header()->sectionAt ( mTodoListView->header()->mapFromGlobal( QCursor::pos()).x() );
1091 int row = mTodoListView->header()->sectionAt ( mTodoListView->viewportToContents(mTodoListView->viewport()->mapFromGlobal( QCursor::pos())) .x() ); 1093 int row = mTodoListView->header()->sectionAt ( mTodoListView->viewportToContents(mTodoListView->viewport()->mapFromGlobal( QCursor::pos())) .x() );
1092 //qDebug("ROW %d ", row); 1094 //qDebug("ROW %d ", row);
1093 if (!item) { 1095 if (!item) {
1094 newTodo(); 1096 newTodo();
1095 return; 1097 return;
1096 } else { 1098 } else {
1097 if ( row == 2 || row == 1 ) { 1099 if ( row == 2 || row == 1 ) {
1098 mActiveItem = (KOTodoViewItem *) item; 1100 mActiveItem = (KOTodoViewItem *) item;
1099 newSubTodo(); 1101 newSubTodo();
1100 return; 1102 return;
1101 } 1103 }
1102 if ( row == 5 || row == 6 ) { 1104 if ( row == 5 || row == 6 ) {
1103 mActiveItem = (KOTodoViewItem *) item; 1105 mActiveItem = (KOTodoViewItem *) item;
1104 toggleRunningItem(); 1106 toggleRunningItem();
1105 return; 1107 return;
1106 } 1108 }
1107 } 1109 }
1108 if ( KOPrefs::instance()->mEditOnDoubleClick ) 1110 if ( KOPrefs::instance()->mEditOnDoubleClick )
1109 editItem( item ); 1111 editItem( item );
1110 else 1112 else
1111 showItem( item , QPoint(), 0 ); 1113 showItem( item , QPoint(), 0 );
1112} 1114}
1113void KOTodoView::toggleRunningItem() 1115void KOTodoView::toggleRunningItem()
1114{ 1116{
1115 // qDebug("KOTodoView::toggleRunning() "); 1117 // qDebug("KOTodoView::toggleRunning() ");
1116 if ( ! mActiveItem ) 1118 if ( ! mActiveItem )
1117 return; 1119 return;
1118 Todo * t = mActiveItem->todo(); 1120 Todo * t = mActiveItem->todo();
1119 if ( t->isRunning() ) { 1121 if ( t->isRunning() ) {
1120 int result = KMessageBox::warningContinueCancel(this, 1122 int result = KMessageBox::warningContinueCancel(this,
1121 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); 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);
1122 if (result != KMessageBox::Continue) return; 1124 if (result != KMessageBox::Continue) return;
1123 t->setRunning( false ); 1125 t->setRunning( false );
1124 mActiveItem->construct(); 1126 mActiveItem->construct();
1125 } else { 1127 } else {
1126 int result = KMessageBox::warningContinueCancel(this, 1128 int result = KMessageBox::warningContinueCancel(this,
1127 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); 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);
1128 if (result != KMessageBox::Continue) return; 1130 if (result != KMessageBox::Continue) return;
1129 t->setRunning( true ); 1131 t->setRunning( true );
1130 mActiveItem->construct(); 1132 mActiveItem->construct();
1131 } 1133 }
1132} 1134}
1133 1135
1134void KOTodoView::itemClicked(QListViewItem *item) 1136void KOTodoView::itemClicked(QListViewItem *item)
1135{ 1137{
1136 //qDebug("KOTodoView::itemClicked %d", item); 1138 //qDebug("KOTodoView::itemClicked %d", item);
1137 if (!item) { 1139 if (!item) {
1138 if ( pendingSubtodo != 0 ) { 1140 if ( pendingSubtodo != 0 ) {
1139 topLevelWidget()->setCaption(i18n("Reparenting aborted!")); 1141 topLevelWidget()->setCaption(i18n("Reparenting aborted!"));
1140 } 1142 }
1141 pendingSubtodo = 0; 1143 pendingSubtodo = 0;
1142 return; 1144 return;
1143 } 1145 }
1144 KOTodoViewItem *todoItem = (KOTodoViewItem *)item; 1146 KOTodoViewItem *todoItem = (KOTodoViewItem *)item;
1145 if ( pendingSubtodo != 0 ) { 1147 if ( pendingSubtodo != 0 ) {
1146 bool allowReparent = true; 1148 bool allowReparent = true;
1147 QListViewItem *par = item; 1149 QListViewItem *par = item;
1148 while ( par ) { 1150 while ( par ) {
1149 if ( par == pendingSubtodo ) { 1151 if ( par == pendingSubtodo ) {
1150 allowReparent = false; 1152 allowReparent = false;
1151 break; 1153 break;
1152 } 1154 }
1153 par = par->parent(); 1155 par = par->parent();
1154 } 1156 }
1155 if ( !allowReparent ) { 1157 if ( !allowReparent ) {
1156 topLevelWidget()->setCaption(i18n("Recursive reparenting not possible!")); 1158 topLevelWidget()->setCaption(i18n("Recursive reparenting not possible!"));
1157 pendingSubtodo = 0; 1159 pendingSubtodo = 0;
1158 } else { 1160 } else {
1159 Todo* newParent = todoItem->todo(); 1161 Todo* newParent = todoItem->todo();
1160 Todo* newSub = pendingSubtodo->todo(); 1162 Todo* newSub = pendingSubtodo->todo();
1161 pendingSubtodo = 0; 1163 pendingSubtodo = 0;
1162 emit reparentTodoSignal( newParent,newSub ); 1164 emit reparentTodoSignal( newParent,newSub );
1163 return; 1165 return;
1164 } 1166 }
1165 } 1167 }
1166 1168
1167} 1169}
1168 1170
1169void KOTodoView::setDocumentId( const QString &id ) 1171void KOTodoView::setDocumentId( const QString &id )
1170{ 1172{
1171 1173
1172 mDocPrefs->setDoc( id ); 1174 mDocPrefs->setDoc( id );
1173} 1175}
1174 1176
1175void KOTodoView::itemStateChanged( QListViewItem *item ) 1177void KOTodoView::itemStateChanged( QListViewItem *item )
1176{ 1178{
1177 if (!item) return; 1179 if (!item) return;
1178 1180
1179 KOTodoViewItem *todoItem = (KOTodoViewItem *)item; 1181 KOTodoViewItem *todoItem = (KOTodoViewItem *)item;
1180 1182
1181// kdDebug() << "KOTodoView::itemStateChanged(): " << todoItem->todo()->summary() << endl; 1183// kdDebug() << "KOTodoView::itemStateChanged(): " << todoItem->todo()->summary() << endl;
1182 1184
1183 if( mDocPrefs ) mDocPrefs->writeEntry( todoItem->todo()->uid(), todoItem->isOpen() ); 1185 if( mDocPrefs ) mDocPrefs->writeEntry( todoItem->todo()->uid(), todoItem->isOpen() );
1184} 1186}
1185 1187
1186void KOTodoView::saveLayout(KConfig *config, const QString &group) const 1188void KOTodoView::saveLayout(KConfig *config, const QString &group) const
1187{ 1189{
1188 mTodoListView->saveLayout(config,group); 1190 mTodoListView->saveLayout(config,group);
1189} 1191}
1190 1192
1191void KOTodoView::restoreLayout(KConfig *config, const QString &group) 1193void KOTodoView::restoreLayout(KConfig *config, const QString &group)
1192{ 1194{
1193 mTodoListView->restoreLayout(config,group); 1195 mTodoListView->restoreLayout(config,group);
1194} 1196}
1195 1197
1196void KOTodoView::processSelectionChange() 1198void KOTodoView::processSelectionChange()
1197{ 1199{
1198// kdDebug() << "KOTodoView::processSelectionChange()" << endl; 1200// kdDebug() << "KOTodoView::processSelectionChange()" << endl;
1199 1201
1200 KOTodoViewItem *item = 1202 KOTodoViewItem *item =
1201 static_cast<KOTodoViewItem *>( mTodoListView->selectedItem() ); 1203 static_cast<KOTodoViewItem *>( mTodoListView->selectedItem() );
1202 1204
1203 if ( !item ) { 1205 if ( !item ) {
1204 emit incidenceSelected( 0 ); 1206 emit incidenceSelected( 0 );
1205 } else { 1207 } else {
1206 emit incidenceSelected( item->todo() ); 1208 emit incidenceSelected( item->todo() );
1207 } 1209 }
1208} 1210}
1209 1211
1210void KOTodoView::modified(bool b) 1212void KOTodoView::modified(bool b)
1211{ 1213{
1212 emit isModified(b); 1214 emit isModified(b);
1213} 1215}
1214void KOTodoView::setTodoModified( Todo* todo ) 1216void KOTodoView::setTodoModified( Todo* todo )
1215{ 1217{
1216 todoModified( todo, KOGlobals::UNKNOWN_MODIFIED ); 1218 todoModified( todo, KOGlobals::UNKNOWN_MODIFIED );
1217} 1219}
1218void KOTodoView::clearSelection() 1220void KOTodoView::clearSelection()
1219{ 1221{
1220 mTodoListView->selectAll( false ); 1222 mTodoListView->selectAll( false );
1221} 1223}
1222void KOTodoView::setAllOpen() 1224void KOTodoView::setAllOpen()
1223{ 1225{
1224 if ( isFlatDisplay ) { 1226 if ( isFlatDisplay ) {
1225 isFlatDisplay = false; 1227 isFlatDisplay = false;
1226 mPopupMenu->setItemChecked( 8,false ); 1228 mPopupMenu->setItemChecked( 8,false );
1227 updateView(); 1229 updateView();
1228 } else { 1230 } else {
1229 storeCurrentItem(); 1231 storeCurrentItem();
1230 } 1232 }
1231 setOpen(mTodoListView->firstChild(), true); 1233 setOpen(mTodoListView->firstChild(), true);
1232 resetCurrentItem(); 1234 resetCurrentItem();
1233} 1235}
1234void KOTodoView::setAllClose() 1236void KOTodoView::setAllClose()
1235{ 1237{
1236 if ( isFlatDisplay ) { 1238 if ( isFlatDisplay ) {
1237 isFlatDisplay = false; 1239 isFlatDisplay = false;
1238 mPopupMenu->setItemChecked( 8,false ); 1240 mPopupMenu->setItemChecked( 8,false );
1239 updateView(); 1241 updateView();
1240 } else { 1242 } else {
1241 storeCurrentItem(); 1243 storeCurrentItem();
1242 } 1244 }
1243 setOpen(mTodoListView->firstChild(), false); 1245 setOpen(mTodoListView->firstChild(), false);
1244 resetCurrentItem(); 1246 resetCurrentItem();
1245} 1247}
1246void KOTodoView::setOpen( QListViewItem* item, bool setOpenI) 1248void KOTodoView::setOpen( QListViewItem* item, bool setOpenI)
1247{ 1249{
1248 1250
1249 while ( item ) { 1251 while ( item ) {
1250 setOpen( item->firstChild(), setOpenI ); 1252 setOpen( item->firstChild(), setOpenI );
1251 item->setOpen( setOpenI ); 1253 item->setOpen( setOpenI );
1252 item = item->nextSibling(); 1254 item = item->nextSibling();
1253 } 1255 }
1254} 1256}
1255 1257
1256void KOTodoView::displayAllFlat() 1258void KOTodoView::displayAllFlat()
1257{ 1259{
1258 pendingSubtodo = 0; 1260 pendingSubtodo = 0;
1259 if ( mBlockUpdate ) { 1261 if ( mBlockUpdate ) {
1260 return; 1262 return;
1261 } 1263 }
1262 mPopupMenu->setItemChecked( 8,true ); 1264 mPopupMenu->setItemChecked( 8,true );
1263 isFlatDisplay = true; 1265 isFlatDisplay = true;
1264 QPtrList<Todo> todoList = calendar()->todos(); 1266 QPtrList<Todo> todoList = calendar()->todos();
1265 mTodoMap.clear(); 1267 mTodoMap.clear();
1266 mTodoListView->clear(); 1268 mTodoListView->clear();
1267 Todo *todo; 1269 Todo *todo;
1268 for(todo = todoList.first(); todo; todo = todoList.next()) { 1270 for(todo = todoList.first(); todo; todo = todoList.next()) {
1269 KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this); 1271 KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this);
1270 mTodoMap.insert(todo,todoItem); 1272 mTodoMap.insert(todo,todoItem);
1271 } 1273 }
1272 mTodoListView->setFocus(); 1274 mTodoListView->setFocus();
1273 processSelectionChange(); 1275 processSelectionChange();
1274} 1276}
1275 1277
1276void KOTodoView::setAllFlat() 1278void KOTodoView::setAllFlat()
1277{ 1279{
1278 if ( isFlatDisplay ) { 1280 if ( isFlatDisplay ) {
1279 isFlatDisplay = false; 1281 isFlatDisplay = false;
1280 mPopupMenu->setItemChecked( 8,false ); 1282 mPopupMenu->setItemChecked( 8,false );
1281 updateView(); 1283 updateView();
1282 return; 1284 return;
1283 } 1285 }
1284 storeCurrentItem(); 1286 storeCurrentItem();
1285 displayAllFlat(); 1287 displayAllFlat();
1286 resetCurrentItem(); 1288 resetCurrentItem();
1287} 1289}
1288 1290
1289void KOTodoView::purgeCompleted() 1291void KOTodoView::purgeCompleted()
1290{ 1292{
1291 emit purgeCompletedSignal(); 1293 emit purgeCompletedSignal();
1292 1294
1293} 1295}
1294void KOTodoView::toggleQuickTodo() 1296void KOTodoView::toggleQuickTodo()
1295{ 1297{
1296 if ( mQuickAdd->isVisible() ) { 1298 if ( mQuickAdd->isVisible() ) {
1297 mQuickAdd->hide(); 1299 mQuickAdd->hide();
1298 KOPrefs::instance()->mEnableQuickTodo = false; 1300 KOPrefs::instance()->mEnableQuickTodo = false;
1299 } 1301 }
1300 else { 1302 else {
1301 mQuickAdd->show(); 1303 mQuickAdd->show();
1302 KOPrefs::instance()->mEnableQuickTodo = true; 1304 KOPrefs::instance()->mEnableQuickTodo = true;
1303 } 1305 }
1304 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo); 1306 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo);
1305 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo ); 1307 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo );
1306} 1308}
1307 1309
1308void KOTodoView::toggleRunning() 1310void KOTodoView::toggleRunning()
1309{ 1311{
1310 KOPrefs::instance()->mHideNonStartedTodos = !KOPrefs::instance()->mHideNonStartedTodos; 1312 KOPrefs::instance()->mHideNonStartedTodos = !KOPrefs::instance()->mHideNonStartedTodos;
1311 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos); 1313 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos);
1312 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos ); 1314 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos );
1313 updateView(); 1315 updateView();
1314} 1316}
1315 1317
1316void KOTodoView::toggleCompleted() 1318void KOTodoView::toggleCompleted()
1317{ 1319{
1318 KOPrefs::instance()->mShowCompletedTodo = !KOPrefs::instance()->mShowCompletedTodo; 1320 KOPrefs::instance()->mShowCompletedTodo = !KOPrefs::instance()->mShowCompletedTodo;
1319 mPopupMenu->setItemChecked( 3,KOPrefs::instance()->mShowCompletedTodo ); 1321 mPopupMenu->setItemChecked( 3,KOPrefs::instance()->mShowCompletedTodo );
1320 mItemPopupMenu->setItemChecked( 33 , KOPrefs::instance()->mShowCompletedTodo ); 1322 mItemPopupMenu->setItemChecked( 33 , KOPrefs::instance()->mShowCompletedTodo );
1321 updateView(); 1323 updateView();
1322} 1324}
1323 1325
1324void KOTodoView::addQuickTodo() 1326void KOTodoView::addQuickTodo()
1325{ 1327{
1326 Todo *todo = new Todo(); 1328 Todo *todo = new Todo();
1327 todo->setSummary(mQuickAdd->text()); 1329 todo->setSummary(mQuickAdd->text());
1328 todo->setOrganizer(KOPrefs::instance()->email()); 1330 todo->setOrganizer(KOPrefs::instance()->email());
1329 CalFilter * cf = mCalendar->filter(); 1331 CalFilter * cf = mCalendar->filter();
1330 if ( cf ) { 1332 if ( cf ) {
1331 if ( cf->isEnabled()&& cf->showCategories()) { 1333 if ( cf->isEnabled()&& cf->showCategories()) {
1332 todo->setCategories(cf->categoryList()); 1334 todo->setCategories(cf->categoryList());
1333 } 1335 }
1334 if ( cf->isEnabled() ) 1336 if ( cf->isEnabled() )
1335 todo->setSecrecy( cf->getSecrecy()); 1337 todo->setSecrecy( cf->getSecrecy());
1336 } 1338 }
1337 mCalendar->addTodo(todo); 1339 mCalendar->addTodo(todo);
1338 mQuickAdd->setText(""); 1340 mQuickAdd->setText("");
1339 todoModified (todo, KOGlobals::EVENTADDED ); 1341 todoModified (todo, KOGlobals::EVENTADDED );
1340 updateView(); 1342 updateView();
1341} 1343}
1342 1344
1343void KOTodoView::keyPressEvent ( QKeyEvent * e ) 1345void KOTodoView::keyPressEvent ( QKeyEvent * e )
1344{ 1346{
1345 // e->ignore(); 1347 // e->ignore();
1346 //return; 1348 //return;
1347 //qDebug("KOTodoView::keyPressEvent "); 1349 //qDebug("KOTodoView::keyPressEvent ");
1348 switch ( e->key() ) { 1350 switch ( e->key() ) {
1349 case Qt::Key_Down: 1351 case Qt::Key_Down:
1350 case Qt::Key_Up: 1352 case Qt::Key_Up:
1351 QWidget::keyPressEvent ( e ); 1353 QWidget::keyPressEvent ( e );
1352 break; 1354 break;
1353 1355
1354 case Qt::Key_Q: 1356 case Qt::Key_Q:
1355 toggleQuickTodo(); 1357 toggleQuickTodo();
1356 break; 1358 break;
1357 case Qt::Key_U: 1359 case Qt::Key_U:
1358 if ( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton ) { 1360 if ( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton ) {
1359 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem(); 1361 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem();
1360 unparentTodo(); 1362 unparentTodo();
1361 e->accept(); 1363 e->accept();
1362 } else 1364 } else
1363 e->ignore(); 1365 e->ignore();
1364 break; 1366 break;
1365 case Qt::Key_S: 1367 case Qt::Key_S:
1366 if ( e->state() == Qt::ControlButton ) { 1368 if ( e->state() == Qt::ControlButton ) {
1367 e->ignore(); 1369 e->ignore();
1368 break; 1370 break;
1369 } 1371 }
1370 if ( e->state() == Qt::ShiftButton ) { 1372 if ( e->state() == Qt::ShiftButton ) {
1371 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem(); 1373 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem();
1372 reparentTodo(); 1374 reparentTodo();
1373 e->accept(); 1375 e->accept();
1374 } else 1376 } else
1375 e->ignore(); 1377 e->ignore();
1376 break; 1378 break;
1377 case Qt::Key_P: 1379 case Qt::Key_P:
1378 if ( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton ) { 1380 if ( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton ) {
1379 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem(); 1381 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem();
1380 if ( pendingSubtodo ) 1382 if ( pendingSubtodo )
1381 itemClicked(mActiveItem); 1383 itemClicked(mActiveItem);
1382 e->accept(); 1384 e->accept();
1383 } else 1385 } else
1384 e->ignore(); 1386 e->ignore();
1385 break; 1387 break;
1386 case Qt::Key_Escape: 1388 case Qt::Key_Escape:
1387 if ( pendingSubtodo ) { 1389 if ( pendingSubtodo ) {
1388 itemClicked(0); 1390 itemClicked(0);
1389 e->accept(); 1391 e->accept();
1390 } else 1392 } else
1391 e->ignore(); 1393 e->ignore();
1392 break; 1394 break;
1393 default: 1395 default:
1394 e->ignore(); 1396 e->ignore();
1395 } 1397 }
1396 1398
1397 if ( true ) { 1399 if ( true ) {
1398 if ( e->key() == Qt::Key_I ) { 1400 if ( e->key() == Qt::Key_I ) {
1399 KOTodoViewItem*cn = (KOTodoViewItem*)mTodoListView->currentItem(); 1401 KOTodoViewItem*cn = (KOTodoViewItem*)mTodoListView->currentItem();
1400 if ( cn ) { 1402 if ( cn ) {
1401 mActiveItem = cn; 1403 mActiveItem = cn;
1402 KOTodoViewItem* ci = (KOTodoViewItem*)( cn ); 1404 KOTodoViewItem* ci = (KOTodoViewItem*)( cn );
1403 if ( ci ){ 1405 if ( ci ){
1404 showTodo(); 1406 showTodo();
1405 cn = (KOTodoViewItem*)cn->itemBelow(); 1407 cn = (KOTodoViewItem*)cn->itemBelow();
1406 if ( cn ) { 1408 if ( cn ) {
1407 mTodoListView->setCurrentItem ( cn ); 1409 mTodoListView->setCurrentItem ( cn );
1408 mTodoListView->ensureItemVisible ( cn ); 1410 mTodoListView->ensureItemVisible ( cn );
1409 } 1411 }
1410 1412
1411 } 1413 }
1412 } 1414 }
1413 e->accept(); 1415 e->accept();
1414 1416
1415 } 1417 }
1416 1418
1417 } 1419 }
1418 1420
1419} 1421}
1420void KOTodoView::updateTodo( Todo * t, int type ) 1422void KOTodoView::updateTodo( Todo * t, int type )
1421{ 1423{
1422 if ( mBlockUpdate) 1424 if ( mBlockUpdate)
1423 return; 1425 return;
1424 1426
1425 QMap<Todo *,KOTodoViewItem *>::ConstIterator itemIterator; 1427 QMap<Todo *,KOTodoViewItem *>::ConstIterator itemIterator;
1426 itemIterator = mTodoMap.find(t); 1428 itemIterator = mTodoMap.find(t);
1427 if (itemIterator != mTodoMap.end()) { 1429 if (itemIterator != mTodoMap.end()) {
1428 (*itemIterator)->construct(); 1430 (*itemIterator)->construct();
1429 } else { 1431 } else {
1430 if ( type == KOGlobals::EVENTADDED ) { 1432 if ( type == KOGlobals::EVENTADDED ) {
1431 insertTodoItem( t ); 1433 insertTodoItem( t );
1432 } 1434 }
1433 } 1435 }
1434 1436
1435} 1437}
1436 1438
1437void KOTodoView::todoModified(Todo * t , int p ) 1439void KOTodoView::todoModified(Todo * t , int p )
1438{ 1440{
1439 mBlockUpdate = true; 1441 mBlockUpdate = true;
1440 emit todoModifiedSignal ( t, p ); 1442 emit todoModifiedSignal ( t, p );
1441 mBlockUpdate = false; 1443 mBlockUpdate = false;
1442} 1444}