00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <tqbuttongroup.h>
00025 #include <tqcheckbox.h>
00026 #include <tqlabel.h>
00027 #include <tqlayout.h>
00028 #include <tqlistbox.h>
00029 #include <tqlistview.h>
00030 #include <tqpushbutton.h>
00031 #include <tqsignalmapper.h>
00032 #include <tqstring.h>
00033 #include <tqtooltip.h>
00034
00035 #include <tdeapplication.h>
00036 #include <kbuttonbox.h>
00037 #include <kcombobox.h>
00038 #include <tdeconfig.h>
00039 #include <kdebug.h>
00040 #include <kiconloader.h>
00041 #include <klineedit.h>
00042 #include <tdelistview.h>
00043 #include <tdelocale.h>
00044
00045 #include <tdeabc/phonenumber.h>
00046
00047 #include "phoneeditwidget.h"
00048
00049 PhoneTypeCombo::PhoneTypeCombo( TQWidget *parent )
00050 : KComboBox( parent, "TypeCombo" ),
00051 mType( TDEABC::PhoneNumber::Home ),
00052 mLastSelected( 0 ),
00053 mTypeList( TDEABC::PhoneNumber::typeList() )
00054 {
00055 mTypeList.append( -1 );
00056
00057 update();
00058
00059 connect( this, TQT_SIGNAL( activated( int ) ),
00060 this, TQT_SLOT( selected( int ) ) );
00061 connect( this, TQT_SIGNAL( activated( int ) ),
00062 this, TQT_SIGNAL( modified() ) );
00063 }
00064
00065 PhoneTypeCombo::~PhoneTypeCombo()
00066 {
00067 }
00068
00069 void PhoneTypeCombo::setType( int type )
00070 {
00071 if ( !mTypeList.contains( type ) )
00072 mTypeList.insert( mTypeList.at( mTypeList.count() - 1 ), type );
00073
00074 mType = type;
00075 update();
00076 }
00077
00078 int PhoneTypeCombo::type() const
00079 {
00080 return mType;
00081 }
00082
00083 void PhoneTypeCombo::update()
00084 {
00085 bool blocked = signalsBlocked();
00086 blockSignals( true );
00087
00088 clear();
00089 TQValueList<int>::ConstIterator it;
00090 for ( it = mTypeList.begin(); it != mTypeList.end(); ++it ) {
00091 if ( *it == -1 ) {
00092 insertItem( i18n( "Other..." ) );
00093 } else {
00094 TDEABC::PhoneNumber number;
00095 number.setType( *it );
00096 insertItem( number.typeLabel() );
00097 }
00098 }
00099
00100 setCurrentItem( mLastSelected = mTypeList.findIndex( mType ) );
00101
00102 blockSignals( blocked );
00103 }
00104
00105 void PhoneTypeCombo::selected( int pos )
00106 {
00107 if ( mTypeList[ pos ] == -1 )
00108 otherSelected();
00109 else {
00110 mType = mTypeList[ pos ];
00111 mLastSelected = pos;
00112 }
00113 }
00114
00115 void PhoneTypeCombo::otherSelected()
00116 {
00117 PhoneTypeDialog dlg( mType, this );
00118 if ( dlg.exec() ) {
00119 mType = dlg.type();
00120 if ( !mTypeList.contains( mType ) )
00121 mTypeList.insert( mTypeList.at( mTypeList.count() - 1 ), mType );
00122 } else {
00123 setType( mTypeList[ mLastSelected ] );
00124 }
00125
00126 update();
00127 }
00128
00129 PhoneNumberWidget::PhoneNumberWidget( TQWidget *parent )
00130 : TQWidget( parent )
00131 {
00132 TQHBoxLayout *layout = new TQHBoxLayout( this, 6, 11 );
00133
00134 mTypeCombo = new PhoneTypeCombo( this );
00135 mNumberEdit = new KLineEdit( this );
00136
00137 layout->addWidget( mTypeCombo );
00138 layout->addWidget( mNumberEdit );
00139
00140 connect( mTypeCombo, TQT_SIGNAL( modified() ), TQT_SIGNAL( modified() ) );
00141 connect( mNumberEdit, TQT_SIGNAL( textChanged( const TQString& ) ), TQT_SIGNAL( modified() ) );
00142 }
00143
00144 void PhoneNumberWidget::setNumber( const TDEABC::PhoneNumber &number )
00145 {
00146 mNumber = number;
00147
00148 mTypeCombo->setType( number.type() );
00149 mNumberEdit->setText( number.number() );
00150 }
00151
00152 TDEABC::PhoneNumber PhoneNumberWidget::number() const
00153 {
00154 TDEABC::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
00169 PhoneEditWidget::PhoneEditWidget( TQWidget *parent, const char *name )
00170 : TQWidget( parent, name ), mReadOnly( false )
00171 {
00172 TQGridLayout *layout = new TQGridLayout( this, 2, 2 );
00173 layout->setSpacing( KDialog::spacingHint() );
00174
00175 mWidgetLayout = new TQVBoxLayout( layout );
00176 layout->addMultiCellLayout( mWidgetLayout, 0, 0, 0, 1 );
00177
00178 mAddButton = new TQPushButton( i18n( "Add" ), this );
00179 mAddButton->setMaximumSize( mAddButton->sizeHint() );
00180 layout->addWidget( mAddButton, 1, 0, TQt::AlignRight );
00181
00182 mRemoveButton = new TQPushButton( i18n( "Remove" ), this );
00183 mRemoveButton->setMaximumSize( mRemoveButton->sizeHint() );
00184 layout->addWidget( mRemoveButton, 1, 1 );
00185
00186 mMapper = new TQSignalMapper( TQT_TQOBJECT(this) );
00187 connect( mMapper, TQT_SIGNAL( mapped( int ) ), TQT_SLOT( changed( int ) ) );
00188
00189 connect( mAddButton, TQT_SIGNAL( clicked() ), TQT_SLOT( add() ) );
00190 connect( mRemoveButton, TQT_SIGNAL( clicked() ), TQT_SLOT( remove() ) );
00191 }
00192
00193 PhoneEditWidget::~PhoneEditWidget()
00194 {
00195 }
00196
00197 void PhoneEditWidget::setReadOnly( bool readOnly )
00198 {
00199 mReadOnly = readOnly;
00200 mAddButton->setEnabled( !readOnly );
00201 mRemoveButton->setEnabled( !readOnly && mPhoneNumberList.count() > 3 );
00202
00203 TQPtrListIterator<PhoneNumberWidget> it( mWidgets );
00204 while ( it.current() ) {
00205 it.current()->setReadOnly( readOnly );
00206 ++it;
00207 }
00208 }
00209
00210 void PhoneEditWidget::setPhoneNumbers( const TDEABC::PhoneNumber::List &list )
00211 {
00212 mPhoneNumberList = list;
00213
00214 TDEABC::PhoneNumber::TypeList types;
00215 types << TDEABC::PhoneNumber::Home;
00216 types << TDEABC::PhoneNumber::Work;
00217 types << TDEABC::PhoneNumber::Cell;
00218
00219
00220 if ( mPhoneNumberList.count() < 3 )
00221 for ( int i = mPhoneNumberList.count(); i < 3; ++i )
00222 mPhoneNumberList.append( TDEABC::PhoneNumber( "", types[ i ] ) );
00223
00224 recreateNumberWidgets();
00225 }
00226
00227 TDEABC::PhoneNumber::List PhoneEditWidget::phoneNumbers() const
00228 {
00229 TDEABC::PhoneNumber::List list;
00230
00231 TDEABC::PhoneNumber::List::ConstIterator it;
00232 for ( it = mPhoneNumberList.begin(); it != mPhoneNumberList.end(); ++it )
00233 if ( !(*it).number().isEmpty() )
00234 list.append( *it );
00235
00236 return list;
00237 }
00238
00239 void PhoneEditWidget::changed()
00240 {
00241 if ( !mReadOnly )
00242 emit modified();
00243 }
00244
00245 void PhoneEditWidget::add()
00246 {
00247 mPhoneNumberList.append( TDEABC::PhoneNumber() );
00248
00249 recreateNumberWidgets();
00250 }
00251
00252 void PhoneEditWidget::remove()
00253 {
00254 mPhoneNumberList.remove( mPhoneNumberList.last() );
00255 changed();
00256
00257 recreateNumberWidgets();
00258 }
00259
00260 void PhoneEditWidget::recreateNumberWidgets()
00261 {
00262 for ( TQWidget *w = mWidgets.first(); w; w = mWidgets.next() ) {
00263 mWidgetLayout->remove( w );
00264 w->deleteLater();
00265 }
00266 mWidgets.clear();
00267
00268 TDEABC::PhoneNumber::List::ConstIterator it;
00269 int counter = 0;
00270 for ( it = mPhoneNumberList.begin(); it != mPhoneNumberList.end(); ++it ) {
00271 PhoneNumberWidget *wdg = new PhoneNumberWidget( this );
00272 wdg->setNumber( *it );
00273
00274 mMapper->setMapping( TQT_TQOBJECT(wdg), counter );
00275 connect( wdg, TQT_SIGNAL( modified() ), mMapper, TQT_SLOT( map() ) );
00276
00277 mWidgetLayout->addWidget( wdg );
00278 mWidgets.append( wdg );
00279 wdg->show();
00280
00281 ++counter;
00282 }
00283 setReadOnly(mReadOnly);
00284 }
00285
00286 void PhoneEditWidget::changed( int pos )
00287 {
00288 mPhoneNumberList[ pos ] = mWidgets.at( pos )->number();
00289 changed();
00290 }
00291
00293
00294 PhoneTypeDialog::PhoneTypeDialog( int type, TQWidget *parent )
00295 : KDialogBase( Plain, i18n( "Edit Phone Number" ), Ok | Cancel, Ok,
00296 parent, "PhoneTypeDialog", true ),
00297 mType( type )
00298 {
00299 TQWidget *page = plainPage();
00300
00301 TQVBoxLayout *layout = new TQVBoxLayout( page, spacingHint() );
00302
00303 mPreferredBox = new TQCheckBox( i18n( "This is the preferred phone number" ), page );
00304 layout->addWidget( mPreferredBox );
00305
00306 mGroup = new TQButtonGroup( 2, Qt::Horizontal, i18n( "Types" ), page );
00307 layout->addWidget( mGroup );
00308
00309
00310 mTypeList = TDEABC::PhoneNumber::typeList();
00311 mTypeList.remove( TDEABC::PhoneNumber::Pref );
00312
00313 TDEABC::PhoneNumber::TypeList::ConstIterator it;
00314 for ( it = mTypeList.begin(); it != mTypeList.end(); ++it )
00315 new TQCheckBox( TDEABC::PhoneNumber::typeLabel( *it ), mGroup );
00316
00317 for ( int i = 0; i < mGroup->count(); ++i ) {
00318 TQCheckBox *box = (TQCheckBox*)mGroup->find( i );
00319 box->setChecked( mType & mTypeList[ i ] );
00320 }
00321
00322 mPreferredBox->setChecked( mType & TDEABC::PhoneNumber::Pref );
00323 }
00324
00325 int PhoneTypeDialog::type() const
00326 {
00327 int type = 0;
00328
00329 for ( int i = 0; i < mGroup->count(); ++i ) {
00330 TQCheckBox *box = (TQCheckBox*)mGroup->find( i );
00331 if ( box->isChecked() )
00332 type += mTypeList[ i ];
00333 }
00334
00335 if ( mPreferredBox->isChecked() )
00336 type = type | TDEABC::PhoneNumber::Pref;
00337 else
00338 type = type & ~TDEABC::PhoneNumber::Pref;
00339
00340 return type;
00341 }
00342
00343
00344 #include "phoneeditwidget.moc"