00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "phoneeditwidget.h"
00024
00025 #include <QtCore/QSignalMapper>
00026 #include <QtCore/QString>
00027 #include <QtGui/QButtonGroup>
00028 #include <QtGui/QCheckBox>
00029 #include <QtGui/QGridLayout>
00030 #include <QtGui/QGroupBox>
00031 #include <QtGui/QHBoxLayout>
00032 #include <QtGui/QPushButton>
00033 #include <QtGui/QScrollArea>
00034 #include <QtGui/QScrollBar>
00035 #include <QtGui/QVBoxLayout>
00036
00037 #include <KComboBox>
00038 #include <KDebug>
00039 #include <KLineEdit>
00040 #include <KLocale>
00041
00042 #include <kabc/phonenumber.h>
00043
00044 PhoneTypeCombo::PhoneTypeCombo( QWidget *parent )
00045 : KComboBox( parent ),
00046 mType( KABC::PhoneNumber::Home ),
00047 mLastSelected( 0 )
00048 {
00049 setObjectName( "TypeCombo" );
00050
00051 for ( int i = 0; i < KABC::PhoneNumber::typeList().count(); ++i )
00052 mTypeList.append( KABC::PhoneNumber::typeList()[ i ] );
00053 mTypeList.append( -1 );
00054
00055 update();
00056
00057 connect( this, SIGNAL( activated( int ) ),
00058 this, SLOT( selected( int ) ) );
00059 connect( this, SIGNAL( activated( int ) ),
00060 this, SIGNAL( modified() ) );
00061 }
00062
00063 PhoneTypeCombo::~PhoneTypeCombo()
00064 {
00065 }
00066
00067 void PhoneTypeCombo::setType( KABC::PhoneNumber::Type type )
00068 {
00069 if ( !mTypeList.contains( type ) )
00070 mTypeList.insert( mTypeList.at( mTypeList.count() - 1 ), type );
00071
00072 mType = type;
00073 update();
00074 }
00075
00076 KABC::PhoneNumber::Type PhoneTypeCombo::type() const
00077 {
00078 return mType;
00079 }
00080
00081 void PhoneTypeCombo::update()
00082 {
00083 bool blocked = signalsBlocked();
00084 blockSignals( true );
00085
00086 clear();
00087 QList<int>::ConstIterator it;
00088 for ( it = mTypeList.begin(); it != mTypeList.end(); ++it ) {
00089 if ( *it == -1 ) {
00090 addItem( i18n( "Other..." ) );
00091 } else {
00092 KABC::PhoneNumber number;
00093 number.setType( KABC::PhoneNumber::Type( *it ) );
00094 addItem( number.typeLabel() );
00095 }
00096 }
00097
00098 setCurrentIndex( mLastSelected = mTypeList.indexOf( mType ) );
00099
00100 blockSignals( blocked );
00101 }
00102
00103 void PhoneTypeCombo::selected( int pos )
00104 {
00105 if ( mTypeList[ pos ] == -1 )
00106 otherSelected();
00107 else {
00108 mType = KABC::PhoneNumber::Type( mTypeList[ pos ] );
00109 mLastSelected = pos;
00110 }
00111 }
00112
00113 void PhoneTypeCombo::otherSelected()
00114 {
00115 PhoneTypeDialog dlg( mType, this );
00116 if ( dlg.exec() ) {
00117 mType = dlg.type();
00118 if ( !mTypeList.contains( mType ) )
00119 mTypeList.insert( mTypeList.at( mTypeList.count() - 1 ), mType );
00120 } else {
00121 setType( KABC::PhoneNumber::Type( mTypeList[ mLastSelected ] ) );
00122 }
00123
00124 update();
00125 }
00126
00127 PhoneNumberWidget::PhoneNumberWidget( QWidget *parent )
00128 : QWidget( parent )
00129 {
00130 QHBoxLayout *layout = new QHBoxLayout( this );
00131 layout->setSpacing( 11 );
00132 layout->setMargin( 6 );
00133
00134 mTypeCombo = new PhoneTypeCombo( this );
00135 mNumberEdit = new KLineEdit( this );
00136
00137 layout->addWidget( mTypeCombo );
00138 layout->addWidget( mNumberEdit );
00139
00140 connect( mTypeCombo, SIGNAL( modified() ), SIGNAL( modified() ) );
00141 connect( mNumberEdit, SIGNAL( textChanged( const QString& ) ), SIGNAL( modified() ) );
00142 }
00143
00144 void PhoneNumberWidget::setNumber( const KABC::PhoneNumber &number )
00145 {
00146 mNumber = number;
00147
00148 mTypeCombo->setType( number.type() );
00149 mNumberEdit->setText( number.number() );
00150 }
00151
00152 KABC::PhoneNumber PhoneNumberWidget::number() const
00153 {
00154 KABC::PhoneNumber number( mNumber );
00155
00156 number.setType( mTypeCombo->type() );
00157 number.setNumber( mNumberEdit->text() );
00158
00159 return number;
00160 }
00161
00162 void PhoneNumberWidget::setReadOnly( bool readOnly )
00163 {
00164 mTypeCombo->setEnabled( !readOnly );
00165 mNumberEdit->setReadOnly( readOnly );
00166 }
00167
00168 PhoneNumberListWidget::PhoneNumberListWidget( QWidget *parent )
00169 : QWidget( parent ), mReadOnly( false )
00170 {
00171 mWidgetLayout = new QVBoxLayout( this );
00172
00173 mMapper = new QSignalMapper( this );
00174 connect( mMapper, SIGNAL( mapped( int ) ), SLOT( changed( int ) ) );
00175
00176 setPhoneNumbers( KABC::PhoneNumber::List() );
00177 }
00178
00179 PhoneNumberListWidget::~PhoneNumberListWidget()
00180 {
00181 }
00182
00183 void PhoneNumberListWidget::setReadOnly( bool readOnly )
00184 {
00185 mReadOnly = readOnly;
00186
00187 foreach ( PhoneNumberWidget *const w, mWidgets )
00188 w->setReadOnly( readOnly );
00189 }
00190
00191 int PhoneNumberListWidget::phoneNumberCount() const
00192 {
00193 return mPhoneNumberList.count();
00194 }
00195
00196 void PhoneNumberListWidget::setPhoneNumbers( const KABC::PhoneNumber::List &list )
00197 {
00198 mPhoneNumberList = list;
00199
00200 KABC::PhoneNumber::TypeList types;
00201 types << KABC::PhoneNumber::Home;
00202 types << KABC::PhoneNumber::Work;
00203 types << KABC::PhoneNumber::Cell;
00204
00205
00206 if ( mPhoneNumberList.count() < 3 )
00207 for ( int i = mPhoneNumberList.count(); i < 3; ++i )
00208 mPhoneNumberList.append( KABC::PhoneNumber( "", types[ i ] ) );
00209
00210 recreateNumberWidgets();
00211 }
00212
00213 KABC::PhoneNumber::List PhoneNumberListWidget::phoneNumbers() const
00214 {
00215 KABC::PhoneNumber::List list;
00216
00217 KABC::PhoneNumber::List::ConstIterator it;
00218 for ( it = mPhoneNumberList.begin(); it != mPhoneNumberList.end(); ++it )
00219 if ( !(*it).number().isEmpty() )
00220 list.append( *it );
00221
00222 return list;
00223 }
00224
00225 void PhoneNumberListWidget::changed()
00226 {
00227 if ( !mReadOnly )
00228 emit modified();
00229 }
00230
00231 void PhoneNumberListWidget::add()
00232 {
00233 mPhoneNumberList.append( KABC::PhoneNumber() );
00234
00235 recreateNumberWidgets();
00236 }
00237
00238 void PhoneNumberListWidget::remove()
00239 {
00240 mPhoneNumberList.removeLast();
00241 changed();
00242
00243 recreateNumberWidgets();
00244 }
00245
00246 void PhoneNumberListWidget::recreateNumberWidgets()
00247 {
00248 foreach ( QWidget *const w, mWidgets ) {
00249 mWidgetLayout->removeWidget( w );
00250 w->deleteLater();
00251 }
00252 mWidgets.clear();
00253
00254 KABC::PhoneNumber::List::ConstIterator it;
00255 int counter = 0;
00256 for ( it = mPhoneNumberList.begin(); it != mPhoneNumberList.end(); ++it ) {
00257 PhoneNumberWidget *wdg = new PhoneNumberWidget( this );
00258 wdg->setNumber( *it );
00259
00260 mMapper->setMapping( wdg, counter );
00261 connect( wdg, SIGNAL( modified() ), mMapper, SLOT( map() ) );
00262
00263 mWidgetLayout->addWidget( wdg );
00264 mWidgets.append( wdg );
00265 wdg->show();
00266
00267 ++counter;
00268 }
00269 setReadOnly(mReadOnly);
00270 }
00271
00272 void PhoneNumberListWidget::changed( int pos )
00273 {
00274 mPhoneNumberList[ pos ] = mWidgets.at( pos )->number();
00275 changed();
00276 }
00277
00278 PhoneEditWidget::PhoneEditWidget( QWidget *parent, const char *name )
00279 : QWidget( parent ), mReadOnly( false )
00280 {
00281 setObjectName( name );
00282 QGridLayout *layout = new QGridLayout( this );
00283 layout->setSpacing( KDialog::spacingHint() );
00284
00285 mListScrollArea = new QScrollArea( this );
00286 mPhoneNumberListWidget = new PhoneNumberListWidget;
00287 mListScrollArea->setWidget( mPhoneNumberListWidget );
00288 mListScrollArea->setWidgetResizable( true );
00289
00290
00291 const int scrollAreaMinHeight = mPhoneNumberListWidget->sizeHint().height() +
00292 mListScrollArea->horizontalScrollBar()->sizeHint().height();
00293 mListScrollArea->setMinimumHeight( scrollAreaMinHeight );
00294 layout->addWidget( mListScrollArea, 0, 0, 1, 2 );
00295
00296 mAddButton = new QPushButton( i18n( "Add" ), this );
00297 mAddButton->setMaximumSize( mAddButton->sizeHint() );
00298 layout->addWidget( mAddButton, 1, 0, Qt::AlignRight );
00299
00300 mRemoveButton = new QPushButton( i18n( "Remove" ), this );
00301 mRemoveButton->setMaximumSize( mRemoveButton->sizeHint() );
00302 layout->addWidget( mRemoveButton, 1, 1 );
00303
00304 connect( mPhoneNumberListWidget, SIGNAL( modified() ), SIGNAL( modified() ) );
00305
00306 connect( mAddButton, SIGNAL( clicked() ), mPhoneNumberListWidget, SLOT( add() ) );
00307 connect( mRemoveButton, SIGNAL( clicked() ), mPhoneNumberListWidget, SLOT( remove() ) );
00308 connect( mAddButton, SIGNAL( clicked() ), SLOT( changed() ) );
00309 connect( mRemoveButton, SIGNAL( clicked() ), SLOT( changed() ) );
00310 }
00311
00312 PhoneEditWidget::~PhoneEditWidget()
00313 {
00314 }
00315
00316 void PhoneEditWidget::setReadOnly( bool readOnly )
00317 {
00318 mReadOnly = readOnly;
00319 mAddButton->setEnabled( !readOnly );
00320 mRemoveButton->setEnabled( !readOnly && mPhoneNumberListWidget->phoneNumberCount() > 3 );
00321
00322 mPhoneNumberListWidget->setReadOnly( readOnly );
00323 }
00324
00325 void PhoneEditWidget::changed()
00326 {
00327 mRemoveButton->setEnabled( !mReadOnly && mPhoneNumberListWidget->phoneNumberCount() > 3 );
00328 }
00329
00330 void PhoneEditWidget::setPhoneNumbers( const KABC::PhoneNumber::List &list )
00331 {
00332 mPhoneNumberListWidget->setPhoneNumbers( list );
00333 }
00334
00335 KABC::PhoneNumber::List PhoneEditWidget::phoneNumbers() const
00336 {
00337 return mPhoneNumberListWidget->phoneNumbers();
00338 }
00339
00341
00342 PhoneTypeDialog::PhoneTypeDialog( KABC::PhoneNumber::Type type, QWidget *parent )
00343 : KDialog( parent),
00344 mType( type )
00345 {
00346 setCaption( i18n( "Edit Phone Number" ) );
00347 setButtons( Ok | Cancel );
00348 setDefaultButton( Ok );
00349 showButtonSeparator( true );
00350 QWidget *page = new QWidget(this);
00351 setMainWidget( page );
00352
00353 QVBoxLayout *layout = new QVBoxLayout( page );
00354 layout->setSpacing( spacingHint() );
00355 layout->setMargin( 0 );
00356
00357 mPreferredBox = new QCheckBox( i18n( "This is the preferred phone number" ), page );
00358 layout->addWidget( mPreferredBox );
00359
00360 QGroupBox *box = new QGroupBox( i18n( "Types" ), page );
00361 layout->addWidget( box );
00362
00363 QHBoxLayout *buttonLayout = new QHBoxLayout( box );
00364
00365
00366 mTypeList = KABC::PhoneNumber::typeList();
00367 mTypeList.removeAll( KABC::PhoneNumber::Pref );
00368
00369 KABC::PhoneNumber::TypeList::ConstIterator it;
00370 mGroup = new QButtonGroup( box );
00371 int i = 0;
00372 for ( it = mTypeList.begin(); it != mTypeList.end(); ++it, ++i ) {
00373 QCheckBox *cb = new QCheckBox( KABC::PhoneNumber::typeLabel( *it ), box );
00374 cb->setChecked( type & mTypeList[ i ] );
00375 buttonLayout->addWidget( cb );
00376 mGroup->addButton( cb );
00377 }
00378 mPreferredBox->setChecked( mType & KABC::PhoneNumber::Pref );
00379 }
00380
00381 KABC::PhoneNumber::Type PhoneTypeDialog::type() const
00382 {
00383 KABC::PhoneNumber::Type type = 0;
00384
00385 for ( int i = 0; i < mGroup->buttons().count(); ++i ) {
00386 QCheckBox *box = dynamic_cast<QCheckBox*>( mGroup->buttons().at( i ) ) ;
00387 if ( box && box->isChecked() )
00388 type |= mTypeList[ i ];
00389 }
00390
00391 if ( mPreferredBox->isChecked() )
00392 type = type | KABC::PhoneNumber::Pref;
00393 else
00394 type = type & ~KABC::PhoneNumber::Pref;
00395
00396 return type;
00397 }
00398
00399
00400 #include "phoneeditwidget.moc"