22 #include "phoneeditwidget.h"
24 #include "autoqpointer_p.h"
26 #include <QtCore/QSignalMapper>
27 #include <QtCore/QString>
28 #include <QButtonGroup>
30 #include <QGridLayout>
32 #include <QHBoxLayout>
33 #include <QPushButton>
34 #include <QScrollArea>
36 #include <QVBoxLayout>
38 #include <kabc/phonenumber.h>
39 #include <kcombobox.h>
41 #include <klineedit.h>
42 #include <klocalizedstring.h>
45 : KComboBox( parent ),
46 mType( KABC::PhoneNumber::Home ),
49 for (
int i = 0; i < KABC::PhoneNumber::typeList().count(); ++i ) {
50 mTypeList.append( KABC::PhoneNumber::typeList().at( i ) );
53 mTypeList.append( -1 );
57 connect(
this, SIGNAL(activated(
int)),
58 this, SLOT(selected(
int)) );
67 if ( !mTypeList.contains( type ) ) {
68 mTypeList.insert( mTypeList.at( mTypeList.count() - 1 ), type );
80 void PhoneTypeCombo::update()
84 for (
int i = 0; i < mTypeList.count(); ++i ) {
85 if ( mTypeList.at( i ) == -1 ) {
86 addItem( i18nc(
"@item:inlistbox Category of contact info field",
"Other..." ) );
88 addItem( KABC::PhoneNumber::typeLabel( KABC::PhoneNumber::Type( mTypeList.at( i ) ) ) );
92 setCurrentIndex( mLastSelected = mTypeList.indexOf( mType ) );
95 void PhoneTypeCombo::selected(
int pos )
97 if ( mTypeList.at( pos ) == -1 ) {
100 mType = KABC::PhoneNumber::Type( mTypeList.at( pos ) );
105 void PhoneTypeCombo::otherSelected()
110 if ( !mTypeList.contains( mType ) ) {
111 mTypeList.insert( mTypeList.at( mTypeList.count() - 1 ), mType );
114 setType( KABC::PhoneNumber::Type( mTypeList.at( mLastSelected ) ) );
123 QHBoxLayout *layout =
new QHBoxLayout(
this );
124 layout->setSpacing( 11 );
125 layout->setMargin( 0 );
128 mNumberEdit =
new KLineEdit(
this );
129 QFontMetrics fm(font());
130 mNumberEdit->setMinimumWidth(fm.width(QLatin1String(
"MMMMMMMMMM")));
132 layout->addWidget( mTypeCombo );
133 layout->addWidget( mNumberEdit );
135 connect( mTypeCombo, SIGNAL(activated(
int)), SIGNAL(modified()) );
136 connect( mNumberEdit, SIGNAL(textChanged(QString)), SIGNAL(modified()) );
143 disconnect( mTypeCombo, SIGNAL(activated(
int)),
this, SIGNAL(modified()) );
144 mTypeCombo->
setType( number.type() );
145 connect( mTypeCombo, SIGNAL(activated(
int)), SIGNAL(modified()) );
147 mNumberEdit->setText( number.number() );
152 KABC::PhoneNumber
number( mNumber );
154 number.setType( mTypeCombo->
type() );
155 number.setNumber( mNumberEdit->text() );
162 mTypeCombo->setEnabled( !readOnly );
163 mNumberEdit->setReadOnly( readOnly );
167 : QWidget( parent ), mReadOnly( false )
169 mWidgetLayout =
new QVBoxLayout(
this );
171 mMapper =
new QSignalMapper(
this );
172 connect( mMapper, SIGNAL(mapped(
int)), SLOT(changed(
int)) );
183 mReadOnly = readOnly;
192 return mPhoneNumberList.count();
197 mPhoneNumberList = list;
199 KABC::PhoneNumber::TypeList types;
200 types << KABC::PhoneNumber::Home;
201 types << KABC::PhoneNumber::Work;
202 types << KABC::PhoneNumber::Cell;
205 if ( mPhoneNumberList.count() < 3 ) {
206 for (
int i = mPhoneNumberList.count(); i < 3; ++i ) {
207 mPhoneNumberList.append( KABC::PhoneNumber( QString(), types[ i ] ) );
211 recreateNumberWidgets();
216 KABC::PhoneNumber::List list;
218 KABC::PhoneNumber::List::ConstIterator it;
219 for ( it = mPhoneNumberList.constBegin(); it != mPhoneNumberList.constEnd(); ++it ) {
220 if ( !( *it ).number().isEmpty() ) {
230 mPhoneNumberList.append( KABC::PhoneNumber() );
232 recreateNumberWidgets();
237 mPhoneNumberList.removeLast();
239 recreateNumberWidgets();
242 void PhoneNumberListWidget::recreateNumberWidgets()
244 foreach ( QWidget *
const widget, mWidgets ) {
245 mWidgetLayout->removeWidget( widget );
250 KABC::PhoneNumber::List::ConstIterator it;
252 for ( it = mPhoneNumberList.constBegin(); it != mPhoneNumberList.constEnd(); ++it ) {
256 mMapper->setMapping( wdg, counter );
257 connect( wdg, SIGNAL(modified()), mMapper, SLOT(map()) );
259 mWidgetLayout->addWidget( wdg );
260 mWidgets.append( wdg );
269 void PhoneNumberListWidget::changed(
int pos )
271 mPhoneNumberList[ pos ] = mWidgets.at( pos )->number();
275 : QWidget( parent ), mReadOnly( false )
277 QGridLayout *layout =
new QGridLayout(
this );
278 layout->setSpacing( KDialog::spacingHint() );
280 mListScrollArea =
new QScrollArea(
this );
282 mListScrollArea->setWidget( mPhoneNumberListWidget );
283 mListScrollArea->setWidgetResizable(
true );
286 const int scrollAreaMinHeight = mPhoneNumberListWidget->sizeHint().height() +
287 mListScrollArea->horizontalScrollBar()->sizeHint().height();
288 mListScrollArea->setMinimumHeight( scrollAreaMinHeight );
289 layout->addWidget( mListScrollArea, 0, 0, 1, 2 );
291 mAddButton =
new QPushButton( i18n(
"Add" ),
this );
292 mAddButton->setMaximumSize( mAddButton->sizeHint() );
293 layout->addWidget( mAddButton, 1, 0, Qt::AlignRight );
295 mRemoveButton =
new QPushButton( i18n(
"Remove" ),
this );
296 mRemoveButton->setMaximumSize( mRemoveButton->sizeHint() );
297 layout->addWidget( mRemoveButton, 1, 1 );
299 connect( mAddButton, SIGNAL(clicked()), mPhoneNumberListWidget, SLOT(add()) );
300 connect( mRemoveButton, SIGNAL(clicked()), mPhoneNumberListWidget, SLOT(
remove()) );
301 connect( mAddButton, SIGNAL(clicked()), SLOT(changed()) );
302 connect( mRemoveButton, SIGNAL(clicked()), SLOT(changed()) );
311 mReadOnly = readOnly;
312 mAddButton->setEnabled( !readOnly );
313 mRemoveButton->setEnabled( !readOnly && mPhoneNumberListWidget->
phoneNumberCount() > 3 );
318 void PhoneEditWidget::changed()
320 mRemoveButton->setEnabled( !mReadOnly && mPhoneNumberListWidget->
phoneNumberCount() > 3 );
331 const KABC::PhoneNumber::List oldNumbers = contact.phoneNumbers();
332 for (
int i = 0; i < oldNumbers.count(); ++i ) {
333 contact.removePhoneNumber( oldNumbers.at( i ) );
336 const KABC::PhoneNumber::List newNumbers = mPhoneNumberListWidget->
phoneNumbers();
337 for (
int i = 0; i < newNumbers.count(); ++i ) {
338 contact.insertPhoneNumber( newNumbers.at( i ) );
348 setCaption( i18n(
"Edit Phone Number" ) );
349 setButtons( Ok | Cancel );
350 setDefaultButton( Ok );
351 showButtonSeparator(
true );
353 QWidget *page =
new QWidget(
this );
354 setMainWidget( page );
356 QVBoxLayout *layout =
new QVBoxLayout( page );
357 layout->setSpacing( spacingHint() );
358 layout->setMargin( 0 );
360 mPreferredBox =
new QCheckBox( i18n(
"This is the preferred phone number" ), page );
361 layout->addWidget( mPreferredBox );
363 QGroupBox *box =
new QGroupBox( i18n(
"Types" ), page );
364 layout->addWidget( box );
366 QGridLayout *buttonLayout =
new QGridLayout( box );
369 mTypeList = KABC::PhoneNumber::typeList();
370 mTypeList.removeAll( KABC::PhoneNumber::Pref );
372 KABC::PhoneNumber::TypeList::ConstIterator it;
373 mGroup =
new QButtonGroup( box );
374 mGroup->setExclusive(
false );
375 int row, column, counter;
376 row = column = counter = 0;
377 for ( it = mTypeList.constBegin(); it != mTypeList.constEnd(); ++it, ++counter ) {
378 QCheckBox *cb =
new QCheckBox( KABC::PhoneNumber::typeLabel( *it ), box );
379 cb->setChecked( type & mTypeList[ counter ] );
380 buttonLayout->addWidget( cb, row, column );
381 mGroup->addButton( cb );
390 mPreferredBox->setChecked( mType & KABC::PhoneNumber::Pref );
395 KABC::PhoneNumber::Type
type = 0;
397 for (
int i = 0; i < mGroup->buttons().count(); ++i ) {
398 QCheckBox *box =
dynamic_cast<QCheckBox*
>( mGroup->buttons().at( i ) ) ;
399 if ( box && box->isChecked() ) {
400 type |= mTypeList[ i ];
404 if ( mPreferredBox->isChecked() ) {
405 type = type | KABC::PhoneNumber::Pref;
407 type = type & ~KABC::PhoneNumber::Pref;
PhoneTypeDialog(KABC::PhoneNumber::Type type, QWidget *parent=0)
Creates a new phone type dialog.
A dialog for editing phone number types.
A combobox to select a phone number type.
~PhoneTypeCombo()
Destroys the phone type combo.
A QPointer which when destructed, deletes the object it points to.
KABC::PhoneNumber::Type type() const
Returns the selected type.
PhoneTypeCombo(QWidget *parent=0)
Creates a phone type combo.
void setType(KABC::PhoneNumber::Type type)
Sets the phone number type that shall be selected.
KABC::PhoneNumber::Type type() const
Returns the selected phone number type.