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> 35 #include <QGridLayout> 36 #include <QPushButton> 38 #include <QSortFilterProxyModel> 40 void 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);
55 CustomFieldsEditWidget::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()));
91 CustomFieldsEditWidget::~CustomFieldsEditWidget()
95 void 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);
182 void 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);
229 void CustomFieldsEditWidget::setReadOnly(
bool readOnly)
231 mReadOnly = readOnly;
233 mView->setEnabled(!mReadOnly);
238 void CustomFieldsEditWidget::setLocalCustomFieldDescriptions(
const QVariantList &descriptions)
240 mLocalCustomFields.clear();
242 foreach (
const QVariant &description, descriptions) {
247 QVariantList CustomFieldsEditWidget::localCustomFieldDescriptions()
const 249 const CustomField::List customFields = mModel->customFields();
251 QVariantList descriptions;
254 descriptions.append(field.toVariantMap());
261 void 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);
292 void 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);
319 void 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());
335 void 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.
Field has been defined by the external data source (e.g. vCard)
Field has been defined by user for all contacts.
Field has been defined by user for one contact.