22 #include "displaynameeditwidget.h"
24 #include <QtCore/QEvent>
25 #include <QtCore/QString>
26 #include <QtGui/QAbstractItemView>
27 #include <QtGui/QHBoxLayout>
28 #include <QtGui/QPainter>
29 #include <QtGui/QStyledItemDelegate>
31 #include <kabc/addressee.h>
32 #include <kcombobox.h>
39 if ( contact.formattedName() == (contact.givenName() + QLatin1Char(
' ' ) + contact.familyName()) )
41 else if ( contact.formattedName() == contact.assembledName() )
43 else if ( contact.formattedName() == (contact.familyName() + QLatin1String(
", " ) + contact.givenName()) )
45 else if ( contact.formattedName() == (contact.familyName() + QLatin1Char(
' ' ) + contact.givenName()) )
47 else if ( contact.formattedName() == contact.organization() )
53 class DisplayNameDelegate :
public QStyledItemDelegate
56 DisplayNameDelegate( QAbstractItemView *view, QObject *parent = 0 )
57 : QStyledItemDelegate( parent ), mMaxDescriptionWidth( 0 )
59 mDescriptions.append( i18n(
"Short Name" ) );
60 mDescriptions.append( i18n(
"Full Name" ) );
61 mDescriptions.append( i18n(
"Reverse Name with Comma" ) );
62 mDescriptions.append( i18n(
"Reverse Name" ) );
63 mDescriptions.append( i18n(
"Organization" ) );
64 mDescriptions.append( i18nc(
"@item:inlistbox A custom name format",
"Custom" ) );
66 QFont font = view->font();
67 font.setStyle( QFont::StyleItalic );
68 QFontMetrics metrics( font );
69 foreach (
const QString &description, mDescriptions )
70 mMaxDescriptionWidth = qMax( mMaxDescriptionWidth, metrics.width( description ) );
72 mMaxDescriptionWidth += 3;
75 int maximumDescriptionWidth()
const
77 return mMaxDescriptionWidth;
80 virtual void paint( QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
82 QStyledItemDelegate::paint( painter, option, index );
83 const QRect rect( option.rect.width() - mMaxDescriptionWidth, option.rect.y(), mMaxDescriptionWidth, option.rect.height() );
85 QFont font( painter->font() );
86 font.setStyle( QFont::StyleItalic );
87 painter->setFont( font );
88 if ( option.state & QStyle::State_Selected )
89 painter->setPen( option.palette.color( QPalette::Normal, QPalette::BrightText ) );
91 painter->setPen( option.palette.color( QPalette::Disabled, QPalette::Text ) );
92 painter->drawText( rect, Qt::AlignLeft, mDescriptions.at( index.row() ) );
96 QSize sizeHint(
const QStyleOptionViewItem& option,
const QModelIndex& index )
const
98 QSize size = QStyledItemDelegate::sizeHint( option, index );
99 size.setWidth( size.width() + mMaxDescriptionWidth );
105 QStringList mDescriptions;
106 int mMaxDescriptionWidth;
109 DisplayNameEditWidget::DisplayNameEditWidget( QWidget *parent )
111 mDisplayType( FullName )
113 QHBoxLayout *layout =
new QHBoxLayout(
this );
114 layout->setMargin( 0 );
115 layout->setSpacing( KDialog::spacingHint() );
117 mView =
new KComboBox(
this );
118 mView->addItems( QStringList() << QString() << QString() << QString()
119 << QString() << QString() << QString() );
121 layout->addWidget( mView );
123 connect( mView, SIGNAL(activated(
int)), SLOT(displayTypeChanged(
int)) );
125 DisplayNameDelegate *delegate =
new DisplayNameDelegate( mView->view() );
126 mView->view()->setItemDelegate( delegate );
128 mAdditionalPopupWidth = delegate->maximumDescriptionWidth();
130 mViewport = mView->view()->viewport();
131 mViewport->installEventFilter(
this );
134 DisplayNameEditWidget::~DisplayNameEditWidget()
138 void DisplayNameEditWidget::setReadOnly(
bool readOnly )
140 mView->setEnabled( !readOnly );
143 void DisplayNameEditWidget::setDisplayType( DisplayType type )
147 mDisplayType = guessedDisplayType( mContact );
159 void DisplayNameEditWidget::loadContact(
const KABC::Addressee &contact )
163 mDisplayType = guessedDisplayType( mContact );
168 void DisplayNameEditWidget::storeContact( KABC::Addressee &contact )
const
170 contact.setFormattedName( mView->currentText() );
173 void DisplayNameEditWidget::changeName(
const KABC::Addressee &contact )
175 const QString organization = mContact.organization();
177 mContact.setOrganization( organization );
178 if ( mDisplayType == CustomName )
179 mContact.setFormattedName( mView->currentText() );
184 void DisplayNameEditWidget::changeOrganization(
const QString &organization )
186 mContact.setOrganization( organization );
191 void DisplayNameEditWidget::displayTypeChanged(
int type )
193 mDisplayType = (DisplayType)type;
198 bool DisplayNameEditWidget::eventFilter( QObject *
object, QEvent *event )
200 if (
object == mViewport ) {
201 if ( event->type() == QEvent::Show ) {
203 QWidget *parentWidget = mViewport->parentWidget()->parentWidget();
206 QFontMetrics metrics( mView->font() );
207 for (
int i = 0; i < mView->count(); ++i )
208 maxWidth = qMax( maxWidth, metrics.width( mView->itemText( i ) ) );
211 parentWidget->resize( maxWidth + mAdditionalPopupWidth + 20, parentWidget->height() );
216 return QWidget::eventFilter(
object, event );
219 void DisplayNameEditWidget::updateView()
222 mView->setItemText( 0, mContact.givenName() + QLatin1Char(
' ' ) + mContact.familyName() );
225 mView->setItemText( 1, mContact.assembledName() );
228 mView->setItemText( 2, mContact.familyName() + QLatin1String(
", " ) + mContact.givenName() );
231 mView->setItemText( 3, mContact.familyName() + QLatin1Char(
' ' ) + mContact.givenName() );
234 mView->setItemText( 4, mContact.organization() );
237 mView->setItemText( 5, mContact.formattedName() );
240 QMetaObject::invokeMethod(
this,
"setComboBoxEditable", Qt::QueuedConnection, Q_ARG(
bool, mDisplayType == CustomName ) );
242 mView->setCurrentIndex( (
int)mDisplayType );
245 void DisplayNameEditWidget::setComboBoxEditable(
bool value )
247 mView->setEditable( value );
250 #include "displaynameeditwidget.moc"