Changeset View
Changeset View
Standalone View
Standalone View
messageviewer/src/messagepartthemes/default/defaultrenderer.cpp
Show All 27 Lines | |||||
28 | #include "messagepartrendererfactory.h" | 28 | #include "messagepartrendererfactory.h" | ||
29 | #include "htmlblock.h" | 29 | #include "htmlblock.h" | ||
30 | 30 | | |||
31 | #include "utils/iconnamecache.h" | 31 | #include "utils/iconnamecache.h" | ||
32 | #include "utils/mimetype.h" | 32 | #include "utils/mimetype.h" | ||
33 | #include "viewer/csshelperbase.h" | 33 | #include "viewer/csshelperbase.h" | ||
34 | #include "messagepartrenderermanager.h" | 34 | #include "messagepartrenderermanager.h" | ||
35 | 35 | | |||
36 | #include <MimeTreeParser/AttachmentStrategy> | ||||
36 | #include <MimeTreeParser/BufferedHtmlWriter> | 37 | #include <MimeTreeParser/BufferedHtmlWriter> | ||
37 | #include <MimeTreeParser/MessagePart> | 38 | #include <MimeTreeParser/MessagePart> | ||
38 | #include <MimeTreeParser/ObjectTreeParser> | 39 | #include <MimeTreeParser/ObjectTreeParser> | ||
39 | #include <GrantleeTheme/QtResourceTemplateLoader> | 40 | #include <GrantleeTheme/QtResourceTemplateLoader> | ||
40 | 41 | | |||
41 | #include <QGpgME/Protocol> | 42 | #include <QGpgME/Protocol> | ||
42 | 43 | | |||
43 | #include <MessageCore/StringUtil> | 44 | #include <MessageCore/StringUtil> | ||
▲ Show 20 Lines • Show All 259 Lines • ▼ Show 20 Line(s) | 289 | { | |||
303 | 304 | | |||
304 | // body | 305 | // body | ||
305 | s = s.replace(QRegExp(QStringLiteral("<body[^>]*>"), Qt::CaseInsensitive), QString()).trimmed(); | 306 | s = s.replace(QRegExp(QStringLiteral("<body[^>]*>"), Qt::CaseInsensitive), QString()).trimmed(); | ||
306 | s = s.replace(QRegExp(QStringLiteral("</html>$"), Qt::CaseInsensitive), QString()).trimmed(); | 307 | s = s.replace(QRegExp(QStringLiteral("</html>$"), Qt::CaseInsensitive), QString()).trimmed(); | ||
307 | s = s.replace(QRegExp(QStringLiteral("</body>$"), Qt::CaseInsensitive), QString()).trimmed(); | 308 | s = s.replace(QRegExp(QStringLiteral("</body>$"), Qt::CaseInsensitive), QString()).trimmed(); | ||
308 | return s; | 309 | return s; | ||
309 | } | 310 | } | ||
310 | 311 | | |||
311 | DefaultRendererPrivate::DefaultRendererPrivate(const MessagePart::Ptr &msgPart, CSSHelperBase *cssHelper, HtmlWriter *writer, const MessagePartRendererFactory *rendererFactory) | 312 | DefaultRendererPrivate::DefaultRendererPrivate(const MessagePart::Ptr &msgPart, CSSHelperBase *cssHelper, HtmlWriter *writer, const MessagePartRendererFactory *rendererFactory, bool showOnlyOneMimePart) | ||
312 | : mMsgPart(msgPart) | 313 | : mMsgPart(msgPart) | ||
313 | , mCSSHelper(cssHelper) | 314 | , mCSSHelper(cssHelper) | ||
314 | , mRendererFactory(rendererFactory) | 315 | , mRendererFactory(rendererFactory) | ||
316 | , mShowOnlyOneMimePart(showOnlyOneMimePart) | ||||
315 | { | 317 | { | ||
316 | renderFactory(mMsgPart, writer); | 318 | renderFactory(mMsgPart, writer); | ||
317 | } | 319 | } | ||
318 | 320 | | |||
319 | DefaultRendererPrivate::~DefaultRendererPrivate() | 321 | DefaultRendererPrivate::~DefaultRendererPrivate() | ||
320 | { | 322 | { | ||
321 | } | 323 | } | ||
322 | 324 | | |||
▲ Show 20 Lines • Show All 573 Lines • ▼ Show 20 Line(s) | 897 | if (mp) { | |||
896 | render(mp, htmlWriter); | 898 | render(mp, htmlWriter); | ||
897 | } | 899 | } | ||
898 | } else { | 900 | } else { | ||
899 | qCWarning(MESSAGEVIEWER_LOG) << "We got a unkonwn classname, using default behaviour for " | 901 | qCWarning(MESSAGEVIEWER_LOG) << "We got a unkonwn classname, using default behaviour for " | ||
900 | << className; | 902 | << className; | ||
901 | } | 903 | } | ||
902 | } | 904 | } | ||
903 | 905 | | |||
904 | DefaultRenderer::DefaultRenderer(const MimeTreeParser::MessagePart::Ptr &msgPart, CSSHelperBase *cssHelper, MimeTreeParser::HtmlWriter *writer) | 906 | bool DefaultRendererPrivate::isHiddenHint(const MimeTreeParser::MessagePart::Ptr &msgPart) | ||
905 | : d(new MimeTreeParser::DefaultRendererPrivate(msgPart, cssHelper, writer, MessagePartRendererFactory::instance())) | 907 | { | ||
908 | auto mp = msgPart.dynamicCast<MimeTreeParser::AttachmentMessagePart>(); | ||||
909 | auto content = msgPart->content(); | ||||
910 | | ||||
911 | if (!mp) { | ||||
912 | auto _mp = msgPart.dynamicCast<MimeTreeParser::TextMessagePart>(); | ||||
913 | if (_mp) { | ||||
914 | return msgPart->nodeHelper()->isNodeDisplayedHidden(content); | ||||
915 | } else { | ||||
916 | return false; | ||||
917 | } | ||||
918 | } | ||||
919 | | ||||
920 | if (mShowOnlyOneMimePart) { | ||||
921 | return false; | ||||
922 | } | ||||
923 | | ||||
924 | const AttachmentStrategy *const as = msgPart->source()->attachmentStrategy(); | ||||
925 | const bool defaultHidden(as && as->defaultDisplay(content) == AttachmentStrategy::None); | ||||
926 | auto preferredMode = source()->preferredMode(); | ||||
927 | bool isHtmlPreferred = (preferredMode == Util::Html) || (preferredMode == Util::MultipartHtml); | ||||
928 | | ||||
929 | QByteArray mediaType("text"); | ||||
930 | if (content->contentType(false) && !content->contentType()->mediaType().isEmpty() | ||||
931 | && !content->contentType()->subType().isEmpty()) { | ||||
932 | mediaType = content->contentType()->mediaType(); | ||||
933 | } | ||||
934 | const bool isTextPart = (mediaType == QByteArrayLiteral("text")); | ||||
935 | | ||||
936 | bool defaultAsIcon = true; | ||||
937 | if (!mp->neverDisplayInline()) { | ||||
938 | if (as) { | ||||
939 | defaultAsIcon = as->defaultDisplay(content) == AttachmentStrategy::AsIcon; | ||||
940 | } | ||||
941 | } | ||||
942 | | ||||
943 | // neither image nor text -> show as icon | ||||
944 | if (!mp->isImage() && !isTextPart) { | ||||
945 | defaultAsIcon = true; | ||||
946 | } | ||||
947 | | ||||
948 | bool hidden(false); | ||||
949 | if (isTextPart) { | ||||
950 | hidden = defaultHidden; | ||||
951 | } else { | ||||
952 | if (mp->isImage() && isHtmlPreferred | ||||
953 | && content->parent() && content->parent()->contentType(false)->subType() == "related") { | ||||
954 | hidden = true; | ||||
955 | } else { | ||||
956 | hidden = defaultHidden && content->parent(); | ||||
957 | hidden |= defaultAsIcon && defaultHidden; | ||||
958 | } | ||||
959 | } | ||||
960 | msgPart->nodeHelper()->setNodeDisplayedHidden(content, hidden); | ||||
961 | return hidden; | ||||
962 | } | ||||
963 | | ||||
964 | MimeTreeParser::IconType MimeTreeParser::DefaultRendererPrivate::displayHint(const MimeTreeParser::MessagePart::Ptr& msgPart) | ||||
965 | { | ||||
966 | auto mp = msgPart.dynamicCast<MimeTreeParser::AttachmentMessagePart>(); | ||||
967 | auto content = msgPart->content(); | ||||
968 | if (!mp) { | ||||
969 | return MimeTreeParser::IconType::NoIcon; | ||||
970 | } | ||||
971 | const AttachmentStrategy *const as = msgPart->source()->attachmentStrategy(); | ||||
972 | const bool defaultHidden(as && as->defaultDisplay(content) == AttachmentStrategy::None); | ||||
973 | const bool showOnlyOneMimePart(mShowOnlyOneMimePart); | ||||
974 | auto preferredMode = source()->preferredMode(); | ||||
975 | bool isHtmlPreferred = (preferredMode == Util::Html) || (preferredMode == Util::MultipartHtml); | ||||
976 | | ||||
977 | QByteArray mediaType("text"); | ||||
978 | if (content->contentType(false) && !content->contentType()->mediaType().isEmpty() | ||||
979 | && !content->contentType()->subType().isEmpty()) { | ||||
980 | mediaType = content->contentType()->mediaType(); | ||||
981 | } | ||||
982 | const bool isTextPart = (mediaType == QByteArrayLiteral("text")); | ||||
983 | | ||||
984 | bool defaultAsIcon = true; | ||||
985 | if (!mp->neverDisplayInline()) { | ||||
986 | if (as) { | ||||
987 | defaultAsIcon = as->defaultDisplay(content) == AttachmentStrategy::AsIcon; | ||||
988 | } | ||||
989 | } | ||||
990 | if (mp->isImage() && showOnlyOneMimePart && !mp->neverDisplayInline()) { | ||||
991 | defaultAsIcon = false; | ||||
992 | } | ||||
993 | | ||||
994 | // neither image nor text -> show as icon | ||||
995 | if (!mp->isImage() && !isTextPart) { | ||||
996 | defaultAsIcon = true; | ||||
997 | } | ||||
998 | | ||||
999 | if (isTextPart) { | ||||
1000 | if (as && as->defaultDisplay(content) != AttachmentStrategy::Inline) { | ||||
1001 | return MimeTreeParser::IconExternal; | ||||
1002 | } | ||||
1003 | return MimeTreeParser::NoIcon; | ||||
1004 | } else { | ||||
1005 | if (mp->isImage() && isHtmlPreferred | ||||
1006 | && content->parent() && content->parent()->contentType(false)->subType() == "related") { | ||||
1007 | return MimeTreeParser::IconInline; | ||||
1008 | } | ||||
1009 | | ||||
1010 | if (defaultHidden && !showOnlyOneMimePart && content->parent()) { | ||||
1011 | return MimeTreeParser::IconInline; | ||||
1012 | } | ||||
1013 | | ||||
1014 | if (defaultAsIcon) { | ||||
1015 | return MimeTreeParser::IconExternal; | ||||
1016 | } else if (mp->isImage()) { | ||||
1017 | return MimeTreeParser::IconInline; | ||||
1018 | } | ||||
1019 | } | ||||
1020 | | ||||
1021 | return MimeTreeParser::NoIcon; | ||||
1022 | } | ||||
1023 | | ||||
1024 | DefaultRenderer::DefaultRenderer(const MimeTreeParser::MessagePart::Ptr &msgPart, CSSHelperBase *cssHelper, MimeTreeParser::HtmlWriter *writer, bool showOnlyOneMimePart) | ||||
1025 | : d(new MimeTreeParser::DefaultRendererPrivate(msgPart, cssHelper, writer, MessagePartRendererFactory::instance(), showOnlyOneMimePart)) | ||||
906 | { | 1026 | { | ||
907 | } | 1027 | } | ||
908 | 1028 | | |||
909 | DefaultRenderer::~DefaultRenderer() | 1029 | DefaultRenderer::~DefaultRenderer() | ||
910 | { | 1030 | { | ||
911 | delete d; | 1031 | delete d; | ||
912 | } | 1032 | } |