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
@@ -83,789 +83,791 @@ KOTodoListView::KOTodoListView(Calendar *calendar,QWidget *parent,
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;