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.