configuredialog_p.cpp
00001 #ifndef KDE_USE_FINAL 00002 #define TQT_NO_CAST_ASCII 00003 #endif 00004 // configuredialog_p.cpp: classes internal to ConfigureDialog 00005 // see configuredialog.cpp for details. 00006 00007 // This must be first 00008 #ifdef HAVE_CONFIG_H 00009 #include <config.h> 00010 #endif 00011 00012 // my header: 00013 #include "configuredialog_p.h" 00014 00015 // other KMail headers: 00016 #include "kmtransport.h" 00017 #include "globalsettings.h" 00018 #include "kmacctcachedimap.h" 00019 00020 // other kdenetwork headers: (none) 00021 00022 // other KDE headers: 00023 #include <ksimpleconfig.h> 00024 #include <kstandarddirs.h> 00025 #include <klocale.h> 00026 #include <kdebug.h> 00027 00028 // TQt headers: 00029 #include <tqheader.h> 00030 #include <tqtabwidget.h> 00031 #include <tqradiobutton.h> 00032 #include <tqbuttongroup.h> 00033 #include <tqlabel.h> 00034 #include <tqlayout.h> 00035 00036 // Other headers: 00037 #include <assert.h> 00038 00039 00040 NewIdentityDialog::NewIdentityDialog( const TQStringList & identities, 00041 TQWidget *parent, const char *name, 00042 bool modal ) 00043 : KDialogBase( parent, name, modal, i18n("New Identity"), 00044 Ok|Cancel|Help, Ok, true ) 00045 { 00046 setHelp( TQString::fromLatin1("configure-identity-newidentitydialog") ); 00047 TQWidget * page = makeMainWidget(); 00048 TQVBoxLayout * vlay = new TQVBoxLayout( page, 0, spacingHint() ); 00049 00050 // row 0: line edit with label 00051 TQHBoxLayout * hlay = new TQHBoxLayout( vlay ); // inherits spacing 00052 mLineEdit = new KLineEdit( page ); 00053 mLineEdit->setFocus(); 00054 hlay->addWidget( new TQLabel( mLineEdit, i18n("&New identity:"), page ) ); 00055 hlay->addWidget( mLineEdit, 1 ); 00056 connect( mLineEdit, TQT_SIGNAL(textChanged(const TQString&)), 00057 this, TQT_SLOT(slotEnableOK(const TQString&)) ); 00058 00059 mButtonGroup = new TQButtonGroup( page ); 00060 mButtonGroup->hide(); 00061 00062 // row 1: radio button 00063 TQRadioButton *radio = new TQRadioButton( i18n("&With empty fields"), page ); 00064 radio->setChecked( true ); 00065 mButtonGroup->insert( radio, Empty ); 00066 vlay->addWidget( radio ); 00067 00068 // row 2: radio button 00069 radio = new TQRadioButton( i18n("&Use Control Center settings"), page ); 00070 mButtonGroup->insert( radio, ControlCenter ); 00071 vlay->addWidget( radio ); 00072 00073 // row 3: radio button 00074 radio = new TQRadioButton( i18n("&Duplicate existing identity"), page ); 00075 mButtonGroup->insert( radio, ExistingEntry ); 00076 vlay->addWidget( radio ); 00077 00078 // row 4: combobox with existing identities and label 00079 hlay = new TQHBoxLayout( vlay ); // inherits spacing 00080 mComboBox = new TQComboBox( false, page ); 00081 mComboBox->insertStringList( identities ); 00082 mComboBox->setEnabled( false ); 00083 TQLabel *label = new TQLabel( mComboBox, i18n("&Existing identities:"), page ); 00084 label->setEnabled( false ); 00085 hlay->addWidget( label ); 00086 hlay->addWidget( mComboBox, 1 ); 00087 00088 vlay->addStretch( 1 ); // spacer 00089 00090 // enable/disable combobox and label depending on the third radio 00091 // button's state: 00092 connect( radio, TQT_SIGNAL(toggled(bool)), 00093 label, TQT_SLOT(setEnabled(bool)) ); 00094 connect( radio, TQT_SIGNAL(toggled(bool)), 00095 mComboBox, TQT_SLOT(setEnabled(bool)) ); 00096 00097 enableButtonOK( false ); // since line edit is empty 00098 } 00099 00100 NewIdentityDialog::DuplicateMode NewIdentityDialog::duplicateMode() const { 00101 int id = mButtonGroup->id( mButtonGroup->selected() ); 00102 assert( id == (int)Empty 00103 || id == (int)ControlCenter 00104 || id == (int)ExistingEntry ); 00105 return static_cast<DuplicateMode>( id ); 00106 } 00107 00108 void NewIdentityDialog::slotEnableOK( const TQString & proposedIdentityName ) { 00109 // OK button is disabled if 00110 TQString name = proposedIdentityName.stripWhiteSpace(); 00111 // name isn't empty 00112 if ( name.isEmpty() ) { 00113 enableButtonOK( false ); 00114 return; 00115 } 00116 // or name doesn't yet exist. 00117 for ( int i = 0 ; i < mComboBox->count() ; i++ ) 00118 if ( mComboBox->text(i) == name ) { 00119 enableButtonOK( false ); 00120 return; 00121 } 00122 enableButtonOK( true ); 00123 } 00124 00125 ListView::ListView( TQWidget *parent, const char *name, 00126 int visibleItem ) 00127 : KListView( parent, name ) 00128 { 00129 setVisibleItem(visibleItem); 00130 } 00131 00132 00133 void ListView::resizeEvent( TQResizeEvent *e ) 00134 { 00135 KListView::resizeEvent(e); 00136 resizeColums(); 00137 } 00138 00139 00140 void ListView::showEvent( TQShowEvent *e ) 00141 { 00142 KListView::showEvent(e); 00143 resizeColums(); 00144 } 00145 00146 00147 void ListView::resizeColums() 00148 { 00149 int c = columns(); 00150 if( c == 0 ) 00151 { 00152 return; 00153 } 00154 00155 int w1 = viewport()->width(); 00156 int w2 = w1 / c; 00157 int w3 = w1 - (c-1)*w2; 00158 00159 for( int i=0; i<c-1; i++ ) 00160 { 00161 setColumnWidth( i, w2 ); 00162 } 00163 setColumnWidth( c-1, w3 ); 00164 } 00165 00166 00167 void ListView::setVisibleItem( int visibleItem, bool updateSize ) 00168 { 00169 mVisibleItem = TQMAX( 1, visibleItem ); 00170 if( updateSize == true ) 00171 { 00172 TQSize s = sizeHint(); 00173 setMinimumSize( s.width() + verticalScrollBar()->sizeHint().width() + 00174 lineWidth() * 2, s.height() ); 00175 } 00176 } 00177 00178 00179 TQSize ListView::sizeHint() const 00180 { 00181 TQSize s = TQListView::sizeHint(); 00182 00183 int h = fontMetrics().height() + 2*itemMargin(); 00184 if( h % 2 > 0 ) { h++; } 00185 00186 s.setHeight( h*mVisibleItem + lineWidth()*2 + header()->sizeHint().height()); 00187 return s; 00188 } 00189 00190 00191 static TQString flagPng = TQString::fromLatin1("/flag.png"); 00192 00193 NewLanguageDialog::NewLanguageDialog( LanguageItemList & suppressedLangs, 00194 TQWidget *parent, const char *name, 00195 bool modal ) 00196 : KDialogBase( parent, name, modal, i18n("New Language"), Ok|Cancel, Ok, true ) 00197 { 00198 // layout the page (a combobox with label): 00199 TQWidget *page = makeMainWidget(); 00200 TQHBoxLayout *hlay = new TQHBoxLayout( page, 0, spacingHint() ); 00201 mComboBox = new TQComboBox( false, page ); 00202 hlay->addWidget( new TQLabel( mComboBox, i18n("Choose &language:"), page ) ); 00203 hlay->addWidget( mComboBox, 1 ); 00204 00205 TQStringList pathList = KGlobal::dirs()->findAllResources( "locale", 00206 TQString::fromLatin1("*/entry.desktop") ); 00207 // extract a list of language tags that should not be included: 00208 TQStringList suppressedAcronyms; 00209 for ( LanguageItemList::Iterator lit = suppressedLangs.begin(); 00210 lit != suppressedLangs.end(); ++lit ) 00211 suppressedAcronyms << (*lit).mLanguage; 00212 00213 // populate the combo box: 00214 for ( TQStringList::ConstIterator it = pathList.begin(); 00215 it != pathList.end(); ++it ) 00216 { 00217 KSimpleConfig entry( *it ); 00218 entry.setGroup( "KCM Locale" ); 00219 // full name: 00220 TQString name = entry.readEntry( "Name" ); 00221 // {2,3}-letter abbreviation: 00222 // we extract it from the path: "/prefix/de/entry.desktop" -> "de" 00223 TQString acronym = (*it).section( '/', -2, -2 ); 00224 00225 if ( suppressedAcronyms.find( acronym ) == suppressedAcronyms.end() ) { 00226 // not found: 00227 TQString displayname = TQString::fromLatin1("%1 (%2)") 00228 .arg( name ).arg( acronym ); 00229 TQPixmap flag( locate("locale", acronym + flagPng ) ); 00230 mComboBox->insertItem( flag, displayname ); 00231 } 00232 } 00233 if ( !mComboBox->count() ) { 00234 mComboBox->insertItem( i18n("No More Languages Available") ); 00235 enableButtonOK( false ); 00236 } else mComboBox->listBox()->sort(); 00237 } 00238 00239 TQString NewLanguageDialog::language() const 00240 { 00241 TQString s = mComboBox->currentText(); 00242 int i = s.findRev( '(' ); 00243 return s.mid( i + 1, s.length() - i - 2 ); 00244 } 00245 00246 00247 LanguageComboBox::LanguageComboBox( bool rw, TQWidget *parent, const char *name ) 00248 : TQComboBox( rw, parent, name ) 00249 { 00250 } 00251 00252 int LanguageComboBox::insertLanguage( const TQString & language ) 00253 { 00254 static TQString entryDesktop = TQString::fromLatin1("/entry.desktop"); 00255 KSimpleConfig entry( locate("locale", language + entryDesktop) ); 00256 entry.setGroup( "KCM Locale" ); 00257 TQString name = entry.readEntry( "Name" ); 00258 TQString output = TQString::fromLatin1("%1 (%2)").arg( name ).arg( language ); 00259 insertItem( TQPixmap( locate("locale", language + flagPng ) ), output ); 00260 return listBox()->index( listBox()->findItem(output) ); 00261 } 00262 00263 TQString LanguageComboBox::language() const 00264 { 00265 TQString s = currentText(); 00266 int i = s.findRev( '(' ); 00267 return s.mid( i + 1, s.length() - i - 2 ); 00268 } 00269 00270 void LanguageComboBox::setLanguage( const TQString & language ) 00271 { 00272 TQString parenthizedLanguage = TQString::fromLatin1("(%1)").arg( language ); 00273 for (int i = 0; i < count(); i++) 00274 // ### FIXME: use .endWith(): 00275 if ( text(i).find( parenthizedLanguage ) >= 0 ) { 00276 setCurrentItem(i); 00277 return; 00278 } 00279 } 00280 00281 // 00282 // 00283 // ProfileDialog 00284 // 00285 // 00286 00287 ProfileDialog::ProfileDialog( TQWidget * parent, const char * name, bool modal ) 00288 : KDialogBase( parent, name, modal, i18n("Load Profile"), Ok|Cancel, Ok, true ) 00289 { 00290 // tmp. vars: 00291 TQWidget * page = makeMainWidget(); 00292 TQVBoxLayout * vlay = new TQVBoxLayout( page, 0, spacingHint() ); 00293 00294 mListView = new KListView( page, "mListView" ); 00295 mListView->addColumn( i18n("Available Profiles") ); 00296 mListView->addColumn( i18n("Description") ); 00297 mListView->setFullWidth( true ); 00298 mListView->setAllColumnsShowFocus( true ); 00299 mListView->setSorting( -1 ); 00300 00301 vlay->addWidget( new TQLabel( mListView, 00302 i18n("&Select a profile and click 'OK' to " 00303 "load its settings:"), page ) ); 00304 vlay->addWidget( mListView, 1 ); 00305 00306 setup(); 00307 00308 connect( mListView, TQT_SIGNAL(selectionChanged()), 00309 TQT_SLOT(slotSelectionChanged()) ); 00310 connect( mListView, TQT_SIGNAL(doubleClicked ( TQListViewItem *, const TQPoint &, int ) ), 00311 TQT_SLOT(slotOk()) ); 00312 00313 connect( this, TQT_SIGNAL(finished()), TQT_SLOT(delayedDestruct()) ); 00314 00315 enableButtonOK( false ); 00316 } 00317 00318 void ProfileDialog::slotSelectionChanged() 00319 { 00320 enableButtonOK( mListView->selectedItem() ); 00321 } 00322 00323 void ProfileDialog::setup() { 00324 mListView->clear(); 00325 // find all profiles (config files named "profile-xyz-rc"): 00326 const TQString profileFilenameFilter = TQString::fromLatin1("kmail/profile-*-rc"); 00327 mProfileList = KGlobal::dirs()->findAllResources( "data", profileFilenameFilter ); 00328 00329 kdDebug(5006) << "Profile manager: found " << mProfileList.count() 00330 << " profiles:" << endl; 00331 00332 // build the list and populate the list view: 00333 TQListViewItem * listItem = 0; 00334 for ( TQStringList::const_iterator it = mProfileList.begin() ; 00335 it != mProfileList.end() ; ++it ) { 00336 KConfig profile( *it, true /* read-only */, false /* no KDE global */ ); 00337 profile.setGroup("KMail Profile"); 00338 TQString name = profile.readEntry( "Name" ); 00339 if ( name.isEmpty() ) { 00340 kdWarning(5006) << "File \"" << (*it) 00341 << "\" doesn't provide a profile name!" << endl; 00342 name = i18n("Missing profile name placeholder","Unnamed"); 00343 } 00344 TQString desc = profile.readEntry( "Comment" ); 00345 if ( desc.isEmpty() ) { 00346 kdWarning(5006) << "File \"" << (*it) 00347 << "\" doesn't provide a description!" << endl; 00348 desc = i18n("Missing profile description placeholder","Not available"); 00349 } 00350 listItem = new TQListViewItem( mListView, listItem, name, desc ); 00351 } 00352 } 00353 00354 void ProfileDialog::slotOk() { 00355 const int index = mListView->itemIndex( mListView->selectedItem() ); 00356 if ( index < 0 ) 00357 return; // none selected 00358 00359 assert( (unsigned int)index < mProfileList.count() ); 00360 00361 KConfig profile( *mProfileList.at(index), true, false ); 00362 emit profileSelected( &profile ); 00363 KDialogBase::slotOk(); 00364 } 00365 00366 00367 ConfigModuleWithTabs::ConfigModuleWithTabs( TQWidget * parent, 00368 const char * name ) 00369 : ConfigModule( parent, name ) 00370 { 00371 TQVBoxLayout *vlay = new TQVBoxLayout( this, 0, KDialog::spacingHint() ); 00372 mTabWidget = new TQTabWidget( this ); 00373 vlay->addWidget( mTabWidget ); 00374 } 00375 00376 void ConfigModuleWithTabs::addTab( ConfigModuleTab* tab, const TQString & title ) { 00377 mTabWidget->addTab( tab, title ); 00378 connect( tab, TQT_SIGNAL(changed( bool )), 00379 this, TQT_SIGNAL(changed( bool )) ); 00380 } 00381 00382 void ConfigModuleWithTabs::load() { 00383 for ( int i = 0 ; i < mTabWidget->count() ; ++i ) { 00384 ConfigModuleTab *tab = dynamic_cast<ConfigModuleTab*>( mTabWidget->page(i) ); 00385 if ( tab ) 00386 tab->load(); 00387 } 00388 KCModule::load(); 00389 } 00390 00391 void ConfigModuleWithTabs::save() { 00392 KCModule::save(); 00393 for ( int i = 0 ; i < mTabWidget->count() ; ++i ) { 00394 ConfigModuleTab *tab = dynamic_cast<ConfigModuleTab*>( mTabWidget->page(i) ); 00395 if ( tab ) 00396 tab->save(); 00397 } 00398 } 00399 00400 void ConfigModuleWithTabs::defaults() { 00401 ConfigModuleTab *tab = dynamic_cast<ConfigModuleTab*>( mTabWidget->currentPage() ); 00402 if ( tab ) 00403 tab->defaults(); 00404 KCModule::defaults(); 00405 } 00406 00407 void ConfigModuleWithTabs::installProfile(KConfig * /* profile */ ) { 00408 for ( int i = 0 ; i < mTabWidget->count() ; ++i ) { 00409 ConfigModuleTab *tab = dynamic_cast<ConfigModuleTab*>( mTabWidget->page(i) ); 00410 if ( tab ) 00411 tab->installProfile(); 00412 } 00413 } 00414 00415 void ConfigModuleTab::load() 00416 { 00417 doLoadFromGlobalSettings(); 00418 doLoadOther(); 00419 } 00420 00421 void ConfigModuleTab::defaults() 00422 { 00423 // reset settings which are available via GlobalSettings to their defaults 00424 // (stolen from KConfigDialogManager::updateWidgetsDefault()) 00425 const bool bUseDefaults = GlobalSettings::self()->useDefaults( true ); 00426 doLoadFromGlobalSettings(); 00427 GlobalSettings::self()->useDefaults( bUseDefaults ); 00428 // reset other settings to default values 00429 doResetToDefaultsOther(); 00430 } 00431 00432 void ConfigModuleTab::slotEmitChanged( void ) { 00433 emit changed( true ); 00434 } 00435 00436 00437 #include "configuredialog_p.moc"