addresseeeditorwidget.cpp
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 TQt, and distribute the resulting executable, 00021 without including the source code for TQt in the source distribution. 00022 */ 00023 00024 #include <tqcheckbox.h> 00025 #include <tqhbox.h> 00026 #include <tqlabel.h> 00027 #include <tqlayout.h> 00028 #include <tqlistbox.h> 00029 #include <tqpushbutton.h> 00030 #include <tqtabwidget.h> 00031 #include <tqtextedit.h> 00032 #include <tqtoolbutton.h> 00033 #include <tqtooltip.h> 00034 00035 #include <tdeabc/resource.h> 00036 #include <tdeabc/stdaddressbook.h> 00037 #include <tdeaccelmanager.h> 00038 #include <tdeapplication.h> 00039 #include <tdeconfig.h> 00040 #include <kcombobox.h> 00041 #include <kdebug.h> 00042 #include <kdialogbase.h> 00043 #include <tdeglobal.h> 00044 #include <kiconloader.h> 00045 #include <klineedit.h> 00046 #include <tdelocale.h> 00047 #include <tdemessagebox.h> 00048 #include <kseparator.h> 00049 #include <ksqueezedtextlabel.h> 00050 #include <kstandarddirs.h> 00051 00052 #include <libtdepim/addresseelineedit.h> 00053 #include <libtdepim/categoryeditdialog.h> 00054 #include <libtdepim/categoryselectdialog.h> 00055 #include <libtdepim/kdateedit.h> 00056 #include <libtdepim/resourceabc.h> 00057 00058 #include "addresseditwidget.h" 00059 #include "advancedcustomfields.h" 00060 #include "emaileditwidget.h" 00061 #include "imeditwidget.h" 00062 #include "kabprefs.h" 00063 #include "keywidget.h" 00064 #include "nameeditdialog.h" 00065 #include "phoneeditwidget.h" 00066 #include "secrecywidget.h" 00067 00068 #include "addresseeeditorwidget.h" 00069 00070 AddresseeEditorWidget::AddresseeEditorWidget( TQWidget *parent, const char *name ) 00071 : AddresseeEditorBase( parent, name ), 00072 mBlockSignals( false ), mReadOnly( false ) 00073 { 00074 kdDebug(5720) << "AddresseeEditorWidget()" << endl; 00075 00076 initGUI(); 00077 mCategorySelectDialog = 0; 00078 mCategoryEditDialog = 0; 00079 00080 // Load the empty addressee as defaults 00081 load(); 00082 00083 mDirty = false; 00084 } 00085 00086 AddresseeEditorWidget::~AddresseeEditorWidget() 00087 { 00088 kdDebug(5720) << "~AddresseeEditorWidget()" << endl; 00089 } 00090 00091 void AddresseeEditorWidget::setAddressee( const TDEABC::Addressee &addr ) 00092 { 00093 if ( mAddressee.uid() == addr.uid() ) 00094 return; 00095 mAddressee = addr; 00096 00097 bool readOnly = false; 00098 if ( TDEABC::Resource *res = addr.resource() ) { 00099 if ( res->readOnly() ) { 00100 readOnly = true; 00101 00102 //Kolab resources have finer access control than planned in the overall design. 00103 } else if ( res->inherits( "KPIM::ResourceABC" ) ) { 00104 KPIM::ResourceABC *resAbc = static_cast<KPIM::ResourceABC *>( res ); 00105 00106 TQString subresource = resAbc->uidToResourceMap()[ addr.uid() ]; 00107 if ( !subresource.isEmpty() ) 00108 readOnly |= !resAbc->subresourceWritable( subresource ); 00109 } 00110 } 00111 setReadOnly( readOnly ); 00112 00113 load(); 00114 } 00115 00116 const TDEABC::Addressee &AddresseeEditorWidget::addressee() 00117 { 00118 return mAddressee; 00119 } 00120 00121 void AddresseeEditorWidget::textChanged( const TQString& ) 00122 { 00123 emitModified(); 00124 } 00125 00126 void AddresseeEditorWidget::initGUI() 00127 { 00128 TQVBoxLayout *layout = new TQVBoxLayout( this ); 00129 00130 mTabWidget = new TQTabWidget( this ); 00131 layout->addWidget( mTabWidget ); 00132 00133 setupTab1(); 00134 setupTab2(); 00135 setupAdditionalTabs(); 00136 setupCustomFieldsTabs(); 00137 00138 connect( mTabWidget, TQT_SIGNAL( currentChanged(TQWidget*) ), 00139 TQT_SLOT( pageChanged(TQWidget*) ) ); 00140 } 00141 00142 void AddresseeEditorWidget::setupTab1() 00143 { 00144 // This is the General tab 00145 TQWidget *tab1 = new TQWidget( mTabWidget ); 00146 00147 TQGridLayout *layout = new TQGridLayout( tab1, 11, 7 ); 00148 layout->setMargin( KDialogBase::marginHint() ); 00149 layout->setSpacing( KDialogBase::spacingHint() ); 00150 00151 TQLabel *label; 00152 KSeparator* bar; 00153 TQPushButton *button; 00154 00156 // Upper left group (person info) 00157 00158 // Person icon 00159 label = new TQLabel( tab1 ); 00160 label->setPixmap( TDEGlobal::iconLoader()->loadIcon( "preferences-desktop-personal", TDEIcon::Desktop, 00161 TDEIcon::SizeMedium ) ); 00162 layout->addMultiCellWidget( label, 0, 1, 0, 0 ); 00163 00164 // First name 00165 button = new TQPushButton( i18n( "Edit Name..." ), tab1 ); 00166 TQToolTip::add( button, i18n( "Edit the contact's name" ) ); 00167 mNameEdit = new KLineEdit( tab1, "mNameEdit" ); 00168 connect( mNameEdit, TQT_SIGNAL( textChanged( const TQString& ) ), 00169 TQT_SLOT( nameTextChanged( const TQString& ) ) ); 00170 connect( button, TQT_SIGNAL( clicked() ), TQT_SLOT( nameButtonClicked() ) ); 00171 mNameLabel = new KSqueezedTextLabel( tab1 ); 00172 00173 if ( KABPrefs::instance()->automaticNameParsing() ) { 00174 mNameLabel->hide(); 00175 mNameEdit->show(); 00176 } else { 00177 mNameEdit->hide(); 00178 mNameLabel->show(); 00179 } 00180 00181 layout->addWidget( button, 0, 1 ); 00182 layout->addWidget( mNameEdit, 0, 2 ); 00183 layout->addWidget( mNameLabel, 0, 2 ); 00184 label = new TQLabel( i18n( "<roleLabel>:", "%1:" ).arg( TDEABC::Addressee::roleLabel() ), tab1 ); 00185 mRoleEdit = new KLineEdit( tab1 ); 00186 connect( mRoleEdit, TQT_SIGNAL( textChanged( const TQString& ) ), 00187 TQT_SLOT( textChanged( const TQString& ) ) ); 00188 label->setBuddy( mRoleEdit ); 00189 layout->addWidget( label, 1, 1 ); 00190 layout->addWidget( mRoleEdit, 1, 2 ); 00191 00192 // Organization 00193 label = new TQLabel( i18n( "<organizationLabel>:", "%1:" ).arg( TDEABC::Addressee::organizationLabel() ), tab1 ); 00194 mOrgEdit = new KLineEdit( tab1 ); 00195 label->setBuddy( mOrgEdit ); 00196 connect( mOrgEdit, TQT_SIGNAL( textChanged( const TQString& ) ), 00197 TQT_SLOT( organizationTextChanged( const TQString& ) ) ); 00198 layout->addWidget( label, 2, 1 ); 00199 layout->addWidget( mOrgEdit, 2, 2 ); 00200 00201 // File as (formatted name) 00202 label = new TQLabel( i18n( "Formatted name:" ), tab1 ); 00203 mFormattedNameLabel = new KSqueezedTextLabel( tab1 ); 00204 layout->addWidget( label, 3, 1 ); 00205 layout->addWidget( mFormattedNameLabel, 3, 2 ); 00206 00207 // Left hand separator. This separator doesn't go all the way 00208 // across so the dialog still flows from top to bottom 00209 bar = new KSeparator( KSeparator::HLine, tab1 ); 00210 layout->addMultiCellWidget( bar, 4, 4, 0, 2 ); 00211 00213 // Phone numbers (upper right) 00214 label = new TQLabel( tab1 ); 00215 label->setPixmap( TDEGlobal::iconLoader()->loadIcon( "kaddressbook", 00216 TDEIcon::Desktop, TDEIcon::SizeMedium ) ); 00217 layout->addMultiCellWidget( label, 0, 1, 3, 3 ); 00218 00219 mPhoneEditWidget = new PhoneEditWidget( tab1 ); 00220 connect( mPhoneEditWidget, TQT_SIGNAL( modified() ), TQT_SLOT( emitModified() ) ); 00221 layout->addMultiCellWidget( mPhoneEditWidget, 0, 3, 4, 6 ); 00222 00223 bar = new KSeparator( KSeparator::HLine, tab1 ); 00224 layout->addMultiCellWidget( bar, 4, 4, 3, 6 ); 00225 00227 // Addresses (lower left) 00228 label = new TQLabel( tab1 ); 00229 label->setPixmap( TDEGlobal::iconLoader()->loadIcon( "kfm_home", TDEIcon::Desktop, 00230 TDEIcon::SizeMedium ) ); 00231 layout->addMultiCellWidget( label, 5, 6, 0, 0 ); 00232 00233 mAddressEditWidget = new AddressEditWidget( tab1 ); 00234 connect( mAddressEditWidget, TQT_SIGNAL( modified() ), TQT_SLOT( emitModified() ) ); 00235 layout->addMultiCellWidget( mAddressEditWidget, 5, 10, 1, 2 ); 00236 00238 // Email / Web (lower right) 00239 label = new TQLabel( tab1 ); 00240 label->setPixmap( TDEGlobal::iconLoader()->loadIcon( "email", TDEIcon::Desktop, 00241 TDEIcon::SizeMedium ) ); 00242 layout->addMultiCellWidget( label, 5, 6, 3, 3 ); 00243 00244 mEmailWidget = new EmailEditWidget( tab1 ); 00245 connect( mEmailWidget, TQT_SIGNAL( modified() ), TQT_SLOT( emitModified() ) ); 00246 layout->addMultiCellWidget( mEmailWidget, 5, 6, 4, 6 ); 00247 00248 // add the separator 00249 bar = new KSeparator( KSeparator::HLine, tab1 ); 00250 layout->addMultiCellWidget( bar, 7, 7, 3, 6 ); 00251 00252 TQHBoxLayout *homePageLayout = new TQHBoxLayout( 0, 11, 7 ); 00253 00254 label = new TQLabel( tab1 ); 00255 label->setPixmap( TDEGlobal::iconLoader()->loadIcon( "homepage", TDEIcon::Desktop, 00256 TDEIcon::SizeMedium ) ); 00257 homePageLayout->addWidget( label ); 00258 00259 label = new TQLabel( i18n( "<urlLabel>:", "%1:" ).arg( TDEABC::Addressee::urlLabel() ), tab1 ); 00260 mURLEdit = new KLineEdit( tab1 ); 00261 connect( mURLEdit, TQT_SIGNAL( textChanged( const TQString& ) ), 00262 TQT_SLOT( textChanged( const TQString& ) ) ); 00263 label->setBuddy( mURLEdit ); 00264 homePageLayout->addWidget( label ); 00265 homePageLayout->addWidget( mURLEdit ); 00266 layout->addMultiCellLayout( homePageLayout, 8, 8, 3, 6 ); 00267 00268 TQHBoxLayout *blogLayout = new TQHBoxLayout( 0, 11, 7 ); 00269 label = new TQLabel( i18n("Blog feed:"), tab1 ); 00270 blogLayout->addWidget( label ); 00271 mBlogEdit = new KLineEdit( tab1 ); 00272 blogLayout->addWidget( mBlogEdit ); 00273 connect( mBlogEdit, TQT_SIGNAL( textChanged( const TQString & ) ), 00274 TQT_SLOT( textChanged( const TQString & ) ) ); 00275 label->setBuddy( mBlogEdit ); 00276 layout->addMultiCellLayout( blogLayout, 9, 9, 4, 6 ); 00277 00278 mIMWidget = new IMEditWidget( tab1, mAddressee ); 00279 connect( mIMWidget, TQT_SIGNAL( modified() ), TQT_SLOT( emitModified() ) ); 00280 layout->addMultiCellWidget( mIMWidget, 10, 10, 4, 6 ); 00281 00282 layout->addColSpacing( 6, 50 ); 00283 00284 bar = new KSeparator( KSeparator::HLine, tab1 ); 00285 layout->addMultiCellWidget( bar, 11, 11, 0, 6 ); 00286 00288 TQHBox *categoryBox = new TQHBox( tab1 ); 00289 categoryBox->setSpacing( KDialogBase::spacingHint() ); 00290 00291 // Categories 00292 mCategoryButton = new TQPushButton( i18n( "Select Categories..." ), categoryBox ); 00293 connect( mCategoryButton, TQT_SIGNAL( clicked() ), TQT_SLOT( selectCategories() ) ); 00294 00295 mCategoryEdit = new KLineEdit( categoryBox ); 00296 mCategoryEdit->setReadOnly( true ); 00297 connect( mCategoryEdit, TQT_SIGNAL( textChanged( const TQString& ) ), 00298 TQT_SLOT( textChanged( const TQString& ) ) ); 00299 00300 mSecrecyWidget = new SecrecyWidget( categoryBox ); 00301 connect( mSecrecyWidget, TQT_SIGNAL( changed() ), TQT_SLOT( emitModified() ) ); 00302 00303 layout->addMultiCellWidget( categoryBox, 12, 12, 0, 6 ); 00304 00305 // Build the layout and add to the tab widget 00306 layout->activate(); // required 00307 00308 mTabWidget->addTab( tab1, i18n( "&General" ) ); 00309 } 00310 00311 void AddresseeEditorWidget::setupTab2() 00312 { 00313 // This is the Details tab 00314 TQWidget *tab2 = new TQWidget( mTabWidget ); 00315 00316 TQGridLayout *layout = new TQGridLayout( tab2, 6, 6 ); 00317 layout->setMargin( KDialogBase::marginHint() ); 00318 layout->setSpacing( KDialogBase::spacingHint() ); 00319 00320 TQLabel *label; 00321 KSeparator* bar; 00322 00324 // Office info 00325 00326 // Department 00327 label = new TQLabel( tab2 ); 00328 label->setPixmap( TDEGlobal::iconLoader()->loadIcon( "folder", TDEIcon::Desktop, 00329 TDEIcon::SizeMedium ) ); 00330 layout->addMultiCellWidget( label, 0, 1, 0, 0 ); 00331 00332 label = new TQLabel( i18n( "Department:" ), tab2 ); 00333 layout->addWidget( label, 0, 1 ); 00334 mDepartmentEdit = new KLineEdit( tab2 ); 00335 connect( mDepartmentEdit, TQT_SIGNAL( textChanged( const TQString& ) ), 00336 TQT_SLOT( textChanged( const TQString& ) ) ); 00337 label->setBuddy( mDepartmentEdit ); 00338 layout->addWidget( mDepartmentEdit, 0, 2 ); 00339 00340 label = new TQLabel( i18n( "Office:" ), tab2 ); 00341 layout->addWidget( label, 1, 1 ); 00342 mOfficeEdit = new KLineEdit( tab2 ); 00343 connect( mOfficeEdit, TQT_SIGNAL( textChanged( const TQString& ) ), 00344 TQT_SLOT( textChanged( const TQString& ) ) ); 00345 label->setBuddy( mOfficeEdit ); 00346 layout->addWidget( mOfficeEdit, 1, 2 ); 00347 00348 label = new TQLabel( i18n( "Profession:" ), tab2 ); 00349 layout->addWidget( label, 2, 1 ); 00350 mProfessionEdit = new KLineEdit( tab2 ); 00351 connect( mProfessionEdit, TQT_SIGNAL( textChanged( const TQString& ) ), 00352 TQT_SLOT( textChanged( const TQString& ) ) ); 00353 label->setBuddy( mProfessionEdit ); 00354 layout->addWidget( mProfessionEdit, 2, 2 ); 00355 00356 label = new TQLabel( i18n( "Manager\'s name:" ), tab2 ); 00357 layout->addWidget( label, 0, 3 ); 00358 mManagerEdit = new KPIM::AddresseeLineEdit( tab2 ); 00359 connect( mManagerEdit, TQT_SIGNAL( textChanged( const TQString& ) ), 00360 TQT_SLOT( textChanged( const TQString& ) ) ); 00361 label->setBuddy( mManagerEdit ); 00362 layout->addMultiCellWidget( mManagerEdit, 0, 0, 4, 5 ); 00363 00364 label = new TQLabel( i18n( "Assistant's name:" ), tab2 ); 00365 layout->addWidget( label, 1, 3 ); 00366 mAssistantEdit = new KPIM::AddresseeLineEdit( tab2 ); 00367 connect( mAssistantEdit, TQT_SIGNAL( textChanged( const TQString& ) ), 00368 TQT_SLOT( textChanged( const TQString& ) ) ); 00369 label->setBuddy( mAssistantEdit ); 00370 layout->addMultiCellWidget( mAssistantEdit, 1, 1, 4, 5 ); 00371 00372 label = new TQLabel( i18n( "<titleLabel>:", "%1:" ).arg( TDEABC::Addressee::titleLabel() ), tab2 ); 00373 layout->addWidget( label, 2, 3 ); 00374 mTitleEdit = new KLineEdit( tab2 ); 00375 connect( mTitleEdit, TQT_SIGNAL( textChanged( const TQString& ) ), 00376 TQT_SLOT( textChanged( const TQString& ) ) ); 00377 label->setBuddy( mTitleEdit ); 00378 layout->addMultiCellWidget( mTitleEdit, 2, 2, 4, 5 ); 00379 00380 bar = new KSeparator( KSeparator::HLine, tab2 ); 00381 layout->addMultiCellWidget( bar, 3, 3, 0, 5 ); 00382 00384 // Personal info 00385 00386 label = new TQLabel( tab2 ); 00387 label->setPixmap( TDEGlobal::iconLoader()->loadIcon( "preferences-desktop-personal", TDEIcon::Desktop, 00388 TDEIcon::SizeMedium ) ); 00389 layout->addMultiCellWidget( label, 4, 5, 0, 0 ); 00390 00391 label = new TQLabel( i18n( "Nickname:" ), tab2 ); 00392 layout->addWidget( label, 4, 1 ); 00393 mNicknameEdit = new KLineEdit( tab2 ); 00394 connect( mNicknameEdit, TQT_SIGNAL( textChanged( const TQString& ) ), 00395 TQT_SLOT( textChanged( const TQString& ) ) ); 00396 label->setBuddy( mNicknameEdit ); 00397 layout->addWidget( mNicknameEdit, 4, 2 ); 00398 00399 label = new TQLabel( i18n( "Partner's name:" ), tab2 ); 00400 layout->addWidget( label, 5, 1 ); 00401 mSpouseEdit = new KPIM::AddresseeLineEdit( tab2 ); 00402 connect( mSpouseEdit, TQT_SIGNAL( textChanged( const TQString& ) ), 00403 TQT_SLOT( textChanged( const TQString& ) ) ); 00404 label->setBuddy( mSpouseEdit ); 00405 layout->addWidget( mSpouseEdit, 5, 2 ); 00406 00407 label = new TQLabel( i18n( "Birthdate:" ), tab2 ); 00408 layout->addWidget( label, 4, 3 ); 00409 mBirthdayPicker = new KDateEdit( tab2 ); 00410 connect( mBirthdayPicker, TQT_SIGNAL( dateChanged( const TQDate& ) ), 00411 TQT_SLOT( dateChanged( const TQDate& ) ) ); 00412 connect( mBirthdayPicker, TQT_SIGNAL( textChanged( const TQString& ) ), 00413 TQT_SLOT( emitModified() ) ); 00414 label->setBuddy( mBirthdayPicker ); 00415 layout->addWidget( mBirthdayPicker, 4, 4 ); 00416 00417 label = new TQLabel( i18n( "Anniversary:" ), tab2 ); 00418 layout->addWidget( label, 5, 3 ); 00419 mAnniversaryPicker = new KDateEdit( tab2 ); 00420 connect( mAnniversaryPicker, TQT_SIGNAL( dateChanged( const TQDate& ) ), 00421 TQT_SLOT( dateChanged( const TQDate& ) ) ); 00422 connect( mAnniversaryPicker, TQT_SIGNAL( textChanged( const TQString& ) ), 00423 TQT_SLOT( emitModified() ) ); 00424 label->setBuddy( mAnniversaryPicker ); 00425 layout->addWidget( mAnniversaryPicker, 5, 4 ); 00426 00427 bar = new KSeparator( KSeparator::HLine, tab2 ); 00428 layout->addMultiCellWidget( bar, 6, 6, 0, 5 ); 00429 00431 // Notes 00432 label = new TQLabel( i18n( "Note:" ), tab2 ); 00433 label->setAlignment( TQt::AlignTop | TQt::AlignLeft ); 00434 layout->addWidget( label, 7, 0 ); 00435 mNoteEdit = new TQTextEdit( tab2 ); 00436 mNoteEdit->setWordWrap( TQTextEdit::WidgetWidth ); 00437 mNoteEdit->setMinimumSize( mNoteEdit->sizeHint() ); 00438 connect( mNoteEdit, TQT_SIGNAL( textChanged() ), TQT_SLOT( emitModified() ) ); 00439 label->setBuddy( mNoteEdit ); 00440 layout->addMultiCellWidget( mNoteEdit, 7, 7, 1, 5 ); 00441 00442 // Build the layout and add to the tab widget 00443 layout->activate(); // required 00444 00445 mTabWidget->addTab( tab2, i18n( "&Details" ) ); 00446 } 00447 00448 void AddresseeEditorWidget::setupAdditionalTabs() 00449 { 00450 ContactEditorWidgetManager *manager = ContactEditorWidgetManager::self(); 00451 00452 // create all tab pages and add the widgets 00453 for ( int i = 0; i < manager->count(); ++i ) { 00454 TQString pageIdentifier = manager->factory( i )->pageIdentifier(); 00455 TQString pageTitle = manager->factory( i )->pageTitle(); 00456 00457 if ( pageIdentifier == "misc" ) 00458 pageTitle = i18n( "Misc" ); 00459 00460 ContactEditorTabPage *page = mTabPages[ pageIdentifier ]; 00461 if ( page == 0 ) { // tab not yet available, create one 00462 page = new ContactEditorTabPage( mTabWidget ); 00463 mTabPages.insert( pageIdentifier, page ); 00464 00465 mTabWidget->addTab( page, pageTitle ); 00466 00467 connect( page, TQT_SIGNAL( changed() ), TQT_SLOT( emitModified() ) ); 00468 } 00469 00470 KAB::ContactEditorWidget *widget 00471 = manager->factory( i )->createWidget( TDEABC::StdAddressBook::self( true ), 00472 page ); 00473 if ( widget ) 00474 page->addWidget( widget ); 00475 } 00476 00477 // query the layout update 00478 TQDictIterator<ContactEditorTabPage> it( mTabPages ); 00479 for ( ; it.current(); ++it ) 00480 it.current()->updateLayout(); 00481 } 00482 00483 void AddresseeEditorWidget::setupCustomFieldsTabs() 00484 { 00485 TQStringList activePages = KABPrefs::instance()->advancedCustomFields(); 00486 00487 const TQStringList list = TDEGlobal::dirs()->findAllResources( "data", "kaddressbook/contacteditorpages/*.ui", true, true ); 00488 for ( TQStringList::ConstIterator it = list.begin(); it != list.end(); ++it ) { 00489 if ( activePages.find( (*it).mid( (*it).findRev('/') + 1 ) ) == activePages.end() ) 00490 continue; 00491 00492 ContactEditorTabPage *page = new ContactEditorTabPage( mTabWidget ); 00493 AdvancedCustomFields *wdg = new AdvancedCustomFields( *it, TDEABC::StdAddressBook::self( true ), page ); 00494 if ( wdg ) { 00495 mTabPages.insert( wdg->pageIdentifier(), page ); 00496 mTabWidget->addTab( page, wdg->pageTitle() ); 00497 00498 page->addWidget( wdg ); 00499 page->updateLayout(); 00500 00501 connect( page, TQT_SIGNAL( changed() ), TQT_SLOT( emitModified() ) ); 00502 } else 00503 delete page; 00504 } 00505 } 00506 00507 void AddresseeEditorWidget::load() 00508 { 00509 kdDebug(5720) << "AddresseeEditorWidget::load()" << endl; 00510 00511 // Block signals in case anything tries to emit modified 00512 // CS: This doesn't seem to work. 00513 bool block = signalsBlocked(); 00514 blockSignals( true ); 00515 mBlockSignals = true; // used for internal signal blocking 00516 00517 mNameEdit->blockSignals( true ); 00518 mNameEdit->setText( mAddressee.assembledName() ); 00519 mNameEdit->blockSignals( false ); 00520 00521 if ( mAddressee.formattedName().isEmpty() ) { 00522 TDEConfig config( "kaddressbookrc" ); 00523 config.setGroup( "General" ); 00524 mFormattedNameType = config.readNumEntry( "FormattedNameType", 1 ); 00525 mAddressee.setFormattedName( NameEditDialog::formattedName( mAddressee, mFormattedNameType ) ); 00526 } else { 00527 if ( mAddressee.formattedName() == NameEditDialog::formattedName( mAddressee, NameEditDialog::SimpleName ) ) 00528 mFormattedNameType = NameEditDialog::SimpleName; 00529 else if ( mAddressee.formattedName() == NameEditDialog::formattedName( mAddressee, NameEditDialog::FullName ) ) 00530 mFormattedNameType = NameEditDialog::FullName; 00531 else if ( mAddressee.formattedName() == NameEditDialog::formattedName( mAddressee, NameEditDialog::ReverseNameWithComma ) ) 00532 mFormattedNameType = NameEditDialog::ReverseNameWithComma; 00533 else if ( mAddressee.formattedName() == NameEditDialog::formattedName( mAddressee, NameEditDialog::ReverseName ) ) 00534 mFormattedNameType = NameEditDialog::ReverseName; 00535 else if ( mAddressee.formattedName() == NameEditDialog::formattedName( mAddressee, NameEditDialog::Organization ) ) 00536 mFormattedNameType = NameEditDialog::Organization; 00537 else 00538 mFormattedNameType = NameEditDialog::CustomName; 00539 } 00540 00541 mFormattedNameLabel->setText( mAddressee.formattedName() ); 00542 00543 mRoleEdit->setText( mAddressee.role() ); 00544 mOrgEdit->setText( mAddressee.organization() ); 00545 #if KDE_IS_VERSION(3,5,8) 00546 mDepartmentEdit->setText( mAddressee.department() ); 00547 // compatibility with older versions 00548 if ( mAddressee.department().isEmpty() ) 00549 #endif 00550 mDepartmentEdit->setText( mAddressee.custom( "KADDRESSBOOK", "X-Department" ) ); 00551 mURLEdit->setURL( mAddressee.url() ); 00552 mURLEdit->home( false ); 00553 mBlogEdit->setURL( mAddressee.custom( "KADDRESSBOOK", "BlogFeed" ) ); 00554 mNoteEdit->setText( mAddressee.note() ); 00555 mEmailWidget->setEmails( mAddressee.emails() ); 00556 mPhoneEditWidget->setPhoneNumbers( mAddressee.phoneNumbers() ); 00557 mAddressEditWidget->setAddresses( mAddressee, mAddressee.addresses() ); 00558 mBirthdayPicker->setDate( mAddressee.birthday().date() ); 00559 00560 TQString anniversaryStr = mAddressee.custom( "KADDRESSBOOK", "X-Anniversary" ); 00561 TQDate anniversary = (anniversaryStr.isEmpty() ? TQDate() : TQDate::fromString( anniversaryStr, Qt::ISODate )); 00562 mAnniversaryPicker->setDate( anniversary ); 00563 mNicknameEdit->setText( mAddressee.nickName() ); 00564 mCategoryEdit->setText( mAddressee.categories().join( "," ) ); 00565 00566 mSecrecyWidget->setSecrecy( mAddressee.secrecy() ); 00567 00568 // Load customs 00569 mIMWidget->setPreferredIM( mAddressee.custom( "KADDRESSBOOK", "X-IMAddress" ) ); 00570 mSpouseEdit->setText( mAddressee.custom( "KADDRESSBOOK", "X-SpousesName" ) ); 00571 mManagerEdit->setText( mAddressee.custom( "KADDRESSBOOK", "X-ManagersName" ) ); 00572 mAssistantEdit->setText( mAddressee.custom( "KADDRESSBOOK", "X-AssistantsName" ) ); 00573 mOfficeEdit->setText( mAddressee.custom( "KADDRESSBOOK", "X-Office" ) ); 00574 mProfessionEdit->setText( mAddressee.custom( "KADDRESSBOOK", "X-Profession" ) ); 00575 mTitleEdit->setText( mAddressee.title() ); 00576 00577 TQDictIterator<ContactEditorTabPage> it( mTabPages ); 00578 for ( ; it.current(); ++it ) 00579 it.current()->loadContact( &mAddressee ); 00580 00581 blockSignals( block ); 00582 mBlockSignals = false; 00583 00584 mDirty = false; 00585 } 00586 00587 void AddresseeEditorWidget::save() 00588 { 00589 if ( !mDirty ) return; 00590 00591 mAddressee.setRole( mRoleEdit->text() ); 00592 mAddressee.setOrganization( mOrgEdit->text() ); 00593 #if KDE_IS_VERSION(3,5,8) 00594 mAddressee.setDepartment( mDepartmentEdit->text() ); 00595 #else 00596 if ( !mDepartmentEdit->text().isEmpty() ) 00597 mAddressee.insertCustom( "KADDRESSBOOK", "X-Department", mDepartmentEdit->text() ); 00598 else 00599 mAddressee.removeCustom( "KADDRESSBOOK", "X-Department" ); 00600 #endif 00601 00602 TQString homepage = mURLEdit->text().stripWhiteSpace(); 00603 if ( homepage.isEmpty() ) 00604 mAddressee.setUrl( KURL() ); 00605 else { 00606 if( !homepage.startsWith("http") ) 00607 homepage = "http://" + homepage; 00608 mAddressee.setUrl( KURL( homepage ) ); 00609 } 00610 if ( !mBlogEdit->text().isEmpty() ) 00611 mAddressee.insertCustom( "KADDRESSBOOK", "BlogFeed", mBlogEdit->text() ); 00612 else 00613 mAddressee.removeCustom( "KADDRESSBOOK", "BlogFeed" ); 00614 00615 mAddressee.setNote( mNoteEdit->text() ); 00616 if ( mBirthdayPicker->date().isValid() ) 00617 mAddressee.setBirthday( TQDateTime( mBirthdayPicker->date() ) ); 00618 else 00619 mAddressee.setBirthday( TQDateTime() ); 00620 00621 mAddressee.setNickName( mNicknameEdit->text() ); 00622 mAddressee.setCategories( TQStringList::split( ",", mCategoryEdit->text() ) ); 00623 00624 mAddressee.setSecrecy( mSecrecyWidget->secrecy() ); 00625 00626 // save custom fields 00627 if ( !mIMWidget->preferredIM().isEmpty() ) 00628 mAddressee.insertCustom( "KADDRESSBOOK", "X-IMAddress", mIMWidget->preferredIM() ); 00629 else 00630 mAddressee.removeCustom( "KADDRESSBOOK", "X-IMAddress" ); 00631 if ( !mSpouseEdit->text().isEmpty() ) 00632 mAddressee.insertCustom( "KADDRESSBOOK", "X-SpousesName", mSpouseEdit->text() ); 00633 else 00634 mAddressee.removeCustom( "KADDRESSBOOK", "X-SpousesName" ); 00635 if ( !mManagerEdit->text().isEmpty() ) 00636 mAddressee.insertCustom( "KADDRESSBOOK", "X-ManagersName", mManagerEdit->text() ); 00637 else 00638 mAddressee.removeCustom( "KADDRESSBOOK", "X-ManagersName" ); 00639 if ( !mAssistantEdit->text().isEmpty() ) 00640 mAddressee.insertCustom( "KADDRESSBOOK", "X-AssistantsName", mAssistantEdit->text() ); 00641 else 00642 mAddressee.removeCustom( "KADDRESSBOOK", "X-AssistantsName" ); 00643 00644 if ( !mOfficeEdit->text().isEmpty() ) 00645 mAddressee.insertCustom( "KADDRESSBOOK", "X-Office", mOfficeEdit->text() ); 00646 else 00647 mAddressee.removeCustom( "KADDRESSBOOK", "X-Office" ); 00648 if ( !mProfessionEdit->text().isEmpty() ) 00649 mAddressee.insertCustom( "KADDRESSBOOK", "X-Profession", mProfessionEdit->text() ); 00650 else 00651 mAddressee.removeCustom( "KADDRESSBOOK", "X-Profession" ); 00652 00653 if ( mAnniversaryPicker->date().isValid() ) 00654 mAddressee.insertCustom( "KADDRESSBOOK", "X-Anniversary", 00655 mAnniversaryPicker->date().toString( Qt::ISODate ) ); 00656 else 00657 mAddressee.removeCustom( "KADDRESSBOOK", "X-Anniversary" ); 00658 00659 mAddressee.setTitle( mTitleEdit->text() ); 00660 00661 // Save the email addresses 00662 mAddressee.setEmails( mEmailWidget->emails() ); 00663 00664 // Save the phone numbers 00665 TDEABC::PhoneNumber::List phoneNumbers; 00666 TDEABC::PhoneNumber::List::ConstIterator phoneIter; 00667 phoneNumbers = mAddressee.phoneNumbers(); 00668 for ( phoneIter = phoneNumbers.begin(); phoneIter != phoneNumbers.end(); 00669 ++phoneIter ) 00670 mAddressee.removePhoneNumber( *phoneIter ); 00671 00672 phoneNumbers = mPhoneEditWidget->phoneNumbers(); 00673 for ( phoneIter = phoneNumbers.begin(); phoneIter != phoneNumbers.end(); 00674 ++phoneIter ) 00675 mAddressee.insertPhoneNumber( *phoneIter ); 00676 00677 // Save the addresses 00678 TDEABC::Address::List addresses; 00679 TDEABC::Address::List::ConstIterator addressIter; 00680 addresses = mAddressee.addresses(); 00681 for ( addressIter = addresses.begin(); addressIter != addresses.end(); 00682 ++addressIter ) 00683 mAddressee.removeAddress( *addressIter ); 00684 00685 addresses = mAddressEditWidget->addresses(); 00686 for ( addressIter = addresses.begin(); addressIter != addresses.end(); 00687 ++addressIter ) 00688 mAddressee.insertAddress( *addressIter ); 00689 00690 TQDictIterator<ContactEditorTabPage> it( mTabPages ); 00691 for ( ; it.current(); ++it ) 00692 it.current()->storeContact( &mAddressee ); 00693 00694 mDirty = false; 00695 } 00696 00697 bool AddresseeEditorWidget::dirty() 00698 { 00699 return mDirty; 00700 } 00701 00702 void AddresseeEditorWidget::nameTextChanged( const TQString &text ) 00703 { 00704 // use the addressee class to parse the name for us 00705 AddresseeConfig config( mAddressee ); 00706 if ( config.automaticNameParsing() ) { 00707 if ( !mAddressee.formattedName().isEmpty() ) { 00708 TQString fn = mAddressee.formattedName(); 00709 mAddressee.setNameFromString( text ); 00710 mAddressee.setFormattedName( fn ); 00711 } else { 00712 // use extra addressee to avoid a formatted name assignment 00713 Addressee addr; 00714 addr.setNameFromString( text ); 00715 mAddressee.setPrefix( addr.prefix() ); 00716 mAddressee.setGivenName( addr.givenName() ); 00717 mAddressee.setAdditionalName( addr.additionalName() ); 00718 mAddressee.setFamilyName( addr.familyName() ); 00719 mAddressee.setSuffix( addr.suffix() ); 00720 } 00721 } 00722 00723 nameBoxChanged(); 00724 00725 emitModified(); 00726 } 00727 00728 void AddresseeEditorWidget::organizationTextChanged( const TQString &text ) 00729 { 00730 00731 AddresseeConfig config( mAddressee ); 00732 if ( config.automaticNameParsing() ) 00733 mAddressee.setOrganization( text ); 00734 00735 nameBoxChanged(); 00736 00737 mAddressEditWidget->updateAddressee( mAddressee ); 00738 00739 emitModified(); 00740 } 00741 00742 void AddresseeEditorWidget::nameBoxChanged() 00743 { 00744 TDEABC::Addressee addr; 00745 AddresseeConfig config( mAddressee ); 00746 if ( config.automaticNameParsing() ) { 00747 addr.setNameFromString( mNameEdit->text() ); 00748 mNameLabel->hide(); 00749 mNameEdit->show(); 00750 } else { 00751 addr = mAddressee; 00752 mNameEdit->hide(); 00753 mNameLabel->setText( mNameEdit->text() ); 00754 mNameLabel->show(); 00755 } 00756 00757 if ( mFormattedNameType != NameEditDialog::CustomName ) { 00758 mFormattedNameLabel->setText( NameEditDialog::formattedName( mAddressee, mFormattedNameType ) ); 00759 mAddressee.setFormattedName( NameEditDialog::formattedName( mAddressee, mFormattedNameType ) ); 00760 } 00761 00762 mAddressEditWidget->updateAddressee( mAddressee ); 00763 } 00764 00765 void AddresseeEditorWidget::nameButtonClicked() 00766 { 00767 // show the name dialog. 00768 NameEditDialog dialog( mAddressee, mFormattedNameType, mReadOnly, this ); 00769 00770 if ( dialog.exec() ) { 00771 if ( dialog.changed() ) { 00772 mAddressee.setFamilyName( dialog.familyName() ); 00773 mAddressee.setGivenName( dialog.givenName() ); 00774 mAddressee.setPrefix( dialog.prefix() ); 00775 mAddressee.setSuffix( dialog.suffix() ); 00776 mAddressee.setAdditionalName( dialog.additionalName() ); 00777 mFormattedNameType = dialog.formattedNameType(); 00778 if ( mFormattedNameType == NameEditDialog::CustomName ) { 00779 mFormattedNameLabel->setText( dialog.customFormattedName() ); 00780 mAddressee.setFormattedName( dialog.customFormattedName() ); 00781 } 00782 // Update the name edit. 00783 bool block = mNameEdit->signalsBlocked(); 00784 mNameEdit->blockSignals( true ); 00785 mNameEdit->setText( mAddressee.assembledName() ); 00786 mNameEdit->blockSignals( block ); 00787 00788 // Update the combo box. 00789 nameBoxChanged(); 00790 00791 emitModified(); 00792 } 00793 } 00794 } 00795 00796 void AddresseeEditorWidget::selectCategories() 00797 { 00798 // Show the category dialog 00799 if ( mCategorySelectDialog == 0 ) { 00800 mCategorySelectDialog = new KPIM::CategorySelectDialog( KABPrefs::instance(), this ); 00801 connect( mCategorySelectDialog, TQT_SIGNAL( categoriesSelected( const TQStringList& ) ), 00802 this, TQT_SLOT( categoriesSelected( const TQStringList& ) ) ); 00803 connect( mCategorySelectDialog, TQT_SIGNAL( editCategories() ), 00804 this, TQT_SLOT( editCategories() ) ); 00805 } 00806 00807 mCategorySelectDialog->setSelected( TQStringList::split( ",", mCategoryEdit->text() ) ); 00808 mCategorySelectDialog->exec(); 00809 } 00810 00811 void AddresseeEditorWidget::categoriesSelected( const TQStringList &list ) 00812 { 00813 mCategoryEdit->setText( list.join( "," ) ); 00814 } 00815 00816 void AddresseeEditorWidget::editCategories() 00817 { 00818 if ( mCategoryEditDialog == 0 ) { 00819 mCategoryEditDialog = new KPIM::CategoryEditDialog( KABPrefs::instance(), this ); 00820 connect( mCategoryEditDialog, TQT_SIGNAL( categoryConfigChanged() ), 00821 mCategorySelectDialog, TQT_SLOT( updateCategoryConfig() ) ); 00822 } 00823 00824 mCategoryEditDialog->exec(); 00825 } 00826 00827 void AddresseeEditorWidget::emitModified() 00828 { 00829 if ( mBlockSignals ) 00830 return; 00831 00832 mDirty = true; 00833 00834 emit modified(); 00835 } 00836 00837 void AddresseeEditorWidget::dateChanged( const TQDate& ) 00838 { 00839 emitModified(); 00840 } 00841 00842 void AddresseeEditorWidget::invalidDate() 00843 { 00844 KMessageBox::sorry( this, i18n( "You must specify a valid date" ) ); 00845 } 00846 00847 void AddresseeEditorWidget::pageChanged( TQWidget *wdg ) 00848 { 00849 if ( wdg ) 00850 TDEAcceleratorManager::manage( wdg ); 00851 } 00852 00853 void AddresseeEditorWidget::setInitialFocus() 00854 { 00855 mNameEdit->setFocus(); 00856 } 00857 00858 bool AddresseeEditorWidget::readyToClose() 00859 { 00860 bool ok = true; 00861 00862 TQDate date = mBirthdayPicker->date(); 00863 if ( !date.isValid() && !mBirthdayPicker->currentText().isEmpty() ) { 00864 KMessageBox::error( this, i18n( "You have to enter a valid birthdate." ) ); 00865 ok = false; 00866 } 00867 00868 date = mAnniversaryPicker->date(); 00869 if ( !date.isValid() && !mAnniversaryPicker->currentText().isEmpty() ) { 00870 KMessageBox::error( this, i18n( "You have to enter a valid anniversary." ) ); 00871 ok = false; 00872 } 00873 00874 return ok; 00875 } 00876 00877 void AddresseeEditorWidget::setReadOnly( bool readOnly ) 00878 { 00879 mReadOnly = readOnly; 00880 00881 mNameEdit->setReadOnly( readOnly ); 00882 mRoleEdit->setReadOnly( readOnly ); 00883 mOrgEdit->setReadOnly( readOnly ); 00884 mPhoneEditWidget->setReadOnly( readOnly ); 00885 mAddressEditWidget->setReadOnly( readOnly ); 00886 mEmailWidget->setReadOnly( readOnly ); 00887 mURLEdit->setReadOnly( readOnly ); 00888 mBlogEdit->setReadOnly( readOnly ); 00889 mIMWidget->setReadOnly( readOnly ); 00890 mCategoryButton->setEnabled( !readOnly ); 00891 mSecrecyWidget->setReadOnly( readOnly ); 00892 mDepartmentEdit->setReadOnly( readOnly ); 00893 mOfficeEdit->setReadOnly( readOnly ); 00894 mProfessionEdit->setReadOnly( readOnly ); 00895 mManagerEdit->setReadOnly( readOnly ); 00896 mAssistantEdit->setReadOnly( readOnly ); 00897 mTitleEdit->setReadOnly( readOnly ); 00898 mNicknameEdit->setReadOnly( readOnly ); 00899 mSpouseEdit->setReadOnly( readOnly ); 00900 mBirthdayPicker->setEnabled( !readOnly ); 00901 mAnniversaryPicker->setEnabled( !readOnly ); 00902 mNoteEdit->setReadOnly( mReadOnly ); 00903 00904 TQDictIterator<ContactEditorTabPage> it( mTabPages ); 00905 for ( ; it.current(); ++it ) 00906 it.current()->setReadOnly( readOnly ); 00907 } 00908 00909 #include "addresseeeditorwidget.moc"