11 #include "kmreaderwin.h" 13 #include "globalsettings.h" 14 #include "kmversion.h" 15 #include "kmmainwidget.h" 16 #include "kmreadermainwin.h" 17 #include <libtdepim/tdefileio.h> 18 #include "kmfolderindex.h" 19 #include "kmcommands.h" 20 #include "kmmsgpartdlg.h" 21 #include "mailsourceviewer.h" 22 using KMail::MailSourceViewer;
24 #include "kmmsgdict.h" 25 #include "messagesender.h" 26 #include "kcursorsaver.h" 28 #include "vcardviewer.h" 29 using KMail::VCardViewer;
30 #include "objecttreeparser.h" 31 using KMail::ObjectTreeParser;
32 #include "partmetadata.h" 33 using KMail::PartMetaData;
34 #include "attachmentstrategy.h" 35 using KMail::AttachmentStrategy;
36 #include "headerstrategy.h" 37 using KMail::HeaderStrategy;
38 #include "headerstyle.h" 40 #include "tdehtmlparthtmlwriter.h" 42 using KMail::KHtmlPartHtmlWriter;
43 #include "htmlstatusbar.h" 45 #include "folderjob.h" 46 using KMail::FolderJob;
47 #include "csshelper.h" 48 using KMail::CSSHelper;
50 using KMail::ISubject;
51 #include "urlhandlermanager.h" 53 #include "interfaces/observable.h" 55 #include "kmheaders.h" 57 #include "broadcaststatus.h" 59 #include <kmime_mdn.h> 60 using namespace KMime;
61 #ifdef KMAIL_READER_HTML_DEBUG 62 #include "filehtmlwriter.h" 63 using KMail::FileHtmlWriter;
64 #include "teehtmlwriter.h" 68 #include <kasciistringtools.h> 69 #include <kstringhandler.h> 71 #include <mimelib/mimepp.h> 72 #include <mimelib/body.h> 73 #include <mimelib/utility.h> 75 #include <kleo/specialjob.h> 76 #include <kleo/cryptobackend.h> 77 #include <kleo/cryptobackendfactory.h> 80 #include <tdeabc/addressee.h> 81 #include <tdeabc/vcardconverter.h> 84 #include <tdehtml_part.h> 85 #include <tdehtmlview.h> 86 #include <dom/html_element.h> 87 #include <dom/html_block.h> 88 #include <dom/html_document.h> 89 #include <dom/dom_string.h> 90 #include <dom/dom_exception.h> 92 #include <tdeapplication.h> 94 #include <kuserprofile.h> 95 #include <kcharsets.h> 96 #include <tdepopupmenu.h> 97 #include <kstandarddirs.h> 100 #include <tdefiledialog.h> 101 #include <tdelocale.h> 102 #include <tdemessagebox.h> 103 #include <tdeglobalsettings.h> 105 #include <tdetempfile.h> 106 #include <kprocess.h> 108 #include <tdeaction.h> 109 #include <kiconloader.h> 110 #include <kmdcodec.h> 111 #include <kasciistricmp.h> 112 #include <kurldrag.h> 114 #include <tqclipboard.h> 116 #include <tqtextcodec.h> 117 #include <tqpaintdevicemetrics.h> 118 #include <tqlayout.h> 120 #include <tqsplitter.h> 129 #include <sys/stat.h> 139 class NewByteArray :
public TQByteArray
142 NewByteArray &appendNULL();
143 NewByteArray &operator+=(
const char * );
144 NewByteArray &operator+=(
const TQByteArray & );
145 NewByteArray &operator+=(
const TQCString & );
146 TQByteArray& qByteArray();
149 NewByteArray& NewByteArray::appendNULL()
151 TQByteArray::detach();
153 if ( !TQByteArray::resize( len1 + 1 ) )
155 *(data() + len1) =
'\0';
158 NewByteArray& NewByteArray::operator+=(
const char * newData )
162 TQByteArray::detach();
164 uint len2 = tqstrlen( newData );
165 if ( !TQByteArray::resize( len1 + len2 ) )
167 memcpy( data() + len1, newData, len2 );
170 NewByteArray& NewByteArray::operator+=(
const TQByteArray & newData )
172 if ( newData.isNull() )
174 TQByteArray::detach();
176 uint len2 = newData.size();
177 if ( !TQByteArray::resize( len1 + len2 ) )
179 memcpy( data() + len1, newData.data(), len2 );
182 NewByteArray& NewByteArray::operator+=(
const TQCString & newData )
184 if ( newData.isEmpty() )
186 TQByteArray::detach();
188 uint len2 = newData.length();
189 if ( !TQByteArray::resize( len1 + len2 ) )
191 memcpy( data() + len1, newData.data(), len2 );
194 TQByteArray& NewByteArray::qByteArray()
196 return *((TQByteArray*)
this);
203 void KMReaderWin::objectTreeToDecryptedMsg( partNode* node,
204 NewByteArray& resultingData,
206 bool weAreReplacingTheRootNode,
209 kdDebug(5006) << TQString(
"-------------------------------------------------" ) << endl;
210 kdDebug(5006) << TQString(
"KMReaderWin::objectTreeToDecryptedMsg( %1 ) START").arg( recCount ) << endl;
213 kdDebug(5006) << node->typeString() <<
'/' << node->subTypeString() << endl;
215 partNode* curNode = node;
216 partNode* dataNode = curNode;
217 partNode * child = node->firstChild();
218 const bool bIsMultipart = node->type() == DwMime::kTypeMultipart ;
219 bool bKeepPartAsIs =
false;
221 switch( curNode->type() ){
222 case DwMime::kTypeMultipart: {
223 switch( curNode->subType() ){
224 case DwMime::kSubtypeSigned: {
225 bKeepPartAsIs =
true;
228 case DwMime::kSubtypeEncrypted: {
236 case DwMime::kTypeMessage: {
237 switch( curNode->subType() ){
238 case DwMime::kSubtypeRfc822: {
246 case DwMime::kTypeApplication: {
247 switch( curNode->subType() ){
248 case DwMime::kSubtypeOctetStream: {
253 case DwMime::kSubtypePkcs7Signature: {
256 bKeepPartAsIs =
true;
259 case DwMime::kSubtypePkcs7Mime: {
262 if ( child && curNode->encryptionState() != KMMsgNotEncrypted )
272 DwHeaders& rootHeaders( theMessage.
headers() );
273 DwBodyPart * part = dataNode->dwPart() ? dataNode->dwPart() : 0;
275 (part && part->hasHeaders())
277 : ( (weAreReplacingTheRootNode || !dataNode->parentNode())
280 if( dataNode == curNode ) {
281 kdDebug(5006) <<
"dataNode == curNode: Save curNode without replacing it." << endl;
287 if( dataNode->parentNode() && !weAreReplacingTheRootNode ) {
288 kdDebug(5006) <<
"dataNode is NOT replacing the root node: Store the headers." << endl;
289 resultingData += headers->AsString().c_str();
290 }
else if( weAreReplacingTheRootNode && part && part->hasHeaders() ){
291 kdDebug(5006) <<
"dataNode replace the root node: Do NOT store the headers but change" << endl;
292 kdDebug(5006) <<
" the Message's headers accordingly." << endl;
293 kdDebug(5006) <<
" old Content-Type = " << rootHeaders.ContentType().AsString().c_str() << endl;
294 kdDebug(5006) <<
" new Content-Type = " << headers->ContentType( ).AsString().c_str() << endl;
295 rootHeaders.ContentType() = headers->ContentType();
296 theMessage.setContentTransferEncodingStr(
297 headers->HasContentTransferEncoding()
298 ? headers->ContentTransferEncoding().AsString().c_str()
300 rootHeaders.ContentDescription() = headers->ContentDescription();
301 rootHeaders.ContentDisposition() = headers->ContentDisposition();
306 if ( bKeepPartAsIs ) {
307 resultingData += dataNode->encodedBody();
311 if( headers && bIsMultipart && dataNode->firstChild() ) {
312 kdDebug(5006) <<
"is valid Multipart, processing children:" << endl;
313 TQCString boundary = headers->ContentType().Boundary().c_str();
314 curNode = dataNode->firstChild();
317 kdDebug(5006) <<
"--boundary" << endl;
318 if( resultingData.size() &&
319 (
'\n' != resultingData.at( resultingData.size()-1 ) ) )
320 resultingData += TQCString(
"\n" );
321 resultingData += TQCString(
"\n" );
322 resultingData +=
"--";
323 resultingData += boundary;
324 resultingData +=
"\n";
328 objectTreeToDecryptedMsg( curNode,
333 curNode = curNode->nextSibling();
335 kdDebug(5006) <<
"--boundary--" << endl;
336 resultingData +=
"\n--";
337 resultingData += boundary;
338 resultingData +=
"--\n\n";
339 kdDebug(5006) <<
"Multipart processing children - DONE" << endl;
342 kdDebug(5006) <<
"is Simple part or invalid Multipart, storing body data .. DONE" << endl;
343 resultingData += part->Body().AsString().c_str();
347 kdDebug(5006) <<
"dataNode != curNode: Replace curNode by dataNode." << endl;
348 bool rootNodeReplaceFlag = weAreReplacingTheRootNode || !curNode->parentNode();
349 if( rootNodeReplaceFlag ) {
350 kdDebug(5006) <<
" Root node will be replaced." << endl;
352 kdDebug(5006) <<
" Root node will NOT be replaced." << endl;
356 objectTreeToDecryptedMsg( dataNode,
363 kdDebug(5006) << TQString(
"\nKMReaderWin::objectTreeToDecryptedMsg( %1 ) END").arg( recCount ) << endl;
387 void KMReaderWin::createWidgets() {
388 TQVBoxLayout * vlay =
new TQVBoxLayout(
this );
389 mSplitter =
new TQSplitter( Qt::Vertical,
this,
"mSplitter" );
390 vlay->addWidget( mSplitter );
391 mMimePartTree =
new KMMimePartTree(
this, mSplitter,
"mMimePartTree" );
392 mBox =
new TQHBox( mSplitter,
"mBox" );
393 setStyleDependantFrameWidth();
394 mBox->setFrameStyle( mMimePartTree->frameStyle() );
396 mViewer =
new TDEHTMLPart( mBox,
"mViewer" );
397 mSplitter->setOpaqueResize( TDEGlobalSettings::opaqueResize() );
398 mSplitter->setResizeMode( mMimePartTree, TQSplitter::KeepSize );
401 const int KMReaderWin::delay = 150;
404 KMReaderWin::KMReaderWin(TQWidget *aParent,
405 TQWidget *mainWindow,
406 TDEActionCollection* actionCollection,
409 : TQWidget(aParent, aName, aFlags | TQt::WDestructiveClose),
410 mSerNumOfOriginalMessage( 0 ),
412 mAttachmentStrategy( 0 ),
413 mHeaderStrategy( 0 ),
415 mUpdateReaderWinTimer( 0,
"mUpdateReaderWinTimer" ),
416 mResizeTimer( 0,
"mResizeTimer" ),
417 mDelayedMarkTimer( 0,
"mDelayedMarkTimer" ),
418 mHeaderRefreshTimer( 0,
"mHeaderRefreshTimer" ),
419 mOldGlobalOverrideEncoding(
"---" ),
422 mMainWindow( mainWindow ),
423 mActionCollection( actionCollection ),
424 mMailToComposeAction( 0 ),
425 mMailToReplyAction( 0 ),
426 mMailToForwardAction( 0 ),
427 mAddAddrBookAction( 0 ),
428 mOpenAddrBookAction( 0 ),
432 mUrlSaveAsAction( 0 ),
433 mAddBookmarksAction( 0 ),
434 mStartIMChatAction( 0 ),
435 mSelectAllAction( 0 ),
436 mHeaderOnlyAttachmentsAction( 0 ),
437 mSelectEncodingAction( 0 ),
438 mToggleFixFontAction( 0 ),
439 mCanStartDrag( false ),
441 mSavedRelativePosition( 0 ),
442 mDecrytMessageOverwrite( false ),
443 mShowSignatureDetails( false ),
444 mShowAttachmentQuicklist( true ),
445 mShowRawToltecMail( false )
447 mExternalWindow = (aParent == mainWindow );
448 mSplitterSizes << 180 << 100;
450 mMimeTreeAtBottom =
true;
453 mWaitingForSerNum = 0;
457 mShowColorbar =
false;
461 createActions( actionCollection );
465 mHtmlOverride =
false;
466 mHtmlLoadExtOverride =
false;
468 mLevelQuote = GlobalSettings::self()->collapseQuoteLevelSpin() - 1;
470 connect( &mUpdateReaderWinTimer, TQT_SIGNAL(timeout()),
471 TQT_TQOBJECT(
this), TQT_SLOT(updateReaderWin()) );
472 connect( &mResizeTimer, TQT_SIGNAL(timeout()),
473 TQT_TQOBJECT(
this), TQT_SLOT(slotDelayedResize()) );
474 connect( &mDelayedMarkTimer, TQT_SIGNAL(timeout()),
475 TQT_TQOBJECT(
this), TQT_SLOT(slotTouchMessage()) );
476 connect( &mHeaderRefreshTimer, TQT_SIGNAL(timeout()),
477 TQT_TQOBJECT(
this), TQT_SLOT(updateHeader()) );
481 void KMReaderWin::createActions( TDEActionCollection * ac ) {
485 TDERadioAction *raction = 0;
488 TDEActionMenu *headerMenu =
489 new TDEActionMenu( i18n(
"View->",
"&Headers"), ac,
"view_headers" );
490 headerMenu->setToolTip( i18n(
"Choose display style of message headers") );
492 connect( headerMenu, TQT_SIGNAL(activated()),
493 TQT_TQOBJECT(
this), TQT_SLOT(slotCycleHeaderStyles()) );
495 raction =
new TDERadioAction( i18n(
"View->headers->",
"&Enterprise Headers"), 0,
496 TQT_TQOBJECT(
this), TQT_SLOT(slotEnterpriseHeaders()),
497 ac,
"view_headers_enterprise" );
498 raction->setToolTip( i18n(
"Show the list of headers in Enterprise style") );
499 raction->setExclusiveGroup(
"view_headers_group" );
500 headerMenu->insert(raction);
502 raction =
new TDERadioAction( i18n(
"View->headers->",
"&Fancy Headers"), 0,
503 TQT_TQOBJECT(
this), TQT_SLOT(slotFancyHeaders()),
504 ac,
"view_headers_fancy" );
505 raction->setToolTip( i18n(
"Show the list of headers in a fancy format") );
506 raction->setExclusiveGroup(
"view_headers_group" );
507 headerMenu->insert( raction );
509 raction =
new TDERadioAction( i18n(
"View->headers->",
"&Brief Headers"), 0,
510 TQT_TQOBJECT(
this), TQT_SLOT(slotBriefHeaders()),
511 ac,
"view_headers_brief" );
512 raction->setToolTip( i18n(
"Show brief list of message headers") );
513 raction->setExclusiveGroup(
"view_headers_group" );
514 headerMenu->insert( raction );
516 raction =
new TDERadioAction( i18n(
"View->headers->",
"&Standard Headers"), 0,
517 TQT_TQOBJECT(
this), TQT_SLOT(slotStandardHeaders()),
518 ac,
"view_headers_standard" );
519 raction->setToolTip( i18n(
"Show standard list of message headers") );
520 raction->setExclusiveGroup(
"view_headers_group" );
521 headerMenu->insert( raction );
523 raction =
new TDERadioAction( i18n(
"View->headers->",
"&Long Headers"), 0,
524 TQT_TQOBJECT(
this), TQT_SLOT(slotLongHeaders()),
525 ac,
"view_headers_long" );
526 raction->setToolTip( i18n(
"Show long list of message headers") );
527 raction->setExclusiveGroup(
"view_headers_group" );
528 headerMenu->insert( raction );
530 raction =
new TDERadioAction( i18n(
"View->headers->",
"&All Headers"), 0,
531 TQT_TQOBJECT(
this), TQT_SLOT(slotAllHeaders()),
532 ac,
"view_headers_all" );
533 raction->setToolTip( i18n(
"Show all message headers") );
534 raction->setExclusiveGroup(
"view_headers_group" );
535 headerMenu->insert( raction );
538 TDEActionMenu *attachmentMenu =
539 new TDEActionMenu( i18n(
"View->",
"&Attachments"), ac,
"view_attachments" );
540 attachmentMenu->setToolTip( i18n(
"Choose display style of attachments") );
541 connect( attachmentMenu, TQT_SIGNAL(activated()),
542 TQT_TQOBJECT(
this), TQT_SLOT(slotCycleAttachmentStrategy()) );
544 raction =
new TDERadioAction( i18n(
"View->attachments->",
"&As Icons"), 0,
545 TQT_TQOBJECT(
this), TQT_SLOT(slotIconicAttachments()),
546 ac,
"view_attachments_as_icons" );
547 raction->setToolTip( i18n(
"Show all attachments as icons. Click to see them.") );
548 raction->setExclusiveGroup(
"view_attachments_group" );
549 attachmentMenu->insert( raction );
551 raction =
new TDERadioAction( i18n(
"View->attachments->",
"&Smart"), 0,
552 TQT_TQOBJECT(
this), TQT_SLOT(slotSmartAttachments()),
553 ac,
"view_attachments_smart" );
554 raction->setToolTip( i18n(
"Show attachments as suggested by sender.") );
555 raction->setExclusiveGroup(
"view_attachments_group" );
556 attachmentMenu->insert( raction );
558 raction =
new TDERadioAction( i18n(
"View->attachments->",
"&Inline"), 0,
559 TQT_TQOBJECT(
this), TQT_SLOT(slotInlineAttachments()),
560 ac,
"view_attachments_inline" );
561 raction->setToolTip( i18n(
"Show all attachments inline (if possible)") );
562 raction->setExclusiveGroup(
"view_attachments_group" );
563 attachmentMenu->insert( raction );
565 raction =
new TDERadioAction( i18n(
"View->attachments->",
"&Hide"), 0,
566 TQT_TQOBJECT(
this), TQT_SLOT(slotHideAttachments()),
567 ac,
"view_attachments_hide" );
568 raction->setToolTip( i18n(
"Do not show attachments in the message viewer") );
569 raction->setExclusiveGroup(
"view_attachments_group" );
570 attachmentMenu->insert( raction );
572 mHeaderOnlyAttachmentsAction =
new TDERadioAction( i18n(
"View->attachments->",
"In Header &Only" ), 0,
573 TQT_TQOBJECT(
this), TQT_SLOT( slotHeaderOnlyAttachments() ),
574 ac,
"view_attachments_headeronly" );
575 mHeaderOnlyAttachmentsAction->setToolTip( i18n(
"Show Attachments only in the header of the mail" ) );
576 mHeaderOnlyAttachmentsAction->setExclusiveGroup(
"view_attachments_group" );
577 attachmentMenu->insert( mHeaderOnlyAttachmentsAction );
580 mSelectEncodingAction =
new TDESelectAction( i18n(
"&Set Encoding" ),
"charset", 0,
581 TQT_TQOBJECT(
this), TQT_SLOT( slotSetEncoding() ),
583 TQStringList encodings = KMMsgBase::supportedEncodings(
false );
584 encodings.prepend( i18n(
"Auto" ) );
585 mSelectEncodingAction->setItems( encodings );
586 mSelectEncodingAction->setCurrentItem( 0 );
588 mMailToComposeAction =
new TDEAction( i18n(
"New Message To..."),
"mail-message-new",
589 0, TQT_TQOBJECT(
this), TQT_SLOT(slotMailtoCompose()), ac,
591 mMailToReplyAction =
new TDEAction( i18n(
"Reply To..."),
"mail-reply-sender",
592 0, TQT_TQOBJECT(
this), TQT_SLOT(slotMailtoReply()), ac,
594 mMailToForwardAction =
new TDEAction( i18n(
"Forward To..."),
"mail-forward",
595 0, TQT_TQOBJECT(
this), TQT_SLOT(slotMailtoForward()), ac,
597 mAddAddrBookAction =
new TDEAction( i18n(
"Add to Address Book"),
598 0, TQT_TQOBJECT(
this), TQT_SLOT(slotMailtoAddAddrBook()),
599 ac,
"add_addr_book" );
600 mOpenAddrBookAction =
new TDEAction( i18n(
"Open in Address Book"),
601 0, TQT_TQOBJECT(
this), TQT_SLOT(slotMailtoOpenAddrBook()),
602 ac,
"openin_addr_book" );
603 mCopyAction = KStdAction::copy( TQT_TQOBJECT(
this), TQT_SLOT(slotCopySelectedText()), ac,
"kmail_copy");
604 mSelectAllAction =
new TDEAction( i18n(
"Select All Text"), CTRL+SHIFT+Key_A, TQT_TQOBJECT(
this),
605 TQT_SLOT(selectAll()), ac,
"mark_all_text" );
606 mCopyURLAction =
new TDEAction( i18n(
"Copy Link Address"), 0, TQT_TQOBJECT(
this),
607 TQT_SLOT(slotUrlCopy()), ac,
"copy_url" );
608 mUrlOpenAction =
new TDEAction( i18n(
"Open URL"), 0, TQT_TQOBJECT(
this),
609 TQT_SLOT(slotUrlOpen()), ac,
"open_url" );
610 mAddBookmarksAction =
new TDEAction( i18n(
"Bookmark This Link"),
612 0, TQT_TQOBJECT(
this), TQT_SLOT(slotAddBookmarks()),
613 ac,
"add_bookmarks" );
614 mUrlSaveAsAction =
new TDEAction( i18n(
"Save Link As..."), 0, TQT_TQOBJECT(
this),
615 TQT_SLOT(slotUrlSave()), ac,
"saveas_url" );
617 mToggleFixFontAction =
new TDEToggleAction( i18n(
"Use Fi&xed Font"),
618 Key_X, TQT_TQOBJECT(
this), TQT_SLOT(slotToggleFixedFont()),
619 ac,
"toggle_fixedfont" );
621 mStartIMChatAction =
new TDEAction( i18n(
"Chat &With..."), 0, TQT_TQOBJECT(
this),
622 TQT_SLOT(slotIMChat()), ac,
"start_im_chat" );
626 TDERadioAction *KMReaderWin::actionForHeaderStyle(
const HeaderStyle * style,
const HeaderStrategy * strategy ) {
627 if ( !mActionCollection )
629 const char * actionName = 0;
630 if ( style == HeaderStyle::enterprise() )
631 actionName =
"view_headers_enterprise";
632 if ( style == HeaderStyle::fancy() )
633 actionName =
"view_headers_fancy";
634 else if ( style == HeaderStyle::brief() )
635 actionName =
"view_headers_brief";
636 else if ( style == HeaderStyle::plain() ) {
637 if ( strategy == HeaderStrategy::standard() )
638 actionName =
"view_headers_standard";
639 else if ( strategy == HeaderStrategy::rich() )
640 actionName =
"view_headers_long";
641 else if ( strategy == HeaderStrategy::all() )
642 actionName =
"view_headers_all";
645 return static_cast<TDERadioAction*
>(mActionCollection->action(actionName));
650 TDERadioAction *KMReaderWin::actionForAttachmentStrategy(
const AttachmentStrategy * as ) {
651 if ( !mActionCollection )
653 const char * actionName = 0;
654 if ( as == AttachmentStrategy::iconic() )
655 actionName =
"view_attachments_as_icons";
656 else if ( as == AttachmentStrategy::smart() )
657 actionName =
"view_attachments_smart";
658 else if ( as == AttachmentStrategy::inlined() )
659 actionName =
"view_attachments_inline";
660 else if ( as == AttachmentStrategy::hidden() )
661 actionName =
"view_attachments_hide";
662 else if ( as == AttachmentStrategy::headerOnly() )
663 actionName =
"view_attachments_headeronly";
666 return static_cast<TDERadioAction*
>(mActionCollection->action(actionName));
671 void KMReaderWin::slotEnterpriseHeaders() {
672 setHeaderStyleAndStrategy( HeaderStyle::enterprise(),
673 HeaderStrategy::rich() );
674 if( !mExternalWindow )
678 void KMReaderWin::slotFancyHeaders() {
679 setHeaderStyleAndStrategy( HeaderStyle::fancy(),
680 HeaderStrategy::rich() );
681 if( !mExternalWindow )
685 void KMReaderWin::slotBriefHeaders() {
686 setHeaderStyleAndStrategy( HeaderStyle::brief(),
687 HeaderStrategy::brief() );
688 if( !mExternalWindow )
692 void KMReaderWin::slotStandardHeaders() {
693 setHeaderStyleAndStrategy( HeaderStyle::plain(),
694 HeaderStrategy::standard());
698 void KMReaderWin::slotLongHeaders() {
699 setHeaderStyleAndStrategy( HeaderStyle::plain(),
700 HeaderStrategy::rich() );
701 if( !mExternalWindow )
705 void KMReaderWin::slotAllHeaders() {
706 setHeaderStyleAndStrategy( HeaderStyle::plain(),
707 HeaderStrategy::all() );
708 if( !mExternalWindow )
712 void KMReaderWin::slotLevelQuote(
int l )
715 saveRelativePosition();
719 void KMReaderWin::slotCycleHeaderStyles() {
720 const HeaderStrategy * strategy = headerStrategy();
723 const char * actionName = 0;
724 if ( style == HeaderStyle::enterprise() ) {
726 actionName =
"view_headers_fancy";
728 if ( style == HeaderStyle::fancy() ) {
730 actionName =
"view_headers_brief";
731 }
else if ( style == HeaderStyle::brief() ) {
732 slotStandardHeaders();
733 actionName =
"view_headers_standard";
734 }
else if ( style == HeaderStyle::plain() ) {
735 if ( strategy == HeaderStrategy::standard() ) {
737 actionName =
"view_headers_long";
738 }
else if ( strategy == HeaderStrategy::rich() ) {
740 actionName =
"view_headers_all";
741 }
else if ( strategy == HeaderStrategy::all() ) {
742 slotEnterpriseHeaders();
743 actionName =
"view_headers_enterprise";
748 static_cast<TDERadioAction*
>( mActionCollection->action( actionName ) )->setChecked(
true );
752 void KMReaderWin::slotIconicAttachments() {
753 setAttachmentStrategy( AttachmentStrategy::iconic() );
756 void KMReaderWin::slotSmartAttachments() {
757 setAttachmentStrategy( AttachmentStrategy::smart() );
760 void KMReaderWin::slotInlineAttachments() {
761 setAttachmentStrategy( AttachmentStrategy::inlined() );
764 void KMReaderWin::slotHideAttachments() {
765 setAttachmentStrategy( AttachmentStrategy::hidden() );
768 void KMReaderWin::slotHeaderOnlyAttachments() {
769 setAttachmentStrategy( AttachmentStrategy::headerOnly() );
772 void KMReaderWin::slotCycleAttachmentStrategy() {
773 setAttachmentStrategy( attachmentStrategy()->next() );
774 TDERadioAction * action = actionForAttachmentStrategy( attachmentStrategy() );
776 action->setChecked(
true );
781 KMReaderWin::~KMReaderWin()
783 clearBodyPartMementos();
784 delete mHtmlWriter; mHtmlWriter = 0;
786 if (mAutoDelete)
delete message();
787 delete mRootNode; mRootNode = 0;
793 void KMReaderWin::slotMessageArrived(
KMMessage *msg )
795 if (msg && ((KMMsgBase*)msg)->isMessage()) {
796 if ( msg->getMsgSerNum() == mWaitingForSerNum ) {
822 kdDebug(5006) <<
"KMReaderWin::update - no updated part" << endl;
825 partNode* node = mRootNode->findNodeForDwPart( msg->
lastUpdatedPart() );
827 kdDebug(5006) <<
"KMReaderWin::update - can't find node for part" << endl;
834 ::chmod( TQFile::encodeName( mAtmCurrentName ), S_IRWXU );
835 TQByteArray data = node->msgPart().bodyDecodedBinary();
836 size_t size = data.size();
837 if ( node->msgPart().type() == DwMime::kTypeText && size) {
840 KPIM::kBytesToFile( data.data(), size, mAtmCurrentName,
false,
false, false );
841 ::chmod( TQFile::encodeName( mAtmCurrentName ), S_IRUSR );
849 for (TQStringList::Iterator it = mTempFiles.begin(); it != mTempFiles.end();
855 for (TQStringList::Iterator it = mTempDirs.begin(); it != mTempDirs.end();
858 TQDir(*it).rmdir(*it);
867 if (e->type() == TQEvent::ApplicationPaletteChange)
870 mCSSHelper =
new KMail::CSSHelper( TQPaintDeviceMetrics( mViewer->view() ) );
872 message()->readConfig();
876 return TQWidget::event(e);
883 const TDEConfigGroup mdnGroup( KMKernel::config(),
"MDN" );
884 TDEConfigGroup reader( KMKernel::config(),
"Reader" );
887 mCSSHelper =
new KMail::CSSHelper( TQPaintDeviceMetrics( mViewer->view() ) );
889 mNoMDNsWhenEncrypted = mdnGroup.readBoolEntry(
"not-send-when-encrypted",
true );
891 mUseFixedFont = reader.readBoolEntry(
"useFixedFont",
false );
892 if ( mToggleFixFontAction )
893 mToggleFixFontAction->setChecked( mUseFixedFont );
895 mHtmlMail = reader.readBoolEntry(
"htmlMail",
false );
896 mHtmlLoadExternal = reader.readBoolEntry(
"htmlLoadExternal",
false );
898 setHeaderStyleAndStrategy( HeaderStyle::create( reader.readEntry(
"header-style",
"fancy" ) ),
899 HeaderStrategy::create( reader.readEntry(
"header-set-displayed",
"rich" ) ) );
900 TDERadioAction *raction = actionForHeaderStyle( headerStyle(), headerStrategy() );
902 raction->setChecked(
true );
904 setAttachmentStrategy( AttachmentStrategy::create( reader.readEntry(
"attachment-strategy",
"smart" ) ) );
905 raction = actionForAttachmentStrategy( attachmentStrategy() );
907 raction->setChecked(
true );
911 mShowColorbar = reader.readBoolEntry(
"showColorbar", Kpgp::Module::getKpgp()->usePGP() );
915 reader.writeEntry(
"showColorbar", mShowColorbar );
917 mMimeTreeAtBottom = reader.readEntry(
"MimeTreeLocation",
"bottom" ) !=
"top";
918 const TQString s = reader.readEntry(
"MimeTreeMode",
"smart" );
921 else if ( s ==
"always" )
926 const int mimeH = reader.readNumEntry(
"MimePaneHeight", 100 );
927 const int messageH = reader.readNumEntry(
"MessagePaneHeight", 180 );
928 mSplitterSizes.clear();
929 if ( mMimeTreeAtBottom )
930 mSplitterSizes << messageH << mimeH;
932 mSplitterSizes << mimeH << messageH;
936 readGlobalOverrideCodec();
944 void KMReaderWin::adjustLayout() {
945 if ( mMimeTreeAtBottom )
946 mSplitter->moveToLast( mMimePartTree );
948 mSplitter->moveToFirst( mMimePartTree );
949 mSplitter->setSizes( mSplitterSizes );
951 if ( mMimeTreeMode == 2 && mMsgDisplay )
952 mMimePartTree->show();
954 mMimePartTree->hide();
956 if ( mShowColorbar && mMsgDisplay )
963 void KMReaderWin::saveSplitterSizes( TDEConfigBase & c )
const {
964 if ( !mSplitter || !mMimePartTree )
966 if ( mMimePartTree->isHidden() )
969 c.writeEntry(
"MimePaneHeight", mSplitter->sizes()[ mMimeTreeAtBottom ? 1 : 0 ] );
970 c.writeEntry(
"MessagePaneHeight", mSplitter->sizes()[ mMimeTreeAtBottom ? 0 : 1 ] );
975 TDEConfigGroup reader( KMKernel::config(),
"Reader" );
977 reader.writeEntry(
"useFixedFont", mUseFixedFont );
979 reader.writeEntry(
"header-style", headerStyle()->name() );
980 if ( headerStrategy() )
981 reader.writeEntry(
"header-set-displayed", headerStrategy()->name() );
982 if ( attachmentStrategy() )
983 reader.writeEntry(
"attachment-strategy", attachmentStrategy()->name() );
985 saveSplitterSizes( reader );
988 kmkernel->slotRequestConfigSync();
994 mViewer->widget()->setFocusPolicy(TQ_WheelFocus);
996 mViewer->setPluginsEnabled(
false);
997 mViewer->setJScriptEnabled(
false);
998 mViewer->setJavaEnabled(
false);
999 mViewer->setMetaRefreshEnabled(
false);
1000 mViewer->setURLCursor(KCursor::handCursor());
1002 mViewer->view()->setLineWidth(0);
1004 mViewer->view()->viewport()->installEventFilter(
this );
1006 if ( !htmlWriter() )
1007 #ifdef KMAIL_READER_HTML_DEBUG 1008 mHtmlWriter =
new TeeHtmlWriter(
new FileHtmlWriter( TQString() ),
1009 new KHtmlPartHtmlWriter( mViewer, 0 ) );
1011 mHtmlWriter =
new KHtmlPartHtmlWriter( mViewer, 0 );
1014 connect(mViewer->browserExtension(),
1015 TQT_SIGNAL(openURLRequest(
const KURL &,
const KParts::URLArgs &)),
this,
1016 TQT_SLOT(slotUrlOpen(
const KURL &)));
1017 connect(mViewer->browserExtension(),
1018 TQT_SIGNAL(createNewWindow(
const KURL &,
const KParts::URLArgs &)),
this,
1019 TQT_SLOT(slotUrlOpen(
const KURL &)));
1020 connect(mViewer,TQT_SIGNAL(popupMenu(
const TQString &,
const TQPoint &)),
1021 TQT_SLOT(slotUrlPopup(
const TQString &,
const TQPoint &)));
1022 connect( kmkernel->imProxy(), TQT_SIGNAL( sigContactPresenceChanged(
const TQString & ) ),
1023 TQT_TQOBJECT(
this), TQT_SLOT( contactStatusChanged(
const TQString & ) ) );
1024 connect( kmkernel->imProxy(), TQT_SIGNAL( sigPresenceInfoExpired() ),
1025 TQT_TQOBJECT(
this), TQT_SLOT( updateReaderWin() ) );
1028 void KMReaderWin::contactStatusChanged(
const TQString &uid)
1032 DOM::NodeList presenceNodes = mViewer->htmlDocument()
1033 .getElementsByName( DOM::DOMString( TQString::fromLatin1(
"presence-") + uid ) );
1034 for (
unsigned int i = 0; i < presenceNodes.length(); ++i ) {
1035 DOM::Node n = presenceNodes.item( i );
1036 kdDebug( 5006 ) <<
"name is " << n.nodeName().string() << endl;
1037 kdDebug( 5006 ) <<
"value of content was " << n.firstChild().nodeValue().string() << endl;
1038 TQString newPresence = kmkernel->imProxy()->presenceString( uid );
1039 if ( newPresence.isNull() )
1040 newPresence = TQString::fromLatin1(
"ENOIMRUNNING" );
1041 n.firstChild().setNodeValue( newPresence );
1047 void KMReaderWin::setAttachmentStrategy(
const AttachmentStrategy * strategy ) {
1048 mAttachmentStrategy = strategy ? strategy : AttachmentStrategy::smart();
1053 const HeaderStrategy * strategy ) {
1054 mHeaderStyle = style ? style : HeaderStyle::fancy();
1055 mHeaderStrategy = strategy ? strategy : HeaderStrategy::rich();
1056 if ( mHeaderOnlyAttachmentsAction ) {
1057 const bool styleHasAttachmentQuickList = mHeaderStyle == HeaderStyle::fancy() ||
1058 mHeaderStyle == HeaderStyle::enterprise();
1059 mHeaderOnlyAttachmentsAction->setEnabled( styleHasAttachmentQuickList );
1060 if ( !styleHasAttachmentQuickList && mAttachmentStrategy == AttachmentStrategy::headerOnly() ) {
1063 setAttachmentStrategy( AttachmentStrategy::smart() );
1072 if ( encoding == mOverrideEncoding )
1075 mOverrideEncoding = encoding;
1076 if ( mSelectEncodingAction ) {
1077 if ( encoding.isEmpty() ) {
1078 mSelectEncodingAction->setCurrentItem( 0 );
1081 TQStringList encodings = mSelectEncodingAction->items();
1083 for ( TQStringList::const_iterator it = encodings.begin(), end = encodings.end(); it != end; ++it, ++i ) {
1084 if ( TDEGlobal::charsets()->encodingForName( *it ) == encoding ) {
1085 mSelectEncodingAction->setCurrentItem( i );
1089 if ( i == encodings.size() ) {
1091 kdWarning(5006) <<
"Unknown override character encoding \"" << encoding
1092 <<
"\". Using Auto instead." << endl;
1093 mSelectEncodingAction->setCurrentItem( 0 );
1094 mOverrideEncoding = TQString();
1102 void KMReaderWin::setPrintFont(
const TQFont& font )
1105 mCSSHelper->setPrintFont( font );
1111 if ( mOverrideEncoding.isEmpty() || mOverrideEncoding ==
"Auto" )
1114 return KMMsgBase::codecForName( mOverrideEncoding.latin1() );
1118 void KMReaderWin::slotSetEncoding()
1120 if ( mSelectEncodingAction->currentItem() == 0 )
1121 mOverrideEncoding = TQString();
1123 mOverrideEncoding = TDEGlobal::charsets()->encodingForName( mSelectEncodingAction->currentText() );
1128 void KMReaderWin::readGlobalOverrideCodec()
1131 if ( GlobalSettings::self()->overrideCharacterEncoding() == mOldGlobalOverrideEncoding )
1134 setOverrideEncoding( GlobalSettings::self()->overrideCharacterEncoding() );
1135 mOldGlobalOverrideEncoding = GlobalSettings::self()->overrideCharacterEncoding();
1141 mSerNumOfOriginalMessage = serNumOfOriginalMessage;
1142 mNodeIdOffset = nodeIdOffset;
1149 kdDebug(5006) <<
"(" << aMsg->getMsgSerNum() <<
", last " << mLastSerNum <<
") " << aMsg->
subject() <<
" " 1150 << aMsg->fromStrip() <<
", readyToShow " << (aMsg->
readyToShow()) << endl;
1154 if ( aMsg && aMsg->getMsgSerNum() != mLastSerNum && !updateOnly ){
1155 mLevelQuote = GlobalSettings::self()->collapseQuoteLevelSpin()-1;
1156 mShowRawToltecMail = !GlobalSettings::self()->showToltecReplacementText();
1157 clearBodyPartMementos();
1162 bool complete =
true;
1165 (aMsg->getMsgSerNum() != mLastSerNum) &&
1170 if (!force && aMsg && mLastSerNum != 0 && aMsg->getMsgSerNum() == mLastSerNum)
1174 if (aMsg && message())
1175 message()->detach(
this );
1177 aMsg->attach(
this );
1180 mDelayedMarkTimer.stop();
1184 mWaitingForSerNum = 0;
1187 mLastSerNum = aMsg->getMsgSerNum();
1193 if (message() != aMsg) {
1204 mViewer->setDNDEnabled(
false );
1206 mViewer->setDNDEnabled(
true );
1216 mUpdateReaderWinTimer.stop();
1219 else if (mUpdateReaderWinTimer.isActive())
1220 mUpdateReaderWinTimer.changeInterval( delay );
1222 mUpdateReaderWinTimer.start( 0,
true );
1225 if ( aMsg && (aMsg->isUnread() || aMsg->isNew()) && GlobalSettings::self()->delayedMarkAsRead() ) {
1226 if ( GlobalSettings::self()->delayedMarkTime() != 0 )
1227 mDelayedMarkTimer.start( GlobalSettings::self()->delayedMarkTime() * 1000, true );
1232 mHeaderRefreshTimer.start( 1000,
false );
1238 mUpdateReaderWinTimer.stop();
1240 mDelayedMarkTimer.stop();
1242 mWaitingForSerNum = 0;
1247 static const char *
const kmailChanges[] = {
1250 static const int numKMailChanges =
1251 sizeof kmailChanges /
sizeof *kmailChanges;
1257 static const char *
const kmailNewFeatures[] = {
1258 I18N_NOOP(
"Full namespace support for IMAP"),
1259 I18N_NOOP(
"Offline mode"),
1260 I18N_NOOP(
"Sieve script management and editing"),
1261 I18N_NOOP(
"Account specific filtering"),
1262 I18N_NOOP(
"Filtering of incoming mail for online IMAP accounts"),
1263 I18N_NOOP(
"Online IMAP folders can be used when filtering into folders"),
1264 I18N_NOOP(
"Automatically delete older mails on POP servers")
1266 static const int numKMailNewFeatures =
1267 sizeof kmailNewFeatures /
sizeof *kmailNewFeatures;
1275 for (
int i = 0 ; i < numKMailChanges ; ++i )
1276 str += kmailChanges[i];
1277 for (
int i = 0 ; i < numKMailNewFeatures ; ++i )
1278 str += kmailNewFeatures[i];
1280 return md5.base64Digest();
1286 mMsgDisplay =
false;
1289 TQString location = locate(
"data",
"kmail/about/main.html");
1290 TQString content = KPIM::kFileToString(location);
1291 content = content.arg( locate(
"data",
"libtdepim/about/kde_infopage.css" ) );
1292 if ( kapp->reverseLayout() )
1293 content = content.arg(
"@import \"%1\";" ).arg( locate(
"data",
"libtdepim/about/kde_infopage_rtl.css" ) );
1295 content = content.arg(
"" );
1297 mViewer->begin(KURL( location ));
1299 TQString fontSize = TQString::number( pointsToPixel( mCSSHelper->bodyFont().pointSize() ) );
1300 TQString appTitle = i18n(
"KMail");
1301 TQString catchPhrase =
"";
1302 TQString quickDescription = i18n(
"The email client for the Trinity Desktop Environment.");
1303 mViewer->write(content.arg(fontSize).arg(appTitle).arg(catchPhrase).arg(quickDescription).arg(info));
1310 i18n(
"<h2 style='margin-top: 0px;'>Retrieving Folder Contents</h2><p>Please wait . . .</p> " );
1312 displaySplashPage( info );
1318 i18n(
"<h2 style='margin-top: 0px;'>Offline</h2><p>KMail is currently in offline mode. " 1319 "Click <a href=\"kmail:goOnline\">here</a> to go online . . .</p> " );
1321 displaySplashPage( info );
1329 i18n(
"%1: KMail version; %2: help:// URL; %3: homepage URL; " 1330 "%4: prior KMail version; %5: prior TDE version; " 1331 "%6: generated list of new features; " 1332 "%7: First-time user text (only shown on first start); " 1333 "%8: generated list of important changes; " 1334 "--- end of comment ---",
1335 "<h2 style='margin-top: 0px;'>Welcome to KMail %1</h2><p>KMail is the email client for the K " 1336 "Desktop Environment. It is designed to be fully compatible with " 1337 "Internet mailing standards including MIME, SMTP, POP3 and IMAP." 1339 "<ul><li>KMail has many powerful features which are described in the " 1340 "<a href=\"%2\">documentation</a></li>\n" 1341 "<li>The <a href=\"%3\">KMail homepage</A> offers information about " 1342 "new versions of KMail</li></ul>\n" 1344 "<p>Some of the new features in this release of KMail include " 1345 "(compared to KMail %4, which is part of TDE %5):</p>\n" 1348 "<p>We hope that you will enjoy KMail.</p>\n" 1349 "<p>Thank you,</p>\n" 1350 "<p style='margin-bottom: 0px'> The KMail Team</p>")
1352 .arg(
"help:/kmail/index.html")
1353 .arg(
"http://kontact.kde.org/kmail/")
1354 .arg(
"1.8").arg(
"3.4");
1356 TQString featureItems;
1357 for (
int i = 0 ; i < numKMailNewFeatures ; i++ )
1358 featureItems += i18n(
"<li>%1</li>\n").arg( i18n( kmailNewFeatures[i] ) );
1360 info = info.arg( featureItems );
1362 if( kmkernel->firstStart() ) {
1363 info = info.arg( i18n(
"<p>Please take a moment to fill in the KMail " 1364 "configuration panel at Settings->Configure " 1366 "You need to create at least a default identity and " 1367 "an incoming as well as outgoing mail account." 1370 info = info.arg( TQString() );
1373 if ( ( numKMailChanges > 1 ) || ( numKMailChanges == 1 && strlen(kmailChanges[0]) > 0 ) ) {
1374 TQString changesText =
1375 i18n(
"<p><span style='font-size:125%; font-weight:bold;'>" 1376 "Important changes</span> (compared to KMail %1):</p>\n")
1378 changesText +=
"<ul>\n";
1379 for (
int i = 0 ; i < numKMailChanges ; i++ )
1380 changesText += i18n(
"<li>%1</li>\n").arg( i18n( kmailChanges[i] ) );
1381 changesText +=
"</ul>\n";
1382 info = info.arg( changesText );
1385 info = info.arg(
"");
1387 displaySplashPage( info );
1400 if (!mMsgDisplay)
return;
1402 mViewer->setOnlyLocalReferences(!htmlLoadExternal());
1404 htmlWriter()->reset();
1407 if (message(&folder))
1409 if ( mShowColorbar )
1418 mMimePartTree->hide();
1419 mMimePartTree->clear();
1420 htmlWriter()->begin( mCSSHelper->cssDefinitions( isFixedFont() ) );
1421 htmlWriter()->write( mCSSHelper->htmlHead( isFixedFont() ) +
"</body></html>" );
1422 htmlWriter()->end();
1425 if (mSavedRelativePosition)
1427 TQScrollView * scrollview =
static_cast<TQScrollView *
>(mViewer->widget());
1428 scrollview->setContentsPos( 0,
1429 tqRound( scrollview->contentsHeight() * mSavedRelativePosition ) );
1430 mSavedRelativePosition = 0;
1437 const TQPaintDeviceMetrics pdm(mViewer->view());
1439 return (pointSize * pdm.logicalDpiY() + 36) / 72;
1444 if ( mMimeTreeMode == 2 ||
1445 ( mMimeTreeMode == 1 && !isPlainTextTopLevel ) )
1446 mMimePartTree->show();
1449 TDEConfigGroup reader( KMKernel::config(),
"Reader" );
1450 saveSplitterSizes( reader );
1451 mMimePartTree->hide();
1458 mMimePartTree->clear();
1459 showHideMimeTree( !msg ||
1460 ( msg->type() == DwMime::kTypeText
1461 && msg->subtype() == DwMime::kSubtypePlain ) );
1468 htmlWriter()->begin( mCSSHelper->cssDefinitions( isFixedFont() ) );
1469 htmlWriter()->queue( mCSSHelper->htmlHead( isFixedFont() ) );
1476 mColorBar->setNeutralMode();
1480 if( mColorBar->isNeutral() )
1481 mColorBar->setNormalMode();
1483 htmlWriter()->queue(
"</body></html>");
1484 htmlWriter()->flush();
1486 TQTimer::singleShot( 1, TQT_TQOBJECT(
this), TQT_SLOT(injectAttachments()) );
1489 static bool message_was_saved_decrypted_before(
const KMMessage * msg ) {
1493 return msg->
msgId().stripWhiteSpace().startsWith(
"<DecryptedMsg." );
1499 KMMessagePart msgPart;
1500 TQCString subtype, contDisp;
1505 aMsg->setIsBeingParsed(
true );
1507 if ( mRootNode && !mRootNode->processed() )
1509 kdWarning() <<
"The root node is not yet processed! Danger!\n";
1513 mRootNode = partNode::fromMessage( aMsg,
this );
1514 const TQCString mainCntTypeStr = mRootNode->typeString() +
'/' + mRootNode->subTypeString();
1516 TQString cntDesc = aMsg->
subject();
1517 if( cntDesc.isEmpty() )
1518 cntDesc = i18n(
"( body part )");
1519 TDEIO::filesize_t cntSize = aMsg->
msgSize();
1527 mRootNode->fillMimePartTree( 0,
1534 partNode* vCardNode = mRootNode->findType( DwMime::kTypeText, DwMime::kSubtypeXVCard );
1535 bool hasVCard =
false;
1539 TDEABC::VCardConverter t;
1540 #if defined(KABC_VCARD_ENCODING_FIX) 1541 const TQByteArray vcard = vCardNode->msgPart().bodyDecodedBinary();
1542 if ( !t.parseVCardsRaw( vcard.data() ).empty() ) {
1544 const TQString vcard = vCardNode->msgPart().bodyToUnicode( overrideCodec() );
1545 if ( !t.parseVCards( vcard ).empty() ) {
1548 writeMessagePartToTempFile( &vCardNode->msgPart(), vCardNode->nodeId() );
1552 if ( !mRootNode || !mRootNode->isToltecMessage() || mShowRawToltecMail ) {
1553 htmlWriter()->queue( writeMsgHeader(aMsg, hasVCard ? vCardNode : 0,
true ) );
1557 ObjectTreeParser otp(
this );
1558 otp.setAllowAsync(
true );
1559 otp.setShowRawToltecMail( mShowRawToltecMail );
1560 otp.parseObjectTree( mRootNode );
1564 KMMsgEncryptionState encryptionState = mRootNode->overallEncryptionState();
1565 KMMsgSignatureState signatureState = mRootNode->overallSignatureState();
1567 if (aMsg != message()) {
1574 if ( signatureState != KMMsgNotSigned ||
1579 bool emitReplaceMsgByUnencryptedVersion =
false;
1580 const TDEConfigGroup reader( KMKernel::config(),
"Reader" );
1581 if ( reader.readBoolEntry(
"store-displayed-messages-unencrypted",
false ) ) {
1596 kdDebug(5006) <<
"\n\n\nKMReaderWin::parseMsg() - special post-encryption handling:\n1." << endl;
1597 kdDebug(5006) <<
"(aMsg == msg) = " << (aMsg == message()) << endl;
1598 kdDebug(5006) <<
"aMsg->parent() && aMsg->parent() != kmkernel->outboxFolder() = " << (aMsg->parent() && aMsg->parent() != kmkernel->outboxFolder()) << endl;
1599 kdDebug(5006) <<
"message_was_saved_decrypted_before( aMsg ) = " << message_was_saved_decrypted_before( aMsg ) << endl;
1600 kdDebug(5006) <<
"this->decryptMessage() = " << decryptMessage() << endl;
1601 kdDebug(5006) <<
"otp.hasPendingAsyncJobs() = " << otp.hasPendingAsyncJobs() << endl;
1602 kdDebug(5006) <<
" (KMMsgFullyEncrypted == encryptionState) = " << (KMMsgFullyEncrypted == encryptionState) << endl;
1603 kdDebug(5006) <<
"|| (KMMsgPartiallyEncrypted == encryptionState) = " << (KMMsgPartiallyEncrypted == encryptionState) << endl;
1606 if( (aMsg == message())
1608 && ( aMsg->parent() && aMsg->parent() != kmkernel->outboxFolder() )
1610 && !message_was_saved_decrypted_before( aMsg )
1614 && !otp.hasPendingAsyncJobs()
1616 && ( (KMMsgFullyEncrypted == encryptionState)
1617 || (KMMsgPartiallyEncrypted == encryptionState) ) ) {
1619 kdDebug(5006) <<
"KMReaderWin - calling objectTreeToDecryptedMsg()" << endl;
1621 NewByteArray decryptedData;
1623 objectTreeToDecryptedMsg( mRootNode, decryptedData, *aMsg );
1625 decryptedData.appendNULL();
1626 TQCString resultString( decryptedData.data() );
1627 kdDebug(5006) <<
"KMReaderWin - resulting data:" << resultString << endl;
1629 if( !resultString.isEmpty() ) {
1630 kdDebug(5006) <<
"KMReaderWin - composing unencrypted message" << endl;
1632 aMsg->
setBody( resultString );
1634 unencryptedMessage->setParent( 0 );
1643 kdDebug(5006) <<
"KMReaderWin - attach unencrypted message to aMsg" << endl;
1645 emitReplaceMsgByUnencryptedVersion =
true;
1651 const int rootNodeCntType = mRootNode ? mRootNode->type() : DwMime::kTypeText;
1652 const int rootNodeCntSubtype = mRootNode ? mRootNode->subType() : DwMime::kSubtypePlain;
1655 setIdOfLastViewedMessage( aMsg->
msgId() );
1657 if( emitReplaceMsgByUnencryptedVersion ) {
1658 kdDebug(5006) <<
"KMReaderWin - invoce saving in decrypted form:" << endl;
1659 emit replaceMsgByUnencryptedVersion();
1661 kdDebug(5006) <<
"KMReaderWin - finished parsing and displaying of message." << endl;
1662 showHideMimeTree( rootNodeCntType == DwMime::kTypeText &&
1663 rootNodeCntSubtype == DwMime::kSubtypePlain );
1666 aMsg->setIsBeingParsed(
false );
1671 void KMReaderWin::updateHeader()
1683 if (currentMessage &&
1684 mHeaderStyle == HeaderStyle::fancy() &&
1685 currentMessage->parent())
1689 DOM::NodeList divs(mViewer->document().documentElement().getElementsByTagName(
"div"));
1690 DOM::NodeList headerDivs(static_cast<DOM::HTMLDivElement>(divs.item(0)).getElementsByTagName(
"div"));
1691 for (i=0; i<((int)headerDivs.length()); i++) {
1692 if (static_cast<DOM::HTMLDivElement>(headerDivs.item(i)).
id().string() ==
"sendersCurrentTime") {
1698 if (divNumber >= 0) {
1699 DOM::HTMLDivElement elem =
static_cast<DOM::HTMLDivElement
>(headerDivs.item(i));
1703 TQString latestHeader = headerStyle()->format( currentMessage, headerStrategy(),
"", mPrinting,
false );
1704 int startPos = latestHeader.find(
"<div id=\"sendersCurrentTime\" style=\"");
1705 if (startPos >= 0) {
1706 latestHeader = latestHeader.mid(startPos);
1707 int endPos = latestHeader.find(
"</div>");
1709 endPos = endPos + 6;
1710 latestHeader.truncate(endPos);
1712 TQString divText = latestHeader;
1713 TQString divStyle = latestHeader;
1715 divText = divText.mid(divText.find(
">")+1);
1716 divText.truncate(divText.find(
"</div>"));
1718 divStyle = divStyle.mid(TQString(
"<div id=\"sendersCurrentTime\" style=\"").length());
1719 divStyle.truncate(divStyle.find(
"\""));
1721 elem.setInnerHTML(divText);
1722 elem.setAttribute(
"style", divStyle);
1723 elem.applyChanges();
1733 kdFatal( !headerStyle(), 5006 )
1734 <<
"trying to writeMsgHeader() without a header style set!" << endl;
1735 kdFatal( !headerStrategy(), 5006 )
1736 <<
"trying to writeMsgHeader() without a header strategy set!" << endl;
1739 href = vCardNode->asHREF(
"body" );
1741 return headerStyle()->format( aMsg, headerStrategy(), href, mPrinting, topLevel );
1750 TQString fileName = aMsgPart->fileName();
1751 if( fileName.isEmpty() )
1752 fileName = aMsgPart->name();
1755 TQString fname = createTempDir( TQString::number( aPartNum ) );
1756 if ( fname.isEmpty() )
1760 int slashPos = fileName.findRev(
'/' );
1761 if( -1 != slashPos )
1762 fileName = fileName.mid( slashPos + 1 );
1763 if( fileName.isEmpty() )
1764 fileName =
"unnamed";
1765 fname +=
"/" + fileName;
1767 TQByteArray data = aMsgPart->bodyDecodedBinary();
1768 size_t size = data.size();
1769 if ( aMsgPart->type() == DwMime::kTypeText && size) {
1773 if( !KPIM::kBytesToFile( data.data(), size, fname,
false,
false, false ) )
1776 mTempFiles.append( fname );
1779 ::chmod( TQFile::encodeName( fname ), S_IRUSR );
1786 KTempFile *tempFile =
new KTempFile( TQString(),
"." + param );
1787 tempFile->setAutoDelete(
true );
1788 TQString fname = tempFile->name();
1791 if( ::access( TQFile::encodeName( fname ), W_OK ) != 0 )
1793 if( ::mkdir( TQFile::encodeName( fname ), 0 ) != 0
1794 || ::chmod( TQFile::encodeName( fname ), S_IRWXU ) != 0 )
1797 assert( !fname.isNull() );
1799 mTempDirs.append( fname );
1806 #if defined(KABC_VCARD_ENCODING_FIX) 1807 const TQByteArray vCard = msgPart->bodyDecodedBinary();
1809 const TQString vCard = msgPart->bodyToUnicode( overrideCodec() );
1811 VCardViewer *vcv =
new VCardViewer(
this, vCard,
"vCardDialog" );
1818 if (!message())
return;
1819 mViewer->view()->print();
1826 if (aUrl.isEmpty())
return -1;
1827 if (!aUrl.isLocalFile())
return -1;
1829 TQString path = aUrl.path();
1830 uint right = path.findRev(
'/');
1831 uint left = path.findRev(
'.', right);
1834 int res = path.mid(left + 1, right - left - 1).toInt(&ok);
1835 return (ok) ? res : -1;
1840 void KMReaderWin::resizeEvent(TQResizeEvent *)
1842 if( !mResizeTimer.isActive() )
1848 mResizeTimer.start( 100,
true );
1854 void KMReaderWin::slotDelayedResize()
1856 mSplitter->setGeometry(0, 0, width(), height());
1861 void KMReaderWin::slotTouchMessage()
1866 if ( !message()->isNew() && !message()->isUnread() )
1870 serNums.append( message()->getMsgSerNum() );
1871 KMCommand *command =
new KMSeStatusCommand( KMMsgStatusRead, serNums );
1875 if ( mNoMDNsWhenEncrypted &&
1876 message()->encryptionState() != KMMsgNotEncrypted &&
1877 message()->encryptionState() != KMMsgEncryptionStateUnknown )
1880 KMFolder *folder = message()->parent();
1889 if ( !kmkernel->msgSender()->send( receipt ) )
1890 KMessageBox::error(
this, i18n(
"Could not send MDN.") );
1897 TQWidget::closeEvent(e);
1902 bool foundSMIMEData(
const TQString aUrl,
1903 TQString& displayName,
1907 static TQString showCertMan(
"showCertificate#");
1911 int i1 = aUrl.find( showCertMan );
1913 i1 += showCertMan.length();
1914 int i2 = aUrl.find(
" ### ", i1);
1917 displayName = aUrl.mid( i1, i2-i1 );
1919 i2 = aUrl.find(
" ### ", i1);
1922 libName = aUrl.mid( i1, i2-i1 );
1925 keyId = aUrl.mid( i2 );
1941 return !keyId.isEmpty();
1948 const KURL url(aUrl);
1950 if ( url.protocol() ==
"kmail" || url.protocol() ==
"x-kmail" || url.protocol() ==
"attachment" 1951 || (url.protocol().isEmpty() && url.path().isEmpty()) ) {
1952 mViewer->setDNDEnabled(
false );
1954 mViewer->setDNDEnabled(
true );
1957 if ( aUrl.stripWhiteSpace().isEmpty() ) {
1958 KPIM::BroadcastStatus::instance()->reset();
1959 mHoveredUrl = KURL();
1960 mLastClickImagePath = TQString();
1966 const TQString msg = URLHandlerManager::instance()->statusBarMessage( url,
this );
1968 kdWarning( msg.isEmpty(), 5006 ) <<
"KMReaderWin::slotUrlOn(): Unhandled URL hover!" << endl;
1969 KPIM::BroadcastStatus::instance()->setTransienStatusMsg( msg );
1978 if ( URLHandlerManager::instance()->handleClick( aUrl,
this ) )
1981 kdWarning( 5006 ) <<
"KMReaderWin::slotOpenUrl(): Unhandled URL click!" << endl;
1982 emit urlClicked( aUrl, Qt::LeftButton );
1988 const KURL url( aUrl );
1991 if ( url.protocol() ==
"mailto" ) {
1992 mCopyURLAction->setText( i18n(
"Copy Email Address" ) );
1994 mCopyURLAction->setText( i18n(
"Copy Link Address" ) );
1997 if ( URLHandlerManager::instance()->handleContextMenuRequest( url, aPos,
this ) )
2001 kdWarning( 5006 ) <<
"KMReaderWin::slotUrlPopup(): Unhandled URL right-click!" << endl;
2002 emitPopupMenu( url, aPos );
2008 static bool hasParentDivWithId(
const DOM::Node &start,
const TQString &
id )
2010 if ( start.isNull() )
2013 if ( start.nodeName().string() ==
"div" ) {
2014 for (
unsigned int i = 0; i < start.attributes().length(); i++ ) {
2015 if ( start.attributes().item( i ).nodeName().string() ==
"id" &&
2016 start.attributes().item( i ).nodeValue().string() == id )
2021 if ( !start.parentNode().isNull() )
2022 return hasParentDivWithId( start.parentNode(), id );
2027 void KMReaderWin::showAttachmentPopup(
int id,
const TQString & name,
const TQPoint & p )
2030 mAtmCurrentName = name;
2031 TDEPopupMenu *menu =
new TDEPopupMenu();
2032 menu->insertItem(SmallIcon(
"document-open"),i18n(
"to open",
"Open"), 1);
2033 menu->insertItem(i18n(
"Open With..."), 2);
2034 menu->insertItem(i18n(
"to view something",
"View"), 3);
2035 menu->insertItem(SmallIcon(
"document-save-as"),i18n(
"Save As..."), 4);
2036 menu->insertItem(SmallIcon(
"edit-copy"), i18n(
"Copy"), 9 );
2037 const bool canChange = message()->parent() ? !message()->parent()->isReadOnly() :
false;
2038 if ( GlobalSettings::self()->allowAttachmentEditing() && canChange )
2039 menu->insertItem(SmallIcon(
"edit"), i18n(
"Edit Attachment"), 8 );
2040 if ( GlobalSettings::self()->allowAttachmentDeletion() && canChange )
2041 menu->insertItem(SmallIcon(
"edit-delete"), i18n(
"Delete Attachment"), 7 );
2042 if ( name.endsWith(
".xia",
false ) &&
2043 Kleo::CryptoBackendFactory::instance()->protocol(
"Chiasmus" ) )
2044 menu->insertItem( i18n(
"Decrypt With Chiasmus..." ), 6 );
2045 menu->insertItem(i18n(
"Properties"), 5);
2047 const bool attachmentInHeader = hasParentDivWithId( mViewer->nodeUnderMouse(),
"attachmentInjectionPoint" );
2048 const bool hasScrollbar = mViewer->view()->verticalScrollBar()->isVisible();
2049 if ( attachmentInHeader && hasScrollbar ) {
2050 menu->insertItem( i18n(
"Scroll To"), 10 );
2053 connect(menu, TQT_SIGNAL(activated(
int)), TQT_TQOBJECT(
this), TQT_SLOT(slotHandleAttachment(
int)));
2065 if( style().isA(
"KeramikStyle") )
2066 frameWidth = style().pixelMetric( TQStyle::PM_DefaultFrameWidth ) - 1;
2068 frameWidth = style().pixelMetric( TQStyle::PM_DefaultFrameWidth );
2069 if ( frameWidth < 0 )
2071 if ( frameWidth != mBox->lineWidth() )
2072 mBox->setLineWidth( frameWidth );
2078 setStyleDependantFrameWidth();
2079 TQWidget::styleChange( oldStyle );
2083 void KMReaderWin::slotHandleAttachment(
int choice )
2086 partNode* node = mRootNode ? mRootNode->findId( mAtmCurrent ) : 0;
2087 if ( mAtmCurrentName.isEmpty() && node )
2088 mAtmCurrentName = tempFileUrlFromPartNode( node ).path();
2090 KMHandleAttachmentCommand* command =
new KMHandleAttachmentCommand(
2091 node, message(), mAtmCurrent, mAtmCurrentName,
2092 KMHandleAttachmentCommand::AttachmentAction( choice ), 0,
this );
2093 connect( command, TQT_SIGNAL( showAttachment(
int,
const TQString& ) ),
2094 TQT_TQOBJECT(
this), TQT_SLOT( slotAtmView(
int,
const TQString& ) ) );
2096 }
else if ( choice == 7 ) {
2097 slotDeleteAttachment( node );
2098 }
else if ( choice == 8 ) {
2099 slotEditAttachment( node );
2100 }
else if ( choice == 9 ) {
2101 if ( !node )
return;
2103 KURL url = tempFileUrlFromPartNode( node );
2104 if (!url.isValid() )
return;
2106 KURLDrag* drag =
new KURLDrag( urls,
this );
2107 TQApplication::clipboard()->setData( drag, TQClipboard::Clipboard );
2108 }
else if ( choice == 10 ) {
2109 scrollToAttachment( node );
2116 mViewer->findText();
2122 mViewer->findTextNext();
2128 mUseFixedFont = !mUseFixedFont;
2129 saveRelativePosition();
2137 kapp->clipboard()->setText( mViewer->selectedText() );
2144 assert(aMsgPart!=0);
2146 msg->fromString(aMsgPart->bodyDecoded());
2150 msg->setParent( message()->parent() );
2151 msg->setUID(message()->UID());
2153 KMReaderMainWin *win =
new KMReaderMainWin();
2154 win->showMsg( overrideEncoding(), msg, message()->getMsgSerNum(), nodeId );
2160 htmlWriter()->reset();
2162 htmlWriter()->begin( mCSSHelper->cssDefinitions( isFixedFont() ) );
2163 htmlWriter()->write( mCSSHelper->htmlHead( isFixedFont() ) );
2166 ObjectTreeParser otp(
this, 0,
true );
2167 otp.parseObjectTree( node );
2170 htmlWriter()->queue(
"</body></html>" );
2171 htmlWriter()->flush();
2176 const TQString& aFileName,
const TQString& pname )
2179 if (kasciistricmp(aMsgPart->typeStr(),
"message")==0) {
2182 assert(aMsgPart!=0);
2183 msg->fromString(aMsgPart->bodyDecoded());
2184 mMainWindow->setCaption(msg->
subject());
2186 setAutoDelete(
true);
2187 }
else if (kasciistricmp(aMsgPart->typeStr(),
"text")==0) {
2188 if (kasciistricmp(aMsgPart->subtypeStr(),
"x-vcard") == 0) {
2189 showVCard( aMsgPart );
2192 htmlWriter()->begin( mCSSHelper->cssDefinitions( isFixedFont() ) );
2193 htmlWriter()->queue( mCSSHelper->htmlHead( isFixedFont() ) );
2195 if (aHTML && (kasciistricmp(aMsgPart->subtypeStr(),
"html")==0)) {
2197 htmlWriter()->queue( aMsgPart->bodyToUnicode( overrideCodec() ) );
2198 mColorBar->setHtmlMode();
2200 const TQCString str = aMsgPart->bodyDecoded();
2201 ObjectTreeParser otp(
this );
2202 otp.writeBodyStr( str,
2203 overrideCodec() ? overrideCodec() : aMsgPart->codec(),
2204 message() ? message()->from() : TQString() );
2206 htmlWriter()->queue(
"</body></html>");
2207 htmlWriter()->flush();
2208 mMainWindow->setCaption(i18n(
"View Attachment: %1").arg(pname));
2209 }
else if (kasciistricmp(aMsgPart->typeStr(),
"image")==0 ||
2210 (kasciistricmp(aMsgPart->typeStr(),
"application")==0 &&
2211 kasciistricmp(aMsgPart->subtypeStr(),
"postscript")==0))
2213 if (aFileName.isEmpty())
return;
2215 TQImageIO *iio =
new TQImageIO();
2216 iio->setFileName(aFileName);
2218 TQImage img = iio->image();
2219 TQRect desk = TDEGlobalSettings::desktopGeometry(mMainWindow);
2222 if( img.width() < 50 )
2224 else if( img.width()+20 < desk.width() )
2225 width = img.width()+20;
2227 width = desk.width();
2228 if( img.height() < 50 )
2230 else if( img.height()+20 < desk.height() )
2231 height = img.height()+20;
2233 height = desk.height();
2234 mMainWindow->resize( width, height );
2237 htmlWriter()->begin( mCSSHelper->cssDefinitions( isFixedFont() ) );
2238 htmlWriter()->write( mCSSHelper->htmlHead( isFixedFont() ) );
2239 htmlWriter()->write(
"<img src=\"file:" +
2240 KURL::encode_string( aFileName ) +
2241 "\" border=\"0\">\n" 2242 "</body></html>\n" );
2243 htmlWriter()->end();
2244 setCaption( i18n(
"View Attachment: %1").arg( pname ) );
2248 htmlWriter()->begin( mCSSHelper->cssDefinitions( isFixedFont() ) );
2249 htmlWriter()->queue( mCSSHelper->htmlHead( isFixedFont() ) );
2250 htmlWriter()->queue(
"<pre>" );
2252 TQString str = aMsgPart->bodyDecoded();
2255 if( str.length() < (unsigned) aMsgPart->decodedSize() ) {
2256 str.prepend( i18n(
"[KMail: Attachment contains binary data. Trying to show first character.]",
2257 "[KMail: Attachment contains binary data. Trying to show first %n characters.]",
2258 str.length()) + TQChar(
'\n') );
2260 htmlWriter()->queue( TQStyleSheet::escape( str ) );
2261 htmlWriter()->queue(
"</pre>" );
2262 htmlWriter()->queue(
"</body></html>");
2263 htmlWriter()->flush();
2264 mMainWindow->setCaption(i18n(
"View Attachment: %1").arg(pname));
2273 partNode* node = mRootNode ? mRootNode->findId(
id ) : 0;
2276 mAtmCurrentName = name;
2277 if ( mAtmCurrentName.isEmpty() )
2278 mAtmCurrentName = tempFileUrlFromPartNode( node ).path();
2280 KMMessagePart& msgPart = node->msgPart();
2281 TQString pname = msgPart.fileName();
2282 if (pname.isEmpty()) pname=msgPart.name();
2283 if (pname.isEmpty()) pname=msgPart.contentDescription();
2284 if (pname.isEmpty()) pname=
"unnamed";
2286 if (kasciistricmp(msgPart.typeStr(),
"message")==0) {
2287 atmViewMsg( &msgPart,
id );
2288 }
else if ((kasciistricmp(msgPart.typeStr(),
"text")==0) &&
2289 (kasciistricmp(msgPart.subtypeStr(),
"x-vcard")==0)) {
2290 setMsgPart( &msgPart, htmlMail(), name, pname );
2292 KMReaderMainWin *win =
new KMReaderMainWin(&msgPart, htmlMail(),
2293 name, pname, overrideEncoding() );
2300 void KMReaderWin::openAttachment(
int id,
const TQString & name )
2302 mAtmCurrentName = name;
2305 TQString str, pname, cmd, fileName;
2307 partNode* node = mRootNode ? mRootNode->findId(
id ) : 0;
2309 kdWarning(5006) <<
"KMReaderWin::openAttachment - could not find node " <<
id << endl;
2312 if ( mAtmCurrentName.isEmpty() )
2313 mAtmCurrentName = tempFileUrlFromPartNode( node ).path();
2315 KMMessagePart& msgPart = node->msgPart();
2316 if (kasciistricmp(msgPart.typeStr(),
"message")==0)
2318 atmViewMsg( &msgPart,
id );
2322 TQCString contentTypeStr( msgPart.typeStr() +
'/' + msgPart.subtypeStr() );
2323 KPIM::kAsciiToLower( contentTypeStr.data() );
2325 if ( qstrcmp( contentTypeStr,
"text/x-vcard" ) == 0 ) {
2326 showVCard( &msgPart );
2331 KMimeType::Ptr mimetype;
2333 mimetype = KMimeType::mimeType( TQString::fromLatin1( contentTypeStr ) );
2334 if ( mimetype->name() ==
"application/octet-stream" ) {
2336 mimetype = KMimeType::findByPath( name, 0,
true );
2338 if ( ( mimetype->name() ==
"application/octet-stream" )
2339 && msgPart.isComplete() ) {
2342 mimetype = KMimeType::findByFileContent( name );
2345 KService::Ptr offer =
2346 KServiceTypeProfile::preferredService( mimetype->name(),
"Application" );
2349 TQString filenameText = msgPart.fileName();
2350 if ( filenameText.isEmpty() )
2351 filenameText = msgPart.name();
2353 open_text = i18n(
"&Open with '%1'").arg( offer->name() );
2355 open_text = i18n(
"&Open With...");
2357 const TQString text = i18n(
"Open attachment '%1'?\n" 2358 "Note that opening an attachment may compromise " 2359 "your system's security.")
2360 .arg( filenameText );
2361 const int choice = KMessageBox::questionYesNoCancel(
this, text,
2362 i18n(
"Open Attachment?"), KStdGuiItem::saveAs(), open_text,
2363 TQString::fromLatin1(
"askSave") + mimetype->name() );
2365 if( choice == KMessageBox::Yes ) {
2367 KMHandleAttachmentCommand* command =
new KMHandleAttachmentCommand( node,
2368 message(), mAtmCurrent, mAtmCurrentName, KMHandleAttachmentCommand::Save,
2370 connect( command, TQT_SIGNAL( showAttachment(
int,
const TQString& ) ),
2371 TQT_TQOBJECT(
this), TQT_SLOT( slotAtmView(
int,
const TQString& ) ) );
2374 else if( choice == KMessageBox::No ) {
2375 KMHandleAttachmentCommand::AttachmentAction action = ( offer ?
2376 KMHandleAttachmentCommand::Open : KMHandleAttachmentCommand::OpenWith );
2378 KMHandleAttachmentCommand* command =
new KMHandleAttachmentCommand( node,
2379 message(), mAtmCurrent, mAtmCurrentName, action, offer,
this );
2380 connect( command, TQT_SIGNAL( showAttachment(
int,
const TQString& ) ),
2381 TQT_TQOBJECT(
this), TQT_SLOT( slotAtmView(
int,
const TQString& ) ) );
2384 kdDebug(5006) <<
"Canceled opening attachment" << endl;
2391 static_cast<TQScrollView *
>(mViewer->widget())->scrollBy(0, -10);
2396 void KMReaderWin::slotScrollDown()
2398 static_cast<TQScrollView *
>(mViewer->widget())->scrollBy(0, 10);
2401 bool KMReaderWin::atBottom()
const 2403 const TQScrollView *view =
static_cast<const TQScrollView *
>(mViewer->widget());
2404 return view->contentsY() + view->visibleHeight() >= view->contentsHeight();
2408 void KMReaderWin::slotJumpDown()
2410 TQScrollView *view =
static_cast<TQScrollView *
>(mViewer->widget());
2411 int offs = (view->clipper()->height() < 30) ? view->clipper()->height() : 30;
2412 view->scrollBy( 0, view->clipper()->height() - offs );
2416 void KMReaderWin::slotScrollPrior()
2418 static_cast<TQScrollView *
>(mViewer->widget())->scrollBy(0, -(
int)(height()*0.8));
2423 void KMReaderWin::slotScrollNext()
2425 static_cast<TQScrollView *
>(mViewer->widget())->scrollBy(0, (
int)(height()*0.8));
2429 void KMReaderWin::slotDocumentChanged()
2436 void KMReaderWin::slotTextSelected(
bool)
2438 TQString temp = mViewer->selectedText();
2439 kapp->clipboard()->setText(temp);
2445 mViewer->selectAll();
2451 TQString temp = mViewer->selectedText();
2457 void KMReaderWin::slotDocumentDone()
2464 void KMReaderWin::setHtmlOverride(
bool override)
2466 mHtmlOverride =
override;
2468 message()->setDecodeHTML(htmlMail());
2473 void KMReaderWin::setHtmlLoadExtOverride(
bool override)
2475 mHtmlLoadExtOverride =
override;
2484 return ((mHtmlMail && !mHtmlOverride) || (!mHtmlMail && mHtmlOverride));
2491 return ((mHtmlLoadExternal && !mHtmlLoadExtOverride) ||
2492 (!mHtmlLoadExternal && mHtmlLoadExtOverride));
2499 const TQScrollView * scrollview =
static_cast<TQScrollView *
>( mViewer->widget() );
2500 mSavedRelativePosition =
2501 static_cast<float>( scrollview->contentsY() ) / scrollview->contentsHeight();
2510 setMsg( msg, force,
true );
2518 KMFolder*& folder = aFolder ? *aFolder : tmpFolder;
2527 message = folder->
getMsg( index );
2529 kdWarning(5006) <<
"Attempt to reference invalid serial number " << mLastSerNum <<
"\n" << endl;
2538 void KMReaderWin::slotUrlClicked()
2540 KMMainWidget *mainWidget =
dynamic_cast<KMMainWidget*
>(mMainWindow);
2542 if ( message() && message()->parent() ) {
2543 identity = message()->parent()->identity();
2546 KMCommand *command =
new KMUrlClickedCommand( mClickedUrl, identity,
this,
2547 false, mainWidget );
2552 void KMReaderWin::slotMailtoCompose()
2554 KMCommand *command =
new KMMailtoComposeCommand( mClickedUrl, message() );
2559 void KMReaderWin::slotMailtoForward()
2561 KMCommand *command =
new KMMailtoForwardCommand( mMainWindow, mClickedUrl,
2567 void KMReaderWin::slotMailtoAddAddrBook()
2569 KMCommand *command =
new KMMailtoAddAddrBookCommand( mClickedUrl,
2575 void KMReaderWin::slotMailtoOpenAddrBook()
2577 KMCommand *command =
new KMMailtoOpenAddrBookCommand( mClickedUrl,
2587 KMCommand *command =
2588 new KMUrlCopyCommand( mClickedUrl,
2589 dynamic_cast<KMMainWidget*>( mMainWindow ) );
2596 if ( !url.isEmpty() )
2598 KMCommand *command =
new KMUrlOpenCommand( mClickedUrl,
this );
2603 void KMReaderWin::slotAddBookmarks()
2605 KMCommand *command =
new KMAddBookmarksCommand( mClickedUrl,
this );
2612 KMCommand *command =
new KMUrlSaveCommand( mClickedUrl, mMainWindow );
2619 KMCommand *command =
new KMMailtoReplyCommand( mMainWindow, mClickedUrl,
2620 message(), copyText() );
2626 return mRootNode ? mRootNode->findId( msgPartFromUrl( url ) ) : 0 ;
2629 partNode * KMReaderWin::partNodeForId(
int id ) {
2630 return mRootNode ? mRootNode->findId(
id ) : 0 ;
2634 KURL KMReaderWin::tempFileUrlFromPartNode(
const partNode * node )
2636 if (!node)
return KURL();
2637 TQStringList::const_iterator it = mTempFiles.begin();
2638 TQStringList::const_iterator end = mTempFiles.end();
2640 while ( it != end ) {
2641 TQString path = *it;
2643 uint right = path.findRev(
'/');
2644 uint left = path.findRev(
'.', right);
2647 int res = path.mid(left + 1, right - left - 1).toInt(&ok);
2648 if ( res == node->nodeId() )
2649 return KURL( path );
2655 void KMReaderWin::slotSaveAttachments()
2658 KMSaveAttachmentsCommand *saveCommand =
new KMSaveAttachmentsCommand( mMainWindow,
2660 saveCommand->start();
2664 void KMReaderWin::saveAttachment(
const KURL &tempFileName )
2666 mAtmCurrent = msgPartFromUrl( tempFileName );
2667 mAtmCurrentName = mClickedUrl.path();
2668 slotHandleAttachment( KMHandleAttachmentCommand::Save );
2672 void KMReaderWin::slotSaveMsg()
2674 KMSaveMsgCommand *saveCommand =
new KMSaveMsgCommand( mMainWindow, message() );
2676 if (saveCommand->url().isEmpty())
2679 saveCommand->start();
2684 KMCommand *command =
new KMIMChatCommand( mClickedUrl, message() );
2689 static TQString linkForNode(
const DOM::Node &node )
2692 if ( node.isNull() )
2695 const DOM::NamedNodeMap attributes = node.attributes();
2696 if ( !attributes.isNull() ) {
2697 const DOM::Node href = attributes.getNamedItem( DOM::DOMString(
"href" ) );
2698 if ( !href.isNull() ) {
2699 return href.nodeValue().string();
2702 if ( !node.parentNode().isNull() ) {
2703 return linkForNode( node.parentNode() );
2707 }
catch ( DOM::DOMException &e ) {
2708 kdWarning(5006) <<
"Got an exception when trying to determine link under cursor!" << endl;
2716 if ( e->type() == TQEvent::MouseButtonPress ) {
2717 TQMouseEvent* me = TQT_TQMOUSEEVENT(e);
2718 if ( me->button() == Qt::LeftButton && ( me->state() & ShiftButton ) ) {
2720 URLHandlerManager::instance()->handleShiftClick( mHoveredUrl,
this );
2724 if ( me->button() == Qt::LeftButton ) {
2727 const DOM::Node nodeUnderMouse = mViewer->nodeUnderMouse();
2728 if ( !nodeUnderMouse.isNull() ) {
2729 const DOM::NamedNodeMap attributes = nodeUnderMouse.attributes();
2730 if ( !attributes.isNull() ) {
2731 const DOM::Node src = attributes.getNamedItem( DOM::DOMString(
"src" ) );
2732 if ( !src.isNull() ) {
2733 imagePath = src.nodeValue().string();
2738 mCanStartDrag = URLHandlerManager::instance()->willHandleDrag( mHoveredUrl, imagePath,
this );
2739 mLastClickPosition = me->pos();
2740 mLastClickImagePath = imagePath;
2744 if ( e->type() == TQEvent::MouseButtonRelease ) {
2745 mCanStartDrag =
false;
2748 if ( e->type() == TQEvent::MouseMove ) {
2749 TQMouseEvent* me = TQT_TQMOUSEEVENT( e );
2753 slotUrlOn( linkForNode( mViewer->nodeUnderMouse() ) );
2755 if ( ( mLastClickPosition - me->pos() ).manhattanLength() > TDEGlobalSettings::dndEventDelay() ) {
2756 if ( mCanStartDrag && ( !( mHoveredUrl.isEmpty() && mLastClickImagePath.isEmpty() ) ) ) {
2757 if ( URLHandlerManager::instance()->handleDrag( mHoveredUrl, mLastClickImagePath,
this ) ) {
2758 mCanStartDrag =
false;
2759 slotUrlOn( TQString() );
2764 TQMouseEvent mouseEvent( TQEvent::MouseButtonRelease, me->pos(), Qt::NoButton, Qt::NoButton );
2765 TQT_TQOBJECT( mViewer->view() )->eventFilter( mViewer->view()->viewport(),
2779 Q_ASSERT( msg && nodeId );
2781 if ( mSerNumOfOriginalMessage != 0 ) {
2785 if ( folder && index != -1 )
2786 *msg = folder->
getMsg( index );
2789 kdWarning( 5006 ) <<
"Unable to find the original message, aborting attachment deletion!" << endl;
2793 *nodeId = node->nodeId() + mNodeIdOffset;
2796 *nodeId = node->nodeId();
2801 void KMReaderWin::slotDeleteAttachment(partNode * node)
2803 if ( KMessageBox::warningContinueCancel(
this,
2804 i18n(
"Deleting an attachment might invalidate any digital signature on this message."),
2805 i18n(
"Delete Attachment"), KStdGuiItem::del(),
"DeleteAttachmentSignatureWarning" )
2806 != KMessageBox::Continue ) {
2812 fillCommandInfo( node, &msg, &nodeId );
2813 if ( msg && nodeId != -1 ) {
2814 KMDeleteAttachmentCommand* command =
new KMDeleteAttachmentCommand( nodeId, msg,
this );
2816 connect( command, TQT_SIGNAL( completed( KMCommand * ) ),
2817 TQT_TQOBJECT(
this), TQT_SLOT( updateReaderWin() ) );
2818 connect( command, TQT_SIGNAL( completed( KMCommand * ) ),
2819 TQT_TQOBJECT(
this), TQT_SLOT( disconnectMsgAdded() ) );
2827 connect( headers, TQT_SIGNAL( msgAddedToListView( TQListViewItem* ) ),
2828 TQT_TQOBJECT(
this), TQT_SLOT( msgAdded( TQListViewItem* ) ) );
2832 if ( mSerNumOfOriginalMessage != 0 && message() ) {
2833 message()->deleteBodyPart( node->nodeId() );
2838 void KMReaderWin::msgAdded( TQListViewItem *item )
2843 disconnectMsgAdded();
2845 headers->setCurrentItem( item );
2846 headers->clearSelection();
2853 disconnect( headers, TQT_SIGNAL( msgAddedToListView( TQListViewItem* ) ),
2854 TQT_TQOBJECT(
this), TQT_SLOT( msgAdded( TQListViewItem* ) ) );
2857 void KMReaderWin::slotEditAttachment(partNode * node)
2859 if ( KMessageBox::warningContinueCancel(
this,
2860 i18n(
"Modifying an attachment might invalidate any digital signature on this message."),
2861 i18n(
"Edit Attachment"), KGuiItem( i18n(
"Edit"),
"edit" ),
"EditAttachmentSignatureWarning" )
2862 != KMessageBox::Continue ) {
2868 fillCommandInfo( node, &msg, &nodeId );
2869 if ( msg && nodeId != -1 ) {
2870 KMEditAttachmentCommand* command =
new KMEditAttachmentCommand( nodeId, msg,
this );
2877 KMail::CSSHelper* KMReaderWin::cssHelper()
2884 if ( !GlobalSettings::self()->alwaysDecrypt() )
2885 return mDecrytMessageOverwrite;
2891 DOM::Document doc = mViewer->htmlDocument();
2894 mViewer->gotoAnchor( TQString::fromLatin1(
"att%1" ).arg( node->nodeId() ) );
2897 const partNode *root = node->topLevelParent();
2898 for (
int i = 0; i <= root->totalChildCount() + 1; i++ ) {
2899 DOM::Element attachmentDiv = doc.getElementById( TQString(
"attachmentDiv%1" ).arg( i + 1 ) );
2900 if ( !attachmentDiv.isNull() )
2901 attachmentDiv.removeAttribute(
"style" );
2905 if ( node->isDisplayedHidden() )
2911 DOM::Element attachmentDiv = doc.getElementById( TQString(
"attachmentDiv%1" ).arg( node->nodeId() ) );
2912 if ( attachmentDiv.isNull() ) {
2913 kdWarning( 5006 ) <<
"Could not find attachment div for attachment " << node->nodeId() << endl;
2917 attachmentDiv.setAttribute(
"style", TQString(
"border:2px solid %1" )
2918 .arg( cssHelper()->pgpWarnColor().name() ) );
2922 doc.updateRendering();
2925 void KMReaderWin::injectAttachments()
2929 DOM::Document doc = mViewer->htmlDocument();
2930 DOM::Element injectionPoint = doc.getElementById(
"attachmentInjectionPoint" );
2931 if ( injectionPoint.isNull() )
2934 TQString imgpath( locate(
"data",
"kmail/pics/") );
2935 TQString visibility;
2938 if( !showAttachmentQuicklist() ) {
2939 urlHandle.append(
"kmail:showAttachmentQuicklist" );
2940 imgSrc.append(
"attachmentQuicklistClosed.png" );
2942 urlHandle.append(
"kmail:hideAttachmentQuicklist" );
2943 imgSrc.append(
"attachmentQuicklistOpened.png" );
2946 TQString html = renderAttachments( mRootNode, TQApplication::palette().active().background() );
2947 if ( html.isEmpty() )
2951 if ( headerStyle() == HeaderStyle::fancy() ) {
2952 link +=
"<div style=\"text-align: left;\"><a href=\"" + urlHandle +
"\"><img src=\"" +
2953 imgpath + imgSrc +
"\"/></a></div>";
2954 html.prepend( link );
2955 html.prepend( TQString::fromLatin1(
"<div style=\"float:left;\">%1 </div>" ).
2956 arg( i18n(
"Attachments:" ) ) );
2958 link +=
"<div style=\"text-align: right;\"><a href=\"" + urlHandle +
"\"><img src=\"" +
2959 imgpath + imgSrc +
"\"/></a></div>";
2960 html.prepend( link );
2963 assert( injectionPoint.tagName() ==
"div" );
2964 static_cast<DOM::HTMLElement
>( injectionPoint ).setInnerHTML( html );
2967 static TQColor nextColor(
const TQColor & c )
2970 c.hsv( &h, &s, &v );
2971 return TQColor( (h + 50) % 360, TQMAX(s, 64), v, TQColor::Hsv );
2974 TQString KMReaderWin::renderAttachments(partNode * node,
const TQColor &bgColor )
2980 if ( node->firstChild() ) {
2981 TQString subHtml = renderAttachments( node->firstChild(), nextColor( bgColor ) );
2982 if ( !subHtml.isEmpty() ) {
2984 TQString visibility;
2985 if ( !showAttachmentQuicklist() ) {
2986 visibility.append(
"display:none;" );
2990 if ( node != mRootNode || headerStyle() != HeaderStyle::enterprise() )
2991 margin =
"padding:2px; margin:2px; ";
2992 TQString align =
"left";
2993 if ( headerStyle() == HeaderStyle::enterprise() )
2995 if ( node->msgPart().typeStr().lower() ==
"message" || node == mRootNode )
2996 html += TQString::fromLatin1(
"<div style=\"background:%1; %2" 2997 "vertical-align:middle; float:%3; %4\">").arg( bgColor.name() ).arg( margin )
2998 .arg( align ).arg( visibility );
3000 if ( node->msgPart().typeStr().lower() ==
"message" || node == mRootNode )
3004 partNode::AttachmentDisplayInfo info = node->attachmentDisplayInfo();
3005 if ( info.displayInHeader ) {
3006 html +=
"<div style=\"float:left;\">";
3007 html += TQString::fromLatin1(
"<span style=\"white-space:nowrap; border-width: 0px; border-left-width: 5px; border-color: %1; 2px; border-left-style: solid;\">" ).arg( bgColor.name() );
3008 TQString fileName = writeMessagePartToTempFile( &node->msgPart(), node->nodeId() );
3009 TQString href = node->asHREF(
"header" );
3010 html += TQString::fromLatin1(
"<a href=\"" ) + href +
3011 TQString::fromLatin1(
"\">" );
3012 html +=
"<img style=\"vertical-align:middle;\" src=\"" + info.icon +
"\"/> ";
3013 if ( headerStyle() == HeaderStyle::enterprise() ) {
3014 TQFont bodyFont = mCSSHelper->bodyFont( isFixedFont() );
3015 TQFontMetrics fm( bodyFont );
3016 html += KStringHandler::rPixelSqueeze( info.label, fm, 140 );
3017 }
else if ( headerStyle() == HeaderStyle::fancy() ) {
3018 TQFont bodyFont = mCSSHelper->bodyFont( isFixedFont() );
3019 TQFontMetrics fm( bodyFont );
3020 html += KStringHandler::rPixelSqueeze( info.label, fm, 640 );
3024 html +=
"</a></span></div> ";
3028 html += renderAttachments( node->nextSibling(), nextColor ( bgColor ) );
3034 void KMReaderWin::setBodyPartMemento(
const partNode * node,
const TQCString & which,
BodyPartMemento * memento )
3036 const TQCString index = node->path() +
':' + which.lower();
3038 const std::map<TQCString,BodyPartMemento*>::iterator it = mBodyPartMementoMap.lower_bound( index );
3039 if ( it != mBodyPartMementoMap.end() && it->first == index ) {
3041 if ( memento && memento == it->second )
3047 it->second = memento;
3050 mBodyPartMementoMap.erase( it );
3055 mBodyPartMementoMap.insert( it, std::make_pair( index, memento ) );
3063 BodyPartMemento * KMReaderWin::bodyPartMemento(
const partNode * node,
const TQCString & which )
const 3065 const TQCString index = node->path() +
':' + which.lower();
3066 const std::map<TQCString,BodyPartMemento*>::const_iterator it = mBodyPartMementoMap.find( index );
3067 if ( it == mBodyPartMementoMap.end() ) {
3081 void KMReaderWin::clearBodyPartMementos()
3083 for ( std::map<TQCString,BodyPartMemento*>::const_iterator it = mBodyPartMementoMap.begin(), end = mBodyPartMementoMap.end() ; it != end ; ++it )
3088 detach_and_delete( it->second,
this );
3090 mBodyPartMementoMap.clear();
3093 #include "kmreaderwin.moc" void slotFindNext()
The user selected "Find Next" from the menu.
void setSignatureState(const KMMsgSignatureState, int idx=-1)
Set signature status of the message.
KMMessage * createMDN(KMime::MDN::ActionMode a, KMime::MDN::DispositionType d, bool allowGUI=false, TQValueList< KMime::MDN::DispositionModifier > m=TQValueList< KMime::MDN::DispositionModifier >())
Create a new message that is a MDN for this message, filling all required fields with proper values...
partNode * partNodeFromUrl(const KURL &url)
Returns message part from given URL or null if invalid.
TQString subject() const
Get or set the 'Subject' header field.
static int msgPartFromUrl(const KURL &url)
Returns id of message part from given URL or -1 if invalid.
const TQTextCodec * overrideCodec() const
Get codec corresponding to the currently selected override character encoding.
void slotFind()
The user selected "Find" from the menu.
virtual void parseMsg(KMMessage *msg)
Parse given message and add it's contents to the reader window.
TQString msgId() const
Get or set the 'Message-Id' header field.
This class implements a "reader window", that is a window used for reading or viewing messages...
void styleChange(TQStyle &oldStyle)
reimplemented in order to update the frame width in case of a changed GUI style
void slotUrlOpen(const KURL &url, const KParts::URLArgs &args)
An URL has been activate with a click.
bool isTemplates()
Returns true if this folder is the templates folder of the local account, or is configured to be the ...
bool isSent()
Returns true if this folder is the sent-mail box of the local account, or is configured to be the sen...
void slotUrlSave()
Save the page to a file.
bool readyToShow() const
Return if the message is ready to be shown.
static KMKernel * self()
normal control stuff
void setBody(const TQCString &aStr)
Set the message body.
static const KMMsgDict * instance()
Access the globally unique MessageDict.
void setNeedsAssembly()
tell the message that internal data were changed (must be called after directly modifying message str...
void setStyleDependantFrameWidth()
Set the width of the frame to a reasonable value for the current GUI style.
An interface to HTML sinks.
void slotScrollUp()
HTML Widget scrollbar and layout handling.
void showHideMimeTree(bool isPlainTextTopLevel)
Show or hide the Mime Tree Viewer if configuration is set to smart mode.
bool htmlMail()
Is html mail to be supported? Takes into account override.
void setOverrideEncoding(const TQString &encoding)
Set the override character encoding.
bool isTrash()
Returns true if this folder is configured as a trash folder, locally or for one of the accounts...
bool isOutbox()
Returns true only if this is the outbox for outgoing mail.
size_t crlf2lf(char *str, const size_t strLen)
Convert all sequences of "\r\n" (carriage return followed by a line feed) to a single "\n" (line feed...
DwHeaders & headers() const
get the DwHeaders (make sure to call setNeedsAssembly() function after directly modyfying internal da...
void selectAll()
Select message body.
void setMsgSerNum(unsigned long newMsgSerNum=0)
Sets the message serial number.
void getLocation(unsigned long key, KMFolder **retFolder, int *retIndex) const
Returns the folder the message represented by the serial number key is in and the index in that folde...
void slotIMChat()
start IM Chat with addressee
void slotUrlCopy()
Copy URL in mUrlCurrent to clipboard.
virtual void closeEvent(TQCloseEvent *)
Some necessary event handling.
TQString createTempDir(const TQString ¶m=TQString())
Creates a temporary dir for saving attachments, etc.
bool decryptMessage() const
Returns wether the message should be decryted.
void fillCommandInfo(partNode *node, KMMessage **msg, int *nodeId)
Find the node ID and the message of the attachment that should be edited or deleted.
void setReadyToShow(bool v)
Set if the message is ready to be shown.
bool eventFilter(TQObject *obj, TQEvent *ev)
Event filter.
Singleton to manage the list of URLHandlers.
void displayBusyPage()
Display the 'please wait' page instead of a message.
TQString copyText()
Return selected text.
void setHeaderStyleAndStrategy(const KMail::HeaderStyle *style, const KMail::HeaderStrategy *strategy)
Set the header style and strategy.
void showVCard(KMMessagePart *msgPart)
show window containing infos about a vCard.
virtual void printMsg(void)
Print current message.
KMMessage * message(KMFolder **folder=0) const
Returns the current message or 0 if none.
bool isDrafts()
Returns true if this folder is the drafts box of the local account, or is configured to be the drafts...
void displayOfflinePage()
Display the 'we are currently in offline mode' page instead of a message.
bool isComplete() const
Return true if the complete message is available without referring to the backing store...
void disconnectMsgAdded()
Helper functions used to change message selection in the message list after deleting an attachment...
void saveRelativePosition()
Saves the relative position of the scroll view.
size_t msgSize() const
Get/set size of message in the folder including the whole header in bytes.
virtual void setMsg(KMMessage *msg, bool force=false, bool updateOnly=false)
Set the message that shall be shown.
static TQString newFeaturesMD5()
Returns the MD5 hash for the list of new features.
void setUnencryptedMsg(KMMessage *unencrypted)
Specifies an unencrypted copy of this message to be stored in a separate member variable to allow sav...
interface of classes that implement status for BodyPartFormatters.
void displayMessage()
Feeds the HTML viewer with the contents of the given message.
TQCString contentTransferEncodingStr() const
Get or set the 'Content-Transfer-Encoding' header field The member functions that involve enumerated ...
TQString writeMsgHeader(KMMessage *aMsg, partNode *vCardNode=0, bool topLevel=false)
Creates a nice mail header depending on the current selected header style.
void updateReaderWin()
Refresh the reader window.
void setDecodeHTML(bool aDecodeHTML)
Allow decoding of HTML for quoting.
void slotUrlOn(const TQString &url)
The mouse has moved on or off an URL.
void slotMailtoReply()
Operations on mailto: URLs.
virtual bool event(TQEvent *e)
Watch for palette changes.
void slotUrlPopup(const TQString &, const TQPoint &mousePos)
The user presses the right mouse button on an URL.
KMMessage * getMsg(int idx)
Read message at given index.
void slotAtmView(int id, const TQString &name)
Some attachment operations.
sets a cursor and makes sure it's restored on destruction Create a KCursorSaver object when you want ...
DwBodyPart * lastUpdatedPart()
Returns the last DwBodyPart that was updated.
void slotToggleFixedFont()
The user toggled the "Fixed Font" flag from the view menu.
void displaySplashPage(const TQString &info)
Display a generic HTML splash page instead of a message.
virtual void removeTempFiles()
Cleanup the attachment temp files.
An interface for HTML sinks.
void enableMsgDisplay()
Enable the displaying of messages again after an URL was displayed.
bool htmlLoadExternal()
Is loading ext.
void displayAboutPage()
Display the about page instead of a message.
KMMsgSignatureState signatureState() const
Signature status of the message.
The HTML statusbar widget for use with the reader.
virtual void initHtmlWidget(void)
HTML initialization.
static void readConfig()
Reads config settings from group "KMMessage" and sets all internal variables (e.g.
void setMsgPart(KMMessagePart *aMsgPart, bool aHTML, const TQString &aFileName, const TQString &pname)
Instead of settings a message to be shown sets a message part to be shown.
int pointsToPixel(int pointSize) const
Calculate the pixel size.
void atmViewMsg(KMMessagePart *msgPart, int nodeId)
View message part of type message/RFC822 in extra viewer window.
TQString writeMessagePartToTempFile(KMMessagePart *msgPart, int partNumber)
Writes the given message part to a temporary file and returns the name of this file or TQString() if ...
void update(KMail::Interface::Observable *)
void setOverrideCodec(const TQTextCodec *codec)
Set the charset the user selected for the message to display.
void slotCopySelectedText()
Copy the selected text to the clipboard.
void setOriginalMsg(unsigned long serNumOfOriginalMessage, int nodeIdOffset)
This should be called when setting a message that was constructed from another message, which is the case when viewing encapsulated messages in the seperate reader window.
virtual Observable * asObservable()=0
If your BodyPartMemento implementation also implements the KMail::Observable interface, simply implement these as return this;, else as return 0;.
void writeConfig(bool withSync=true) const
Write settings to app's config file.
void setEncryptionState(const KMMsgEncryptionState, int idx=-1)
Set encryption status of the message.
void clearCache()
Force update even if message is the same.
A HtmlWriter that dispatches all calls to a list of other HtmlWriters.
void scrollToAttachment(const partNode *node)
Scrolls to the given attachment and marks it with a yellow border.
KMMainWidget * getKMMainWidget()
Get first mainwidget.
void readConfig()
Read settings from app's config file.