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()) );
92 CustomFieldsEditWidget::~CustomFieldsEditWidget()
96 void CustomFieldsEditWidget::loadContact(
const KABC::Addressee &contact )
98 CustomField::List externalCustomFields;
100 CustomField::List globalCustomFields = CustomFieldManager::globalCustomFieldDescriptions();
102 const QStringList customs = contact.customs();
103 foreach (
const QString &custom, customs ) {
105 QString app, name, value;
106 splitCustomField( custom, app, name, value );
109 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 ) )
139 bool isLocalCustomField =
false;
140 for (
int i = 0; i < mLocalCustomFields.count(); ++i ) {
141 if ( mLocalCustomFields[ i ].key() == name ) {
142 mLocalCustomFields[ i ].setValue( value );
143 isLocalCustomField =
true;
149 bool isGlobalCustomField =
false;
150 for (
int i = 0; i < globalCustomFields.count(); ++i ) {
151 if ( globalCustomFields[ i ].key() == name ) {
152 globalCustomFields[ i ].setValue( value );
153 isGlobalCustomField =
true;
159 if ( !isLocalCustomField && !isGlobalCustomField ) {
160 if ( app == QLatin1String(
"KADDRESSBOOK" ) ) {
164 customField.setValue( value );
166 mLocalCustomFields << customField;
169 const QString key = app + QLatin1Char(
'-' ) + name;
171 customField.setValue( value );
173 externalCustomFields << customField;
178 mModel->setCustomFields( CustomField::List() << mLocalCustomFields << globalCustomFields << externalCustomFields );
181 void CustomFieldsEditWidget::storeContact( KABC::Addressee &contact )
const
183 const CustomField::List customFields = mModel->customFields();
184 foreach (
const CustomField &customField, customFields ) {
187 if ( !customField.value().isEmpty() )
188 contact.insertCustom( QLatin1String(
"KADDRESSBOOK" ), customField.key(), customField.value() );
190 contact.removeCustom( QLatin1String(
"KADDRESSBOOK" ), customField.key() );
197 foreach (
const CustomField &oldCustomField, mLocalCustomFields ) {
200 bool fieldStillExists =
false;
201 foreach (
const CustomField &newCustomField, customFields ) {
203 if ( newCustomField.key() == oldCustomField.key() ) {
204 fieldStillExists =
true;
210 if ( !fieldStillExists )
211 contact.removeCustom( QLatin1String(
"KADDRESSBOOK" ), oldCustomField.key() );
216 CustomField::List globalCustomFields;
217 foreach (
const CustomField &customField, customFields ) {
219 globalCustomFields << customField;
223 CustomFieldManager::setGlobalCustomFieldDescriptions( globalCustomFields );
226 void CustomFieldsEditWidget::setReadOnly(
bool readOnly )
228 mReadOnly = readOnly;
230 mView->setEnabled( !mReadOnly );
235 void CustomFieldsEditWidget::setLocalCustomFieldDescriptions(
const QVariantList &descriptions )
237 mLocalCustomFields.clear();
239 foreach (
const QVariant &description, descriptions )
243 QVariantList CustomFieldsEditWidget::localCustomFieldDescriptions()
const
245 const CustomField::List customFields = mModel->customFields();
247 QVariantList descriptions;
248 foreach (
const CustomField &field, customFields ) {
250 descriptions.append( field.toVariantMap() );
256 void CustomFieldsEditWidget::slotAdd()
264 QString key = QUuid::createUuid().toString();
265 key.remove( QLatin1Char(
'{' ) );
266 key.remove( QLatin1Char(
'}' ) );
270 QPointer<CustomFieldEditorDialog> dlg =
new CustomFieldEditorDialog(
this );
271 dlg->setCustomField( field );
273 if ( dlg->exec() == QDialog::Accepted ) {
274 const int lastRow = mModel->rowCount();
275 mModel->insertRow( lastRow );
277 field = dlg->customField();
278 mModel->setData( mModel->index( lastRow, 2 ), field.key(), Qt::EditRole );
279 mModel->setData( mModel->index( lastRow, 0 ), field.title(), Qt::EditRole );
280 mModel->setData( mModel->index( lastRow, 0 ), field.type(), CustomFieldsModel::TypeRole );
281 mModel->setData( mModel->index( lastRow, 0 ), field.scope(), CustomFieldsModel::ScopeRole );
287 void CustomFieldsEditWidget::slotEdit()
289 const QModelIndex currentIndex = mView->currentIndex();
290 if ( !currentIndex.isValid() )
294 field.setKey( mModel->index( currentIndex.row(), 2 ).data( Qt::DisplayRole ).toString() );
295 field.setTitle( mModel->index( currentIndex.row(), 0 ).data( Qt::DisplayRole ).toString() );
296 field.setType( static_cast<CustomField::Type>( currentIndex.data( CustomFieldsModel::TypeRole ).toInt() ) );
297 field.setScope( static_cast<CustomField::Scope>( currentIndex.data( CustomFieldsModel::ScopeRole ).toInt() ) );
299 QPointer<CustomFieldEditorDialog> dlg =
new CustomFieldEditorDialog(
this );
300 dlg->setCustomField( field );
302 if ( dlg->exec() == QDialog::Accepted ) {
303 field = dlg->customField();
304 mModel->setData( mModel->index( currentIndex.row(), 2 ), field.key(), Qt::EditRole );
305 mModel->setData( mModel->index( currentIndex.row(), 0 ), field.title(), Qt::EditRole );
306 mModel->setData( currentIndex, field.type(), CustomFieldsModel::TypeRole );
307 mModel->setData( currentIndex, field.scope(), CustomFieldsModel::ScopeRole );
313 void CustomFieldsEditWidget::slotRemove()
315 const QModelIndex currentIndex = mView->currentIndex();
316 if ( !currentIndex.isValid() )
319 if ( KMessageBox::warningContinueCancel(
this,
320 i18nc(
"Custom Fields",
"Do you really want to delete the selected custom field?" ),
321 i18n(
"Confirm Delete" ), KStandardGuiItem::del() ) != KMessageBox::Continue ) {
325 mModel->removeRow( currentIndex.row() );
328 void CustomFieldsEditWidget::slotUpdateButtons()
330 const bool hasCurrent = mView->currentIndex().isValid();
331 const bool isExternal = (hasCurrent &&
334 mAddButton->setEnabled( !mReadOnly );
335 mEditButton->setEnabled( !mReadOnly && hasCurrent && !isExternal );
336 mRemoveButton->setEnabled( !mReadOnly && hasCurrent && !isExternal );
339 #include "customfieldseditwidget.moc"