22 #include "phoneeditwidget.h"
24 #include "autoqpointer_p.h"
26 #include <QtCore/QSignalMapper>
27 #include <QtCore/QString>
28 #include <QtGui/QButtonGroup>
29 #include <QtGui/QCheckBox>
30 #include <QtGui/QGridLayout>
31 #include <QtGui/QGroupBox>
32 #include <QtGui/QHBoxLayout>
33 #include <QtGui/QPushButton>
34 #include <QtGui/QScrollArea>
35 #include <QtGui/QScrollBar>
36 #include <QtGui/QVBoxLayout>
38 #include <kabc/phonenumber.h>
39 #include <kcombobox.h>
41 #include <klineedit.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 ) );
52 mTypeList.append( -1 );
56 connect(
this, SIGNAL(activated(
int)),
57 this, SLOT(selected(
int)) );
66 if ( !mTypeList.contains( type ) )
67 mTypeList.insert( mTypeList.at( mTypeList.count() - 1 ), type );
78 void PhoneTypeCombo::update()
82 for (
int i = 0; i < mTypeList.count(); ++i ) {
83 if ( mTypeList.at( i ) == -1 )
84 addItem( i18nc(
"@item:inlistbox Category of contact info field",
"Other..." ) );
86 addItem( KABC::PhoneNumber::typeLabel( KABC::PhoneNumber::Type( mTypeList.at( i ) ) ) );
89 setCurrentIndex( mLastSelected = mTypeList.indexOf( mType ) );
92 void PhoneTypeCombo::selected(
int pos )
94 if ( mTypeList.at( pos ) == -1 )
97 mType = KABC::PhoneNumber::Type( mTypeList.at( pos ) );
102 void PhoneTypeCombo::otherSelected()
107 if ( !mTypeList.contains( mType ) )
108 mTypeList.insert( mTypeList.at( mTypeList.count() - 1 ), mType );
110 setType( KABC::PhoneNumber::Type( mTypeList.at( mLastSelected ) ) );
119 QHBoxLayout *layout =
new QHBoxLayout(
this );
120 layout->setSpacing( 11 );
121 layout->setMargin( 0 );
124 mNumberEdit =
new KLineEdit(
this );
125 QFontMetrics fm(font());
126 mNumberEdit->setMinimumWidth(fm.width(QLatin1String(
"MMMMMMMMMM")));
128 layout->addWidget( mTypeCombo );
129 layout->addWidget( mNumberEdit );
131 connect( mTypeCombo, SIGNAL(activated(
int)), SIGNAL(modified()) );
132 connect( mNumberEdit, SIGNAL(textChanged(QString)), SIGNAL(modified()) );
139 disconnect( mTypeCombo, SIGNAL(activated(
int)),
this, SIGNAL(modified()) );
140 mTypeCombo->
setType( number.type() );
141 connect( mTypeCombo, SIGNAL(activated(
int)), SIGNAL(modified()) );
143 mNumberEdit->setText( number.number() );
148 KABC::PhoneNumber
number( mNumber );
150 number.setType( mTypeCombo->
type() );
151 number.setNumber( mNumberEdit->text() );
158 mTypeCombo->setEnabled( !readOnly );
159 mNumberEdit->setReadOnly( readOnly );
163 : QWidget( parent ), mReadOnly( false )
165 mWidgetLayout =
new QVBoxLayout(
this );
167 mMapper =
new QSignalMapper(
this );
168 connect( mMapper, SIGNAL(mapped(
int)), SLOT(changed(
int)) );
179 mReadOnly = readOnly;
187 return mPhoneNumberList.count();
192 mPhoneNumberList = list;
194 KABC::PhoneNumber::TypeList types;
195 types << KABC::PhoneNumber::Home;
196 types << KABC::PhoneNumber::Work;
197 types << KABC::PhoneNumber::Cell;
200 if ( mPhoneNumberList.count() < 3 )
201 for (
int i = mPhoneNumberList.count(); i < 3; ++i )
202 mPhoneNumberList.append( KABC::PhoneNumber( QString(), types[ i ] ) );
204 recreateNumberWidgets();
209 KABC::PhoneNumber::List list;
211 KABC::PhoneNumber::List::ConstIterator it;
212 for ( it = mPhoneNumberList.constBegin(); it != mPhoneNumberList.constEnd(); ++it )
213 if ( !(*it).number().isEmpty() )
221 mPhoneNumberList.append( KABC::PhoneNumber() );
223 recreateNumberWidgets();
228 mPhoneNumberList.removeLast();
230 recreateNumberWidgets();
233 void PhoneNumberListWidget::recreateNumberWidgets()
235 foreach ( QWidget *
const widget, mWidgets ) {
236 mWidgetLayout->removeWidget( widget );
241 KABC::PhoneNumber::List::ConstIterator it;
243 for ( it = mPhoneNumberList.constBegin(); it != mPhoneNumberList.constEnd(); ++it ) {
247 mMapper->setMapping( wdg, counter );
248 connect( wdg, SIGNAL(modified()), mMapper, SLOT(map()) );
250 mWidgetLayout->addWidget( wdg );
251 mWidgets.append( wdg );
260 void PhoneNumberListWidget::changed(
int pos )
262 mPhoneNumberList[ pos ] = mWidgets.at( pos )->number();
266 : QWidget( parent ), mReadOnly( false )
268 QGridLayout *layout =
new QGridLayout(
this );
269 layout->setSpacing( KDialog::spacingHint() );
271 mListScrollArea =
new QScrollArea(
this );
273 mListScrollArea->setWidget( mPhoneNumberListWidget );
274 mListScrollArea->setWidgetResizable(
true );
277 const int scrollAreaMinHeight = mPhoneNumberListWidget->sizeHint().height() +
278 mListScrollArea->horizontalScrollBar()->sizeHint().height();
279 mListScrollArea->setMinimumHeight( scrollAreaMinHeight );
280 layout->addWidget( mListScrollArea, 0, 0, 1, 2 );
282 mAddButton =
new QPushButton( i18n(
"Add" ),
this );
283 mAddButton->setMaximumSize( mAddButton->sizeHint() );
284 layout->addWidget( mAddButton, 1, 0, Qt::AlignRight );
286 mRemoveButton =
new QPushButton( i18n(
"Remove" ),
this );
287 mRemoveButton->setMaximumSize( mRemoveButton->sizeHint() );
288 layout->addWidget( mRemoveButton, 1, 1 );
290 connect( mAddButton, SIGNAL(clicked()), mPhoneNumberListWidget, SLOT(add()) );
291 connect( mRemoveButton, SIGNAL(clicked()), mPhoneNumberListWidget, SLOT(
remove()) );
292 connect( mAddButton, SIGNAL(clicked()), SLOT(changed()) );
293 connect( mRemoveButton, SIGNAL(clicked()), SLOT(changed()) );
302 mReadOnly = readOnly;
303 mAddButton->setEnabled( !readOnly );
304 mRemoveButton->setEnabled( !readOnly && mPhoneNumberListWidget->
phoneNumberCount() > 3 );
309 void PhoneEditWidget::changed()
311 mRemoveButton->setEnabled( !mReadOnly && mPhoneNumberListWidget->
phoneNumberCount() > 3 );
322 const KABC::PhoneNumber::List oldNumbers = contact.phoneNumbers();
323 for (
int i = 0; i < oldNumbers.count(); ++i )
324 contact.removePhoneNumber( oldNumbers.at( i ) );
326 const KABC::PhoneNumber::List newNumbers = mPhoneNumberListWidget->
phoneNumbers();
327 for (
int i = 0; i < newNumbers.count(); ++i )
328 contact.insertPhoneNumber( newNumbers.at( i ) );
337 setCaption( i18n(
"Edit Phone Number" ) );
338 setButtons( Ok | Cancel );
339 setDefaultButton( Ok );
340 showButtonSeparator(
true );
342 QWidget *page =
new QWidget(
this );
343 setMainWidget( page );
345 QVBoxLayout *layout =
new QVBoxLayout( page );
346 layout->setSpacing( spacingHint() );
347 layout->setMargin( 0 );
349 mPreferredBox =
new QCheckBox( i18n(
"This is the preferred phone number" ), page );
350 layout->addWidget( mPreferredBox );
352 QGroupBox *box =
new QGroupBox( i18n(
"Types" ), page );
353 layout->addWidget( box );
355 QGridLayout *buttonLayout =
new QGridLayout( box );
358 mTypeList = KABC::PhoneNumber::typeList();
359 mTypeList.removeAll( KABC::PhoneNumber::Pref );
361 KABC::PhoneNumber::TypeList::ConstIterator it;
362 mGroup =
new QButtonGroup( box );
363 mGroup->setExclusive(
false );
364 int row, column, counter;
365 row = column = counter = 0;
366 for ( it = mTypeList.constBegin(); it != mTypeList.constEnd(); ++it, ++counter ) {
367 QCheckBox *cb =
new QCheckBox( KABC::PhoneNumber::typeLabel( *it ), box );
368 cb->setChecked( type & mTypeList[ counter ] );
369 buttonLayout->addWidget( cb, row, column );
370 mGroup->addButton( cb );
379 mPreferredBox->setChecked( mType & KABC::PhoneNumber::Pref );
384 KABC::PhoneNumber::Type
type = 0;
386 for (
int i = 0; i < mGroup->buttons().count(); ++i ) {
387 QCheckBox *box =
dynamic_cast<QCheckBox*
>( mGroup->buttons().at( i ) ) ;
388 if ( box && box->isChecked() )
389 type |= mTypeList[ i ];
392 if ( mPreferredBox->isChecked() )
393 type = type | KABC::PhoneNumber::Pref;
395 type = type & ~KABC::PhoneNumber::Pref;
400 #include "phoneeditwidget.moc"