kitchensync

configguisunbird.cpp
1 /*
2  This file is part of KitchenSync.
3 
4  Copyright (c) 2007 Tobias Koenig <tokoe@kde.org>
5  Copyright (c) 2007 Anirudh Ramesh <abattoir@abattoir.in>
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 2 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program; if not, write to the Free Software
19  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20  USA.
21 */
22 
23 #include "configguisunbird.h"
24 
25 #include <tqdom.h>
26 #include <tqtabwidget.h>
27 #include <tqlabel.h>
28 #include <tqlayout.h>
29 #include <tqbuttongroup.h>
30 #include <tqcheckbox.h>
31 #include <tqsizepolicy.h>
32 #include <tqptrlist.h>
33 #include <tqspinbox.h>
34 #include <tqwidget.h>
35 
36 #include <kurlrequester.h>
37 #include <klineedit.h>
38 #include <kpushbutton.h>
39 #include <kdialog.h>
40 #include <tdelocale.h>
41 #include <tdefile.h>
42 
43 ConfigGuiSunbird::ConfigGuiSunbird( const QSync::Member &member, TQWidget *parent )
44  : ConfigGui( member, parent )
45 {
46  TQTabWidget *tabWidget = new TQTabWidget( this );
47  topLayout()->addWidget( tabWidget );
48 
49  mLocalWidget = new TQWidget( tabWidget );
50  mLocalLayout = new TQVBoxLayout( mLocalWidget, KDialog::spacingHint() );
51 
52  mWebdavWidget = new TQWidget( tabWidget );
53  mWebdavLayout = new TQVBoxLayout( mWebdavWidget, KDialog::spacingHint() );
54 
55  tabWidget->addTab( mLocalWidget, i18n( "Local Calendars" ) );
56  tabWidget->addTab( mWebdavWidget, i18n( "WebDAV Calendars" ) );
57 
58  KPushButton *mLocalAddButton = new KPushButton( mLocalWidget );
59  mLocalAddButton->setText( i18n( "Add new calendar" ) );
60  mLocalAddButton->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) );
61  mLocalLayout->addWidget( mLocalAddButton );
62  connect( mLocalAddButton, TQT_SIGNAL( clicked() ),
63  this, TQT_SLOT( addLocalCalendar() ) );
64 
65  KPushButton *mWebdavAddButton = new KPushButton( mWebdavWidget );
66  mWebdavAddButton->setText( i18n( "Add new calendar" ) );
67  mWebdavAddButton->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) );
68  mWebdavLayout->addWidget( mWebdavAddButton );
69  connect( mWebdavAddButton, TQT_SIGNAL( clicked() ),
70  this, TQT_SLOT( addWebdavCalendar() ) );
71 
72  mLocalSpacer = new TQSpacerItem( 20, 40, TQSizePolicy::Expanding );
73  mLocalLayout->addItem( mLocalSpacer );
74  mWebdavSpacer = new TQSpacerItem( 20, 40, TQSizePolicy::Expanding );
75  mWebdavLayout->addItem( mWebdavSpacer );
76 }
77 
78 void ConfigGuiSunbird::load( const TQString &xml )
79 {
80  TQString path;
81  TQString url;
82  TQString username;
83  TQString password;
84  TQString defaultcal;
85  TQString days;
86 
87  TQDomDocument doc;
88  doc.setContent( xml );
89  TQDomElement docElement = doc.documentElement();
90  TQDomNode node;
91  for( node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
92  TQDomElement element = node.toElement();
93  if ( element.tagName() == "file" ) {
94  TQDomAttr pathAttr = element.attributeNode( "path" );
95  path = pathAttr.value();
96  TQDomAttr defaultAttr = element.attributeNode( "default" );
97  defaultcal = defaultAttr.value();
98  TQDomAttr daysAttr = element.attributeNode( "deletedaysold" );
99  days = daysAttr.value();
100 
101  LocalCalendar *cal = new LocalCalendar( path, defaultcal, days, mLocalWidget );
102  mLocalLayout->removeItem( mLocalSpacer );
103  cal->setSizePolicy( TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Fixed ) );
104  mLocalLayout->addWidget( cal );
105  mLocalLayout->addItem( mLocalSpacer );
106  mLocalList.append( cal );
107 
108  connect( cal, TQT_SIGNAL( deleteRequest( LocalCalendar* ) ), TQT_SLOT( delLocalCalendar( LocalCalendar* ) ) );
109  cal->show();
110  } else if ( element.tagName() == "webdav" ) {
111  TQDomAttr urlAttr = element.attributeNode( "url" );
112  url = urlAttr.value();
113  TQDomAttr unameAttr = element.attributeNode( "username" );
114  username = unameAttr.value();
115  TQDomAttr pwordAttr = element.attributeNode( "password" );
116  password = pwordAttr.value();
117  TQDomAttr defaultAttr = element.attributeNode( "default" );
118  defaultcal = defaultAttr.value();
119  TQDomAttr daysAttr = element.attributeNode( "deletedaysold" );
120  days = daysAttr.value();
121 
122  WebdavCalendar *cal = new WebdavCalendar( username, password,
123  url, defaultcal, days, mWebdavWidget );
124  mWebdavLayout->removeItem( mWebdavSpacer );
125  cal->setSizePolicy( TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Fixed ) );
126  mWebdavLayout->addWidget( cal );
127  mWebdavLayout->addItem( mWebdavSpacer );
128  mWebdavList.append( cal );
129 
130  connect( cal, TQT_SIGNAL( deleteRequest( WebdavCalendar* ) ), TQT_SLOT( delWebdavCalendar( WebdavCalendar* ) ) );
131  cal->show();
132  }
133  }
134 }
135 
136 TQString ConfigGuiSunbird::save() const
137 {
138  TQString config = "<config>\n";
139 
140  for ( uint i = 0; i < mLocalList.count(); ++i ) {
141  LocalCalendar *lcal = mLocalList[ i ];
142  config += TQString( "<file " );
143  config += TQString( "path=\"%1\" " ).arg( lcal->mPathRequester->url() );
144 
145  if ( lcal->mDaysCheckBox->isChecked() ) {
146  config += TQString( "deletedaysold=\"%1\" " ).arg( lcal->mDaysSpinBox->value() );
147  }
148  if ( lcal->mDefaultCheckBox->isChecked() ) {
149  config += TQString( "default=\"1\" " );
150  }
151  config += TQString( "/>\n" );
152  }
153 
154  for ( uint i = 0; i < mWebdavList.count(); ++i ) {
155  WebdavCalendar *wcal = mWebdavList[ i ];
156  config += TQString( "<webdav " );
157  config += TQString( "username=\"%1\" " ).arg( wcal->mUsername->text() );
158  config += TQString( "password=\"%1\" " ).arg( wcal->mPassword->text() );
159  config += TQString( "url=\"%1\" " ).arg( wcal->mUrl->text() );
160 
161  if ( wcal->mDaysCheckBox->isChecked() ) {
162  config += TQString( "deletedaysold=\"%1\" " ).arg( wcal->mDaysSpinBox->value() );
163  }
164  if ( wcal->mDefaultCheckBox->isChecked() ) {
165  config += TQString( "default=\"1\" " );
166  }
167  config += TQString( "/>\n" );
168  }
169  config += "</config>";
170 
171  return config;
172 }
173 
174 void ConfigGuiSunbird::addLocalCalendar()
175 {
176  LocalCalendar *cal = new LocalCalendar( mLocalWidget );
177  mLocalLayout->removeItem( mLocalSpacer );
178  cal->setSizePolicy( TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Fixed ) );
179  mLocalLayout->addWidget( cal );
180  mLocalLayout->addItem( mLocalSpacer );
181  mLocalList.append( cal );
182 
183  connect( cal, TQT_SIGNAL( deleteRequest( LocalCalendar* ) ), TQT_SLOT( delLocalCalendar( LocalCalendar* ) ) );
184  cal->show();
185 }
186 
187 void ConfigGuiSunbird::delLocalCalendar( LocalCalendar *calendar )
188 {
189  mLocalList.remove( calendar );
190  calendar->deleteLater();
191 }
192 
193 void ConfigGuiSunbird::addWebdavCalendar()
194 {
195  WebdavCalendar *cal = new WebdavCalendar( mWebdavWidget );
196  mWebdavLayout->removeItem( mWebdavSpacer );
197  cal->setSizePolicy( TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Fixed ) );
198  mWebdavLayout->addWidget( cal );
199  mWebdavLayout->addItem( mWebdavSpacer );
200  mWebdavList.append( cal );
201 
202  connect( cal, TQT_SIGNAL( deleteRequest( WebdavCalendar* ) ), TQT_SLOT( delWebdavCalendar( WebdavCalendar* ) ) );
203  cal->show();
204 }
205 
206 void ConfigGuiSunbird::delWebdavCalendar( WebdavCalendar *calendar )
207 {
208  mWebdavList.remove( calendar );
209  calendar->deleteLater();
210 }
211 
212 LocalCalendar::LocalCalendar( TQWidget *parent )
213  : TQWidget( parent )
214 {
215  initGui();
216 }
217 
218 LocalCalendar::LocalCalendar( const TQString &path, const TQString &defaultcal, const TQString &days, TQWidget *parent )
219  : TQWidget( parent )
220 {
221  initGui();
222 
223  mPathRequester->setURL( path );
224  mDefaultCheckBox->setChecked( defaultcal.toInt() == 1 );
225 
226  if ( !days.isEmpty() ) {
227  mDaysCheckBox->setChecked( true );
228  mDaysSpinBox->setEnabled( true );
229  mDaysSpinBox->setValue( days.toInt() );
230  }
231 }
232 
233 void LocalCalendar::initGui()
234 {
235  TQBoxLayout *bottomLayout = new TQHBoxLayout();
236 
237  mDaysCheckBox = new TQCheckBox( this );
238  mDaysCheckBox->setText( i18n( "Sync only events newer than" ) );
239 
240  mDaysSpinBox = new TQSpinBox( this );
241  mDaysSpinBox->setDisabled( true );
242  mDaysSpinBox->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) );
243 
244  connect( mDaysCheckBox, TQT_SIGNAL( toggled( bool ) ),
245  this, TQT_SLOT( toggleDays( bool ) ) );
246 
247  bottomLayout->addWidget( mDaysCheckBox );
248  bottomLayout->addWidget( mDaysSpinBox );
249  bottomLayout->addWidget( new TQLabel( i18n( "day(s)" ), this ) );
250 
251  TQGridLayout *localLayout = new TQGridLayout( this );
252 
253  mPathRequester = new KURLRequester( this );
254 
255  KPushButton *removeButton = new KPushButton( this );
256  removeButton->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) );
257  removeButton->setText( i18n( "Remove" ) );
258  connect( removeButton, TQT_SIGNAL( clicked() ),
259  this, TQT_SLOT( deleteWidget() ) );
260 
261  mDefaultCheckBox = new TQCheckBox( this );
262  mDefaultCheckBox->setText( i18n( "Set as Default" ) );
263 
264  localLayout->addItem( new TQSpacerItem( 40, 20, TQSizePolicy::Expanding ), 0, 0 );
265  localLayout->addWidget( new TQLabel( i18n( "Location:" ), this ), 1, 0 );
266  localLayout->addWidget( mPathRequester, 1, 1 );
267  localLayout->addItem( new TQSpacerItem( 40, 20, TQSizePolicy::Fixed ), 1, 2 );
268  localLayout->addWidget( removeButton, 1, 3 );
269  localLayout->addMultiCellLayout( bottomLayout, 2, 2, 0, 2 );
270  localLayout->addWidget( mDefaultCheckBox, 2, 3 );
271 }
272 
273 void LocalCalendar::deleteWidget()
274 {
275  emit deleteRequest( this );
276 }
277 
278 WebdavCalendar::WebdavCalendar( TQWidget *parent )
279  : TQWidget( parent )
280 {
281  initGui();
282 };
283 
284 WebdavCalendar::WebdavCalendar( const TQString &username, const TQString &password, const TQString &url,
285  const TQString &defaultcal, const TQString &days, TQWidget *parent )
286  : TQWidget( parent )
287 {
288  initGui();
289 
290  mUsername->setText( username );
291  mPassword->setText( password );
292  mUrl->setText( url );
293  mDefaultCheckBox->setChecked( defaultcal.toInt() == 1 );
294 
295  if ( !days.isEmpty() ) {
296  mDaysCheckBox->setChecked( true );
297  mDaysSpinBox->setEnabled( true );
298  mDaysSpinBox->setValue( days.toInt() );
299  }
300 }
301 
302 void WebdavCalendar::initGui()
303 {
304  TQBoxLayout *bottomLayout = new TQHBoxLayout();
305 
306  mDaysCheckBox = new TQCheckBox( this );
307  mDaysCheckBox->setText( i18n( "Sync only events newer than" ) );
308 
309  mDaysSpinBox = new TQSpinBox( this );
310  mDaysSpinBox->setDisabled( true );
311  mDaysSpinBox->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) );
312 
313  connect( mDaysCheckBox, TQT_SIGNAL( toggled( bool ) ),
314  this, TQT_SLOT( toggleDays( bool ) ) );
315 
316  bottomLayout->addWidget( mDaysCheckBox );
317  bottomLayout->addWidget( mDaysSpinBox );
318  bottomLayout->addWidget( new TQLabel( i18n( "day(s)" ), this ) );
319 
320  TQGridLayout *webdavLayout = new TQGridLayout();
321 
322  mUrl = new KLineEdit( this );
323  mUsername = new KLineEdit( this );
324  mPassword = new KLineEdit( this );
325  mPassword->setEchoMode( KLineEdit::Password );
326 
327  KPushButton *removeButton = new KPushButton( this );
328  removeButton->setText( i18n( "Remove" ) );
329  connect( removeButton, TQT_SIGNAL( clicked() ),
330  this, TQT_SLOT( deleteWidget() ) );
331 
332  mDefaultCheckBox = new TQCheckBox( this );
333  mDefaultCheckBox->setText( i18n( "Set as Default" ) );
334 
335  webdavLayout->addWidget( new TQLabel( i18n( "Location:" ), this ), 0, 0 );
336  webdavLayout->addWidget( mUrl, 0, 1 );
337  webdavLayout->addItem( new TQSpacerItem( 40, 20, TQSizePolicy::Fixed ), 0, 2 );
338  webdavLayout->addWidget( removeButton, 0, 3 );
339  webdavLayout->addMultiCellLayout( bottomLayout, 1, 1, 0, 1 );
340  webdavLayout->addWidget( mDefaultCheckBox, 1, 3 );
341 
342  TQGridLayout *mainLayout = new TQGridLayout( this );
343  mainLayout->addItem( new TQSpacerItem( 40, 20, TQSizePolicy::Fixed ), 0, 0 );
344  mainLayout->addMultiCellLayout( webdavLayout, 1, 1, 0, 4 );
345  mainLayout->addWidget( new TQLabel( i18n( "Username:" ), this ), 2, 0 );
346  mainLayout->addWidget( mUsername, 2, 1 );
347  mainLayout->addItem( new TQSpacerItem( 40, 20, TQSizePolicy::Fixed ), 2, 2 );
348  mainLayout->addWidget( new TQLabel( i18n( "Password:" ), this ), 2, 3 );
349  mainLayout->addWidget( mPassword, 2, 4 );
350 }
351 
352 void WebdavCalendar::deleteWidget()
353 {
354  emit deleteRequest( this );
355 }
356 
357 void LocalCalendar::toggleDays( bool state )
358 {
359  mDaysSpinBox->setEnabled( state );
360 }
361 
362 void WebdavCalendar::toggleDays( bool state )
363 {
364  mDaysSpinBox->setEnabled( state );
365 }
366 
367 #include "configguisunbird.moc"