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()
784 message()->detach(
this );
786 clearBodyPartMementos();
787 delete mHtmlWriter; mHtmlWriter = 0;
789 if (mAutoDelete)
delete message();
790 delete mRootNode; mRootNode = 0;
796 void KMReaderWin::slotMessageArrived(
KMMessage *msg )
798 if (msg && ((KMMsgBase*)msg)->isMessage()) {
799 if ( msg->getMsgSerNum() == mWaitingForSerNum ) {
825 kdDebug(5006) <<
"KMReaderWin::update - no updated part" << endl;
828 partNode* node = mRootNode->findNodeForDwPart( msg->
lastUpdatedPart() );
830 kdDebug(5006) <<
"KMReaderWin::update - can't find node for part" << endl;
837 ::chmod( TQFile::encodeName( mAtmCurrentName ), S_IRWXU );
838 TQByteArray data = node->msgPart().bodyDecodedBinary();
839 size_t size = data.size();
840 if ( node->msgPart().type() == DwMime::kTypeText && size) {
843 KPIM::kBytesToFile( data.data(), size, mAtmCurrentName,
false,
false, false );
844 ::chmod( TQFile::encodeName( mAtmCurrentName ), S_IRUSR );
852 for (TQStringList::Iterator it = mTempFiles.begin(); it != mTempFiles.end();
858 for (TQStringList::Iterator it = mTempDirs.begin(); it != mTempDirs.end();
861 TQDir(*it).rmdir(*it);
870 if (e->type() == TQEvent::ApplicationPaletteChange)
873 mCSSHelper =
new KMail::CSSHelper( TQPaintDeviceMetrics( mViewer->view() ) );
875 message()->readConfig();
879 return TQWidget::event(e);
886 const TDEConfigGroup mdnGroup( KMKernel::config(),
"MDN" );
887 TDEConfigGroup reader( KMKernel::config(),
"Reader" );
890 mCSSHelper =
new KMail::CSSHelper( TQPaintDeviceMetrics( mViewer->view() ) );
892 mNoMDNsWhenEncrypted = mdnGroup.readBoolEntry(
"not-send-when-encrypted",
true );
894 mUseFixedFont = reader.readBoolEntry(
"useFixedFont",
false );
895 if ( mToggleFixFontAction )
896 mToggleFixFontAction->setChecked( mUseFixedFont );
898 mHtmlMail = reader.readBoolEntry(
"htmlMail",
false );
899 mHtmlLoadExternal = reader.readBoolEntry(
"htmlLoadExternal",
false );
901 setHeaderStyleAndStrategy( HeaderStyle::create( reader.readEntry(
"header-style",
"fancy" ) ),
902 HeaderStrategy::create( reader.readEntry(
"header-set-displayed",
"rich" ) ) );
903 TDERadioAction *raction = actionForHeaderStyle( headerStyle(), headerStrategy() );
905 raction->setChecked(
true );
907 setAttachmentStrategy( AttachmentStrategy::create( reader.readEntry(
"attachment-strategy",
"smart" ) ) );
908 raction = actionForAttachmentStrategy( attachmentStrategy() );
910 raction->setChecked(
true );
914 mShowColorbar = reader.readBoolEntry(
"showColorbar", Kpgp::Module::getKpgp()->usePGP() );
918 reader.writeEntry(
"showColorbar", mShowColorbar );
920 mMimeTreeAtBottom = reader.readEntry(
"MimeTreeLocation",
"bottom" ) !=
"top";
921 const TQString s = reader.readEntry(
"MimeTreeMode",
"smart" );
924 else if ( s ==
"always" )
929 const int mimeH = reader.readNumEntry(
"MimePaneHeight", 100 );
930 const int messageH = reader.readNumEntry(
"MessagePaneHeight", 180 );
931 mSplitterSizes.clear();
932 if ( mMimeTreeAtBottom )
933 mSplitterSizes << messageH << mimeH;
935 mSplitterSizes << mimeH << messageH;
939 readGlobalOverrideCodec();
947 void KMReaderWin::adjustLayout() {
948 if ( mMimeTreeAtBottom )
949 mSplitter->moveToLast( mMimePartTree );
951 mSplitter->moveToFirst( mMimePartTree );
952 mSplitter->setSizes( mSplitterSizes );
954 if ( mMimeTreeMode == 2 && mMsgDisplay )
955 mMimePartTree->show();
957 mMimePartTree->hide();
959 if ( mShowColorbar && mMsgDisplay )
966 void KMReaderWin::saveSplitterSizes( TDEConfigBase & c )
const {
967 if ( !mSplitter || !mMimePartTree )
969 if ( mMimePartTree->isHidden() )
972 c.writeEntry(
"MimePaneHeight", mSplitter->sizes()[ mMimeTreeAtBottom ? 1 : 0 ] );
973 c.writeEntry(
"MessagePaneHeight", mSplitter->sizes()[ mMimeTreeAtBottom ? 0 : 1 ] );
978 TDEConfigGroup reader( KMKernel::config(),
"Reader" );
980 reader.writeEntry(
"useFixedFont", mUseFixedFont );
982 reader.writeEntry(
"header-style", headerStyle()->name() );
983 if ( headerStrategy() )
984 reader.writeEntry(
"header-set-displayed", headerStrategy()->name() );
985 if ( attachmentStrategy() )
986 reader.writeEntry(
"attachment-strategy", attachmentStrategy()->name() );
988 saveSplitterSizes( reader );
991 kmkernel->slotRequestConfigSync();
997 mViewer->widget()->setFocusPolicy(TQ_WheelFocus);
999 mViewer->setPluginsEnabled(
false);
1000 mViewer->setJScriptEnabled(
false);
1001 mViewer->setJavaEnabled(
false);
1002 mViewer->setMetaRefreshEnabled(
false);
1003 mViewer->setURLCursor(KCursor::handCursor());
1005 mViewer->view()->setLineWidth(0);
1007 mViewer->view()->viewport()->installEventFilter(
this );
1009 if ( !htmlWriter() )
1010 #ifdef KMAIL_READER_HTML_DEBUG 1011 mHtmlWriter =
new TeeHtmlWriter(
new FileHtmlWriter( TQString() ),
1012 new KHtmlPartHtmlWriter( mViewer, 0 ) );
1014 mHtmlWriter =
new KHtmlPartHtmlWriter( mViewer, 0 );
1017 connect(mViewer->browserExtension(),
1018 TQT_SIGNAL(openURLRequest(
const KURL &,
const KParts::URLArgs &)),
this,
1019 TQT_SLOT(slotUrlOpen(
const KURL &)));
1020 connect(mViewer->browserExtension(),
1021 TQT_SIGNAL(createNewWindow(
const KURL &,
const KParts::URLArgs &)),
this,
1022 TQT_SLOT(slotUrlOpen(
const KURL &)));
1023 connect(mViewer,TQT_SIGNAL(popupMenu(
const TQString &,
const TQPoint &)),
1024 TQT_SLOT(slotUrlPopup(
const TQString &,
const TQPoint &)));
1025 connect( kmkernel->imProxy(), TQT_SIGNAL( sigContactPresenceChanged(
const TQString & ) ),
1026 TQT_TQOBJECT(
this), TQT_SLOT( contactStatusChanged(
const TQString & ) ) );
1027 connect( kmkernel->imProxy(), TQT_SIGNAL( sigPresenceInfoExpired() ),
1028 TQT_TQOBJECT(
this), TQT_SLOT( updateReaderWin() ) );
1031 void KMReaderWin::contactStatusChanged(
const TQString &uid)
1035 DOM::NodeList presenceNodes = mViewer->htmlDocument()
1036 .getElementsByName( DOM::DOMString( TQString::fromLatin1(
"presence-") + uid ) );
1037 for (
unsigned int i = 0; i < presenceNodes.length(); ++i ) {
1038 DOM::Node n = presenceNodes.item( i );
1039 kdDebug( 5006 ) <<
"name is " << n.nodeName().string() << endl;
1040 kdDebug( 5006 ) <<
"value of content was " << n.firstChild().nodeValue().string() << endl;
1041 TQString newPresence = kmkernel->imProxy()->presenceString( uid );
1042 if ( newPresence.isNull() )
1043 newPresence = TQString::fromLatin1(
"ENOIMRUNNING" );
1044 n.firstChild().setNodeValue( newPresence );
1050 void KMReaderWin::setAttachmentStrategy(
const AttachmentStrategy * strategy ) {
1051 mAttachmentStrategy = strategy ? strategy : AttachmentStrategy::smart();
1056 const HeaderStrategy * strategy ) {
1057 mHeaderStyle = style ? style : HeaderStyle::fancy();
1058 mHeaderStrategy = strategy ? strategy : HeaderStrategy::rich();
1059 if ( mHeaderOnlyAttachmentsAction ) {
1060 const bool styleHasAttachmentQuickList = mHeaderStyle == HeaderStyle::fancy() ||
1061 mHeaderStyle == HeaderStyle::enterprise();
1062 mHeaderOnlyAttachmentsAction->setEnabled( styleHasAttachmentQuickList );
1063 if ( !styleHasAttachmentQuickList && mAttachmentStrategy == AttachmentStrategy::headerOnly() ) {
1066 setAttachmentStrategy( AttachmentStrategy::smart() );
1075 if ( encoding == mOverrideEncoding )
1078 mOverrideEncoding = encoding;
1079 if ( mSelectEncodingAction ) {
1080 if ( encoding.isEmpty() ) {
1081 mSelectEncodingAction->setCurrentItem( 0 );
1084 TQStringList encodings = mSelectEncodingAction->items();
1086 for ( TQStringList::const_iterator it = encodings.begin(), end = encodings.end(); it != end; ++it, ++i ) {
1087 if ( TDEGlobal::charsets()->encodingForName( *it ) == encoding ) {
1088 mSelectEncodingAction->setCurrentItem( i );
1092 if ( i == encodings.size() ) {
1094 kdWarning(5006) <<
"Unknown override character encoding \"" << encoding
1095 <<
"\". Using Auto instead." << endl;
1096 mSelectEncodingAction->setCurrentItem( 0 );
1097 mOverrideEncoding = TQString();
1105 void KMReaderWin::setPrintFont(
const TQFont& font )
1108 mCSSHelper->setPrintFont( font );
1114 if ( mOverrideEncoding.isEmpty() || mOverrideEncoding ==
"Auto" )
1117 return KMMsgBase::codecForName( mOverrideEncoding.latin1() );
1121 void KMReaderWin::slotSetEncoding()
1123 if ( mSelectEncodingAction->currentItem() == 0 )
1124 mOverrideEncoding = TQString();
1126 mOverrideEncoding = TDEGlobal::charsets()->encodingForName( mSelectEncodingAction->currentText() );
1131 void KMReaderWin::readGlobalOverrideCodec()
1134 if ( GlobalSettings::self()->overrideCharacterEncoding() == mOldGlobalOverrideEncoding )
1137 setOverrideEncoding( GlobalSettings::self()->overrideCharacterEncoding() );
1138 mOldGlobalOverrideEncoding = GlobalSettings::self()->overrideCharacterEncoding();
1144 mSerNumOfOriginalMessage = serNumOfOriginalMessage;
1145 mNodeIdOffset = nodeIdOffset;
1152 kdDebug(5006) <<
"(" << aMsg->getMsgSerNum() <<
", last " << mLastSerNum <<
") " << aMsg->
subject() <<
" " 1153 << aMsg->fromStrip() <<
", readyToShow " << (aMsg->
readyToShow()) << endl;
1157 if ( aMsg && aMsg->getMsgSerNum() != mLastSerNum && !updateOnly ){
1158 mLevelQuote = GlobalSettings::self()->collapseQuoteLevelSpin()-1;
1159 mShowRawToltecMail = !GlobalSettings::self()->showToltecReplacementText();
1160 clearBodyPartMementos();
1165 bool complete =
true;
1168 (aMsg->getMsgSerNum() != mLastSerNum) &&
1173 if (!force && aMsg && mLastSerNum != 0 && aMsg->getMsgSerNum() == mLastSerNum)
1177 if (aMsg && message())
1178 message()->detach(
this );
1180 aMsg->attach(
this );
1183 mDelayedMarkTimer.stop();
1187 mWaitingForSerNum = 0;
1190 mLastSerNum = aMsg->getMsgSerNum();
1196 if (message() != aMsg) {
1207 mViewer->setDNDEnabled(
false );
1209 mViewer->setDNDEnabled(
true );
1219 mUpdateReaderWinTimer.stop();
1222 else if (mUpdateReaderWinTimer.isActive())
1223 mUpdateReaderWinTimer.changeInterval( delay );
1225 mUpdateReaderWinTimer.start( 0,
true );
1228 if ( aMsg && (aMsg->isUnread() || aMsg->isNew()) && GlobalSettings::self()->delayedMarkAsRead() ) {
1229 if ( GlobalSettings::self()->delayedMarkTime() != 0 )
1230 mDelayedMarkTimer.start( GlobalSettings::self()->delayedMarkTime() * 1000, true );
1235 mHeaderRefreshTimer.start( 1000,
false );
1241 mUpdateReaderWinTimer.stop();
1243 mDelayedMarkTimer.stop();
1245 mWaitingForSerNum = 0;
1250 static const char *
const kmailChanges[] = {
1253 static const int numKMailChanges =
1254 sizeof kmailChanges /
sizeof *kmailChanges;
1260 static const char *
const kmailNewFeatures[] = {
1261 I18N_NOOP(
"Full namespace support for IMAP"),
1262 I18N_NOOP(
"Offline mode"),
1263 I18N_NOOP(
"Sieve script management and editing"),
1264 I18N_NOOP(
"Account specific filtering"),
1265 I18N_NOOP(
"Filtering of incoming mail for online IMAP accounts"),
1266 I18N_NOOP(
"Online IMAP folders can be used when filtering into folders"),
1267 I18N_NOOP(
"Automatically delete older mails on POP servers")
1269 static const int numKMailNewFeatures =
1270 sizeof kmailNewFeatures /
sizeof *kmailNewFeatures;
1278 for (
int i = 0 ; i < numKMailChanges ; ++i )
1279 str += kmailChanges[i];
1280 for (
int i = 0 ; i < numKMailNewFeatures ; ++i )
1281 str += kmailNewFeatures[i];
1283 return md5.base64Digest();
1289 mMsgDisplay =
false;
1292 TQString location = locate(
"data",
"kmail/about/main.html");
1293 TQString content = KPIM::kFileToString(location);
1294 content = content.arg( locate(
"data",
"libtdepim/about/kde_infopage.css" ) );
1295 if ( kapp->reverseLayout() )
1296 content = content.arg(
"@import \"%1\";" ).arg( locate(
"data",
"libtdepim/about/kde_infopage_rtl.css" ) );
1298 content = content.arg(
"" );
1300 mViewer->begin(KURL( location ));
1302 TQString fontSize = TQString::number( pointsToPixel( mCSSHelper->bodyFont().pointSize() ) );
1303 TQString appTitle = i18n(
"KMail");
1304 TQString catchPhrase =
"";
1305 TQString quickDescription = i18n(
"The email client for the Trinity Desktop Environment.");
1306 mViewer->write(content.arg(fontSize).arg(appTitle).arg(catchPhrase).arg(quickDescription).arg(info));
1313 i18n(
"<h2 style='margin-top: 0px;'>Retrieving Folder Contents</h2><p>Please wait . . .</p> " );
1315 displaySplashPage( info );
1321 i18n(
"<h2 style='margin-top: 0px;'>Offline</h2><p>KMail is currently in offline mode. " 1322 "Click <a href=\"kmail:goOnline\">here</a> to go online . . .</p> " );
1324 displaySplashPage( info );
1332 i18n(
"%1: KMail version; %2: help:// URL; %3: homepage URL; " 1333 "%4: prior KMail version; %5: prior TDE version; " 1334 "%6: generated list of new features; " 1335 "%7: First-time user text (only shown on first start); " 1336 "%8: generated list of important changes; " 1337 "--- end of comment ---",
1338 "<h2 style='margin-top: 0px;'>Welcome to KMail %1</h2><p>KMail is the email client for the Trinity " 1339 "Desktop Environment. It is designed to be fully compatible with " 1340 "Internet mailing standards including MIME, SMTP, POP3 and IMAP." 1342 "<ul><li>KMail has many powerful features which are described in the " 1343 "<a href=\"%2\">documentation</a></li>\n" 1344 "<li>The <a href=\"%3\">KMail (TDE) homepage</A> offers information about " 1345 "new versions of KMail</li></ul>\n" 1347 "<p>Some of the new features in this release of KMail include " 1348 "(compared to KMail %4, which is part of TDE %5):</p>\n" 1351 "<p>We hope that you will enjoy KMail.</p>\n" 1352 "<p>Thank you,</p>\n" 1353 "<p style='margin-bottom: 0px'> The KMail Team</p>")
1355 .arg(
"help:/kmail/index.html")
1356 .arg(
"http://www.trinitydesktop.org")
1357 .arg(
"1.8").arg(
"3.4");
1359 TQString featureItems;
1360 for (
int i = 0 ; i < numKMailNewFeatures ; i++ )
1361 featureItems += i18n(
"<li>%1</li>\n").arg( i18n( kmailNewFeatures[i] ) );
1363 info = info.arg( featureItems );
1365 if( kmkernel->firstStart() ) {
1366 info = info.arg( i18n(
"<p>Please take a moment to fill in the KMail " 1367 "configuration panel at Settings->Configure " 1369 "You need to create at least a default identity and " 1370 "an incoming as well as outgoing mail account." 1373 info = info.arg( TQString() );
1376 if ( ( numKMailChanges > 1 ) || ( numKMailChanges == 1 && strlen(kmailChanges[0]) > 0 ) ) {
1377 TQString changesText =
1378 i18n(
"<p><span style='font-size:125%; font-weight:bold;'>" 1379 "Important changes</span> (compared to KMail %1):</p>\n")
1381 changesText +=
"<ul>\n";
1382 for (
int i = 0 ; i < numKMailChanges ; i++ )
1383 changesText += i18n(
"<li>%1</li>\n").arg( i18n( kmailChanges[i] ) );
1384 changesText +=
"</ul>\n";
1385 info = info.arg( changesText );
1388 info = info.arg(
"");
1390 displaySplashPage( info );
1403 if (!mMsgDisplay)
return;
1405 mViewer->setOnlyLocalReferences(!htmlLoadExternal());
1407 htmlWriter()->reset();
1410 if (message(&folder))
1412 if ( mShowColorbar )
1421 mMimePartTree->hide();
1422 mMimePartTree->clear();
1423 htmlWriter()->begin( mCSSHelper->cssDefinitions( isFixedFont() ) );
1424 htmlWriter()->write( mCSSHelper->htmlHead( isFixedFont() ) +
"</body></html>" );
1425 htmlWriter()->end();
1428 if (mSavedRelativePosition)
1430 TQScrollView * scrollview =
static_cast<TQScrollView *
>(mViewer->widget());
1431 scrollview->setContentsPos( 0,
1432 tqRound( scrollview->contentsHeight() * mSavedRelativePosition ) );
1433 mSavedRelativePosition = 0;
1440 const TQPaintDeviceMetrics pdm(mViewer->view());
1442 return (pointSize * pdm.logicalDpiY() + 36) / 72;
1447 if ( mMimeTreeMode == 2 ||
1448 ( mMimeTreeMode == 1 && !isPlainTextTopLevel ) )
1449 mMimePartTree->show();
1452 TDEConfigGroup reader( KMKernel::config(),
"Reader" );
1453 saveSplitterSizes( reader );
1454 mMimePartTree->hide();
1461 mMimePartTree->clear();
1462 showHideMimeTree( !msg ||
1463 ( msg->type() == DwMime::kTypeText
1464 && msg->subtype() == DwMime::kSubtypePlain ) );
1471 htmlWriter()->begin( mCSSHelper->cssDefinitions( isFixedFont() ) );
1472 htmlWriter()->queue( mCSSHelper->htmlHead( isFixedFont() ) );
1479 mColorBar->setNeutralMode();
1483 if( mColorBar->isNeutral() )
1484 mColorBar->setNormalMode();
1486 htmlWriter()->queue(
"</body></html>");
1487 htmlWriter()->flush();
1489 TQTimer::singleShot( 1, TQT_TQOBJECT(
this), TQT_SLOT(injectAttachments()) );
1492 static bool message_was_saved_decrypted_before(
const KMMessage * msg ) {
1496 return msg->
msgId().stripWhiteSpace().startsWith(
"<DecryptedMsg." );
1502 KMMessagePart msgPart;
1503 TQCString subtype, contDisp;
1508 aMsg->setIsBeingParsed(
true );
1510 if ( mRootNode && !mRootNode->processed() )
1512 kdWarning() <<
"The root node is not yet processed! Danger!\n";
1516 mRootNode = partNode::fromMessage( aMsg,
this );
1517 const TQCString mainCntTypeStr = mRootNode->typeString() +
'/' + mRootNode->subTypeString();
1519 TQString cntDesc = aMsg->
subject();
1520 if( cntDesc.isEmpty() )
1521 cntDesc = i18n(
"( body part )");
1522 TDEIO::filesize_t cntSize = aMsg->
msgSize();
1530 mRootNode->fillMimePartTree( 0,
1537 partNode* vCardNode = mRootNode->findType( DwMime::kTypeText, DwMime::kSubtypeXVCard );
1538 bool hasVCard =
false;
1542 TDEABC::VCardConverter t;
1543 #if defined(KABC_VCARD_ENCODING_FIX) 1544 const TQByteArray vcard = vCardNode->msgPart().bodyDecodedBinary();
1545 if ( !t.parseVCardsRaw( vcard.data() ).empty() ) {
1547 const TQString vcard = vCardNode->msgPart().bodyToUnicode( overrideCodec() );
1548 if ( !t.parseVCards( vcard ).empty() ) {
1551 writeMessagePartToTempFile( &vCardNode->msgPart(), vCardNode->nodeId() );
1555 if ( !mRootNode || !mRootNode->isToltecMessage() || mShowRawToltecMail ) {
1556 htmlWriter()->queue( writeMsgHeader(aMsg, hasVCard ? vCardNode : 0,
true ) );
1560 ObjectTreeParser otp(
this );
1561 otp.setAllowAsync(
true );
1562 otp.setShowRawToltecMail( mShowRawToltecMail );
1563 otp.parseObjectTree( mRootNode );
1567 KMMsgEncryptionState encryptionState = mRootNode->overallEncryptionState();
1568 KMMsgSignatureState signatureState = mRootNode->overallSignatureState();
1570 if (aMsg != message()) {
1577 if ( signatureState != KMMsgNotSigned ||
1582 bool emitReplaceMsgByUnencryptedVersion =
false;
1583 const TDEConfigGroup reader( KMKernel::config(),
"Reader" );
1584 if ( reader.readBoolEntry(
"store-displayed-messages-unencrypted",
false ) ) {
1599 kdDebug(5006) <<
"\n\n\nKMReaderWin::parseMsg() - special post-encryption handling:\n1." << endl;
1600 kdDebug(5006) <<
"(aMsg == msg) = " << (aMsg == message()) << endl;
1601 kdDebug(5006) <<
"aMsg->parent() && aMsg->parent() != kmkernel->outboxFolder() = " << (aMsg->parent() && aMsg->parent() != kmkernel->outboxFolder()) << endl;
1602 kdDebug(5006) <<
"message_was_saved_decrypted_before( aMsg ) = " << message_was_saved_decrypted_before( aMsg ) << endl;
1603 kdDebug(5006) <<
"this->decryptMessage() = " << decryptMessage() << endl;
1604 kdDebug(5006) <<
"otp.hasPendingAsyncJobs() = " << otp.hasPendingAsyncJobs() << endl;
1605 kdDebug(5006) <<
" (KMMsgFullyEncrypted == encryptionState) = " << (KMMsgFullyEncrypted == encryptionState) << endl;
1606 kdDebug(5006) <<
"|| (KMMsgPartiallyEncrypted == encryptionState) = " << (KMMsgPartiallyEncrypted == encryptionState) << endl;
1609 if( (aMsg == message())
1611 && ( aMsg->parent() && aMsg->parent() != kmkernel->outboxFolder() )
1613 && !message_was_saved_decrypted_before( aMsg )
1617 && !otp.hasPendingAsyncJobs()
1619 && ( (KMMsgFullyEncrypted == encryptionState)
1620 || (KMMsgPartiallyEncrypted == encryptionState) ) ) {
1622 kdDebug(5006) <<
"KMReaderWin - calling objectTreeToDecryptedMsg()" << endl;
1624 NewByteArray decryptedData;
1626 objectTreeToDecryptedMsg( mRootNode, decryptedData, *aMsg );
1628 decryptedData.appendNULL();
1629 TQCString resultString( decryptedData.data() );
1630 kdDebug(5006) <<
"KMReaderWin - resulting data:" << resultString << endl;
1632 if( !resultString.isEmpty() ) {
1633 kdDebug(5006) <<
"KMReaderWin - composing unencrypted message" << endl;
1635 aMsg->
setBody( resultString );
1637 unencryptedMessage->setParent( 0 );
1646 kdDebug(5006) <<
"KMReaderWin - attach unencrypted message to aMsg" << endl;
1648 emitReplaceMsgByUnencryptedVersion =
true;
1654 const int rootNodeCntType = mRootNode ? mRootNode->type() : DwMime::kTypeText;
1655 const int rootNodeCntSubtype = mRootNode ? mRootNode->subType() : DwMime::kSubtypePlain;
1658 setIdOfLastViewedMessage( aMsg->
msgId() );
1660 if( emitReplaceMsgByUnencryptedVersion ) {
1661 kdDebug(5006) <<
"KMReaderWin - invoce saving in decrypted form:" << endl;
1662 emit replaceMsgByUnencryptedVersion();
1664 kdDebug(5006) <<
"KMReaderWin - finished parsing and displaying of message." << endl;
1665 showHideMimeTree( rootNodeCntType == DwMime::kTypeText &&
1666 rootNodeCntSubtype == DwMime::kSubtypePlain );
1669 aMsg->setIsBeingParsed(
false );
1674 void KMReaderWin::updateHeader()
1686 if (currentMessage &&
1687 mHeaderStyle == HeaderStyle::fancy() &&
1688 currentMessage->parent())
1692 DOM::NodeList divs(mViewer->document().documentElement().getElementsByTagName(
"div"));
1693 DOM::NodeList headerDivs(static_cast<DOM::HTMLDivElement>(divs.item(0)).getElementsByTagName(
"div"));
1694 for (i=0; i<((int)headerDivs.length()); i++) {
1695 if (static_cast<DOM::HTMLDivElement>(headerDivs.item(i)).
id().string() ==
"sendersCurrentTime") {
1701 if (divNumber >= 0) {
1702 DOM::HTMLDivElement elem =
static_cast<DOM::HTMLDivElement
>(headerDivs.item(i));
1706 TQString latestHeader = headerStyle()->format( currentMessage, headerStrategy(),
"", mPrinting,
false );
1707 int startPos = latestHeader.find(
"<div id=\"sendersCurrentTime\" style=\"");
1708 if (startPos >= 0) {
1709 latestHeader = latestHeader.mid(startPos);
1710 int endPos = latestHeader.find(
"</div>");
1712 endPos = endPos + 6;
1713 latestHeader.truncate(endPos);
1715 TQString divText = latestHeader;
1716 TQString divStyle = latestHeader;
1718 divText = divText.mid(divText.find(
">")+1);
1719 divText.truncate(divText.find(
"</div>"));
1721 divStyle = divStyle.mid(TQString(
"<div id=\"sendersCurrentTime\" style=\"").length());
1722 divStyle.truncate(divStyle.find(
"\""));
1724 elem.setInnerHTML(divText);
1725 elem.setAttribute(
"style", divStyle);
1726 elem.applyChanges();
1736 kdFatal( !headerStyle(), 5006 )
1737 <<
"trying to writeMsgHeader() without a header style set!" << endl;
1738 kdFatal( !headerStrategy(), 5006 )
1739 <<
"trying to writeMsgHeader() without a header strategy set!" << endl;
1742 href = vCardNode->asHREF(
"body" );
1744 return headerStyle()->format( aMsg, headerStrategy(), href, mPrinting, topLevel );
1753 TQString fileName = aMsgPart->fileName();
1754 if( fileName.isEmpty() )
1755 fileName = aMsgPart->name();
1758 TQString fname = createTempDir( TQString::number( aPartNum ) );
1759 if ( fname.isEmpty() )
1763 int slashPos = fileName.findRev(
'/' );
1764 if( -1 != slashPos )
1765 fileName = fileName.mid( slashPos + 1 );
1766 if( fileName.isEmpty() )
1767 fileName =
"unnamed";
1768 fname +=
"/" + fileName;
1770 TQByteArray data = aMsgPart->bodyDecodedBinary();
1771 size_t size = data.size();
1772 if ( aMsgPart->type() == DwMime::kTypeText && size) {
1776 if( !KPIM::kBytesToFile( data.data(), size, fname,
false,
false, false ) )
1779 mTempFiles.append( fname );
1782 ::chmod( TQFile::encodeName( fname ), S_IRUSR );
1789 KTempFile *tempFile =
new KTempFile( TQString(),
"." + param );
1790 tempFile->setAutoDelete(
true );
1791 TQString fname = tempFile->name();
1794 if( ::access( TQFile::encodeName( fname ), W_OK ) != 0 )
1796 if( ::mkdir( TQFile::encodeName( fname ), 0 ) != 0
1797 || ::chmod( TQFile::encodeName( fname ), S_IRWXU ) != 0 )
1800 assert( !fname.isNull() );
1802 mTempDirs.append( fname );
1809 #if defined(KABC_VCARD_ENCODING_FIX) 1810 const TQByteArray vCard = msgPart->bodyDecodedBinary();
1812 const TQString vCard = msgPart->bodyToUnicode( overrideCodec() );
1814 VCardViewer *vcv =
new VCardViewer(
this, vCard,
"vCardDialog" );
1821 if (!message())
return;
1822 mViewer->view()->print();
1829 if (aUrl.isEmpty())
return -1;
1830 if (!aUrl.isLocalFile())
return -1;
1832 TQString path = aUrl.path();
1833 uint right = path.findRev(
'/');
1834 uint left = path.findRev(
'.', right);
1837 int res = path.mid(left + 1, right - left - 1).toInt(&ok);
1838 return (ok) ? res : -1;
1843 void KMReaderWin::resizeEvent(TQResizeEvent *)
1845 if( !mResizeTimer.isActive() )
1851 mResizeTimer.start( 100,
true );
1857 void KMReaderWin::slotDelayedResize()
1859 mSplitter->setGeometry(0, 0, width(), height());
1864 void KMReaderWin::slotTouchMessage()
1869 if ( !message()->isNew() && !message()->isUnread() )
1873 serNums.append( message()->getMsgSerNum() );
1874 KMCommand *command =
new KMSeStatusCommand( KMMsgStatusRead, serNums );
1878 if ( mNoMDNsWhenEncrypted &&
1879 message()->encryptionState() != KMMsgNotEncrypted &&
1880 message()->encryptionState() != KMMsgEncryptionStateUnknown )
1883 KMFolder *folder = message()->parent();
1892 if ( !kmkernel->msgSender()->send( receipt ) )
1893 KMessageBox::error(
this, i18n(
"Could not send MDN.") );
1900 TQWidget::closeEvent(e);
1905 bool foundSMIMEData(
const TQString aUrl,
1906 TQString& displayName,
1910 static TQString showCertMan(
"showCertificate#");
1914 int i1 = aUrl.find( showCertMan );
1916 i1 += showCertMan.length();
1917 int i2 = aUrl.find(
" ### ", i1);
1920 displayName = aUrl.mid( i1, i2-i1 );
1922 i2 = aUrl.find(
" ### ", i1);
1925 libName = aUrl.mid( i1, i2-i1 );
1928 keyId = aUrl.mid( i2 );
1944 return !keyId.isEmpty();
1951 const KURL url(aUrl);
1953 if ( url.protocol() ==
"kmail" || url.protocol() ==
"x-kmail" || url.protocol() ==
"attachment" 1954 || (url.protocol().isEmpty() && url.path().isEmpty()) ) {
1955 mViewer->setDNDEnabled(
false );
1957 mViewer->setDNDEnabled(
true );
1960 if ( aUrl.stripWhiteSpace().isEmpty() ) {
1961 KPIM::BroadcastStatus::instance()->reset();
1962 mHoveredUrl = KURL();
1963 mLastClickImagePath = TQString();
1969 const TQString msg = URLHandlerManager::instance()->statusBarMessage( url,
this );
1971 kdWarning( msg.isEmpty(), 5006 ) <<
"KMReaderWin::slotUrlOn(): Unhandled URL hover!" << endl;
1972 KPIM::BroadcastStatus::instance()->setTransienStatusMsg( msg );
1981 if ( URLHandlerManager::instance()->handleClick( aUrl,
this ) )
1984 kdWarning( 5006 ) <<
"KMReaderWin::slotOpenUrl(): Unhandled URL click!" << endl;
1985 emit urlClicked( aUrl, Qt::LeftButton );
1991 const KURL url( aUrl );
1994 if ( url.protocol() ==
"mailto" ) {
1995 mCopyURLAction->setText( i18n(
"Copy Email Address" ) );
1997 mCopyURLAction->setText( i18n(
"Copy Link Address" ) );
2000 if ( URLHandlerManager::instance()->handleContextMenuRequest( url, aPos,
this ) )
2004 kdWarning( 5006 ) <<
"KMReaderWin::slotUrlPopup(): Unhandled URL right-click!" << endl;
2005 emitPopupMenu( url, aPos );
2011 static bool hasParentDivWithId(
const DOM::Node &start,
const TQString &
id )
2013 if ( start.isNull() )
2016 if ( start.nodeName().string() ==
"div" ) {
2017 for (
unsigned int i = 0; i < start.attributes().length(); i++ ) {
2018 if ( start.attributes().item( i ).nodeName().string() ==
"id" &&
2019 start.attributes().item( i ).nodeValue().string() == id )
2024 if ( !start.parentNode().isNull() )
2025 return hasParentDivWithId( start.parentNode(), id );
2030 void KMReaderWin::showAttachmentPopup(
int id,
const TQString & name,
const TQPoint & p )
2033 mAtmCurrentName = name;
2034 TDEPopupMenu *menu =
new TDEPopupMenu();
2035 menu->insertItem(SmallIcon(
"document-open"),i18n(
"to open",
"Open"), 1);
2036 menu->insertItem(i18n(
"Open With..."), 2);
2037 menu->insertItem(i18n(
"to view something",
"View"), 3);
2038 menu->insertItem(SmallIcon(
"document-save-as"),i18n(
"Save As..."), 4);
2039 menu->insertItem(SmallIcon(
"edit-copy"), i18n(
"Copy"), 9 );
2040 const bool canChange = message()->parent() ? !message()->parent()->isReadOnly() :
false;
2041 if ( GlobalSettings::self()->allowAttachmentEditing() && canChange )
2042 menu->insertItem(SmallIcon(
"edit"), i18n(
"Edit Attachment"), 8 );
2043 if ( GlobalSettings::self()->allowAttachmentDeletion() && canChange )
2044 menu->insertItem(SmallIcon(
"edit-delete"), i18n(
"Delete Attachment"), 7 );
2045 if ( name.endsWith(
".xia",
false ) &&
2046 Kleo::CryptoBackendFactory::instance()->protocol(
"Chiasmus" ) )
2047 menu->insertItem( i18n(
"Decrypt With Chiasmus..." ), 6 );
2048 menu->insertItem(i18n(
"Properties"), 5);
2050 const bool attachmentInHeader = hasParentDivWithId( mViewer->nodeUnderMouse(),
"attachmentInjectionPoint" );
2051 const bool hasScrollbar = mViewer->view()->verticalScrollBar()->isVisible();
2052 if ( attachmentInHeader && hasScrollbar ) {
2053 menu->insertItem( i18n(
"Scroll To"), 10 );
2056 connect(menu, TQT_SIGNAL(activated(
int)), TQT_TQOBJECT(
this), TQT_SLOT(slotHandleAttachment(
int)));
2068 if( style().isA(
"KeramikStyle") )
2069 frameWidth = style().pixelMetric( TQStyle::PM_DefaultFrameWidth ) - 1;
2071 frameWidth = style().pixelMetric( TQStyle::PM_DefaultFrameWidth );
2072 if ( frameWidth < 0 )
2074 if ( frameWidth != mBox->lineWidth() )
2075 mBox->setLineWidth( frameWidth );
2081 setStyleDependantFrameWidth();
2082 TQWidget::styleChange( oldStyle );
2086 void KMReaderWin::slotHandleAttachment(
int choice )
2089 partNode* node = mRootNode ? mRootNode->findId( mAtmCurrent ) : 0;
2090 if ( mAtmCurrentName.isEmpty() && node )
2091 mAtmCurrentName = tempFileUrlFromPartNode( node ).path();
2093 KMHandleAttachmentCommand* command =
new KMHandleAttachmentCommand(
2094 node, message(), mAtmCurrent, mAtmCurrentName,
2095 KMHandleAttachmentCommand::AttachmentAction( choice ), 0,
this );
2096 connect( command, TQT_SIGNAL( showAttachment(
int,
const TQString& ) ),
2097 TQT_TQOBJECT(
this), TQT_SLOT( slotAtmView(
int,
const TQString& ) ) );
2099 }
else if ( choice == 7 ) {
2100 slotDeleteAttachment( node );
2101 }
else if ( choice == 8 ) {
2102 slotEditAttachment( node );
2103 }
else if ( choice == 9 ) {
2104 if ( !node )
return;
2106 KURL url = tempFileUrlFromPartNode( node );
2107 if (!url.isValid() )
return;
2109 KURLDrag* drag =
new KURLDrag( urls,
this );
2110 TQApplication::clipboard()->setData( drag, TQClipboard::Clipboard );
2111 }
else if ( choice == 10 ) {
2112 scrollToAttachment( node );
2119 mViewer->findText();
2125 mViewer->findTextNext();
2131 mUseFixedFont = !mUseFixedFont;
2132 saveRelativePosition();
2140 kapp->clipboard()->setText( mViewer->selectedText() );
2147 assert(aMsgPart!=0);
2149 msg->fromString(aMsgPart->bodyDecoded());
2153 msg->setParent( message()->parent() );
2154 msg->setUID(message()->UID());
2156 KMReaderMainWin *win =
new KMReaderMainWin();
2157 win->showMsg( overrideEncoding(), msg, message()->getMsgSerNum(), nodeId );
2163 htmlWriter()->reset();
2165 htmlWriter()->begin( mCSSHelper->cssDefinitions( isFixedFont() ) );
2166 htmlWriter()->write( mCSSHelper->htmlHead( isFixedFont() ) );
2169 ObjectTreeParser otp(
this, 0,
true );
2170 otp.parseObjectTree( node );
2173 htmlWriter()->queue(
"</body></html>" );
2174 htmlWriter()->flush();
2179 const TQString& aFileName,
const TQString& pname )
2182 if (kasciistricmp(aMsgPart->typeStr(),
"message")==0) {
2185 assert(aMsgPart!=0);
2186 msg->fromString(aMsgPart->bodyDecoded());
2187 mMainWindow->setCaption(msg->
subject());
2189 setAutoDelete(
true);
2190 }
else if (kasciistricmp(aMsgPart->typeStr(),
"text")==0) {
2191 if (kasciistricmp(aMsgPart->subtypeStr(),
"x-vcard") == 0) {
2192 showVCard( aMsgPart );
2195 htmlWriter()->begin( mCSSHelper->cssDefinitions( isFixedFont() ) );
2196 htmlWriter()->queue( mCSSHelper->htmlHead( isFixedFont() ) );
2198 if (aHTML && (kasciistricmp(aMsgPart->subtypeStr(),
"html")==0)) {
2200 htmlWriter()->queue( aMsgPart->bodyToUnicode( overrideCodec() ) );
2201 mColorBar->setHtmlMode();
2203 const TQCString str = aMsgPart->bodyDecoded();
2204 ObjectTreeParser otp(
this );
2205 otp.writeBodyStr( str,
2206 overrideCodec() ? overrideCodec() : aMsgPart->codec(),
2207 message() ? message()->from() : TQString() );
2209 htmlWriter()->queue(
"</body></html>");
2210 htmlWriter()->flush();
2211 mMainWindow->setCaption(i18n(
"View Attachment: %1").arg(pname));
2212 }
else if (kasciistricmp(aMsgPart->typeStr(),
"image")==0 ||
2213 (kasciistricmp(aMsgPart->typeStr(),
"application")==0 &&
2214 kasciistricmp(aMsgPart->subtypeStr(),
"postscript")==0))
2216 if (aFileName.isEmpty())
return;
2218 TQImageIO *iio =
new TQImageIO();
2219 iio->setFileName(aFileName);
2221 TQImage img = iio->image();
2222 TQRect desk = TDEGlobalSettings::desktopGeometry(mMainWindow);
2225 if( img.width() < 50 )
2227 else if( img.width()+20 < desk.width() )
2228 width = img.width()+20;
2230 width = desk.width();
2231 if( img.height() < 50 )
2233 else if( img.height()+20 < desk.height() )
2234 height = img.height()+20;
2236 height = desk.height();
2237 mMainWindow->resize( width, height );
2240 htmlWriter()->begin( mCSSHelper->cssDefinitions( isFixedFont() ) );
2241 htmlWriter()->write( mCSSHelper->htmlHead( isFixedFont() ) );
2242 htmlWriter()->write(
"<img src=\"file:" +
2243 KURL::encode_string( aFileName ) +
2244 "\" border=\"0\">\n" 2245 "</body></html>\n" );
2246 htmlWriter()->end();
2247 setCaption( i18n(
"View Attachment: %1").arg( pname ) );
2251 htmlWriter()->begin( mCSSHelper->cssDefinitions( isFixedFont() ) );
2252 htmlWriter()->queue( mCSSHelper->htmlHead( isFixedFont() ) );
2253 htmlWriter()->queue(
"<pre>" );
2255 TQString str = aMsgPart->bodyDecoded();
2258 if( str.length() < (unsigned) aMsgPart->decodedSize() ) {
2259 str.prepend( i18n(
"[KMail: Attachment contains binary data. Trying to show first character.]",
2260 "[KMail: Attachment contains binary data. Trying to show first %n characters.]",
2261 str.length()) + TQChar(
'\n') );
2263 htmlWriter()->queue( TQStyleSheet::escape( str ) );
2264 htmlWriter()->queue(
"</pre>" );
2265 htmlWriter()->queue(
"</body></html>");
2266 htmlWriter()->flush();
2267 mMainWindow->setCaption(i18n(
"View Attachment: %1").arg(pname));
2276 partNode* node = mRootNode ? mRootNode->findId(
id ) : 0;
2279 mAtmCurrentName = name;
2280 if ( mAtmCurrentName.isEmpty() )
2281 mAtmCurrentName = tempFileUrlFromPartNode( node ).path();
2283 KMMessagePart& msgPart = node->msgPart();
2284 TQString pname = msgPart.fileName();
2285 if (pname.isEmpty()) pname=msgPart.name();
2286 if (pname.isEmpty()) pname=msgPart.contentDescription();
2287 if (pname.isEmpty()) pname=
"unnamed";
2289 if (kasciistricmp(msgPart.typeStr(),
"message")==0) {
2290 atmViewMsg( &msgPart,
id );
2291 }
else if ((kasciistricmp(msgPart.typeStr(),
"text")==0) &&
2292 (kasciistricmp(msgPart.subtypeStr(),
"x-vcard")==0)) {
2293 setMsgPart( &msgPart, htmlMail(), name, pname );
2295 KMReaderMainWin *win =
new KMReaderMainWin(&msgPart, htmlMail(),
2296 name, pname, overrideEncoding() );
2303 void KMReaderWin::openAttachment(
int id,
const TQString & name )
2305 mAtmCurrentName = name;
2308 TQString str, pname, cmd, fileName;
2310 partNode* node = mRootNode ? mRootNode->findId(
id ) : 0;
2312 kdWarning(5006) <<
"KMReaderWin::openAttachment - could not find node " <<
id << endl;
2315 if ( mAtmCurrentName.isEmpty() )
2316 mAtmCurrentName = tempFileUrlFromPartNode( node ).path();
2318 KMMessagePart& msgPart = node->msgPart();
2319 if (kasciistricmp(msgPart.typeStr(),
"message")==0)
2321 atmViewMsg( &msgPart,
id );
2325 TQCString contentTypeStr( msgPart.typeStr() +
'/' + msgPart.subtypeStr() );
2326 KPIM::kAsciiToLower( contentTypeStr.data() );
2328 if ( qstrcmp( contentTypeStr,
"text/x-vcard" ) == 0 ) {
2329 showVCard( &msgPart );
2334 KMimeType::Ptr mimetype;
2336 mimetype = KMimeType::mimeType( TQString::fromLatin1( contentTypeStr ) );
2337 if ( mimetype->name() ==
"application/octet-stream" ) {
2339 mimetype = KMimeType::findByPath( name, 0,
true );
2341 if ( ( mimetype->name() ==
"application/octet-stream" )
2342 && msgPart.isComplete() ) {
2345 mimetype = KMimeType::findByFileContent( name );
2348 KService::Ptr offer =
2349 KServiceTypeProfile::preferredService( mimetype->name(),
"Application" );
2352 TQString filenameText = msgPart.fileName();
2353 if ( filenameText.isEmpty() )
2354 filenameText = msgPart.name();
2356 open_text = i18n(
"&Open with '%1'").arg( offer->name() );
2358 open_text = i18n(
"&Open With...");
2360 const TQString text = i18n(
"Open attachment '%1'?\n" 2361 "Note that opening an attachment may compromise " 2362 "your system's security.")
2363 .arg( filenameText );
2364 const int choice = KMessageBox::questionYesNoCancel(
this, text,
2365 i18n(
"Open Attachment?"), KStdGuiItem::saveAs(), open_text,
2366 TQString::fromLatin1(
"askSave") + mimetype->name() );
2368 if( choice == KMessageBox::Yes ) {
2370 KMHandleAttachmentCommand* command =
new KMHandleAttachmentCommand( node,
2371 message(), mAtmCurrent, mAtmCurrentName, KMHandleAttachmentCommand::Save,
2373 connect( command, TQT_SIGNAL( showAttachment(
int,
const TQString& ) ),
2374 TQT_TQOBJECT(
this), TQT_SLOT( slotAtmView(
int,
const TQString& ) ) );
2377 else if( choice == KMessageBox::No ) {
2378 KMHandleAttachmentCommand::AttachmentAction action = ( offer ?
2379 KMHandleAttachmentCommand::Open : KMHandleAttachmentCommand::OpenWith );
2381 KMHandleAttachmentCommand* command =
new KMHandleAttachmentCommand( node,
2382 message(), mAtmCurrent, mAtmCurrentName, action, offer,
this );
2383 connect( command, TQT_SIGNAL( showAttachment(
int,
const TQString& ) ),
2384 TQT_TQOBJECT(
this), TQT_SLOT( slotAtmView(
int,
const TQString& ) ) );
2387 kdDebug(5006) <<
"Canceled opening attachment" << endl;
2394 static_cast<TQScrollView *
>(mViewer->widget())->scrollBy(0, -10);
2399 void KMReaderWin::slotScrollDown()
2401 static_cast<TQScrollView *
>(mViewer->widget())->scrollBy(0, 10);
2404 bool KMReaderWin::atBottom()
const 2406 const TQScrollView *view =
static_cast<const TQScrollView *
>(mViewer->widget());
2407 return view->contentsY() + view->visibleHeight() >= view->contentsHeight();
2411 void KMReaderWin::slotJumpDown()
2413 TQScrollView *view =
static_cast<TQScrollView *
>(mViewer->widget());
2414 int offs = (view->clipper()->height() < 30) ? view->clipper()->height() : 30;
2415 view->scrollBy( 0, view->clipper()->height() - offs );
2419 void KMReaderWin::slotScrollPrior()
2421 static_cast<TQScrollView *
>(mViewer->widget())->scrollBy(0, -(
int)(height()*0.8));
2426 void KMReaderWin::slotScrollNext()
2428 static_cast<TQScrollView *
>(mViewer->widget())->scrollBy(0, (
int)(height()*0.8));
2432 void KMReaderWin::slotDocumentChanged()
2439 void KMReaderWin::slotTextSelected(
bool)
2441 TQString temp = mViewer->selectedText();
2442 kapp->clipboard()->setText(temp);
2448 mViewer->selectAll();
2454 TQString temp = mViewer->selectedText();
2460 void KMReaderWin::slotDocumentDone()
2467 void KMReaderWin::setHtmlOverride(
bool override)
2469 mHtmlOverride =
override;
2471 message()->setDecodeHTML(htmlMail());
2476 void KMReaderWin::setHtmlLoadExtOverride(
bool override)
2478 mHtmlLoadExtOverride =
override;
2487 return ((mHtmlMail && !mHtmlOverride) || (!mHtmlMail && mHtmlOverride));
2494 return ((mHtmlLoadExternal && !mHtmlLoadExtOverride) ||
2495 (!mHtmlLoadExternal && mHtmlLoadExtOverride));
2502 const TQScrollView * scrollview =
static_cast<TQScrollView *
>( mViewer->widget() );
2503 mSavedRelativePosition =
2504 static_cast<float>( scrollview->contentsY() ) / scrollview->contentsHeight();
2513 setMsg( msg, force,
true );
2521 KMFolder*& folder = aFolder ? *aFolder : tmpFolder;
2530 message = folder->
getMsg( index );
2532 kdWarning(5006) <<
"Attempt to reference invalid serial number " << mLastSerNum <<
"\n" << endl;
2541 void KMReaderWin::slotUrlClicked()
2543 KMMainWidget *mainWidget =
dynamic_cast<KMMainWidget*
>(mMainWindow);
2545 if ( message() && message()->parent() ) {
2546 identity = message()->parent()->identity();
2549 KMCommand *command =
new KMUrlClickedCommand( mClickedUrl, identity,
this,
2550 false, mainWidget );
2555 void KMReaderWin::slotMailtoCompose()
2557 KMCommand *command =
new KMMailtoComposeCommand( mClickedUrl, message() );
2562 void KMReaderWin::slotMailtoForward()
2564 KMCommand *command =
new KMMailtoForwardCommand( mMainWindow, mClickedUrl,
2570 void KMReaderWin::slotMailtoAddAddrBook()
2572 KMCommand *command =
new KMMailtoAddAddrBookCommand( mClickedUrl,
2578 void KMReaderWin::slotMailtoOpenAddrBook()
2580 KMCommand *command =
new KMMailtoOpenAddrBookCommand( mClickedUrl,
2590 KMCommand *command =
2591 new KMUrlCopyCommand( mClickedUrl,
2592 dynamic_cast<KMMainWidget*>( mMainWindow ) );
2599 if ( !url.isEmpty() )
2601 KMCommand *command =
new KMUrlOpenCommand( mClickedUrl,
this );
2606 void KMReaderWin::slotAddBookmarks()
2608 KMCommand *command =
new KMAddBookmarksCommand( mClickedUrl,
this );
2615 KMCommand *command =
new KMUrlSaveCommand( mClickedUrl, mMainWindow );
2622 KMCommand *command =
new KMMailtoReplyCommand( mMainWindow, mClickedUrl,
2623 message(), copyText() );
2629 return mRootNode ? mRootNode->findId( msgPartFromUrl( url ) ) : 0 ;
2632 partNode * KMReaderWin::partNodeForId(
int id ) {
2633 return mRootNode ? mRootNode->findId(
id ) : 0 ;
2637 KURL KMReaderWin::tempFileUrlFromPartNode(
const partNode * node )
2639 if (!node)
return KURL();
2640 TQStringList::const_iterator it = mTempFiles.begin();
2641 TQStringList::const_iterator end = mTempFiles.end();
2643 while ( it != end ) {
2644 TQString path = *it;
2646 uint right = path.findRev(
'/');
2647 uint left = path.findRev(
'.', right);
2650 int res = path.mid(left + 1, right - left - 1).toInt(&ok);
2651 if ( res == node->nodeId() )
2652 return KURL( path );
2658 void KMReaderWin::slotSaveAttachments()
2661 KMSaveAttachmentsCommand *saveCommand =
new KMSaveAttachmentsCommand( mMainWindow,
2663 saveCommand->start();
2667 void KMReaderWin::saveAttachment(
const KURL &tempFileName )
2669 mAtmCurrent = msgPartFromUrl( tempFileName );
2670 mAtmCurrentName = mClickedUrl.path();
2671 slotHandleAttachment( KMHandleAttachmentCommand::Save );
2675 void KMReaderWin::slotSaveMsg()
2677 KMSaveMsgCommand *saveCommand =
new KMSaveMsgCommand( mMainWindow, message() );
2679 if (saveCommand->url().isEmpty())
2682 saveCommand->start();
2687 KMCommand *command =
new KMIMChatCommand( mClickedUrl, message() );
2692 static TQString linkForNode(
const DOM::Node &node )
2695 if ( node.isNull() )
2698 const DOM::NamedNodeMap attributes = node.attributes();
2699 if ( !attributes.isNull() ) {
2700 const DOM::Node href = attributes.getNamedItem( DOM::DOMString(
"href" ) );
2701 if ( !href.isNull() ) {
2702 return href.nodeValue().string();
2705 if ( !node.parentNode().isNull() ) {
2706 return linkForNode( node.parentNode() );
2710 }
catch ( DOM::DOMException &e ) {
2711 kdWarning(5006) <<
"Got an exception when trying to determine link under cursor!" << endl;
2719 if ( e->type() == TQEvent::MouseButtonPress ) {
2720 TQMouseEvent* me = TQT_TQMOUSEEVENT(e);
2721 if ( me->button() == Qt::LeftButton && ( me->state() & ShiftButton ) ) {
2723 URLHandlerManager::instance()->handleShiftClick( mHoveredUrl,
this );
2727 if ( me->button() == Qt::LeftButton ) {
2730 const DOM::Node nodeUnderMouse = mViewer->nodeUnderMouse();
2731 if ( !nodeUnderMouse.isNull() ) {
2732 const DOM::NamedNodeMap attributes = nodeUnderMouse.attributes();
2733 if ( !attributes.isNull() ) {
2734 const DOM::Node src = attributes.getNamedItem( DOM::DOMString(
"src" ) );
2735 if ( !src.isNull() ) {
2736 imagePath = src.nodeValue().string();
2741 mCanStartDrag = URLHandlerManager::instance()->willHandleDrag( mHoveredUrl, imagePath,
this );
2742 mLastClickPosition = me->pos();
2743 mLastClickImagePath = imagePath;
2747 if ( e->type() == TQEvent::MouseButtonRelease ) {
2748 mCanStartDrag =
false;
2751 if ( e->type() == TQEvent::MouseMove ) {
2752 TQMouseEvent* me = TQT_TQMOUSEEVENT( e );
2756 slotUrlOn( linkForNode( mViewer->nodeUnderMouse() ) );
2758 if ( ( mLastClickPosition - me->pos() ).manhattanLength() > TDEGlobalSettings::dndEventDelay() ) {
2759 if ( mCanStartDrag && ( !( mHoveredUrl.isEmpty() && mLastClickImagePath.isEmpty() ) ) ) {
2760 if ( URLHandlerManager::instance()->handleDrag( mHoveredUrl, mLastClickImagePath,
this ) ) {
2761 mCanStartDrag =
false;
2762 slotUrlOn( TQString() );
2767 TQMouseEvent mouseEvent( TQEvent::MouseButtonRelease, me->pos(), Qt::NoButton, Qt::NoButton );
2768 TQT_TQOBJECT( mViewer->view() )->eventFilter( mViewer->view()->viewport(),
2782 Q_ASSERT( msg && nodeId );
2784 if ( mSerNumOfOriginalMessage != 0 ) {
2788 if ( folder && index != -1 )
2789 *msg = folder->
getMsg( index );
2792 kdWarning( 5006 ) <<
"Unable to find the original message, aborting attachment deletion!" << endl;
2796 *nodeId = node->nodeId() + mNodeIdOffset;
2799 *nodeId = node->nodeId();
2804 void KMReaderWin::slotDeleteAttachment(partNode * node)
2806 if ( KMessageBox::warningContinueCancel(
this,
2807 i18n(
"Deleting an attachment might invalidate any digital signature on this message."),
2808 i18n(
"Delete Attachment"), KStdGuiItem::del(),
"DeleteAttachmentSignatureWarning" )
2809 != KMessageBox::Continue ) {
2815 fillCommandInfo( node, &msg, &nodeId );
2816 if ( msg && nodeId != -1 ) {
2817 KMDeleteAttachmentCommand* command =
new KMDeleteAttachmentCommand( nodeId, msg,
this );
2819 connect( command, TQT_SIGNAL( completed( KMCommand * ) ),
2820 TQT_TQOBJECT(
this), TQT_SLOT( updateReaderWin() ) );
2821 connect( command, TQT_SIGNAL( completed( KMCommand * ) ),
2822 TQT_TQOBJECT(
this), TQT_SLOT( disconnectMsgAdded() ) );
2830 connect( headers, TQT_SIGNAL( msgAddedToListView( TQListViewItem* ) ),
2831 TQT_TQOBJECT(
this), TQT_SLOT( msgAdded( TQListViewItem* ) ) );
2835 if ( mSerNumOfOriginalMessage != 0 && message() ) {
2836 message()->deleteBodyPart( node->nodeId() );
2841 void KMReaderWin::msgAdded( TQListViewItem *item )
2846 disconnectMsgAdded();
2848 headers->setCurrentItem( item );
2849 headers->clearSelection();
2856 disconnect( headers, TQT_SIGNAL( msgAddedToListView( TQListViewItem* ) ),
2857 TQT_TQOBJECT(
this), TQT_SLOT( msgAdded( TQListViewItem* ) ) );
2860 void KMReaderWin::slotEditAttachment(partNode * node)
2862 if ( KMessageBox::warningContinueCancel(
this,
2863 i18n(
"Modifying an attachment might invalidate any digital signature on this message."),
2864 i18n(
"Edit Attachment"), KGuiItem( i18n(
"Edit"),
"edit" ),
"EditAttachmentSignatureWarning" )
2865 != KMessageBox::Continue ) {
2871 fillCommandInfo( node, &msg, &nodeId );
2872 if ( msg && nodeId != -1 ) {
2873 KMEditAttachmentCommand* command =
new KMEditAttachmentCommand( nodeId, msg,
this );
2880 KMail::CSSHelper* KMReaderWin::cssHelper()
2887 if ( !GlobalSettings::self()->alwaysDecrypt() )
2888 return mDecrytMessageOverwrite;
2894 DOM::Document doc = mViewer->htmlDocument();
2897 mViewer->gotoAnchor( TQString::fromLatin1(
"att%1" ).arg( node->nodeId() ) );
2900 const partNode *root = node->topLevelParent();
2901 for (
int i = 0; i <= root->totalChildCount() + 1; i++ ) {
2902 DOM::Element attachmentDiv = doc.getElementById( TQString(
"attachmentDiv%1" ).arg( i + 1 ) );
2903 if ( !attachmentDiv.isNull() )
2904 attachmentDiv.removeAttribute(
"style" );
2908 if ( node->isDisplayedHidden() )
2914 DOM::Element attachmentDiv = doc.getElementById( TQString(
"attachmentDiv%1" ).arg( node->nodeId() ) );
2915 if ( attachmentDiv.isNull() ) {
2916 kdWarning( 5006 ) <<
"Could not find attachment div for attachment " << node->nodeId() << endl;
2920 attachmentDiv.setAttribute(
"style", TQString(
"border:2px solid %1" )
2921 .arg( cssHelper()->pgpWarnColor().name() ) );
2925 doc.updateRendering();
2928 void KMReaderWin::injectAttachments()
2932 DOM::Document doc = mViewer->htmlDocument();
2933 DOM::Element injectionPoint = doc.getElementById(
"attachmentInjectionPoint" );
2934 if ( injectionPoint.isNull() )
2937 TQString imgpath( locate(
"data",
"kmail/pics/") );
2938 TQString visibility;
2941 if( !showAttachmentQuicklist() ) {
2942 urlHandle.append(
"kmail:showAttachmentQuicklist" );
2943 imgSrc.append(
"attachmentQuicklistClosed.png" );
2945 urlHandle.append(
"kmail:hideAttachmentQuicklist" );
2946 imgSrc.append(
"attachmentQuicklistOpened.png" );
2949 TQString html = renderAttachments( mRootNode, TQApplication::palette().active().background() );
2950 if ( html.isEmpty() )
2954 if ( headerStyle() == HeaderStyle::fancy() ) {
2955 link +=
"<div style=\"text-align: left;\"><a href=\"" + urlHandle +
"\"><img src=\"" +
2956 imgpath + imgSrc +
"\"/></a></div>";
2957 html.prepend( link );
2958 html.prepend( TQString::fromLatin1(
"<div style=\"float:left;\">%1 </div>" ).
2959 arg( i18n(
"Attachments:" ) ) );
2961 link +=
"<div style=\"text-align: right;\"><a href=\"" + urlHandle +
"\"><img src=\"" +
2962 imgpath + imgSrc +
"\"/></a></div>";
2963 html.prepend( link );
2966 assert( injectionPoint.tagName() ==
"div" );
2967 static_cast<DOM::HTMLElement
>( injectionPoint ).setInnerHTML( html );
2970 static TQColor nextColor(
const TQColor & c )
2973 c.hsv( &h, &s, &v );
2974 return TQColor( (h + 50) % 360, TQMAX(s, 64), v, TQColor::Hsv );
2977 TQString KMReaderWin::renderAttachments(partNode * node,
const TQColor &bgColor )
2983 if ( node->firstChild() ) {
2984 TQString subHtml = renderAttachments( node->firstChild(), nextColor( bgColor ) );
2985 if ( !subHtml.isEmpty() ) {
2987 TQString visibility;
2988 if ( !showAttachmentQuicklist() ) {
2989 visibility.append(
"display:none;" );
2993 if ( node != mRootNode || headerStyle() != HeaderStyle::enterprise() )
2994 margin =
"padding:2px; margin:2px; ";
2995 TQString align =
"left";
2996 if ( headerStyle() == HeaderStyle::enterprise() )
2998 if ( node->msgPart().typeStr().lower() ==
"message" || node == mRootNode )
2999 html += TQString::fromLatin1(
"<div style=\"background:%1; %2" 3000 "vertical-align:middle; float:%3; %4\">").arg( bgColor.name() ).arg( margin )
3001 .arg( align ).arg( visibility );
3003 if ( node->msgPart().typeStr().lower() ==
"message" || node == mRootNode )
3007 partNode::AttachmentDisplayInfo info = node->attachmentDisplayInfo();
3008 if ( info.displayInHeader ) {
3009 html +=
"<div style=\"float:left;\">";
3010 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() );
3011 TQString fileName = writeMessagePartToTempFile( &node->msgPart(), node->nodeId() );
3012 TQString href = node->asHREF(
"header" );
3013 html += TQString::fromLatin1(
"<a href=\"" ) + href +
3014 TQString::fromLatin1(
"\">" );
3015 html +=
"<img style=\"vertical-align:middle;\" src=\"" + info.icon +
"\"/> ";
3016 if ( headerStyle() == HeaderStyle::enterprise() ) {
3017 TQFont bodyFont = mCSSHelper->bodyFont( isFixedFont() );
3018 TQFontMetrics fm( bodyFont );
3019 html += KStringHandler::rPixelSqueeze( info.label, fm, 140 );
3020 }
else if ( headerStyle() == HeaderStyle::fancy() ) {
3021 TQFont bodyFont = mCSSHelper->bodyFont( isFixedFont() );
3022 TQFontMetrics fm( bodyFont );
3023 html += KStringHandler::rPixelSqueeze( info.label, fm, 640 );
3027 html +=
"</a></span></div> ";
3031 html += renderAttachments( node->nextSibling(), nextColor ( bgColor ) );
3037 void KMReaderWin::setBodyPartMemento(
const partNode * node,
const TQCString & which,
BodyPartMemento * memento )
3039 const TQCString index = node->path() +
':' + which.lower();
3041 const std::map<TQCString,BodyPartMemento*>::iterator it = mBodyPartMementoMap.lower_bound( index );
3042 if ( it != mBodyPartMementoMap.end() && it->first == index ) {
3044 if ( memento && memento == it->second )
3050 it->second = memento;
3053 mBodyPartMementoMap.erase( it );
3058 mBodyPartMementoMap.insert( it, std::make_pair( index, memento ) );
3066 BodyPartMemento * KMReaderWin::bodyPartMemento(
const partNode * node,
const TQCString & which )
const 3068 const TQCString index = node->path() +
':' + which.lower();
3069 const std::map<TQCString,BodyPartMemento*>::const_iterator it = mBodyPartMementoMap.find( index );
3070 if ( it == mBodyPartMementoMap.end() ) {
3084 void KMReaderWin::clearBodyPartMementos()
3086 for ( std::map<TQCString,BodyPartMemento*>::const_iterator it = mBodyPartMementoMap.begin(), end = mBodyPartMementoMap.end() ; it != end ; ++it )
3091 detach_and_delete( it->second,
this );
3093 mBodyPartMementoMap.clear();
3096 #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.
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...
static int msgPartFromUrl(const KURL &url)
Returns id of message part from given URL or -1 if invalid.
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.
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.
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.
TQCString contentTransferEncodingStr() const
Get or set the 'Content-Transfer-Encoding' header field The member functions that involve enumerated ...
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.
bool decryptMessage() const
Returns wether the message should be decryted.
void setOverrideEncoding(const TQString &encoding)
Set the override character encoding.
TQString msgId() const
Get or set the 'Message-Id' header field.
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...
void selectAll()
Select message body.
void setMsgSerNum(unsigned long newMsgSerNum=0)
Sets the message serial number.
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.
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.
size_t msgSize() const
Get/set size of message in the folder including the whole header in bytes.
virtual void printMsg(void)
Print current message.
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.
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.
TQString subject() const
Get or set the 'Subject' header field.
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.
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.
int pointsToPixel(int pointSize) const
Calculate the pixel size.
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.
KMMessage * message(KMFolder **folder=0) const
Returns the current message or 0 if none.
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.
const TQTextCodec * overrideCodec() const
Get codec corresponding to the currently selected override character encoding.
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.
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 writeConfig(bool withSync=true) const
Write settings to app's config file.
KMMsgSignatureState signatureState() const
Signature status of the message.
void update(KMail::Interface::Observable *)
void setOverrideCodec(const TQTextCodec *codec)
Set the charset the user selected for the message to display.
DwHeaders & headers() const
get the DwHeaders (make sure to call setNeedsAssembly() function after directly modyfying internal da...
bool readyToShow() const
Return if the message is ready to be shown.
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 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.