1 /*
2   This file is part of KMail, the KDE mail client.
3   SPDX-FileCopyrightText: 2011-2021 Laurent Montel <montel@kde.org>
4 
5   SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 #include "messagelistutil.h"
8 #include "messagelistsettings.h"
9 #include "messagelistutil_p.h"
10 
11 #include <Akonadi/Item>
12 #include <KColorScheme>
13 #include <KConfigGroup>
14 #include <KLocalizedString>
15 #include <KMime/Message>
16 #include <QIcon>
17 #include <QMenu>
18 
messageSortingConfigName()19 QString MessageList::Util::messageSortingConfigName()
20 {
21     return QStringLiteral("MessageSorting");
22 }
23 
messageSortDirectionConfigName()24 QString MessageList::Util::messageSortDirectionConfigName()
25 {
26     return QStringLiteral("MessageSortDirection");
27 }
28 
groupSortingConfigName()29 QString MessageList::Util::groupSortingConfigName()
30 {
31     return QStringLiteral("GroupSorting");
32 }
33 
groupSortDirectionConfigName()34 QString MessageList::Util::groupSortDirectionConfigName()
35 {
36     return QStringLiteral("GroupSortDirection");
37 }
38 
messageUniqueIdConfigName()39 QString MessageList::Util::messageUniqueIdConfigName()
40 {
41     return QStringLiteral("MessageUniqueIdForStorageModel%1");
42 }
43 
storageModelSortOrderGroup()44 QString MessageList::Util::storageModelSortOrderGroup()
45 {
46     return QStringLiteral("MessageListView::StorageModelSortOrder");
47 }
48 
storageModelThemesGroup()49 QString MessageList::Util::storageModelThemesGroup()
50 {
51     return QStringLiteral("MessageListView::StorageModelThemes");
52 }
53 
storageModelAggregationsGroup()54 QString MessageList::Util::storageModelAggregationsGroup()
55 {
56     return QStringLiteral("MessageListView::StorageModelAggregations");
57 }
58 
setForStorageModelConfigName()59 QString MessageList::Util::setForStorageModelConfigName()
60 {
61     return QStringLiteral("SetForStorageModel%1");
62 }
63 
storageModelSelectedMessageGroup()64 QString MessageList::Util::storageModelSelectedMessageGroup()
65 {
66     return QStringLiteral("MessageListView::StorageModelSelectedMessages");
67 }
68 
deleteConfig(const QString & collectionId)69 void MessageList::Util::deleteConfig(const QString &collectionId)
70 {
71     KConfigGroup confselectedMessage(MessageListSettings::self()->config(), MessageList::Util::storageModelSelectedMessageGroup());
72     confselectedMessage.deleteEntry(MessageList::Util::messageUniqueIdConfigName().arg(collectionId));
73 
74     KConfigGroup storageModelOrder(MessageListSettings::self()->config(), MessageList::Util::storageModelSortOrderGroup());
75     storageModelOrder.deleteEntry(collectionId + groupSortDirectionConfigName());
76     storageModelOrder.deleteEntry(collectionId + groupSortingConfigName());
77     storageModelOrder.deleteEntry(collectionId + messageSortDirectionConfigName());
78     storageModelOrder.deleteEntry(collectionId + messageSortingConfigName());
79 
80     KConfigGroup storageModelTheme(MessageListSettings::self()->config(), MessageList::Util::storageModelThemesGroup());
81     storageModelTheme.deleteEntry(collectionId + setForStorageModelConfigName());
82 
83     KConfigGroup storageModelAggregation(MessageListSettings::self()->config(), MessageList::Util::storageModelAggregationsGroup());
84     storageModelAggregation.deleteEntry(collectionId + setForStorageModelConfigName());
85 }
86 
unreadDefaultMessageColor()87 QColor MessageList::Util::unreadDefaultMessageColor()
88 {
89     return KColorScheme(QPalette::Active).foreground(KColorScheme::ActiveText).color();
90 }
91 
importantDefaultMessageColor()92 QColor MessageList::Util::importantDefaultMessageColor()
93 {
94     return KColorScheme(QPalette::Active).foreground(KColorScheme::NeutralText).color();
95 }
96 
todoDefaultMessageColor()97 QColor MessageList::Util::todoDefaultMessageColor()
98 {
99     return KColorScheme(QPalette::Active).foreground(KColorScheme::PositiveText).color();
100 }
101 
fillViewMenu(QMenu * menu,QObject * receiver)102 void MessageList::Util::fillViewMenu(QMenu *menu, QObject *receiver)
103 {
104     auto sortingMenu = new QMenu(i18n("Sorting"), menu);
105     sortingMenu->setIcon(QIcon::fromTheme(QStringLiteral("view-sort-ascending")));
106     menu->addMenu(sortingMenu);
107     QObject::connect(sortingMenu, SIGNAL(aboutToShow()), receiver, SLOT(sortOrderMenuAboutToShow()));
108 
109     auto aggregationMenu = new QMenu(i18n("Aggregation"), menu);
110     aggregationMenu->setIcon(QIcon::fromTheme(QStringLiteral("view-process-tree")));
111     menu->addMenu(aggregationMenu);
112     QObject::connect(aggregationMenu, SIGNAL(aboutToShow()), receiver, SLOT(aggregationMenuAboutToShow()));
113 
114     auto themeMenu = new QMenu(i18n("Theme"), menu);
115     themeMenu->setIcon(QIcon::fromTheme(QStringLiteral("preferences-desktop-theme")));
116     menu->addMenu(themeMenu);
117     QObject::connect(themeMenu, SIGNAL(aboutToShow()), receiver, SLOT(themeMenuAboutToShow()));
118 }
119 
contentSummary(const Akonadi::Item & item)120 QString MessageList::Util::contentSummary(const Akonadi::Item &item)
121 {
122     if (!item.hasPayload<KMime::Message::Ptr>()) {
123         return QString();
124     }
125 
126     auto message = item.payload<KMime::Message::Ptr>();
127     KMime::Content *textContent = message->textContent();
128     if (!textContent) {
129         return QString();
130     }
131     const QString content = textContent->decodedText(true, true);
132     if (content.isEmpty()) {
133         return QString();
134     }
135 
136     // Extract the first 5 non-empty, non-quoted lines from the content and return it
137     int numLines = 0;
138     const int maxLines = 5;
139     const QStringList lines = content.split(QLatin1Char('\n'));
140     if (lines.isEmpty()) {
141         return QString();
142     }
143     if (lines.count() == 1 && content.length() > 100) {
144         return content.left(100);
145     }
146     QString ret;
147     for (const QString &line : lines) {
148         const QString lineTrimmed = line.trimmed();
149         const bool isQuoted = lineTrimmed.startsWith(QLatin1Char('>')) || lineTrimmed.startsWith(QLatin1Char('|'));
150         if (!isQuoted && !lineTrimmed.isEmpty()) {
151             ret += line + QLatin1Char('\n');
152             numLines++;
153             if (numLines >= maxLines) {
154                 break;
155             }
156         }
157     }
158     return ret.toHtmlEscaped();
159 }
160