• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • kdepim
  • Sitemap
  • Contact Us
 

kaddressbook

phoneeditwidget.cpp

Go to the documentation of this file.
00001 /*
00002     This file is part of KAddressBook.
00003     Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
00004 
00005     This program is free software; you can redistribute it and/or modify
00006     it under the terms of the GNU General Public License as published by
00007     the Free Software Foundation; either version 2 of the License, or
00008     (at your option) any later version.
00009 
00010     This program is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00013     GNU General Public License for more details.
00014 
00015     You should have received a copy of the GNU General Public License
00016     along with this program; if not, write to the Free Software
00017     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00018 
00019     As a special exception, permission is given to link this program
00020     with any edition of Qt, and distribute the resulting executable,
00021     without including the source code for Qt in the source distribution.
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 ); // Others...
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 ) { // "Other..." entry
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   // add an empty entry per default
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   // ugly but size policies seem to be messed up dialog (parent) wide
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 // PhoneTypeDialog
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   // fill widgets
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"

kaddressbook

Skip menu "kaddressbook"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

kdepim

Skip menu "kdepim"
  • akonadi
  •   clients
  •   kabc
  •   kcal
  •   kcm
  • akregator
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt
  • kdgantt1
  • kjots
  • kleopatra
  • kmail
  • kmobiletools
  • knode
  • knotes
  • kontact
  • kontactinterfaces
  • korganizer
  •   korgac
  • kpilot
  • ktimetracker
  • libkdepim
  • libkholidays
  • libkleo
  • libkpgp
  • maildir
Generated for kdepim by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal