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>
27 #include <KLocalizedString>
28 #include <KSharedConfig>
29 #include <KMessageBox>
33 #include <QHBoxLayout>
37 inline QString
archiveMailCollectionPattern()
39 return QStringLiteral("ArchiveMailCollection \\d+");
43 ArchiveMailItem::ArchiveMailItem(QTreeWidget
*parent
)
44 : QTreeWidgetItem(parent
), mInfo(0)
48 ArchiveMailItem::~ArchiveMailItem()
53 void ArchiveMailItem::setInfo(ArchiveMailInfo
*info
)
58 ArchiveMailInfo
*ArchiveMailItem::info() const
63 ArchiveMailWidget::ArchiveMailWidget(QWidget
*parent
)
67 mWidget
= new Ui::ArchiveMailWidget
;
68 mWidget
->setupUi(this);
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
);
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
);
91 ArchiveMailWidget::~ArchiveMailWidget()
96 void ArchiveMailWidget::customContextMenuRequested(const QPoint
&)
98 const QList
<QTreeWidgetItem
*> listItems
= mWidget
->treeWidget
->selectedItems();
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()));
105 menu
.addAction(i18n("Archive now"), this, SLOT(slotArchiveNow()));
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);
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();
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
);
161 void ArchiveMailWidget::createOrUpdateItem(ArchiveMailInfo
*info
, ArchiveMailItem
*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
);
173 item
->setBackgroundColor(ArchiveMailWidget::NextArchive
, Qt::green
);
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
));
184 if (info
->isEnabled()) {
185 item
->setBackgroundColor(ArchiveMailWidget::NextArchive
, Qt::red
);
187 item
->setBackgroundColor(ArchiveMailWidget::NextArchive
, Qt::lightGray
);
190 item
->setToolTip(ArchiveMailWidget::NextArchive
, i18n("Archive will be done %1", QLocale().toString(diffDate
, QLocale::ShortFormat
)));
194 void ArchiveMailWidget::save()
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
);
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
) {
227 Q_FOREACH (QTreeWidgetItem
*item
, listItems
) {
234 void ArchiveMailWidget::slotModifyItem()
236 const QList
<QTreeWidgetItem
*> listItems
= mWidget
->treeWidget
->selectedItems();
237 if (listItems
.count() == 1) {
238 QTreeWidgetItem
*item
= listItems
.at(0);
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
);
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"));
262 createOrUpdateItem(info
);
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()) {
285 void ArchiveMailWidget::slotOpenFolder()
287 const QList
<QTreeWidgetItem
*> listItems
= mWidget
->treeWidget
->selectedItems();
288 if (listItems
.count() == 1) {
289 QTreeWidgetItem
*item
= listItems
.first();
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();
311 ArchiveMailItem
*archiveItem
= static_cast<ArchiveMailItem
*>(item
);
312 ArchiveMailInfo
*archiveItemInfo
= archiveItem
->info();
314 if (archiveItemInfo
) {
315 Q_EMIT
archiveNow(archiveItemInfo
);
320 void ArchiveMailWidget::slotItemChanged(QTreeWidgetItem
*item
, int col
)
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
);
328 } else if (col
== ArchiveMailWidget::NextArchive
) {
329 updateDiffDate(archiveItem
, archiveItem
->info());