Align elements
[kdepim.git] / agents / archivemailagent / archivemailwidget.cpp
blob35d953d35f658ffe42f1c935c97e8932670fe784
1 /*
2 Copyright (c) 2015 Montel Laurent <montel@kde.org>
4 This program is free software; you can redistribute it and/or modify it
5 under the terms of the GNU General Public License, version 2, as
6 published by the Free Software Foundation.
8 This program is distributed in the hope that it will be useful, but
9 WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 General Public License for more details.
13 You should have received a copy of the GNU General Public License along
14 with this program; if not, write to the Free Software Foundation, Inc.,
15 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 #include "archivemailwidget.h"
19 #include "addarchivemaildialog.h"
20 #include "archivemailagentutil.h"
22 #include "kdepim-version.h"
24 #include <MailCommon/MailUtil>
26 #include <QLocale>
27 #include <KLocalizedString>
28 #include <KSharedConfig>
29 #include <KMessageBox>
30 #include <QMenu>
31 #include <KRun>
33 #include <QHBoxLayout>
35 namespace
37 inline QString archiveMailCollectionPattern()
39 return QStringLiteral("ArchiveMailCollection \\d+");
43 ArchiveMailItem::ArchiveMailItem(QTreeWidget *parent)
44 : QTreeWidgetItem(parent), mInfo(0)
48 ArchiveMailItem::~ArchiveMailItem()
50 delete mInfo;
53 void ArchiveMailItem::setInfo(ArchiveMailInfo *info)
55 mInfo = info;
58 ArchiveMailInfo *ArchiveMailItem::info() const
60 return mInfo;
63 ArchiveMailWidget::ArchiveMailWidget(QWidget *parent)
64 : QWidget(parent),
65 mChanged(false)
67 mWidget = new Ui::ArchiveMailWidget;
68 mWidget->setupUi(this);
69 QStringList headers;
70 headers << i18n("Name") << i18n("Last archive") << i18n("Next archive in") << i18n("Storage directory");
71 mWidget->treeWidget->setHeaderLabels(headers);
72 mWidget->treeWidget->setObjectName(QStringLiteral("treewidget"));
73 mWidget->treeWidget->setSortingEnabled(true);
74 mWidget->treeWidget->setRootIsDecorated(false);
75 mWidget->treeWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
76 mWidget->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
78 connect(mWidget->treeWidget, &QWidget::customContextMenuRequested,
79 this, &ArchiveMailWidget::customContextMenuRequested);
81 load();
82 connect(mWidget->removeItem, &QAbstractButton::clicked, this, &ArchiveMailWidget::slotRemoveItem);
83 connect(mWidget->modifyItem, &QAbstractButton::clicked, this, &ArchiveMailWidget::slotModifyItem);
84 connect(mWidget->addItem, &QAbstractButton::clicked, this, &ArchiveMailWidget::slotAddItem);
85 connect(mWidget->treeWidget, &QTreeWidget::itemChanged, this, &ArchiveMailWidget::slotItemChanged);
86 connect(mWidget->treeWidget, &QTreeWidget::itemSelectionChanged, this, &ArchiveMailWidget::updateButtons);
87 connect(mWidget->treeWidget, &QTreeWidget::itemDoubleClicked, this, &ArchiveMailWidget::slotModifyItem);
88 updateButtons();
91 ArchiveMailWidget::~ArchiveMailWidget()
93 delete mWidget;
96 void ArchiveMailWidget::customContextMenuRequested(const QPoint &)
98 const QList<QTreeWidgetItem *> listItems = mWidget->treeWidget->selectedItems();
99 QMenu menu;
100 menu.addAction(i18n("Add..."), this, SLOT(slotAddItem()));
101 if (!listItems.isEmpty()) {
102 if (listItems.count() == 1) {
103 menu.addAction(i18n("Open Containing Folder..."), this, SLOT(slotOpenFolder()));
104 menu.addSeparator();
105 menu.addAction(i18n("Archive now"), this, SLOT(slotArchiveNow()));
107 menu.addSeparator();
108 menu.addAction(QIcon::fromTheme(QStringLiteral("edit-delete")), i18n("Delete"), this, SLOT(slotRemoveItem()));
110 menu.exec(QCursor::pos());
113 void ArchiveMailWidget::restoreTreeWidgetHeader(const QByteArray &data)
115 mWidget->treeWidget->header()->restoreState(data);
118 void ArchiveMailWidget::saveTreeWidgetHeader(KConfigGroup &group)
120 group.writeEntry("HeaderState", mWidget->treeWidget->header()->saveState());
123 void ArchiveMailWidget::updateButtons()
125 const QList<QTreeWidgetItem *> listItems = mWidget->treeWidget->selectedItems();
126 if (listItems.isEmpty()) {
127 mWidget->removeItem->setEnabled(false);
128 mWidget->modifyItem->setEnabled(false);
129 } else if (listItems.count() == 1) {
130 mWidget->removeItem->setEnabled(true);
131 mWidget->modifyItem->setEnabled(true);
132 } else {
133 mWidget->removeItem->setEnabled(true);
134 mWidget->modifyItem->setEnabled(false);
138 void ArchiveMailWidget::needReloadConfig()
140 //TODO add messagebox which informs that we save settings here.
141 mWidget->treeWidget->clear();
142 load();
145 void ArchiveMailWidget::load()
147 KSharedConfig::Ptr config = KSharedConfig::openConfig();
148 const QStringList collectionList = config->groupList().filter(QRegularExpression(archiveMailCollectionPattern()));
149 const int numberOfCollection = collectionList.count();
150 for (int i = 0; i < numberOfCollection; ++i) {
151 KConfigGroup group = config->group(collectionList.at(i));
152 ArchiveMailInfo *info = new ArchiveMailInfo(group);
153 if (info->isValid()) {
154 createOrUpdateItem(info);
155 } else {
156 delete info;
161 void ArchiveMailWidget::createOrUpdateItem(ArchiveMailInfo *info, ArchiveMailItem *item)
163 if (!item) {
164 item = new ArchiveMailItem(mWidget->treeWidget);
166 item->setText(ArchiveMailWidget::Name, i18n("Folder: %1", MailCommon::Util::fullCollectionPath(Akonadi::Collection(info->saveCollectionId()))));
167 item->setCheckState(ArchiveMailWidget::Name, info->isEnabled() ? Qt::Checked : Qt::Unchecked);
168 item->setText(ArchiveMailWidget::StorageDirectory, info->url().toLocalFile());
169 if (info->lastDateSaved().isValid()) {
170 item->setText(ArchiveMailWidget::LastArchiveDate, QLocale().toString(info->lastDateSaved(), QLocale::ShortFormat));
171 updateDiffDate(item, info);
172 } else {
173 item->setBackgroundColor(ArchiveMailWidget::NextArchive, Qt::green);
175 item->setInfo(info);
178 void ArchiveMailWidget::updateDiffDate(ArchiveMailItem *item, ArchiveMailInfo *info)
180 const QDate diffDate = ArchiveMailAgentUtil::diffDate(info);
181 const int diff = QDate::currentDate().daysTo(diffDate);
182 item->setText(ArchiveMailWidget::NextArchive, i18np("Tomorrow", "%1 days", diff));
183 if (diff < 0) {
184 if (info->isEnabled()) {
185 item->setBackgroundColor(ArchiveMailWidget::NextArchive, Qt::red);
186 } else {
187 item->setBackgroundColor(ArchiveMailWidget::NextArchive, Qt::lightGray);
189 } else {
190 item->setToolTip(ArchiveMailWidget::NextArchive, i18n("Archive will be done %1", QLocale().toString(diffDate, QLocale::ShortFormat)));
194 void ArchiveMailWidget::save()
196 if (!mChanged) {
197 return;
199 KSharedConfig::Ptr config = KSharedConfig::openConfig();
201 // first, delete all filter groups:
202 const QStringList filterGroups = config->groupList().filter(QRegularExpression(archiveMailCollectionPattern()));
204 foreach (const QString &group, filterGroups) {
205 config->deleteGroup(group);
208 const int numberOfItem(mWidget->treeWidget->topLevelItemCount());
209 for (int i = 0; i < numberOfItem; ++i) {
210 ArchiveMailItem *mailItem = static_cast<ArchiveMailItem *>(mWidget->treeWidget->topLevelItem(i));
211 if (mailItem->info()) {
212 KConfigGroup group = config->group(ArchiveMailAgentUtil::archivePattern.arg(mailItem->info()->saveCollectionId()));
213 mailItem->info()->writeConfig(group);
216 config->sync();
217 config->reparseConfiguration();
220 void ArchiveMailWidget::slotRemoveItem()
222 const QList<QTreeWidgetItem *> listItems = mWidget->treeWidget->selectedItems();
223 if (KMessageBox::warningYesNo(this, i18n("Do you want to delete selected items? Do you want to continue?"), i18n("Remove items")) == KMessageBox::No) {
224 return;
227 Q_FOREACH (QTreeWidgetItem *item, listItems) {
228 delete item;
230 mChanged = true;
231 updateButtons();
234 void ArchiveMailWidget::slotModifyItem()
236 const QList<QTreeWidgetItem *> listItems = mWidget->treeWidget->selectedItems();
237 if (listItems.count() == 1) {
238 QTreeWidgetItem *item = listItems.at(0);
239 if (!item) {
240 return;
242 ArchiveMailItem *archiveItem = static_cast<ArchiveMailItem *>(item);
243 QPointer<AddArchiveMailDialog> dialog = new AddArchiveMailDialog(archiveItem->info(), this);
244 if (dialog->exec()) {
245 ArchiveMailInfo *info = dialog->info();
246 createOrUpdateItem(info, archiveItem);
247 mChanged = true;
249 delete dialog;
253 void ArchiveMailWidget::slotAddItem()
255 QPointer<AddArchiveMailDialog> dialog = new AddArchiveMailDialog(0, this);
256 if (dialog->exec()) {
257 ArchiveMailInfo *info = dialog->info();
258 if (verifyExistingArchive(info)) {
259 KMessageBox::error(this, i18n("Cannot add a second archive for this folder. Modify the existing one instead."), i18n("Add Archive Mail"));
260 delete info;
261 } else {
262 createOrUpdateItem(info);
263 updateButtons();
264 mChanged = true;
267 delete dialog;
270 bool ArchiveMailWidget::verifyExistingArchive(ArchiveMailInfo *info) const
272 const int numberOfItem(mWidget->treeWidget->topLevelItemCount());
273 for (int i = 0; i < numberOfItem; ++i) {
274 ArchiveMailItem *mailItem = static_cast<ArchiveMailItem *>(mWidget->treeWidget->topLevelItem(i));
275 ArchiveMailInfo *archiveItemInfo = mailItem->info();
276 if (archiveItemInfo) {
277 if (info->saveCollectionId() == archiveItemInfo->saveCollectionId()) {
278 return true;
282 return false;
285 void ArchiveMailWidget::slotOpenFolder()
287 const QList<QTreeWidgetItem *> listItems = mWidget->treeWidget->selectedItems();
288 if (listItems.count() == 1) {
289 QTreeWidgetItem *item = listItems.first();
290 if (!item) {
291 return;
293 ArchiveMailItem *archiveItem = static_cast<ArchiveMailItem *>(item);
294 ArchiveMailInfo *archiveItemInfo = archiveItem->info();
295 if (archiveItemInfo) {
296 const QUrl url = archiveItemInfo->url();
297 KRun *runner = new KRun(url, this); // will delete itself
298 runner->setRunExecutables(false);
303 void ArchiveMailWidget::slotArchiveNow()
305 const QList<QTreeWidgetItem *> listItems = mWidget->treeWidget->selectedItems();
306 if (listItems.count() == 1) {
307 QTreeWidgetItem *item = listItems.first();
308 if (!item) {
309 return;
311 ArchiveMailItem *archiveItem = static_cast<ArchiveMailItem *>(item);
312 ArchiveMailInfo *archiveItemInfo = archiveItem->info();
313 save();
314 if (archiveItemInfo) {
315 Q_EMIT archiveNow(archiveItemInfo);
320 void ArchiveMailWidget::slotItemChanged(QTreeWidgetItem *item, int col)
322 if (item) {
323 ArchiveMailItem *archiveItem = static_cast<ArchiveMailItem *>(item);
324 if (archiveItem->info()) {
325 if (col == ArchiveMailWidget::Name) {
326 archiveItem->info()->setEnabled(archiveItem->checkState(ArchiveMailWidget::Name) == Qt::Checked);
327 mChanged = true;
328 } else if (col == ArchiveMailWidget::NextArchive) {
329 updateDiffDate(archiveItem, archiveItem->info());