1 /*
2     csshelper.cpp
3 
4     This file is part of KMail, the KDE mail client.
5     SPDX-FileCopyrightText: 2003 Marc Mutz <mutz@kde.org>
6 
7     SPDX-License-Identifier: GPL-2.0-or-later
8 */
9 
10 #include "csshelper.h"
11 #include "settings/messageviewersettings.h"
12 
13 #include <MessageCore/ColorUtil>
14 #include <MessageCore/MessageCoreSettings>
15 
16 #include <KColorScheme>
17 #include <KConfig>
18 #include <KConfigGroup>
19 #include <QApplication>
20 
21 #include <QFont>
22 #include <QPalette>
23 
24 using namespace MessageViewer;
25 
26 static const struct {
27     CSSHelperBase::InlineMessageType type;
28     KColorScheme::ForegroundRole role;
29 } inlineMessageColors[] = {{CSSHelperBase::Positive, KColorScheme::PositiveText},
30                            {CSSHelperBase::Information, KColorScheme::ActiveText},
31                            {CSSHelperBase::Warning, KColorScheme::NeutralText},
32                            {CSSHelperBase::Error, KColorScheme::NegativeText}};
33 
CSSHelper(const QPaintDevice * pd)34 CSSHelper::CSSHelper(const QPaintDevice *pd)
35     : CSSHelperBase(pd)
36 {
37     // initialize with defaults - should match the corresponding application defaults
38     mForegroundColor = QApplication::palette().color(QPalette::Text);
39     mLinkColor = MessageCore::ColorUtil::self()->linkColor();
40     mBackgroundColor = QApplication::palette().color(QPalette::Base);
41     for (const auto &msgColor : inlineMessageColors) {
42         cInlineMessage[msgColor.type] = KColorScheme(QPalette::Active).foreground(msgColor.role).color();
43     }
44 
45     cPgpEncrH = MessageCore::ColorUtil::self()->pgpEncryptedMessageColor();
46     cPgpEncrHT = MessageCore::ColorUtil::self()->pgpEncryptedTextColor();
47     cPgpOk1H = MessageCore::ColorUtil::self()->pgpSignedTrustedMessageColor();
48     cPgpOk1HT = MessageCore::ColorUtil::self()->pgpSignedTrustedTextColor();
49     cPgpOk0H = MessageCore::ColorUtil::self()->pgpSignedUntrustedMessageColor();
50     cPgpOk0HT = MessageCore::ColorUtil::self()->pgpSignedUntrustedTextColor();
51     cPgpWarnH = MessageCore::ColorUtil::self()->pgpSignedUntrustedMessageColor();
52     cPgpWarnHT = MessageCore::ColorUtil::self()->pgpSignedUntrustedTextColor();
53     cPgpErrH = MessageCore::ColorUtil::self()->pgpSignedBadMessageColor();
54     cPgpErrHT = MessageCore::ColorUtil::self()->pgpSignedBadTextColor();
55 
56     mRecycleQuoteColors = false;
57 
58     QFont defaultFont = QFontDatabase::systemFont(QFontDatabase::GeneralFont);
59     QFont defaultFixedFont = QFontDatabase::systemFont(QFontDatabase::FixedFont);
60     mBodyFont = MessageCore::MessageCoreSettings::self()->useDefaultFonts() ? defaultFont : MessageViewer ::MessageViewerSettings::self()->bodyFont();
61     mPrintFont = MessageCore::MessageCoreSettings::self()->useDefaultFonts() ? defaultFont : MessageViewer ::MessageViewerSettings::self()->printFont();
62     mFixedFont = mFixedPrintFont = defaultFixedFont;
63     defaultFont.setItalic(true);
64     mQuoteFont = defaultFont;
65 
66     KConfig *config = MessageViewer::MessageViewerSettings::self()->config();
67 
68     KConfigGroup reader(config, "Reader");
69     KConfigGroup fonts(config, "Fonts");
70 
71     mRecycleQuoteColors = reader.readEntry("RecycleQuoteColors", false);
72 
73     mForegroundColor = KColorScheme(QPalette::Active).foreground().color();
74     if (MessageCore::MessageCoreSettings::self()->useDefaultColors()) {
75         mQuoteColor[0] = MessageCore::ColorUtil::self()->quoteLevel1DefaultTextColor();
76         mQuoteColor[1] = MessageCore::ColorUtil::self()->quoteLevel2DefaultTextColor();
77         mQuoteColor[2] = MessageCore::ColorUtil::self()->quoteLevel3DefaultTextColor();
78     } else {
79         mLinkColor = reader.readEntry("LinkColor", mLinkColor);
80         cPgpEncrH = reader.readEntry("PGPMessageEncr", cPgpEncrH);
81         cPgpOk1H = reader.readEntry("PGPMessageOkKeyOk", cPgpOk1H);
82         cPgpOk0H = reader.readEntry("PGPMessageOkKeyBad", cPgpOk0H);
83         cPgpWarnH = reader.readEntry("PGPMessageWarn", cPgpWarnH);
84         cPgpErrH = reader.readEntry("PGPMessageErr", cPgpErrH);
85         mQuoteColor[0] = MessageCore::MessageCoreSettings::self()->quotedText1();
86         mQuoteColor[1] = MessageCore::MessageCoreSettings::self()->quotedText2();
87         mQuoteColor[2] = MessageCore::MessageCoreSettings::self()->quotedText3();
88     }
89 
90     if (!MessageCore::MessageCoreSettings::self()->useDefaultFonts()) {
91         mBodyFont = fonts.readEntry("body-font", mBodyFont);
92         mPrintFont = fonts.readEntry("print-font", mPrintFont);
93         mFixedFont = fonts.readEntry("fixed-font", mFixedFont);
94         mFixedPrintFont = mFixedFont;
95     }
96 
97     mShrinkQuotes = MessageViewer::MessageViewerSettings::self()->shrinkQuotes();
98 
99     mUseBrowserColor = MessageCore::MessageCoreSettings::self()->useRealHtmlMailColor();
100     recalculatePGPColors();
101 }
102 
~CSSHelper()103 CSSHelper::~CSSHelper()
104 {
105 }
106 
htmlHead(bool fixed) const107 QString CSSHelper::htmlHead(bool fixed) const
108 {
109     return QLatin1String(
110                "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n"
111                "<html><head><title></title><style>\n")
112         + cssDefinitions(fixed)
113         + QLatin1String(
114                "</style></head>\n"
115                "<body>\n");
116 }
117 
endBodyHtml() const118 QString CSSHelper::endBodyHtml() const
119 {
120     return QStringLiteral("</body></html>");
121 }
122