summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/WhatsNew.txt3
-rw-r--r--kmicromail/viewmail.cpp23
-rw-r--r--kmicromail/viewmail.h2
3 files changed, 25 insertions, 3 deletions
diff --git a/bin/kdepim/WhatsNew.txt b/bin/kdepim/WhatsNew.txt
index 0596511..86ac9b5 100644
--- a/bin/kdepim/WhatsNew.txt
+++ b/bin/kdepim/WhatsNew.txt
@@ -1,139 +1,142 @@
1Info about the changes in new versions of KDE-Pim/Pi 1Info about the changes in new versions of KDE-Pim/Pi
2 2
3********** VERSION 2.0.12 ************ 3********** VERSION 2.0.12 ************
4 4
5KO/Pi: 5KO/Pi:
6Fixed a bug in todo start/due date handling for non recurring todos with a start and due date. 6Fixed a bug in todo start/due date handling for non recurring todos with a start and due date.
7Fixed some layout problems in the KO/Pi agenda view when there were many conflicting itmes. 7Fixed some layout problems in the KO/Pi agenda view when there were many conflicting itmes.
8Fixed several problems of the keyboard focus in the desktop versions when opening the search dialog/event viewer. 8Fixed several problems of the keyboard focus in the desktop versions when opening the search dialog/event viewer.
9 9
10Fixed problem in pi-sync mode when wrong password was sent. 10Fixed problem in pi-sync mode when wrong password was sent.
11 11
12OM/Pi:
13Fixed a crash when displaying mails with "Show mail as html" was checked in the config.
14Added a check before displaying the mail if the mail is in html format, if "Show mail as html" is enabled.
12 15
13********** VERSION 2.0.11 ************ 16********** VERSION 2.0.11 ************
14 17
15Fixed some problems in pi-sync mode 18Fixed some problems in pi-sync mode
16(e.g. details of events were not synced properly) 19(e.g. details of events were not synced properly)
17 20
18********** VERSION 2.0.10 ************ 21********** VERSION 2.0.10 ************
19 22
20KO/Pi: 23KO/Pi:
21In the desktop versions the context menu in the search dialog was broken after introducing the What'sThis info for the list view. 24In the desktop versions the context menu in the search dialog was broken after introducing the What'sThis info for the list view.
22This is fixed. 25This is fixed.
23Changed the search dialog a bit to make it more user friendly. 26Changed the search dialog a bit to make it more user friendly.
24(E.g.: Removed message box about "no items found" and set key focus to search line edit after search). 27(E.g.: Removed message box about "no items found" and set key focus to search line edit after search).
25 28
26Added config option to hide the week number in KO/Pi toolbar. 29Added config option to hide the week number in KO/Pi toolbar.
27 30
28********** VERSION 2.0.9 ************ 31********** VERSION 2.0.9 ************
29 32
30Made month view icons for multiday events a bit nicer. 33Made month view icons for multiday events a bit nicer.
31Some minor fixes in KO/Pi 34Some minor fixes in KO/Pi
32(e.g. go to today did not work for new week view properly). 35(e.g. go to today did not work for new week view properly).
33 36
34 37
35********** VERSION 2.0.8 ************ 38********** VERSION 2.0.8 ************
36 39
37Fixed a problem in dependency info in the ipk files for the Zaurus. 40Fixed a problem in dependency info in the ipk files for the Zaurus.
38 41
39Added icon for the stealth new week view and made navigation more user friendly in monthview by adding a prev/next week button to the navigator bar. 42Added icon for the stealth new week view and made navigation more user friendly in monthview by adding a prev/next week button to the navigator bar.
40 43
41Added a "go today" button to the datepicker. 44Added a "go today" button to the datepicker.
42 45
43Added "created" and "last modified" to event/todo viewer (and What'sThis viewer) 46Added "created" and "last modified" to event/todo viewer (and What'sThis viewer)
44and made it configureable to show these values. 47and made it configureable to show these values.
45 48
46Fixed a problem for events (from external iCal files) that do have a duration but no end date. 49Fixed a problem for events (from external iCal files) that do have a duration but no end date.
47 50
48 51
49********** VERSION 2.0.7 ************ 52********** VERSION 2.0.7 ************
50 53
51Added global application font settings 54Added global application font settings
52(for all KDE-Pim/Pi apps) to the general settings. 55(for all KDE-Pim/Pi apps) to the general settings.
53 56
54Fixed a problem in OM/Pi when trying to login to some IMAP servers 57Fixed a problem in OM/Pi when trying to login to some IMAP servers
55(like the IMAP server of Apple: mail.mac.com ) 58(like the IMAP server of Apple: mail.mac.com )
56 59
57Added recurring todos to KO/Pi. 60Added recurring todos to KO/Pi.
58 61
59 62
60********** VERSION 2.0.6 ************ 63********** VERSION 2.0.6 ************
61 64
62Some bugfixes in the pi-sync mode. 65Some bugfixes in the pi-sync mode.
63Added German translation for pi-sync mode. 66Added German translation for pi-sync mode.
64 67
65KO/Pi: 68KO/Pi:
66Made the todolist using alternate background. 69Made the todolist using alternate background.
67 70
68Other minor fixes in KO/Pi. 71Other minor fixes in KO/Pi.
69 72
70 73
71********** VERSION 2.0.5 ************ 74********** VERSION 2.0.5 ************
72 75
73Bugfixes in KO/Pi. 76Bugfixes in KO/Pi.
74 77
75********** VERSION 2.0.4 ************ 78********** VERSION 2.0.4 ************
76 79
77KO/Pi: 80KO/Pi:
78Fixed problem loading translations for summary/location edit boxes in event/todo editor. 81Fixed problem loading translations for summary/location edit boxes in event/todo editor.
79 82
80Added a general "select week number" to the toolbar. 83Added a general "select week number" to the toolbar.
81 84
82Fixed some small problem of the new features introduced in version 2.0.3. 85Fixed some small problem of the new features introduced in version 2.0.3.
83 86
84Made it possible to specify one specific category as category color, 87Made it possible to specify one specific category as category color,
85if more than one categories are selected. 88if more than one categories are selected.
86 89
87Fixed a bug in saving colors for categories with non-ascii characters. 90Fixed a bug in saving colors for categories with non-ascii characters.
88(Like, e.g. German Umlauts). 91(Like, e.g. German Umlauts).
89Propably you have to set your colors again for those categories. 92Propably you have to set your colors again for those categories.
90 93
91 94
92********** VERSION 2.0.3 ************ 95********** VERSION 2.0.3 ************
93 96
94KO/Pi: 97KO/Pi:
95Added feature for changing alarm settings for many items at once: 98Added feature for changing alarm settings for many items at once:
96Open list view (or search dialog), select the desired items and choose in 99Open list view (or search dialog), select the desired items and choose in
97the popup menu: Set alarm for selected... 100the popup menu: Set alarm for selected...
98 101
99Added to the event/todo viewer the option to send an email to 102Added to the event/todo viewer the option to send an email to
100all attendees or all selected (with RSVP) attendees. 103all attendees or all selected (with RSVP) attendees.
101 104
102Made the week-month mode changing in month view faster. 105Made the week-month mode changing in month view faster.
103 106
104Made month view better useable with keyboard. 107Made month view better useable with keyboard.
105Now TAB key jumps to next cell with an event/todo. 108Now TAB key jumps to next cell with an event/todo.
106Scroll in cell with coursor keys, scroll in time (next week) with 109Scroll in cell with coursor keys, scroll in time (next week) with
107Shift/Control + coursorkeys. 110Shift/Control + coursorkeys.
108 111
109Fixed bug that the todo view flat mode was reset after first view update. 112Fixed bug that the todo view flat mode was reset after first view update.
110 113
111If a todo is displayed closed in the todo view, 114If a todo is displayed closed in the todo view,
112it is now displayed in overdue/due today color depending on the subtodos overdue/due today properties. 115it is now displayed in overdue/due today color depending on the subtodos overdue/due today properties.
113 116
114Added info about the numbers of years to the caption (title) information about a birthday event. 117Added info about the numbers of years to the caption (title) information about a birthday event.
115 118
116Made completion date in todo editor editable. 119Made completion date in todo editor editable.
117 120
118Added possibility to save/load templates for journals. 121Added possibility to save/load templates for journals.
119(Which is just a simple "save text to file" or "insert text from file". 122(Which is just a simple "save text to file" or "insert text from file".
120 123
121********** VERSION 2.0.2 ************ 124********** VERSION 2.0.2 ************
122 125
123KO/Pi: 126KO/Pi:
124Fixed the layout problem of the day label buttons 127Fixed the layout problem of the day label buttons
125of the agenda view introduced in version 2.0.1. 128of the agenda view introduced in version 2.0.1.
126 129
127Added WhatsThis support for the todo view and the list view. 130Added WhatsThis support for the todo view and the list view.
128 131
129Added a quite useful feature to the montview. 132Added a quite useful feature to the montview.
130Just click on the week numbers on the left. 133Just click on the week numbers on the left.
131And in the top right corner of month view/agenda view 134And in the top right corner of month view/agenda view
132there is now a "week number quick selector". 135there is now a "week number quick selector".
133(Click on the black triangle). 136(Click on the black triangle).
134 137
135Made the quite difficult timezone change in KO/Pi easy. 138Made the quite difficult timezone change in KO/Pi easy.
136 139
137OM/Pi: 140OM/Pi:
138Fixed too small icons on desktop. 141Fixed too small icons on desktop.
139Fixed non visible icons in mainwindow on Z with fastload enabled. 142Fixed non visible icons in mainwindow on Z with fastload enabled.
diff --git a/kmicromail/viewmail.cpp b/kmicromail/viewmail.cpp
index 726f540..685b4e4 100644
--- a/kmicromail/viewmail.cpp
+++ b/kmicromail/viewmail.cpp
@@ -1,482 +1,501 @@
1// CHANGED 2004-08-06 Lutz Rogowski 1// CHANGED 2004-08-06 Lutz Rogowski
2 2
3 3
4 4
5#include <kfiledialog.h> 5#include <kfiledialog.h>
6#include "koprefs.h" 6#include "koprefs.h"
7#include <klocale.h> 7#include <klocale.h>
8#include <kglobal.h> 8#include <kglobal.h>
9#include <kapplication.h> 9#include <kapplication.h>
10 10
11#ifdef MINIKDE_KDIALOG_H 11#ifdef MINIKDE_KDIALOG_H
12#undef MINIKDE_KDIALOG_H 12#undef MINIKDE_KDIALOG_H
13#endif 13#endif
14 14
15#include "composemail.h" 15#include "composemail.h"
16#include "viewmail.h" 16#include "viewmail.h"
17 17
18#include <libmailwrapper/settings.h> 18#include <libmailwrapper/settings.h>
19#include <libmailwrapper/abstractmail.h> 19#include <libmailwrapper/abstractmail.h>
20#include <libmailwrapper/mailtypes.h> 20#include <libmailwrapper/mailtypes.h>
21 21
22#include <qdialog.h> 22#include <qdialog.h>
23 23
24#include <qpe/qpeapplication.h> 24#include <qpe/qpeapplication.h>
25 25
26/* QT */ 26/* QT */
27#include <qtextbrowser.h> 27#include <qtextbrowser.h>
28#include <qmessagebox.h> 28#include <qmessagebox.h>
29#include <qtextstream.h> 29#include <qtextstream.h>
30#include <qaction.h> 30#include <qaction.h>
31#include <qpopupmenu.h> 31#include <qpopupmenu.h>
32#include <qfile.h> 32#include <qfile.h>
33#include <qlayout.h> 33#include <qlayout.h>
34 34
35//using namespace Opie::Ui; 35//using namespace Opie::Ui;
36//using namespace Opie::Core; 36//using namespace Opie::Core;
37 37
38AttachItem::AttachItem(QListView * parent,QListViewItem *after, const QString&mime,const QString&desc,const QString&file, 38AttachItem::AttachItem(QListView * parent,QListViewItem *after, const QString&mime,const QString&desc,const QString&file,
39 const QString&fsize,int num,const QValueList<int>&path) 39 const QString&fsize,int num,const QValueList<int>&path)
40 : QListViewItem(parent,after),_partNum(num) 40 : QListViewItem(parent,after),_partNum(num)
41{ 41{
42 _path=path; 42 _path=path;
43 setText(0, mime); 43 setText(0, mime);
44 setText(1, desc); 44 setText(1, desc);
45 setText(2, file); 45 setText(2, file);
46 setText(3, fsize); 46 setText(3, fsize);
47} 47}
48 48
49AttachItem::AttachItem(QListViewItem * parent,QListViewItem *after, const QString&mime,const QString&desc,const QString&file, 49AttachItem::AttachItem(QListViewItem * parent,QListViewItem *after, const QString&mime,const QString&desc,const QString&file,
50 const QString&fsize,int num,const QValueList<int>&path) 50 const QString&fsize,int num,const QValueList<int>&path)
51 : QListViewItem(parent,after),_partNum(num) 51 : QListViewItem(parent,after),_partNum(num)
52{ 52{
53 _path=path; 53 _path=path;
54 setText(0, mime); 54 setText(0, mime);
55 setText(1, desc); 55 setText(1, desc);
56 setText(2, file); 56 setText(2, file);
57 setText(3, fsize); 57 setText(3, fsize);
58} 58}
59 59
60bool AttachItem::isParentof(const QValueList<int>&path) 60bool AttachItem::isParentof(const QValueList<int>&path)
61{ 61{
62 /* if not set, then no parent */ 62 /* if not set, then no parent */
63 if (path.count()==0||_path.count()==0) return false; 63 if (path.count()==0||_path.count()==0) return false;
64 /* the parent must have one digit less then a child */ 64 /* the parent must have one digit less then a child */
65 if (path.count()!=_path.count()+1) return false; 65 if (path.count()!=_path.count()+1) return false;
66 for (unsigned int i=0; i < _path.count();++i) 66 for (unsigned int i=0; i < _path.count();++i)
67 { 67 {
68 if (_path[i]!=path[i]) return false; 68 if (_path[i]!=path[i]) return false;
69 } 69 }
70 return true; 70 return true;
71} 71}
72 72
73AttachItem* ViewMail::searchParent(const QValueList<int>&path) 73AttachItem* ViewMail::searchParent(const QValueList<int>&path)
74{ 74{
75 QListViewItemIterator it( attachments ); 75 QListViewItemIterator it( attachments );
76 for ( ; it.current(); ++it ) 76 for ( ; it.current(); ++it )
77 { 77 {
78 AttachItem*ati = (AttachItem*)it.current(); 78 AttachItem*ati = (AttachItem*)it.current();
79 if (ati->isParentof(path)) return ati; 79 if (ati->isParentof(path)) return ati;
80 } 80 }
81 return 0; 81 return 0;
82} 82}
83 83
84AttachItem* ViewMail::lastChild(AttachItem*parent) 84AttachItem* ViewMail::lastChild(AttachItem*parent)
85{ 85{
86 if (!parent) return 0; 86 if (!parent) return 0;
87 AttachItem* item = (AttachItem*)parent->firstChild(); 87 AttachItem* item = (AttachItem*)parent->firstChild();
88 if (!item) return item; 88 if (!item) return item;
89 AttachItem*temp=0; 89 AttachItem*temp=0;
90 while( (temp=(AttachItem*)item->nextSibling())) 90 while( (temp=(AttachItem*)item->nextSibling()))
91 { 91 {
92 item = temp; 92 item = temp;
93 } 93 }
94 return item; 94 return item;
95} 95}
96 96
97void ViewMail::setBody(const RecBodyP&body ) 97void ViewMail::setBody(const RecBodyP&body )
98{ 98{
99 99
100 m_body = body; 100 m_body = body;
101 m_mail[2] = body->Bodytext(); 101 m_mail[2] = body->Bodytext();
102 m_showHtml = KOPrefs::instance()->mViewAsHtml;
103 if ( m_showHtml ) {
104 if ( m_mail[2].find ("<html>",0,false ) > -1 ) {
105 qDebug("html mail ");
106 } else {
107 qDebug("no html mail ");
108 m_showHtml = false;
109 }
110 }
111 showHtml->blockSignals( true );
112 showHtml->setOn( m_showHtml );
113 showHtml->blockSignals( false );
102 // qDebug("********text %s ",m_mail[2].latin1() ); 114 // qDebug("********text %s ",m_mail[2].latin1() );
103 attachbutton->setEnabled(body->Parts().count()>0); 115 attachbutton->setEnabled(body->Parts().count()>0);
104 attachments->setEnabled(body->Parts().count()>0); 116 attachments->setEnabled(body->Parts().count()>0);
105 if (body->Parts().count()==0) 117 if (body->Parts().count()==0)
106 { 118 {
107 return; 119 return;
108 } 120 }
109 AttachItem * curItem=0; 121 AttachItem * curItem=0;
110 AttachItem * parentItem = 0; 122 AttachItem * parentItem = 0;
111 QString type=body->Description()->Type()+"/"+body->Description()->Subtype(); 123 QString type=body->Description()->Type()+"/"+body->Description()->Subtype();
112 QString desc,fsize; 124 QString desc,fsize;
113 double s = body->Description()->Size(); 125 double s = body->Description()->Size();
114 int w; 126 int w;
115 w=0; 127 w=0;
116 128
117 while (s>1024) 129 while (s>1024)
118 { 130 {
119 s/=1024; 131 s/=1024;
120 ++w; 132 ++w;
121 if (w>=2) break; 133 if (w>=2) break;
122 } 134 }
123 135
124 QString q=""; 136 QString q="";
125 switch(w) 137 switch(w)
126 { 138 {
127 case 1: 139 case 1:
128 q="k"; 140 q="k";
129 break; 141 break;
130 case 2: 142 case 2:
131 q="M"; 143 q="M";
132 break; 144 break;
133 default: 145 default:
134 break; 146 break;
135 } 147 }
136 148
137 { 149 {
138 /* I did not found a method to make a CONTENT reset on a QTextStream 150 /* I did not found a method to make a CONTENT reset on a QTextStream
139 so I use this construct that the stream will re-constructed in each 151 so I use this construct that the stream will re-constructed in each
140 loop. To let it work, the textstream is packed into a own area of 152 loop. To let it work, the textstream is packed into a own area of
141 code is it will be destructed after finishing its small job. 153 code is it will be destructed after finishing its small job.
142 */ 154 */
143 QTextOStream o(&fsize); 155 QTextOStream o(&fsize);
144 if (w>0) o.precision(2); else o.precision(0); 156 if (w>0) o.precision(2); else o.precision(0);
145 o.setf(QTextStream::fixed); 157 o.setf(QTextStream::fixed);
146 o << s << " " << q << "Byte"; 158 o << s << " " << q << "Byte";
147 } 159 }
148 160
149 curItem=new AttachItem(attachments,curItem,type,"Mailbody","",fsize,-1,body->Description()->Positionlist()); 161 curItem=new AttachItem(attachments,curItem,type,"Mailbody","",fsize,-1,body->Description()->Positionlist());
150 QString filename = ""; 162 QString filename = "";
151 163
152 for (unsigned int i = 0; i < body->Parts().count();++i) 164 for (unsigned int i = 0; i < body->Parts().count();++i)
153 { 165 {
154 filename = ""; 166 filename = "";
155 type = body->Parts()[i]->Type()+"/"+body->Parts()[i]->Subtype(); 167 type = body->Parts()[i]->Type()+"/"+body->Parts()[i]->Subtype();
156 part_plist_t::ConstIterator it = body->Parts()[i]->Parameters().begin(); 168 part_plist_t::ConstIterator it = body->Parts()[i]->Parameters().begin();
157 for (;it!=body->Parts()[i]->Parameters().end();++it) 169 for (;it!=body->Parts()[i]->Parameters().end();++it)
158 { 170 {
159 if (it.key().lower()=="name") 171 if (it.key().lower()=="name")
160 { 172 {
161 filename=it.data(); 173 filename=it.data();
162 } 174 }
163 } 175 }
164 s = body->Parts()[i]->Size(); 176 s = body->Parts()[i]->Size();
165 w = 0; 177 w = 0;
166 while (s>1024) 178 while (s>1024)
167 { 179 {
168 s/=1024; 180 s/=1024;
169 ++w; 181 ++w;
170 if (w>=2) break; 182 if (w>=2) break;
171 } 183 }
172 switch(w) 184 switch(w)
173 { 185 {
174 case 1: 186 case 1:
175 q="k"; 187 q="k";
176 break; 188 break;
177 case 2: 189 case 2:
178 q="M"; 190 q="M";
179 break; 191 break;
180 default: 192 default:
181 q=""; 193 q="";
182 break; 194 break;
183 } 195 }
184 QTextOStream o(&fsize); 196 QTextOStream o(&fsize);
185 if (w>0) o.precision(2); else o.precision(0); 197 if (w>0) o.precision(2); else o.precision(0);
186 o.setf(QTextStream::fixed); 198 o.setf(QTextStream::fixed);
187 o << s << " " << q << "Byte"; 199 o << s << " " << q << "Byte";
188 desc = body->Parts()[i]->Description(); 200 desc = body->Parts()[i]->Description();
189 parentItem = searchParent(body->Parts()[i]->Positionlist()); 201 parentItem = searchParent(body->Parts()[i]->Positionlist());
190 if (parentItem) 202 if (parentItem)
191 { 203 {
192 AttachItem*temp = lastChild(parentItem); 204 AttachItem*temp = lastChild(parentItem);
193 if (temp) curItem = temp; 205 if (temp) curItem = temp;
194 curItem=new AttachItem(parentItem,curItem,type,desc,filename,fsize,i,body->Parts()[i]->Positionlist()); 206 curItem=new AttachItem(parentItem,curItem,type,desc,filename,fsize,i,body->Parts()[i]->Positionlist());
195 attachments->setRootIsDecorated(true); 207 attachments->setRootIsDecorated(true);
196 curItem = parentItem; 208 curItem = parentItem;
197 } 209 }
198 else 210 else
199 { 211 {
200 curItem=new AttachItem(attachments,curItem,type,desc,filename,fsize,i,body->Parts()[i]->Positionlist()); 212 curItem=new AttachItem(attachments,curItem,type,desc,filename,fsize,i,body->Parts()[i]->Positionlist());
201 } 213 }
202 } 214 }
203} 215}
204 216
205 217
206void ViewMail::slotViewSource() 218void ViewMail::slotViewSource()
207{ 219{
208 220
209 if ( !sourceOn ) { 221 if ( !sourceOn ) {
210 sourceOn = true; 222 sourceOn = true;
211 viewSource->setText(i18n("View Body Text")); 223 viewSource->setText(i18n("View Body Text"));
212 encodedString*st = 0; 224 encodedString*st = 0;
213 st = m_recMail->Wrapper()->fetchRawBody(m_recMail); 225 st = m_recMail->Wrapper()->fetchRawBody(m_recMail);
214 if ( st ) { 226 if ( st ) {
215 QString source = QString::fromUtf8( st->Content(), st->Length()); 227 QString source = QString::fromUtf8( st->Content(), st->Length());
216 browser->setText( source ); 228 browser->setText( source );
217 delete st; 229 delete st;
218 } 230 }
219 } else 231 } else
220 setText(); 232 setText();
221 233
222 234
223} 235}
224void ViewMail::slotShowHtml( bool state ) 236void ViewMail::slotShowHtml( bool state )
225{ 237{
226 m_showHtml = state; 238 m_showHtml = state;
227 setText(); 239 setText();
228} 240}
229 241
230void ViewMail::slotItemClicked( QListViewItem * item , const QPoint & point, int ) 242void ViewMail::slotItemClicked( QListViewItem * item , const QPoint & point, int )
231{ 243{
232 if (!item ) 244 if (!item )
233 return; 245 return;
234 246
235 if ( ( ( AttachItem* )item )->Partnumber() == -1 ) 247 if ( ( ( AttachItem* )item )->Partnumber() == -1 )
236 { 248 {
237 setText(); 249 setText();
238 return; 250 return;
239 } 251 }
240 QPopupMenu *menu = new QPopupMenu(); 252 QPopupMenu *menu = new QPopupMenu();
241 int ret=0; 253 int ret=0;
242 254
243 if ( item->text( 0 ).left( 5 ) == "text/" || item->text(0)=="message/rfc822" ) 255 if ( item->text( 0 ).left( 5 ) == "text/" || item->text(0)=="message/rfc822" )
244 { 256 {
245 menu->insertItem( i18n( "Show Text" ), 1 ); 257 menu->insertItem( i18n( "Show Text" ), 1 );
246 } 258 }
247 if (item->text(0).left(6)=="image/") { 259 if (item->text(0).left(6)=="image/") {
248 menu->insertItem(i18n("Display image preview"),2); 260 menu->insertItem(i18n("Display image preview"),2);
249 } 261 }
250 menu->insertItem( i18n( "Save Attachment" ), 0 ); 262 menu->insertItem( i18n( "Save Attachment" ), 0 );
251 menu->insertSeparator(1); 263 menu->insertSeparator(1);
252 264
253 ret = menu->exec( point, 0 ); 265 ret = menu->exec( point, 0 );
254 266
255 switch(ret) 267 switch(ret)
256 { 268 {
257 case 0: 269 case 0:
258 { 270 {
259 //MimeTypes types; 271 //MimeTypes types;
260 //types.insert( "all", "*" ); 272 //types.insert( "all", "*" );
261 QString str = KFileDialog::getSaveFileName( "/", item->text( 2 ), this ); 273 QString str = KFileDialog::getSaveFileName( "/", item->text( 2 ), this );
262 274
263 if( !str.isEmpty() ) 275 if( !str.isEmpty() )
264 { 276 {
265 encodedString*content = m_recMail->Wrapper()->fetchDecodedPart( m_recMail, m_body->Parts()[ ( ( AttachItem* )item )->Partnumber() ] ); 277 encodedString*content = m_recMail->Wrapper()->fetchDecodedPart( m_recMail, m_body->Parts()[ ( ( AttachItem* )item )->Partnumber() ] );
266 if (content) 278 if (content)
267 { 279 {
268 QFile output(str); 280 QFile output(str);
269 output.open(IO_WriteOnly); 281 output.open(IO_WriteOnly);
270 output.writeBlock(content->Content(),content->Length()); 282 output.writeBlock(content->Content(),content->Length());
271 output.close(); 283 output.close();
272 delete content; 284 delete content;
273 } 285 }
274 } 286 }
275 } 287 }
276 break ; 288 break ;
277 289
278 case 2: 290 case 2:
279 { 291 {
280#ifdef DESKTOP_VERSION 292#ifdef DESKTOP_VERSION
281 QString tmpfile = locateLocal( "tmp", "opiemail-image"); 293 QString tmpfile = locateLocal( "tmp", "opiemail-image");
282#else 294#else
283 QString tmpfile = "/tmp/opiemail-image"; 295 QString tmpfile = "/tmp/opiemail-image";
284#endif 296#endif
285 encodedString*content = m_recMail->Wrapper()->fetchDecodedPart( m_recMail, m_body->Parts()[ ( ( AttachItem* )item )->Partnumber() ] ); 297 encodedString*content = m_recMail->Wrapper()->fetchDecodedPart( m_recMail, m_body->Parts()[ ( ( AttachItem* )item )->Partnumber() ] );
286 if (content) { 298 if (content) {
287 QFile output(tmpfile); 299 QFile output(tmpfile);
288 output.open(IO_WriteOnly); 300 output.open(IO_WriteOnly);
289 output.writeBlock(content->Content(),content->Length()); 301 output.writeBlock(content->Content(),content->Length());
290 output.close(); 302 output.close();
291 delete content; 303 delete content;
292 MailImageDlg iview(""); 304 MailImageDlg iview("");
293 iview.setName(tmpfile); 305 iview.setName(tmpfile);
294 KApplication::execDialog(&iview); 306 KApplication::execDialog(&iview);
295 output.remove(); 307 output.remove();
296 } 308 }
297 } 309 }
298 break; 310 break;
299 case 1: 311 case 1:
300 if ( ( ( AttachItem* )item )->Partnumber() == -1 ) 312 if ( ( ( AttachItem* )item )->Partnumber() == -1 )
301 { 313 {
302 setText(); 314 setText();
303 } 315 }
304 else 316 else
305 { 317 {
306 if ( m_recMail->Wrapper() != 0l ) 318 if ( m_recMail->Wrapper() != 0l )
307 { // make sure that there is a wrapper , even after delete or simular actions 319 { // make sure that there is a wrapper , even after delete or simular actions
308 browser->setText( m_recMail->Wrapper()->fetchTextPart( m_recMail, m_body->Parts()[ ( ( AttachItem* )item )->Partnumber() ] ) ); 320 browser->setText( m_recMail->Wrapper()->fetchTextPart( m_recMail, m_body->Parts()[ ( ( AttachItem* )item )->Partnumber() ] ) );
309 } 321 }
310 } 322 }
311 break; 323 break;
312 } 324 }
313 delete menu; 325 delete menu;
314} 326}
315 327
316 328
317void ViewMail::setMail(const RecMailP&mail ) 329void ViewMail::setMail(const RecMailP&mail )
318{ 330{
319 331
320 m_recMail = mail; 332 m_recMail = mail;
321 333
322 m_mail[0] = mail->getFrom(); 334 m_mail[0] = mail->getFrom();
323 m_mail[1] = mail->getSubject(); 335 m_mail[1] = mail->getSubject();
324 m_mail[3] = mail->getDate(); 336 m_mail[3] = mail->getDate();
325 m_mail[4] = mail->Msgid(); 337 m_mail[4] = mail->Msgid();
326 338
327 m_mail2[0] = mail->To(); 339 m_mail2[0] = mail->To();
328 m_mail2[1] = mail->CC(); 340 m_mail2[1] = mail->CC();
329 m_mail2[2] = mail->Bcc(); 341 m_mail2[2] = mail->Bcc();
330 342
331 setText(); 343 setText();
332} 344}
333 345
334 346void ViewMail::slotNextMail()
347{
348 nextMail->blockSignals( true );
349 setCaption(i18n("Displaying next mail...please wait!"));
350 qApp->processEvents();
351 emit showNextMail(this);
352 nextMail->blockSignals( false );
353}
335 354
336ViewMail::ViewMail( QWidget *parent, const char *name, WFlags fl) 355ViewMail::ViewMail( QWidget *parent, const char *name, WFlags fl)
337 : ViewMailBase(parent, name, fl), _inLoop(false) 356 : ViewMailBase(parent, name, fl), _inLoop(false)
338{ 357{
339 m_gotBody = false; 358 m_gotBody = false;
340 deleted = false; 359 deleted = false;
341 sourceOn = false; 360 sourceOn = false;
361 readConfig();
342 connect( reply, SIGNAL(activated()), SLOT(slotReply())); 362 connect( reply, SIGNAL(activated()), SLOT(slotReply()));
343 connect( forward, SIGNAL(activated()), SLOT(slotForward())); 363 connect( forward, SIGNAL(activated()), SLOT(slotForward()));
344 connect( deleteMail, SIGNAL( activated() ), SLOT( slotDeleteMail() ) ); 364 connect( deleteMail, SIGNAL( activated() ), SLOT( slotDeleteMail() ) );
345 connect( showHtml, SIGNAL( toggled(bool) ), SLOT( slotShowHtml(bool) ) ); 365 connect( showHtml, SIGNAL( toggled(bool) ), SLOT( slotShowHtml(bool) ) );
346 connect( closeMail, SIGNAL( activated() ), SLOT( close() ) ); 366 connect( closeMail, SIGNAL( activated() ), SLOT( close() ) );
347 connect( nextMail, SIGNAL( activated() ), SLOT( slotNextMail() ) ); 367 connect( nextMail, SIGNAL( activated() ), SLOT( slotNextMail() ) );
348 connect( viewSource, SIGNAL( activated() ), SLOT( slotViewSource() ) ); 368 connect( viewSource, SIGNAL( activated() ), SLOT( slotViewSource() ) );
349 connect( downloadMail, SIGNAL( activated() ), SIGNAL( signalDownloadMail() ) ); 369 connect( downloadMail, SIGNAL( activated() ), SIGNAL( signalDownloadMail() ) );
350 370
351 attachments->setEnabled(m_gotBody); 371 attachments->setEnabled(m_gotBody);
352 connect( attachments, SIGNAL( clicked(QListViewItem*,const QPoint&, int) ), SLOT( slotItemClicked(QListViewItem*,const QPoint&, int) ) ); 372 connect( attachments, SIGNAL( clicked(QListViewItem*,const QPoint&, int) ), SLOT( slotItemClicked(QListViewItem*,const QPoint&, int) ) );
353 373
354 readConfig();
355 attachments->setSorting(-1); 374 attachments->setSorting(-1);
356} 375}
357 376
358void ViewMail::readConfig() 377void ViewMail::readConfig()
359{ 378{
360 379
361 setFont ( KOPrefs::instance()->mReadFont ); 380 setFont ( KOPrefs::instance()->mReadFont );
362 m_showHtml = KOPrefs::instance()->mViewAsHtml; 381 m_showHtml = KOPrefs::instance()->mViewAsHtml;
363 showHtml->setOn( m_showHtml ); 382 showHtml->setOn( m_showHtml );
364} 383}
365 384
366void ViewMail::setText() 385void ViewMail::setText()
367{ 386{
368 387
369 viewSource->setText(i18n("View Source")); 388 viewSource->setText(i18n("View Source"));
370 sourceOn = false; 389 sourceOn = false;
371 QString toString; 390 QString toString;
372 QString ccString; 391 QString ccString;
373 QString bccString; 392 QString bccString;
374 393
375 394
376 toString = m_mail2[0].join(","); 395 toString = m_mail2[0].join(",");
377 ccString = m_mail2[1].join(","); 396 ccString = m_mail2[1].join(",");
378 bccString = m_mail2[2].join(","); 397 bccString = m_mail2[2].join(",");
379 398
380#ifdef DESKTOP_VERSION 399#ifdef DESKTOP_VERSION
381 setCaption( i18n("Size: ")+m_recMail->MsgsizeString()+" - "+i18n("E-Mail by %1").arg( m_mail[0] ) ); 400 setCaption( i18n("Size: ")+m_recMail->MsgsizeString()+" - "+i18n("E-Mail by %1").arg( m_mail[0] ) );
382#else 401#else
383 setCaption( m_recMail->MsgsizeString()+" - "+m_mail[0] ); 402 setCaption( m_recMail->MsgsizeString()+" - "+m_mail[0] );
384#endif 403#endif
385 404
386 m_mailHtml = "<html><body>" 405 m_mailHtml = "<html><body>"
387 "<table width=\"100%\" border=\"0\"><tr bgcolor=\"#FFDD76\"><td>" 406 "<table width=\"100%\" border=\"0\"><tr bgcolor=\"#FFDD76\"><td>"
388 "<div align=left><b>" + deHtml( m_mail[1] ) + "</b></div>" 407 "<div align=left><b>" + deHtml( m_mail[1] ) + "</b></div>"
389 "</td></tr><tr bgcolor=\"#EEEEE6\"><td>" 408 "</td></tr><tr bgcolor=\"#EEEEE6\"><td>"
390 "<b>" + i18n( "From" ) + ": </b><font color=#6C86C0>" + deHtml( m_mail[0] ) + "</font><br>" 409 "<b>" + i18n( "From" ) + ": </b><font color=#6C86C0>" + deHtml( m_mail[0] ) + "</font><br>"
391 "<b>" + i18n( "To" ) + ": </b><font color=#6C86C0>" + deHtml( toString ) + "</font><br><b>" + 410 "<b>" + i18n( "To" ) + ": </b><font color=#6C86C0>" + deHtml( toString ) + "</font><br><b>" +
392 i18n( "Cc" ) + ": </b>" + deHtml( ccString ) + "<br>" 411 i18n( "Cc" ) + ": </b>" + deHtml( ccString ) + "<br>"
393 "<b>" + i18n( "Date" ) + ": </b> " + m_mail[3] + 412 "<b>" + i18n( "Date" ) + ": </b> " + m_mail[3] +
394 "</td></tr></table><font>"; 413 "</td></tr></table><font>";
395 414
396 if ( !m_showHtml ) 415 if ( !m_showHtml )
397 { 416 {
398 browser->setText( QString( m_mailHtml) + deHtml( m_mail[2] ) + "</font></html>" ); 417 browser->setText( QString( m_mailHtml) + deHtml( m_mail[2] ) + "</font></html>" );
399 } 418 }
400 else 419 else
401 { 420 {
402 browser->setText( QString( m_mailHtml) + m_mail[2] + "</font></html>" ); 421 browser->setText( QString( m_mailHtml) + m_mail[2] + "</font></html>" );
403 } 422 }
404 // remove later in favor of a real handling 423 // remove later in favor of a real handling
405 m_gotBody = true; 424 m_gotBody = true;
406} 425}
407 426
408 427
409ViewMail::~ViewMail() 428ViewMail::~ViewMail()
410{ 429{
411 m_recMail->Wrapper()->cleanMimeCache(); 430 m_recMail->Wrapper()->cleanMimeCache();
412 hide(); 431 hide();
413} 432}
414 433
415void ViewMail::hide() 434void ViewMail::hide()
416{ 435{
417 QWidget::hide(); 436 QWidget::hide();
418 437
419 if (_inLoop) 438 if (_inLoop)
420 { 439 {
421 _inLoop = false; 440 _inLoop = false;
422 qApp->exit_loop(); 441 qApp->exit_loop();
423 442
424 } 443 }
425 444
426} 445}
427 446
428void ViewMail::exec() 447void ViewMail::exec()
429{ 448{
430 show(); 449 show();
431 450
432 if (!_inLoop) 451 if (!_inLoop)
433 { 452 {
434 _inLoop = true; 453 _inLoop = true;
435 qApp->enter_loop(); 454 qApp->enter_loop();
436 } 455 }
437 456
438} 457}
439 458
440QString ViewMail::deHtml(const QString &string) 459QString ViewMail::deHtml(const QString &string)
441{ 460{
442 QString string_ = string; 461 QString string_ = string;
443 string_.replace(QRegExp("&"), "&amp;"); 462 string_.replace(QRegExp("&"), "&amp;");
444 string_.replace(QRegExp("<"), "&lt;"); 463 string_.replace(QRegExp("<"), "&lt;");
445 string_.replace(QRegExp(">"), "&gt;"); 464 string_.replace(QRegExp(">"), "&gt;");
446 string_.replace(QRegExp("\\n"), "<br>"); 465 string_.replace(QRegExp("\\n"), "<br>");
447 return string_; 466 return string_;
448} 467}
449 468
450void ViewMail::slotReply() 469void ViewMail::slotReply()
451{ 470{
452 if (!m_gotBody) 471 if (!m_gotBody)
453 { 472 {
454 QMessageBox::information(this, i18n("Error"), i18n("<p>The mail body is not yet downloaded, so you cannot reply yet."), i18n("Ok")); 473 QMessageBox::information(this, i18n("Error"), i18n("<p>The mail body is not yet downloaded, so you cannot reply yet."), i18n("Ok"));
455 return; 474 return;
456 } 475 }
457 476
458 QString rtext; 477 QString rtext;
459 rtext += QString("* %1 wrote on %2:\n") // no i18n on purpose 478 rtext += QString("* %1 wrote on %2:\n") // no i18n on purpose
460 .arg( m_mail[0] ) 479 .arg( m_mail[0] )
461 .arg( m_mail[3] ); 480 .arg( m_mail[3] );
462 481
463 QString text = m_mail[2]; 482 QString text = m_mail[2];
464 QStringList lines = QStringList::split(QRegExp("\\n"), text); 483 QStringList lines = QStringList::split(QRegExp("\\n"), text);
465 QStringList::Iterator it; 484 QStringList::Iterator it;
466 for (it = lines.begin(); it != lines.end(); it++) 485 for (it = lines.begin(); it != lines.end(); it++)
467 { 486 {
468 rtext += "> " + *it + "\n"; 487 rtext += "> " + *it + "\n";
469 } 488 }
470 rtext += "\n"; 489 rtext += "\n";
471 490
472 QString prefix; 491 QString prefix;
473 if ( m_mail[1].find(QRegExp("^Re: .*$")) != -1) prefix = ""; 492 if ( m_mail[1].find(QRegExp("^Re: .*$")) != -1) prefix = "";
474 else prefix = "Re: "; // no i18n on purpose 493 else prefix = "Re: "; // no i18n on purpose
475 494
476 Settings *settings = new Settings(); 495 Settings *settings = new Settings();
477 ComposeMail composer( settings ,this, 0, true); 496 ComposeMail composer( settings ,this, 0, true);
478 if (m_recMail->Replyto().isEmpty()) { 497 if (m_recMail->Replyto().isEmpty()) {
479 composer.setTo(m_recMail->getFrom()); 498 composer.setTo(m_recMail->getFrom());
480 } else { 499 } else {
481 composer.setTo(m_recMail->Replyto()); 500 composer.setTo(m_recMail->Replyto());
482 } 501 }
diff --git a/kmicromail/viewmail.h b/kmicromail/viewmail.h
index fc5edcf..bb5b685 100644
--- a/kmicromail/viewmail.h
+++ b/kmicromail/viewmail.h
@@ -1,93 +1,93 @@
1#ifndef VIEWMAIL_H 1#ifndef VIEWMAIL_H
2#define VIEWMAIL_H 2#define VIEWMAIL_H
3 3
4#include "viewmailbase.h" 4#include "viewmailbase.h"
5#include <libmailwrapper/mailtypes.h> 5#include <libmailwrapper/mailtypes.h>
6 6
7#include <qdialog.h> 7#include <qdialog.h>
8#include <qapplication.h> 8#include <qapplication.h>
9 9
10#include <qlistview.h> 10#include <qlistview.h>
11#include <qmap.h> 11#include <qmap.h>
12#include <klocale.h> 12#include <klocale.h>
13#include <qstringlist.h> 13#include <qstringlist.h>
14#include <qvaluelist.h> 14#include <qvaluelist.h>
15 15
16//namespace Opie { namespace MM { class OImageScrollView; } } 16//namespace Opie { namespace MM { class OImageScrollView; } }
17 17
18class AttachItem : public QListViewItem 18class AttachItem : public QListViewItem
19{ 19{
20public: 20public:
21 AttachItem(QListView * parent,QListViewItem *after, const QString&mime,const QString&desc,const QString&file, 21 AttachItem(QListView * parent,QListViewItem *after, const QString&mime,const QString&desc,const QString&file,
22 const QString&fsize,int num,const QValueList<int>&path); 22 const QString&fsize,int num,const QValueList<int>&path);
23 AttachItem(QListViewItem * parent,QListViewItem *after, const QString&mime,const QString&desc,const QString&file, 23 AttachItem(QListViewItem * parent,QListViewItem *after, const QString&mime,const QString&desc,const QString&file,
24 const QString&fsize,int num,const QValueList<int>&path); 24 const QString&fsize,int num,const QValueList<int>&path);
25 int Partnumber() { return _partNum; } 25 int Partnumber() { return _partNum; }
26 bool isParentof(const QValueList<int>&path); 26 bool isParentof(const QValueList<int>&path);
27 27
28private: 28private:
29 int _partNum; 29 int _partNum;
30 /* needed for a better display of attachments */ 30 /* needed for a better display of attachments */
31 QValueList<int> _path; 31 QValueList<int> _path;
32}; 32};
33 33
34class ViewMail : public ViewMailBase 34class ViewMail : public ViewMailBase
35{ 35{
36 Q_OBJECT 36 Q_OBJECT
37 37
38public: 38public:
39 ViewMail( QWidget *parent = 0, const char *name = 0, WFlags fl = 0); 39 ViewMail( QWidget *parent = 0, const char *name = 0, WFlags fl = 0);
40 ~ViewMail(); 40 ~ViewMail();
41 41
42 void hide(); 42 void hide();
43 void exec(); 43 void exec();
44 void setMail(const RecMailP&mail ); 44 void setMail(const RecMailP&mail );
45 void setBody(const RecBodyP&body); 45 void setBody(const RecBodyP&body);
46 bool deleted; 46 bool deleted;
47 signals: 47 signals:
48 void showNextMail(ViewMail*); 48 void showNextMail(ViewMail*);
49 void deleteAndDisplayNextMail(ViewMail *); 49 void deleteAndDisplayNextMail(ViewMail *);
50 void signalDownloadMail(); 50 void signalDownloadMail();
51protected: 51protected:
52 QString deHtml(const QString &string); 52 QString deHtml(const QString &string);
53 AttachItem* searchParent(const QValueList<int>&path); 53 AttachItem* searchParent(const QValueList<int>&path);
54 AttachItem* lastChild(AttachItem*parent); 54 AttachItem* lastChild(AttachItem*parent);
55 55
56protected slots: 56protected slots:
57 void slotNextMail() { setCaption(i18n("Displaying next mail...please wait!")); qApp->processEvents();emit showNextMail(this); }; 57 void slotNextMail();
58 void slotReply(); 58 void slotReply();
59 void slotForward(); 59 void slotForward();
60 void setText(); 60 void setText();
61 void slotItemClicked( QListViewItem * item , const QPoint & point, int c ); 61 void slotItemClicked( QListViewItem * item , const QPoint & point, int c );
62 void slotDeleteMail( ); 62 void slotDeleteMail( );
63 void slotShowHtml( bool ); 63 void slotShowHtml( bool );
64 void slotViewSource(); 64 void slotViewSource();
65 65
66private: 66private:
67 void readConfig(); 67 void readConfig();
68 bool sourceOn;; 68 bool sourceOn;;
69 bool _inLoop; 69 bool _inLoop;
70 QString m_mailHtml; 70 QString m_mailHtml;
71 bool m_gotBody; 71 bool m_gotBody;
72 RecBodyP m_body; 72 RecBodyP m_body;
73 RecMailP m_recMail; 73 RecMailP m_recMail;
74 bool m_showHtml; 74 bool m_showHtml;
75 75
76 // 0 from 1 subject 2 bodytext 3 date 76 // 0 from 1 subject 2 bodytext 3 date
77 QMap <int,QString> m_mail; 77 QMap <int,QString> m_mail;
78 // 0 to 1 cc 2 bcc 78 // 0 to 1 cc 2 bcc
79 QMap <int,QStringList> m_mail2; 79 QMap <int,QStringList> m_mail2;
80}; 80};
81 81
82class MailImageDlg:public QDialog 82class MailImageDlg:public QDialog
83{ 83{
84 Q_OBJECT 84 Q_OBJECT
85public: 85public:
86 MailImageDlg(const QString&,QWidget *parent = 0, const char *name = 0, bool modal = true, WFlags f = 0); 86 MailImageDlg(const QString&,QWidget *parent = 0, const char *name = 0, bool modal = true, WFlags f = 0);
87 ~MailImageDlg(); 87 ~MailImageDlg();
88 void setName(const QString&); 88 void setName(const QString&);
89protected: 89protected:
90 //Opie::MM::OImageScrollView*m_imageview; 90 //Opie::MM::OImageScrollView*m_imageview;
91}; 91};
92 92
93#endif 93#endif