22#include "customfieldseditwidget.h"
24#include "customfieldeditordialog.h"
25#include "customfieldmanager_p.h"
26#include "customfieldsdelegate.h"
27#include "customfieldsmodel.h"
29#include <kabc/addressee.h>
30#include <klocalizedstring.h>
31#include <kmessagebox.h>
33#include <QtCore/QPointer>
34#include <QtCore/QUuid>
38#include <QSortFilterProxyModel>
40void splitCustomField(
const QString &str, QString &app, QString &name, QString &value)
42 const int colon = str.indexOf(QLatin1Char(
':'));
44 const QString tmp = str.left(colon);
45 value = str.mid(colon + 1);
47 const int dash = tmp.indexOf(QLatin1Char(
'-'));
50 name = tmp.mid(dash + 1);
55CustomFieldsEditWidget::CustomFieldsEditWidget(QWidget *parent)
59 QGridLayout *layout =
new QGridLayout(
this);
62 mView =
new QTreeView;
63 mView->setSortingEnabled(
true);
64 mView->setRootIsDecorated(
false);
65 mView->setItemDelegate(
new CustomFieldsDelegate(
this));
67 mAddButton =
new QPushButton(i18n(
"Add..."));
68 mEditButton =
new QPushButton(i18n(
"Edit..."));
69 mRemoveButton =
new QPushButton(i18n(
"Remove"));
71 layout->addWidget(mView, 0, 0, 4, 1);
72 layout->addWidget(mAddButton, 0, 1);
73 layout->addWidget(mEditButton, 1, 1);
74 layout->addWidget(mRemoveButton, 2, 1);
76 mModel =
new CustomFieldsModel(
this);
77 QSortFilterProxyModel *proxyModel =
new QSortFilterProxyModel;
78 proxyModel->setDynamicSortFilter(
true);
79 proxyModel->setSourceModel(mModel);
80 mView->setModel(proxyModel);
81 mView->setColumnHidden(2,
true);
83 connect(mView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
84 this, SLOT(slotUpdateButtons()));
85 connect(mAddButton, SIGNAL(clicked()),
this, SLOT(slotAdd()));
86 connect(mEditButton, SIGNAL(clicked()),
this, SLOT(slotEdit()));
87 connect(mRemoveButton, SIGNAL(clicked()),
this, SLOT(slotRemove()));
91CustomFieldsEditWidget::~CustomFieldsEditWidget()
95void CustomFieldsEditWidget::loadContact(
const KABC::Addressee &contact)
97 CustomField::List externalCustomFields;
99 CustomField::List globalCustomFields = CustomFieldManager::globalCustomFieldDescriptions();
101 const QStringList customs = contact.customs();
102 foreach (
const QString &custom, customs) {
104 QString app, name, value;
105 splitCustomField(custom, app, name, value);
108 if (custom.startsWith(QLatin1String(
"messaging/"))) {
112 if (app == QLatin1String(
"KADDRESSBOOK")) {
113 static QSet<QString> blacklist;
114 if (blacklist.isEmpty()) {
115 blacklist << QLatin1String(
"BlogFeed")
116 << QLatin1String(
"X-IMAddress")
117 << QLatin1String(
"X-Profession")
118 << QLatin1String(
"X-Office")
119 << QLatin1String(
"X-ManagersName")
120 << QLatin1String(
"X-AssistantsName")
121 << QLatin1String(
"X-Anniversary")
122 << QLatin1String(
"X-ANNIVERSARY")
123 << QLatin1String(
"X-SpousesName")
124 << QLatin1String(
"X-Profession")
125 << QLatin1String(
"MailPreferedFormatting")
126 << QLatin1String(
"MailAllowToRemoteContent")
127 << QLatin1String(
"CRYPTOPROTOPREF")
128 << QLatin1String(
"OPENPGPFP")
129 << QLatin1String(
"SMIMEFP")
130 << QLatin1String(
"CRYPTOSIGNPREF")
131 << QLatin1String(
"CRYPTOENCRYPTPREF");
134 if (blacklist.contains(name)) {
140 bool isLocalCustomField =
false;
141 for (
int i = 0; i < mLocalCustomFields.count(); ++i) {
142 if (mLocalCustomFields[i].key() == name) {
143 mLocalCustomFields[i].setValue(value);
144 isLocalCustomField =
true;
150 bool isGlobalCustomField =
false;
151 for (
int i = 0; i < globalCustomFields.count(); ++i) {
152 if (globalCustomFields[i].key() == name) {
153 globalCustomFields[i].setValue(value);
154 isGlobalCustomField =
true;
160 if (!isLocalCustomField && !isGlobalCustomField) {
161 if (app == QLatin1String(
"KADDRESSBOOK")) {
165 customField.setValue(value);
167 mLocalCustomFields << customField;
170 const QString key = app + QLatin1Char(
'-') + name;
172 customField.setValue(value);
174 externalCustomFields << customField;
179 mModel->setCustomFields(CustomField::List() << mLocalCustomFields << globalCustomFields << externalCustomFields);
182void CustomFieldsEditWidget::storeContact(KABC::Addressee &contact)
const
184 const CustomField::List customFields = mModel->customFields();
185 foreach (
const CustomField &customField, customFields) {
188 if (!customField.value().isEmpty()) {
189 contact.insertCustom(QLatin1String(
"KADDRESSBOOK"), customField.key(), customField.value());
191 contact.removeCustom(QLatin1String(
"KADDRESSBOOK"), customField.key());
199 foreach (
const CustomField &oldCustomField, mLocalCustomFields) {
202 bool fieldStillExists =
false;
203 foreach (
const CustomField &newCustomField, customFields) {
205 if (newCustomField.key() == oldCustomField.key()) {
206 fieldStillExists =
true;
212 if (!fieldStillExists) {
213 contact.removeCustom(QLatin1String(
"KADDRESSBOOK"), oldCustomField.key());
219 CustomField::List globalCustomFields;
220 foreach (
const CustomField &customField, customFields) {
222 globalCustomFields << customField;
226 CustomFieldManager::setGlobalCustomFieldDescriptions(globalCustomFields);
229void CustomFieldsEditWidget::setReadOnly(
bool readOnly)
231 mReadOnly = readOnly;
233 mView->setEnabled(!mReadOnly);
238void CustomFieldsEditWidget::setLocalCustomFieldDescriptions(
const QVariantList &descriptions)
240 mLocalCustomFields.clear();
242 foreach (
const QVariant &description, descriptions) {
247QVariantList CustomFieldsEditWidget::localCustomFieldDescriptions()
const
249 const CustomField::List customFields = mModel->customFields();
251 QVariantList descriptions;
254 descriptions.append(field.toVariantMap());
261void CustomFieldsEditWidget::slotAdd()
269 QString key = QUuid::createUuid().toString();
270 key.remove(QLatin1Char(
'{'));
271 key.remove(QLatin1Char(
'}'));
275 QPointer<CustomFieldEditorDialog> dlg =
new CustomFieldEditorDialog(
this);
276 dlg->setCustomField(field);
278 if (dlg->exec() == QDialog::Accepted) {
279 const int lastRow = mModel->rowCount();
280 mModel->insertRow(lastRow);
282 field = dlg->customField();
283 mModel->setData(mModel->index(lastRow, 2), field.key(), Qt::EditRole);
284 mModel->setData(mModel->index(lastRow, 0), field.title(), Qt::EditRole);
285 mModel->setData(mModel->index(lastRow, 0), field.type(), CustomFieldsModel::TypeRole);
286 mModel->setData(mModel->index(lastRow, 0), field.scope(), CustomFieldsModel::ScopeRole);
292void CustomFieldsEditWidget::slotEdit()
294 const QModelIndex currentIndex = mView->currentIndex();
295 if (!currentIndex.isValid()) {
300 field.setKey(mModel->index(currentIndex.row(), 2).data(Qt::DisplayRole).toString());
301 field.setTitle(mModel->index(currentIndex.row(), 0).data(Qt::DisplayRole).toString());
302 field.setType(
static_cast<CustomField::Type
>(currentIndex.data(CustomFieldsModel::TypeRole).toInt()));
303 field.setScope(
static_cast<CustomField::Scope>(currentIndex.data(CustomFieldsModel::ScopeRole).toInt()));
305 QPointer<CustomFieldEditorDialog> dlg =
new CustomFieldEditorDialog(
this);
306 dlg->setCustomField(field);
308 if (dlg->exec() == QDialog::Accepted) {
309 field = dlg->customField();
310 mModel->setData(mModel->index(currentIndex.row(), 2), field.key(), Qt::EditRole);
311 mModel->setData(mModel->index(currentIndex.row(), 0), field.title(), Qt::EditRole);
312 mModel->setData(currentIndex, field.type(), CustomFieldsModel::TypeRole);
313 mModel->setData(currentIndex, field.scope(), CustomFieldsModel::ScopeRole);
319void CustomFieldsEditWidget::slotRemove()
321 const QModelIndex currentIndex = mView->currentIndex();
322 if (!currentIndex.isValid()) {
326 if (KMessageBox::warningContinueCancel(
this,
327 i18nc(
"Custom Fields",
"Do you really want to delete the selected custom field?"),
328 i18n(
"Confirm Delete"), KStandardGuiItem::del()) != KMessageBox::Continue) {
332 mModel->removeRow(currentIndex.row());
335void CustomFieldsEditWidget::slotUpdateButtons()
337 const bool hasCurrent = mView->currentIndex().isValid();
338 const bool isExternal = (hasCurrent &&
341 mAddButton->setEnabled(!mReadOnly);
342 mEditButton->setEnabled(!mReadOnly && hasCurrent && !isExternal);
343 mRemoveButton->setEnabled(!mReadOnly && hasCurrent && !isExternal);
A class that represents non-standard contact fields.
@ LocalScope
Field has been defined by user for one contact.
@ ExternalScope
Field has been defined by the external data source (e.g. vCard)
@ GlobalScope
Field has been defined by user for all contacts.