ksync Library API Documentation

ksyncview.cpp

00001 /* 00002 This file is part of ksync. 00003 00004 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 00005 00006 This library is free software; you can redistribute it and/or 00007 modify it under the terms of the GNU Library General Public 00008 License as published by the Free Software Foundation; either 00009 version 2 of the License, or (at your option) any later version. 00010 00011 This library is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 Library General Public License for more details. 00015 00016 You should have received a copy of the GNU Library General Public License 00017 along with this library; see the file COPYING.LIB. If not, write to 00018 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00019 Boston, MA 02111-1307, USA. 00020 */ 00021 00022 #include <qprinter.h> 00023 #include <qpainter.h> 00024 #include <qlayout.h> 00025 #include <qlabel.h> 00026 #include <qlistview.h> 00027 #include <qcombobox.h> 00028 #include <qpushbutton.h> 00029 #include <qcheckbox.h> 00030 00031 #include <klocale.h> 00032 #include <kurlrequester.h> 00033 #include <kfiledialog.h> 00034 #include <kdebug.h> 00035 #include <kio/job.h> 00036 #include <kio/jobclasses.h> 00037 #include <kmessagebox.h> 00038 00039 #include <ksyncer.h> 00040 #include <calendarsyncee.h> 00041 #include <bookmarksyncee.h> 00042 #include <addressbooksyncee.h> 00043 #include <ksyncuikde.h> 00044 00045 #include "ksync.h" 00046 00047 #include "ksyncview.h" 00048 #include "ksyncview.moc" 00049 00050 class SynceeListItem : public QListViewItem { 00051 public: 00052 SynceeListItem(QListView *lv,KURL url) : QListViewItem(lv,url.url()), 00053 mUrl(url) {} 00054 00055 void setSyncee(KSyncee *syncee) { mSyncee = syncee; } 00056 KSyncee *syncee() { return mSyncee; } 00057 00058 KURL url() { return mUrl; } 00059 00060 private: 00061 KSyncee *mSyncee; 00062 KURL mUrl; 00063 }; 00064 00065 KSyncView::KSyncView(QWidget *parent, const char *name) : 00066 QWidget(parent, name), 00067 mSyncer(0), mTarget(0), mLoadError(false) 00068 { 00069 mTmpFiles.setAutoDelete(true); 00070 00071 QLabel *typeLabel = new QLabel(i18n("Data type to be synced:"),this); 00072 00073 mTypeCombo = new QComboBox(this); 00074 mTypeCombo->insertItem(i18n("Calendar"),TypeCalendar); 00075 mTypeCombo->insertItem(i18n("Bookmarks"),TypeBookmarks); 00076 mTypeCombo->insertItem(i18n("Addressbook"),TypeAddressBook); 00077 mCurrentType = mTypeCombo->currentItem(); 00078 connect(mTypeCombo,SIGNAL(activated(int)),SLOT(reloadSyncees())); 00079 00080 QPushButton *addButton = new QPushButton(i18n("Add Source..."),this); 00081 connect(addButton,SIGNAL(clicked()),SLOT(addSource())); 00082 00083 removeButton = new QPushButton(i18n("Remove Source"),this); 00084 connect(removeButton,SIGNAL(clicked()),SLOT(removeSource())); 00085 00086 showButton = new QPushButton(i18n("Show Source"),this); 00087 connect(showButton,SIGNAL(clicked()),SLOT(showSource())); 00088 00089 mSourceListView = new QListView(this); 00090 mSourceListView->addColumn(i18n("URL")); 00091 00092 connect(mSourceListView,SIGNAL(selectionChanged ()),this,SLOT(slotSelectionChanged())); 00093 mSyncBackCheck = new QCheckBox(i18n("Write synced data back to sources."), 00094 this); 00095 connect(mSyncBackCheck,SIGNAL(clicked()),SLOT(checkSyncBack())); 00096 00097 QLabel *targetLabel = new QLabel(i18n("Target: "),this); 00098 mTargetReq = new KURLRequester(this); 00099 00100 QPushButton *syncButton = new QPushButton(i18n("Sync"),this); 00101 connect(syncButton,SIGNAL(clicked()),SLOT(doSync())); 00102 00103 checkSyncBack(); 00104 00105 QGridLayout *topLayout = new QGridLayout(this); 00106 topLayout->setMargin(8); 00107 topLayout->setSpacing(8); 00108 topLayout->addWidget(typeLabel,0,0); 00109 topLayout->addMultiCellWidget(mTypeCombo,0,0,1,2); 00110 topLayout->addMultiCellWidget(addButton,1,1,0,0); 00111 topLayout->addMultiCellWidget(removeButton,1,1,1,1); 00112 topLayout->addMultiCellWidget(showButton,1,1,2,2); 00113 topLayout->addMultiCellWidget(mSourceListView,2,2,0,2); 00114 topLayout->addMultiCellWidget(mSyncBackCheck,3,3,0,2); 00115 topLayout->addMultiCellWidget(targetLabel,4,4,0,0); 00116 topLayout->addMultiCellWidget(mTargetReq,4,4,1,2); 00117 topLayout->addMultiCellWidget(syncButton,5,5,0,2); 00118 slotSelectionChanged(); 00119 } 00120 00121 KSyncView::~KSyncView() 00122 { 00123 } 00124 00125 void KSyncView::print(QPrinter *pPrinter) 00126 { 00127 QPainter printpainter; 00128 printpainter.begin(pPrinter); 00129 00130 // TODO: add your printing code here 00131 00132 printpainter.end(); 00133 } 00134 00135 void KSyncView::addSource() 00136 { 00137 KURL url = KFileDialog::getOpenURL(); 00138 if(!url.path().isEmpty()) 00139 new SynceeListItem(mSourceListView,url); 00140 } 00141 00142 void KSyncView::removeSource() 00143 { 00144 QListViewItem *item = mSourceListView->selectedItem(); 00145 if (item) delete item; 00146 } 00147 00148 void KSyncView::showSource() 00149 { 00150 QListViewItem *item = mSourceListView->selectedItem(); 00151 if (!item) { 00152 kdDebug() << "No item selected" << endl; 00153 return; 00154 } else { 00155 kdDebug() << "** Source '" << item->text(0) << endl; 00156 KSyncee *syncee = createSyncee(KURL( item->text(0) )); 00157 KSyncEntry *entry = syncee->firstEntry(); 00158 while(entry) { 00159 kdDebug() << "** '" << entry->name() << "'" << endl; 00160 00161 entry = syncee->nextEntry(); 00162 } 00163 delete syncee; 00164 } 00165 } 00166 00167 void KSyncView::slotSelectionChanged() 00168 { 00169 bool state=(mSourceListView->currentItem()!=0); 00170 showButton->setEnabled(state); 00171 removeButton->setEnabled(state); 00172 } 00173 00174 void KSyncView::doSync() 00175 { 00176 delete mSyncer; 00177 mSyncer = new KSyncer(new KSyncUiKde(this)); 00178 00179 mLoadCount = 0; 00180 mLoadError = false; 00181 00182 SynceeListItem *item = dynamic_cast<SynceeListItem *>(mSourceListView->firstChild()); 00183 while(item) { 00184 KSyncee *syncee = createSyncee(item->url()); 00185 item->setSyncee(syncee); 00186 mSyncer->addSyncee(syncee); 00187 00188 item = (SynceeListItem *)item->nextSibling(); 00189 } 00190 00191 QString url = mTargetReq->url(); 00192 00193 kdDebug() << "target url: " << url << endl; 00194 mTarget = createSyncee(KURL(url)); 00195 00196 finishSync(); 00197 } 00198 00199 KSyncee *KSyncView::createSyncee(const KURL &url) 00200 { 00201 kdDebug() << "KSyncView::createSyncee(): " << url.url() << endl; 00202 00203 KSyncee *syncee; 00204 switch (mTypeCombo->currentItem()) { 00205 case TypeBookmarks: 00206 syncee = new BookmarkSyncee(); 00207 break; 00208 case TypeAddressBook: 00209 syncee = new AddressBookSyncee(); 00210 break; 00211 case TypeCalendar: 00212 default: 00213 syncee = new CalendarSyncee(); 00214 break; 00215 } 00216 00217 SynceeLoader *loader; 00218 if (url.isLocalFile()) { 00219 loader = new SynceeLoader(this,syncee,url.path()); 00220 loader->loadSyncee(); 00221 ++mLoadCount; 00222 delete loader; 00223 return syncee; 00224 } else { 00225 QString tmpFile = createTempFile(); 00226 00227 loader = new SynceeLoader(this,syncee,tmpFile); 00228 KIO::FileCopyJob *j = KIO::file_copy(url,KURL( tmpFile ),-1,true); 00229 connect(j,SIGNAL(result(KIO::Job *)), 00230 loader,SLOT(loadSyncee(KIO::Job *))); 00231 return syncee; 00232 } 00233 } 00234 00235 void KSyncView::synceeLoaded() 00236 { 00237 ++mLoadCount; 00238 finishSync(); 00239 } 00240 00241 void KSyncView::finishSync() 00242 { 00243 kdDebug() << "KSyncView::finishSync()" << endl; 00244 00245 if (mLoadError) { 00246 kdDebug() << "KSyncView::finishSync(): load error" << endl; 00247 return; 00248 } 00249 00250 if (mLoadCount == mSourceListView->childCount() + 1) { 00251 mLoadCount = 0; 00252 if (mSyncBackCheck->isChecked()) { 00253 mSyncer->sync(); 00254 SynceeListItem *item = dynamic_cast<SynceeListItem *>(mSourceListView->firstChild()); 00255 KIO::FileCopyJob *j; 00256 while(item) { 00257 KURL from(item->syncee()->filename()); 00258 KURL to(item->url()); 00259 if (from != to) { 00260 kdDebug() << "Copy " << from.url() << " to " << to.url() << endl; 00261 j = KIO::file_copy(from,to,-1,true); 00262 connect(j,SIGNAL(result(KIO::Job *)),SLOT(jobFinished(KIO::Job *))); 00263 } else { 00264 checkFinish(); 00265 } 00266 00267 item = (SynceeListItem *)item->nextSibling(); 00268 } 00269 } else { 00270 mSyncer->syncAllToTarget(mTarget); 00271 mTarget->save(); 00272 } 00273 } else { 00274 kdDebug() << "KSyncView::finishSync(): loadCount: " << mLoadCount << " childCount: " 00275 << mSourceListView->childCount() + 1 << endl; 00276 } 00277 } 00278 00279 void KSyncView::jobFinished(KIO::Job *job) 00280 { 00281 if (job->error()) { 00282 job->showErrorDialog(this); 00283 } else { 00284 checkFinish(); 00285 } 00286 } 00287 00288 void KSyncView::checkFinish() 00289 { 00290 ++mLoadCount; 00291 if (mLoadCount == mSourceListView->childCount()) { 00292 KMessageBox::information(this,i18n("Sync finished")); 00293 mLoadCount = 0; 00294 } 00295 } 00296 00297 void KSyncView::synceeLoadError() 00298 { 00299 kdDebug() << "KSyncView::synceeLoadError()" << endl; 00300 00301 mLoadError = true; 00302 00303 KMessageBox::error(this,i18n("Can't load syncee."),i18n("Load Error")); 00304 } 00305 00306 void KSyncView::readConfig(KConfig *config) 00307 { 00308 int typeIndex = config->readNumEntry("SyncType",TypeCalendar); 00309 mTypeCombo->setCurrentItem(typeIndex); 00310 mCurrentType = typeIndex; 00311 00312 readTypeConfig(config); 00313 } 00314 00315 void KSyncView::readTypeConfig(KConfig *config) 00316 { 00317 QString typeString = mTypeCombo->text(mCurrentType); 00318 00319 QStringList sources = config->readPathListEntry("Sources_" + typeString); 00320 00321 mSourceListView->clear(); 00322 QStringList::ConstIterator it = sources.begin(); 00323 while(it != sources.end()) { 00324 new SynceeListItem (mSourceListView,KURL(*it)); 00325 ++it; 00326 } 00327 00328 mTargetReq->setURL(config->readPathEntry("Target_" + typeString)); 00329 } 00330 00331 void KSyncView::writeConfig(KConfig *config) 00332 { 00333 config->writeEntry("SyncType",mTypeCombo->currentItem()); 00334 00335 writeTypeConfig(config); 00336 } 00337 00338 void KSyncView::writeTypeConfig(KConfig *config) 00339 { 00340 QStringList sources; 00341 QListViewItem *item = mSourceListView->firstChild(); 00342 while(item) { 00343 sources.append(item->text(0)); 00344 item = item->nextSibling(); 00345 } 00346 00347 QString typeString = mTypeCombo->text(mCurrentType); 00348 00349 config->writePathEntry("Sources_" + typeString,sources); 00350 config->writePathEntry("Target_" + typeString,mTargetReq->url()); 00351 00352 config->sync(); 00353 } 00354 00355 void KSyncView::checkSyncBack() 00356 { 00357 if (mSyncBackCheck->isChecked()) { 00358 mTargetReq->setEnabled(false); 00359 } else { 00360 mTargetReq->setEnabled(true); 00361 } 00362 } 00363 00364 void KSyncView::reloadSyncees() 00365 { 00366 KConfig *config = kapp->config(); 00367 00368 writeTypeConfig(config); 00369 mCurrentType = mTypeCombo->currentItem(); 00370 readTypeConfig(config); 00371 } 00372 00373 QString KSyncView::createTempFile() 00374 { 00375 KTempFile *tmpFile = new KTempFile; 00376 mTmpFiles.append(tmpFile); 00377 tmpFile->setAutoDelete(true); 00378 return tmpFile->name(); 00379 }
KDE Logo
This file is part of the documentation for ksync Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Jul 28 23:57:50 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003