00001 #ifndef KDE_USE_FINAL
00002 #define QT_NO_CAST_ASCII
00003 #endif
00004
00005
00006
00007
00008 #ifdef HAVE_CONFIG_H
00009 #include <config.h>
00010 #endif
00011
00012
00013 #include "configuredialog_p.h"
00014
00015
00016 #include "kmtransport.h"
00017
00018
00019
00020
00021 #include <ksimpleconfig.h>
00022 #include <kstandarddirs.h>
00023 #include <klocale.h>
00024 #include <kdebug.h>
00025
00026
00027 #include <qheader.h>
00028 #include <qtabwidget.h>
00029 #include <qradiobutton.h>
00030 #include <qbuttongroup.h>
00031 #include <qlabel.h>
00032 #include <qlayout.h>
00033
00034
00035 #include <assert.h>
00036
00037
00038 NewIdentityDialog::NewIdentityDialog( const QStringList & identities,
00039 QWidget *parent, const char *name,
00040 bool modal )
00041 : KDialogBase( parent, name, modal, i18n("New Identity"),
00042 Ok|Cancel|Help, Ok, true )
00043 {
00044 setHelp( QString::fromLatin1("configure-identity-newidentitydialog") );
00045 QWidget * page = makeMainWidget();
00046 QVBoxLayout * vlay = new QVBoxLayout( page, 0, spacingHint() );
00047
00048
00049 QHBoxLayout * hlay = new QHBoxLayout( vlay );
00050 mLineEdit = new KLineEdit( page );
00051 mLineEdit->setFocus();
00052 hlay->addWidget( new QLabel( mLineEdit, i18n("&New identity:"), page ) );
00053 hlay->addWidget( mLineEdit, 1 );
00054 connect( mLineEdit, SIGNAL(textChanged(const QString&)),
00055 this, SLOT(slotEnableOK(const QString&)) );
00056
00057 mButtonGroup = new QButtonGroup( page );
00058 mButtonGroup->hide();
00059
00060
00061 QRadioButton *radio = new QRadioButton( i18n("&With empty fields"), page );
00062 radio->setChecked( true );
00063 mButtonGroup->insert( radio, Empty );
00064 vlay->addWidget( radio );
00065
00066
00067 radio = new QRadioButton( i18n("&Use Control Center settings"), page );
00068 mButtonGroup->insert( radio, ControlCenter );
00069 vlay->addWidget( radio );
00070
00071
00072 radio = new QRadioButton( i18n("&Duplicate existing identity"), page );
00073 mButtonGroup->insert( radio, ExistingEntry );
00074 vlay->addWidget( radio );
00075
00076
00077 hlay = new QHBoxLayout( vlay );
00078 mComboBox = new QComboBox( false, page );
00079 mComboBox->insertStringList( identities );
00080 mComboBox->setEnabled( false );
00081 QLabel *label = new QLabel( mComboBox, i18n("&Existing identities:"), page );
00082 label->setEnabled( false );
00083 hlay->addWidget( label );
00084 hlay->addWidget( mComboBox, 1 );
00085
00086 vlay->addStretch( 1 );
00087
00088
00089
00090 connect( radio, SIGNAL(toggled(bool)),
00091 label, SLOT(setEnabled(bool)) );
00092 connect( radio, SIGNAL(toggled(bool)),
00093 mComboBox, SLOT(setEnabled(bool)) );
00094
00095 enableButtonOK( false );
00096 }
00097
00098 NewIdentityDialog::DuplicateMode NewIdentityDialog::duplicateMode() const {
00099 int id = mButtonGroup->id( mButtonGroup->selected() );
00100 assert( id == (int)Empty
00101 || id == (int)ControlCenter
00102 || id == (int)ExistingEntry );
00103 return static_cast<DuplicateMode>( id );
00104 }
00105
00106 void NewIdentityDialog::slotEnableOK( const QString & proposedIdentityName ) {
00107
00108 QString name = proposedIdentityName.stripWhiteSpace();
00109
00110 if ( name.isEmpty() ) {
00111 enableButtonOK( false );
00112 return;
00113 }
00114
00115 for ( int i = 0 ; i < mComboBox->count() ; i++ )
00116 if ( mComboBox->text(i) == name ) {
00117 enableButtonOK( false );
00118 return;
00119 }
00120 enableButtonOK( true );
00121 }
00122
00123 ListView::ListView( QWidget *parent, const char *name,
00124 int visibleItem )
00125 : KListView( parent, name )
00126 {
00127 setVisibleItem(visibleItem);
00128 }
00129
00130
00131 void ListView::resizeEvent( QResizeEvent *e )
00132 {
00133 KListView::resizeEvent(e);
00134 resizeColums();
00135 }
00136
00137
00138 void ListView::showEvent( QShowEvent *e )
00139 {
00140 KListView::showEvent(e);
00141 resizeColums();
00142 }
00143
00144
00145 void ListView::resizeColums()
00146 {
00147 int c = columns();
00148 if( c == 0 )
00149 {
00150 return;
00151 }
00152
00153 int w1 = viewport()->width();
00154 int w2 = w1 / c;
00155 int w3 = w1 - (c-1)*w2;
00156
00157 for( int i=0; i<c-1; i++ )
00158 {
00159 setColumnWidth( i, w2 );
00160 }
00161 setColumnWidth( c-1, w3 );
00162 }
00163
00164
00165 void ListView::setVisibleItem( int visibleItem, bool updateSize )
00166 {
00167 mVisibleItem = QMAX( 1, visibleItem );
00168 if( updateSize == true )
00169 {
00170 QSize s = sizeHint();
00171 setMinimumSize( s.width() + verticalScrollBar()->sizeHint().width() +
00172 lineWidth() * 2, s.height() );
00173 }
00174 }
00175
00176
00177 QSize ListView::sizeHint() const
00178 {
00179 QSize s = QListView::sizeHint();
00180
00181 int h = fontMetrics().height() + 2*itemMargin();
00182 if( h % 2 > 0 ) { h++; }
00183
00184 s.setHeight( h*mVisibleItem + lineWidth()*2 + header()->sizeHint().height());
00185 return s;
00186 }
00187
00188
00189 static QString flagPng = QString::fromLatin1("/flag.png");
00190
00191 NewLanguageDialog::NewLanguageDialog( LanguageItemList & suppressedLangs,
00192 QWidget *parent, const char *name,
00193 bool modal )
00194 : KDialogBase( parent, name, modal, i18n("New Language"), Ok|Cancel, Ok, true )
00195 {
00196
00197 QWidget *page = makeMainWidget();
00198 QHBoxLayout *hlay = new QHBoxLayout( page, 0, spacingHint() );
00199 mComboBox = new QComboBox( false, page );
00200 hlay->addWidget( new QLabel( mComboBox, i18n("Choose &language:"), page ) );
00201 hlay->addWidget( mComboBox, 1 );
00202
00203 QStringList pathList = KGlobal::dirs()->findAllResources( "locale",
00204 QString::fromLatin1("*/entry.desktop") );
00205
00206 QStringList suppressedAcronyms;
00207 for ( LanguageItemList::Iterator lit = suppressedLangs.begin();
00208 lit != suppressedLangs.end(); ++lit )
00209 suppressedAcronyms << (*lit).mLanguage;
00210
00211
00212 for ( QStringList::ConstIterator it = pathList.begin();
00213 it != pathList.end(); ++it )
00214 {
00215 KSimpleConfig entry( *it );
00216 entry.setGroup( "KCM Locale" );
00217
00218 QString name = entry.readEntry( "Name" );
00219
00220
00221 QString acronym = (*it).section( '/', -2, -2 );
00222
00223 if ( suppressedAcronyms.find( acronym ) == suppressedAcronyms.end() ) {
00224
00225 QString displayname = QString::fromLatin1("%1 (%2)")
00226 .arg( name ).arg( acronym );
00227 QPixmap flag( locate("locale", acronym + flagPng ) );
00228 mComboBox->insertItem( flag, displayname );
00229 }
00230 }
00231 if ( !mComboBox->count() ) {
00232 mComboBox->insertItem( i18n("No More Languages Available") );
00233 enableButtonOK( false );
00234 } else mComboBox->listBox()->sort();
00235 }
00236
00237 QString NewLanguageDialog::language() const
00238 {
00239 QString s = mComboBox->currentText();
00240 int i = s.findRev( '(' );
00241 return s.mid( i + 1, s.length() - i - 2 );
00242 }
00243
00244
00245 LanguageComboBox::LanguageComboBox( bool rw, QWidget *parent, const char *name )
00246 : QComboBox( rw, parent, name )
00247 {
00248 }
00249
00250 int LanguageComboBox::insertLanguage( const QString & language )
00251 {
00252 static QString entryDesktop = QString::fromLatin1("/entry.desktop");
00253 KSimpleConfig entry( locate("locale", language + entryDesktop) );
00254 entry.setGroup( "KCM Locale" );
00255 QString name = entry.readEntry( "Name" );
00256 QString output = QString::fromLatin1("%1 (%2)").arg( name ).arg( language );
00257 insertItem( QPixmap( locate("locale", language + flagPng ) ), output );
00258 return listBox()->index( listBox()->findItem(output) );
00259 }
00260
00261 QString LanguageComboBox::language() const
00262 {
00263 QString s = currentText();
00264 int i = s.findRev( '(' );
00265 return s.mid( i + 1, s.length() - i - 2 );
00266 }
00267
00268 void LanguageComboBox::setLanguage( const QString & language )
00269 {
00270 QString parenthizedLanguage = QString::fromLatin1("(%1)").arg( language );
00271 for (int i = 0; i < count(); i++)
00272
00273 if ( text(i).find( parenthizedLanguage ) >= 0 ) {
00274 setCurrentItem(i);
00275 return;
00276 }
00277 }
00278
00279
00280
00281
00282
00283
00284
00285 ProfileDialog::ProfileDialog( QWidget * parent, const char * name, bool modal )
00286 : KDialogBase( parent, name, modal, i18n("Load Profile"), Ok|Cancel, Ok, true )
00287 {
00288
00289 QWidget * page = makeMainWidget();
00290 QVBoxLayout * vlay = new QVBoxLayout( page, 0, spacingHint() );
00291
00292 mListView = new KListView( page, "mListView" );
00293 mListView->addColumn( i18n("Available Profiles") );
00294 mListView->addColumn( i18n("Description") );
00295 mListView->setFullWidth( true );
00296 mListView->setAllColumnsShowFocus( true );
00297 mListView->setFrameStyle( QFrame::WinPanel + QFrame::Sunken );
00298 mListView->setSorting( -1 );
00299
00300 vlay->addWidget( new QLabel( mListView,
00301 i18n("&Select a profile and click 'OK' to "
00302 "load its settings:"), page ) );
00303 vlay->addWidget( mListView, 1 );
00304
00305 setup();
00306
00307 connect( mListView, SIGNAL(selectionChanged()),
00308 SLOT(slotSelectionChanged()) );
00309 connect( mListView, SIGNAL(doubleClicked ( QListViewItem *, const QPoint &, int ) ),
00310 SLOT(slotOk()) );
00311
00312 connect( this, SIGNAL(finished()), SLOT(delayedDestruct()) );
00313
00314 enableButtonOK( false );
00315 }
00316
00317 void ProfileDialog::slotSelectionChanged()
00318 {
00319 enableButtonOK( mListView->selectedItem() );
00320 }
00321
00322 void ProfileDialog::setup() {
00323 mListView->clear();
00324
00325 const QString profileFilenameFilter = QString::fromLatin1("kmail/profile-*-rc");
00326 mProfileList = KGlobal::dirs()->findAllResources( "data", profileFilenameFilter );
00327
00328 kdDebug(5006) << "Profile manager: found " << mProfileList.count()
00329 << " profiles:" << endl;
00330
00331
00332 QListViewItem * listItem = 0;
00333 for ( QStringList::const_iterator it = mProfileList.begin() ;
00334 it != mProfileList.end() ; ++it ) {
00335 KConfig profile( *it, true , false );
00336 profile.setGroup("KMail Profile");
00337 QString name = profile.readEntry( "Name" );
00338 if ( name.isEmpty() ) {
00339 kdWarning(5006) << "File \"" << (*it)
00340 << "\" doesn't provide a profile name!" << endl;
00341 name = i18n("Missing profile name placeholder","Unnamed");
00342 }
00343 QString desc = profile.readEntry( "Comment" );
00344 if ( desc.isEmpty() ) {
00345 kdWarning(5006) << "File \"" << (*it)
00346 << "\" doesn't provide a description!" << endl;
00347 desc = i18n("Missing profile description placeholder","Not available");
00348 }
00349 listItem = new QListViewItem( mListView, listItem, name, desc );
00350 }
00351 }
00352
00353 void ProfileDialog::slotOk() {
00354 const int index = mListView->itemIndex( mListView->selectedItem() );
00355 if ( index < 0 )
00356 return;
00357
00358 assert( (unsigned int)index < mProfileList.count() );
00359
00360 KConfig profile( *mProfileList.at(index), true, false );
00361 emit profileSelected( &profile );
00362 KDialogBase::slotOk();
00363 }
00364
00365
00366 ConfigModuleWithTabs::ConfigModuleWithTabs( QWidget * parent,
00367 const char * name )
00368 : ConfigModule( parent, name )
00369 {
00370 QVBoxLayout *vlay = new QVBoxLayout( this, 0, KDialog::spacingHint() );
00371 mTabWidget = new QTabWidget( this );
00372 vlay->addWidget( mTabWidget );
00373 }
00374
00375 void ConfigModuleWithTabs::addTab( ConfigModuleTab* tab, const QString & title ) {
00376 mTabWidget->addTab( tab, title );
00377 connect( tab, SIGNAL(changed( bool )),
00378 this, SIGNAL(changed( bool )) );
00379 }
00380
00381 void ConfigModuleWithTabs::load() {
00382 for ( int i = 0 ; i < mTabWidget->count() ; ++i ) {
00383 ConfigModuleTab *tab = dynamic_cast<ConfigModuleTab*>( mTabWidget->page(i) );
00384 if ( tab )
00385 tab->load();
00386 }
00387 }
00388
00389 void ConfigModuleWithTabs::save() {
00390 for ( int i = 0 ; i < mTabWidget->count() ; ++i ) {
00391 ConfigModuleTab *tab = dynamic_cast<ConfigModuleTab*>( mTabWidget->page(i) );
00392 if ( tab )
00393 tab->save();
00394 }
00395 }
00396
00397 void ConfigModuleWithTabs::defaults() {
00398 for ( int i = 0 ; i < mTabWidget->count() ; ++i ) {
00399 ConfigModuleTab *tab = dynamic_cast<ConfigModuleTab*>( mTabWidget->page(i) );
00400 if ( tab )
00401 tab->defaults();
00402 }
00403 }
00404
00405 void ConfigModuleWithTabs::installProfile(KConfig * ) {
00406 for ( int i = 0 ; i < mTabWidget->count() ; ++i ) {
00407 ConfigModuleTab *tab = dynamic_cast<ConfigModuleTab*>( mTabWidget->page(i) );
00408 if ( tab )
00409 tab->installProfile();
00410 }
00411 }
00412
00413 void ConfigModuleTab::slotEmitChanged( void ) {
00414 emit changed( true );
00415 }
00416
00417
00418
00419 #include "configuredialog_p.moc"