kitchensync

configguisunbird.cpp

00001 /*
00002     This file is part of KitchenSync.
00003 
00004     Copyright (c) 2007 Tobias Koenig <tokoe@kde.org>
00005     Copyright (c) 2007 Anirudh Ramesh <abattoir@abattoir.in>
00006 
00007     This program is free software; you can redistribute it and/or modify
00008     it under the terms of the GNU General Public License as published by
00009     the Free Software Foundation; either version 2 of the License, or
00010     (at your option) any later version.
00011 
00012     This program is distributed in the hope that it will be useful,
00013     but WITHOUT ANY WARRANTY; without even the implied warranty of
00014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00015     GNU General Public License for more details.
00016 
00017     You should have received a copy of the GNU General Public License
00018     along with this program; if not, write to the Free Software
00019     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
00020     USA.
00021 */
00022 
00023 #include "configguisunbird.h"
00024 
00025 #include <qdom.h>
00026 #include <qtabwidget.h>
00027 #include <qlabel.h>
00028 #include <qlayout.h>
00029 #include <qbuttongroup.h>
00030 #include <qcheckbox.h>
00031 #include <qsizepolicy.h>
00032 #include <qptrlist.h>
00033 #include <qspinbox.h>
00034 #include <qwidget.h>
00035 
00036 #include <kurlrequester.h>
00037 #include <klineedit.h>
00038 #include <kpushbutton.h>
00039 #include <kdialog.h>
00040 #include <klocale.h>
00041 #include <kfile.h>
00042 
00043 ConfigGuiSunbird::ConfigGuiSunbird( const QSync::Member &member, QWidget *parent )
00044   : ConfigGui( member, parent )
00045 {
00046   QTabWidget *tabWidget = new QTabWidget( this );
00047   topLayout()->addWidget( tabWidget );
00048 
00049   mLocalWidget = new QWidget( tabWidget );
00050   mLocalLayout = new QVBoxLayout( mLocalWidget, KDialog::spacingHint() );
00051 
00052   mWebdavWidget = new QWidget( tabWidget );
00053   mWebdavLayout = new QVBoxLayout( mWebdavWidget, KDialog::spacingHint() );
00054 
00055   tabWidget->addTab( mLocalWidget, i18n( "Local Calendars" ) );
00056   tabWidget->addTab( mWebdavWidget, i18n( "WebDAV Calendars" ) );
00057 
00058   KPushButton *mLocalAddButton = new KPushButton( mLocalWidget );
00059   mLocalAddButton->setText( i18n( "Add new calendar" ) );
00060   mLocalAddButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
00061   mLocalLayout->addWidget( mLocalAddButton );
00062   connect( mLocalAddButton, SIGNAL( clicked() ),
00063            this, SLOT( addLocalCalendar() ) );
00064 
00065   KPushButton *mWebdavAddButton = new KPushButton( mWebdavWidget );
00066   mWebdavAddButton->setText( i18n( "Add new calendar" ) );
00067   mWebdavAddButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
00068   mWebdavLayout->addWidget( mWebdavAddButton );
00069   connect( mWebdavAddButton, SIGNAL( clicked() ),
00070            this, SLOT( addWebdavCalendar() ) );
00071 
00072   mLocalSpacer = new QSpacerItem( 20, 40, QSizePolicy::Expanding );
00073   mLocalLayout->addItem( mLocalSpacer );
00074   mWebdavSpacer = new QSpacerItem( 20, 40, QSizePolicy::Expanding );
00075   mWebdavLayout->addItem( mWebdavSpacer );
00076 }
00077 
00078 void ConfigGuiSunbird::load( const QString &xml )
00079 {
00080   QString path;
00081   QString url;
00082   QString username;
00083   QString password;
00084   QString defaultcal;
00085   QString days;
00086 
00087   QDomDocument doc;
00088   doc.setContent( xml );
00089   QDomElement docElement = doc.documentElement();
00090   QDomNode node;
00091   for( node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
00092     QDomElement element = node.toElement();
00093     if ( element.tagName() == "file" ) {
00094       QDomAttr pathAttr = element.attributeNode( "path" );
00095       path = pathAttr.value();
00096       QDomAttr defaultAttr = element.attributeNode( "default" );
00097       defaultcal = defaultAttr.value();
00098       QDomAttr daysAttr = element.attributeNode( "deletedaysold" );
00099       days = daysAttr.value();
00100 
00101       LocalCalendar *cal = new LocalCalendar( path, defaultcal, days, mLocalWidget );
00102       mLocalLayout->removeItem( mLocalSpacer );
00103       cal->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
00104       mLocalLayout->addWidget( cal );
00105       mLocalLayout->addItem( mLocalSpacer );
00106       mLocalList.append( cal );
00107 
00108       connect( cal, SIGNAL( deleteRequest( LocalCalendar* ) ), SLOT( delLocalCalendar( LocalCalendar* ) ) );
00109       cal->show();
00110     } else if ( element.tagName() == "webdav" ) {
00111       QDomAttr urlAttr = element.attributeNode( "url" );
00112       url = urlAttr.value();
00113       QDomAttr unameAttr = element.attributeNode( "username" );
00114       username = unameAttr.value();
00115       QDomAttr pwordAttr = element.attributeNode( "password" );
00116       password = pwordAttr.value();
00117       QDomAttr defaultAttr = element.attributeNode( "default" );
00118       defaultcal = defaultAttr.value();
00119       QDomAttr daysAttr = element.attributeNode( "deletedaysold" );
00120       days = daysAttr.value();
00121 
00122       WebdavCalendar *cal = new WebdavCalendar( username, password,
00123                                                 url, defaultcal, days, mWebdavWidget );
00124       mWebdavLayout->removeItem( mWebdavSpacer );
00125       cal->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
00126       mWebdavLayout->addWidget( cal );
00127       mWebdavLayout->addItem( mWebdavSpacer );
00128       mWebdavList.append( cal );
00129 
00130       connect( cal, SIGNAL( deleteRequest( WebdavCalendar* ) ), SLOT( delWebdavCalendar( WebdavCalendar* ) ) );
00131       cal->show();
00132     }
00133   }
00134 }
00135 
00136 QString ConfigGuiSunbird::save() const
00137 {
00138   QString config = "<config>\n";
00139 
00140   for ( uint i = 0; i < mLocalList.count(); ++i ) {
00141     LocalCalendar *lcal = mLocalList[ i ];
00142     config += QString( "<file " );
00143     config += QString( "path=\"%1\" " ).arg( lcal->mPathRequester->url() );
00144 
00145     if ( lcal->mDaysCheckBox->isChecked() ) {
00146       config += QString( "deletedaysold=\"%1\" " ).arg( lcal->mDaysSpinBox->value() );
00147     }
00148     if ( lcal->mDefaultCheckBox->isChecked() ) {
00149       config += QString( "default=\"1\" " );
00150     }
00151     config += QString( "/>\n" );
00152   }
00153 
00154   for ( uint i = 0; i < mWebdavList.count(); ++i ) {
00155     WebdavCalendar *wcal = mWebdavList[ i ];
00156     config += QString( "<webdav " );
00157     config += QString( "username=\"%1\" " ).arg( wcal->mUsername->text() );
00158     config += QString( "password=\"%1\" " ).arg( wcal->mPassword->text() );
00159     config += QString( "url=\"%1\" " ).arg( wcal->mUrl->text() );
00160 
00161     if ( wcal->mDaysCheckBox->isChecked() ) {
00162       config += QString( "deletedaysold=\"%1\" " ).arg( wcal->mDaysSpinBox->value() );
00163     }
00164     if ( wcal->mDefaultCheckBox->isChecked() ) {
00165       config += QString( "default=\"1\" " );
00166     }
00167     config += QString( "/>\n" );
00168   }
00169   config += "</config>";
00170 
00171   return config;
00172 }
00173 
00174 void ConfigGuiSunbird::addLocalCalendar()
00175 {
00176   LocalCalendar *cal = new LocalCalendar( mLocalWidget );
00177   mLocalLayout->removeItem( mLocalSpacer );
00178   cal->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
00179   mLocalLayout->addWidget( cal );
00180   mLocalLayout->addItem( mLocalSpacer );
00181   mLocalList.append( cal );
00182 
00183   connect( cal, SIGNAL( deleteRequest( LocalCalendar* ) ), SLOT( delLocalCalendar( LocalCalendar* ) ) );
00184   cal->show();
00185 }
00186 
00187 void ConfigGuiSunbird::delLocalCalendar( LocalCalendar *calendar )
00188 {
00189   mLocalList.remove( calendar );
00190   calendar->deleteLater();
00191 }
00192 
00193 void ConfigGuiSunbird::addWebdavCalendar()
00194 {
00195   WebdavCalendar *cal = new WebdavCalendar( mWebdavWidget );
00196   mWebdavLayout->removeItem( mWebdavSpacer );
00197   cal->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
00198   mWebdavLayout->addWidget( cal );
00199   mWebdavLayout->addItem( mWebdavSpacer );
00200   mWebdavList.append( cal );
00201 
00202   connect( cal, SIGNAL( deleteRequest( WebdavCalendar* ) ), SLOT( delWebdavCalendar( WebdavCalendar* ) ) );
00203   cal->show();
00204 }
00205 
00206 void ConfigGuiSunbird::delWebdavCalendar( WebdavCalendar *calendar )
00207 {
00208   mWebdavList.remove( calendar );
00209   calendar->deleteLater();
00210 }
00211 
00212 LocalCalendar::LocalCalendar( QWidget *parent )
00213   : QWidget( parent )
00214 {
00215   initGui();
00216 }
00217 
00218 LocalCalendar::LocalCalendar( const QString &path, const QString &defaultcal, const QString &days, QWidget *parent )
00219   : QWidget( parent )
00220 {
00221   initGui();
00222 
00223   mPathRequester->setURL( path );
00224   mDefaultCheckBox->setChecked( defaultcal.toInt() == 1 );
00225 
00226   if ( !days.isEmpty() ) {
00227     mDaysCheckBox->setChecked( true );
00228     mDaysSpinBox->setEnabled( true );
00229     mDaysSpinBox->setValue( days.toInt() );
00230   }
00231 }
00232 
00233 void LocalCalendar::initGui()
00234 {
00235   QBoxLayout *bottomLayout = new QHBoxLayout();
00236 
00237   mDaysCheckBox = new QCheckBox( this );
00238   mDaysCheckBox->setText( i18n( "Sync only events newer than" ) );
00239 
00240   mDaysSpinBox = new QSpinBox( this );
00241   mDaysSpinBox->setDisabled( true );
00242   mDaysSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
00243 
00244   connect( mDaysCheckBox, SIGNAL( toggled( bool ) ),
00245            this, SLOT( toggleDays( bool ) ) );
00246 
00247   bottomLayout->addWidget( mDaysCheckBox );
00248   bottomLayout->addWidget( mDaysSpinBox );
00249   bottomLayout->addWidget( new QLabel( i18n( "day(s)" ), this ) );
00250 
00251   QGridLayout *localLayout = new QGridLayout( this );
00252 
00253   mPathRequester = new KURLRequester( this );
00254 
00255   KPushButton *removeButton = new KPushButton( this );
00256   removeButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
00257   removeButton->setText( i18n( "Remove" ) );
00258   connect( removeButton, SIGNAL( clicked() ),
00259            this, SLOT( deleteWidget() ) );
00260 
00261   mDefaultCheckBox = new QCheckBox( this );
00262   mDefaultCheckBox->setText( i18n( "Set as Default" ) );
00263 
00264   localLayout->addItem( new QSpacerItem( 40, 20, QSizePolicy::Expanding ), 0, 0 );
00265   localLayout->addWidget( new QLabel( i18n( "Location:" ), this ), 1, 0 );
00266   localLayout->addWidget( mPathRequester, 1, 1 );
00267   localLayout->addItem( new QSpacerItem( 40, 20, QSizePolicy::Fixed ), 1, 2 );
00268   localLayout->addWidget( removeButton, 1, 3 );
00269   localLayout->addMultiCellLayout( bottomLayout, 2, 2, 0, 2 );
00270   localLayout->addWidget( mDefaultCheckBox, 2, 3 ); 
00271 }
00272 
00273 void LocalCalendar::deleteWidget()
00274 {
00275   emit deleteRequest( this );
00276 }
00277 
00278 WebdavCalendar::WebdavCalendar( QWidget *parent )
00279   : QWidget( parent )
00280 {
00281   initGui();
00282 };
00283 
00284 WebdavCalendar::WebdavCalendar( const QString &username, const QString &password, const QString &url,
00285                                 const QString &defaultcal, const QString &days, QWidget *parent )
00286   : QWidget( parent )
00287 {
00288   initGui();
00289 
00290   mUsername->setText( username );
00291   mPassword->setText( password );
00292   mUrl->setText( url );
00293   mDefaultCheckBox->setChecked( defaultcal.toInt() == 1 );
00294 
00295   if ( !days.isEmpty() ) {
00296     mDaysCheckBox->setChecked( true );
00297     mDaysSpinBox->setEnabled( true );
00298     mDaysSpinBox->setValue( days.toInt() );
00299   }
00300 }
00301 
00302 void WebdavCalendar::initGui()
00303 {
00304   QBoxLayout *bottomLayout = new QHBoxLayout();
00305 
00306   mDaysCheckBox = new QCheckBox( this );
00307   mDaysCheckBox->setText( i18n( "Sync only events newer than" ) );
00308 
00309   mDaysSpinBox = new QSpinBox( this );
00310   mDaysSpinBox->setDisabled( true );
00311   mDaysSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
00312 
00313   connect( mDaysCheckBox, SIGNAL( toggled( bool ) ),
00314            this, SLOT( toggleDays( bool ) ) );
00315 
00316   bottomLayout->addWidget( mDaysCheckBox );
00317   bottomLayout->addWidget( mDaysSpinBox );
00318   bottomLayout->addWidget( new QLabel( i18n( "day(s)" ), this ) );
00319 
00320   QGridLayout *webdavLayout = new QGridLayout();
00321 
00322   mUrl = new KLineEdit( this );
00323   mUsername = new KLineEdit( this );
00324   mPassword = new KLineEdit( this );
00325   mPassword->setEchoMode( KLineEdit::Password );
00326 
00327   KPushButton *removeButton = new KPushButton( this );
00328   removeButton->setText( i18n( "Remove" ) );
00329   connect( removeButton, SIGNAL( clicked() ),
00330            this, SLOT( deleteWidget() ) );
00331 
00332   mDefaultCheckBox = new QCheckBox( this );
00333   mDefaultCheckBox->setText( i18n( "Set as Default" ) );
00334 
00335   webdavLayout->addWidget( new QLabel( i18n( "Location:" ), this ), 0, 0 );
00336   webdavLayout->addWidget( mUrl, 0, 1 );
00337   webdavLayout->addItem( new QSpacerItem( 40, 20, QSizePolicy::Fixed ), 0, 2 );
00338   webdavLayout->addWidget( removeButton, 0, 3 );
00339   webdavLayout->addMultiCellLayout( bottomLayout, 1, 1, 0, 1 );
00340   webdavLayout->addWidget( mDefaultCheckBox, 1, 3 );
00341 
00342   QGridLayout *mainLayout = new QGridLayout( this );
00343   mainLayout->addItem( new QSpacerItem( 40, 20, QSizePolicy::Fixed ), 0, 0 );
00344   mainLayout->addMultiCellLayout( webdavLayout, 1, 1, 0, 4 );
00345   mainLayout->addWidget( new QLabel( i18n( "Username:" ), this ), 2, 0 );
00346   mainLayout->addWidget( mUsername, 2, 1 );
00347   mainLayout->addItem( new QSpacerItem( 40, 20, QSizePolicy::Fixed ), 2, 2 );
00348   mainLayout->addWidget( new QLabel( i18n( "Password:" ), this ), 2, 3 );
00349   mainLayout->addWidget( mPassword, 2, 4 );
00350 }
00351 
00352 void WebdavCalendar::deleteWidget()
00353 {
00354   emit deleteRequest( this );
00355 }
00356 
00357 void LocalCalendar::toggleDays( bool state )
00358 {
00359   mDaysSpinBox->setEnabled( state );
00360 }
00361 
00362 void WebdavCalendar::toggleDays( bool state )
00363 {
00364   mDaysSpinBox->setEnabled( state );
00365 }
00366 
00367 #include "configguisunbird.moc"