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>
31 #include <kmessagebox.h>
33 #include <QtCore/QPointer>
34 #include <QtCore/QUuid>
35 #include <QtGui/QGridLayout>
36 #include <QtGui/QPushButton>
37 #include <QtGui/QTreeView>
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(
'-' ) );
49 app = tmp.left( dash );
50 name = tmp.mid( dash + 1 );
55 CustomFieldsEditWidget::CustomFieldsEditWidget( QWidget *parent )
56 : QWidget( parent ), mReadOnly( false )
58 QGridLayout *layout =
new QGridLayout(
this );
59 layout->setMargin( 0 );
63 mView =
new QTreeView;
64 mView->setSortingEnabled(
true);
65 mView->setRootIsDecorated(
false );
66 mView->setItemDelegate(
new CustomFieldsDelegate(
this ) );
68 mAddButton =
new QPushButton( i18n(
"Add..." ) );
69 mEditButton =
new QPushButton( i18n(
"Edit..." ) );
70 mRemoveButton =
new QPushButton( i18n(
"Remove" ) );
72 layout->addWidget( mView, 0, 0, 4, 1 );
73 layout->addWidget( mAddButton, 0, 1 );
74 layout->addWidget( mEditButton, 1, 1 );
75 layout->addWidget( mRemoveButton, 2, 1 );
77 mModel =
new CustomFieldsModel(
this );
78 QSortFilterProxyModel *proxyModel =
new QSortFilterProxyModel;
79 proxyModel->setDynamicSortFilter(
true);
80 proxyModel->setSourceModel(mModel);
81 mView->setModel( proxyModel );
82 mView->setColumnHidden( 2,
true );
84 connect( mView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
85 this, SLOT(slotUpdateButtons()) );
86 connect( mAddButton, SIGNAL(clicked()),
this, SLOT(slotAdd()) );
87 connect( mEditButton, SIGNAL(clicked()),
this, SLOT(slotEdit()) );
88 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/" ) ) )
111 if ( app == QLatin1String(
"KADDRESSBOOK" ) ) {
112 static QSet<QString> blacklist;
113 if ( blacklist.isEmpty() ) {
114 blacklist << QLatin1String(
"BlogFeed" )
115 << QLatin1String(
"X-IMAddress" )
116 << QLatin1String(
"X-Profession" )
117 << QLatin1String(
"X-Office" )
118 << QLatin1String(
"X-ManagersName" )
119 << QLatin1String(
"X-AssistantsName" )
120 << QLatin1String(
"X-Anniversary" )
121 << QLatin1String(
"X-SpousesName" )
122 << QLatin1String(
"X-Profession" )
123 << QLatin1String(
"MailPreferedFormatting")
124 << QLatin1String(
"MailAllowToRemoteContent")
125 << QLatin1String(
"CRYPTOPROTOPREF" )
126 << QLatin1String(
"OPENPGPFP" )
127 << QLatin1String(
"SMIMEFP" )
128 << QLatin1String(
"CRYPTOSIGNPREF" )
129 << QLatin1String(
"CRYPTOENCRYPTPREF" );
132 if ( blacklist.contains( name ) )
137 bool isLocalCustomField =
false;
138 for (
int i = 0; i < mLocalCustomFields.count(); ++i ) {
139 if ( mLocalCustomFields[ i ].key() == name ) {
140 mLocalCustomFields[ i ].setValue( value );
141 isLocalCustomField =
true;
147 bool isGlobalCustomField =
false;
148 for (
int i = 0; i < globalCustomFields.count(); ++i ) {
149 if ( globalCustomFields[ i ].key() == name ) {
150 globalCustomFields[ i ].setValue( value );
151 isGlobalCustomField =
true;
157 if ( !isLocalCustomField && !isGlobalCustomField ) {
158 if ( app == QLatin1String(
"KADDRESSBOOK" ) ) {
162 customField.setValue( value );
164 mLocalCustomFields << customField;
167 const QString key = app + QLatin1Char(
'-' ) + name;
169 customField.setValue( value );
171 externalCustomFields << customField;
176 mModel->setCustomFields( CustomField::List() << mLocalCustomFields << globalCustomFields << externalCustomFields );
179 void CustomFieldsEditWidget::storeContact( KABC::Addressee &contact )
const
181 const CustomField::List customFields = mModel->customFields();
182 foreach (
const CustomField &customField, customFields ) {
185 if ( !customField.value().isEmpty() )
186 contact.insertCustom( QLatin1String(
"KADDRESSBOOK" ), customField.key(), customField.value() );
188 contact.removeCustom( QLatin1String(
"KADDRESSBOOK" ), customField.key() );
195 foreach (
const CustomField &oldCustomField, mLocalCustomFields ) {
198 bool fieldStillExists =
false;
199 foreach (
const CustomField &newCustomField, customFields ) {
201 if ( newCustomField.key() == oldCustomField.key() ) {
202 fieldStillExists =
true;
208 if ( !fieldStillExists )
209 contact.removeCustom( QLatin1String(
"KADDRESSBOOK" ), oldCustomField.key() );
214 CustomField::List globalCustomFields;
215 foreach (
const CustomField &customField, customFields ) {
217 globalCustomFields << customField;
221 CustomFieldManager::setGlobalCustomFieldDescriptions( globalCustomFields );
224 void CustomFieldsEditWidget::setReadOnly(
bool readOnly )
226 mReadOnly = readOnly;
228 mView->setEnabled( !mReadOnly );
233 void CustomFieldsEditWidget::setLocalCustomFieldDescriptions(
const QVariantList &descriptions )
235 mLocalCustomFields.clear();
237 foreach (
const QVariant &description, descriptions )
241 QVariantList CustomFieldsEditWidget::localCustomFieldDescriptions()
const
243 const CustomField::List customFields = mModel->customFields();
245 QVariantList descriptions;
246 foreach (
const CustomField &field, customFields ) {
248 descriptions.append( field.toVariantMap() );
254 void CustomFieldsEditWidget::slotAdd()
262 QString key = QUuid::createUuid().toString();
263 key.remove( QLatin1Char(
'{' ) );
264 key.remove( QLatin1Char(
'}' ) );
268 QPointer<CustomFieldEditorDialog> dlg =
new CustomFieldEditorDialog(
this );
269 dlg->setCustomField( field );
271 if ( dlg->exec() == QDialog::Accepted ) {
272 const int lastRow = mModel->rowCount();
273 mModel->insertRow( lastRow );
275 field = dlg->customField();
276 mModel->setData( mModel->index( lastRow, 2 ), field.key(), Qt::EditRole );
277 mModel->setData( mModel->index( lastRow, 0 ), field.title(), Qt::EditRole );
278 mModel->setData( mModel->index( lastRow, 0 ), field.type(), CustomFieldsModel::TypeRole );
279 mModel->setData( mModel->index( lastRow, 0 ), field.scope(), CustomFieldsModel::ScopeRole );
285 void CustomFieldsEditWidget::slotEdit()
287 const QModelIndex currentIndex = mView->currentIndex();
288 if ( !currentIndex.isValid() )
292 field.setKey( mModel->index( currentIndex.row(), 2 ).data( Qt::DisplayRole ).toString() );
293 field.setTitle( mModel->index( currentIndex.row(), 0 ).data( Qt::DisplayRole ).toString() );
294 field.setType( static_cast<CustomField::Type>( currentIndex.data( CustomFieldsModel::TypeRole ).toInt() ) );
295 field.setScope( static_cast<CustomField::Scope>( currentIndex.data( CustomFieldsModel::ScopeRole ).toInt() ) );
297 QPointer<CustomFieldEditorDialog> dlg =
new CustomFieldEditorDialog(
this );
298 dlg->setCustomField( field );
300 if ( dlg->exec() == QDialog::Accepted ) {
301 field = dlg->customField();
302 mModel->setData( mModel->index( currentIndex.row(), 2 ), field.key(), Qt::EditRole );
303 mModel->setData( mModel->index( currentIndex.row(), 0 ), field.title(), Qt::EditRole );
304 mModel->setData( currentIndex, field.type(), CustomFieldsModel::TypeRole );
305 mModel->setData( currentIndex, field.scope(), CustomFieldsModel::ScopeRole );
311 void CustomFieldsEditWidget::slotRemove()
313 const QModelIndex currentIndex = mView->currentIndex();
314 if ( !currentIndex.isValid() )
317 if ( KMessageBox::warningContinueCancel(
this,
318 i18nc(
"Custom Fields",
"Do you really want to delete the selected custom field?" ),
319 i18n(
"Confirm Delete" ), KStandardGuiItem::del() ) != KMessageBox::Continue ) {
323 mModel->removeRow( currentIndex.row() );
326 void CustomFieldsEditWidget::slotUpdateButtons()
328 const bool hasCurrent = mView->currentIndex().isValid();
329 const bool isExternal = (hasCurrent &&
332 mAddButton->setEnabled( !mReadOnly );
333 mEditButton->setEnabled( !mReadOnly && hasCurrent && !isExternal );
334 mRemoveButton->setEnabled( !mReadOnly && hasCurrent && !isExternal );
337 #include "customfieldseditwidget.moc"