File indexing completed on 2023-12-03 05:04:24

0001 /*
0002     The configuration page for the synchronization options
0003 
0004     SPDX-FileCopyrightText: 2005-2022 Alexander Reinholdt <alexander.reinholdt@kdemail.net>
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 // application specific includes
0009 #include "smb4kconfigpagesynchronization.h"
0010 #include "core/smb4ksettings.h"
0011 
0012 // Qt includes
0013 #include <QCheckBox>
0014 #include <QFormLayout>
0015 #include <QGroupBox>
0016 #include <QHBoxLayout>
0017 #include <QLabel>
0018 #include <QSpinBox>
0019 #include <QVBoxLayout>
0020 
0021 // KDE includes
0022 #include <KLineEdit>
0023 #include <KLocalizedString>
0024 #include <KUrlRequester>
0025 
0026 Smb4KConfigPageSynchronization::Smb4KConfigPageSynchronization(QWidget *parent)
0027     : QTabWidget(parent)
0028 {
0029     //
0030     // 'Basic Settings' tab
0031     //
0032     QWidget *basicTab = new QWidget(this);
0033     QVBoxLayout *basicTabLayout = new QVBoxLayout(basicTab);
0034 
0035     // Synchronization Directory
0036     QGroupBox *synchronizationDirectoryBox = new QGroupBox(i18n("Synchronization Directory"), basicTab);
0037     QVBoxLayout *synchronizationDirectoryBoxLayout = new QVBoxLayout(synchronizationDirectoryBox);
0038 
0039     QWidget *rsyncPrefixWidget = new QWidget(synchronizationDirectoryBox);
0040     QHBoxLayout *rsyncPrefixWidgetLayout = new QHBoxLayout(rsyncPrefixWidget);
0041     rsyncPrefixWidgetLayout->setContentsMargins(0, 0, 0, 0);
0042 
0043     QLabel *rsyncPrefixLabel = new QLabel(rsyncPrefixWidget);
0044     rsyncPrefixLabel->setText(Smb4KSettings::self()->rsyncPrefixItem()->label());
0045     rsyncPrefixWidgetLayout->addWidget(rsyncPrefixLabel);
0046 
0047     KUrlRequester *rsyncPrefix = new KUrlRequester(rsyncPrefixWidget);
0048     rsyncPrefix->setMode(KFile::Directory | KFile::LocalOnly);
0049     rsyncPrefix->setObjectName(QStringLiteral("kcfg_RsyncPrefix"));
0050     rsyncPrefixWidgetLayout->addWidget(rsyncPrefix);
0051 
0052     rsyncPrefixLabel->setBuddy(rsyncPrefix);
0053 
0054     synchronizationDirectoryBoxLayout->addWidget(rsyncPrefixWidget);
0055 
0056     basicTabLayout->addWidget(synchronizationDirectoryBox);
0057 
0058     // Behavior
0059     QGroupBox *behaviorBox = new QGroupBox(i18n("Behavior"), basicTab);
0060     QGridLayout *behaviorBoxLayout = new QGridLayout(behaviorBox);
0061 
0062     QCheckBox *archiveMode = new QCheckBox(Smb4KSettings::self()->archiveModeItem()->label(), behaviorBox);
0063     archiveMode->setObjectName(QStringLiteral("kcfg_ArchiveMode"));
0064 
0065     behaviorBoxLayout->addWidget(archiveMode, 0, 0);
0066 
0067     QCheckBox *recurseDirectories = new QCheckBox(Smb4KSettings::self()->recurseIntoDirectoriesItem()->label(), behaviorBox);
0068     recurseDirectories->setObjectName(QStringLiteral("kcfg_RecurseIntoDirectories"));
0069 
0070     behaviorBoxLayout->addWidget(recurseDirectories, 0, 1);
0071 
0072     QCheckBox *relativePaths = new QCheckBox(Smb4KSettings::self()->relativePathNamesItem()->label(), behaviorBox);
0073     relativePaths->setObjectName(QStringLiteral("kcfg_RelativePathNames"));
0074 
0075     behaviorBoxLayout->addWidget(relativePaths, 1, 0);
0076 
0077     QCheckBox *noImpliedDirs = new QCheckBox(Smb4KSettings::self()->noImpliedDirectoriesItem()->label(), behaviorBox);
0078     noImpliedDirs->setObjectName(QStringLiteral("kcfg_NoImpliedDirectories"));
0079 
0080     behaviorBoxLayout->addWidget(noImpliedDirs, 1, 1);
0081 
0082     QCheckBox *transferDirs = new QCheckBox(Smb4KSettings::self()->transferDirectoriesItem()->label(), behaviorBox);
0083     transferDirs->setObjectName(QStringLiteral("kcfg_TransferDirectories"));
0084 
0085     behaviorBoxLayout->addWidget(transferDirs, 2, 0);
0086 
0087     basicTabLayout->addWidget(behaviorBox);
0088 
0089     // Backups
0090     QGroupBox *backupsBox = new QGroupBox(i18n("Backups"), basicTab);
0091     QVBoxLayout *backupsBoxLayout = new QVBoxLayout(backupsBox);
0092 
0093     QCheckBox *makeBackups = new QCheckBox(Smb4KSettings::self()->makeBackupsItem()->label(), backupsBox);
0094     makeBackups->setObjectName(QStringLiteral("kcfg_MakeBackups"));
0095 
0096     backupsBoxLayout->addWidget(makeBackups);
0097 
0098     QWidget *backupSuffixWidget = new QWidget(backupsBox);
0099     QHBoxLayout *backupSuffixLayout = new QHBoxLayout(backupSuffixWidget);
0100     backupSuffixLayout->setContentsMargins(0, 0, 0, 0);
0101 
0102     QCheckBox *backupSuffixButton = new QCheckBox(Smb4KSettings::self()->useBackupSuffixItem()->label(), backupSuffixWidget);
0103     backupSuffixButton->setObjectName(QStringLiteral("kcfg_UseBackupSuffix"));
0104     KLineEdit *backupSuffix = new KLineEdit(backupSuffixWidget);
0105     backupSuffix->setObjectName(QStringLiteral("kcfg_BackupSuffix"));
0106     backupSuffix->setClearButtonEnabled(true);
0107 
0108     backupSuffixLayout->addWidget(backupSuffixButton);
0109     backupSuffixLayout->addWidget(backupSuffix);
0110 
0111     backupsBoxLayout->addWidget(backupSuffixWidget);
0112 
0113     QWidget *backupDirWidget = new QWidget(backupsBox);
0114     QHBoxLayout *backupDirLayout = new QHBoxLayout(backupDirWidget);
0115     backupDirLayout->setContentsMargins(0, 0, 0, 0);
0116 
0117     QCheckBox *backupDirButton = new QCheckBox(Smb4KSettings::self()->useBackupDirectoryItem()->label(), backupDirWidget);
0118     backupDirButton->setObjectName(QStringLiteral("kcfg_UseBackupDirectory"));
0119     KUrlRequester *backupDir = new KUrlRequester(backupDirWidget);
0120     backupDir->setObjectName(QStringLiteral("kcfg_BackupDirectory"));
0121     backupDir->setMode(KFile::Directory | KFile::LocalOnly);
0122 
0123     backupDirLayout->addWidget(backupDirButton);
0124     backupDirLayout->addWidget(backupDir);
0125 
0126     backupsBoxLayout->addWidget(backupDirWidget);
0127 
0128     basicTabLayout->addWidget(backupsBox);
0129     basicTabLayout->addStretch(100);
0130 
0131     addTab(basicTab, i18n("Basic Settings"));
0132 
0133     //
0134     // 'File Handling' tab
0135     //
0136     QWidget *fileHandlingTab = new QWidget(this);
0137     QVBoxLayout *fileHandlingTabLayout = new QVBoxLayout(fileHandlingTab);
0138 
0139     // General
0140     QGroupBox *generalBox = new QGroupBox(i18n("General"), fileHandlingTab);
0141     QGridLayout *generalBoxLayout = new QGridLayout(generalBox);
0142 
0143     QCheckBox *updateTarget = new QCheckBox(Smb4KSettings::self()->updateTargetItem()->label(), generalBox);
0144     updateTarget->setObjectName(QStringLiteral("kcfg_UpdateTarget"));
0145 
0146     generalBoxLayout->addWidget(updateTarget, 0, 0);
0147 
0148     QCheckBox *updateInPlace = new QCheckBox(Smb4KSettings::self()->updateInPlaceItem()->label(), generalBox);
0149     updateInPlace->setObjectName(QStringLiteral("kcfg_UpdateInPlace"));
0150 
0151     generalBoxLayout->addWidget(updateInPlace, 0, 1);
0152 
0153     QCheckBox *sparseFiles = new QCheckBox(Smb4KSettings::self()->efficientSparseFileHandlingItem()->label(), generalBox);
0154     sparseFiles->setObjectName(QStringLiteral("kcfg_EfficientSparseFileHandling"));
0155 
0156     generalBoxLayout->addWidget(sparseFiles, 1, 0);
0157 
0158     QCheckBox *copyFilesWhole = new QCheckBox(Smb4KSettings::self()->copyFilesWholeItem()->label(), generalBox);
0159     copyFilesWhole->setObjectName(QStringLiteral("kcfg_CopyFilesWhole"));
0160 
0161     generalBoxLayout->addWidget(copyFilesWhole, 1, 1);
0162 
0163     QCheckBox *updateExisting = new QCheckBox(Smb4KSettings::self()->updateExistingItem()->label(), generalBox);
0164     updateExisting->setObjectName(QStringLiteral("kcfg_UpdateExisting"));
0165 
0166     generalBoxLayout->addWidget(updateExisting, 2, 0);
0167 
0168     QCheckBox *ignoreExisting = new QCheckBox(Smb4KSettings::self()->ignoreExistingItem()->label(), generalBox);
0169     ignoreExisting->setObjectName(QStringLiteral("kcfg_IgnoreExisting"));
0170 
0171     generalBoxLayout->addWidget(ignoreExisting, 2, 1);
0172 
0173     fileHandlingTabLayout->addWidget(generalBox);
0174 
0175     // Links
0176     QGroupBox *linksBox = new QGroupBox(i18n("Links"), fileHandlingTab);
0177     QGridLayout *linksBoxLayout = new QGridLayout(linksBox);
0178 
0179     QCheckBox *preserveLinks = new QCheckBox(Smb4KSettings::self()->preserveSymlinksItem()->label(), linksBox);
0180     preserveLinks->setObjectName(QStringLiteral("kcfg_PreserveSymlinks"));
0181 
0182     linksBoxLayout->addWidget(preserveLinks, 0, 0);
0183 
0184     QCheckBox *transformLinks = new QCheckBox(Smb4KSettings::self()->transformSymlinksItem()->label(), linksBox);
0185     transformLinks->setObjectName(QStringLiteral("kcfg_TransformSymlinks"));
0186 
0187     linksBoxLayout->addWidget(transformLinks, 0, 1);
0188 
0189     QCheckBox *transformUnsafe = new QCheckBox(Smb4KSettings::self()->transformUnsafeSymlinksItem()->label(), linksBox);
0190     transformUnsafe->setObjectName(QStringLiteral("kcfg_TransformUnsafeSymlinks"));
0191 
0192     linksBoxLayout->addWidget(transformUnsafe, 1, 0);
0193 
0194     QCheckBox *ignoreUnsafe = new QCheckBox(Smb4KSettings::self()->ignoreUnsafeSymlinksItem()->label(), linksBox);
0195     ignoreUnsafe->setObjectName(QStringLiteral("kcfg_IgnoreUnsafeSymlinks"));
0196 
0197     linksBoxLayout->addWidget(ignoreUnsafe, 1, 1);
0198 
0199     QCheckBox *mungeLinks = new QCheckBox(Smb4KSettings::self()->mungeSymlinksItem()->label(), linksBox);
0200     mungeLinks->setObjectName(QStringLiteral("kcfg_MungeSymlinks"));
0201 
0202     linksBoxLayout->addWidget(mungeLinks, 2, 0);
0203 
0204     QCheckBox *preserveHardLinks = new QCheckBox(Smb4KSettings::self()->preserveHardLinksItem()->label(), linksBox);
0205     preserveHardLinks->setObjectName(QStringLiteral("kcfg_PreserveHardLinks"));
0206 
0207     linksBoxLayout->addWidget(preserveHardLinks, 2, 1);
0208 
0209     QCheckBox *copyDirLinks = new QCheckBox(Smb4KSettings::self()->copyDirectorySymlinksItem()->label(), linksBox);
0210     ;
0211     copyDirLinks->setObjectName(QStringLiteral("kcfg_CopyDirectorySymlinks"));
0212 
0213     linksBoxLayout->addWidget(copyDirLinks, 3, 0);
0214 
0215     QCheckBox *keepDirLinks = new QCheckBox(Smb4KSettings::self()->keepDirectorySymlinksItem()->label(), linksBox);
0216     keepDirLinks->setObjectName(QStringLiteral("kcfg_KeepDirectorySymlinks"));
0217 
0218     linksBoxLayout->addWidget(keepDirLinks, 3, 1);
0219 
0220     fileHandlingTabLayout->addWidget(linksBox);
0221     fileHandlingTabLayout->addStretch(100);
0222 
0223     addTab(fileHandlingTab, i18n("File Handling"));
0224 
0225     //
0226     // 'File Attributes and Ownership' tab
0227     //
0228     QWidget *attributesAndOwnershipTab = new QWidget(this);
0229     QVBoxLayout *attributesAndOwnershipTabLayout = new QVBoxLayout(attributesAndOwnershipTab);
0230 
0231     QGroupBox *attributesBox = new QGroupBox(i18n("File Attributes"), attributesAndOwnershipTab);
0232     QGridLayout *attributesBoxLayout = new QGridLayout(attributesBox);
0233 
0234     QCheckBox *preservePermissions = new QCheckBox(Smb4KSettings::self()->preservePermissionsItem()->label(), attributesBox);
0235     preservePermissions->setObjectName(QStringLiteral("kcfg_PreservePermissions"));
0236 
0237     attributesBoxLayout->addWidget(preservePermissions, 0, 0);
0238 
0239     QCheckBox *preserveACLs = new QCheckBox(Smb4KSettings::self()->preserveACLsItem()->label(), attributesBox);
0240     preserveACLs->setObjectName(QStringLiteral("kcfg_PreserveACLs"));
0241 
0242     attributesBoxLayout->addWidget(preserveACLs, 0, 1);
0243 
0244     QCheckBox *preserveExtendedArrtibutes = new QCheckBox(Smb4KSettings::self()->preserveExtendedAttributesItem()->label(), attributesBox);
0245     preserveExtendedArrtibutes->setObjectName(QStringLiteral("kcfg_PreserveExtendedAttributes"));
0246 
0247     attributesBoxLayout->addWidget(preserveExtendedArrtibutes, 1, 0);
0248 
0249     QCheckBox *preserveAccessTimes = new QCheckBox(Smb4KSettings::self()->preserveAccessTimesItem()->label(), attributesBox);
0250     preserveAccessTimes->setObjectName(QStringLiteral("kcfg_PreserveAccessTimes"));
0251 
0252     attributesBoxLayout->addWidget(preserveAccessTimes, 1, 1);
0253 
0254     QCheckBox *preserveCreateTimes = new QCheckBox(Smb4KSettings::self()->preserveCreateTimesItem()->label(), attributesBox);
0255     preserveCreateTimes->setObjectName(QStringLiteral("kcfg_PreserveCreateTimes"));
0256 
0257     attributesBoxLayout->addWidget(preserveCreateTimes, 2, 0);
0258 
0259     QCheckBox *preserveDevices = new QCheckBox(Smb4KSettings::self()->preserveDevicesAndSpecialsItem()->label(), attributesBox);
0260     preserveDevices->setObjectName(QStringLiteral("kcfg_PreserveDevicesAndSpecials"));
0261 
0262     attributesBoxLayout->addWidget(preserveDevices, 2, 1);
0263 
0264     QCheckBox *preserveTimes = new QCheckBox(Smb4KSettings::self()->preserveTimesItem()->label(), attributesBox);
0265     preserveTimes->setObjectName(QStringLiteral("kcfg_PreserveTimes"));
0266 
0267     attributesBoxLayout->addWidget(preserveTimes, 3, 0);
0268 
0269     QCheckBox *omitDirectoriesTimes = new QCheckBox(Smb4KSettings::self()->omitDirectoryTimesItem()->label(), attributesBox);
0270     omitDirectoriesTimes->setObjectName(QStringLiteral("kcfg_OmitDirectoryTimes"));
0271 
0272     attributesBoxLayout->addWidget(omitDirectoriesTimes, 3, 1);
0273 
0274     attributesAndOwnershipTabLayout->addWidget(attributesBox);
0275 
0276     QGroupBox *ownershipBox = new QGroupBox(i18n("Ownership"), attributesAndOwnershipTab);
0277     QGridLayout *ownershipBoxLayout = new QGridLayout(ownershipBox);
0278 
0279     QCheckBox *preserveOwner = new QCheckBox(Smb4KSettings::self()->preserveOwnerItem()->label(), ownershipBox);
0280     preserveOwner->setObjectName(QStringLiteral("kcfg_PreserveOwner"));
0281 
0282     ownershipBoxLayout->addWidget(preserveOwner, 1, 0);
0283 
0284     QCheckBox *preserveGroup = new QCheckBox(Smb4KSettings::self()->preserveGroupItem()->label(), ownershipBox);
0285     preserveGroup->setObjectName(QStringLiteral("kcfg_PreserveGroup"));
0286 
0287     ownershipBoxLayout->addWidget(preserveGroup, 1, 1);
0288 
0289     attributesAndOwnershipTabLayout->addWidget(ownershipBox);
0290     attributesAndOwnershipTabLayout->addStretch(100);
0291 
0292     addTab(attributesAndOwnershipTab, i18n("File Attributes && Ownership"));
0293 
0294     //
0295     // 'File Transfer' tab
0296     //
0297     QWidget *transferTab = new QWidget(this);
0298     QVBoxLayout *transferTabLayout = new QVBoxLayout(transferTab);
0299 
0300     // Compression
0301     QGroupBox *compressionBox = new QGroupBox(i18n("Compression"), transferTab);
0302     QGridLayout *compressionBoxLayout = new QGridLayout(compressionBox);
0303 
0304     QCheckBox *compressData = new QCheckBox(Smb4KSettings::self()->compressDataItem()->label(), compressionBox);
0305     compressData->setObjectName(QStringLiteral("kcfg_CompressData"));
0306 
0307     compressionBoxLayout->addWidget(compressData, 0, 0, 1, 2);
0308 
0309     QCheckBox *compressionLevelButton = new QCheckBox(Smb4KSettings::self()->useCompressionLevelItem()->label(), compressionBox);
0310     compressionLevelButton->setObjectName(QStringLiteral("kcfg_UseCompressionLevel"));
0311 
0312     compressionBoxLayout->addWidget(compressionLevelButton, 1, 0);
0313 
0314     QSpinBox *compressionLevel = new QSpinBox(compressionBox);
0315     compressionLevel->setObjectName(QStringLiteral("kcfg_CompressionLevel"));
0316 
0317     compressionBoxLayout->addWidget(compressionLevel, 1, 1);
0318 
0319     QCheckBox *skipCompressionButton = new QCheckBox(Smb4KSettings::self()->useSkipCompressionItem()->label(), compressionBox);
0320     skipCompressionButton->setObjectName(QStringLiteral("kcfg_UseSkipCompression"));
0321 
0322     compressionBoxLayout->addWidget(skipCompressionButton, 2, 0);
0323 
0324     KLineEdit *skipCompression = new KLineEdit(compressionBox);
0325     skipCompression->setObjectName(QStringLiteral("kcfg_SkipCompression"));
0326     skipCompression->setClearButtonEnabled(true);
0327 
0328     compressionBoxLayout->addWidget(skipCompression, 2, 1);
0329 
0330     transferTabLayout->addWidget(compressionBox);
0331 
0332     // Files
0333     QGroupBox *filesBox = new QGroupBox(i18n("Files"), transferTab);
0334     QGridLayout *filesBoxLayout = new QGridLayout(filesBox);
0335 
0336     QCheckBox *minTransferSizeButton = new QCheckBox(Smb4KSettings::self()->useMinimalTransferSizeItem()->label(), filesBox);
0337     minTransferSizeButton->setObjectName(QStringLiteral("kcfg_UseMinimalTransferSize"));
0338 
0339     filesBoxLayout->addWidget(minTransferSizeButton, 0, 0);
0340 
0341     QSpinBox *minTransferSize = new QSpinBox(filesBox);
0342     minTransferSize->setObjectName(QStringLiteral("kcfg_MinimalTransferSize"));
0343     minTransferSize->setSuffix(i18n(" kB"));
0344 
0345     filesBoxLayout->addWidget(minTransferSize, 0, 1);
0346 
0347     QCheckBox *maxTransferSizeButton = new QCheckBox(Smb4KSettings::self()->useMaximalTransferSizeItem()->label(), filesBox);
0348     maxTransferSizeButton->setObjectName(QStringLiteral("kcfg_UseMaximalTransferSize"));
0349 
0350     filesBoxLayout->addWidget(maxTransferSizeButton, 1, 0);
0351 
0352     QSpinBox *maxTransferSize = new QSpinBox(filesBox);
0353     maxTransferSize->setObjectName(QStringLiteral("kcfg_MaximalTransferSize"));
0354     maxTransferSize->setSuffix(i18n(" kB"));
0355 
0356     filesBoxLayout->addWidget(maxTransferSize, 1, 1);
0357 
0358     QCheckBox *keepPartial = new QCheckBox(Smb4KSettings::self()->keepPartialItem()->label(), filesBox);
0359     keepPartial->setObjectName(QStringLiteral("kcfg_KeepPartial"));
0360 
0361     filesBoxLayout->addWidget(keepPartial, 2, 0, 1, 2);
0362 
0363     QCheckBox *partialDirButton = new QCheckBox(Smb4KSettings::self()->usePartialDirectoryItem()->label(), filesBox);
0364     partialDirButton->setObjectName(QStringLiteral("kcfg_UsePartialDirectory"));
0365 
0366     filesBoxLayout->addWidget(partialDirButton, 3, 0);
0367 
0368     KUrlRequester *partialDir = new KUrlRequester(filesBox);
0369     partialDir->setObjectName(QStringLiteral("kcfg_PartialDirectory"));
0370     partialDir->setMode(KFile::Directory | KFile::LocalOnly);
0371 
0372     filesBoxLayout->addWidget(partialDir, 3, 1);
0373 
0374     transferTabLayout->addWidget(filesBox);
0375 
0376     // Restrictions
0377     QGroupBox *miscellaneousBox = new QGroupBox(i18n("Miscellaneous"), transferTab);
0378     QGridLayout *miscellaneousBoxLayout = new QGridLayout(miscellaneousBox);
0379 
0380     QCheckBox *bandwidthLimitButton = new QCheckBox(Smb4KSettings::self()->useBandwidthLimitItem()->label(), miscellaneousBox);
0381     bandwidthLimitButton->setObjectName(QStringLiteral("kcfg_UseBandwidthLimit"));
0382 
0383     miscellaneousBoxLayout->addWidget(bandwidthLimitButton, 0, 0);
0384 
0385     QSpinBox *bandwidthLimit = new QSpinBox(miscellaneousBox);
0386     bandwidthLimit->setObjectName(QStringLiteral("kcfg_BandwidthLimit"));
0387     bandwidthLimit->setSuffix(i18n(" kB/s"));
0388 
0389     miscellaneousBoxLayout->addWidget(bandwidthLimit, 0, 1);
0390 
0391     transferTabLayout->addWidget(miscellaneousBox);
0392     transferTabLayout->addStretch(100);
0393 
0394     addTab(transferTab, i18n("File Transfer"));
0395 
0396     //
0397     // 'File Deletion' tab
0398     //
0399     QWidget *deleteTab = new QWidget(this);
0400     QVBoxLayout *deleteTabLayout = new QVBoxLayout(deleteTab);
0401 
0402     // Files and Directories
0403     QGroupBox *filesAndDirectoriesBox = new QGroupBox(i18n("Files && Directories"), deleteTab);
0404     QGridLayout *filesAndDirectoriesBoxLayout = new QGridLayout(filesAndDirectoriesBox);
0405 
0406     QCheckBox *removeSource = new QCheckBox(Smb4KSettings::self()->removeSourceFilesItem()->label(), filesAndDirectoriesBox);
0407     removeSource->setObjectName(QStringLiteral("kcfg_RemoveSourceFiles"));
0408 
0409     filesAndDirectoriesBoxLayout->addWidget(removeSource, 0, 0);
0410 
0411     QCheckBox *deleteExtraneous = new QCheckBox(Smb4KSettings::self()->deleteExtraneousItem()->label(), filesAndDirectoriesBox);
0412     deleteExtraneous->setObjectName(QStringLiteral("kcfg_DeleteExtraneous"));
0413 
0414     filesAndDirectoriesBoxLayout->addWidget(deleteExtraneous, 0, 1);
0415 
0416     QCheckBox *deleteBefore = new QCheckBox(Smb4KSettings::self()->deleteBeforeItem()->label(), filesAndDirectoriesBox);
0417     deleteBefore->setObjectName(QStringLiteral("kcfg_DeleteBefore"));
0418 
0419     filesAndDirectoriesBoxLayout->addWidget(deleteBefore, 1, 0);
0420 
0421     QCheckBox *deleteAfter = new QCheckBox(Smb4KSettings::self()->deleteAfterItem()->label(), filesAndDirectoriesBox);
0422     deleteAfter->setObjectName(QStringLiteral("kcfg_DeleteAfter"));
0423 
0424     filesAndDirectoriesBoxLayout->addWidget(deleteAfter, 1, 1);
0425 
0426     QCheckBox *deleteDuring = new QCheckBox(Smb4KSettings::self()->deleteDuringItem()->label(), filesAndDirectoriesBox);
0427     deleteDuring->setObjectName(QStringLiteral("kcfg_DeleteDuring"));
0428 
0429     filesAndDirectoriesBoxLayout->addWidget(deleteDuring, 2, 0);
0430 
0431     QCheckBox *deleteExcluded = new QCheckBox(Smb4KSettings::self()->deleteExcludedItem()->label(), filesAndDirectoriesBox);
0432     deleteExcluded->setObjectName(QStringLiteral("kcfg_DeleteExcluded"));
0433 
0434     filesAndDirectoriesBoxLayout->addWidget(deleteExcluded, 2, 1);
0435 
0436     QCheckBox *ignoreIoErrors = new QCheckBox(Smb4KSettings::self()->ignoreErrorsItem()->label(), filesAndDirectoriesBox);
0437     ignoreIoErrors->setObjectName(QStringLiteral("kcfg_IgnoreErrors"));
0438 
0439     filesAndDirectoriesBoxLayout->addWidget(ignoreIoErrors, 3, 0);
0440 
0441     QCheckBox *forceDirDeletion = new QCheckBox(Smb4KSettings::self()->forceDirectoryDeletionItem()->label(), filesAndDirectoriesBox);
0442     forceDirDeletion->setObjectName(QStringLiteral("kcfg_ForceDirectoryDeletion"));
0443 
0444     filesAndDirectoriesBoxLayout->addWidget(forceDirDeletion, 3, 1);
0445 
0446     deleteTabLayout->addWidget(filesAndDirectoriesBox);
0447 
0448     // Restrictions
0449     QGroupBox *restrictionsBox = new QGroupBox(i18n("Restrictions"), deleteTab);
0450     QGridLayout *restrictionsBoxLayout = new QGridLayout(restrictionsBox);
0451 
0452     QCheckBox *maximumDeleteButton = new QCheckBox(Smb4KSettings::self()->useMaximumDeleteItem()->label(), restrictionsBox);
0453     maximumDeleteButton->setObjectName(QStringLiteral("kcfg_UseMaximumDelete"));
0454 
0455     restrictionsBoxLayout->addWidget(maximumDeleteButton, 0, 0);
0456 
0457     QSpinBox *maximumDelete = new QSpinBox(restrictionsBox);
0458     maximumDelete->setObjectName(QStringLiteral("kcfg_MaximumDeleteValue"));
0459 
0460     restrictionsBoxLayout->addWidget(maximumDelete, 0, 1);
0461 
0462     deleteTabLayout->addWidget(restrictionsBox);
0463     deleteTabLayout->addStretch(100);
0464 
0465     addTab(deleteTab, i18n("File Deletion"));
0466 
0467     //
0468     // 'Filter' tab
0469     //
0470     QWidget *filterTab = new QWidget(this);
0471     QVBoxLayout *filterTabLayout = new QVBoxLayout(filterTab);
0472 
0473     // General
0474     QGroupBox *generalFilteringBox = new QGroupBox(i18n("General Filtering Settings"), filterTab);
0475     QGridLayout *generalFilteringBoxLayout = new QGridLayout(generalFilteringBox);
0476 
0477     QCheckBox *cvsExclude = new QCheckBox(Smb4KSettings::self()->useCVSExcludeItem()->label(), generalFilteringBox);
0478     cvsExclude->setObjectName(QStringLiteral("kcfg_UseCVSExclude"));
0479 
0480     generalFilteringBoxLayout->addWidget(cvsExclude, 0, 0, 1, 2);
0481 
0482     QCheckBox *excludePatternButton = new QCheckBox(Smb4KSettings::self()->useExcludePatternItem()->label(), generalFilteringBox);
0483     excludePatternButton->setObjectName(QStringLiteral("kcfg_UseExcludePattern"));
0484 
0485     generalFilteringBoxLayout->addWidget(excludePatternButton, 1, 0);
0486 
0487     KLineEdit *excludePattern = new KLineEdit(generalFilteringBox);
0488     excludePattern->setObjectName(QStringLiteral("kcfg_ExcludePattern"));
0489     excludePattern->setClearButtonEnabled(true);
0490 
0491     generalFilteringBoxLayout->addWidget(excludePattern, 1, 1);
0492 
0493     QCheckBox *excludeFromButton = new QCheckBox(Smb4KSettings::self()->useExcludeFromItem()->label(), generalFilteringBox);
0494     excludeFromButton->setObjectName(QStringLiteral("kcfg_UseExcludeFrom"));
0495 
0496     generalFilteringBoxLayout->addWidget(excludeFromButton, 2, 0);
0497 
0498     KUrlRequester *excludeFrom = new KUrlRequester(generalFilteringBox);
0499     excludeFrom->setObjectName(QStringLiteral("kcfg_ExcludeFrom"));
0500     excludeFrom->setMode(KFile::File | KFile::LocalOnly);
0501 
0502     generalFilteringBoxLayout->addWidget(excludeFrom, 2, 1);
0503 
0504     QCheckBox *includePatternButton = new QCheckBox(Smb4KSettings::self()->useIncludePatternItem()->label(), generalFilteringBox);
0505     includePatternButton->setObjectName(QStringLiteral("kcfg_UseIncludePattern"));
0506 
0507     generalFilteringBoxLayout->addWidget(includePatternButton, 3, 0);
0508 
0509     KLineEdit *includePattern = new KLineEdit(generalFilteringBox);
0510     includePattern->setObjectName(QStringLiteral("kcfg_IncludePattern"));
0511     includePattern->setClearButtonEnabled(true);
0512 
0513     generalFilteringBoxLayout->addWidget(includePattern, 3, 1);
0514 
0515     QCheckBox *includeFromButton = new QCheckBox(Smb4KSettings::self()->useIncludeFromItem()->label(), generalFilteringBox);
0516     includeFromButton->setObjectName(QStringLiteral("kcfg_UseIncludeFrom"));
0517 
0518     generalFilteringBoxLayout->addWidget(includeFromButton, 4, 0);
0519 
0520     KUrlRequester *includeFrom = new KUrlRequester(generalFilteringBox);
0521     includeFrom->setObjectName(QStringLiteral("kcfg_IncludeFrom"));
0522     includeFrom->setMode(KFile::File | KFile::LocalOnly);
0523 
0524     generalFilteringBoxLayout->addWidget(includeFrom, 4, 1);
0525 
0526     filterTabLayout->addWidget(generalFilteringBox);
0527 
0528     // Filter rules
0529     QGroupBox *filterRulesBox = new QGroupBox(i18n("Filter Rules"), filterTab);
0530     QGridLayout *filterRulesBoxLayout = new QGridLayout(filterRulesBox);
0531 
0532     QCheckBox *useFFilterRule = new QCheckBox(Smb4KSettings::self()->useFFilterRuleItem()->label(), filterRulesBox);
0533     useFFilterRule->setObjectName(QStringLiteral("kcfg_UseFFilterRule"));
0534 
0535     filterRulesBoxLayout->addWidget(useFFilterRule, 0, 0, 1, 2);
0536 
0537     QCheckBox *useFFFilterRule = new QCheckBox(Smb4KSettings::self()->useFFFilterRuleItem()->label(), filterRulesBox);
0538     useFFFilterRule->setObjectName(QStringLiteral("kcfg_UseFFFilterRule"));
0539 
0540     filterRulesBoxLayout->addWidget(useFFFilterRule, 1, 0, 1, 2);
0541 
0542     QCheckBox *useCustomFilterRules = new QCheckBox(Smb4KSettings::self()->useCustomFilteringRulesItem()->label(), filterRulesBox);
0543     useCustomFilterRules->setObjectName(QStringLiteral("kcfg_UseCustomFilteringRules"));
0544 
0545     filterRulesBoxLayout->addWidget(useCustomFilterRules, 2, 0);
0546 
0547     KLineEdit *customFilterRules = new KLineEdit(filterTab);
0548     customFilterRules->setObjectName(QStringLiteral("kcfg_CustomFilteringRules"));
0549     customFilterRules->setClearButtonEnabled(true);
0550 
0551     filterRulesBoxLayout->addWidget(customFilterRules, 2, 1);
0552 
0553     filterTabLayout->addWidget(filterRulesBox);
0554     filterTabLayout->addStretch(100);
0555 
0556     addTab(filterTab, i18n("Filtering"));
0557 
0558     //
0559     // 'Miscellaneous' tab
0560     //
0561     QWidget *miscellaneousTab = new QWidget(this);
0562     QVBoxLayout *miscellaneousTabLayout = new QVBoxLayout(miscellaneousTab);
0563 
0564     // Checksums
0565     QGroupBox *checksumsBox = new QGroupBox(i18n("Checksums"), miscellaneousTab);
0566     QGridLayout *checksumsBoxLayout = new QGridLayout(checksumsBox);
0567 
0568     QCheckBox *blockSizeButton = new QCheckBox(Smb4KSettings::self()->useBlockSizeItem()->label(), checksumsBox);
0569     blockSizeButton->setObjectName(QStringLiteral("kcfg_UseBlockSize"));
0570 
0571     checksumsBoxLayout->addWidget(blockSizeButton, 0, 0);
0572 
0573     QSpinBox *blockSize = new QSpinBox(checksumsBox);
0574     blockSize->setObjectName(QStringLiteral("kcfg_BlockSize"));
0575 
0576     checksumsBoxLayout->addWidget(blockSize, 0, 1);
0577 
0578     QCheckBox *checksumSeedButton = new QCheckBox(Smb4KSettings::self()->useChecksumSeedItem()->label(), checksumsBox);
0579     checksumSeedButton->setObjectName(QStringLiteral("kcfg_UseChecksumSeed"));
0580 
0581     checksumsBoxLayout->addWidget(checksumSeedButton, 1, 0);
0582 
0583     QSpinBox *checksumSeed = new QSpinBox(checksumsBox);
0584     checksumSeed->setObjectName(QStringLiteral("kcfg_ChecksumSeed"));
0585 
0586     checksumsBoxLayout->addWidget(checksumSeed, 1, 1);
0587 
0588     QCheckBox *useChecksum = new QCheckBox(Smb4KSettings::self()->useChecksumItem()->label(), checksumsBox);
0589     useChecksum->setObjectName(QStringLiteral("kcfg_UseChecksum"));
0590 
0591     checksumsBoxLayout->addWidget(useChecksum, 2, 0, 1, 2);
0592 
0593     miscellaneousTabLayout->addWidget(checksumsBox);
0594 
0595     // Miscellaneous
0596     QGroupBox *miscellaneousBox2 = new QGroupBox(i18n("Miscellaneous"), miscellaneousTab);
0597     QGridLayout *miscellaneousBox2Layout = new QGridLayout(miscellaneousBox2);
0598 
0599     QCheckBox *oneFilesystem = new QCheckBox(Smb4KSettings::self()->oneFileSystemItem()->label(), miscellaneousBox2);
0600     oneFilesystem->setObjectName(QStringLiteral("kcfg_OneFileSystem"));
0601 
0602     miscellaneousBox2Layout->addWidget(oneFilesystem, 0, 0);
0603 
0604     QCheckBox *delayUpdates = new QCheckBox(Smb4KSettings::self()->delayUpdatesItem()->label(), miscellaneousBox2);
0605     delayUpdates->setObjectName(QStringLiteral("kcfg_DelayUpdates"));
0606 
0607     miscellaneousBox2Layout->addWidget(delayUpdates, 0, 1);
0608 
0609     miscellaneousTabLayout->addWidget(miscellaneousBox2);
0610     miscellaneousTabLayout->addStretch(100);
0611 
0612     addTab(miscellaneousTab, i18n("Miscellaneous"));
0613 
0614     //
0615     // Connections
0616     //
0617     connect(useFFilterRule, SIGNAL(toggled(bool)), this, SLOT(slotFFilterRuleToggled(bool)));
0618     connect(useFFFilterRule, SIGNAL(toggled(bool)), this, SLOT(slotFFFilterRuleToggled(bool)));
0619     connect(makeBackups, SIGNAL(toggled(bool)), this, SLOT(slotBackupToggled(bool)));
0620     connect(compressData, SIGNAL(toggled(bool)), this, SLOT(slotCompressToggled(bool)));
0621     connect(keepPartial, SIGNAL(toggled(bool)), this, SLOT(slotKeepPartialToggled(bool)));
0622 
0623     slotBackupToggled(Smb4KSettings::makeBackups());
0624     slotCompressToggled(Smb4KSettings::compressData());
0625     slotKeepPartialToggled(Smb4KSettings::keepPartial());
0626 }
0627 
0628 Smb4KConfigPageSynchronization::~Smb4KConfigPageSynchronization()
0629 {
0630 }
0631 
0632 bool Smb4KConfigPageSynchronization::checkSettings()
0633 {
0634     for (int i = 0; i < count(); i++) {
0635         // Synchronization prefix
0636         KUrlRequester *synchronizationPrefix = widget(i)->findChild<KUrlRequester *>(QStringLiteral("kcfg_RsyncPrefix"));
0637 
0638         if (synchronizationPrefix) {
0639             if (!synchronizationPrefix->url().isValid()) {
0640                 setCurrentIndex(i);
0641                 synchronizationPrefix->setFocus();
0642                 return false;
0643             }
0644         }
0645 
0646         // Backups
0647         QCheckBox *makeBackups = widget(i)->findChild<QCheckBox *>(QStringLiteral("kcfg_MakeBackups"));
0648         QCheckBox *useBackupSuffix = widget(i)->findChild<QCheckBox *>(QStringLiteral("kcfg_UseBackupSuffix"));
0649         KLineEdit *backupSuffix = widget(i)->findChild<KLineEdit *>(QStringLiteral("kcfg_BackupSuffix"));
0650         QCheckBox *useBackupDir = widget(i)->findChild<QCheckBox *>(QStringLiteral("kcfg_UseBackupDirectory"));
0651         KUrlRequester *backupDir = widget(i)->findChild<KUrlRequester *>(QStringLiteral("kcfg_BackupDirectory"));
0652 
0653         if (makeBackups && makeBackups->isChecked()) {
0654             if (useBackupSuffix && backupSuffix) {
0655                 if (useBackupSuffix->isChecked() && backupSuffix->text().trimmed().isEmpty()) {
0656                     setCurrentIndex(i);
0657                     backupSuffix->setFocus();
0658                     return false;
0659                 }
0660             }
0661 
0662             if (useBackupDir && backupDir) {
0663                 if (useBackupDir->isChecked() && !backupDir->url().isValid()) {
0664                     setCurrentIndex(i);
0665                     backupDir->setFocus();
0666                     return false;
0667                 }
0668             }
0669         }
0670 
0671         // Minimal transfer size
0672         QCheckBox *useMinTransferSize = widget(i)->findChild<QCheckBox *>(QStringLiteral("kcfg_UseMinimalTransferSize"));
0673         QSpinBox *minTransferSize = widget(i)->findChild<QSpinBox *>(QStringLiteral("kcfg_MinimalTransferSize"));
0674 
0675         if (useMinTransferSize && minTransferSize) {
0676             if (useMinTransferSize->isChecked() && minTransferSize->value() == 0) {
0677                 setCurrentIndex(i);
0678                 minTransferSize->setFocus();
0679                 return false;
0680             }
0681         }
0682 
0683         // Maximal transfer size
0684         QCheckBox *useMaxTransferSize = widget(i)->findChild<QCheckBox *>(QStringLiteral("kcfg_UseMaximalTransferSize"));
0685         QSpinBox *maxTransferSize = widget(i)->findChild<QSpinBox *>(QStringLiteral("kcfg_MaximalTransferSize"));
0686 
0687         if (useMaxTransferSize && maxTransferSize) {
0688             if (useMaxTransferSize->isChecked() && maxTransferSize->value() == 0) {
0689                 setCurrentIndex(i);
0690                 maxTransferSize->setFocus();
0691                 return false;
0692             }
0693         }
0694 
0695         // Partial directory
0696         QCheckBox *usePartialDirectory = widget(i)->findChild<QCheckBox *>(QStringLiteral("kcfg_UsePartialDirectory"));
0697         KUrlRequester *partialDirectory = widget(i)->findChild<KUrlRequester *>(QStringLiteral("kcfg_PartialDirectory"));
0698 
0699         if (usePartialDirectory && partialDirectory) {
0700             if (usePartialDirectory->isChecked() && !partialDirectory->url().isValid()) {
0701                 setCurrentIndex(i);
0702                 partialDirectory->setFocus();
0703                 return false;
0704             }
0705         }
0706 
0707         // Exclude exclude
0708         QCheckBox *useExcludePattern = widget(i)->findChild<QCheckBox *>(QStringLiteral("kcfg_UseExcludePattern"));
0709         KLineEdit *excludePattern = widget(i)->findChild<KLineEdit *>(QStringLiteral("kcfg_ExcludePattern"));
0710 
0711         if (useExcludePattern && excludePattern) {
0712             if (useExcludePattern->isChecked() && excludePattern->text().trimmed().isEmpty()) {
0713                 setCurrentIndex(i);
0714                 excludePattern->setFocus();
0715                 return false;
0716             }
0717         }
0718 
0719         // Read exclude pattern from file
0720         QCheckBox *useExcludeFrom = widget(i)->findChild<QCheckBox *>(QStringLiteral("kcfg_UseExcludeFrom"));
0721         KUrlRequester *excludeFrom = widget(i)->findChild<KUrlRequester *>(QStringLiteral("kcfg_ExcludeFrom"));
0722 
0723         if (useExcludeFrom && excludeFrom) {
0724             if (useExcludeFrom->isChecked() && !excludeFrom->url().isValid()) {
0725                 setCurrentIndex(i);
0726                 excludeFrom->setFocus();
0727                 return false;
0728             }
0729         }
0730 
0731         // Exclude exclude
0732         QCheckBox *useIncludePattern = widget(i)->findChild<QCheckBox *>(QStringLiteral("kcfg_UseIncludePattern"));
0733         KLineEdit *includePattern = widget(i)->findChild<KLineEdit *>(QStringLiteral("kcfg_IncludePattern"));
0734 
0735         if (useIncludePattern && includePattern) {
0736             if (useIncludePattern->isChecked() && includePattern->text().trimmed().isEmpty()) {
0737                 setCurrentIndex(i);
0738                 includePattern->setFocus();
0739                 return false;
0740             }
0741         }
0742 
0743         // Read exclude pattern from file
0744         QCheckBox *useIncludeFrom = widget(i)->findChild<QCheckBox *>(QStringLiteral("kcfg_UseIncludeFrom"));
0745         KUrlRequester *includeFrom = widget(i)->findChild<KUrlRequester *>(QStringLiteral("kcfg_IncludeFrom"));
0746 
0747         if (useIncludeFrom && includeFrom) {
0748             if (useIncludeFrom->isChecked() && !includeFrom->url().isValid()) {
0749                 setCurrentIndex(i);
0750                 includeFrom->setFocus();
0751                 return false;
0752             }
0753         }
0754 
0755         // Block size
0756         QCheckBox *useFixedBlocksize = widget(i)->findChild<QCheckBox *>(QStringLiteral("kcfg_UseBlockSize"));
0757         QSpinBox *fixedBlocksize = widget(i)->findChild<QSpinBox *>(QStringLiteral("kcfg_BlockSize"));
0758 
0759         if (useFixedBlocksize && fixedBlocksize) {
0760             if (useFixedBlocksize->isChecked() && fixedBlocksize->value() == 0) {
0761                 setCurrentIndex(i);
0762                 fixedBlocksize->setFocus();
0763                 return false;
0764             }
0765         }
0766 
0767         // NOTE: There is no need to check the following settings, because they may be empty or 0:
0768         // - kcfg_UseCompressionLevel & kcfg_CompressionLevel
0769         // - kcfg_UseSkipCompression & kcfg_SkipCompression
0770         // - kcfg_UseBandwidthLimit & kcfg_BandwidthLimit
0771         // - kcfg_UseMaximumDelete & kcfg_MaximumDeleteValue
0772         // - kcfg_CustomFilteringRules
0773         // - kcfg_UseChecksumSeed & kcfg_ChecksumSeed
0774     }
0775 
0776     return true;
0777 }
0778 
0779 /////////////////////////////////////////////////////////////////////////////
0780 // SLOT IMPLEMENTATIONS
0781 /////////////////////////////////////////////////////////////////////////////
0782 
0783 void Smb4KConfigPageSynchronization::slotBackupToggled(bool checked)
0784 {
0785     findChild<QCheckBox *>(QStringLiteral("kcfg_UseBackupDirectory"))->setEnabled(checked);
0786     findChild<KUrlRequester *>(QStringLiteral("kcfg_BackupDirectory"))->setEnabled(checked);
0787     findChild<QCheckBox *>(QStringLiteral("kcfg_UseBackupSuffix"))->setEnabled(checked);
0788     findChild<KLineEdit *>(QStringLiteral("kcfg_BackupSuffix"))->setEnabled(checked);
0789 }
0790 
0791 void Smb4KConfigPageSynchronization::slotCompressToggled(bool checked)
0792 {
0793     findChild<QCheckBox *>(QStringLiteral("kcfg_UseCompressionLevel"))->setEnabled(checked);
0794     findChild<QSpinBox *>(QStringLiteral("kcfg_CompressionLevel"))->setEnabled(checked);
0795     findChild<QCheckBox *>(QStringLiteral("kcfg_UseSkipCompression"))->setEnabled(checked);
0796     findChild<KLineEdit *>(QStringLiteral("kcfg_SkipCompression"))->setEnabled(checked);
0797 }
0798 
0799 void Smb4KConfigPageSynchronization::slotKeepPartialToggled(bool checked)
0800 {
0801     findChild<QCheckBox *>(QStringLiteral("kcfg_UsePartialDirectory"))->setEnabled(checked);
0802     findChild<KUrlRequester *>(QStringLiteral("kcfg_PartialDirectory"))->setEnabled(checked);
0803 }
0804 
0805 void Smb4KConfigPageSynchronization::slotFFilterRuleToggled(bool on)
0806 {
0807     QCheckBox *ff_filter = findChild<QCheckBox *>(QStringLiteral("kcfg_UseFFFilterRule"));
0808 
0809     if (on && ff_filter->isChecked()) {
0810         ff_filter->setChecked(false);
0811     }
0812 }
0813 
0814 void Smb4KConfigPageSynchronization::slotFFFilterRuleToggled(bool on)
0815 {
0816     QCheckBox *f_filter = findChild<QCheckBox *>(QStringLiteral("kcfg_UseFFilterRule"));
0817 
0818     if (on && f_filter->isChecked()) {
0819         f_filter->setChecked(false);
0820     }
0821 }