2 Copyright (c) 2012-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 "accountconfigorderdialog.h"
19 #include "mailcommon/mailcommonsettings_base.h"
20 #include "pimcommon/util/pimutil.h"
21 #include "mailcommon/util/mailutil.h"
22 #include "mailcommon_debug.h"
23 #include <KLocalizedString>
24 #include <QPushButton>
25 #include <QVBoxLayout>
28 #include <AkonadiCore/AgentInstance>
29 #include <AkonadiCore/AgentManager>
31 #include <KMime/KMimeMessage>
33 #include <QListWidget>
34 #include <QHBoxLayout>
36 #include <KConfigGroup>
37 #include <QDialogButtonBox>
39 using namespace MailCommon
;
41 struct InstanceStruct
{
46 AccountConfigOrderDialog::AccountConfigOrderDialog(QWidget
*parent
)
49 setWindowTitle(i18n("Edit Accounts Order"));
50 QDialogButtonBox
*buttonBox
= new QDialogButtonBox(QDialogButtonBox::Ok
| QDialogButtonBox::Cancel
);
51 QVBoxLayout
*mainLayout
= new QVBoxLayout
;
52 setLayout(mainLayout
);
53 QPushButton
*okButton
= buttonBox
->button(QDialogButtonBox::Ok
);
54 okButton
->setDefault(true);
55 okButton
->setShortcut(Qt::CTRL
| Qt::Key_Return
);
56 connect(buttonBox
, &QDialogButtonBox::accepted
, this, &AccountConfigOrderDialog::accept
);
57 connect(buttonBox
, &QDialogButtonBox::rejected
, this, &AccountConfigOrderDialog::reject
);
58 okButton
->setDefault(true);
60 QWidget
*page
= new QWidget(this);
61 mainLayout
->addWidget(page
);
62 mainLayout
->addWidget(buttonBox
);
64 QVBoxLayout
*vbox
= new QVBoxLayout
;
65 page
->setLayout(vbox
);
67 mEnableAccountOrder
= new QCheckBox(i18n("Use custom order"));
68 connect(mEnableAccountOrder
, &QCheckBox::clicked
, this, &AccountConfigOrderDialog::slotEnableAccountOrder
);
69 vbox
->addWidget(mEnableAccountOrder
);
71 QHBoxLayout
*vlay
= new QHBoxLayout
;
72 vbox
->addLayout(vlay
);
74 mListAccount
= new QListWidget(this);
75 mListAccount
->setDragDropMode(QAbstractItemView::InternalMove
);
76 vlay
->addWidget(mListAccount
);
78 QWidget
*upDownBox
= new QWidget(page
);
79 QVBoxLayout
*upDownBoxVBoxLayout
= new QVBoxLayout(upDownBox
);
80 upDownBoxVBoxLayout
->setMargin(0);
81 mUpButton
= new QPushButton(upDownBox
);
82 upDownBoxVBoxLayout
->addWidget(mUpButton
);
83 mUpButton
->setIcon(QIcon::fromTheme(QLatin1String("go-up")));
84 mUpButton
->setToolTip(i18nc("Move selected account up.", "Up"));
85 mUpButton
->setEnabled(false); // b/c no item is selected yet
86 mUpButton
->setFocusPolicy(Qt::StrongFocus
);
87 mUpButton
->setAutoRepeat(true);
89 mDownButton
= new QPushButton(upDownBox
);
90 upDownBoxVBoxLayout
->addWidget(mDownButton
);
91 mDownButton
->setIcon(QIcon::fromTheme(QLatin1String("go-down")));
92 mDownButton
->setToolTip(i18nc("Move selected account down.", "Down"));
93 mDownButton
->setEnabled(false); // b/c no item is selected yet
94 mDownButton
->setFocusPolicy(Qt::StrongFocus
);
95 mDownButton
->setAutoRepeat(true);
97 QWidget
*spacer
= new QWidget(upDownBox
);
98 upDownBoxVBoxLayout
->addWidget(spacer
);
99 upDownBoxVBoxLayout
->setStretchFactor(spacer
, 100);
100 vlay
->addWidget(upDownBox
);
102 connect(mUpButton
, &QPushButton::clicked
, this, &AccountConfigOrderDialog::slotMoveUp
);
103 connect(mDownButton
, &QPushButton::clicked
, this, &AccountConfigOrderDialog::slotMoveDown
);
104 connect(mListAccount
, &QListWidget::itemSelectionChanged
, this, &AccountConfigOrderDialog::slotEnableControls
);
105 connect(mListAccount
->model(), SIGNAL(rowsMoved(QModelIndex
,int,int,QModelIndex
,int)), SLOT(slotEnableControls()));
107 connect(okButton
, &QPushButton::clicked
, this, &AccountConfigOrderDialog::slotOk
);
112 AccountConfigOrderDialog::~AccountConfigOrderDialog()
117 void AccountConfigOrderDialog::slotEnableAccountOrder(bool state
)
119 mListAccount
->setEnabled(state
);
120 mUpButton
->setEnabled(state
);
121 mDownButton
->setEnabled(state
);
123 slotEnableControls();
127 void AccountConfigOrderDialog::slotMoveUp()
129 if (!mListAccount
->currentItem()) {
132 const int pos
= mListAccount
->row(mListAccount
->currentItem());
133 mListAccount
->blockSignals(true);
134 QListWidgetItem
*item
= mListAccount
->takeItem(pos
);
135 // now selected item is at idx(idx-1), so
136 // insert the other item at idx, ie. above(below).
137 mListAccount
->insertItem(pos
- 1, item
);
138 mListAccount
->blockSignals(false);
139 mListAccount
->setCurrentRow(pos
- 1);
142 void AccountConfigOrderDialog::slotMoveDown()
144 if (!mListAccount
->currentItem()) {
147 const int pos
= mListAccount
->row(mListAccount
->currentItem());
148 mListAccount
->blockSignals(true);
149 QListWidgetItem
*item
= mListAccount
->takeItem(pos
);
150 // now selected item is at idx(idx-1), so
151 // insert the other item at idx, ie. above(below).
152 mListAccount
->insertItem(pos
+ 1 , item
);
153 mListAccount
->blockSignals(false);
154 mListAccount
->setCurrentRow(pos
+ 1);
157 void AccountConfigOrderDialog::slotEnableControls()
159 QListWidgetItem
*item
= mListAccount
->currentItem();
161 mUpButton
->setEnabled(item
&& mListAccount
->currentRow() != 0);
162 mDownButton
->setEnabled(item
&& mListAccount
->currentRow() != mListAccount
->count() - 1);
165 void AccountConfigOrderDialog::init()
167 const QStringList listOrderAccount
= MailCommon::MailCommonSettings::self()->order();
168 QStringList instanceList
;
170 QMap
<QString
, InstanceStruct
> mapInstance
;
171 foreach (const Akonadi::AgentInstance
&instance
, Akonadi::AgentManager::self()->instances()) {
172 const QStringList
capabilities(instance
.type().capabilities());
173 if (instance
.type().mimeTypes().contains(KMime::Message::mimeType())) {
174 if (capabilities
.contains(QLatin1String("Resource")) &&
175 !capabilities
.contains(QLatin1String("Virtual")) &&
176 !capabilities
.contains(QLatin1String("MailTransport"))) {
177 const QString identifier
= instance
.identifier();
178 if (!identifier
.contains(POP3_RESOURCE_IDENTIFIER
)) {
179 instanceList
<< instance
.identifier();
180 InstanceStruct instanceStruct
;
181 instanceStruct
.name
= instance
.name();
182 if (PimCommon::Util::isImapResource(identifier
)) {
183 instanceStruct
.name
+= QLatin1String(" (IMAP)");
184 } else if (identifier
.startsWith(QLatin1String("akonadi_maildir_resource"))) {
185 instanceStruct
.name
+= QLatin1String(" (Maildir)");
186 } else if (identifier
.startsWith(QLatin1String("akonadi_mailbox_resource"))) {
187 instanceStruct
.name
+= QLatin1String(" (Mailbox)");
188 } else if (identifier
.startsWith(QLatin1String("akonadi_mixedmaildir_resource"))) {
189 instanceStruct
.name
+= QLatin1String(" (Mixedmaildir)");
191 qCDebug(MAILCOMMON_LOG
) << " Unknown resource type " << identifier
;
193 instanceStruct
.icon
= instance
.type().icon();
194 mapInstance
.insert(instance
.identifier(), instanceStruct
);
199 const int numberOfList(listOrderAccount
.count());
200 for (int i
= 0; i
< numberOfList
; ++i
) {
201 instanceList
.removeOne(listOrderAccount
.at(i
));
204 QStringList
finalList(listOrderAccount
);
205 finalList
+= instanceList
;
207 const int numberOfElement(finalList
.count());
208 for (int i
= 0; i
< numberOfElement
; ++i
) {
209 const QString
identifier(finalList
.at(i
));
210 if (mapInstance
.contains(identifier
)) {
211 InstanceStruct tmp
= mapInstance
.value(identifier
);
212 QListWidgetItem
*item
= new QListWidgetItem(tmp
.icon
, tmp
.name
, mListAccount
);
213 item
->setData(AccountConfigOrderDialog::IdentifierAccount
, identifier
);
214 mListAccount
->addItem(item
);
217 mEnableAccountOrder
->setChecked(MailCommon::MailCommonSettings::self()->enableAccountOrder());
218 slotEnableAccountOrder(MailCommon::MailCommonSettings::self()->enableAccountOrder());
221 void AccountConfigOrderDialog::slotOk()
224 const int numberOfItems(mListAccount
->count());
225 for (int i
= 0; i
< numberOfItems
; ++i
) {
226 order
<< mListAccount
->item(i
)->data(AccountConfigOrderDialog::IdentifierAccount
).toString();
229 MailCommon::MailCommonSettings::self()->setOrder(order
);
230 MailCommon::MailCommonSettings::self()->setEnableAccountOrder(mEnableAccountOrder
->isChecked());
231 MailCommon::MailCommonSettings::self()->save();
235 void AccountConfigOrderDialog::readConfig()
237 KConfigGroup
accountConfigDialog(MailCommon::MailCommonSettings::self()->config(), "AccountConfigOrderDialog");
238 const QSize size
= accountConfigDialog
.readEntry("Size", QSize(600, 400));
239 if (size
.isValid()) {
244 void AccountConfigOrderDialog::writeConfig()
246 KConfigGroup
accountConfigDialog(MailCommon::MailCommonSettings::self()->config(), "AccountConfigOrderDialog");
247 accountConfigDialog
.writeEntry("Size", size());
248 accountConfigDialog
.sync();