22#include "displaynameeditwidget.h"
24#include <QtCore/QEvent>
25#include <QAbstractItemView>
28#include <QStyledItemDelegate>
30#include <kabc/addressee.h>
33#include <klocalizedstring.h>
38 if (contact.formattedName() == (contact.givenName() + QLatin1Char(
' ') + contact.familyName())) {
40 }
else if (contact.formattedName() == contact.assembledName()) {
42 }
else if (contact.formattedName() == (contact.familyName() + QLatin1String(
", ") + contact.givenName())) {
44 }
else if (contact.formattedName() == (contact.familyName() + QLatin1Char(
' ') + contact.givenName())) {
46 }
else if (contact.formattedName() == contact.organization()) {
53class DisplayNameDelegate :
public QStyledItemDelegate
56 DisplayNameDelegate(QAbstractItemView *view, QObject *parent = 0)
57 : QStyledItemDelegate(parent)
58 , mMaxDescriptionWidth(0)
60 mDescriptions.append(i18n(
"Short Name"));
61 mDescriptions.append(i18n(
"Full Name"));
62 mDescriptions.append(i18n(
"Reverse Name with Comma"));
63 mDescriptions.append(i18n(
"Reverse Name"));
64 mDescriptions.append(i18n(
"Organization"));
65 mDescriptions.append(i18nc(
"@item:inlistbox A custom name format",
"Custom"));
67 QFont font = view->font();
68 font.setStyle(QFont::StyleItalic);
69 QFontMetrics metrics(font);
70 foreach (
const QString &description, mDescriptions) {
71 mMaxDescriptionWidth = qMax(mMaxDescriptionWidth, metrics.width(description));
74 mMaxDescriptionWidth += 3;
77 int maximumDescriptionWidth()
const
79 return mMaxDescriptionWidth;
82 virtual void paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index)
const
84 QStyledItemDelegate::paint(painter, option, index);
85 const QRect rect(option.rect.width() - mMaxDescriptionWidth, option.rect.y(), mMaxDescriptionWidth, option.rect.height());
87 QFont font(painter->font());
88 font.setStyle(QFont::StyleItalic);
89 painter->setFont(font);
90 if (option.state & QStyle::State_Selected) {
91 painter->setPen(option.palette.color(QPalette::Normal, QPalette::BrightText));
93 painter->setPen(option.palette.color(QPalette::Disabled, QPalette::Text));
95 painter->drawText(rect, Qt::AlignLeft, mDescriptions.at(index.row()));
99 QSize sizeHint(
const QStyleOptionViewItem &option,
const QModelIndex &index)
const
101 QSize size = QStyledItemDelegate::sizeHint(option, index);
102 size.setWidth(size.width() + mMaxDescriptionWidth);
108 QStringList mDescriptions;
109 int mMaxDescriptionWidth;
112DisplayNameEditWidget::DisplayNameEditWidget(QWidget *parent)
114 , mDisplayType(FullName)
116 QHBoxLayout *layout =
new QHBoxLayout(
this);
117 layout->setMargin(0);
118 layout->setSpacing(KDialog::spacingHint());
120 mView =
new KComboBox(
this);
121 mView->addItems(QStringList() << QString() << QString() << QString()
122 << QString() << QString() << QString());
124 layout->addWidget(mView);
125 setFocusProxy(mView);
126 setFocusPolicy(Qt::StrongFocus);
127 connect(mView, SIGNAL(activated(
int)), SLOT(displayTypeChanged(
int)));
129 DisplayNameDelegate *delegate =
new DisplayNameDelegate(mView->view());
130 mView->view()->setItemDelegate(delegate);
132 mAdditionalPopupWidth = delegate->maximumDescriptionWidth();
134 mViewport = mView->view()->viewport();
135 mViewport->installEventFilter(
this);
138DisplayNameEditWidget::~DisplayNameEditWidget()
142void DisplayNameEditWidget::setReadOnly(
bool readOnly)
144 mView->setEnabled(!readOnly);
147void DisplayNameEditWidget::setDisplayType(DisplayType type)
151 mDisplayType = guessedDisplayType(mContact);
164void DisplayNameEditWidget::loadContact(
const KABC::Addressee &contact)
168 mDisplayType = guessedDisplayType(mContact);
173void DisplayNameEditWidget::storeContact(KABC::Addressee &contact)
const
175 contact.setFormattedName(mView->currentText());
178void DisplayNameEditWidget::changeName(
const KABC::Addressee &contact)
180 const QString organization = mContact.organization();
182 mContact.setOrganization(organization);
184 mContact.setFormattedName(mView->currentText());
190void DisplayNameEditWidget::changeOrganization(
const QString &organization)
192 mContact.setOrganization(organization);
197void DisplayNameEditWidget::displayTypeChanged(
int type)
204bool DisplayNameEditWidget::eventFilter(QObject *
object, QEvent *event)
206 if (
object == mViewport) {
207 if (event->type() == QEvent::Show) {
209 QWidget *parentWidget = mViewport->parentWidget()->parentWidget();
212 QFontMetrics metrics(mView->font());
213 for (
int i = 0; i < mView->count(); ++i) {
214 maxWidth = qMax(maxWidth, metrics.width(mView->itemText(i)));
218 parentWidget->resize(maxWidth + mAdditionalPopupWidth + 20, parentWidget->height());
223 return QWidget::eventFilter(
object, event);
226void DisplayNameEditWidget::updateView()
229 mView->setItemText(0, mContact.givenName() + QLatin1Char(
' ') + mContact.familyName());
232 mView->setItemText(1, mContact.assembledName());
235 mView->setItemText(2, mContact.familyName() + QLatin1String(
", ") + mContact.givenName());
238 mView->setItemText(3, mContact.familyName() + QLatin1Char(
' ') + mContact.givenName());
241 mView->setItemText(4, mContact.organization());
244 mView->setItemText(5, mContact.formattedName());
247 QMetaObject::invokeMethod(
this,
"setComboBoxEditable", Qt::QueuedConnection, Q_ARG(
bool, mDisplayType ==
CustomName));
249 mView->setCurrentIndex((
int)mDisplayType);
252void DisplayNameEditWidget::setComboBoxEditable(
bool value)
254 mView->setEditable(value);