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 );
126 layout->addWidget( mTypeCombo );
127 layout->addWidget( mNumberEdit );
129 connect( mTypeCombo, SIGNAL(activated(
int)), SIGNAL(modified()) );
130 connect( mNumberEdit, SIGNAL(textChanged(QString)), SIGNAL(modified()) );
137 disconnect( mTypeCombo, SIGNAL(activated(
int)),
this, SIGNAL(modified()) );
138 mTypeCombo->
setType( number.type() );
139 connect( mTypeCombo, SIGNAL(activated(
int)), SIGNAL(modified()) );
141 mNumberEdit->setText( number.number() );
146 KABC::PhoneNumber
number( mNumber );
148 number.setType( mTypeCombo->
type() );
149 number.setNumber( mNumberEdit->text() );
156 mTypeCombo->setEnabled( !readOnly );
157 mNumberEdit->setReadOnly( readOnly );
161 : QWidget( parent ), mReadOnly( false )
163 mWidgetLayout =
new QVBoxLayout(
this );
165 mMapper =
new QSignalMapper(
this );
166 connect( mMapper, SIGNAL(mapped(
int)), SLOT(changed(
int)) );
177 mReadOnly = readOnly;
185 return mPhoneNumberList.count();
190 mPhoneNumberList = list;
192 KABC::PhoneNumber::TypeList types;
193 types << KABC::PhoneNumber::Home;
194 types << KABC::PhoneNumber::Work;
195 types << KABC::PhoneNumber::Cell;
198 if ( mPhoneNumberList.count() < 3 )
199 for (
int i = mPhoneNumberList.count(); i < 3; ++i )
200 mPhoneNumberList.append( KABC::PhoneNumber( QString(), types[ i ] ) );
202 recreateNumberWidgets();
207 KABC::PhoneNumber::List list;
209 KABC::PhoneNumber::List::ConstIterator it;
210 for ( it = mPhoneNumberList.constBegin(); it != mPhoneNumberList.constEnd(); ++it )
211 if ( !(*it).number().isEmpty() )
219 mPhoneNumberList.append( KABC::PhoneNumber() );
221 recreateNumberWidgets();
226 mPhoneNumberList.removeLast();
228 recreateNumberWidgets();
231 void PhoneNumberListWidget::recreateNumberWidgets()
233 foreach ( QWidget *
const widget, mWidgets ) {
234 mWidgetLayout->removeWidget( widget );
239 KABC::PhoneNumber::List::ConstIterator it;
241 for ( it = mPhoneNumberList.constBegin(); it != mPhoneNumberList.constEnd(); ++it ) {
245 mMapper->setMapping( wdg, counter );
246 connect( wdg, SIGNAL(modified()), mMapper, SLOT(map()) );
248 mWidgetLayout->addWidget( wdg );
249 mWidgets.append( wdg );
258 void PhoneNumberListWidget::changed(
int pos )
260 mPhoneNumberList[ pos ] = mWidgets.at( pos )->number();
264 : QWidget( parent ), mReadOnly( false )
266 QGridLayout *layout =
new QGridLayout(
this );
267 layout->setSpacing( KDialog::spacingHint() );
269 mListScrollArea =
new QScrollArea(
this );
271 mListScrollArea->setWidget( mPhoneNumberListWidget );
272 mListScrollArea->setWidgetResizable(
true );
275 const int scrollAreaMinHeight = mPhoneNumberListWidget->sizeHint().height() +
276 mListScrollArea->horizontalScrollBar()->sizeHint().height();
277 mListScrollArea->setMinimumHeight( scrollAreaMinHeight );
278 layout->addWidget( mListScrollArea, 0, 0, 1, 2 );
280 mAddButton =
new QPushButton( i18n(
"Add" ),
this );
281 mAddButton->setMaximumSize( mAddButton->sizeHint() );
282 layout->addWidget( mAddButton, 1, 0, Qt::AlignRight );
284 mRemoveButton =
new QPushButton( i18n(
"Remove" ),
this );
285 mRemoveButton->setMaximumSize( mRemoveButton->sizeHint() );
286 layout->addWidget( mRemoveButton, 1, 1 );
288 connect( mAddButton, SIGNAL(clicked()), mPhoneNumberListWidget, SLOT(add()) );
289 connect( mRemoveButton, SIGNAL(clicked()), mPhoneNumberListWidget, SLOT(
remove()) );
290 connect( mAddButton, SIGNAL(clicked()), SLOT(changed()) );
291 connect( mRemoveButton, SIGNAL(clicked()), SLOT(changed()) );
300 mReadOnly = readOnly;
301 mAddButton->setEnabled( !readOnly );
302 mRemoveButton->setEnabled( !readOnly && mPhoneNumberListWidget->
phoneNumberCount() > 3 );
307 void PhoneEditWidget::changed()
309 mRemoveButton->setEnabled( !mReadOnly && mPhoneNumberListWidget->
phoneNumberCount() > 3 );
320 const KABC::PhoneNumber::List oldNumbers = contact.phoneNumbers();
321 for (
int i = 0; i < oldNumbers.count(); ++i )
322 contact.removePhoneNumber( oldNumbers.at( i ) );
324 const KABC::PhoneNumber::List newNumbers = mPhoneNumberListWidget->
phoneNumbers();
325 for (
int i = 0; i < newNumbers.count(); ++i )
326 contact.insertPhoneNumber( newNumbers.at( i ) );
335 setCaption( i18n(
"Edit Phone Number" ) );
336 setButtons( Ok | Cancel );
337 setDefaultButton( Ok );
338 showButtonSeparator(
true );
340 QWidget *page =
new QWidget(
this );
341 setMainWidget( page );
343 QVBoxLayout *layout =
new QVBoxLayout( page );
344 layout->setSpacing( spacingHint() );
345 layout->setMargin( 0 );
347 mPreferredBox =
new QCheckBox( i18n(
"This is the preferred phone number" ), page );
348 layout->addWidget( mPreferredBox );
350 QGroupBox *box =
new QGroupBox( i18n(
"Types" ), page );
351 layout->addWidget( box );
353 QGridLayout *buttonLayout =
new QGridLayout( box );
356 mTypeList = KABC::PhoneNumber::typeList();
357 mTypeList.removeAll( KABC::PhoneNumber::Pref );
359 KABC::PhoneNumber::TypeList::ConstIterator it;
360 mGroup =
new QButtonGroup( box );
361 mGroup->setExclusive(
false );
362 int row, column, counter;
363 row = column = counter = 0;
364 for ( it = mTypeList.constBegin(); it != mTypeList.constEnd(); ++it, ++counter ) {
365 QCheckBox *cb =
new QCheckBox( KABC::PhoneNumber::typeLabel( *it ), box );
366 cb->setChecked( type & mTypeList[ counter ] );
367 buttonLayout->addWidget( cb, row, column );
368 mGroup->addButton( cb );
377 mPreferredBox->setChecked( mType & KABC::PhoneNumber::Pref );
382 KABC::PhoneNumber::Type
type = 0;
384 for (
int i = 0; i < mGroup->buttons().count(); ++i ) {
385 QCheckBox *box =
dynamic_cast<QCheckBox*
>( mGroup->buttons().at( i ) ) ;
386 if ( box && box->isChecked() )
387 type |= mTypeList[ i ];
390 if ( mPreferredBox->isChecked() )
391 type = type | KABC::PhoneNumber::Pref;
393 type = type & ~KABC::PhoneNumber::Pref;
398 #include "phoneeditwidget.moc"